Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
partners.c File Reference

Go to the source code of this file.

Data Structures

struct  UseItemStruct
 

Functions

s32 partner_is_idle (Npc *partner)
 
s32 world_partner_can_open_menus_default (Npc *partner)
 
void _use_partner_ability (void)
 
void partner_flying_follow_player (Npc *)
 
void partner_move_to_goal (Npc *, s32)
 
s32 use_consumable (s32 invSlot)
 
void remove_consumable (void)
 
s32 func_800EA4B0 (s32 collisionID)
 
s32 func_800EA52C (s32 partnerID)
 
s32 partner_is_flying (void)
 
void func_800EA5B8 (Npc *partner)
 
void create_partner_npc (void)
 
void partner_free_npc (void)
 
void switch_to_partner (s32 partnerID)
 
void partner_init_after_battle (s32 partnerID)
 
void func_800EB2A4 (s32 partnerID)
 
s32 partner_use_ability (void)
 
s32 partner_can_open_world_menus (void)
 
s32 partner_can_use_ability (void)
 
void partner_reset_data (void)
 
void partner_initialize_data (void)
 
s32 partner_test_enemy_collision (Npc *enemy)
 
EvtScriptpartner_get_enter_map_script (void)
 
void partner_handle_before_battle (void)
 
void partner_handle_after_battle (void)
 
void partner_kill_ability_script (void)
 
void partner_suspend_ability_script (void)
 
void partner_resume_ability_script (void)
 
void partner_walking_enable (Npc *partner, s32 val)
 
void partner_walking_update_player_tracking (Npc *partner)
 
void partner_walking_update_motion (Npc *partner)
 
void partner_walking_follow_player (Npc *partner)
 
void partner_flying_enable (Npc *partner, s32 val)
 
void partner_flying_update_player_tracking (Npc *partner)
 
void partner_flying_update_motion (Npc *partner)
 
s32 partner_init_put_away (Npc *partner)
 
s32 partner_put_away (Npc *partner)
 
s32 partner_init_get_out (Npc *npc)
 
s32 partner_get_out (Npc *partner)
 
void func_800EF300 (void)
 
void func_800EF314 (void)
 
void enable_partner_ai (void)
 
void partner_set_tether_distance (f32 dist)
 
void partner_reset_tether_distance (void)
 
void partner_set_goal_pos (s32 x, s32 z)
 
void func_800EF3D4 (s32 arg0)
 
void func_800EF3E4 (void)
 
void func_800EF414 (s32 posX, s32 posZ)
 
void func_800EF43C (void)
 
void partner_clear_player_tracking (Npc *partner)
 
s32 partner_force_player_flip_done (void)
 
void partner_enable_input (void)
 
void partner_disable_input (void)
 
void partner_do_player_collision (Npc *partner)
 

Variables

PartnerStatus gPartnerStatus
 
NpcwPartnerNpc
 
BSS s32 PartnerCommandState
 
BSS PlayerPathElement gPlayerMoveHistory [40]
 
BSS s32 gPlayerMoveHistoryIndex
 
BSS s32 D_8010CFBC
 
BSS f32 wPartnerTetherDistance
 
BSS s32 D_8010CFC4
 
BSS s16 wPartnerFollowState
 
BSS s16 D_8010CFCA
 
BSS s16 D_8010CFCC
 
BSS s16 D_8010CFCE
 
BSS s32 wPartnerNpcIndex
 
BSS EvtwPartnerCurrentScript
 
BSS s32 wCurrentPartnerId
 
BSS s32 wPartnerCurrentScriptID
 
BSS s32 D_8010CFE0
 
BSS s32 NextPartnerID
 
BSS s32 NextPartnerCommand
 
BSS WorldPartnerwPartner
 
HudScript HES_Partner0
 
HudScript HES_Goombario
 
HudScript HES_Kooper
 
HudScript HES_Bombette
 
HudScript HES_Parakarry
 
HudScript HES_Watt
 
HudScript HES_Sushie
 
HudScript HES_Lakilester
 
HudScript HES_Bow
 
HudScript HES_PartnerA
 
HudScript HES_Partner0Disabled
 
HudScript HES_GoombarioDisabled
 
HudScript HES_KooperDisabled
 
HudScript HES_BombetteDisabled
 
HudScript HES_ParakarryDisabled
 
HudScript HES_WattDisabled
 
HudScript HES_SushieDisabled
 
HudScript HES_LakilesterDisabled
 
HudScript HES_BowDisabled
 
HudScript HES_PartnerADisabled
 
HudScript HES_StatusDigit0
 
HudScript HES_StatusDigit1
 
HudScript HES_StatusDigit2
 
HudScript HES_StatusDigit3
 
HudScript HES_StatusDigit4
 
HudScript HES_StatusDigit5
 
HudScript HES_StatusDigit6
 
HudScript HES_StatusDigit7
 
HudScript HES_StatusDigit8
 
HudScript HES_StatusDigit9
 
HudScript HES_StatusTimes
 
HudScript HES_StatusSlash
 
HudScript HES_StatusStar1
 
HudScript HES_StatusStar2
 
HudScript HES_StatusStar3
 
HudScript HES_StatusStar4
 
HudScript HES_StatusStar5
 
HudScript HES_StatusStar6
 
HudScript HES_StatusStar7
 
HudScript HES_StatusSPIncrement1
 
HudScript HES_StatusSPIncrement2
 
HudScript HES_StatusSPIncrement3
 
HudScript HES_StatusSPIncrement4
 
HudScript HES_StatusSPIncrement5
 
HudScript HES_StatusSPIncrement6
 
HudScript HES_StatusSPIncrement7
 
EvtScript EVS_World_UseItem
 
HudScriptwPartnerHudScripts []
 
HudScriptwDisabledPartnerHudScripts []
 
HudScriptDigitHudScripts []
 
HudScriptTimesHudScript = &HES_StatusTimes
 
HudScriptSlashHudScript = &HES_StatusSlash
 
HudScriptSPIncrementHudScripts []
 
HudScriptSPStarHudScripts []
 
s32 StatusBarSPIncrementOffsets [] = { -1, 1, 2, 4, 5, 7, 8, 0, 0, 0 }
 
s32 D_800F8020 = 0
 
s32 wPartnerMoveGoalX = 0
 
s32 wPartnerMoveGoalZ = 0
 
s32 wPartnerMoveTime = 0
 
f32 wPartnerMoveSpeed = 0.0f
 
f32 D_800F8034 = 0.0f
 
s16 D_800F8038 = 0
 
s16 D_800F803A = 0
 
WorldPartner wPartners []
 
f32 wSavedPartnerPosX = 0
 
f32 wSavedPartnerPosY = 0
 
f32 wSavedPartnerPosZ = 0
 
PartnerAnimations gPartnerAnimations []
 
UseItemStruct UseItemDmaArgs
 
BSS s32 D_8010CD20
 
f32 D_800F84F8 = 0.0f
 

Data Structure Documentation

◆ UseItemStruct

struct UseItemStruct
Data Fields
u8 * dmaStart
u8 * dmaEnd
EvtScript * main
s32 unk_0C

Function Documentation

◆ partner_is_idle()

s32 partner_is_idle ( Npc * partner)

Definition at line 529 of file partners.c.

529 {
531}
@ PARTNER_ACTION_NONE
Definition enums.h:2966
PartnerStatus gPartnerStatus
Definition partners.c:42

◆ world_partner_can_open_menus_default()

s32 world_partner_can_open_menus_default ( Npc * partner)

Definition at line 533 of file partners.c.

533 {
534 return true;
535}

◆ _use_partner_ability()

void _use_partner_ability ( void )

Definition at line 625 of file partners.c.

625 {
626 static u32 PartnerCommand; // goes into BSS, needs to be static for the function to match
627
631
632 if (partnerStatus->inputDisabledCount == 0) {
638 } else {
639 partnerStatus->stickX = 0;
640 partnerStatus->stickY = 0;
641 partnerStatus->curButtons = 0;
642 partnerStatus->pressedButtons = 0;
643 partnerStatus->heldButtons = 0;
644 }
645
648 partnerStatus->pressedButtons |= BUTTON_B | BUTTON_C_DOWN;
650 }
651
656 }
657
659#if VERSION_JP
660 D_8010CFC4 = 0;
661#else
663 D_8010CFC4 = 0;
664 }
665#endif
666 }
667
668 switch (PartnerCommand) {
669 case PARTNER_CMD_NONE:
670 break;
672 D_8010CFC4 = 3;
673 switch (PartnerCommandState) {
674 case 0: // put away current partner
684 break;
685 case 1: // free old partner and create new one
687 break;
688 }
696 // fallthrough
697 case 2: // take out new partner
704 break;
705 case 3: // resume normal partner behaviour
707 break;
708 }
716 break;
717 }
718 break;
720 D_8010CFC4 = 3;
721 switch (PartnerCommandState) {
722 case 0:
725 case 1:
732 wPartnerNpc->jumpVel = 0.0f;
733 wPartnerNpc->scale.x = 1.0f;
734 wPartnerNpc->scale.y = 1.0f;
735 wPartnerNpc->scale.z = 1.0f;
738 // fallthrough
739 case 2:
741 break;
742 case 3:
748 break;
749 }
750 break;
752 switch (PartnerCommandState) {
753 case 0: // put away current partner
762 break;
763 case 1: // free old partner and resume game
765 break;
766 }
771 break;
772 }
773 break;
775 if (PartnerCommandState == 0) {
780 break;
781 }
782 break;
784 switch (PartnerCommandState) {
785 case 0: // create the new partner
791 // fallthrough
792 case 1: // take out new partner
798 break;
799 case 2: // resume standard partner behaviour
801 break;
802 }
809 break;
810 }
811 break;
813 D_8010CFC4 = 2;
814 switch (PartnerCommandState) {
815 case 0:
822 wPartnerNpc->jumpVel = 0.0f;
823 wPartnerNpc->scale.x = 1.0f;
824 wPartnerNpc->scale.y = 1.0f;
825 wPartnerNpc->scale.z = 1.0f;
828 break;
829 case 1:
837 break;
838 }
839 break;
841 switch (PartnerCommandState) {
842 case 0:
849 break;
850 case 1:
852 break;
853 }
859 break;
860 }
861 break;
863 D_8010CFC4 = 1;
864 switch (PartnerCommandState) {
865 case 0:
869 // fallthrough
870 case 1:
872 break;
873 case 2:
874 if (partnerStatus->partnerActionState != 1) {
882 }
885 break;
886 }
887 break;
889 if (PartnerCommandState == 0) {
892 }
894 }
895 break;
896 case PARTNER_CMD_INIT:
898 D_8010CFE0 = 0;
899 if (D_8010CFC4 != 3) {
900 D_8010CFC4 = 0;
901 }
902 break;
903 }
904}
BSS s32 PopupMenu_SelectedIndex
u32 pressedButtons[4]
u8 groupFlags
union Evt::@11 owner2
Initially -1.
@ BUTTON_C_DOWN
Definition enums.h:2765
@ BUTTON_B
Definition enums.h:2775
@ PA_FLAG_INTERRUPT_USE_PARTNER
forces actions with bow, parakarry, watt, and lakilester to end (sushie not tested)
Definition enums.h:3127
@ PA_FLAG_FORCED_PARTNER_ABILITY_END
Definition enums.h:3159
@ TIME_FREEZE_PARTIAL
Definition enums.h:3499
@ TIME_FREEZE_NONE
Definition enums.h:3498
@ SOUND_PARTNER_GET_OUT
Definition enums.h:562
@ SOUND_PARTNER_PUT_AWAY
Definition enums.h:561
@ PARTNER_CMD_INIT
Definition enums.h:2980
@ PARTNER_CMD_PUT_AWAY
Definition enums.h:2983
@ PARTNER_CMD_NONE
Definition enums.h:2979
@ PARTNER_CMD_RESET
Definition enums.h:2988
@ PARTNER_CMD_INSTA_SWITCH
Definition enums.h:2981
@ PARTNER_CMD_ABORT
Definition enums.h:2989
@ PARTNER_CMD_TAKE_OUT
Definition enums.h:2985
@ PARTNER_CMD_INSTA_TAKE_OUT
Definition enums.h:2986
@ PARTNER_CMD_INSTA_PUT_AWAY
Definition enums.h:2984
@ PARTNER_CMD_USE_ABILITY
Definition enums.h:2987
@ PARTNER_CMD_SWITCH
Definition enums.h:2982
@ EVT_PRIORITY_14
Definition evt.h:155
@ EVT_GROUP_PASSIVE_NPC
Definition evt.h:144
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
s32 disable_player_input(void)
Definition 77480.c:989
s32 enable_player_input(void)
Definition 77480.c:997
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void kill_script_by_ID(s32 id)
s32 does_script_exist(s32 id)
void set_time_freeze_mode(s32)
Time freeze modes: 0: none 1: NPCs move, can't be interacted with 2: NPCs don't move,...
Definition main_loop.c:356
PartnerAnimations gPartnerAnimations[]
Definition partners.c:343
f32 wSavedPartnerPosZ
Definition partners.c:341
BSS s32 PartnerCommandState
Definition partners.c:45
BSS s32 D_8010CFC4
Definition partners.c:50
void create_partner_npc(void)
Definition partners.c:581
void partner_free_npc(void)
Definition partners.c:621
BSS s32 wPartnerCurrentScriptID
Definition partners.c:58
BSS s32 NextPartnerCommand
Definition partners.c:61
BSS Evt * wPartnerCurrentScript
Definition partners.c:56
BSS s32 NextPartnerID
Definition partners.c:60
f32 wSavedPartnerPosX
Definition partners.c:339
f32 wSavedPartnerPosY
Definition partners.c:340
BSS s32 wCurrentPartnerId
Definition partners.c:57
BSS WorldPartner * wPartner
Definition partners.c:62
BSS s32 D_8010CFE0
Definition partners.c:59
Npc * wPartnerNpc
Definition partners.c:43
EvtScript * takeOut
Definition partners.h:14
EvtScript * update
Definition partners.h:15
EvtScript * useAbility
Definition partners.h:16
EvtScript * putAway
Definition partners.h:17
PartnerFunc init
Definition partners.h:13
void sfx_play_sound(s32 soundID)
Vec3f scale
f32 jumpVel
AnimID curAnim
Vec3f pos
GameStatus * gGameStatusPtr
Definition main_loop.c:31
PlayerData gPlayerData
Definition 77480.c:39
PlayerStatus gPlayerStatus
Definition 77480.c:38

Referenced by partner_reset_data(), and partner_use_ability().

◆ partner_flying_follow_player()

void partner_flying_follow_player ( Npc * partner)

Definition at line 1856 of file partners.c.

1856 {
1859 f32 x, y, z;
1860 f32 distance;
1861 f32 yaw;
1862 f32 temp_a3;
1864 f32 var_f12;
1867
1868 switch (wPartnerFollowState) {
1869 case 0:
1870 var_f12 = 0.0f;
1871 x = partner->pos.x;
1872 y = partner->pos.y;
1873 z = partner->pos.z;
1881 if (wPartnerTetherDistance < 20.0f) {
1882 var_f12 = (20.0f - wPartnerTetherDistance) * 0.5f;
1883 }
1884 partner->pos.y = y + (moveHistoryY + 20.0f + var_f12 - y) * 0.125f;
1885 partner->moveSpeed = 3.0f;
1886 y = partner->pos.y;
1887 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1888 if (distance >= 50.0) {
1889 if (partner->pos.y >= playerStatus->pos.y) {
1890 partner->moveSpeed = distance * 0.25f;
1891 } else {
1892 partner->moveSpeed = 8.0f;
1893 }
1894 }
1895 if (wPartnerTetherDistance < 20.0f) {
1896 partner->moveSpeed = 4.0f;
1897 }
1898
1899 while (true) {
1900 yaw = atan2(x, z, moveHistoryX, moveHistoryZ);
1902 if (partner->moveSpeed < distance) {
1903 if (partner->pos.y >= playerStatus->pos.y) {
1904 if (partner->moveSpeed >= distance * 0.25f) {
1905 partner->moveSpeed = distance * 0.25f;
1906 } else {
1907 partner->moveSpeed += distance * 0.0625f;
1908 }
1909 } else {
1910 if (partner->moveSpeed > 6.0) {
1911 partner->moveSpeed = 6.0f;
1912 } else {
1913 partner->moveSpeed += 1.0;
1914 }
1915 }
1916 break;
1917 }
1919 yaw = partner->yaw;
1920 partner->moveSpeed = 0.0f;
1921 partner->jumpScale = 0.0f;
1923 break;
1924 }
1925 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1928 yaw = partner->yaw;
1929 partner->moveSpeed = 0.0f;
1930 partner->jumpScale = 0.0f;
1932 break;
1933 }
1934 D_8010CFBC++;
1935 if (D_8010CFBC >= 40) {
1936 D_8010CFBC = 0;
1937 }
1941 }
1942 partner->yaw = yaw;
1943 npc_move_heading(partner, partner->moveSpeed, yaw);
1944 if (partner->flags & 0x4000) {
1946 return;
1947 }
1948 break;
1949 case 1:
1950 case 3:
1952 D_8010CFBC++;
1953 if (D_8010CFBC >= 40) {
1954 D_8010CFBC = 0;
1955 }
1960 partner->moveToPos.x = moveHistoryX;
1961 partner->moveToPos.y = moveHistoryY;
1962 partner->moveToPos.z = moveHistoryZ;
1963 partner->duration = 0;
1964 partner->jumpScale = 1.3f;
1965 if (wPartnerFollowState == 1) {
1966 partner->moveSpeed = 6.0f;
1967 }
1968 partner->planarFlyDist = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1969 partner->yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1970 if (partner->planarFlyDist > 50.0) {
1971 partner->planarFlyDist = 50.0f;
1972 }
1973 distance = partner->planarFlyDist;
1974 y = partner->moveToPos.y - partner->pos.y;
1975 if (partner->planarFlyDist < y) {
1976 distance = y;
1977 }
1978 if (wPartnerFollowState == 1) {
1980 partner->jumpVel = 0.0f;
1981 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1983 return;
1984 }
1985 partner->duration = distance / partner->moveSpeed;
1986 if (partner->duration < 10) {
1987 partner->duration = 10;
1988 }
1989 partner->moveSpeed = partner->planarFlyDist / partner->duration;
1990 } else {
1991 partner->duration = 10;
1992 }
1993
1994 partner->jumpVel = (y + (partner->jumpScale * partner->duration * partner->duration * 0.5f)) / partner->duration;
1995 if (partner->jumpVel > 20.0) {
1996 partner->jumpVel = 20.0f;
1997 }
2000 partner->moveToPos.x = partner->pos.x;
2001 partner->moveToPos.y = partner->pos.y;
2002 partner->moveToPos.z = partner->pos.z;
2003 }
2004 break;
2005 case 2:
2006 partner->jumpVel -= partner->jumpScale;
2007 partner->pos.y += partner->jumpVel;
2008 if (partner->jumpVel <= 0.0f) {
2010 }
2011 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2012 if (partner->jumpVel <= 0.0f) {
2013 if (partner->pos.y < partner->moveToPos.y) {
2015 partner->jumpVel = 0.0f;
2016 partner->pos.y = partner->moveToPos.y;
2017 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
2019 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2022 }
2023 }
2024 }
2025 break;
2026 case 5:
2027 x = partner->pos.x;
2028 y = partner->pos.y;
2029 z = partner->pos.z;
2033 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
2035 if (D_8010CFCA == 0) {
2036 partner->pos.y = y + (((playerStatus->pos.y + (playerStatus->colliderHeight - partner->collisionHeight / 2)) - partner->pos.y) * 0.03125);
2037 y = partner->pos.y;
2038 partner->moveSpeed = 0.0f;
2039 partner->jumpScale = 0.0f;
2041 if (playerStatus->actionState == ACTION_STATE_TALK) {
2042 D_8010CFCA = 0;
2043 }
2044 } else {
2045 temp_a3 = clamp_angle(camera->curYaw + (playerStatus->spriteFacingAngle < 180.0f ? 90.0f : -90.0f));
2046 partner->moveToPos.x = playerStatus->pos.x;
2047 partner->moveToPos.y = playerStatus->pos.y;
2048 partner->moveToPos.z = playerStatus->pos.z;
2049 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, wPartnerTetherDistance - 10.0f, temp_a3);
2050 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2051 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2052 partner->moveSpeed = 2.0f;
2053 if (distance > 2.0f) {
2054 partner->yaw = yaw;
2057 D_800F803A = 0;
2058 } else {
2059 D_800F803A++;
2060 if (D_800F803A > 10) {
2061 yaw = playerStatus->targetYaw;
2062 partner->moveSpeed = 0.0f;
2063 partner->jumpScale = 0.0f;
2064 partner->renderYaw = yaw;
2066 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
2067 D_8010CFCA = 0;
2068 }
2069 }
2070 }
2071 } else {
2072 yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
2073 partner->yaw = yaw;
2074 partner->moveSpeed = 0.0f;
2075 partner->jumpScale = 0.0f;
2077 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
2078 D_8010CFCA = 0;
2079 }
2080 }
2081 partner->yaw = yaw;
2082 npc_move_heading(partner, partner->moveSpeed, yaw);
2083 return;
2084 }
2085 }
2086
2087 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
2088 if (!(distance <= wPartnerTetherDistance)) {
2089 while (true) {
2090 if (!currentSnapshot->isJumping) {
2091 yaw = atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ);
2092 if (!(fabsf(get_clamped_angle_diff(yaw, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z))) < 90.0f)) {
2094 D_8010CFBC++;
2095 if (D_8010CFBC >= 40) {
2096 D_8010CFBC = 0;
2097 }
2101 continue;
2102 }
2103 }
2104 }
2105 break;
2106 }
2108 }
2109 break;
2110 case 15:
2111 if (!(playerStatus->animFlags & PA_FLAG_CHANGING_MAP)) {
2112 switch (D_8010CFCE) {
2113 case 0:
2115 partner->moveToPos.x = playerStatus->pos.x;
2116 partner->moveToPos.y = playerStatus->pos.y;
2117 partner->moveToPos.z = playerStatus->pos.z;
2118 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, playerStatus->colliderDiameter, temp_f0_15);
2119 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2122 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2123 partner->yaw = D_800F8034 = yaw;
2124 D_8010CFCE++;
2125 // fallthrough
2126 case 1:
2127 if (wPartnerMoveTime != 0) {
2128 x = partner->pos.x;
2129 y = partner->pos.y + partner->collisionHeight;
2130 z = partner->pos.z;
2131 distance = partner->collisionHeight + 1;
2133 if (npc_raycast_down_around(COLLIDER_FLAG_IGNORE_PLAYER, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) == 0) {
2134 if (partner->collisionHeight + 5 < fabs((partner->pos.y - playerStatus->pos.y))) {
2135 partner->pos.y += (playerStatus->pos.y - partner->pos.y) / 10.0f;
2136 }
2137 } else {
2138 partner->pos.y += (((playerStatus->pos.y + playerStatus->colliderHeight) - partner->pos.y) * 0.125f);
2139 }
2140 partner->moveSpeed = wPartnerMoveSpeed;
2141 partner->yaw = D_800F8034;
2142 x = partner->pos.x;
2143 y = partner->pos.y;
2144 z = partner->pos.z;
2145 if (npc_test_move_taller_with_slipping(0, &x, &y, &z, partner->moveSpeed, partner->yaw, partner->collisionHeight, partner->collisionDiameter)) {
2146 partner->pos.x += (x - partner->pos.x) / 5.0f;
2147 partner->pos.z += (z - partner->pos.z) / 5.0f;
2148 } else {
2149 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2150 }
2151 return;
2152 }
2154 partner->moveSpeed = 0.0f;
2155 partner->jumpScale = 0.0f;
2158 D_8010CFCA = 0;
2159 D_8010CFCE = 0;
2160 partner->yaw = clamp_angle((camera->curYaw + 270.0f) - playerStatus->spriteFacingAngle);
2161 }
2162 }
2163 break;
2164 case 20:
2166 break;
2167 case 40:
2169 break;
2170 case 50:
2171 break;
2172 }
2173}
#define clamp_angle
#define atan2
@ PARTNER_ANIM_INDEX_RUN
Definition enums.h:3442
@ PARTNER_ANIM_INDEX_WALK
Definition enums.h:3437
@ COLLIDER_FLAG_IGNORE_PLAYER
Definition enums.h:4281
@ PA_FLAG_CHANGING_MAP
Definition enums.h:3146
@ ACTION_STATE_TALK
Reading signs doesn't count.
Definition enums.h:2426
@ CAM_DEFAULT
Definition enums.h:1826
@ NPC_FLAG_COLLDING_FORWARD_WITH_WORLD
Definition enums.h:3046
f32 fabsf(f32 f)
b32 npc_raycast_down_around(s32, f32 *, f32 *, f32 *, f32 *, f32, f32)
f64 fabs(f64 f)
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
f32 player_get_side_angle(void)
Definition 7BB60.c:1178
b32 npc_test_move_taller_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Definition 43F0.c:685
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:606
void npc_move_heading(Npc *npc, f32 speed, f32 yaw)
Definition npc.c:983
BSS PlayerPathElement gPlayerMoveHistory[40]
Definition partners.c:46
BSS s32 gPlayerMoveHistoryIndex
Definition partners.c:47
s16 D_800F803A
Definition partners.c:165
void partner_clear_player_tracking(Npc *partner)
Definition partners.c:2433
BSS s32 D_8010CFBC
Definition partners.c:48
BSS s16 D_8010CFCA
Definition partners.c:52
BSS s16 wPartnerFollowState
Definition partners.c:51
s32 wPartnerMoveTime
Definition partners.c:161
f32 D_800F8034
Definition partners.c:163
BSS f32 wPartnerTetherDistance
Definition partners.c:49
f32 wPartnerMoveSpeed
Definition partners.c:162
void partner_move_to_goal(Npc *, s32)
Definition partners.c:2519
BSS s16 D_8010CFCE
Definition partners.c:54
Camera gCameras[4]
Definition cam_main.c:16

Referenced by partner_flying_update_motion().

◆ partner_move_to_goal()

void partner_move_to_goal ( Npc * partner,
s32 isFlying )

Definition at line 2519 of file partners.c.

2519 {
2521 f32 x, y, z, temp;
2522
2523 switch (D_8010CFCE) {
2524 case 0:
2525 D_8010CFCE++;
2526 partner->moveToPos.y = playerStatus->pos.y;
2527 partner->moveToPos.x = wPartnerMoveGoalX;
2528 partner->moveToPos.z = wPartnerMoveGoalZ;
2529 D_800F8034 = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2530 partner->yaw = D_800F8034;
2531 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, 5.0f, D_800F8034);
2532 wPartnerMoveTime = 18;
2533 temp = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
2537 case 1:
2538 if (wPartnerMoveTime != 0) {
2540 if (!isFlying) {
2541 if (!(partner->flags & NPC_FLAG_GROUNDED)) {
2542 partner->pos.y = playerStatus->pos.y;
2543 }
2544 if (partner->jumpVel != 0.0f) {
2545 partner->jumpVel -= partner->jumpScale;
2546 partner->pos.y += partner->jumpVel;
2547 if (partner->jumpVel <= 0.0f) {
2549 }
2550
2551 if (partner->jumpVel <= 0.0f) {
2552 temp = fabsf(partner->jumpVel) + partner->collisionHeight;
2553 y = partner->pos.y + partner->collisionHeight;
2554 x = partner->pos.x;
2555 z = partner->pos.z;
2556
2557 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &temp,
2558 partner->yaw, partner->collisionDiameter) &&
2559 (temp <= fabsf(partner->jumpVel) + 22.0f))
2560 {
2563 partner->jumpScale = 0.0f;
2564 partner->jumpVel = 0.0f;
2565 partner->pos.y = y;
2566 partner->flags &= ~NPC_FLAG_JUMPING;
2567 }
2568 }
2569 }
2570 partner->moveSpeed = wPartnerMoveSpeed;
2571 partner->yaw = D_800F8034;
2572 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2576 } else {
2577 if (fabs(partner->pos.y - playerStatus->pos.y) > 5.0) {
2578 partner->pos.y += (playerStatus->pos.y - partner->pos.y) * 0.5f;
2579 }
2580 partner->moveSpeed = wPartnerMoveSpeed;
2581 partner->yaw = D_800F8034;
2582 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2583 }
2584
2586 } else {
2589 D_8010CFCE++;
2590 }
2591 break;
2592 case 2:
2593 break;
2594 }
2595}
@ SURFACE_INTERACT_RUN
Definition enums.h:4270
@ SURFACE_INTERACT_WALK
Definition enums.h:4269
@ NPC_FLAG_GROUNDED
Definition enums.h:3044
void npc_surface_spawn_fx(Npc *npc, SurfaceInteractMode mode)
Definition surfaces.c:394
void npc_do_world_collision(Npc *npc)
Definition npc.c:277
s32 wPartnerMoveGoalZ
Definition partners.c:160
s32 wPartnerMoveGoalX
Definition partners.c:159

Referenced by partner_flying_follow_player(), and partner_walking_follow_player().

◆ use_consumable()

s32 use_consumable ( s32 invSlot)

Definition at line 479 of file partners.c.

479 {
480 Evt* script;
481
486 script->varTable[10] = invSlot;
487 return script->id;
488}
s16 invItems[10]
@ EVT_PRIORITY_1
Definition evt.h:153
u32 dma_copy(Addr romStart, Addr romEnd, void *vramDest)
Definition 43F0.c:442
UseItemStruct UseItemDmaArgs
Definition partners.c:470
EvtScript * main
Definition partners.c:125
BSS s32 D_8010CD20
Definition partners.c:477

Referenced by check_input_open_menus().

◆ remove_consumable()

void remove_consumable ( void )

Definition at line 490 of file partners.c.

490 {
493}
void sort_consumables(void)
Bubbles up player inventory items such that all ITEM_NONE values are at the bottom.
Definition inventory.c:409

◆ func_800EA4B0()

s32 func_800EA4B0 ( s32 collisionID)

Definition at line 497 of file partners.c.

497 {
498 s32 ret = true;
499
500 if (collisionID >= 0) {
502 switch (get_entity_type(collisionID)) {
516 case ENTITY_TYPE_3B:
518 ret = false;
519 break;
520 default:
521 ret = true;
522 break;
523 }
524 }
525 }
526 return ret;
527}
@ ENTITY_TYPE_TRUMPET_PLANT
Definition enums.h:2577
@ ENTITY_TYPE_BELLBELL_PLANT
Definition enums.h:2576
@ ENTITY_TYPE_SCRIPT_SPRING
Definition enums.h:2570
@ ENTITY_TYPE_3B
Definition enums.h:2582
@ ENTITY_TYPE_PINK_FLOWER
Definition enums.h:2580
@ ENTITY_TYPE_HUGE_BLUE_SWITCH
Definition enums.h:2538
@ ENTITY_TYPE_BLUE_SWITCH
Definition enums.h:2536
@ ENTITY_TYPE_GREEN_STOMP_SWITCH
Definition enums.h:2539
@ ENTITY_TYPE_CYMBAL_PLANT
Definition enums.h:2579
@ ENTITY_TYPE_RED_SWITCH
Definition enums.h:2537
@ ENTITY_TYPE_SIMPLE_SPRING
Definition enums.h:2569
@ ENTITY_TYPE_CHEST
Definition enums.h:2573
@ ENTITY_TYPE_SPINNING_FLOWER
Definition enums.h:2581
@ ENTITY_TYPE_TWEESTER
Definition enums.h:2583
@ ENTITY_TYPE_MUNCHLESIA
Definition enums.h:2578
u32 get_entity_type(s32 arg0)
Definition entity.c:568
#define COLLISION_WITH_ENTITY_BIT
Definition macros.h:163

Referenced by partner_walking_follow_player().

◆ func_800EA52C()

s32 func_800EA52C ( s32 partnerID)

Definition at line 537 of file partners.c.

537 {
540 s32 ret = false;
541
542 if (playerStatus->flags & PS_FLAG_HIT_FIRE) {
543 return false;
544 }
545
546 // any partner
550 ) {
551 ret = true;
552 }
553
554 // check specific partners
555 if (partnerID == PARTNER_BOW) {
557 ret = true;
558 }
559 } else if (partnerID == PARTNER_PARAKARRY) {
564 ) {
565 ret = true;
566 }
567 }
568
569 return ret;
570}
@ PS_FLAG_HIT_FIRE
Definition enums.h:3084
@ PARTNER_BOW
Definition enums.h:2928
@ PARTNER_PARAKARRY
Definition enums.h:2923
@ ACTION_STATE_RIDE
Definition enums.h:2447
@ ACTION_STATE_IDLE
Definition enums.h:2412
@ ACTION_STATE_WALK
Definition enums.h:2413
@ ACTION_STATE_RUN
Definition enums.h:2414

◆ partner_is_flying()

s32 partner_is_flying ( void )

Definition at line 572 of file partners.c.

572 {
573 return !wPartner->isFlying;
574}

◆ func_800EA5B8()

void func_800EA5B8 ( Npc * partner)

Definition at line 576 of file partners.c.

576 {
579}
@ NPC_FLAG_JUMPING
Definition enums.h:3043
@ NPC_FLAG_COLLIDING_WITH_NPC
Definition enums.h:3057
@ NPC_FLAG_COLLDING_WITH_WORLD
Definition enums.h:3045

Referenced by partner_flying_enable(), and partner_walking_enable().

◆ create_partner_npc()

void create_partner_npc ( void )

Definition at line 581 of file partners.c.

581 {
586 NpcBlueprint blueprint;
588
590 blueprintPtr = &blueprint;
591 dma_copy(partnerEntry->dmaStart, partnerEntry->dmaEnd, partnerEntry->dmaDest);
592
594 blueprint.initialAnim = (*partner)->idle;
595 blueprint.onUpdate = nullptr;
596 blueprint.onRender = nullptr;
598
600
601 {
602 Npc* npc = *partnerNpcPtr;
603 npc->npcID = NPC_PARTNER;
604 npc->collisionDiameter = 10;
605 npc->collisionHeight = 10;
606 }
607
608 {
609 Npc* npc = *partnerNpcPtr;
610 npc->pos.x = NPC_DISPOSE_POS_X;
611 npc->pos.y = NPC_DISPOSE_POS_Y;
612 npc->pos.z = NPC_DISPOSE_POS_Z;
613 npc->scale.x = 0.0f;
614 npc->scale.y = 0.0f;
615 npc->scale.z = 0.0f;
616 }
617
618 TweesterTouchingPartner = nullptr;
619}
@ NPC_PARTNER
Definition enums.h:2514
@ NPC_FLAG_IGNORE_PLAYER_COLLISION
Definition enums.h:3040
@ NPC_FLAG_PARTNER
Definition enums.h:3058
s32 create_basic_npc(NpcBlueprint *blueprint)
Definition npc.c:189
Npc * get_npc_by_index(s32 listIndex)
Definition npc.c:270
BSS s32 wPartnerNpcIndex
Definition partners.c:55
WorldPartner wPartners[]
Definition partners.c:167
#define NPC_DISPOSE_POS_Z
Definition macros.h:172
#define NPC_DISPOSE_POS_X
Definition macros.h:170
#define NPC_DISPOSE_POS_Y
Definition macros.h:171
void(* onRender)(struct Npc *)
Definition npc.h:89
void(* onUpdate)(struct Npc *)
Definition npc.h:88
s32 initialAnim
Definition npc.h:87
s32 flags
Definition npc.h:86
s16 collisionDiameter
s16 collisionHeight
Entity * TweesterTouchingPartner
Definition 7B440.c:4

Referenced by _use_partner_ability(), and partner_reset_data().

◆ partner_free_npc()

void partner_free_npc ( void )

Definition at line 621 of file partners.c.

621 {
623}
void free_npc_by_index(s32 listIndex)
Definition npc.c:201

Referenced by _use_partner_ability().

◆ switch_to_partner()

void switch_to_partner ( s32 partnerID)

Definition at line 906 of file partners.c.

906 {
908
909 if (wCurrentPartnerId != partnerID) {
910 D_8010CFE0 = 1;
911 NextPartnerID = partnerID;
912
913 if (wCurrentPartnerId != PARTNER_NONE && partnerID != PARTNER_NONE) {
915 } else if (partnerID == PARTNER_NONE) {
917 } else {
922 }
923 }
924}
@ PARTNER_NONE
Definition enums.h:2919

Referenced by check_input_open_menus().

◆ partner_init_after_battle()

void partner_init_after_battle ( s32 partnerID)

Definition at line 926 of file partners.c.

926 {
929
930 if (wCurrentPartnerId != partnerID) {
931 D_8010CFE0 = 1;
932 NextPartnerID = partnerID;
934 partnerStatus->shouldResumeAbility = false;
935
936 if (wCurrentPartnerId != PARTNER_NONE && partnerID != PARTNER_NONE) {
938 } else if (partnerID == PARTNER_NONE) {
940 } else {
945 }
946 }
947}

Referenced by state_step_end_battle().

◆ func_800EB2A4()

void func_800EB2A4 ( s32 partnerID)

Definition at line 949 of file partners.c.

949 {
950 if (wCurrentPartnerId != partnerID) {
951 D_8010CFE0 = 1;
952 NextPartnerID = partnerID;
953
954 if (wCurrentPartnerId != PARTNER_NONE && partnerID != PARTNER_NONE) {
956 } else if (partnerID == PARTNER_NONE) {
958 } else {
960 }
961 }
962}

◆ partner_use_ability()

s32 partner_use_ability ( void )

Definition at line 964 of file partners.c.

964 {
966
968 && wPartner != nullptr
970 {
973 } else if (wCurrentPartnerId != PARTNER_NONE) {
974 D_8010CFE0 = 1;
977 return true;
978 }
979 }
980 return false;
981}
@ SOUND_MENU_ERROR
Definition enums.h:936
s32 is_starting_conversation(void)
Definition encounter.c:2815
void _use_partner_ability(void)
Definition partners.c:625
PartnerBoolFunc canUseAbility
Definition partners.h:20

Referenced by check_input_use_partner(), post_battle(), post_battle(), post_battle(), post_battle(), and post_battle().

◆ partner_can_open_world_menus()

s32 partner_can_open_world_menus ( void )

Definition at line 983 of file partners.c.

983 {
984 if (wPartner != nullptr
985 && wPartner->canPlayerOpenMenus != nullptr
987 ) {
988 return false;
989 }
990 return true;
991}
PartnerBoolFunc canPlayerOpenMenus
Definition partners.h:21

Referenced by can_open_world_menu(), and should_cancel_open_world_menu().

◆ partner_can_use_ability()

s32 partner_can_use_ability ( void )

Definition at line 993 of file partners.c.

993 {
995 return true;
996 }
997 return false;
998}

◆ partner_reset_data()

void partner_reset_data ( void )

Definition at line 1000 of file partners.c.

1000 {
1003
1006
1007 D_8010CFE0 = 1;
1010
1014 }
1015
1016 wPartner = nullptr;
1020
1023 } else {
1025 wPartnerNpc->scale.x = 1.0f;
1026 wPartnerNpc->scale.y = 1.0f;
1027 wPartnerNpc->scale.z = 1.0f;
1029 }
1030}
b8 keepUsingPartnerOnMapChange
#define mem_clear
@ PARTNER_ACTION_USE
Definition enums.h:2967
Worker * get_worker(s32 idx)
Definition worker.c:186
s32 create_worker_frontUI(void(*updateFunc)(void), void(*drawFunc)(void))
Definition worker.c:63

Referenced by load_map_by_IDs().

◆ partner_initialize_data()

void partner_initialize_data ( void )

Definition at line 1032 of file partners.c.

1032 {
1034
1036 D_8010CFE0 = 0;
1038 D_8010CFC4 = 0;
1040 partnerStatus->inputDisabledCount = 0;
1041 partnerStatus->shouldResumeAbility = false;
1042 partnerStatus->partnerActionState = 0;
1043 partnerStatus->unk_358 = 0;
1044 partnerStatus->partnerAction_unk_2 = false;
1045 wPartner = nullptr;
1049}

Referenced by state_step_startup().

◆ partner_test_enemy_collision()

s32 partner_test_enemy_collision ( Npc * enemy)

Definition at line 1051 of file partners.c.

1051 {
1053 return wPartner->testFirstStrike(wPartnerNpc, enemy);
1054 }
1055 return false;
1056}
PartnerTesHitFunc testFirstStrike
Definition partners.h:19

Referenced by update_encounters_neutral().

◆ partner_get_enter_map_script()

EvtScript * partner_get_enter_map_script ( void )

Definition at line 1058 of file partners.c.

1058 {
1060
1061 if (partner == nullptr) {
1062 return nullptr;
1063 }
1064 return partner->onEnterMap;
1065}
EvtScript * onEnterMap
Definition partners.h:24

◆ partner_handle_before_battle()

void partner_handle_before_battle ( void )

Definition at line 1067 of file partners.c.

1067 {
1070
1073 }
1074
1075 if (wPartner->preBattle != nullptr) {
1077 }
1078 }
1079}
PartnerFunc preBattle
Definition partners.h:22

Referenced by update_encounters_pre_battle().

◆ partner_handle_after_battle()

◆ partner_kill_ability_script()

void partner_kill_ability_script ( void )

Definition at line 1109 of file partners.c.

◆ partner_suspend_ability_script()

void partner_suspend_ability_script ( void )

Definition at line 1117 of file partners.c.

1117 {
1118 if (wCurrentPartnerId != nullptr) {
1121 }
1122 }
1123}
void suspend_all_script(s32 id)

◆ partner_resume_ability_script()

void partner_resume_ability_script ( void )

Definition at line 1125 of file partners.c.

1125 {
1126 if (wCurrentPartnerId != nullptr) {
1129 }
1130 }
1131}
void resume_all_script(s32 id)

◆ partner_walking_enable()

void partner_walking_enable ( Npc * partner,
s32 val )

Definition at line 1133 of file partners.c.

1133 {
1136 s32 i;
1137
1139 partner->pos.y = wSavedPartnerPosY;
1140 partner->pos.z = wSavedPartnerPosZ;
1141
1142 for (i = 0; i < ARRAY_COUNT(gPlayerMoveHistory); i++, it++) {
1143 it->pos.x = playerStatus->pos.x;
1144 it->pos.y = playerStatus->pos.y;
1145 it->pos.z = playerStatus->pos.z;
1146 it->isJumping = false;
1147 }
1148
1150 D_8010CFBC = 0;
1151 D_8010CFCA = val ? 2 : 0;
1153
1154 if (D_8010CFC4 == 1 || D_8010CFC4 == 3) {
1155 D_8010CFC4 = 0;
1156 D_8010CFCA = 0;
1158 } else if (D_8010CFC4 == 2) {
1159 D_8010CFCA = 0;
1161 }
1162
1163 D_8010CFCE = 0;
1164 D_8010CFCC = 0;
1165 wPartnerMoveTime = 16;
1166 wPartnerTetherDistance = 40.0f;
1169 partner->collisionChannel = COLLIDER_FLAG_IGNORE_PLAYER;
1170 partner->jumpVel = 0.0f;
1172 partner->jumpScale = 1.8f;
1173}
@ NPC_FLAG_TOUCHES_GROUND
Definition enums.h:3054
@ NPC_FLAG_GRAVITY
Definition enums.h:3041
BSS s16 D_8010CFCC
Definition partners.c:53
void func_800EA5B8(Npc *partner)
Definition partners.c:576
#define ARRAY_COUNT(arr)
Definition macros.h:39

Referenced by enable_partner_ai().

◆ partner_walking_update_player_tracking()

void partner_walking_update_player_tracking ( Npc * partner)

Definition at line 1175 of file partners.c.

1175 {
1179
1180 if (playerStatus->flags & (PS_FLAG_FALLING | PS_FLAG_JUMPING)) {
1181 isPlayerJumping = (playerStatus->actionState == ACTION_STATE_LAND || playerStatus->actionState == ACTION_STATE_STEP_DOWN) ^ 1;
1182 } else {
1183 isPlayerJumping = false;
1184 }
1186 if ((!currentSnapshot->isJumping || !isPlayerJumping) &&
1187 ((currentSnapshot->pos.x != playerStatus->pos.x) || (currentSnapshot->pos.y != playerStatus->pos.y)
1188 || (currentSnapshot->pos.z != playerStatus->pos.z))) {
1192 }
1195 currentSnapshot->pos.y = playerStatus->pos.y;
1196 currentSnapshot->pos.z = playerStatus->pos.z;
1197 currentSnapshot->isJumping = isPlayerJumping;
1198 }
1199 }
1200}
@ PS_FLAG_FALLING
Definition enums.h:3070
@ PS_FLAG_JUMPING
Definition enums.h:3069
@ ACTION_STATE_LAND
Definition enums.h:2423
@ ACTION_STATE_STEP_DOWN
Definition enums.h:2422

◆ partner_walking_update_motion()

void partner_walking_update_motion ( Npc * partner)

Definition at line 1202 of file partners.c.

1202 {
1205
1207 || partnerStatus->inputDisabledCount != 0 || partnerStatus->partnerAction_unk_2) {
1208 if (!(playerStatus->animFlags & PA_FLAG_OPENED_HIDDEN_PANEL)) {
1210 }
1211 if (partnerStatus->pressedButtons & (BUTTON_Z | BUTTON_B | BUTTON_C_LEFT | BUTTON_C_DOWN)) {
1212 partnerStatus->partnerAction_unk_2 = false;
1213 }
1214 }
1215
1216 if (wPartnerFollowState != 50 && fabsf(partner->pos.y - playerStatus->pos.y) > 1000.0f) {
1217 partner->pos.x = playerStatus->pos.x;
1218 partner->pos.y = playerStatus->pos.y;
1219 partner->pos.z = playerStatus->pos.z;
1220 partner->jumpVel = 0.0f;
1221 partner->jumpScale = 0.0f;
1223 }
1224
1226 wSavedPartnerPosX = partner->pos.x;
1227 wSavedPartnerPosY = partner->pos.y;
1228 wSavedPartnerPosZ = partner->pos.z;
1229}
@ BUTTON_C_LEFT
Definition enums.h:2764
@ BUTTON_Z
Definition enums.h:2774
@ PS_FLAG_NO_STATIC_COLLISION
Definition enums.h:3085
@ PS_FLAG_INPUT_DISABLED
Definition enums.h:3086
@ PA_FLAG_OPENED_HIDDEN_PANEL
Definition enums.h:3136
void partner_walking_follow_player(Npc *partner)
Definition partners.c:1231
void partner_do_player_collision(Npc *partner)
Definition partners.c:2492

◆ partner_walking_follow_player()

void partner_walking_follow_player ( Npc * partner)

Definition at line 1231 of file partners.c.

1231 {
1236 f32 x, y, z;
1237 f32 distance;
1238 f32 yaw;
1239 f32 temp_a3;
1240 f32 angle;
1242
1243 switch (wPartnerFollowState) {
1244 case 0:
1248 x = partner->pos.x;
1249 y = partner->pos.y;
1250 z = partner->pos.z;
1251 partner->moveSpeed = 3.0f;
1252
1253 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1254 if (distance >= 50.0) {
1255 partner->moveSpeed = !(playerStatus->animFlags & PA_FLAG_SPINNING) ? 5.0f : 7.0f;
1256 }
1257 if (wPartnerTetherDistance < 20.0) {
1258 partner->moveSpeed = 4.0f;
1259 }
1261 if (!(partner->flags & NPC_FLAG_GROUNDED)) {
1263 }
1264 while (true) {
1266 yaw = atan2(x, z, moveHistoryX, moveHistoryZ);
1267 if (partner->moveSpeed < distance) {
1268 distance = dist2D(x, z, playerStatus->pos.x, playerStatus->pos.z);
1269 if (distance >= 50.0) {
1270 break;
1271 }
1274 if (partner->moveSpeed > 3.0) {
1275 partner->moveSpeed = 3.0f;
1276 if (wPartnerTetherDistance < 20.0f) {
1277 partner->moveSpeed = 4.0f;
1278 }
1279 } else {
1280 partner->moveSpeed += 1.0;
1281 }
1282 break;
1283 } else {
1284 partner->moveSpeed = 0.0f;
1285 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1286 }
1287 }
1289 yaw = partner->yaw;
1290 partner->moveSpeed = 0.0f;
1291 partner->jumpScale = 0.0f;
1294 break;
1295 } else {
1296 D_8010CFBC++;
1297 if (D_8010CFBC >= 40) {
1298 D_8010CFBC = 0;
1299 }
1303
1304 if (fabsf(get_clamped_angle_diff(partner->yaw, atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ))) > 90.0f) {
1306 break;
1307 }
1308
1309 if ((partner->flags & NPC_FLAG_GROUNDED) && currentSnapshot->isJumping) {
1311 break;
1312 }
1313 }
1314 }
1315
1316 if (!(partner->flags & NPC_FLAG_GROUNDED)) {
1317 partner->moveSpeed *= 0.5f;
1318 }
1319 partner->yaw = yaw;
1320 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1326 ) {
1327 if (!func_800EA4B0(partner->curWall)) {
1328 D_8010CFBC++;
1329 if (D_8010CFBC >= 40) {
1330 D_8010CFBC = 0;
1331 }
1335 if (fabsf(get_clamped_angle_diff(partner->yaw, atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ))) > 90.0f) {
1337 return;
1338 }
1339 } else {
1341 return;
1342 }
1343 }
1344 break;
1345 case 1:
1349 moveHistoryX = partner->pos.x;
1350 moveHistoryY = playerStatus->pos.y;
1351 moveHistoryZ = partner->pos.z;
1352 add_vec2D_polar(&moveHistoryX, &moveHistoryZ, 6.0f, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z));
1353 } else {
1354 break;
1355 }
1356 } else {
1357 D_8010CFBC++;
1358 if (D_8010CFBC >= 40) {
1359 D_8010CFBC = 0;
1360 }
1365 }
1366 partner->moveToPos.x = moveHistoryX;
1367 partner->moveToPos.y = moveHistoryY;
1368 partner->moveToPos.z = moveHistoryZ;
1369 partner->duration = 0;
1370 partner->jumpScale = 3.0f;
1371 partner->moveSpeed = 6.0f;
1372 partner->planarFlyDist = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1373 partner->yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1374 if (partner->planarFlyDist > 50.0) {
1375 partner->planarFlyDist = 50.0f;
1376 }
1377 distance = partner->planarFlyDist;
1378 y = partner->moveToPos.y - partner->pos.y;
1380 partner->jumpVel = 0.0f;
1381 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1383 return;
1384 }
1385 partner->duration = distance / partner->moveSpeed;
1386 if (partner->duration < 10) {
1387 partner->duration = 10;
1388 }
1389 partner->moveSpeed = partner->planarFlyDist / partner->duration;
1390 partner->jumpVel = (y + partner->jumpScale * partner->duration * partner->duration * 0.5f) / partner->duration;
1391 if (partner->jumpVel > 20.0) {
1392 partner->jumpVel = 20.0f;
1393 }
1394 if (partner->jumpVel < 0.0) {
1395 partner->jumpVel = 0.0f;
1396 }
1399 } else {
1401 }
1402
1403 partner->moveToPos.x = partner->pos.x;
1404 partner->moveToPos.y = partner->pos.y;
1405 partner->moveToPos.z = partner->pos.z;
1406 partner->flags |= NPC_FLAG_JUMPING;
1408 // fallthrough
1409 case 2:
1410 partner->jumpVel -= partner->jumpScale;
1411 partner->pos.y += partner->jumpVel;
1412 if (partner->jumpVel <= 0.0f) {
1414 }
1415 if (partner->pos.y < -2000.0f) {
1417 partner->flags &= ~NPC_FLAG_JUMPING;
1418 partner->jumpVel = 0.0f;
1419 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1420 partner->pos.x = playerStatus->pos.x;
1421 partner->pos.y = playerStatus->pos.y;
1422 partner->pos.z = playerStatus->pos.z;
1424 return;
1425 }
1426 if (partner->jumpVel <= 0.0f) {
1427 distance = fabsf(partner->jumpVel) + 11.0f;
1428 x = partner->pos.x;
1429 y = partner->pos.y + distance;
1430 z = partner->pos.z;
1431 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1432 if (distance <= fabsf(partner->jumpVel) + 22.0f) {
1434 partner->flags &= ~NPC_FLAG_JUMPING;
1435 partner->jumpVel = 0.0f;
1436 partner->pos.y = y;
1437 partner->yaw = atan2(x, z, playerStatus->pos.x, playerStatus->pos.z);
1440 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1441 if (distance < 5.0) {
1442 partner->pos.x = playerStatus->pos.x;
1443 partner->pos.y = playerStatus->pos.y;
1444 partner->pos.z = playerStatus->pos.z;
1445 add_vec2D_polar(&partner->pos.x, &partner->pos.z, 5.0f, clamp_angle((cameras[CAM_DEFAULT].curYaw + 90.0f) - playerStatus->spriteFacingAngle));
1447 }
1448 break;
1449 }
1450 }
1451 }
1452 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1453 break;
1454 case 5:
1458 x = partner->pos.x;
1459 y = partner->pos.y;
1460 z = partner->pos.z;
1461 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1463 if (D_8010CFCA == 0) {
1464 partner->moveSpeed = 0.0f;
1465 partner->jumpScale = 0.0f;
1467 if (playerStatus->actionState == ACTION_STATE_TALK) {
1468 D_8010CFCA = 0;
1469 }
1473 return;
1474 }
1475 } else {
1476 temp_a3 = clamp_angle(cameras[CAM_DEFAULT].curYaw + (playerStatus->spriteFacingAngle < 180.0f ? 90.0f : -90.0f));
1477 partner->moveToPos.x = playerStatus->pos.x;
1478 partner->moveToPos.y = playerStatus->pos.y;
1479 partner->moveToPos.z = playerStatus->pos.z;
1480 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, wPartnerTetherDistance - 10.0f, temp_a3);
1481 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1482 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1483 partner->moveSpeed = 2.0f;
1484 if (distance > 2.0f) {
1485 partner->yaw = yaw;
1488 D_800F803A = 0;
1489 } else {
1490 D_800F803A++;
1491 if (D_800F803A > 10) {
1492 yaw = playerStatus->targetYaw;
1493 partner->moveSpeed = 0.0f;
1494 partner->jumpScale = 0.0f;
1495 partner->renderYaw = yaw;
1497 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
1498 D_8010CFCA = 0;
1499 }
1500 }
1501 }
1502 } else {
1503 yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1504 partner->yaw = yaw;
1505 partner->moveSpeed = 0.0f;
1506 partner->jumpScale = 0.0f;
1508 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
1509 D_8010CFCA = 0;
1510 }
1511 }
1512 partner->yaw = yaw;
1513 npc_move_heading(partner, partner->moveSpeed, yaw);
1515 distance = 1000.0f;
1516 x = partner->pos.x;
1517 z = partner->pos.z;
1518 y = partner->pos.y + partner->collisionHeight;
1519 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1522 partner->yaw = clamp_angle(yaw + 180.0f);
1523 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1524 partner->moveSpeed = 0.0f;
1525 partner->jumpScale = 0.0f;
1527 if (D_8010CFCA == 2) {
1528 D_8010CFCA = 0;
1529 } else if (playerStatus->actionState == ACTION_STATE_TALK) {
1530 D_8010CFCA = 0;
1531 }
1532 } else if (!func_800EA4B0(NpcHitQueryColliderID)) {
1533 D_8010CFCA = 2;
1534 }
1535 }
1536 break;
1537 }
1538 }
1539 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1542 D_8010CFCA = 2;
1543 }
1544 } else {
1545 while (true) {
1546 if (currentSnapshot->isJumping) {
1547 break;
1548 }
1549 yaw = atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ);
1550 if (fabsf(get_clamped_angle_diff(yaw, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z))) < 90.0f) {
1551 break;
1552 }
1554 break;
1555 }
1556 D_8010CFBC++;
1557 if (D_8010CFBC >= 40) {
1558 D_8010CFBC = 0;
1559 }
1563 }
1564 if (!currentSnapshot->isJumping) {
1566 return;
1567 }
1568 while (true) {
1569 if (!currentSnapshot->isJumping) {
1570 break;
1571 }
1572 yaw = atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ);
1573 if (fabsf(get_clamped_angle_diff(yaw, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z))) < 90.0f) {
1574 break;
1575 }
1577 break;
1578 }
1579 D_8010CFBC++;
1580 if (D_8010CFBC >= 40) {
1581 D_8010CFBC = 0;
1582 }
1586 }
1588 return;
1589 }
1590 break;
1591 case 15:
1592 switch (D_8010CFCE) {
1593 case 0:
1594 angle = clamp_angle(player_get_side_angle() + 180.0f);
1595 partner->moveToPos.x = playerStatus->pos.x;
1596 partner->moveToPos.y = playerStatus->pos.y;
1597 partner->moveToPos.z = playerStatus->pos.z;
1598 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, playerStatus->colliderDiameter, angle);
1599 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1601 partner->moveSpeed = wPartnerMoveSpeed;
1603 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1604 partner->yaw = D_800F8034 = yaw;
1605 D_8010CFCE++;
1606 // fallthrough
1607 case 1:
1608 if (wPartnerMoveTime != 0) {
1610 if (partner->jumpScale != 0.0f) {
1611 partner->jumpVel -= partner->jumpScale;
1612 partner->pos.y += partner->jumpVel;
1613 if (partner->jumpVel <= 0.0f) {
1615 }
1616 if (partner->jumpVel <= 0.0f) {
1617 distance = fabsf(partner->jumpVel) + 11.0f;
1618 x = partner->pos.x;
1619 y = partner->pos.y + distance;
1620 z = partner->pos.z;
1621 if ((npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) && (distance <= (fabsf(partner->jumpVel) + 22.0f))) {
1623 partner->jumpScale = 0.0f;
1624 partner->jumpVel = 0.0f;
1625 partner->pos.y = y;
1626 partner->flags &= ~NPC_FLAG_JUMPING;
1627 }
1628 }
1629 }
1630 partner->moveSpeed = wPartnerMoveSpeed;
1631 partner->yaw = D_800F8034;
1632 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1634 } else {
1636 partner->moveSpeed = 0.0f;
1637 partner->jumpScale = 0.0f;
1639 partner->yaw = clamp_angle((cameras[CAM_DEFAULT].curYaw + 270.0f) - playerStatus->spriteFacingAngle);
1640 wPartnerMoveTime = 30;
1641 D_8010CFCE++;
1642 }
1643 return;
1644 case 2:
1645 if (wPartnerMoveTime != 0) {
1647 return;
1648 }
1650 D_8010CFCA = 0;
1651 D_8010CFCE = 0;
1652 }
1653 break;
1654 case 20:
1656 break;
1657 case 40:
1658 if (partner->flags & NPC_FLAG_GROUNDED) {
1659 if (func_800EA4B0(partner->curFloor)) {
1662 } else {
1664 }
1665 break;
1666 }
1667 partner->jumpScale = 3.0f;
1668 partner->jumpVel -= partner->jumpScale;
1669 partner->pos.y += partner->jumpVel;
1670 if (partner->jumpVel <= 0.0f) {
1672 }
1673 if (partner->pos.y < -2000.0f) {
1675 partner->flags &= ~NPC_FLAG_JUMPING;
1676 partner->jumpVel = 0.0f;
1677 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1678 partner->pos.x = playerStatus->pos.x;
1679 partner->pos.y = playerStatus->pos.y;
1680 partner->pos.z = playerStatus->pos.z;
1682 return;
1683 }
1684 distance = fabsf(partner->jumpVel) + 11.0f;
1685 x = partner->pos.x;
1686 y = partner->pos.y + distance;
1687 z = partner->pos.z;
1688 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1690 partner->flags &= ~NPC_FLAG_JUMPING;
1691 partner->jumpVel = 0.0f;
1692 partner->pos.y = y;
1693 partner->yaw = atan2(x, z, playerStatus->pos.x, playerStatus->pos.z);
1696 }
1697 break;
1698 case 50:
1699 break;
1700 }
1701}
@ SURFACE_TYPE_LAVA
Definition enums.h:4258
@ SURFACE_TYPE_SPIKES
Definition enums.h:4257
@ PA_FLAG_SPINNING
Definition enums.h:3141
@ SURFACE_INTERACT_LAND
Definition enums.h:4271
s32 get_collider_flags(s32 colliderID)
Definition collision.c:481
s32 func_800EA4B0(s32 collisionID)
Definition partners.c:497
s32 NpcHitQueryColliderID

Referenced by partner_walking_update_motion().

◆ partner_flying_enable()

void partner_flying_enable ( Npc * partner,
s32 val )

Definition at line 1704 of file partners.c.

1704 {
1706 s32 i;
1707
1709 partner->pos.y = wSavedPartnerPosY;
1710 partner->pos.z = wSavedPartnerPosZ;
1711
1712 for (i = 0; i < ARRAY_COUNT(gPlayerMoveHistory); i++, it++) {
1713 it->pos.x = wSavedPartnerPosX;
1714 it->pos.y = wSavedPartnerPosY;
1715 it->pos.z = wSavedPartnerPosZ;
1716 it->isJumping = false;
1717 }
1718
1720 D_8010CFBC = 0;
1721
1722 if (!val) {
1724 D_8010CFCA = 0;
1725 } else if (D_8010CFC4 == 0) {
1727 D_8010CFCA = 2;
1728 } else if (D_8010CFC4 == 1 || D_8010CFC4 == 3) {
1729 D_8010CFC4 = 0;
1731 D_8010CFCA = 0;
1732 } else if (D_8010CFC4 == 2) {
1734 D_8010CFCA = 0;
1735 }
1736
1737 D_8010CFCE = 0;
1738 D_8010CFCC = 0;
1739 wPartnerMoveTime = 16;
1740 wPartnerTetherDistance = 40.0f;
1743 partner->collisionChannel = COLLIDER_FLAG_IGNORE_PLAYER;
1745 partner->flags &= ~NPC_FLAG_GRAVITY;
1746}

Referenced by enable_partner_ai().

◆ partner_flying_update_player_tracking()

void partner_flying_update_player_tracking ( Npc * partner)

Definition at line 1748 of file partners.c.

1748 {
1752 s32 isPlayerJumping = false;
1753
1755 if ((playerStatus->actionState == ACTION_STATE_HIT_LAVA) || (playerStatus->actionState == ACTION_STATE_HIT_FIRE)) {
1756 effectiveY = playerStatus->lastGoodPos.y + partner->collisionHeight + 5;
1757 }
1759 if ((!currentSnapshot->isJumping || !isPlayerJumping) && (currentSnapshot->pos.x != playerStatus->pos.x || currentSnapshot->pos.y != effectiveY
1760 || currentSnapshot->pos.z != playerStatus->pos.z)) {
1764 }
1767 currentSnapshot->pos.y = effectiveY;
1768 currentSnapshot->pos.z = playerStatus->pos.z;
1769 currentSnapshot->isJumping = isPlayerJumping;
1770 }
1771 }
1772}
@ ACTION_STATE_HIT_LAVA
Definition enums.h:2437
@ ACTION_STATE_HIT_FIRE
Causes Mario to fly up and take damage. Used for fire bars.
Definition enums.h:2435

◆ partner_flying_update_motion()

void partner_flying_update_motion ( Npc * partner)

Definition at line 1774 of file partners.c.

1774 {
1777 f32 x, y, z, hitDepth;
1778 f32 var_f0;
1779 f32 var_f2;
1780
1783 partnerStatus->inputDisabledCount ||
1784 partnerStatus->partnerAction_unk_2)
1785 {
1786 if (!(playerStatus->animFlags & PA_FLAG_OPENED_HIDDEN_PANEL) || D_800F8020 == 0) {
1788 }
1789 if (partnerStatus->pressedButtons & (BUTTON_B | BUTTON_Z | BUTTON_C_DOWN | BUTTON_C_LEFT)) {
1790 partnerStatus->partnerAction_unk_2 = false;
1791 }
1792 }
1793 if (wPartnerFollowState != 50 && fabsf(partner->pos.y - playerStatus->pos.y) > 1000.0f) {
1794 partner->pos.x = playerStatus->pos.x;
1795 partner->pos.y = playerStatus->pos.y;
1796 partner->pos.z = playerStatus->pos.z;
1797 partner->jumpVel = 0.0f;
1798 partner->jumpScale = 0.0f;
1799 partner->flags &= ~NPC_FLAG_JUMPING;
1800 }
1801
1802 D_800F8020 = 0;
1803 x = partner->pos.x;
1804 y = partner->pos.y + (partner->collisionHeight * 0.5f);
1805 z = partner->pos.z;
1806
1807 hitDepth = partner->collisionHeight * 0.5f;
1808 if (npc_raycast_up(0, &x, &y, &z, &hitDepth)) {
1809 D_800F8020 = 1;
1810 wSavedPartnerPosX = partner->pos.x;
1811 wSavedPartnerPosY = partner->pos.y;
1812 wSavedPartnerPosZ = partner->pos.z;
1813 } else {
1815 if (wPartnerFollowState != 50) {
1816 x = partner->pos.x;
1817 y = partner->pos.y;
1818 z = partner->pos.z;
1819 hitDepth = 1000.0f;
1820 if (npc_raycast_down_around(COLLIDER_FLAG_IGNORE_PLAYER, &x, &y, &z, &hitDepth, partner->yaw, partner->collisionDiameter) == 0) {
1821 y = playerStatus->pos.y;
1822 }
1823
1824 if (partner->pos.y <= y + partner->collisionHeight + 2.0f) {
1825 if (playerStatus->curSpeed != 0.0f) {
1826 D_800F84F8 = ((y + (partner->collisionHeight / 2) + 2.0f) - partner->pos.y) * 0.125f;
1827 } else {
1829 var_f0 = playerStatus->pos.y + 10.0f - partner->pos.y;
1830 } else {
1831 var_f0 = y + 10.0f - partner->pos.y;
1832 }
1833 var_f2 = 0.25f;
1835 }
1836 } else {
1837 if (playerStatus->pos.y + playerStatus->colliderHeight < y) {
1838 D_800F84F8 = (y + partner->collisionHeight - partner->pos.y) * 0.125f;
1839 if (partner->pos.y + D_800F84F8 <= y + partner->collisionHeight) {
1840 D_800F84F8 = (y + partner->collisionHeight - partner->pos.y) * 0.25f;
1841 }
1842 } else {
1843 var_f0 = (playerStatus->pos.y + playerStatus->colliderHeight + 5.0f) - partner->pos.y;
1844 var_f2 = 0.0625f;
1846 }
1847 }
1848 partner->pos.y += D_800F84F8;
1849 }
1850 wSavedPartnerPosX = partner->pos.x;
1851 wSavedPartnerPosY = partner->pos.y;
1852 wSavedPartnerPosZ = partner->pos.z;
1853 }
1854}
Vec3s pos
Definition demo_api.c:17
b32 npc_raycast_up(s32, f32 *, f32 *, f32 *, f32 *)
s32 D_800F8020
Definition partners.c:158
f32 D_800F84F8
Definition partners.c:495
void partner_flying_follow_player(Npc *)
Definition partners.c:1856

◆ partner_init_put_away()

s32 partner_init_put_away ( Npc * partner)

Definition at line 2175 of file partners.c.

2175 {
2176 partner->collisionChannel = COLLIDER_FLAG_IGNORE_PLAYER;
2179 return wPartnerFollowState;
2180}

◆ partner_put_away()

s32 partner_put_away ( Npc * partner)

Definition at line 2182 of file partners.c.

2182 {
2187 f32 tempPosX;
2188 f32 tempPosZ;
2189 f32 tempPosY;
2191
2192 switch (wPartnerFollowState){
2193 case 0:
2195 tempMoveToY = partner->pos.y;
2196 tempMoveToZ = partner->pos.z;
2197 partner->flags &= ~NPC_FLAG_GRAVITY;
2198 partner->flags &= ~NPC_FLAG_FLYING;
2199 tempPosX = playerStatus->pos.x;
2200 partner->moveToPos.x = tempPosX;
2201 tempPosY = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2202 partner->moveToPos.y = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2203 tempPosZ = playerStatus->pos.z;
2207 partner->moveSpeed = 4.0f;
2208 partner->jumpScale = 1.6f;
2209 partner->moveToPos.z = tempPosZ;
2212 partner->duration = 15;
2213 partner->moveSpeed = partner->planarFlyDist / partner->duration;
2215 partner->jumpVel = (tempMoveToY + partner->jumpScale * partner->duration * partner->duration * 0.5f) / partner->duration;
2219 break;
2220 case 1:
2221 partner->jumpVel -= partner->jumpScale;
2222 partner->pos.y += partner->jumpVel;
2223 if (partner->jumpVel <= 0.0f) {
2225 }
2226 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2227 tempDuration = partner->duration;
2228 if (partner->duration > 10.0f) {
2229 tempDuration = 10.0f;
2230 }
2231 partner->scale.x = tempDuration / 10.0f;
2232 partner->scale.y = partner->scale.x;
2233 partner->scale.z = partner->scale.x;
2234 partner->duration--;
2235 if (partner->duration < 0) {
2237 }
2238 break;
2239 case 2:
2241 partner->jumpVel = 0.0f;
2242 partner->pos.y = partner->moveToPos.y;
2244 return true;
2245 }
2246 return false;
2247}
void disable_npc_blur(Npc *npc)
Definition npc.c:1085
void enable_npc_blur(Npc *npc)
Definition npc.c:1064

◆ partner_init_get_out()

s32 partner_init_get_out ( Npc * npc)

Definition at line 2249 of file partners.c.

◆ partner_get_out()

s32 partner_get_out ( Npc * partner)
Bug
? collider flags not properly masked with COLLIDER_FLAG_SURFACE_TYPE

Definition at line 2256 of file partners.c.

2256 {
2259 f32 x, y, z, hitDepth;
2260 f32 var_f0;
2261
2263
2264 switch (wPartnerFollowState) {
2265 case 0:
2266 if (clamp_angle(playerStatus->spriteFacingAngle) < 180.0f) {
2267 partner->yaw = clamp_angle(camera->curYaw + 90.0f);
2268 } else {
2269 partner->yaw = clamp_angle(camera->curYaw - 90.0f);
2270 }
2271 partner->moveToPos.x = playerStatus->pos.x;
2272 partner->moveToPos.y = playerStatus->pos.y;
2273 if (wPartner->isFlying) {
2274 partner->moveToPos.y = playerStatus->pos.y;
2275 }
2276 partner->moveToPos.z = playerStatus->pos.z;
2277 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, playerStatus->colliderDiameter, partner->yaw);
2278 moveToX = partner->moveToPos.x;
2279 moveToY = partner->moveToPos.y;
2280 moveToZ = partner->moveToPos.z;
2281 if (!wPartner->isFlying) {
2282 x = moveToX;
2283 y = moveToY + partner->collisionHeight;
2284 z = moveToZ;
2285 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2286 hitDepth = 1000.0f;
2287 if (npc_raycast_down_around(COLLIDER_FLAG_IGNORE_PLAYER, &x, &y, &z, &hitDepth, partner->yaw, partner->collisionDiameter)) {
2290
2292 moveToX = playerStatus->pos.x;
2293 moveToY = playerStatus->pos.y;
2294 moveToZ = playerStatus->pos.z;
2295 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2296 }
2297 } else {
2298 moveToX = playerStatus->pos.x;
2299 moveToY = playerStatus->pos.y;
2300 moveToZ = playerStatus->pos.z;
2301 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2302 }
2303 }
2304
2305 x = partner->pos.x = playerStatus->pos.x;
2306 y = partner->pos.y = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2307 z = partner->pos.z = playerStatus->pos.z;
2308
2309 partner->moveSpeed = 4.0f;
2310 partner->jumpScale = 1.2f;
2311 partner->planarFlyDist = dist2D(x, z, moveToX, moveToZ);
2312 partner->yaw = atan2(x, z, moveToX, moveToZ);
2313 partner->duration = partner->planarFlyDist / partner->moveSpeed;
2314 if (partner->duration < 10) {
2315 partner->duration = 10;
2316 partner->moveSpeed = partner->planarFlyDist / partner->duration;
2317 }
2318 partner->jumpVel = (moveToY - y + (partner->jumpScale * partner->duration * partner->duration * 0.5f)) /
2319 partner->duration;
2321 y = moveToY - y;
2323 break;
2324 case 1:
2325 if (partner->jumpVel < 0.0f && npc_try_snap_to_ground(partner, fabsf(partner->jumpVel))) {
2327 break;
2328 }
2329 partner->jumpVel -= partner->jumpScale;
2330 partner->pos.y += partner->jumpVel;
2331 if (partner->jumpVel <= 0.0f) {
2333 }
2334 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2336 var_f0 = partner->duration;
2337 if (var_f0 > 10.0f) {
2338 var_f0 = 10.0f;
2339 }
2340
2341 partner->scale.x = (10.0f - var_f0) / 10.0f;
2342 partner->scale.y = partner->scale.x;
2343 partner->scale.z = partner->scale.x;
2344
2345 partner->duration--;
2346 if (partner->duration < 0) {
2348 }
2349 break;
2350 case 2:
2351 partner->pos.y = partner->moveToPos.y;
2352 partner->jumpVel = 0.0f;
2353 partner->scale.x = 1.0f;
2354 partner->scale.y = 1.0f;
2355 partner->scale.z = 1.0f;
2356 partner->moveToPos.x = partner->pos.x;
2357 partner->moveToPos.y = partner->pos.y;
2358 partner->moveToPos.z = partner->pos.z;
2359 partner->pos.x = partner->pos.x;
2360 partner->pos.y = playerStatus->pos.y;
2361 if (wPartner->isFlying) {
2362 partner->pos.y = playerStatus->pos.y;
2363 }
2364 partner->pos.z = partner->pos.z;
2366 partner->pos.x = partner->moveToPos.x;
2367 partner->pos.y = partner->moveToPos.y;
2368 partner->pos.z = partner->moveToPos.z;
2369 if (partner->flags & NPC_FLAG_GROUNDED) {
2370 if (!wPartner->isFlying) {
2372 }
2373 }
2374 return true;
2375 }
2376 return false;
2377}
s32 npc_try_snap_to_ground(Npc *npc, f32 velocity)
Definition npc.c:580
s32 gCurrentCameraID
Definition cam_math.c:5

◆ func_800EF300()

void func_800EF300 ( void )

Definition at line 2379 of file partners.c.

2379 {
2381}

Referenced by action_update_use_spinning_flower(), entity_CymbalPlant_idle(), and func_802BC050_E2E980().

◆ func_800EF314()

void func_800EF314 ( void )

Definition at line 2383 of file partners.c.

2383 {
2385}

◆ enable_partner_ai()

void enable_partner_ai ( void )

Definition at line 2387 of file partners.c.

2387 {
2390
2391 if (!wPartner->isFlying) {
2393 } else {
2395 }
2396}
void partner_walking_enable(Npc *partner, s32 val)
Definition partners.c:1133
void partner_flying_enable(Npc *partner, s32 val)
Definition partners.c:1704

Referenced by action_update_use_spinning_flower(), entity_CymbalPlant_idle(), and func_802BC32C_E2EC5C().

◆ partner_set_tether_distance()

void partner_set_tether_distance ( f32 dist)

Definition at line 2398 of file partners.c.

2398 {
2400}

◆ partner_reset_tether_distance()

void partner_reset_tether_distance ( void )

Definition at line 2402 of file partners.c.

2402 {
2403 wPartnerTetherDistance = 40.0f;
2404}

Referenced by check_for_interactables(), and interact_inspect_dismiss().

◆ partner_set_goal_pos()

void partner_set_goal_pos ( s32 x,
s32 z )

Definition at line 2406 of file partners.c.

2406 {
2409}

Referenced by func_800EF414().

◆ func_800EF3D4()

◆ func_800EF3E4()

void func_800EF3E4 ( void )

Definition at line 2415 of file partners.c.

2415 {
2417 D_8010CFCA = 0;
2418 wPartnerMoveTime = 10;
2419 D_8010CFCE = 0;
2420}

Referenced by entity_Chest_idle().

◆ func_800EF414()

void func_800EF414 ( s32 posX,
s32 posZ )

Definition at line 2422 of file partners.c.

2422 {
2423 partner_set_goal_pos(posX, posZ);
2425}
void partner_set_goal_pos(s32 x, s32 z)
Definition partners.c:2406

◆ func_800EF43C()

void func_800EF43C ( void )

Definition at line 2427 of file partners.c.

2427 {
2429 D_8010CFCA = 0;
2430 D_8010CFCE = 0;
2431}

◆ partner_clear_player_tracking()

◆ partner_force_player_flip_done()

s32 partner_force_player_flip_done ( void )

Definition at line 2451 of file partners.c.

2451 {
2455
2456 if (playerStatus->flipYaw[CAM_DEFAULT] == 0.0f) {
2457 if (!(playerStatus->spriteFacingAngle >= 90.0f) || !(playerStatus->spriteFacingAngle < 270.0f)) {
2458 isFacingLeft = true;
2459 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw - 90.0f);
2460 } else {
2461 isFacingLeft = false;
2462 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw + 90.0f);
2463 }
2464 } else if (get_clamped_angle_diff(cameras[CAM_DEFAULT].curYaw, playerStatus->targetYaw) < 0.0f) {
2465 isFacingLeft = true;
2466 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw - 90.0f);
2467
2468 } else {
2469 isFacingLeft = false;
2470 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw + 90.0f);
2471 }
2472
2473 playerStatus->curYaw = playerStatus->targetYaw;
2474 return isFacingLeft;
2475}

◆ partner_enable_input()

void partner_enable_input ( void )

Definition at line 2477 of file partners.c.

2477 {
2479
2481 if (partnerStatus->inputDisabledCount < 0) {
2482 partnerStatus->inputDisabledCount = 0;
2483 }
2484}

Referenced by check_input_open_menus(), SentinelAI_GrabPlayer(), update_encounters_conversation(), update_encounters_post_battle(), and update_item_entity_pickup().

◆ partner_disable_input()

◆ partner_do_player_collision()

void partner_do_player_collision ( Npc * partner)

Definition at line 2492 of file partners.c.

2492 {
2500 f32 W;
2501
2502 transform_point(gCameras[CAM_DEFAULT].mtxPerspective,
2503 playerStatus->pos.x, playerStatus->pos.y, playerStatus->pos.z, 1.0f,
2505 transform_point(gCameras[CAM_DEFAULT].mtxPerspective, partner->pos.x, partner->pos.y, partner->pos.z, 1.0f,
2510 if (playerScreenX <= (partner->collisionDiameter + playerStatus->colliderDiameter) * 0.9f &&
2511 playerScreenY <= partner->collisionHeight + playerStatus->colliderHeight && playerScreenZ <= 4.0)
2512 {
2514 atan2(playerStatus->pos.x, playerStatus->pos.z, partner->pos.x, partner->pos.z));
2516 }
2517}
#define transform_point

Referenced by partner_flying_update_motion(), and partner_walking_update_motion().

Variable Documentation

◆ gPartnerStatus

PartnerStatus gPartnerStatus

Definition at line 42 of file partners.c.

Referenced by _use_partner_ability(), action_update_ride(), basic_ai_check_player_dist(), can_open_menus(), can_open_menus(), can_open_world_menu(), can_trigger_loading_zone(), can_use_ability(), check_conversation_trigger(), check_input_hammer(), check_input_open_menus(), check_player_action_debug(), CleftAI_CanSeePlayer(), ClubbaNappingAI_Sleep(), end_outta_sight_cleanup(), entity_CymbalPlant_idle(), entity_small_switch_idle(), entity_Tweester_idle(), get_movement_from_input(), get_overriding_player_anim(), is_player_dismounted(), ispy_notification_update(), MagikoopaAI_CanShootSpell(), MeleeHitbox_CanSeePlayer(), npc_do_other_npc_collision(), npc_surface_spawn_snow_fx(), partner_disable_input(), partner_enable_input(), partner_flying_update_motion(), partner_handle_after_battle(), partner_init_after_battle(), partner_initialize_data(), partner_is_idle(), partner_reset_data(), partner_use_ability(), partner_walking_update_motion(), phys_adjust_cam_on_landing(), phys_can_player_interact(), phys_main_collision_below(), phys_update_action_state(), player_handle_floor_collider_type(), post_battle(), post_battle(), post_battle(), post_battle(), pre_battle(), pre_battle(), pre_battle(), pre_battle(), pre_battle(), pre_battle(), pre_battle(), pre_battle(), ProjectileHitbox_GetUsableProjectileID(), reset_outta_sight_alpha_on_menu_close(), SentinelAI_Descend(), SentinelAI_GrabPlayer(), set_action_state(), should_cancel_open_world_menu(), should_cancel_pulse_stone(), sync_held_position(), test_item_player_collision(), update_camera_lead_amount(), update_encounters_neutral(), update_encounters_post_battle(), update_player_blink(), update_riding_physics(), and update_riding_physics().

◆ wPartnerNpc

◆ PartnerCommandState

BSS s32 PartnerCommandState

Definition at line 45 of file partners.c.

Referenced by _use_partner_ability().

◆ gPlayerMoveHistory

◆ gPlayerMoveHistoryIndex

◆ D_8010CFBC

◆ wPartnerTetherDistance

◆ D_8010CFC4

◆ wPartnerFollowState

◆ D_8010CFCA

◆ D_8010CFCC

BSS s16 D_8010CFCC

Definition at line 53 of file partners.c.

Referenced by partner_flying_enable(), and partner_walking_enable().

◆ D_8010CFCE

◆ wPartnerNpcIndex

BSS s32 wPartnerNpcIndex

Definition at line 55 of file partners.c.

Referenced by create_partner_npc(), and partner_free_npc().

◆ wPartnerCurrentScript

BSS Evt* wPartnerCurrentScript

Definition at line 56 of file partners.c.

Referenced by _use_partner_ability(), and partner_handle_after_battle().

◆ wCurrentPartnerId

◆ wPartnerCurrentScriptID

◆ D_8010CFE0

◆ NextPartnerID

BSS s32 NextPartnerID

◆ NextPartnerCommand

◆ wPartner

◆ HES_Partner0

HudScript HES_Partner0
extern

Definition at line 1942 of file global_hud_scripts.c.

◆ HES_Goombario

HudScript HES_Goombario
extern

Definition at line 1946 of file global_hud_scripts.c.

◆ HES_Kooper

HudScript HES_Kooper
extern

Definition at line 1950 of file global_hud_scripts.c.

◆ HES_Bombette

HudScript HES_Bombette
extern

Definition at line 1954 of file global_hud_scripts.c.

◆ HES_Parakarry

HudScript HES_Parakarry
extern

Definition at line 1958 of file global_hud_scripts.c.

◆ HES_Watt

HudScript HES_Watt
extern

Definition at line 1966 of file global_hud_scripts.c.

◆ HES_Sushie

HudScript HES_Sushie
extern

Definition at line 1970 of file global_hud_scripts.c.

◆ HES_Lakilester

HudScript HES_Lakilester
extern

Definition at line 1974 of file global_hud_scripts.c.

◆ HES_Bow

HudScript HES_Bow
extern

Definition at line 1962 of file global_hud_scripts.c.

◆ HES_PartnerA

HudScript HES_PartnerA
extern

Definition at line 1982 of file global_hud_scripts.c.

◆ HES_Partner0Disabled

HudScript HES_Partner0Disabled
extern

Definition at line 1944 of file global_hud_scripts.c.

◆ HES_GoombarioDisabled

HudScript HES_GoombarioDisabled
extern

Definition at line 1948 of file global_hud_scripts.c.

◆ HES_KooperDisabled

HudScript HES_KooperDisabled
extern

Definition at line 1952 of file global_hud_scripts.c.

◆ HES_BombetteDisabled

HudScript HES_BombetteDisabled
extern

Definition at line 1956 of file global_hud_scripts.c.

◆ HES_ParakarryDisabled

HudScript HES_ParakarryDisabled
extern

Definition at line 1960 of file global_hud_scripts.c.

◆ HES_WattDisabled

HudScript HES_WattDisabled
extern

Definition at line 1968 of file global_hud_scripts.c.

◆ HES_SushieDisabled

HudScript HES_SushieDisabled
extern

Definition at line 1972 of file global_hud_scripts.c.

◆ HES_LakilesterDisabled

HudScript HES_LakilesterDisabled
extern

Definition at line 1976 of file global_hud_scripts.c.

◆ HES_BowDisabled

HudScript HES_BowDisabled
extern

Definition at line 1964 of file global_hud_scripts.c.

◆ HES_PartnerADisabled

HudScript HES_PartnerADisabled
extern

Definition at line 1984 of file global_hud_scripts.c.

◆ HES_StatusDigit0

HudScript HES_StatusDigit0
extern

Definition at line 1994 of file global_hud_scripts.c.

◆ HES_StatusDigit1

HudScript HES_StatusDigit1
extern

Definition at line 1996 of file global_hud_scripts.c.

◆ HES_StatusDigit2

HudScript HES_StatusDigit2
extern

Definition at line 1998 of file global_hud_scripts.c.

◆ HES_StatusDigit3

HudScript HES_StatusDigit3
extern

Definition at line 2000 of file global_hud_scripts.c.

◆ HES_StatusDigit4

HudScript HES_StatusDigit4
extern

Definition at line 2002 of file global_hud_scripts.c.

◆ HES_StatusDigit5

HudScript HES_StatusDigit5
extern

Definition at line 2004 of file global_hud_scripts.c.

◆ HES_StatusDigit6

HudScript HES_StatusDigit6
extern

Definition at line 2006 of file global_hud_scripts.c.

◆ HES_StatusDigit7

HudScript HES_StatusDigit7
extern

Definition at line 2008 of file global_hud_scripts.c.

◆ HES_StatusDigit8

HudScript HES_StatusDigit8
extern

Definition at line 2010 of file global_hud_scripts.c.

◆ HES_StatusDigit9

HudScript HES_StatusDigit9
extern

Definition at line 2012 of file global_hud_scripts.c.

◆ HES_StatusTimes

HudScript HES_StatusTimes
extern

Definition at line 1990 of file global_hud_scripts.c.

◆ HES_StatusSlash

HudScript HES_StatusSlash
extern

Definition at line 1992 of file global_hud_scripts.c.

◆ HES_StatusStar1

HudScript HES_StatusStar1
extern

Definition at line 2045 of file global_hud_scripts.c.

◆ HES_StatusStar2

HudScript HES_StatusStar2
extern

Definition at line 2047 of file global_hud_scripts.c.

◆ HES_StatusStar3

HudScript HES_StatusStar3
extern

Definition at line 2049 of file global_hud_scripts.c.

◆ HES_StatusStar4

HudScript HES_StatusStar4
extern

Definition at line 2051 of file global_hud_scripts.c.

◆ HES_StatusStar5

HudScript HES_StatusStar5
extern

Definition at line 2053 of file global_hud_scripts.c.

◆ HES_StatusStar6

HudScript HES_StatusStar6
extern

Definition at line 2055 of file global_hud_scripts.c.

◆ HES_StatusStar7

HudScript HES_StatusStar7
extern

Definition at line 2057 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement1

HudScript HES_StatusSPIncrement1
extern

Definition at line 2029 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement2

HudScript HES_StatusSPIncrement2
extern

Definition at line 2031 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement3

HudScript HES_StatusSPIncrement3
extern

Definition at line 2033 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement4

HudScript HES_StatusSPIncrement4
extern

Definition at line 2035 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement5

HudScript HES_StatusSPIncrement5
extern

Definition at line 2037 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement6

HudScript HES_StatusSPIncrement6
extern

Definition at line 2039 of file global_hud_scripts.c.

◆ HES_StatusSPIncrement7

HudScript HES_StatusSPIncrement7
extern

Definition at line 2041 of file global_hud_scripts.c.

◆ EVS_World_UseItem

EvtScript EVS_World_UseItem
extern

Definition at line 154 of file world_use_item.c.

154 {
158 IfNe(LVar0, 0)
160 Wait(20)
161 EndIf
165 IfEq(LVarD, 0)
167 Else
169 EndIf
170 IfEq(LVarF, 1)
172 EndIf
173 IfGt(LVarB, 0)
175 Add(LVar0, 0)
176 Add(LVar1, 35)
178 EndIf
179 IfGt(LVarC, 0)
181 Add(LVar0, 20)
182 Add(LVar1, 25)
184 EndIf
186 Add(LVar1, 25)
188 IfNe(LVarB, 0)
190 EndIf
191 IfNe(LVarC, 0)
193 EndIf
194 IfEq(LVarF, 0)
195 Wait(10)
197 Wait(30)
198 Else
199 Wait(30)
200 EndIf
204 Wait(20)
208 Return
209 End
210};
@ EVT_GROUP_NEVER_PAUSE
Definition evt.h:143
ApiStatus GetPartnerInUse(Evt *script, b32 isInitialCall)
ApiStatus ShowRecoveryShimmer(Evt *script, b32 isInitialCall)
ApiStatus SetPlayerAnimation(Evt *script, b32 isInitialCall)
ApiStatus DisablePlayerInput(Evt *script, b32 isInitialCall)
Disables player and partner input, and disables the status menu.
ApiStatus ShowStartRecoveryShimmer(Evt *script, b32 isInitialCall)
ApiStatus InterruptUsePartner(Evt *script, b32 isInitialCall)
ApiStatus GetPlayerPos(Evt *script, b32 isInitialCall)
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:296
#define LVarF
Definition macros.h:164
#define IfNe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR != RVAR.
Definition macros.h:273
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:214
#define Add(VAR, INT_VALUE)
Definition macros.h:377
#define LVarC
Definition macros.h:161
#define IfGt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR <= RVAR.
Definition macros.h:279
#define EndIf
Marks the end of an if statement or an else block.
Definition macros.h:299
#define LVarB
Definition macros.h:160
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:476
#define LVar2
Definition macros.h:151
#define LVar1
Definition macros.h:150
#define LVarA
Definition macros.h:159
#define LVarD
Definition macros.h:162
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:255
#define SetGroup(GROUP)
Sets the current thread's group. Group value meanings are currently not known.
Definition macros.h:520
#define IfEq(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR == RVAR.
Definition macros.h:270
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:577
#define LVar0
Definition macros.h:149
#define Return
Kills the current EVT thread.
Definition macros.h:218
EvtScript EVS_WorldItem_ShowUsedItem
EvtScript EVS_WorldItem_PlayEatingSounds
EvtScript EVS_WorldItem_PlayDrinkingSounds

◆ wPartnerHudScripts

HudScript* wPartnerHudScripts[]
Initial value:
= {
}
HudScript HES_Parakarry
HudScript HES_Sushie
HudScript HES_Partner0
HudScript HES_PartnerA
HudScript HES_Kooper
HudScript HES_Watt
HudScript HES_Lakilester
HudScript HES_Bow
HudScript HES_Bombette
HudScript HES_Goombario

Definition at line 130 of file partners.c.

Referenced by setup_partner_popup().

◆ wDisabledPartnerHudScripts

HudScript* wDisabledPartnerHudScripts[]
Initial value:

Definition at line 136 of file partners.c.

Referenced by setup_partner_popup().

◆ DigitHudScripts

HudScript* DigitHudScripts[]
Initial value:
= {
}
HudScript HES_StatusDigit6
HudScript HES_StatusDigit1
HudScript HES_StatusDigit8
HudScript HES_StatusDigit3
HudScript HES_StatusDigit5
HudScript HES_StatusDigit2
HudScript HES_StatusDigit7
HudScript HES_StatusDigit9
HudScript HES_StatusDigit0
HudScript HES_StatusDigit4

Definition at line 142 of file partners.c.

Referenced by status_bar_draw_number(), and status_bar_draw_stat().

◆ TimesHudScript

HudScript* TimesHudScript = &HES_StatusTimes

Definition at line 146 of file partners.c.

Referenced by status_bar_draw_number().

◆ SlashHudScript

HudScript* SlashHudScript = &HES_StatusSlash

Definition at line 147 of file partners.c.

Referenced by status_bar_draw_stat().

◆ SPIncrementHudScripts

HudScript* SPIncrementHudScripts[]

◆ SPStarHudScripts

HudScript* SPStarHudScripts[]
Initial value:
}
HudScript HES_StatusStar1
HudScript HES_StatusStar2
HudScript HES_StatusStar3
HudScript HES_StatusStar7
HudScript HES_StatusStar5
HudScript HES_StatusStar6
HudScript HES_StatusStar4

Definition at line 152 of file partners.c.

Referenced by update_status_bar().

◆ StatusBarSPIncrementOffsets

s32 StatusBarSPIncrementOffsets[] = { -1, 1, 2, 4, 5, 7, 8, 0, 0, 0 }

Definition at line 156 of file partners.c.

156{ -1, 1, 2, 4, 5, 7, 8, 0, 0, 0 };

Referenced by update_status_bar().

◆ D_800F8020

s32 D_800F8020 = 0

Definition at line 158 of file partners.c.

Referenced by partner_flying_update_motion().

◆ wPartnerMoveGoalX

s32 wPartnerMoveGoalX = 0

Definition at line 159 of file partners.c.

Referenced by partner_move_to_goal(), and partner_set_goal_pos().

◆ wPartnerMoveGoalZ

s32 wPartnerMoveGoalZ = 0

Definition at line 160 of file partners.c.

Referenced by partner_move_to_goal(), and partner_set_goal_pos().

◆ wPartnerMoveTime

◆ wPartnerMoveSpeed

f32 wPartnerMoveSpeed = 0.0f

◆ D_800F8034

f32 D_800F8034 = 0.0f

◆ D_800F8038

s16 D_800F8038 = 0

Definition at line 164 of file partners.c.

◆ D_800F803A

s16 D_800F803A = 0

Definition at line 165 of file partners.c.

Referenced by partner_flying_follow_player(), and partner_walking_follow_player().

◆ wPartners

WorldPartner wPartners[]

Definition at line 167 of file partners.c.

167 {
168 [PARTNER_NONE] {
169 // blank
170 },
175 .isFlying = false,
176 .init = world_goombario_init,
177 .takeOut = &EVS_WorldGoombario_TakeOut,
178 .update = &EVS_WorldGoombario_Update,
179 .useAbility = &EVS_WorldGoombario_UseAbility,
180 .putAway = &EVS_WorldGoombario_PutAway,
182 .canUseAbility = world_goombario_can_open_menus,
183 .canPlayerOpenMenus = world_goombario_can_open_menus,
184 .preBattle = world_goombario_pre_battle,
185 },
189 .dmaDest = &world_partner_kooper_VRAM,
190 .isFlying = false,
191 .init = world_kooper_init,
192 .takeOut = &EVS_WorldKooper_TakeOut,
193 .update = &EVS_WorldKooper_Update,
194 .useAbility = &EVS_WorldKooper_UseAbility,
195 .putAway = &EVS_WorldKooper_PutAway,
196 .idle = ANIM_WorldKooper_Idle,
197 .testFirstStrike = world_kooper_test_first_strike,
198 .canUseAbility = partner_is_idle,
199 .canPlayerOpenMenus = partner_is_idle,
200 .preBattle = world_kooper_pre_battle,
201 .postBattle = world_kooper_post_battle,
202 },
206 .dmaDest = &world_partner_bombette_VRAM,
207 .isFlying = false,
208 .init = world_bombette_init,
209 .takeOut = &EVS_WorldBombette_TakeOut,
210 .update = &EVS_WorldBombette_Update,
211 .useAbility = &EVS_WorldBombette_UseAbility,
212 .putAway = &EVS_WorldBombette_PutAway,
214 .testFirstStrike = world_bombette_test_first_strike,
215 .canUseAbility = world_bombette_can_use_ability,
216 .canPlayerOpenMenus = world_bombette_can_open_menus,
217 .preBattle = world_bombette_pre_battle,
218 },
223 .isFlying = true,
224 .init = world_parakarry_init,
225 .takeOut = &EVS_WorldParakarry_TakeOut,
226 .update = &EVS_WorldParakarry_Update,
227 .useAbility = &EVS_WorldParakarry_UseAbility,
228 .putAway = &EVS_WorldParakarry_PutAway,
230 .canPlayerOpenMenus = partner_is_idle,
231 .preBattle = world_parakarry_pre_battle,
232 .postBattle = world_parakarry_post_battle,
233 },
237 .dmaDest = &world_partner_goompa_VRAM,
238 .isFlying = false,
239 .init = world_goompa_init,
240 .takeOut = &EVS_WorldGoompa_TakeOut,
241 .update = &EVS_WorldGoompa_Update,
242 .useAbility = &EVS_WorldGoompa_UseAbility,
243 .putAway = &EVS_WorldGoompa_PutAway,
244 .idle = ANIM_Goompa_Idle,
245 },
246 [PARTNER_WATT] {
247 .dmaStart = &world_partner_watt_ROM_START,
249 .dmaDest = &world_partner_watt_VRAM,
250 .isFlying = true,
251 .init = world_watt_init,
252 .takeOut = &EVS_WorldWatt_TakeOut,
253 .update = &EVS_WorldWatt_Update,
254 .useAbility = &EVS_WorldWatt_UseAbility,
255 .putAway = &EVS_WorldWatt_PutAway,
256 .idle = ANIM_WorldWatt_Idle,
257 .canPlayerOpenMenus = world_partner_can_open_menus_default,
258 .preBattle = world_watt_pre_battle,
259 .postBattle = world_watt_post_battle,
260 .onEnterMap = &EVS_WorldWatt_EnterMap,
261 },
265 .dmaDest = &world_partner_sushie_VRAM,
266 .isFlying = false,
267 .init = world_sushie_init,
268 .takeOut = &EVS_WorldSushie_TakeOut,
269 .update = &EVS_WorldSushie_Update,
270 .useAbility = &EVS_WorldSushie_UseAbility,
271 .putAway = &EVS_WorldSushie_PutAway,
272 .idle = ANIM_WorldSushie_Idle,
273 .canPlayerOpenMenus = world_partner_can_open_menus_default,
274 .preBattle = world_sushie_pre_battle,
275 .postBattle = world_sushie_post_battle,
276 .onEnterMap = &EVS_WorldSushie_EnterMap,
277 },
282 .isFlying = true,
283 .init = world_lakilester_init,
284 .takeOut = &EVS_WorldLakilester_TakeOut,
286 .useAbility = &EVS_WorldLakilester_UseAbility,
287 .putAway = &EVS_WorldLakilester_PutAway,
289 .canPlayerOpenMenus = world_partner_can_open_menus_default,
290 .preBattle = world_lakilester_pre_battle,
291 .postBattle = world_lakilester_post_battle,
292 .onEnterMap = &EVS_WorldLakilester_EnterMap,
293 },
294 [PARTNER_BOW] {
295 .dmaStart = &world_partner_bow_ROM_START,
296 .dmaEnd = &world_partner_bow_ROM_END,
297 .dmaDest = &world_partner_bow_VRAM,
298 .isFlying = true,
299 .init = world_bow_init,
300 .takeOut = &EVS_WorldBow_TakeOut,
301 .update = &EVS_WorldBow_Update,
302 .useAbility = &EVS_WorldBow_UseAbility,
303 .putAway = &EVS_WorldBow_PutAway,
304 .idle = ANIM_WorldBow_Idle,
305 .canUseAbility = partner_is_idle,
306 .canPlayerOpenMenus = world_partner_can_open_menus_default,
307 .preBattle = world_bow_pre_battle,
308 },
313 .isFlying = false,
314 .init = world_goombaria_init,
315 .takeOut = &EVS_WorldGoombaria_TakeOut,
316 .update = &EVS_WorldGoombaria_Update,
317 .useAbility = &EVS_WorldGoombaria_UseAbility,
318 .putAway = &EVS_WorldGoombaria_PutAway,
319 .idle = ANIM_Goombaria_Idle,
320 .canUseAbility = partner_is_idle,
321 .canPlayerOpenMenus = partner_is_idle,
322 },
323 [PARTNER_TWINK] {
326 .dmaDest = &world_partner_twink_VRAM,
327 .isFlying = true,
328 .init = world_twink_init,
329 .takeOut = &EVS_WorldTwink_TakeOut,
330 .update = &EVS_WorldTwink_Update,
331 .useAbility = &EVS_WorldTwink_UseAbility,
332 .putAway = &EVS_WorldTwink_PutAway,
333 .idle = ANIM_Twink_Idle,
334 .canUseAbility = partner_is_idle,
335 .canPlayerOpenMenus = partner_is_idle,
336 },
337};
s32 world_bombette_can_use_ability(Npc *npc)
void world_bombette_init(Npc *)
s32 world_bombette_test_first_strike(Npc *, Npc *)
s32 world_bombette_can_open_menus(Npc *)
void world_bombette_pre_battle(Npc *)
void world_bow_init(Npc *)
void world_bow_pre_battle(Npc *)
@ PARTNER_BOMBETTE
Definition enums.h:2922
@ PARTNER_LAKILESTER
Definition enums.h:2927
@ PARTNER_SUSHIE
Definition enums.h:2926
@ PARTNER_TWINK
Definition enums.h:2930
@ PARTNER_GOOMBARIA
Definition enums.h:2929
@ PARTNER_GOOMPA
Definition enums.h:2924
@ PARTNER_KOOPER
Definition enums.h:2921
@ PARTNER_GOOMBARIO
Definition enums.h:2920
EvtScript EVS_WorldGoombaria_UseAbility
Definition goombaria.c:63
EvtScript EVS_WorldGoombaria_Update
Definition goombaria.c:57
EvtScript EVS_WorldGoombaria_TakeOut
Definition goombaria.c:51
EvtScript EVS_WorldGoombaria_PutAway
Definition goombaria.c:69
void world_goombaria_init(Npc *partner)
s32 world_goombario_can_open_menus(Npc *partner)
void world_goombario_init(Npc *partner)
void world_goombario_pre_battle(Npc *partner)
void world_goompa_init(Npc *partner)
s32 world_kooper_test_first_strike(Npc *, Npc *)
void world_kooper_init(Npc *)
void world_kooper_post_battle(Npc *)
void world_kooper_pre_battle(Npc *)
void world_lakilester_init(Npc *)
void world_lakilester_pre_battle(Npc *)
void world_lakilester_post_battle(Npc *)
void world_parakarry_init(Npc *)
void world_parakarry_post_battle(Npc *)
void world_parakarry_pre_battle(Npc *)
s32 world_partner_can_open_menus_default(Npc *partner)
Definition partners.c:533
s32 partner_is_idle(Npc *partner)
Definition partners.c:529
void world_sushie_pre_battle(Npc *)
void world_sushie_init(Npc *)
void world_sushie_post_battle(Npc *)
void world_twink_init(Npc *partner)
void world_watt_init(Npc *)
void world_watt_pre_battle(Npc *)
void world_watt_post_battle(Npc *)
EvtScript EVS_WorldBombette_TakeOut
Definition bombette.c:87
EvtScript EVS_WorldBombette_Update
Definition bombette.c:180
EvtScript EVS_WorldBombette_PutAway
Definition bombette.c:591
EvtScript EVS_WorldBombette_UseAbility
Definition bombette.c:571
EvtScript EVS_WorldBow_Update
Definition bow.c:128
EvtScript EVS_WorldBow_PutAway
Definition bow.c:415
EvtScript EVS_WorldBow_TakeOut
Definition bow.c:41
EvtScript EVS_WorldBow_UseAbility
Definition bow.c:360
EvtScript EVS_WorldGoombario_UseAbility
Definition goombario.c:457
EvtScript EVS_WorldGoombario_TakeOut
Definition goombario.c:98
EvtScript EVS_WorldGoombario_Update
Definition goombario.c:198
EvtScript EVS_WorldGoombario_PutAway
Definition goombario.c:493
EvtScript EVS_WorldGoompa_TakeOut
Definition goompa.c:26
EvtScript EVS_WorldGoompa_PutAway
Definition goompa.c:156
EvtScript EVS_WorldGoompa_UseAbility
Definition goompa.c:136
EvtScript EVS_WorldGoompa_Update
Definition goompa.c:117
EvtScript EVS_WorldKooper_TakeOut
Definition kooper.c:93
EvtScript EVS_WorldKooper_UseAbility
Definition kooper.c:644
EvtScript EVS_WorldKooper_Update
Definition kooper.c:194
EvtScript EVS_WorldKooper_PutAway
Definition kooper.c:660
EvtScript EVS_WorldLakilester_PutAway
EvtScript EVS_WorldLakilester_TakeOut
Definition lakilester.c:109
EvtScript EVS_WorldLakilester_UseAbility
Definition lakilester.c:991
EvtScript EVS_WorldLakilester_Update
Definition lakilester.c:200
EvtScript EVS_WorldLakilester_EnterMap
EvtScript EVS_WorldParakarry_UseAbility
Definition parakarry.c:613
EvtScript EVS_WorldParakarry_PutAway
Definition parakarry.c:633
EvtScript EVS_WorldParakarry_Update
Definition parakarry.c:147
EvtScript EVS_WorldParakarry_TakeOut
Definition parakarry.c:56
EvtScript EVS_WorldSushie_PutAway
Definition sushie.c:886
EvtScript EVS_WorldSushie_EnterMap
Definition sushie.c:985
EvtScript EVS_WorldSushie_TakeOut
Definition sushie.c:771
EvtScript EVS_WorldSushie_UseAbility
Definition sushie.c:740
EvtScript EVS_WorldSushie_Update
Definition sushie.c:860
EvtScript EVS_WorldTwink_TakeOut
Definition twink.c:59
EvtScript EVS_WorldTwink_UseAbility
Definition twink.c:71
EvtScript EVS_WorldTwink_PutAway
Definition twink.c:77
EvtScript EVS_WorldTwink_Update
Definition twink.c:65
EvtScript EVS_WorldWatt_PutAway
Definition watt.c:461
EvtScript EVS_WorldWatt_EnterMap
Definition watt.c:597
EvtScript EVS_WorldWatt_Update
Definition watt.c:208
EvtScript EVS_WorldWatt_UseAbility
Definition watt.c:433
EvtScript EVS_WorldWatt_TakeOut
Definition watt.c:90

Referenced by create_partner_npc().

◆ wSavedPartnerPosX

◆ wSavedPartnerPosY

◆ wSavedPartnerPosZ

◆ gPartnerAnimations

PartnerAnimations gPartnerAnimations[]

Definition at line 343 of file partners.c.

343 {
344 [PARTNER_NONE] {
345 // blank
346 },
357 }},
358 [PARTNER_KOOPER] {{
368 }},
379 }},
390 }},
391 [PARTNER_GOOMPA] {{
401 }},
402 [PARTNER_WATT] {{
412 }},
413 [PARTNER_SUSHIE] {{
423 }},
434 }},
435 [PARTNER_BOW] {{
445 }},
456 }},
457 [PARTNER_TWINK] {{
467 }},
468};

Referenced by _use_partner_ability(), partner_flying_enable(), partner_flying_follow_player(), partner_get_out(), partner_move_to_goal(), partner_put_away(), partner_walking_enable(), partner_walking_follow_player(), and set_npc_animation().

◆ UseItemDmaArgs

UseItemStruct UseItemDmaArgs
Initial value:

Definition at line 470 of file partners.c.

Referenced by use_consumable().

◆ D_8010CD20

BSS s32 D_8010CD20

Definition at line 477 of file partners.c.

Referenced by remove_consumable(), and use_consumable().

◆ D_800F84F8

f32 D_800F84F8 = 0.0f

Definition at line 495 of file partners.c.

Referenced by partner_flying_update_motion().