Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
lakilester.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects.h"
3#include "battle/battle.h"
4#include "script_api/battle.h"
5#include "sprite/npc/BattleLakilester.h"
9#include "hud_element.h"
10#include "sprite/player.h"
11
12#define NAMESPACE battle_partner_lakilester
13
14extern EvtScript N(EVS_HandleEvent);
15extern EvtScript N(EVS_Idle);
17extern EvtScript N(EVS_TakeTurn);
18extern EvtScript N(EVS_Init);
20extern EvtScript N(EVS_Celebrate);
21extern EvtScript N(EVS_RunAway);
27
32
33static s32 sSavedHurricaneIntensity;
34static s32 sBreathSizeIncrease;
35static s32 sMaxPower;
36static HudElemID HID_AimReticle;
37static HudElemID HID_AimTarget;
38static s32 TargetMarkRotation;
39static s32 D_8023D294;
40static s32 AimingTime;
41static s32 D_8023D29C;
42static f32 D_8023D2A0;
43static f32 D_8023D2A4;
44static f32 D_8023D2A8;
45static f32 D_8023D2AC;
46static f32 D_8023D2B0;
47static f32 AimMoveAngle;
48static s32 hudAim[1];
49static HudElemID HID_AnalogStick;
50static s32 HudStickPosX;
51static s32 HudStickPosY;
52static b32 SpinyFlipTargetingDone;
53static s32 EnemyHurricaneChances[MAX_ENEMY_ACTORS];
54static s32 NumEnemiesBeingBlown;
55static s32 IsHurricaneActive;
56static s32 D_8023D338;
57
58enum N(ActorPartIDs) {
59 PRT_MAIN = 1,
60 PRT_2 = 2,
61};
62
63enum N(ActorVars) {
64 AVAR_Unk_0 = 0,
65};
66
67enum N(ActorParams) {
68 DMG_UNK = 0,
69};
70
71typedef struct HurricaneState {
72 /* 0x00 */ char unk_00[0x44];
74 /* 0x46 */ s16 unk_46;
75 /* 0x48 */ char unk_48[0xC];
76 /* 0x54 */ s16 unk_54;
77 /* 0x56 */ char unk_56[0x4];
79 /* 0x5C */ s8 state;
80 /* 0x5D */ s8 unk_5D;
81 /* 0x5E */ char unk_5E[0x12];
82 /* 0x70 */ s16 intensity;
83 /* 0x72 */ s16 totalPower;
84 /* 0x74 */ char unk_74[0x10];
86
87s32 N(DefaultAnims)[] = {
92};
93
97};
98
99s32 N(DefenseTable)[] = {
102};
103
104s32 N(StatusTable)[] = {
107 STATUS_KEY_SLEEP, 100,
110 STATUS_KEY_DIZZY, 100,
115 STATUS_KEY_STOP, 100,
127};
128
129ActorPartBlueprint N(ActorParts)[] = {
130 {
131 .flags = 0,
132 .index = PRT_MAIN,
133 .posOffset = { 0, 0, 0 },
134 .targetOffset = { 12, 30 },
135 .opacity = 255,
136 .idleAnimations = N(DefaultAnims),
137 .defenseTable = N(DefenseTable),
138 .eventFlags = 0,
139 .elementImmunityFlags = 0,
140 .projectileTargetOffset = { 0, 0 },
141 },
142 {
144 .index = PRT_2,
145 .posOffset = { 0, 0, 0 },
146 .targetOffset = { 0, 0 },
147 .opacity = 255,
148 .idleAnimations = N(IdleAnimations_spiny),
149 .defenseTable = N(DefenseTable),
150 .eventFlags = 0,
151 .elementImmunityFlags = 0,
152 .projectileTargetOffset = { 0, 0 },
153 },
154};
155
156ActorBlueprint NAMESPACE = {
157 .flags = ACTOR_FLAG_FLYING,
158 .type = ACTOR_TYPE_LAKILESTER,
159 .level = ACTOR_LEVEL_LAKILESTER,
160 .maxHP = 99,
161 .partCount = ARRAY_COUNT(N(ActorParts)),
162 .partsData = N(ActorParts),
163 .initScript = &N(EVS_Init),
164 .statusTable = N(StatusTable),
165 .escapeChance = 0,
166 .airLiftChance = 0,
167 .hurricaneChance = 0,
168 .spookChance = 0,
169 .upAndAwayChance = 0,
170 .spinSmashReq = 4,
171 .powerBounceChance = 80,
172 .coinReward = 0,
173 .size = { 44, 40 },
174 .healthBarOffset = { 0, 0 },
175 .statusIconOffset = { -10, 30 },
176 .statusTextOffset = { 13, 31 },
177};
178
179EvtScript N(EVS_Init) = {
180 Call(BindTakeTurn, ACTOR_SELF, Ref(N(EVS_TakeTurn)))
181 Call(BindIdle, ACTOR_SELF, Ref(N(EVS_Idle)))
182 Call(BindHandleEvent, ACTOR_SELF, Ref(N(EVS_HandleEvent)))
184 Return
185 End
186};
187
188EvtScript N(EVS_Idle) = {
189 Return
190 End
191};
192
193EvtScript N(EVS_HandleEvent) = {
209 SetConst(LVar0, PRT_MAIN)
215 SetConst(LVar2, 20)
221 Set(LVar2, 20)
234 Set(LVar2, 20)
240 SetConst(LVar0, PRT_MAIN)
243 Set(LVar3, 10)
248 SetConst(LVar0, PRT_MAIN)
251 Wait(10)
256 Return
257 End
258};
259
260EvtScript N(EVS_TakeTurn) = {
272 Return
273 End
274};
275
277 SetConst(LVar0, PRT_MAIN)
282 Return
283 End
284};
285
287 SetConst(LVar0, PRT_MAIN)
290 Return
291 End
292};
293
303 Return
304 End
305};
306
308 Return
309 End
310};
311
314 Call(ShowActionHud, true)
319 Return
340 Return
341 End
342};
343
351 Return
352 End
353};
354
362 Return
363 End
364};
365
368};
369
370API_CALLABLE(N(SpinyFlipUpdatePopup)) {
371 if (isInitialCall) {
372 SpinyFlipTargetingDone = false;
373 }
374
375 if (!SpinyFlipTargetingDone) {
377 return ApiStatus_BLOCK;
378 } else {
379 return ApiStatus_DONE2;
380 }
381}
382
383API_CALLABLE(N(SpinyFlipActionCommand)) {
386 Actor* partner = battleStatus->partnerActor;
387 Actor* target;
391 f32 speed;
392 f32 stickAngle;
393 s32 stickMagnitude;
395 s32 i;
396
397 f32 theta;
400 f32 temp_f2;
401 f32 temp_f8;
404
405 enum SpinyFlipState {
406 SPINY_FLIP_INIT = 0,
407 SPINY_FLIP_DELAY = 1, // give player time to start aiming
408 SPINY_FLIP_AIMING = 2, // player is aiming
409 };
410
411 partnerState = &partner->state;
412 playerState = &battleStatus->playerActor->state;
413
414 if (isInitialCall) {
415 script->functionTemp[0] = SPINY_FLIP_INIT;
416 }
417
418 switch (script->functionTemp[0]) {
419 case SPINY_FLIP_INIT:
420 HID_AimReticle = hud_element_create(&HES_AimReticle);
421 hud_element_set_render_depth(HID_AimReticle, 10);
422 HID_AimTarget = hud_element_create(&HES_AimTarget);
423 hud_element_set_render_depth(HID_AimTarget, 10);
424 hud_element_create_transform_A(HID_AimTarget);
425 HudStickPosX = -48;
426 HudStickPosY = 70;
427 HID_AnalogStick = hid = hud_element_create(&HES_StickNeutral);
428 hud_element_set_render_pos(hid, HudStickPosX, HudStickPosY);
430 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
431 hudAim[i] = hidAim = hud_element_create(N(AimDotHudScripts)[i]);
433 }
434 partnerState->curPos.x = partner->curPos.x + 33.0f;
435 partnerState->curPos.y = partner->curPos.y + 34.0f;
436 partnerState->curPos.z = partner->curPos.z + 15.0f;
437 partnerState->unk_18.x = partner->curPos.x + 33.0f;
438 partnerState->unk_18.y = partner->curPos.y + 34.0f;
439 partnerState->unk_18.z = partner->curPos.z + 15.0f;
440 set_goal_pos_to_part(partnerState, partner->targetActorID, partner->targetPartID);
441 target = get_actor(partner->targetActorID);
442 part = get_actor_part(target, partner->targetPartID);
443 partnerState->goalPos.x += part->projectileTargetOffset.x;
444 partnerState->goalPos.y += part->projectileTargetOffset.y;
445 partnerState->goalPos.z = partnerState->goalPos.z; // required to match
446 partnerState->dist = dist2D(partnerState->curPos.x,
447 partnerState->curPos.y,
448 partnerState->goalPos.x,
449 partnerState->goalPos.y);
450 partnerState->speed = 0.0f;
451 partnerState->velStep.x = 0.0f;
452 partnerState->velStep.y = 0.0f;
453 TargetMarkRotation = 0;
454 D_8023D294 = 0;
455 AimingTime = 30;
456 D_8023D2A0 = 0.0f;
457 D_8023D2A4 = 0.0f;
458 D_8023D2A8 = 0.0f;
459 D_8023D2AC = 0.0f;
460 D_8023D29C = 0;
461 D_8023D2B0 = 3.0f;
462 AimMoveAngle = -1.0f;
463 partnerState->unk_24 = ((part->size.y + part->size.x) / 2) / 24.0;
464 hud_element_set_scale(HID_AimTarget, partnerState->unk_24 * target->scalingFactor);
465 SpinyFlipTargetingDone = true;
466 script->functionTemp[0] = SPINY_FLIP_DELAY;
467 break;
468 case SPINY_FLIP_DELAY:
469 if (battleStatus->stickX != 0 || battleStatus->stickY != 0) {
470 AimingTime = 0;
471 }
472 if (AimingTime != 0) {
473 AimingTime--;
474 } else {
475 AimingTime = (s32)(80 * DT);
476 hud_element_set_script(HID_AnalogStick, &HES_StickTapRight);
478 script->functionTemp[0] = SPINY_FLIP_AIMING;
479 }
480 break;
482 stickMagnitude = battleStatus->stickMagnitude;
483 if (stickMagnitude > 80) {
484 stickMagnitude = 80;
485 }
486 stickAngle = battleStatus->stickAngle;
487 if (stickMagnitude < 35) {
488 f32 temp = stickMagnitude;
489 stickMagnitude = temp * sin_rad(DEG_TO_RAD(stickMagnitude * 2));
490 }
491 temp_f8 = D_8023D2A0;
492 temp_f2 = temp_f8 + D_8023D2A4 + D_8023D2A8;
493 D_8023D2A0 = stickMagnitude;
494 D_8023D2A8 = D_8023D2A4;
495 temp_f10 = D_8023D2A0 - (temp_f2 / 3.0f);
496 D_8023D2A4 = temp_f8;
497 if (temp_f10 > 0) {
498 D_8023D2AC = temp_f10;
499 if (partner->state.speed != 0.0f) {
500 partner->state.speed += (D_8023D2AC / 8.5) / 3.0;
501 } else {
502 partner->state.speed += (D_8023D2AC / 8.5) / 2.0;
503 }
504 AimMoveAngle = stickAngle;
505 } else {
506 D_8023D2AC = temp_f10;
507 }
508 if (!(stickMagnitude < 31)) {
509 AimMoveAngle = stickAngle;
510 }
511 if (partnerState->speed > 6.7) {
512 partnerState->speed = 6.7;
513 }
514 partnerState->speed -= (f32) ((2.0 * (40 - stickMagnitude)) / 40.0);
515 if (partnerState->speed <= 0.0f) {
516 partnerState->speed = 0.0f;
517 D_8023D2AC = 0.0f;
518 }
519 if (AimMoveAngle >= 0.0f) {
520 theta = DEG_TO_RAD(AimMoveAngle);
523 speed = partnerState->speed;
524 partnerState->curPos.x += speed * sinTheta;
525 partnerState->curPos.y += speed * cosTheta;
526 }
527 if (partnerState->curPos.x < -30.0f) {
528 partnerState->curPos.x = -30.0f;
529 }
530 if (partnerState->curPos.x > 170.0f) {
531 partnerState->curPos.x = 170.0f;
532 }
533 if (partnerState->curPos.y > 130.0f) {
534 partnerState->curPos.y = 130.0f;
535 }
536 if (partnerState->curPos.y < 0.0f) {
537 partnerState->curPos.y = 0.0f;
538 }
539 if (battleStatus->curButtonsPressed & BUTTON_A) {
540 AimingTime = 0;
541 }
542 if (AimingTime == 60) {
544 }
545 if (AimingTime == 30) {
547 }
548 if (AimingTime != 0) {
549 AimingTime--;
550 break;
551 }
552 script->varTable[14] = 0;
553 script->varTable[15] = 0;
554 script->varTable[7] = partnerState->curPos.x;
555 script->varTable[8] = partnerState->curPos.y;
556 script->varTable[9] = partnerState->curPos.z;
557 partnerState->dist = dist2D(partnerState->curPos.x, partnerState->curPos.y, partnerState->goalPos.x, partnerState->goalPos.y) / partnerState->unk_24;
558 if (partnerState->dist <= 12.0) {
559 script->varTable[15] = 1;
560 }
561 hud_element_free(HID_AimTarget);
562 hud_element_free(HID_AimReticle);
563 hud_element_free(HID_AnalogStick);
564 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
565 hid = hudAim[i];
567 }
570 return ApiStatus_DONE2;
571 }
572
574 partnerState->goalPos.x, partnerState->goalPos.y, partnerState->goalPos.z,
575 &screenX, &screenY, &screenZ);
576 hid = HID_AimTarget;
578 hud_element_set_transform_rotation(hid, 0.0f, 0.0f, TargetMarkRotation);
579 TargetMarkRotation -= 10;
580 TargetMarkRotation = clamp_angle(TargetMarkRotation);
582 partnerState->curPos.x, partnerState->curPos.y, partnerState->curPos.z,
583 &screenX, &screenY, &screenZ);
585
586 // show analog stick hud element
587 switch (script->functionTemp[0]) {
588 case SPINY_FLIP_DELAY:
590 HudStickPosX += 20;
591 if (HudStickPosX > 50) {
592 HudStickPosX = 50;
593 }
594 hud_element_set_render_pos(HID_AnalogStick, HudStickPosX, HudStickPosY);
595 break;
596 }
597
598 // show aim dot hud element in center of
599 switch (script->functionTemp[0]) {
600 case SPINY_FLIP_DELAY:
602 playerState->curPos.x = partnerState->curPos.x;
603 playerState->curPos.y = partnerState->curPos.y;
604 playerState->curPos.z = partnerState->curPos.z;
605 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
607 hid = hudAim[i];
609 }
610 break;
611 }
612
614 return ApiStatus_BLOCK;
615}
616
617API_CALLABLE(N(ThrowSpinyFX)) {
619 Actor* partnerActor = battleStatus->partnerActor;
620 f32 xPos = partnerActor->curPos.x + 5;
621 f32 yPos = partnerActor->curPos.y + partnerActor->size.y + 20;
622 f32 zPos = partnerActor->curPos.z;
623 f32 var = rand_int(140) + 10;
624 f32 var2 = rand_int(80) + 10;
625
626 fx_throw_spiny(0, xPos, yPos, zPos, var, var2, 20, 1.5f, 30);
627
628 return ApiStatus_DONE2;
629}
630
631API_CALLABLE(N(GetSpinySurgeDamage)) {
633 s32 actionCommandResult = script->varTable[10];
634 s32 damage = 0;
635
636 switch (partnerLevel) {
638 if (actionCommandResult <= 99) {
639 damage = 1;
640 } else {
641 damage = 2;
642 }
643 break;
645 if (actionCommandResult <= 70) {
646 damage = 1;
647 } else if (actionCommandResult <= 99) {
648 damage = 2;
649 } else {
650 damage = 3;
651 }
652 break;
654 if (actionCommandResult <= 40) {
655 damage = 1;
656 } else if (actionCommandResult <= 70) {
657 damage = 2;
658 } else if (actionCommandResult <= 99) {
659 damage = 3;
660 } else {
661 damage = 4;
662 }
663 break;
664 }
665
666 if (actionCommandResult >= 100) {
667 script->varTable[0] = true;
668 } else {
669 script->varTable[0] = false;
670 }
671
672 script->varTable[15] = damage;
673 return ApiStatus_DONE2;
674}
675
676API_CALLABLE(N(RemoveCloudNineFX)) {
678
679 if (effect != nullptr) {
680 remove_effect(effect);
683 return ApiStatus_DONE2;
684 }
685
686 return ApiStatus_DONE2;
687}
688
689API_CALLABLE(N(SpawnCloudNineFX)) {
691 Actor* actor = battleStatus->playerActor;
692
693 static f32 sCounter;
694
695 if (isInitialCall) {
696 script->functionTemp[0] = 0;
697 }
698
699 switch (script->functionTemp[0]) {
700 case 0:
701 sCounter = 0.1f;
702 fx_ending_decals(0, actor->curPos.x, actor->curPos.y, actor->curPos.z, 0.1f, &battleStatus->cloudNineEffect);
703 script->functionTemp[0] = 1;
704 break;
705 case 1:
706 if (sCounter >= 1.0) {
707 return ApiStatus_DONE2;
708 }
709 battleStatus->cloudNineEffect->data.endingDecals->scale += 0.2;
710 sCounter += 0.2;
711 break;
712 }
713 return ApiStatus_BLOCK;
714}
715
716API_CALLABLE(N(ApplyCloudNine)) {
717 if (gBattleStatus.cloudNineTurnsLeft < script->varTable[10]) {
721 }
722
723 return ApiStatus_DONE2;
724}
725
726API_CALLABLE(N(InitHurricane)) {
732 Actor* actor;
735 s32 hurricaneChance;
737 s32 i;
738
739 NumEnemiesBeingBlown = 0;
740 IsHurricaneActive = false;
741
742 for (i = 0; i < partner->targetListLength; i++) {
743 EnemyHurricaneChances[i] = 0;
744 }
745
746 totalChance = 0;
747 affectedTargets = 0;
748
749 for (i = 0; i < partner->targetListLength; i++) {
750 targetIdx = partner->targetIndexList[i];
751 target = &partner->targetData[targetIdx];
752 actor = get_actor(target->actorID);
753 part = get_actor_part(actor, target->partID);
754 hpMissingPercent = 100 - ((actor->curHP * 100) / actor->maxHP);
755 hurricaneChance = actor->actorBlueprint->hurricaneChance;
756 if (hurricaneChance > 0) {
757 hurricaneChance += hurricaneChance * hpMissingPercent / 100;
758 if (hurricaneChance > 100) {
759 hurricaneChance = 100;
760 }
761 if (actor->debuff != 0) {
762 hurricaneChance = hurricaneChance * 150 / 100;
763 if (hurricaneChance > 150) {
764 hurricaneChance = 150;
765 }
766 }
768 hurricaneChance = 0;
769 }
770 if (part->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
771 hurricaneChance = 0;
772 }
774 }
775 EnemyHurricaneChances[targetIdx] = hurricaneChance;
776 totalChance += hurricaneChance;
777 }
778
779 if (affectedTargets != 0) {
781 } else {
783 }
784 script->varTable[0] = avgHurricaneChance;
785
786 for (i = 0; i < partner->targetListLength; i++) {
787 targetIdx = partner->targetIndexList[i];
788 target = &partner->targetData[targetIdx];
789 actor = get_actor(target->actorID);
790 part = get_actor_part(actor, target->partID);
792 EnemyHurricaneChances[targetIdx] = -1;
793 } else if (EnemyHurricaneChances[targetIdx] != 0) {
794 EnemyHurricaneChances[targetIdx] = avgHurricaneChance;
795 }
796 }
797 return ApiStatus_DONE2;
798}
799
800API_CALLABLE(N(CanTargetBeBlown)) {
802 Actor* partner = battleStatus->partnerActor;
803 s32 targetIdx = partner->targetIndexList[partner->selectedTargetIndex];
804 s32* hurricaneChance = &EnemyHurricaneChances[targetIdx];
805 SelectableTarget* target = &partner->targetData[targetIdx];
806
807 script->varTable[0] = *hurricaneChance;
808
809 if (*hurricaneChance == -1) {
810 return ApiStatus_DONE2;
811 }
812
813 if (*hurricaneChance == 0) {
814 return ApiStatus_DONE2;
815 }
816
817 get_actor(target->actorID);
818 if (rand_int(99) < battleStatus->actionQuality) {
819 *hurricaneChance = -1;
820 script->varTable[0] = target->actorID;
821 } else {
822 *hurricaneChance = 0;
823 script->varTable[0] = ACTOR_PLAYER;
824 }
825 return ApiStatus_DONE2;
826}
827
829 Thread
834 Add(LVar0, 40)
835 Add(LVar1, 20)
842 Call(SetBattleCamTarget, 47, 46, 12)
847 Add(LVar0, 3)
848 Add(LVar1, 10)
849 Add(LVar2, 5)
851 Wait(1)
855 Loop(4)
856 Add(LVar1, 6)
858 Wait(1)
859 EndLoop
861 Add(LVar0, 8)
862 Add(LVar1, 40)
863 Add(LVar2, 5)
866 Thread
867 Loop(40 * DT)
870 Wait(1)
873 Wait(1)
875 IfEq(LVar0, 0)
877 EndIf
878 EndLoop
886 Wait(3)
889 Set(LVarF, -1)
890 EndIf
893 CaseEq(-1)
896 Set(LVar0, LVar7)
897 Set(LVar1, LVar8)
898 Set(LVar2, LVar9)
901 CaseEq(0)
904 Set(LVar0, LVar7)
905 Set(LVar1, LVar8)
906 Set(LVar2, LVar9)
915 Thread
916 Add(LVar0, 50)
917 Set(LVar1, 0)
925 Set(LVarE, 3)
927 Set(LVarE, 4)
929 Set(LVarE, 5)
932 CaseGt(0)
938 CaseEq(1)
943 Wait(15)
954 Return
955 End
956};
957
963 CaseEq(0)
964 Call(SetupMashMeter, 2, 99, 100, 0, 0, 0)
965 CaseEq(1)
966 Call(SetupMashMeter, 3, 70, 99, 100, 0, 0)
967 CaseEq(2)
968 Call(SetupMashMeter, 4, 40, 70, 99, 100, 0)
972 Call(SetBattleCamTarget, 45, 60, 0)
979 Call(AddGoalPos, ACTOR_PARTNER, 60, 20, 0)
982 Wait(10)
985 CaseEq(0)
986 Set(LVarA, 60 * DT)
987 CaseEq(1)
988 Set(LVarA, 60 * DT)
989 CaseEq(2)
990 Set(LVarA, 60 * DT)
992 Set(LVarB, LVarA)
993 Add(LVarB, -3)
998 Set(LVar9, 0)
1000 Set(LFlag3, false)
1001 Loop(LVarA)
1003 IfEq(LVar9, 2)
1005 EndIf
1006 Switch(LVar0)
1008 Set(LVar9, 0)
1012 IfEq(LVar9, 1)
1014 EndIf
1017 Add(LVar0, 3)
1018 Add(LVar1, 34)
1019 Add(LVar2, 5)
1022 Set(LVar9, 1)
1024 IfEq(LVar9, 0)
1026 EndIf
1027 IfEq(LFlag2, false)
1029 Set(LFlag2, true)
1030 Else
1032 Set(LFlag2, false)
1033 EndIf
1034 Call(N(ThrowSpinyFX))
1039 Add(LVar0, 1)
1041 Wait(15)
1043 Sub(LVar0, 1)
1046 Set(LFlag3, true)
1047 Set(LVar9, 0)
1048 EndSwitch
1049 Wait(1)
1050 EndLoop
1053 Loop(0)
1055 IfEq(LVar0, 0)
1056 BreakLoop
1057 EndIf
1058 Wait(1)
1059 EndLoop
1060 Wait(10)
1061 IfEq(LFlag3, false)
1062 Set(LVar0, 0)
1063 Set(LVarF, 0)
1064 Wait(15)
1065 Goto(13)
1066 EndIf
1068 Label(0)
1072 Goto(12)
1073 EndIf
1076 Switch(LVar0)
1077 CaseGt(0)
1081 EndSwitch
1082 Switch(LVar0)
1083 CaseGt(0)
1087 EndSwitch
1088 Wait(6)
1089 Label(12)
1092 Goto(0)
1093 EndIf
1094 Wait(30)
1095 Label(13)
1096 Switch(LVar0)
1105 EndSwitch
1106 Return
1107 End
1108};
1109
1125 Wait(10)
1126 Thread
1128 Add(LVar1, 40)
1131 EndThread
1132 Wait(15)
1133 Set(LVar0, 0)
1134 Loop(10)
1135 Add(LVar0, 18)
1137 Wait(1)
1138 EndLoop
1139 Wait(10)
1141 Wait(5)
1143 Wait(15)
1145 Add(LVar0, -12)
1146 Add(LVar1, 13)
1147 Add(LVar2, -5)
1152 Call(PlayerHopToGoal, 18, 0, 0)
1154 Wait(3)
1160 Wait(100)
1161 Wait(3)
1165 IfGt(LVarA, 0)
1171 EndIf
1174 Thread
1176 Loop(10)
1177 Set(LVar0, LVar3)
1178 Set(LVar1, LVar4)
1179 Set(LVar2, LVar5)
1180 Call(RandInt, 40, LVar6)
1181 Sub(LVar6, 20)
1182 Add(LVar0, LVar6)
1183 Call(RandInt, 30, LVar6)
1184 Sub(LVar6, 15)
1185 Add(LVar1, LVar6)
1187 Wait(1)
1188 EndLoop
1189 EndThread
1191 Set(LVar1, 0)
1196 Wait(7)
1198 Thread
1205 EndThread
1206 Thread
1208 Sub(LVar1, 40)
1211 EndThread
1212 Wait(15)
1213 Set(LVar0, 180)
1214 Loop(10)
1215 Sub(LVar0, 18)
1217 Wait(1)
1218 EndLoop
1221 Wait(10)
1222 IfGt(LVarA, 0)
1225 EndIf
1227 Return
1228 End
1229};
1230
1245 Wait(10)
1246 Set(LVar0, 0)
1247 Loop(10)
1248 Add(LVar0, 18)
1250 Wait(1)
1251 EndLoop
1252 Wait(10)
1254 Wait(20)
1256 Add(LVar0, 12)
1257 Add(LVar1, -7)
1258 Add(LVar2, 5)
1261 Thread
1263 Add(LVar1, 40)
1266 EndThread
1268 Add(LVar1, 40)
1275 Wait(100)
1276 Wait(3)
1280 IfGt(LVarA, 0)
1284 EndIf
1287 Thread
1289 Loop(10)
1290 Set(LVar0, LVar3)
1291 Set(LVar1, LVar4)
1292 Set(LVar2, LVar5)
1293 Call(RandInt, 40, LVar6)
1294 Sub(LVar6, 20)
1295 Add(LVar0, LVar6)
1296 Call(RandInt, 30, LVar6)
1297 Sub(LVar6, 15)
1298 Add(LVar1, LVar6)
1300 Wait(1)
1301 EndLoop
1302 EndThread
1304 Set(LVar1, 0)
1308 Thread
1314 EndThread
1315 Thread
1318 EndThread
1319 Set(LVar0, 180)
1320 Loop(10)
1321 Sub(LVar0, 18)
1323 Wait(1)
1324 EndLoop
1328 Wait(10)
1329 IfGt(LVarA, 0)
1332 EndIf
1333 Return
1334 End
1335};
1336
1341 Else
1343 EndIf
1344 Return
1345 End
1346};
1347
1348enum {
1352};
1353
1354#if VERSION_PAL
1355#define HURRICANE_PARTNER_MOVE_TIME 140
1356#define HURRICANE_UNUSED_TIME 152
1357#else
1358#define HURRICANE_PARTNER_MOVE_TIME 165
1359#define HURRICANE_UNUSED_TIME 177
1360#endif
1361
1362API_CALLABLE(N(ProcessHurricane)) {
1364 Actor* partner = battleStatus->partnerActor;
1365 ActorState* partnerState = &partner->state;
1366 EffectInstance* effect;
1370 s32 temp;
1371 s32 i;
1372 f32 x, y, z;
1373 f32 x2, y2, z2;
1374 f32 tempF1, tempF2;
1375 f32 totalPower;
1376 f64 tempF64;
1377
1380 static s32 sUnusedAngle;
1381 static s32 sHurricaneIntensity;
1383 static s32 D_8023D278;
1385
1386 if (isInitialCall) {
1387 script->functionTemp[0] = 0;
1388 }
1389
1390 switch (script->functionTemp[0]) {
1391 case 0:
1392 partner->state.angle = 0.0f;
1393 partner->state.moveTime = HURRICANE_PARTNER_MOVE_TIME;
1394 partner->state.moveArcAmplitude = 0;
1395 IsHurricaneActive = true;
1396 D_8023D338 = 255;
1397 sHuffPuffBreathEffect = effect = fx_huff_puff_breath(0, NPC_DISPOSE_LOCATION, 0.0f, -2.0f, 0.6f, 0);
1398
1399 effect->data.huffPuffBreath->primCol.r = 20;
1400 effect->data.huffPuffBreath->primCol.g = 80;
1401 effect->data.huffPuffBreath->primCol.b = 255;
1402
1403 effect->data.huffPuffBreath->envCol.r = 200;
1404 effect->data.huffPuffBreath->envCol.g = 240;
1405 effect->data.huffPuffBreath->envCol.b = 240;
1406
1408 hurricaneState->breathSizeIncrease = 0;
1409 hurricaneState->unk_46 = 0;
1410 hurricaneState->state = 0;
1411 hurricaneState->totalPower = 5000;
1412 hurricaneState->intensity = 0;
1413 hurricaneState->startingTotalPower = -1;
1414
1415 sSavedHurricaneIntensity = 0;
1416 D_8023D278 = (1.0 - sin_rad(hurricaneState->intensity * PI_S * 0.5f / 750.0f)) * 8.0 + 13.0;
1418
1419 sUnusedAngle = 0;
1421 sBreathSizeIncrease = 0;
1422
1423 sMaxPower = 2000;
1424 script->functionTemp[1] = rand_int(10) + 11;
1425 script->functionTemp[2] = 0;
1426 script->functionTemp[0] = 1;
1427 break;
1428 case 1:
1429 partner->state.angle = sUnusedAngle * 150 / 100 - 75; // angle is not used
1430
1431 for (i = 0; i < partner->targetListLength; i++) {
1432 targetIndex = partner->targetIndexList[i];
1433 temp = EnemyHurricaneChances[targetIndex];
1434 if (temp != -1) {
1435 if (temp != 0) {
1436 target = &partner->targetData[targetIndex];
1437 targetActor = get_actor(target->actorID);
1438 targetActor->yaw = clamp_angle(targetActor->yaw + 13.0f + sHurricaneIntensity * 4);
1439 }
1440 }
1441 }
1442
1443 if (partnerState->moveTime != 0) {
1444 partnerState->moveTime--;
1445 break;
1446 }
1447
1448 for (i = 0; i < partner->targetListLength; i++) {
1449 targetIndex = partner->targetIndexList[i];
1450 temp = EnemyHurricaneChances[targetIndex];
1451 if (temp != -1) {
1452 if (temp != 0) {
1453 target = &partner->targetData[targetIndex];
1454 targetActor = get_actor(target->actorID);
1455 targetActor->yaw = 0.0f;
1456 }
1457 }
1458 }
1459
1460 IsHurricaneActive = false;
1462 return ApiStatus_DONE2;
1463 }
1464
1465 sHuffPuffBreathEffect->data.huffPuffBreath->scale = sBreathSizeIncrease / 50.0 + 1.0;
1466 x = partner->curPos.x;
1467 y = partner->curPos.y;
1468 rand_int(1000);
1469 tempF1 = 5.0f;
1470 switch (sHuffPuffBreathState) {
1471 case STATE_INHALE:
1472 x = partner->curPos.x;
1473 y = partner->curPos.y + 15.0f;
1474 z = partner->curPos.z + tempF1;
1475 add_vec2D_polar(&x, &y, 12.0f, 90.0f);
1476 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = x;
1477 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = y;
1478 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = z;
1479 sHuffPuffBreathEffect->data.huffPuffBreath->speedX = -2.0f;
1480
1481 // looks like this was breath inhale phase, but then the devs removed it
1482 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = NPC_DISPOSE_POS_X;
1483 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = NPC_DISPOSE_POS_Y;
1484 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = NPC_DISPOSE_POS_Z;
1485
1486 if (script->functionTemp[2] != 0) {
1488 }
1489 script->functionTemp[2] = 0;
1490
1491 partnerState->moveArcAmplitude = 0;
1493 break;
1494 case STATE_DISABLED:
1495 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = NPC_DISPOSE_POS_X;
1496 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = NPC_DISPOSE_POS_Y;
1497 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = NPC_DISPOSE_POS_Z;
1498 break;
1499 case STATE_EXHALE:
1500 x = partner->curPos.x;
1501 y = partner->curPos.y + 15.0f;
1502 z = partner->curPos.z + tempF1;
1503 add_vec2D_polar(&x, &y, 12.0f, 90.0f);
1504 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = x;
1505 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = y;
1506 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = z;
1507 sHuffPuffBreathEffect->data.huffPuffBreath->speedX = 2.0f;
1508
1509 if (script->functionTemp[2] == 0) {
1511 }
1512 script->functionTemp[2] = 1;
1513
1514 if (partnerState->moveArcAmplitude == 0) {
1515 script->functionTemp[1] = 1;
1516 }
1517 partnerState->moveArcAmplitude = 1;
1518
1520 break;
1521 }
1522
1523 if (gGameStatusPtr->frameCounter % (7 - sHurricaneIntensity / 2) == 0) {
1524 x = -220.0f;
1525 y = 176 - rand_int(100);
1526 z = 50.0f;
1527 x2 = 220.0f;
1528 y2 = y - (rand_int(100) + 100);
1529 z2 = 50.0f;
1530 tempF1 = rand_int(1000);
1531 tempF1 = tempF1 / 3000.0f + 0.5;
1532 tempF2 = rand_int(1000);
1533 tempF2 = tempF2 / 300.0f + 5.75 + sHurricaneIntensity;
1534 fx_moving_cloud(1, x, y, z, x2, y2, z2, tempF2, tempF1);
1535 }
1536
1537 if (gGameStatusPtr->frameCounter % (7 - sHurricaneIntensity / 2) == 0) {
1538 x = -220.0f;
1539 y = 176 - rand_int(100);
1540 z = -50.0f;
1541 x2 = 220.0f;
1542 y2 = y - (rand_int(100) + 100);
1543 z2 = -50.0f;
1544 tempF1 = rand_int(1000);
1545 tempF1 = tempF1 / 4000.0f + 0.1;
1546 tempF2 = rand_int(1000);
1547 tempF2 = tempF2 / 300.0f + 2.75 + sHurricaneIntensity / 2;
1548 fx_moving_cloud(1, x, y, z, x2, y2, z2, tempF2, tempF1);
1549 }
1550
1551RESTART:
1552 switch (hurricaneState->state) {
1553 case 0:
1555 if (hurricaneState->startingTotalPower < 0) {
1556 hurricaneState->startingTotalPower = hurricaneState->totalPower;
1557 }
1558
1559 totalPower = hurricaneState->totalPower;
1560 if (totalPower > 5000.0f) {
1561 totalPower = 5000.0f;
1562 }
1563
1565 tempF1 = tempF64 + tempF64 * (1.0 - sin_rad(totalPower * PI_S * 0.5f / 5000.0f + PI_S / 2)) * 1.5;
1566 hurricaneState->intensity += tempF1;
1567 sSavedHurricaneIntensity += D_8023D278;
1568
1569 if (hurricaneState->totalPower > 9000) {
1570 hurricaneState->intensity -= hurricaneState->intensity / 2;
1571 }
1572
1573 if (hurricaneState->intensity < 0) {
1574 hurricaneState->intensity = 0;
1575 }
1576
1577 hurricaneState->intensity += tempF1;
1578 if (hurricaneState->intensity > 750) {
1579 hurricaneState->intensity = 750;
1580 }
1581
1582 if (sSavedHurricaneIntensity > 1000) {
1583 sSavedHurricaneIntensity = 1000;
1584 }
1585
1586 hurricaneState->totalPower += hurricaneState->intensity;
1587
1588 if (hurricaneState->totalPower > sMaxPower + 5000) {
1589 hurricaneState->totalPower = sMaxPower + 5000;
1590 hurricaneState->state = 1;
1591 hurricaneState->unk_5D = 5;
1592 hurricaneState->intensity = sSavedHurricaneIntensity;
1593 }
1594 break;
1595 case 1:
1597 hurricaneState->state = 10;
1598 break;
1599 }
1600
1601 switch (hurricaneState->state) {
1602 case 10:
1604 tempF1 = hurricaneState->intensity + hurricaneState->intensity / 3;
1605 if (tempF1 < 200.0f) {
1606 tempF1 = 200.0f;
1607 }
1608 hurricaneState->totalPower -= tempF1;
1609 if (hurricaneState->totalPower < 5000 - sMaxPower) {
1610 hurricaneState->totalPower = 5000 - sMaxPower;
1611 hurricaneState->state = 11;
1612 hurricaneState->unk_5D = 5;
1613 hurricaneState->startingTotalPower = -1;
1614 sMaxPower += 1000;
1615 if (sMaxPower > 5000) {
1616 sMaxPower = 5000;
1617 }
1618 }
1619 break;
1620 case 11:
1622 hurricaneState->state = 0;
1623 hurricaneState->intensity -= hurricaneState->intensity / 2.8;
1624 sSavedHurricaneIntensity = hurricaneState->intensity;
1625 D_8023D278 = (1.0 - sin_rad(hurricaneState->intensity * PI_S * 0.5f / 750.0f)) * 8.0 + 13.0;
1626 goto RESTART;
1627 }
1628
1629 if (hurricaneState->state == 0) {
1630 hurricaneState->breathSizeIncrease += hurricaneState->intensity / 4;
1631 }
1632
1633 if (hurricaneState->breathSizeIncrease > 10000) {
1634 hurricaneState->breathSizeIncrease = 10000;
1635 }
1636
1637 sUnusedAngle = hurricaneState->totalPower / 100;
1638 sHurricaneIntensity = hurricaneState->intensity / 100;
1639 if (sHurricaneIntensity > 10) {
1641 }
1642 sBreathSizeIncrease = hurricaneState->breathSizeIncrease / 100;
1643
1644 return ApiStatus_BLOCK;
1645}
1646
1647API_CALLABLE(N(BlowTargetAway)) {
1649 Actor* target;
1650 ActorState* state;
1651 f64 temp_f20;
1652
1653 if (isInitialCall) {
1654 script->functionTempPtr[1] = get_actor(script->varTable[10]);
1655 script->functionTemp[0] = 0;
1656 }
1657
1658 target = script->functionTempPtr[1];
1659 state = &target->state;
1660 switch (script->functionTemp[0]) {
1661 case 0:
1662 target->state.moveTime = 0;
1663 target->state.curPos.x = target->curPos.x;
1664 target->state.curPos.y = target->curPos.y;
1665 target->state.curPos.z = target->curPos.z;
1666 target->state.speed = 5.5f;
1667 NumEnemiesBeingBlown++;
1668 battleStatus->curAttackElement = 0;
1670 script->functionTemp[0] = 1;
1671 break;
1672 case 1:
1673 target->state.curPos.x += target->state.speed;
1674 temp_f20 = target->state.curPos.y;
1675 target->state.curPos.y =
1676 temp_f20 + ((sin_rad(2.0f * sin_rad(DEG_TO_RAD(target->state.moveTime)) * PI_S) * 1.4) + 0.5);
1677 target->state.moveTime += 6;
1678 target->state.moveTime = clamp_angle(target->state.moveTime);
1679 target->yaw += 33.0f;
1680 target->yaw = clamp_angle(target->yaw);
1681 if (target->state.curPos.x > 240.0f) {
1682 NumEnemiesBeingBlown--;
1683 return ApiStatus_DONE2;
1684 }
1685 break;
1686 }
1687 target->curPos.x = state->curPos.x;
1688 target->curPos.y = state->curPos.y;
1689 target->curPos.z = state->curPos.z;
1690 return ApiStatus_BLOCK;
1691}
1692
1693API_CALLABLE(N(AllEnemiesBlownAway)) {
1694 if (NumEnemiesBeingBlown == 0) {
1695 return ApiStatus_DONE2;
1696 }
1697 return ApiStatus_BLOCK;
1698}
1699
1700API_CALLABLE(N(IsHurricaneActive)) {
1701 script->varTable[0] = IsHurricaneActive;
1702 return ApiStatus_DONE2;
1703}
1704
1708 Call(SetupMashMeter, 1, 100, 0, 0, 0, 0)
1712 Call(SetBattleCamTarget, -45, 54, 0)
1719 Call(AddGoalPos, ACTOR_PARTNER, 40, 20, 0)
1722 Wait(15)
1728 Call(SetBattleCamTarget, 35, 54, 0)
1731 Call(MoveBattleCamOver, 150 * DT)
1734 Thread
1736 EndThread
1737 Wait(2)
1738 Loop(150 * DT)
1739 Call(N(IsHurricaneActive))
1740 IfEq(LVar0, 0)
1741 BreakLoop
1742 EndIf
1744 IfEq(LVar0, 100)
1745 BreakLoop
1746 EndIf
1747 Wait(1)
1748 EndLoop
1749 Wait(15)
1751 Switch(LVar0)
1752 CaseGt(99)
1756 EndSwitch
1758 Label(10)
1761 IfGt(LVar0, 0)
1762 Set(LVarA, LVar0)
1763 Thread
1767 EndThread
1768 Else
1769 IfEq(LVar0, 0)
1771 EndIf
1772 EndIf
1773 Label(11)
1776 Goto(10)
1777 EndIf
1778 Wait(34)
1785 Return
1786 End
1787};
BSS s32 PopupMenu_SelectedIndex
@ AC_DIFFICULTY_3
Definition action_cmd.h:45
HudScript HES_StickNeutral
@ STATE_EXHALE
@ STATE_DISABLED
@ STATE_INHALE
HudScript HES_AimBlinkA
char unk_74[0x10]
Definition lakilester.c:84
#define HURRICANE_UNUSED_TIME
char unk_00[0x44]
Definition lakilester.c:72
char unk_5E[0x12]
Definition lakilester.c:81
HudScript HES_StickTapRight
#define HURRICANE_PARTNER_MOVE_TIME
s16 breathSizeIncrease
Definition lakilester.c:73
char unk_48[0xC]
Definition lakilester.c:75
s16 startingTotalPower
Definition lakilester.c:78
HudScript HES_AimTarget
char unk_56[0x4]
Definition lakilester.c:77
HudScript HES_AimReticle
s8 transparentStatus
struct ActorBlueprint * actorBlueprint
s32 HudElemID
s32 b32
Vec2bu size
Vec3f curPos
s8 targetIndexList[24]
Bytecode EvtScript[]
#define sfx_play_sound_at_position
#define remove_effect
#define rand_int
#define clamp_angle
s16 turnsLeft
Definition effects.h:2326
EffectInstanceDataPtr data
Definition effects.h:2605
struct PartnerBuffFXData * partnerBuff
Definition effects.h:2591
BuffData unk_0C[3]
Definition effects.h:2336
@ FX_BUFF_DATA_CLOUD_NINE
Definition effects.h:2319
struct HuffPuffBreathFXData * huffPuffBreath
Definition effects.h:2574
#define STATUS_FLAGS_IMMOBILIZED
Definition enums.h:2868
@ BTL_CAM_XADJ_NONE
Definition enums.h:4484
@ ACTION_COMMAND_HURRICANE
Definition enums.h:3526
@ ACTION_COMMAND_THREE_CHANCES
Definition enums.h:3528
@ ACTION_COMMAND_SPINY_SURGE
Definition enums.h:3525
@ BUTTON_A
Definition enums.h:2776
@ BS_FLAGS1_STAR_POINTS_DROPPED
Definition enums.h:3626
@ BS_FLAGS1_FORCE_IMMUNE_HIT
Definition enums.h:3613
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3609
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_SHOW_PLAYER_DECORATIONS
Definition enums.h:3601
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ BS_FLAGS1_4000
Definition enums.h:3616
@ BTL_MSG_CLOUD_NINE_BEGIN
Definition enums.h:3740
@ ELEMENT_END
Definition enums.h:2147
@ ELEMENT_NORMAL
Definition enums.h:2148
@ ITER_NO_MORE
Definition enums.h:2063
@ ITER_NEXT
Definition enums.h:2058
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3408
@ PHASE_RUN_AWAY_START
Definition enums.h:2093
@ PHASE_EXECUTE_ACTION
Definition enums.h:2091
@ PHASE_CELEBRATE
Definition enums.h:2095
@ PHASE_RUN_AWAY_FAIL
Definition enums.h:2097
@ BTL_MENU_TYPE_STAR_POWERS
Definition enums.h:3834
@ STATUS_KEY_PARALYZE
Definition enums.h:2806
@ STATUS_TURN_MOD_DEFAULT
Definition enums.h:2832
@ STATUS_TURN_MOD_PARALYZE
Definition enums.h:2839
@ STATUS_KEY_FROZEN
Definition enums.h:2808
@ STATUS_TURN_MOD_SLEEP
Definition enums.h:2833
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2837
@ STATUS_TURN_MOD_UNUSED
Definition enums.h:2836
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2815
@ STATUS_KEY_STATIC
Definition enums.h:2812
@ STATUS_END
Definition enums.h:2801
@ STATUS_KEY_KO
Definition enums.h:2814
@ STATUS_TURN_MOD_POISON
Definition enums.h:2838
@ STATUS_TURN_MOD_STOP
Definition enums.h:2842
@ STATUS_KEY_SLEEP
Definition enums.h:2807
@ STATUS_KEY_UNUSED
Definition enums.h:2804
@ STATUS_KEY_STOP
Definition enums.h:2809
@ STATUS_KEY_INACTIVE
Definition enums.h:2819
@ STATUS_TURN_MOD_FROZEN
Definition enums.h:2835
@ STATUS_KEY_SHRINK
Definition enums.h:2811
@ STATUS_KEY_DIZZY
Definition enums.h:2805
@ STATUS_KEY_POISON
Definition enums.h:2810
@ STATUS_TURN_MOD_STATIC
Definition enums.h:2834
@ STATUS_KEY_NORMAL
Definition enums.h:2802
@ STATUS_TURN_MOD_SHRINK
Definition enums.h:2840
@ STATUS_KEY_DEFAULT
Definition enums.h:2803
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1978
@ HIT_RESULT_HIT
Definition enums.h:1976
@ HIT_RESULT_NICE_NO_DAMAGE
Definition enums.h:1979
@ HIT_RESULT_NICE
Definition enums.h:1977
@ HIT_RESULT_MISS
Definition enums.h:1982
@ BTL_CAM_MIDPOINT_CLOSE
Definition enums.h:4417
@ BTL_CAM_RETURN_HOME
Definition enums.h:4411
@ BTL_CAM_DEFAULT
Definition enums.h:4409
@ BTL_CAM_REPOSITION
Definition enums.h:4426
@ BTL_CAM_PARTNER_MISTAKE
Definition enums.h:4458
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2936
@ SUPPRESS_EVENT_BURN_CONTACT
Definition enums.h:2938
@ EASING_COS_IN_OUT
Definition enums.h:520
@ PARTNER_RANK_NORMAL
Definition enums.h:2051
@ PARTNER_RANK_SUPER
Definition enums.h:2052
@ PARTNER_RANK_ULTRA
Definition enums.h:2053
@ DMG_SRC_HURRICANE
Definition enums.h:2034
@ SOUND_LAKILESTER_HURRICANE_WIND
Definition enums.h:1002
@ SOUND_NO_DAMGE
Definition enums.h:1436
@ SOUND_LAKILESTER_HURRICANE_EXHALE
Definition enums.h:1343
@ SOUND_AIM_SPINY_FLIP
Definition enums.h:1108
@ SOUND_LAKILESTER_HURRICANE_INHALE
Definition enums.h:1342
@ SOUND_LAKILESTER_MAKE_CLOUD_NINE
Definition enums.h:1341
@ SOUND_LAKILESTER_THROW_SPINY_B
Definition enums.h:1340
@ SOUND_LAKILESTER_THROW_SPINY_A
Definition enums.h:1339
@ ACTOR_PLAYER
Definition enums.h:2118
@ ACTOR_PARTNER
Definition enums.h:2119
@ ACTOR_SELF
Definition enums.h:2117
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3363
@ ACTOR_FLAG_NO_INACTIVE_ANIM
Definition enums.h:3379
@ ACTOR_FLAG_SHOW_STATUS_ICONS
Definition enums.h:3377
@ BTL_CAM_YADJ_NONE
Definition enums.h:4491
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740
@ EVENT_HIT
Definition enums.h:2165
@ EVENT_33
Definition enums.h:2202
@ EVENT_BURN_HIT
Definition enums.h:2169
@ EVENT_SPIKE_CONTACT
Definition enums.h:2196
@ EVENT_IMMUNE
Definition enums.h:2179
@ EVENT_ZERO_DAMAGE
Definition enums.h:2177
@ EVENT_BLOCK
Definition enums.h:2180
@ EVENT_18
Definition enums.h:2178
@ EVENT_HIT_COMBO
Definition enums.h:2164
@ EVENT_RECOVER_FROM_KO
Definition enums.h:2203
@ EVENT_SHOCK_HIT
Definition enums.h:2198
@ EVENT_BURN_CONTACT
Definition enums.h:2197
@ EVENT_BLOW_AWAY
Definition enums.h:2176
@ ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION
Definition enums.h:3395
@ ACTOR_PART_FLAG_INVISIBLE
Definition enums.h:3384
@ DAMAGE_TYPE_SPINY_SURGE
Definition enums.h:2901
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2912
@ DAMAGE_TYPE_MULTIPLE_POPUPS
Definition enums.h:2913
#define ApiStatus_DONE2
Definition evt.h:119
#define ApiStatus_BLOCK
Definition evt.h:117
void btl_set_popup_duration(s32 duration)
void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32 *screenX, s32 *screenY, s32 *screenZ)
Definition cam_main.c:409
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:102
f32 cos_rad(f32 x)
Definition 43F0.c:717
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
void set_actor_anim(s32 actorID, s32 partID, AnimID animID)
Definition 190B20.c:737
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
void set_goal_pos_to_part(ActorState *state, s32 actorID, s32 partID)
Definition actor_api.c:44
f32 sin_rad(f32 x)
Definition 43F0.c:713
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Definition 43F0.c:685
void hud_element_create_transform_A(s32 id)
void hud_element_set_scale(s32 index, f32 scale)
void hud_element_set_script(s32 id, HudScript *anim)
void hud_element_set_render_depth(s32 id, s32 z)
void hud_element_set_transform_rotation(s32 id, f32 x, f32 y, f32 z)
HudElemID hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
void hud_element_set_render_pos(s32 id, s32 x, s32 y)
void hud_element_free(s32 id)
s32 HudScript[]
Definition hud_element.h:9
EvtScript EVS_Partner_Recover
EvtScript EVS_Partner_BurnContact
EvtScript EVS_Partner_Drop
EvtScript EVS_Partner_NoDamageHit
EvtScript EVS_Partner_ShockHit
EvtScript EVS_Partner_BurnHit
EvtScript EVS_Partner_Celebrate
EvtScript EVS_RunAwayFail
EvtScript EVS_Partner_SpikeContact
EvtScript EVS_Partner_LakilesterHit
EvtScript EVS_Partner_RunAway
void sfx_stop_sound(s32 soundID)
ApiStatus RandInt(Evt *script, b32 isInitialCall)
#define NPC_DISPOSE_POS_Z
Definition macros.h:172
#define MAX_ENEMY_ACTORS
Definition macros.h:82
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:296
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:312
#define LVar6
Definition macros.h:155
#define Ref(sym)
Address/pointer constant.
Definition macros.h:61
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
Definition macros.h:366
#define CaseEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR. It also marks the end of any pre...
Definition macros.h:320
#define EndChildThread
Marks the end of a child thread block.
Definition macros.h:564
#define Sub(VAR, INT_VALUE)
Definition macros.h:378
#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 EndLoop
Marks the end of a loop.
Definition macros.h:249
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
Definition macros.h:353
#define NPC_DISPOSE_POS_X
Definition macros.h:170
#define Goto(LABEL_ID)
Moves execution to the given label.
Definition macros.h:233
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define NPC_DISPOSE_POS_Y
Definition macros.h:171
#define IfGt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR <= RVAR.
Definition macros.h:279
#define Float(DOUBLE)
Definition macros.h:52
#define Label(LABEL_ID)
Marks this point in the script as a Goto target.
Definition macros.h:228
#define CaseOrEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR.
Definition macros.h:342
#define EndIf
Marks the end of an if statement or an else block.
Definition macros.h:299
#define LVar5
Definition macros.h:154
#define CaseDefault
Marks the start of a switch case that executes unconditionally. It also marks the end of any previous...
Definition macros.h:338
#define LVarB
Definition macros.h:160
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:476
#define LVar7
Definition macros.h:156
#define BreakLoop
Breaks out of the innermost loop.
Definition macros.h:252
#define Thread
Marks the start of a thread block.
Definition macros.h:545
#define EndThread
Marks the end of a thread block.
Definition macros.h:548
#define IfFlag(LVAR, RVAR)
Marks the beginning of an if statement that only executes if the RVAR flag is set on LVAR,...
Definition macros.h:289
#define LVar8
Definition macros.h:157
#define LVar2
Definition macros.h:151
#define DEG_TO_RAD(deg)
Definition macros.h:145
#define DT
Definition macros.h:534
#define BreakSwitch
Marks the end of a switch case.
Definition macros.h:360
#define LVar1
Definition macros.h:150
#define PI_S
Definition macros.h:140
#define LVarA
Definition macros.h:159
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:255
#define LFlag2
Definition macros.h:170
#define LVar9
Definition macros.h:158
#define NPC_DISPOSE_LOCATION
Definition macros.h:169
#define PlayEffect(args...)
Definition macros.h:811
#define EndSwitch
Marks the end of a switch statement and any case.
Definition macros.h:363
#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 ChildThread
Marks the start of a child thread block.
Definition macros.h:561
#define CaseGt(RVAR)
Marks the start of a switch case that executes only if LVAR <= RVAR. It also marks the end of any pre...
Definition macros.h:329
#define LFlag3
Definition macros.h:171
#define Loop(TIMES)
Marks the beginning of a loop.
Definition macros.h:246
#define LVar4
Definition macros.h:153
#define LVar3
Definition macros.h:152
#define LVarE
Definition macros.h:163
#define LVar0
Definition macros.h:149
#define SetConst(VAR, CONST)
Sets the given variable to a given value, skipping the evt_get_variable call.
Definition macros.h:371
#define Return
Kills the current EVT thread.
Definition macros.h:218
@ SPINY_SURGE_RESET
Definition spiny_surge.h:17
@ SPINY_SURGE_THROW
Definition spiny_surge.h:20
@ SPINY_SURGE_HOLD
Definition spiny_surge.h:19
@ SPINY_SURGE_IGNORE
Definition spiny_surge.h:21
u8 hurricaneChance
Definition battle.h:142
#define POPUP_MSG_OFF
Definition battle.h:280
#define POPUP_MSG_ON
Definition battle.h:279
struct EffectInstance * cloudNineEffect
struct Actor * partnerActor
struct EffectInstance * buffEffect
@ ACV_THREE_CHANCES_CLOUD_NINE
GameStatus * gGameStatusPtr
Definition main_loop.c:31
BattleStatus gBattleStatus
Definition battle.cpp:14
s32 gCurrentCameraID
Definition cam_math.c:5