Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
partners.c
Go to the documentation of this file.
1#include "common_structs.h"
2#include "partners.h"
3#include "macros.h"
4
5#include "ld_addrs.h"
6#include "npc.h"
7#include "hud_element.h"
8
9#include "partner/goombario.h"
10#include "sprite/npc/WorldGoombario.h"
11
12#include "partner/kooper.h"
13#include "sprite/npc/WorldKooper.h"
14
15#include "partner/bombette.h"
16#include "sprite/npc/WorldBombette.h"
17
18#include "partner/parakarry.h"
19#include "sprite/npc/WorldParakarry.h"
20
21#include "partner/goompa.h"
22#include "sprite/npc/Goompa.h"
23
24#include "partner/watt.h"
25#include "sprite/npc/WorldWatt.h"
26
27#include "partner/sushie.h"
28#include "sprite/npc/WorldSushie.h"
29
30#include "partner/lakilester.h"
31#include "sprite/npc/WorldLakilester.h"
32
33#include "partner/bow.h"
34#include "sprite/npc/WorldBow.h"
35
36#include "partner/goombaria.h"
37#include "sprite/npc/Goombaria.h"
38
39#include "partner/twink.h"
40#include "sprite/npc/Twink.h"
41
44
63
69extern HudScript HES_Watt;
72extern HudScript HES_Bow;
84
97
105
113
115
118void _use_partner_ability(void);
121
122typedef struct UseItemStruct {
123 /* 0x00 */ u8* dmaStart;
124 /* 0x04 */ u8* dmaEnd;
125 /* 0x08 */ EvtScript* main;
126 /* 0x0C */ s32 unk_0C;
128
129// Partner icons
155
156s32 StatusBarSPIncrementOffsets[] = { -1, 1, 2, 4, 5, 7, 8, 0, 0, 0 };
157
166
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};
338
342
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};
469
476
478
489
494
496
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}
528
532
536
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}
571
573 return !wPartner->isFlying;
574}
575
580
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}
620
624
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}
905
906void switch_to_partner(s32 partnerID) {
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}
925
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}
948
949void func_800EB2A4(s32 partnerID) {
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}
963
966
968 && wPartner != nullptr
970 {
973 } else if (wCurrentPartnerId != PARTNER_NONE) {
974 D_8010CFE0 = 1;
977 return true;
978 }
979 }
980 return false;
981}
982
984 if (wPartner != nullptr
985 && wPartner->canPlayerOpenMenus != nullptr
987 ) {
988 return false;
989 }
990 return true;
991}
992
995 return true;
996 }
997 return false;
998}
999
1031
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}
1050
1053 return wPartner->testFirstStrike(wPartnerNpc, enemy);
1054 }
1055 return false;
1056}
1057
1060
1061 if (partner == nullptr) {
1062 return nullptr;
1063 }
1064 return partner->onEnterMap;
1065}
1066
1070
1073 }
1074
1075 if (wPartner->preBattle != nullptr) {
1077 }
1078 }
1079}
1080
1108
1116
1124
1132
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}
1174
1201
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}
1230
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}
1702
1703
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}
1747
1773
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}
1855
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}
2174
2181
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}
2248
2255
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}
2378
2379void func_800EF300(void) {
2381}
2382
2383void func_800EF314(void) {
2385}
2386
2390
2391 if (!wPartner->isFlying) {
2393 } else {
2395 }
2396}
2397
2401
2405
2409}
2410
2412 D_8010CFCA = arg0;
2413}
2414
2415void func_800EF3E4(void) {
2417 D_8010CFCA = 0;
2418 wPartnerMoveTime = 10;
2419 D_8010CFCE = 0;
2420}
2421
2422void func_800EF414(s32 posX, s32 posZ) {
2423 partner_set_goal_pos(posX, posZ);
2425}
2426
2427void func_800EF43C(void) {
2429 D_8010CFCA = 0;
2430 D_8010CFCE = 0;
2431}
2432
2435 s32 i;
2436
2438 wSavedPartnerPosY = partner->pos.y;
2439 wSavedPartnerPosZ = partner->pos.z;
2440
2441 for (i = 0; i < ARRAY_COUNT(gPlayerMoveHistory); i++, it++) {
2442 it->pos.x = wSavedPartnerPosX;
2443 it->pos.y = wSavedPartnerPosY;
2444 it->pos.z = wSavedPartnerPosZ;
2445 it->isJumping = false;
2446 }
2447}
2448
2449// forces the player to complete a direction flip if they are currently performing one
2450// the resulting camera-relative direction is returned as a boolean 'isFacingLeft'
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}
2476
2479
2481 if (partnerStatus->inputDisabledCount < 0) {
2482 partnerStatus->inputDisabledCount = 0;
2483 }
2484}
2485
2491
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}
2518
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}
BSS s32 PopupMenu_SelectedIndex
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 *)
b8 keepUsingPartnerOnMapChange
u32 pressedButtons[4]
u8 groupFlags
union Evt::@11 owner2
Initially -1.
Bytecode EvtScript[]
s16 invItems[10]
Vec3s pos
Definition demo_api.c:17
#define transform_point
#define clamp_angle
#define atan2
#define mem_clear
@ BUTTON_C_DOWN
Definition enums.h:2765
@ BUTTON_B
Definition enums.h:2775
@ BUTTON_C_LEFT
Definition enums.h:2764
@ BUTTON_Z
Definition enums.h:2774
@ SURFACE_TYPE_LAVA
Definition enums.h:4258
@ SURFACE_TYPE_SPIKES
Definition enums.h:4257
@ PARTNER_ANIM_INDEX_RUN
Definition enums.h:3442
@ PARTNER_ANIM_INDEX_WALK
Definition enums.h:3437
@ PS_FLAG_FALLING
Definition enums.h:3070
@ PS_FLAG_JUMPING
Definition enums.h:3069
@ PS_FLAG_NO_STATIC_COLLISION
Definition enums.h:3085
@ PS_FLAG_HIT_FIRE
Definition enums.h:3084
@ PS_FLAG_INPUT_DISABLED
Definition enums.h:3086
@ PARTNER_ACTION_NONE
Definition enums.h:2966
@ PARTNER_ACTION_USE
Definition enums.h:2967
@ COLLIDER_FLAG_IGNORE_PLAYER
Definition enums.h:4281
@ NPC_PARTNER
Definition enums.h:2514
@ 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
@ PA_FLAG_INTERRUPT_USE_PARTNER
forces actions with bow, parakarry, watt, and lakilester to end (sushie not tested)
Definition enums.h:3127
@ PA_FLAG_SPINNING
Definition enums.h:3141
@ PA_FLAG_OPENED_HIDDEN_PANEL
Definition enums.h:3136
@ PA_FLAG_CHANGING_MAP
Definition enums.h:3146
@ 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
@ SOUND_MENU_ERROR
Definition enums.h:936
@ PARTNER_NONE
Definition enums.h:2919
@ PARTNER_BOMBETTE
Definition enums.h:2922
@ PARTNER_LAKILESTER
Definition enums.h:2927
@ PARTNER_WATT
Definition enums.h:2925
@ PARTNER_BOW
Definition enums.h:2928
@ PARTNER_SUSHIE
Definition enums.h:2926
@ PARTNER_TWINK
Definition enums.h:2930
@ PARTNER_PARAKARRY
Definition enums.h:2923
@ PARTNER_GOOMBARIA
Definition enums.h:2929
@ PARTNER_GOOMPA
Definition enums.h:2924
@ PARTNER_KOOPER
Definition enums.h:2921
@ PARTNER_GOOMBARIO
Definition enums.h:2920
@ ACTION_STATE_RIDE
Definition enums.h:2447
@ ACTION_STATE_HIT_LAVA
Definition enums.h:2437
@ ACTION_STATE_IDLE
Definition enums.h:2412
@ ACTION_STATE_TALK
Reading signs doesn't count.
Definition enums.h:2426
@ ACTION_STATE_LAND
Definition enums.h:2423
@ ACTION_STATE_WALK
Definition enums.h:2413
@ ACTION_STATE_STEP_DOWN
Definition enums.h:2422
@ ACTION_STATE_HIT_FIRE
Causes Mario to fly up and take damage. Used for fire bars.
Definition enums.h:2435
@ ACTION_STATE_RUN
Definition enums.h:2414
@ SURFACE_INTERACT_RUN
Definition enums.h:4270
@ SURFACE_INTERACT_WALK
Definition enums.h:4269
@ SURFACE_INTERACT_LAND
Definition enums.h:4271
@ 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
@ CAM_DEFAULT
Definition enums.h:1826
@ NPC_FLAG_JUMPING
Definition enums.h:3043
@ NPC_FLAG_TOUCHES_GROUND
Definition enums.h:3054
@ NPC_FLAG_IGNORE_PLAYER_COLLISION
Definition enums.h:3040
@ NPC_FLAG_COLLDING_FORWARD_WITH_WORLD
Definition enums.h:3046
@ NPC_FLAG_COLLIDING_WITH_NPC
Definition enums.h:3057
@ NPC_FLAG_GRAVITY
Definition enums.h:3041
@ NPC_FLAG_PARTNER
Definition enums.h:3058
@ NPC_FLAG_GROUNDED
Definition enums.h:3044
@ NPC_FLAG_COLLDING_WITH_WORLD
Definition enums.h:3045
@ EVT_PRIORITY_14
Definition evt.h:155
@ EVT_PRIORITY_1
Definition evt.h:153
@ EVT_GROUP_PASSIVE_NPC
Definition evt.h:144
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
Worker * get_worker(s32 idx)
Definition worker.c:186
f32 fabsf(f32 f)
b32 npc_raycast_down_around(s32, f32 *, f32 *, f32 *, f32 *, f32, f32)
void disable_npc_blur(Npc *npc)
Definition npc.c:1085
f64 fabs(f64 f)
void resume_all_script(s32 id)
void sort_consumables(void)
Bubbles up player inventory items such that all ITEM_NONE values are at the bottom.
Definition inventory.c:409
s32 disable_player_input(void)
Definition 77480.c:989
s32 get_collider_flags(s32 colliderID)
Definition collision.c:481
u32 dma_copy(Addr romStart, Addr romEnd, void *vramDest)
Definition 43F0.c:442
void enable_npc_blur(Npc *npc)
Definition npc.c:1064
s32 enable_player_input(void)
Definition 77480.c:997
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
f32 player_get_side_angle(void)
Definition 7BB60.c:1178
u32 get_entity_type(s32 arg0)
Definition entity.c:568
s32 is_starting_conversation(void)
Definition encounter.c:2815
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
b32 npc_test_move_taller_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
b32 npc_raycast_up(s32, f32 *, f32 *, f32 *, f32 *)
void kill_script_by_ID(s32 id)
s32 does_script_exist(s32 id)
void suspend_all_script(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
s32 create_worker_frontUI(void(*updateFunc)(void), void(*drawFunc)(void))
Definition worker.c:63
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
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 HudScript[]
Definition hud_element.h:9
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 *)
s32 npc_try_snap_to_ground(Npc *npc, f32 velocity)
Definition npc.c:580
s32 create_basic_npc(NpcBlueprint *blueprint)
Definition npc.c:189
void npc_surface_spawn_fx(Npc *npc, SurfaceInteractMode mode)
Definition surfaces.c:394
void free_npc_by_index(s32 listIndex)
Definition npc.c:201
void npc_do_world_collision(Npc *npc)
Definition npc.c:277
Npc * get_npc_by_index(s32 listIndex)
Definition npc.c:270
void npc_move_heading(Npc *npc, f32 speed, f32 yaw)
Definition npc.c:983
void world_parakarry_init(Npc *)
void world_parakarry_post_battle(Npc *)
void world_parakarry_pre_battle(Npc *)
BSS PlayerPathElement gPlayerMoveHistory[40]
Definition partners.c:46
HudScript HES_BombetteDisabled
void partner_init_after_battle(s32 partnerID)
Definition partners.c:926
s32 partner_can_use_ability(void)
Definition partners.c:993
BSS s32 gPlayerMoveHistoryIndex
Definition partners.c:47
s32 func_800EA52C(s32 partnerID)
Definition partners.c:537
HudScript HES_StatusDigit6
BSS s16 D_8010CFCC
Definition partners.c:53
HudScript HES_Parakarry
s32 partner_init_get_out(Npc *npc)
Definition partners.c:2249
HudScript HES_StatusSPIncrement6
s16 D_800F803A
Definition partners.c:165
HudScript * TimesHudScript
Definition partners.c:146
BSS s32 wPartnerNpcIndex
Definition partners.c:55
HudScript HES_StatusDigit1
void partner_walking_follow_player(Npc *partner)
Definition partners.c:1231
HudScript * wDisabledPartnerHudScripts[]
Definition partners.c:136
void switch_to_partner(s32 partnerID)
Definition partners.c:906
HudScript * SlashHudScript
Definition partners.c:147
void partner_reset_data(void)
Definition partners.c:1000
UseItemStruct UseItemDmaArgs
Definition partners.c:470
s32 func_800EA4B0(s32 collisionID)
Definition partners.c:497
PartnerAnimations gPartnerAnimations[]
Definition partners.c:343
HudScript HES_StatusSPIncrement4
void partner_disable_input(void)
Definition partners.c:2486
HudScript HES_StatusStar1
HudScript HES_StatusSPIncrement3
HudScript HES_PartnerADisabled
HudScript HES_StatusDigit8
void partner_resume_ability_script(void)
Definition partners.c:1125
PartnerStatus gPartnerStatus
Definition partners.c:42
void partner_walking_update_motion(Npc *partner)
Definition partners.c:1202
HudScript HES_BowDisabled
void partner_clear_player_tracking(Npc *partner)
Definition partners.c:2433
f32 wSavedPartnerPosZ
Definition partners.c:341
void partner_flying_update_player_tracking(Npc *partner)
Definition partners.c:1748
s32 wPartnerMoveGoalZ
Definition partners.c:160
HudScript HES_LakilesterDisabled
HudScript * DigitHudScripts[]
Definition partners.c:142
HudScript * wPartnerHudScripts[]
Definition partners.c:130
HudScript HES_StatusDigit3
s32 D_800F8020
Definition partners.c:158
HudScript * SPStarHudScripts[]
Definition partners.c:152
HudScript HES_StatusDigit5
HudScript HES_StatusDigit2
HudScript HES_StatusDigit7
EvtScript * main
Definition partners.c:125
HudScript HES_SushieDisabled
void partner_walking_update_player_tracking(Npc *partner)
Definition partners.c:1175
HudScript * SPIncrementHudScripts[]
Definition partners.c:148
BSS s32 D_8010CFBC
Definition partners.c:48
BSS s32 PartnerCommandState
Definition partners.c:45
void func_800EA5B8(Npc *partner)
Definition partners.c:576
HudScript HES_KooperDisabled
HudScript HES_GoombarioDisabled
BSS s32 D_8010CFC4
Definition partners.c:50
void partner_kill_ability_script(void)
Definition partners.c:1109
void create_partner_npc(void)
Definition partners.c:581
void partner_free_npc(void)
Definition partners.c:621
s32 wPartnerMoveGoalX
Definition partners.c:159
BSS s16 D_8010CFCA
Definition partners.c:52
s32 partner_is_flying(void)
Definition partners.c:572
HudScript HES_StatusStar2
HudScript HES_ParakarryDisabled
HudScript HES_StatusDigit9
HudScript HES_StatusStar3
f32 D_800F84F8
Definition partners.c:495
void func_800EF314(void)
Definition partners.c:2383
void partner_enable_input(void)
Definition partners.c:2477
s32 StatusBarSPIncrementOffsets[]
Definition partners.c:156
s32 partner_init_put_away(Npc *partner)
Definition partners.c:2175
s32 partner_use_ability(void)
Definition partners.c:964
HudScript HES_StatusSlash
BSS s32 wPartnerCurrentScriptID
Definition partners.c:58
HudScript HES_StatusSPIncrement7
WorldPartner wPartners[]
Definition partners.c:167
s32 partner_test_enemy_collision(Npc *enemy)
Definition partners.c:1051
BSS s32 NextPartnerCommand
Definition partners.c:61
void enable_partner_ai(void)
Definition partners.c:2387
s32 use_consumable(s32 invSlot)
Definition partners.c:479
BSS Evt * wPartnerCurrentScript
Definition partners.c:56
s16 D_800F8038
Definition partners.c:164
BSS s32 NextPartnerID
Definition partners.c:60
void func_800EF414(s32 posX, s32 posZ)
Definition partners.c:2422
f32 wSavedPartnerPosX
Definition partners.c:339
s32 partner_put_away(Npc *partner)
Definition partners.c:2182
HudScript HES_Partner0Disabled
void func_800EF3E4(void)
Definition partners.c:2415
f32 wSavedPartnerPosY
Definition partners.c:340
void partner_flying_follow_player(Npc *)
Definition partners.c:1856
HudScript HES_WattDisabled
HudScript HES_StatusTimes
BSS s32 D_8010CD20
Definition partners.c:477
BSS s16 wPartnerFollowState
Definition partners.c:51
void func_800EF43C(void)
Definition partners.c:2427
HudScript HES_Sushie
s32 partner_force_player_flip_done(void)
Definition partners.c:2451
s32 partner_can_open_world_menus(void)
Definition partners.c:983
void partner_flying_update_motion(Npc *partner)
Definition partners.c:1774
BSS s32 wCurrentPartnerId
Definition partners.c:57
HudScript HES_Partner0
s32 world_partner_can_open_menus_default(Npc *partner)
Definition partners.c:533
EvtScript * partner_get_enter_map_script(void)
Definition partners.c:1058
HudScript HES_StatusStar7
void remove_consumable(void)
Definition partners.c:490
BSS WorldPartner * wPartner
Definition partners.c:62
HudScript HES_StatusStar5
HudScript HES_StatusSPIncrement5
s32 wPartnerMoveTime
Definition partners.c:161
HudScript HES_PartnerA
BSS s32 D_8010CFE0
Definition partners.c:59
void partner_handle_before_battle(void)
Definition partners.c:1067
s32 partner_get_out(Npc *partner)
Definition partners.c:2256
HudScript HES_StatusSPIncrement2
HudScript HES_Kooper
void partner_walking_enable(Npc *partner, s32 val)
Definition partners.c:1133
f32 D_800F8034
Definition partners.c:163
void partner_flying_enable(Npc *partner, s32 val)
Definition partners.c:1704
BSS f32 wPartnerTetherDistance
Definition partners.c:49
void _use_partner_ability(void)
Definition partners.c:625
void func_800EB2A4(s32 partnerID)
Definition partners.c:949
void partner_handle_after_battle(void)
Definition partners.c:1081
void partner_set_tether_distance(f32 dist)
Definition partners.c:2398
HudScript HES_StatusStar6
void func_800EF3D4(s32 arg0)
Definition partners.c:2411
s32 partner_is_idle(Npc *partner)
Definition partners.c:529
void partner_reset_tether_distance(void)
Definition partners.c:2402
f32 wPartnerMoveSpeed
Definition partners.c:162
void partner_do_player_collision(Npc *partner)
Definition partners.c:2492
HudScript HES_Watt
void func_800EF300(void)
Definition partners.c:2379
void partner_suspend_ability_script(void)
Definition partners.c:1117
HudScript HES_StatusStar4
HudScript HES_StatusDigit0
Npc * wPartnerNpc
Definition partners.c:43
HudScript HES_StatusDigit4
void partner_move_to_goal(Npc *, s32)
Definition partners.c:2519
EvtScript EVS_World_UseItem
HudScript HES_Lakilester
HudScript HES_StatusSPIncrement1
void partner_set_goal_pos(s32 x, s32 z)
Definition partners.c:2406
HudScript HES_Bow
HudScript HES_Bombette
HudScript HES_Goombario
BSS s16 D_8010CFCE
Definition partners.c:54
void partner_initialize_data(void)
Definition partners.c:1032
void * dmaStart
Definition partners.h:9
PartnerFunc preBattle
Definition partners.h:22
EvtScript * takeOut
Definition partners.h:14
PartnerBoolFunc canUseAbility
Definition partners.h:20
PartnerTesHitFunc testFirstStrike
Definition partners.h:19
EvtScript * update
Definition partners.h:15
PartnerBoolFunc canPlayerOpenMenus
Definition partners.h:21
PartnerFunc postBattle
Definition partners.h:23
EvtScript * onEnterMap
Definition partners.h:24
EvtScript * useAbility
Definition partners.h:16
EvtScript * putAway
Definition partners.h:17
PartnerFunc init
Definition partners.h:13
void sfx_play_sound(s32 soundID)
#define NPC_DISPOSE_POS_Z
Definition macros.h:172
#define NPC_DISPOSE_POS_X
Definition macros.h:170
#define COLLISION_WITH_ENTITY_BIT
Definition macros.h:163
#define BSS
Definition macros.h:6
#define ARRAY_COUNT(arr)
Definition macros.h:39
#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
Vec3f scale
f32 jumpVel
s32 flags
AnimID curAnim
s32 collisionChannel
s16 collisionHeight
Vec3f pos
void world_sushie_pre_battle(Npc *)
void world_sushie_init(Npc *)
void world_sushie_post_battle(Npc *)
void world_twink_init(Npc *partner)
Entity * TweesterTouchingPartner
Definition 7B440.c:4
PlayerStatus * gPlayerStatusPtr
GameStatus * gGameStatusPtr
Definition main_loop.c:31
s32 NpcHitQueryColliderID
Camera gCameras[4]
Definition cam_main.c:16
PlayerData gPlayerData
Definition 77480.c:39
PlayerStatus gPlayerStatus
Definition 77480.c:38
s32 gCurrentCameraID
Definition cam_math.c:5
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