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 D_8023D2CC;
54static s32 EnemyHurricaneChances[MAX_ENEMY_ACTORS];
55static s32 NumEnemiesBeingBlown;
56static s32 IsHurricaneActive;
57static s32 D_8023D338;
58
59enum N(ActorPartIDs) {
60 PRT_MAIN = 1,
61 PRT_2 = 2,
62};
63
64enum N(ActorVars) {
65 AVAR_Unk_0 = 0,
66};
67
68enum N(ActorParams) {
69 DMG_UNK = 0,
70};
71
72typedef struct HurricaneState {
73 /* 0x00 */ char unk_00[0x44];
75 /* 0x46 */ s16 unk_46;
76 /* 0x48 */ char unk_48[0xC];
77 /* 0x54 */ s16 unk_54;
78 /* 0x56 */ char unk_56[0x4];
80 /* 0x5C */ s8 state;
81 /* 0x5D */ s8 unk_5D;
82 /* 0x5E */ char unk_5E[0x12];
83 /* 0x70 */ s16 intensity;
84 /* 0x72 */ s16 totalPower;
85 /* 0x74 */ char unk_74[0x10];
87
88s32 N(DefaultAnims)[] = {
93};
94
95s32 N(IdleAnimations_spiny)[] = {
98};
99
100s32 N(DefenseTable)[] = {
103};
104
105s32 N(StatusTable)[] = {
108 STATUS_KEY_SLEEP, 100,
111 STATUS_KEY_DIZZY, 100,
112 STATUS_KEY_FEAR, 100,
116 STATUS_KEY_STOP, 100,
128};
129
130ActorPartBlueprint N(ActorParts)[] = {
131 {
132 .flags = 0,
133 .index = PRT_MAIN,
134 .posOffset = { 0, 0, 0 },
135 .targetOffset = { 12, 30 },
136 .opacity = 255,
137 .idleAnimations = N(DefaultAnims),
138 .defenseTable = N(DefenseTable),
139 .eventFlags = 0,
140 .elementImmunityFlags = 0,
141 .projectileTargetOffset = { 0, 0 },
142 },
143 {
145 .index = PRT_2,
146 .posOffset = { 0, 0, 0 },
147 .targetOffset = { 0, 0 },
148 .opacity = 255,
149 .idleAnimations = N(IdleAnimations_spiny),
150 .defenseTable = N(DefenseTable),
151 .eventFlags = 0,
152 .elementImmunityFlags = 0,
153 .projectileTargetOffset = { 0, 0 },
154 },
155};
156
157ActorBlueprint NAMESPACE = {
158 .flags = ACTOR_FLAG_FLYING,
159 .type = ACTOR_TYPE_LAKILESTER,
160 .level = ACTOR_LEVEL_LAKILESTER,
161 .maxHP = 99,
162 .partCount = ARRAY_COUNT(N(ActorParts)),
163 .partsData = N(ActorParts),
164 .initScript = &N(EVS_Init),
165 .statusTable = N(StatusTable),
166 .escapeChance = 0,
167 .airLiftChance = 0,
168 .hurricaneChance = 0,
169 .spookChance = 0,
170 .upAndAwayChance = 0,
171 .spinSmashReq = 4,
172 .powerBounceChance = 80,
173 .coinReward = 0,
174 .size = { 44, 40 },
175 .healthBarOffset = { 0, 0 },
176 .statusIconOffset = { -10, 30 },
177 .statusTextOffset = { 13, 31 },
178};
179
180EvtScript N(EVS_Init) = {
181 Call(BindTakeTurn, ACTOR_SELF, Ref(N(EVS_TakeTurn)))
182 Call(BindIdle, ACTOR_SELF, Ref(N(EVS_Idle)))
183 Call(BindHandleEvent, ACTOR_SELF, Ref(N(EVS_HandleEvent)))
185 Return
186 End
187};
188
189EvtScript N(EVS_Idle) = {
190 Return
191 End
192};
193
194EvtScript N(EVS_HandleEvent) = {
210 SetConst(LVar0, PRT_MAIN)
216 SetConst(LVar2, 20)
222 Set(LVar2, 20)
235 Set(LVar2, 20)
241 SetConst(LVar0, PRT_MAIN)
244 Set(LVar3, 10)
249 SetConst(LVar0, PRT_MAIN)
252 Wait(10)
257 Return
258 End
259};
260
261EvtScript N(EVS_TakeTurn) = {
273 Return
274 End
275};
276
278 SetConst(LVar0, PRT_MAIN)
283 Return
284 End
285};
286
288 SetConst(LVar0, PRT_MAIN)
291 Return
292 End
293};
294
304 Return
305 End
306};
307
309 Return
310 End
311};
312
320 Return
341 Return
342 End
343};
344
352 Return
353 End
354};
355
363 Return
364 End
365};
366
369};
370
371API_CALLABLE(N(SpinyFlipUpdatePopup)) {
372 if (isInitialCall) {
373 SpinyFlipTargetingDone = FALSE;
374 }
375
376 if (!SpinyFlipTargetingDone) {
378 return ApiStatus_BLOCK;
379 } else {
380 return ApiStatus_DONE2;
381 }
382}
383
384API_CALLABLE(N(SpinyFlipActionCommand)) {
386 s32 screenX, screenY, screenZ;
387 Actor* partner = battleStatus->partnerActor;
388 Actor* target;
392 f32 speed;
393 f32 stickAngle;
394 s32 stickMagnitude;
396 s32 i;
397
399 f32 theta;
402 f32 temp_f2;
404 f32 temp_f8;
405 s32 (**var_s3)[0];
406 s32 (*temp_a0)[0];
407 s32 temp_a0_2;
408 s32 temp_f10;
410 s32 temp_v1_2;
411 s32* var_s0;
412
413 enum SpinyFlipState {
414 SPINY_FLIP_INIT = 0,
415 SPINY_FLIP_DELAY = 1, // give player time to start aiming
416 SPINY_FLIP_AIMING = 2, // player is aiming
417 };
418
419 partnerState = &partner->state;
420 playerState = &battleStatus->playerActor->state;
421
422 if (isInitialCall) {
423 script->functionTemp[0] = SPINY_FLIP_INIT;
424 }
425
426 switch (script->functionTemp[0]) {
427 case SPINY_FLIP_INIT:
428 HID_AimReticle = hud_element_create(&HES_AimReticle);
429 hud_element_set_render_depth(HID_AimReticle, 10);
430 HID_AimTarget = hud_element_create(&HES_AimTarget);
431 hud_element_set_render_depth(HID_AimTarget, 10);
432 hud_element_create_transform_A(HID_AimTarget);
433 HudStickPosX = -48;
434 HudStickPosY = 70;
435 HID_AnalogStick = hid = hud_element_create(&HES_StickNeutral);
436 hud_element_set_render_pos(hid, HudStickPosX, HudStickPosY);
438 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
439 hudAim[i] = hidAim = hud_element_create(N(AimDotHudScripts)[i]);
441 }
442 partnerState->curPos.x = partner->curPos.x + 33.0f;
443 partnerState->curPos.y = partner->curPos.y + 34.0f;
444 partnerState->curPos.z = partner->curPos.z + 15.0f;
445 partnerState->unk_18.x = partner->curPos.x + 33.0f;
446 partnerState->unk_18.y = partner->curPos.y + 34.0f;
447 partnerState->unk_18.z = partner->curPos.z + 15.0f;
448 set_goal_pos_to_part(partnerState, partner->targetActorID, partner->targetPartID);
449 target = get_actor(partner->targetActorID);
450 part = get_actor_part(target, partner->targetPartID);
451 partnerState->goalPos.x += part->projectileTargetOffset.x;
452 partnerState->goalPos.y += part->projectileTargetOffset.y;
453 partnerState->goalPos.z = partnerState->goalPos.z; // required to match
454 partnerState->dist = dist2D(partnerState->curPos.x,
455 partnerState->curPos.y,
456 partnerState->goalPos.x,
457 partnerState->goalPos.y);
458 partnerState->speed = 0.0f;
459 partnerState->velStep.x = 0.0f;
460 partnerState->velStep.y = 0.0f;
461 TargetMarkRotation = 0;
462 D_8023D294 = 0;
463 AimingTime = 30;
464 D_8023D2A0 = 0.0f;
465 D_8023D2A4 = 0.0f;
466 D_8023D2A8 = 0.0f;
467 D_8023D2AC = 0.0f;
468 D_8023D29C = 0;
469 D_8023D2B0 = 3.0f;
470 AimMoveAngle = -1.0f;
471 partnerState->unk_24 = ((part->size.y + part->size.x) / 2) / 24.0;
472 hud_element_set_scale(HID_AimTarget, partnerState->unk_24 * target->scalingFactor);
473 SpinyFlipTargetingDone = TRUE;
474 script->functionTemp[0] = SPINY_FLIP_DELAY;
475 break;
476 case SPINY_FLIP_DELAY:
477 if (battleStatus->stickX != 0 || battleStatus->stickY != 0) {
478 AimingTime = 0;
479 }
480 if (AimingTime != 0) {
481 AimingTime--;
482 } else {
483 AimingTime = (s32)(80 * DT);
484 hud_element_set_script(HID_AnalogStick, &HES_StickTapRight);
486 script->functionTemp[0] = SPINY_FLIP_AIMING;
487 }
488 break;
490 stickMagnitude = battleStatus->stickMagnitude;
491 if (stickMagnitude > 80) {
492 stickMagnitude = 80;
493 }
494 stickAngle = battleStatus->stickAngle;
495 if (stickMagnitude < 35) {
496 f32 temp = stickMagnitude;
497 stickMagnitude = temp * sin_rad(DEG_TO_RAD(stickMagnitude * 2));
498 }
499 temp_f8 = D_8023D2A0;
500 temp_f2 = temp_f8 + D_8023D2A4 + D_8023D2A8;
501 D_8023D2A0 = stickMagnitude;
502 D_8023D2A8 = D_8023D2A4;
503 temp_f10 = D_8023D2A0 - (temp_f2 / 3.0f);
504 D_8023D2A4 = temp_f8;
505 if (temp_f10 > 0) {
506 D_8023D2AC = temp_f10;
507 if (partner->state.speed != 0.0f) {
508 partner->state.speed += (D_8023D2AC / 8.5) / 3.0;
509 } else {
510 partner->state.speed += (D_8023D2AC / 8.5) / 2.0;
511 }
512 AimMoveAngle = stickAngle;
513 } else {
514 D_8023D2AC = temp_f10;
515 }
516 if (!(stickMagnitude < 31)) {
517 AimMoveAngle = stickAngle;
518 }
519 if (partnerState->speed > 6.7) {
520 partnerState->speed = 6.7;
521 }
522 partnerState->speed -= (f32) ((2.0 * (40 - stickMagnitude)) / 40.0);
523 if (partnerState->speed <= 0.0f) {
524 partnerState->speed = 0.0f;
525 D_8023D2AC = 0.0f;
526 }
527 if (AimMoveAngle >= 0.0f) {
528 theta = DEG_TO_RAD(AimMoveAngle);
531 speed = partnerState->speed;
532 partnerState->curPos.x += speed * sinTheta;
533 partnerState->curPos.y += speed * cosTheta;
534 }
535 if (partnerState->curPos.x < -30.0f) {
536 partnerState->curPos.x = -30.0f;
537 }
538 if (partnerState->curPos.x > 170.0f) {
539 partnerState->curPos.x = 170.0f;
540 }
541 if (partnerState->curPos.y > 130.0f) {
542 partnerState->curPos.y = 130.0f;
543 }
544 if (partnerState->curPos.y < 0.0f) {
545 partnerState->curPos.y = 0.0f;
546 }
547 if (battleStatus->curButtonsPressed & BUTTON_A) {
548 AimingTime = 0;
549 }
550 if (AimingTime == 60) {
552 }
553 if (AimingTime == 30) {
555 }
556 if (AimingTime != 0) {
557 AimingTime--;
558 break;
559 }
560 script->varTable[14] = 0;
561 script->varTable[15] = 0;
562 script->varTable[7] = partnerState->curPos.x;
563 script->varTable[8] = partnerState->curPos.y;
564 script->varTable[9] = partnerState->curPos.z;
565 partnerState->dist = dist2D(partnerState->curPos.x, partnerState->curPos.y, partnerState->goalPos.x, partnerState->goalPos.y) / partnerState->unk_24;
566 if (partnerState->dist <= 12.0) {
567 script->varTable[15] = 1;
568 }
569 hud_element_free(HID_AimTarget);
570 hud_element_free(HID_AimReticle);
571 hud_element_free(HID_AnalogStick);
572 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
573 hid = hudAim[i];
575 }
578 return ApiStatus_DONE2;
579 }
580
582 partnerState->goalPos.x, partnerState->goalPos.y, partnerState->goalPos.z,
583 &screenX, &screenY, &screenZ);
584 hid = HID_AimTarget;
586 hud_element_set_transform_rotation(hid, 0.0f, 0.0f, TargetMarkRotation);
587 TargetMarkRotation -= 10;
588 TargetMarkRotation = clamp_angle(TargetMarkRotation);
590 partnerState->curPos.x, partnerState->curPos.y, partnerState->curPos.z,
591 &screenX, &screenY, &screenZ);
593
594 // show analog stick hud element
595 switch (script->functionTemp[0]) {
596 case SPINY_FLIP_DELAY:
598 HudStickPosX += 20;
599 if (HudStickPosX > 50) {
600 HudStickPosX = 50;
601 }
602 hud_element_set_render_pos(HID_AnalogStick, HudStickPosX, HudStickPosY);
603 break;
604 }
605
606 // show aim dot hud element in center of
607 switch (script->functionTemp[0]) {
608 case SPINY_FLIP_DELAY:
610 playerState->curPos.x = partnerState->curPos.x;
611 playerState->curPos.y = partnerState->curPos.y;
612 playerState->curPos.z = partnerState->curPos.z;
613 for (i = 0; i < ARRAY_COUNT(N(AimDotHudScripts)); i++) {
615 hid = hudAim[i];
617 }
618 break;
619 }
620
622 return ApiStatus_BLOCK;
623}
624
625API_CALLABLE(N(ThrowSpinyFX)) {
627 Actor* partnerActor = battleStatus->partnerActor;
628 f32 xPos = partnerActor->curPos.x + 5;
629 f32 yPos = partnerActor->curPos.y + partnerActor->size.y + 20;
630 f32 zPos = partnerActor->curPos.z;
631 f32 var = rand_int(140) + 10;
632 f32 var2 = rand_int(80) + 10;
633
634 fx_throw_spiny(0, xPos, yPos, zPos, var, var2, 20, 1.5f, 30);
635
636 return ApiStatus_DONE2;
637}
638
639API_CALLABLE(N(GetSpinySurgeDamage)) {
641 s32 actionCommandResult = script->varTable[10];
642 s32 damage = 0;
643
644 switch (partnerLevel) {
646 if (actionCommandResult <= 99) {
647 damage = 1;
648 } else {
649 damage = 2;
650 }
651 break;
653 if (actionCommandResult <= 70) {
654 damage = 1;
655 } else if (actionCommandResult <= 99) {
656 damage = 2;
657 } else {
658 damage = 3;
659 }
660 break;
662 if (actionCommandResult <= 40) {
663 damage = 1;
664 } else if (actionCommandResult <= 70) {
665 damage = 2;
666 } else if (actionCommandResult <= 99) {
667 damage = 3;
668 } else {
669 damage = 4;
670 }
671 break;
672 }
673
674 if (actionCommandResult >= 100) {
675 script->varTable[0] = TRUE;
676 } else {
677 script->varTable[0] = FALSE;
678 }
679
680 script->varTable[15] = damage;
681 return ApiStatus_DONE2;
682}
683
684API_CALLABLE(N(RemoveCloudNineFX)) {
686
687 if (effect != NULL) {
688 remove_effect(effect);
691 return ApiStatus_DONE2;
692 }
693
694 return ApiStatus_DONE2;
695}
696
697API_CALLABLE(N(SpawnCloudNineFX)) {
699 Actor* actor = battleStatus->playerActor;
700
701 static f32 sCounter;
702
703 if (isInitialCall) {
704 script->functionTemp[0] = 0;
705 }
706
707 switch (script->functionTemp[0]) {
708 case 0:
709 sCounter = 0.1f;
710 fx_ending_decals(0, actor->curPos.x, actor->curPos.y, actor->curPos.z, 0.1f, &battleStatus->cloudNineEffect);
711 script->functionTemp[0] = 1;
712 break;
713 case 1:
714 if (sCounter >= 1.0) {
715 return ApiStatus_DONE2;
716 }
717 battleStatus->cloudNineEffect->data.endingDecals->scale += 0.2;
718 sCounter += 0.2;
719 break;
720 }
721 return ApiStatus_BLOCK;
722}
723
724API_CALLABLE(N(ApplyCloudNine)) {
725 if (gBattleStatus.cloudNineTurnsLeft < script->varTable[10]) {
729 }
730
731 return ApiStatus_DONE2;
732}
733
734API_CALLABLE(N(InitHurricane)) {
736 s32 totalChance;
737 s32 affectedTargets;
738 s32 targetIdx;
740 Actor* actor;
743 s32 hurricaneChance;
745 s32 i;
746
747 NumEnemiesBeingBlown = 0;
748 IsHurricaneActive = FALSE;
749
750 for (i = 0; i < partner->targetListLength; i++) {
751 EnemyHurricaneChances[i] = 0;
752 }
753
754 totalChance = 0;
755 affectedTargets = 0;
756
757 for (i = 0; i < partner->targetListLength; i++) {
758 targetIdx = partner->targetIndexList[i];
759 target = &partner->targetData[targetIdx];
760 actor = get_actor(target->actorID);
761 part = get_actor_part(actor, target->partID);
762 hpMissingPercent = 100 - ((actor->curHP * 100) / actor->maxHP);
763 hurricaneChance = actor->actorBlueprint->hurricaneChance;
764 if (hurricaneChance > 0) {
765 hurricaneChance += hurricaneChance * hpMissingPercent / 100;
766 if (hurricaneChance > 100) {
767 hurricaneChance = 100;
768 }
769 if (actor->debuff != 0) {
770 hurricaneChance = hurricaneChance * 150 / 100;
771 if (hurricaneChance > 150) {
772 hurricaneChance = 150;
773 }
774 }
776 hurricaneChance = 0;
777 }
778 if (part->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
779 hurricaneChance = 0;
780 }
782 }
783 EnemyHurricaneChances[targetIdx] = hurricaneChance;
784 totalChance += hurricaneChance;
785 }
786
787 if (affectedTargets != 0) {
789 } else {
791 }
792 script->varTable[0] = avgHurricaneChance;
793
794 for (i = 0; i < partner->targetListLength; i++) {
795 targetIdx = partner->targetIndexList[i];
796 target = &partner->targetData[targetIdx];
797 actor = get_actor(target->actorID);
798 part = get_actor_part(actor, target->partID);
800 EnemyHurricaneChances[targetIdx] = -1;
801 } else if (EnemyHurricaneChances[targetIdx] != 0) {
802 EnemyHurricaneChances[targetIdx] = avgHurricaneChance;
803 }
804 }
805 return ApiStatus_DONE2;
806}
807
808API_CALLABLE(N(CanTargetBeBlown)) {
810 Actor* partner = battleStatus->partnerActor;
811 s32 targetIdx = partner->targetIndexList[partner->selectedTargetIndex];
812 s32* hurricaneChance = &EnemyHurricaneChances[targetIdx];
813 SelectableTarget* target = &partner->targetData[targetIdx];
814
815 script->varTable[0] = *hurricaneChance;
816
817 if (*hurricaneChance == -1) {
818 return ApiStatus_DONE2;
819 }
820
821 if (*hurricaneChance == 0) {
822 return ApiStatus_DONE2;
823 }
824
825 get_actor(target->actorID);
826 if (rand_int(99) < battleStatus->actionQuality) {
827 *hurricaneChance = -1;
828 script->varTable[0] = target->actorID;
829 } else {
830 *hurricaneChance = 0;
831 script->varTable[0] = ACTOR_PLAYER;
832 }
833 return ApiStatus_DONE2;
834}
835
837 Thread
842 Add(LVar0, 40)
843 Add(LVar1, 20)
850 Call(SetBattleCamTarget, 47, 46, 12)
855 Add(LVar0, 3)
856 Add(LVar1, 10)
857 Add(LVar2, 5)
859 Wait(1)
863 Loop(4)
864 Add(LVar1, 6)
866 Wait(1)
867 EndLoop
869 Add(LVar0, 8)
870 Add(LVar1, 40)
871 Add(LVar2, 5)
874 Thread
875 Loop(40 * DT)
878 Wait(1)
881 Wait(1)
883 IfEq(LVar0, 0)
885 EndIf
886 EndLoop
894 Wait(3)
897 Set(LVarF, -1)
898 EndIf
901 CaseEq(-1)
904 Set(LVar0, LVar7)
905 Set(LVar1, LVar8)
906 Set(LVar2, LVar9)
909 CaseEq(0)
912 Set(LVar0, LVar7)
913 Set(LVar1, LVar8)
914 Set(LVar2, LVar9)
923 Thread
924 Add(LVar0, 50)
925 Set(LVar1, 0)
933 Set(LVarE, 3)
935 Set(LVarE, 4)
937 Set(LVarE, 5)
940 CaseGt(0)
946 CaseEq(1)
951 Wait(15)
962 Return
963 End
964};
965
971 CaseEq(0)
972 Call(SetupMashMeter, 2, 99, 100, 0, 0, 0)
973 CaseEq(1)
974 Call(SetupMashMeter, 3, 70, 99, 100, 0, 0)
975 CaseEq(2)
976 Call(SetupMashMeter, 4, 40, 70, 99, 100, 0)
980 Call(SetBattleCamTarget, 45, 60, 0)
987 Call(AddGoalPos, ACTOR_PARTNER, 60, 20, 0)
990 Wait(10)
993 CaseEq(0)
994 Set(LVarA, 60 * DT)
995 CaseEq(1)
996 Set(LVarA, 60 * DT)
997 CaseEq(2)
998 Set(LVarA, 60 * DT)
1000 Set(LVarB, LVarA)
1001 Add(LVarB, -3)
1006 Set(LVar9, 0)
1007 Set(LFlag2, FALSE)
1008 Set(LFlag3, FALSE)
1009 Loop(LVarA)
1011 IfEq(LVar9, 2)
1013 EndIf
1014 Switch(LVar0)
1016 Set(LVar9, 0)
1020 IfEq(LVar9, 1)
1022 EndIf
1025 Add(LVar0, 3)
1026 Add(LVar1, 34)
1027 Add(LVar2, 5)
1030 Set(LVar9, 1)
1032 IfEq(LVar9, 0)
1034 EndIf
1035 IfEq(LFlag2, FALSE)
1037 Set(LFlag2, TRUE)
1038 Else
1040 Set(LFlag2, FALSE)
1041 EndIf
1042 Call(N(ThrowSpinyFX))
1047 Add(LVar0, 1)
1049 Wait(15)
1051 Sub(LVar0, 1)
1054 Set(LFlag3, TRUE)
1055 Set(LVar9, 0)
1056 EndSwitch
1057 Wait(1)
1058 EndLoop
1061 Loop(0)
1063 IfEq(LVar0, 0)
1064 BreakLoop
1065 EndIf
1066 Wait(1)
1067 EndLoop
1068 Wait(10)
1069 IfEq(LFlag3, FALSE)
1070 Set(LVar0, 0)
1071 Set(LVarF, 0)
1072 Wait(15)
1073 Goto(13)
1074 EndIf
1076 Label(0)
1080 Goto(12)
1081 EndIf
1084 Switch(LVar0)
1085 CaseGt(0)
1089 EndSwitch
1090 Switch(LVar0)
1091 CaseGt(0)
1095 EndSwitch
1096 Wait(6)
1097 Label(12)
1100 Goto(0)
1101 EndIf
1102 Wait(30)
1103 Label(13)
1104 Switch(LVar0)
1113 EndSwitch
1114 Return
1115 End
1116};
1117
1133 Wait(10)
1134 Thread
1136 Add(LVar1, 40)
1139 EndThread
1140 Wait(15)
1141 Set(LVar0, 0)
1142 Loop(10)
1143 Add(LVar0, 18)
1145 Wait(1)
1146 EndLoop
1147 Wait(10)
1149 Wait(5)
1151 Wait(15)
1153 Add(LVar0, -12)
1154 Add(LVar1, 13)
1155 Add(LVar2, -5)
1160 Call(PlayerHopToGoal, 18, 0, 0)
1162 Wait(3)
1168 Wait(100)
1169 Wait(3)
1173 IfGt(LVarA, 0)
1179 EndIf
1182 Thread
1184 Loop(10)
1185 Set(LVar0, LVar3)
1186 Set(LVar1, LVar4)
1187 Set(LVar2, LVar5)
1188 Call(RandInt, 40, LVar6)
1189 Sub(LVar6, 20)
1190 Add(LVar0, LVar6)
1191 Call(RandInt, 30, LVar6)
1192 Sub(LVar6, 15)
1193 Add(LVar1, LVar6)
1195 Wait(1)
1196 EndLoop
1197 EndThread
1199 Set(LVar1, 0)
1204 Wait(7)
1206 Thread
1213 EndThread
1214 Thread
1216 Sub(LVar1, 40)
1219 EndThread
1220 Wait(15)
1221 Set(LVar0, 180)
1222 Loop(10)
1223 Sub(LVar0, 18)
1225 Wait(1)
1226 EndLoop
1229 Wait(10)
1230 IfGt(LVarA, 0)
1233 EndIf
1235 Return
1236 End
1237};
1238
1253 Wait(10)
1254 Set(LVar0, 0)
1255 Loop(10)
1256 Add(LVar0, 18)
1258 Wait(1)
1259 EndLoop
1260 Wait(10)
1262 Wait(20)
1264 Add(LVar0, 12)
1265 Add(LVar1, -7)
1266 Add(LVar2, 5)
1269 Thread
1271 Add(LVar1, 40)
1274 EndThread
1276 Add(LVar1, 40)
1283 Wait(100)
1284 Wait(3)
1288 IfGt(LVarA, 0)
1292 EndIf
1295 Thread
1297 Loop(10)
1298 Set(LVar0, LVar3)
1299 Set(LVar1, LVar4)
1300 Set(LVar2, LVar5)
1301 Call(RandInt, 40, LVar6)
1302 Sub(LVar6, 20)
1303 Add(LVar0, LVar6)
1304 Call(RandInt, 30, LVar6)
1305 Sub(LVar6, 15)
1306 Add(LVar1, LVar6)
1308 Wait(1)
1309 EndLoop
1310 EndThread
1312 Set(LVar1, 0)
1316 Thread
1322 EndThread
1323 Thread
1326 EndThread
1327 Set(LVar0, 180)
1328 Loop(10)
1329 Sub(LVar0, 18)
1331 Wait(1)
1332 EndLoop
1336 Wait(10)
1337 IfGt(LVarA, 0)
1340 EndIf
1341 Return
1342 End
1343};
1344
1349 Else
1351 EndIf
1352 Return
1353 End
1354};
1355
1356enum {
1360};
1361
1362#if VERSION_PAL
1363#define HURRICANE_PARTNER_MOVE_TIME 140
1364#define HURRICANE_UNUSED_TIME 152
1365#else
1366#define HURRICANE_PARTNER_MOVE_TIME 165
1367#define HURRICANE_UNUSED_TIME 177
1368#endif
1369
1370API_CALLABLE(N(ProcessHurricane)) {
1372 Actor* partner = battleStatus->partnerActor;
1373 ActorState* partnerState = &partner->state;
1374 EffectInstance* effect;
1377 s32 targetIndex;
1378 s32 temp;
1379 s32 i;
1380 f32 x, y, z;
1381 f32 x2, y2, z2;
1382 f32 tempF1, tempF2;
1383 f32 totalPower;
1384 f64 tempF64;
1385
1388 static s32 sUnusedAngle;
1389 static s32 sHurricaneIntensity;
1390 static s32 sHuffPuffBreathState;
1391 static s32 D_8023D278;
1393
1394 if (isInitialCall) {
1395 script->functionTemp[0] = 0;
1396 }
1397
1398 switch (script->functionTemp[0]) {
1399 case 0:
1400 partner->state.angle = 0.0f;
1401 partner->state.moveTime = HURRICANE_PARTNER_MOVE_TIME;
1402 partner->state.moveArcAmplitude = 0;
1403 IsHurricaneActive = TRUE;
1404 D_8023D338 = 255;
1405 sHuffPuffBreathEffect = effect = fx_huff_puff_breath(0, NPC_DISPOSE_LOCATION, 0.0f, -2.0f, 0.6f, 0);
1406
1407 effect->data.huffPuffBreath->primCol.r = 20;
1408 effect->data.huffPuffBreath->primCol.g = 80;
1409 effect->data.huffPuffBreath->primCol.b = 255;
1410
1411 effect->data.huffPuffBreath->envCol.r = 200;
1412 effect->data.huffPuffBreath->envCol.g = 240;
1413 effect->data.huffPuffBreath->envCol.b = 240;
1414
1416 hurricaneState->breathSizeIncrease = 0;
1417 hurricaneState->unk_46 = 0;
1418 hurricaneState->state = 0;
1419 hurricaneState->totalPower = 5000;
1420 hurricaneState->intensity = 0;
1421 hurricaneState->startingTotalPower = -1;
1422
1423 sSavedHurricaneIntensity = 0;
1424 D_8023D278 = (1.0 - sin_rad(hurricaneState->intensity * PI_S * 0.5f / 750.0f)) * 8.0 + 13.0;
1426
1427 sUnusedAngle = 0;
1429 sBreathSizeIncrease = 0;
1430
1431 sMaxPower = 2000;
1432 script->functionTemp[1] = rand_int(10) + 11;
1433 script->functionTemp[2] = 0;
1434 script->functionTemp[0] = 1;
1435 break;
1436 case 1:
1437 partner->state.angle = sUnusedAngle * 150 / 100 - 75; // angle is not used
1438
1439 for (i = 0; i < partner->targetListLength; i++) {
1440 targetIndex = partner->targetIndexList[i];
1441 temp = EnemyHurricaneChances[targetIndex];
1442 if (temp != -1) {
1443 if (temp != 0) {
1444 target = &partner->targetData[targetIndex];
1445 targetActor = get_actor(target->actorID);
1446 targetActor->yaw = clamp_angle(targetActor->yaw + 13.0f + sHurricaneIntensity * 4);
1447 }
1448 }
1449 }
1450
1451 if (partnerState->moveTime != 0) {
1452 partnerState->moveTime--;
1453 break;
1454 }
1455
1456 for (i = 0; i < partner->targetListLength; i++) {
1457 targetIndex = partner->targetIndexList[i];
1458 temp = EnemyHurricaneChances[targetIndex];
1459 if (temp != -1) {
1460 if (temp != 0) {
1461 target = &partner->targetData[targetIndex];
1462 targetActor = get_actor(target->actorID);
1463 targetActor->yaw = 0.0f;
1464 }
1465 }
1466 }
1467
1468 IsHurricaneActive = FALSE;
1470 return ApiStatus_DONE2;
1471 }
1472
1473 sHuffPuffBreathEffect->data.huffPuffBreath->scale = sBreathSizeIncrease / 50.0 + 1.0;
1474 x = partner->curPos.x;
1475 y = partner->curPos.y;
1476 rand_int(1000);
1477 tempF1 = 5.0f;
1478 switch (sHuffPuffBreathState) {
1479 case STATE_INHALE:
1480 x = partner->curPos.x;
1481 y = partner->curPos.y + 15.0f;
1482 z = partner->curPos.z + tempF1;
1483 add_vec2D_polar(&x, &y, 12.0f, 90.0f);
1484 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = x;
1485 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = y;
1486 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = z;
1487 sHuffPuffBreathEffect->data.huffPuffBreath->speedX = -2.0f;
1488
1489 // looks like this was breath inhale phase, but then the devs removed it
1490 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = NPC_DISPOSE_POS_X;
1491 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = NPC_DISPOSE_POS_Y;
1492 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = NPC_DISPOSE_POS_Z;
1493
1494 if (script->functionTemp[2] != 0) {
1496 }
1497 script->functionTemp[2] = 0;
1498
1499 partnerState->moveArcAmplitude = 0;
1501 break;
1502 case STATE_DISABLED:
1503 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = NPC_DISPOSE_POS_X;
1504 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = NPC_DISPOSE_POS_Y;
1505 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = NPC_DISPOSE_POS_Z;
1506 break;
1507 case STATE_EXHALE:
1508 x = partner->curPos.x;
1509 y = partner->curPos.y + 15.0f;
1510 z = partner->curPos.z + tempF1;
1511 add_vec2D_polar(&x, &y, 12.0f, 90.0f);
1512 sHuffPuffBreathEffect->data.huffPuffBreath->pos.x = x;
1513 sHuffPuffBreathEffect->data.huffPuffBreath->pos.y = y;
1514 sHuffPuffBreathEffect->data.huffPuffBreath->pos.z = z;
1515 sHuffPuffBreathEffect->data.huffPuffBreath->speedX = 2.0f;
1516
1517 if (script->functionTemp[2] == 0) {
1519 }
1520 script->functionTemp[2] = 1;
1521
1522 if (partnerState->moveArcAmplitude == 0) {
1523 script->functionTemp[1] = 1;
1524 }
1525 partnerState->moveArcAmplitude = 1;
1526
1528 break;
1529 }
1530
1531 if (gGameStatusPtr->frameCounter % (7 - sHurricaneIntensity / 2) == 0) {
1532 x = -220.0f;
1533 y = 176 - rand_int(100);
1534 z = 50.0f;
1535 x2 = 220.0f;
1536 y2 = y - (rand_int(100) + 100);
1537 z2 = 50.0f;
1538 tempF1 = rand_int(1000);
1539 tempF1 = tempF1 / 3000.0f + 0.5;
1540 tempF2 = rand_int(1000);
1541 tempF2 = tempF2 / 300.0f + 5.75 + sHurricaneIntensity;
1542 fx_moving_cloud(1, x, y, z, x2, y2, z2, tempF2, tempF1);
1543 }
1544
1545 if (gGameStatusPtr->frameCounter % (7 - sHurricaneIntensity / 2) == 0) {
1546 x = -220.0f;
1547 y = 176 - rand_int(100);
1548 z = -50.0f;
1549 x2 = 220.0f;
1550 y2 = y - (rand_int(100) + 100);
1551 z2 = -50.0f;
1552 tempF1 = rand_int(1000);
1553 tempF1 = tempF1 / 4000.0f + 0.1;
1554 tempF2 = rand_int(1000);
1555 tempF2 = tempF2 / 300.0f + 2.75 + sHurricaneIntensity / 2;
1556 fx_moving_cloud(1, x, y, z, x2, y2, z2, tempF2, tempF1);
1557 }
1558
1559RESTART:
1560 switch (hurricaneState->state) {
1561 case 0:
1563 if (hurricaneState->startingTotalPower < 0) {
1564 hurricaneState->startingTotalPower = hurricaneState->totalPower;
1565 }
1566
1567 totalPower = hurricaneState->totalPower;
1568 if (totalPower > 5000.0f) {
1569 totalPower = 5000.0f;
1570 }
1571
1573 tempF1 = tempF64 + tempF64 * (1.0 - sin_rad(totalPower * PI_S * 0.5f / 5000.0f + PI_S / 2)) * 1.5;
1574 hurricaneState->intensity += tempF1;
1575 sSavedHurricaneIntensity += D_8023D278;
1576
1577 if (hurricaneState->totalPower > 9000) {
1578 hurricaneState->intensity -= hurricaneState->intensity / 2;
1579 }
1580
1581 if (hurricaneState->intensity < 0) {
1582 hurricaneState->intensity = 0;
1583 }
1584
1585 hurricaneState->intensity += tempF1;
1586 if (hurricaneState->intensity > 750) {
1587 hurricaneState->intensity = 750;
1588 }
1589
1590 if (sSavedHurricaneIntensity > 1000) {
1591 sSavedHurricaneIntensity = 1000;
1592 }
1593
1594 hurricaneState->totalPower += hurricaneState->intensity;
1595
1596 if (hurricaneState->totalPower > sMaxPower + 5000) {
1597 hurricaneState->totalPower = sMaxPower + 5000;
1598 hurricaneState->state = 1;
1599 hurricaneState->unk_5D = 5;
1600 hurricaneState->intensity = sSavedHurricaneIntensity;
1601 }
1602 break;
1603 case 1:
1605 hurricaneState->state = 10;
1606 break;
1607 }
1608
1609 switch (hurricaneState->state) {
1610 case 10:
1612 tempF1 = hurricaneState->intensity + hurricaneState->intensity / 3;
1613 if (tempF1 < 200.0f) {
1614 tempF1 = 200.0f;
1615 }
1616 hurricaneState->totalPower -= tempF1;
1617 if (hurricaneState->totalPower < 5000 - sMaxPower) {
1618 hurricaneState->totalPower = 5000 - sMaxPower;
1619 hurricaneState->state = 11;
1620 hurricaneState->unk_5D = 5;
1621 hurricaneState->startingTotalPower = -1;
1622 sMaxPower += 1000;
1623 if (sMaxPower > 5000) {
1624 sMaxPower = 5000;
1625 }
1626 }
1627 break;
1628 case 11:
1630 hurricaneState->state = 0;
1631 hurricaneState->intensity -= hurricaneState->intensity / 2.8;
1632 sSavedHurricaneIntensity = hurricaneState->intensity;
1633 D_8023D278 = (1.0 - sin_rad(hurricaneState->intensity * PI_S * 0.5f / 750.0f)) * 8.0 + 13.0;
1634 goto RESTART;
1635 }
1636
1637 if (hurricaneState->state == 0) {
1638 hurricaneState->breathSizeIncrease += hurricaneState->intensity / 4;
1639 }
1640
1641 if (hurricaneState->breathSizeIncrease > 10000) {
1642 hurricaneState->breathSizeIncrease = 10000;
1643 }
1644
1645 sUnusedAngle = hurricaneState->totalPower / 100;
1646 sHurricaneIntensity = hurricaneState->intensity / 100;
1647 if (sHurricaneIntensity > 10) {
1649 }
1650 sBreathSizeIncrease = hurricaneState->breathSizeIncrease / 100;
1651
1652 return ApiStatus_BLOCK;
1653}
1654
1655API_CALLABLE(N(BlowTargetAway)) {
1657 Actor* target;
1658 ActorState* state;
1659 f64 temp_f20;
1660
1661 if (isInitialCall) {
1662 script->functionTempPtr[1] = get_actor(script->varTable[10]);
1663 script->functionTemp[0] = 0;
1664 }
1665
1666 target = script->functionTempPtr[1];
1667 state = &target->state;
1668 switch (script->functionTemp[0]) {
1669 case 0:
1670 target->state.moveTime = 0;
1671 target->state.curPos.x = target->curPos.x;
1672 target->state.curPos.y = target->curPos.y;
1673 target->state.curPos.z = target->curPos.z;
1674 target->state.speed = 5.5f;
1675 NumEnemiesBeingBlown++;
1676 battleStatus->curAttackElement = 0;
1678 script->functionTemp[0] = 1;
1679 break;
1680 case 1:
1681 target->state.curPos.x += target->state.speed;
1682 temp_f20 = target->state.curPos.y;
1683 target->state.curPos.y =
1684 temp_f20 + ((sin_rad(2.0f * sin_rad(DEG_TO_RAD(target->state.moveTime)) * PI_S) * 1.4) + 0.5);
1685 target->state.moveTime += 6;
1686 target->state.moveTime = clamp_angle(target->state.moveTime);
1687 target->yaw += 33.0f;
1688 target->yaw = clamp_angle(target->yaw);
1689 if (target->state.curPos.x > 240.0f) {
1690 NumEnemiesBeingBlown--;
1691 return ApiStatus_DONE2;
1692 }
1693 break;
1694 }
1695 target->curPos.x = state->curPos.x;
1696 target->curPos.y = state->curPos.y;
1697 target->curPos.z = state->curPos.z;
1698 return ApiStatus_BLOCK;
1699}
1700
1701API_CALLABLE(N(AllEnemiesBlownAway)) {
1702 if (NumEnemiesBeingBlown == 0) {
1703 return ApiStatus_DONE2;
1704 }
1705 return ApiStatus_BLOCK;
1706}
1707
1708API_CALLABLE(N(IsHurricaneActive)) {
1709 script->varTable[0] = IsHurricaneActive;
1710 return ApiStatus_DONE2;
1711}
1712
1716 Call(SetupMashMeter, 1, 100, 0, 0, 0, 0)
1720 Call(SetBattleCamTarget, -45, 54, 0)
1727 Call(AddGoalPos, ACTOR_PARTNER, 40, 20, 0)
1730 Wait(15)
1736 Call(SetBattleCamTarget, 35, 54, 0)
1739 Call(MoveBattleCamOver, 150 * DT)
1742 Thread
1744 EndThread
1745 Wait(2)
1746 Loop(150 * DT)
1747 Call(N(IsHurricaneActive))
1748 IfEq(LVar0, 0)
1749 BreakLoop
1750 EndIf
1752 IfEq(LVar0, 100)
1753 BreakLoop
1754 EndIf
1755 Wait(1)
1756 EndLoop
1757 Wait(15)
1759 Switch(LVar0)
1760 CaseGt(99)
1764 EndSwitch
1766 Label(10)
1769 IfGt(LVar0, 0)
1770 Set(LVarA, LVar0)
1771 Thread
1775 EndThread
1776 Else
1777 IfEq(LVar0, 0)
1779 EndIf
1780 EndIf
1781 Label(11)
1784 Goto(10)
1785 EndIf
1786 Wait(34)
1793 Return
1794 End
1795};
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:85
#define HURRICANE_UNUSED_TIME
char unk_00[0x44]
Definition lakilester.c:73
char unk_5E[0x12]
Definition lakilester.c:82
HudScript HES_StickTapRight
#define HURRICANE_PARTNER_MOVE_TIME
s16 breathSizeIncrease
Definition lakilester.c:74
char unk_48[0xC]
Definition lakilester.c:76
s16 startingTotalPower
Definition lakilester.c:79
HudScript HES_AimTarget
char unk_56[0x4]
Definition lakilester.c:78
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
@ FX_BUFF_DATA_CLOUD_NINE
Definition effects.h:2319
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
struct HuffPuffBreathFXData * huffPuffBreath
Definition effects.h:2574
#define STATUS_FLAGS_IMMOBILIZED
Definition enums.h:2834
@ BTL_CAM_XADJ_NONE
Definition enums.h:4898
@ ACTION_COMMAND_HURRICANE
Definition enums.h:3492
@ ACTION_COMMAND_THREE_CHANCES
Definition enums.h:3494
@ ACTION_COMMAND_SPINY_SURGE
Definition enums.h:3491
@ BUTTON_A
Definition enums.h:2790
@ BS_FLAGS1_STAR_POINTS_DROPPED
Definition enums.h:3592
@ BS_FLAGS1_FORCE_IMMUNE_HIT
Definition enums.h:3579
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3575
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3574
@ BS_FLAGS1_SHOW_PLAYER_DECORATIONS
Definition enums.h:3567
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3570
@ BS_FLAGS1_4000
Definition enums.h:3582
@ BTL_MSG_CLOUD_NINE_BEGIN
Definition enums.h:4097
@ ELEMENT_END
Definition enums.h:2114
@ ELEMENT_NORMAL
Definition enums.h:2115
@ ITER_NO_MORE
Definition enums.h:2030
@ ITER_NEXT
Definition enums.h:2025
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3374
@ PHASE_RUN_AWAY_START
Definition enums.h:2060
@ PHASE_EXECUTE_ACTION
Definition enums.h:2058
@ PHASE_CELEBRATE
Definition enums.h:2062
@ PHASE_RUN_AWAY_FAIL
Definition enums.h:2064
@ BTL_MENU_TYPE_STAR_POWERS
Definition enums.h:4234
@ STATUS_KEY_PARALYZE
Definition enums.h:2201
@ STATUS_TURN_MOD_DEFAULT
Definition enums.h:2227
@ STATUS_TURN_MOD_PARALYZE
Definition enums.h:2234
@ STATUS_KEY_FROZEN
Definition enums.h:2203
@ STATUS_TURN_MOD_SLEEP
Definition enums.h:2228
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2232
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2210
@ STATUS_KEY_STATIC
Definition enums.h:2207
@ STATUS_END
Definition enums.h:2196
@ STATUS_TURN_MOD_POISON
Definition enums.h:2233
@ STATUS_KEY_FEAR
Definition enums.h:2199
@ STATUS_TURN_MOD_STOP
Definition enums.h:2237
@ STATUS_KEY_SLEEP
Definition enums.h:2202
@ STATUS_KEY_STOP
Definition enums.h:2204
@ STATUS_KEY_INACTIVE
Definition enums.h:2214
@ STATUS_TURN_MOD_FROZEN
Definition enums.h:2230
@ STATUS_KEY_SHRINK
Definition enums.h:2206
@ STATUS_KEY_DIZZY
Definition enums.h:2200
@ STATUS_KEY_POISON
Definition enums.h:2205
@ STATUS_TURN_MOD_STATIC
Definition enums.h:2229
@ STATUS_TURN_MOD_FEAR
Definition enums.h:2231
@ STATUS_KEY_NORMAL
Definition enums.h:2197
@ STATUS_TURN_MOD_SHRINK
Definition enums.h:2235
@ STATUS_KEY_DAZE
Definition enums.h:2209
@ STATUS_KEY_DEFAULT
Definition enums.h:2198
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1952
@ HIT_RESULT_HIT
Definition enums.h:1950
@ HIT_RESULT_NICE_NO_DAMAGE
Definition enums.h:1953
@ HIT_RESULT_NICE
Definition enums.h:1951
@ HIT_RESULT_MISS
Definition enums.h:1956
@ BTL_CAM_MIDPOINT_CLOSE
Definition enums.h:4831
@ BTL_CAM_RETURN_HOME
Definition enums.h:4825
@ BTL_CAM_DEFAULT
Definition enums.h:4823
@ BTL_CAM_REPOSITION
Definition enums.h:4840
@ BTL_CAM_PARTNER_MISTAKE
Definition enums.h:4872
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2902
@ SUPPRESS_EVENT_BURN_CONTACT
Definition enums.h:2904
@ EASING_COS_IN_OUT
Definition enums.h:520
@ PARTNER_RANK_NORMAL
Definition enums.h:2018
@ PARTNER_RANK_SUPER
Definition enums.h:2019
@ PARTNER_RANK_ULTRA
Definition enums.h:2020
@ DMG_SRC_HURRICANE
Definition enums.h:2008
@ SOUND_LAKILESTER_HURRICANE_WIND
Definition enums.h:999
@ SOUND_NO_DAMGE
Definition enums.h:1433
@ SOUND_LAKILESTER_HURRICANE_EXHALE
Definition enums.h:1340
@ SOUND_AIM_SPINY_FLIP
Definition enums.h:1105
@ SOUND_LAKILESTER_HURRICANE_INHALE
Definition enums.h:1339
@ SOUND_LAKILESTER_MAKE_CLOUD_NINE
Definition enums.h:1338
@ SOUND_LAKILESTER_THROW_SPINY_B
Definition enums.h:1337
@ SOUND_LAKILESTER_THROW_SPINY_A
Definition enums.h:1336
@ ACTOR_PLAYER
Definition enums.h:2085
@ ACTOR_PARTNER
Definition enums.h:2086
@ ACTOR_SELF
Definition enums.h:2084
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3329
@ ACTOR_FLAG_NO_INACTIVE_ANIM
Definition enums.h:3345
@ ACTOR_FLAG_SHOW_STATUS_ICONS
Definition enums.h:3343
@ BTL_CAM_YADJ_NONE
Definition enums.h:4905
@ SOUND_SPACE_DEFAULT
Definition enums.h:1737
@ EVENT_HIT
Definition enums.h:2132
@ EVENT_33
Definition enums.h:2169
@ EVENT_BURN_HIT
Definition enums.h:2136
@ EVENT_SPIKE_CONTACT
Definition enums.h:2163
@ EVENT_IMMUNE
Definition enums.h:2146
@ EVENT_ZERO_DAMAGE
Definition enums.h:2144
@ EVENT_BLOCK
Definition enums.h:2147
@ EVENT_18
Definition enums.h:2145
@ EVENT_HIT_COMBO
Definition enums.h:2131
@ EVENT_RECOVER_FROM_KO
Definition enums.h:2170
@ EVENT_SHOCK_HIT
Definition enums.h:2165
@ EVENT_BURN_CONTACT
Definition enums.h:2164
@ EVENT_BLOW_AWAY
Definition enums.h:2143
@ ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION
Definition enums.h:3361
@ ACTOR_PART_FLAG_INVISIBLE
Definition enums.h:3350
@ DAMAGE_TYPE_SPINY_SURGE
Definition enums.h:2867
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2878
@ DAMAGE_TYPE_MULTIPLE_POPUPS
Definition enums.h:2879
#define ApiStatus_DONE2
Definition evt.h:118
#define ApiStatus_BLOCK
Definition evt.h:116
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:715
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:668
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:1191
void set_actor_anim(s32 actorID, s32 partID, AnimID animID)
Definition 190B20.c:1005
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:711
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Definition 43F0.c:683
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)
void hud_element_set_render_pos(s32 id, s32 x, s32 y)
s32 hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
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)
Definition sfx.c:507
ApiStatus RandInt(Evt *script, b32 isInitialCall)
#define NPC_DISPOSE_POS_Z
Definition macros.h:165
#define MAX_ENEMY_ACTORS
Definition macros.h:83
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:295
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:311
#define LVar6
Definition macros.h:154
#define Ref(sym)
Address/pointer constant.
Definition macros.h:60
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
Definition macros.h:365
#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:319
#define EndChildThread
Marks the end of a child thread block.
Definition macros.h:563
#define Sub(VAR, INT_VALUE)
Definition macros.h:377
#define LVarF
Definition macros.h:163
#define IfNe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR != RVAR.
Definition macros.h:272
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:213
#define Add(VAR, INT_VALUE)
Definition macros.h:376
#define EndLoop
Marks the end of a loop.
Definition macros.h:248
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
Definition macros.h:352
#define NPC_DISPOSE_POS_X
Definition macros.h:163
#define Goto(LABEL_ID)
Moves execution to the given label.
Definition macros.h:232
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define NPC_DISPOSE_POS_Y
Definition macros.h:164
#define IfGt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR <= RVAR.
Definition macros.h:278
#define Float(DOUBLE)
Definition macros.h:51
#define Label(LABEL_ID)
Marks this point in the script as a Goto target.
Definition macros.h:227
#define CaseOrEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR.
Definition macros.h:341
#define EndIf
Marks the end of an if statement or an else block.
Definition macros.h:298
#define LVar5
Definition macros.h:153
#define CaseDefault
Marks the start of a switch case that executes unconditionally. It also marks the end of any previous...
Definition macros.h:337
#define LVarB
Definition macros.h:159
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:475
#define LVar7
Definition macros.h:155
#define BreakLoop
Breaks out of the innermost loop.
Definition macros.h:251
#define Thread
Marks the start of a thread block.
Definition macros.h:544
#define EndThread
Marks the end of a thread block.
Definition macros.h:547
#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:288
#define LVar8
Definition macros.h:156
#define LVar2
Definition macros.h:150
#define DEG_TO_RAD(deg)
Definition macros.h:138
#define DT
Definition macros.h:526
#define BreakSwitch
Marks the end of a switch case.
Definition macros.h:359
#define LVar1
Definition macros.h:149
#define PI_S
Definition macros.h:133
#define LVarA
Definition macros.h:158
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:254
#define LFlag2
Definition macros.h:169
#define LVar9
Definition macros.h:157
#define NPC_DISPOSE_LOCATION
Definition macros.h:162
#define PlayEffect(args...)
Definition macros.h:807
#define EndSwitch
Marks the end of a switch statement and any case.
Definition macros.h:362
#define IfEq(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR == RVAR.
Definition macros.h:269
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:576
#define ChildThread
Marks the start of a child thread block.
Definition macros.h:560
#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:328
#define LFlag3
Definition macros.h:170
#define Loop(TIMES)
Marks the beginning of a loop.
Definition macros.h:245
#define LVar4
Definition macros.h:152
#define LVar3
Definition macros.h:151
#define LVarE
Definition macros.h:162
#define LVar0
Definition macros.h:148
#define SetConst(VAR, CONST)
Sets the given variable to a given value, skipping the evt_get_variable call.
Definition macros.h:370
#define Return
Kills the current EVT thread.
Definition macros.h:217
@ 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:274
#define POPUP_MSG_ON
Definition battle.h:273
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:13
s32 gCurrentCameraID
Definition cam_math.c:5