Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
parakarry.c
Go to the documentation of this file.
1#include "battle/battle.h"
2#include "script_api/battle.h"
3#include "hud_element.h"
4#include "effects.h"
8#include "sprite/npc/BattleParakarry.h"
9
10#define NAMESPACE battle_partner_parakarry
11
26
27extern EvtScript N(EVS_HandleEvent);
28extern EvtScript N(EVS_Idle);
30extern EvtScript N(EVS_TakeTurn);
31extern EvtScript N(EVS_Init);
32extern EvtScript N(firstStrike);
34extern EvtScript N(EVS_Celebrate);
35extern EvtScript N(runAway);
36extern EvtScript N(runAwayFail);
37extern EvtScript N(skyDive);
38extern EvtScript N(shellShot);
39extern EvtScript N(airLift);
40extern EvtScript N(airRaid);
41
42static EffectInstance* airRaidEffect;
43static s32 hudMarkers[7];
44static s32 hudShimmers[6];
45static s32 hudTarget;
46static s32 hudTargetRotation;
47static s32 shellShotTimer;
48static s32 hudStick;
49static s32 hudStickPosX;
50static s32 hudStickPosY;
51
52enum N(ActorPartIDs) {
53 PRT_MAIN = 1,
54 PRT_2 = 2,
55};
56
57API_CALLABLE(N(ShellShotActionCommand)) {
59 Actor* parakarry = battleStatus->partnerActor;
60 ActorState* state = &parakarry->state;
63 f32 x, y, z;
65 f32 aimX, aimY, aimZ;
68 s32 i;
69
70 if (isInitialCall) {
71 script->functionTemp[0] = 0;
72 }
73
74 switch (script->functionTemp[0]) {
75 case 0:
76 hudMarkers[0] = hid = hud_element_create(&HES_AimMarkerF);
79
80 hudMarkers[1] = hid = hud_element_create(&HES_AimMarkerE);
83
84 hudMarkers[2] = hid = hud_element_create(&HES_AimMarkerD);
87
88 hudMarkers[3] = hid = hud_element_create(&HES_AimMarkerC);
91
92 hudMarkers[4] = hid = hud_element_create(&HES_AimMarkerB);
95
96 hudMarkers[5] = hid = hud_element_create(&HES_AimMarkerA);
99
100 hudMarkers[6] = hid = hud_element_create(&HES_AimReticle);
102 hud_element_set_render_pos(hid, -100, -100);
103
104 hudShimmers[0] = hid = hud_element_create(&HES_AimShimmerF);
106 hud_element_set_render_pos(hid, -100, -100);
107
108 hudShimmers[1] = hid = hud_element_create(&HES_AimShimmerE);
110 hud_element_set_render_pos(hid, -100, -100);
111
112 hudShimmers[2] = hid = hud_element_create(&HES_AimShimmerD);
114 hud_element_set_render_pos(hid, -100, -100);
115
116 hudShimmers[3] = hid = hud_element_create(&HES_AimShimmerC);
118 hud_element_set_render_pos(hid, -100, -100);
119
120 hudShimmers[4] = hid = hud_element_create(&HES_AimShimmerB);
122 hud_element_set_render_pos(hid, -100, -100);
123
124 hudShimmers[5] = hid = hud_element_create(&HES_AimShimmerA);
126 hud_element_set_render_pos(hid, -100, -100);
127
128 hudTarget = hid = hud_element_create(&HES_AimTarget);
131 hud_element_set_render_pos(hid, -100, -100);
132 hudStickPosX = -48;
133 hudStickPosY = 80;
134
136 hud_element_set_render_pos(hid, hudStickPosX, hudStickPosY);
138
139 set_goal_pos_to_part(state, parakarry->targetActorID, parakarry->targetPartID);
140 targetActor = get_actor(parakarry->targetActorID);
142
143 state->goalPos.x += targetActorPart->projectileTargetOffset.x * targetActor->scalingFactor;
144 state->goalPos.y += targetActorPart->projectileTargetOffset.y * targetActor->scalingFactor;
145 state->goalPos.z = state->goalPos.z;
146 state->unk_24 = (targetActorPart->size.y + targetActorPart->size.x) / 2 / 24.0;
147 hud_element_set_scale(hudTarget, state->unk_24 * targetActor->scalingFactor);
148 state->curPos.x = parakarry->curPos.x + 8.0f;
149 state->curPos.y = parakarry->curPos.y + 16.0f;
150 state->curPos.z = parakarry->curPos.z;
151 state->angle = atan2(state->curPos.x, state->curPos.y, state->goalPos.x, state->goalPos.y);
152 state->bounceDivisor = state->angle;
153 state->dist = 116.0f;
154 state->unk_18.x = state->angle;
155
156 for (i = 0; i < 30; i++) {
157 state->unk_18.x -= 1.0f;
158 aimAngle = clamp_angle(state->unk_18.x);
159 x = state->curPos.x;
160 y = state->curPos.y;
161 z = state->curPos.z;
162 clampedAngleDiff = state->dist;
165 if (screenY > 180) {
166 break;
167 }
168 }
169
170 state->unk_18.y = state->angle;
171
172 for (i = 0; i < 30; i++) {
173 state->unk_18.y += 1.0f;
174 aimAngle = clamp_angle(state->unk_18.y);
175 x = state->curPos.x;
176 y = state->curPos.y;
177 z = state->curPos.z;
178 add_vec2D_polar(&x, &y, state->dist, aimAngle);
180 if (screenY < 30) {
181 break;
182 }
183 }
184
185 state->moveTime = 120;
186 state->angle = state->unk_18.x + rand_int(state->unk_18.y - state->unk_18.x - 2.0f);
187 hudTargetRotation = 0;
188 shellShotTimer = 90;
189#if VERSION_PAL
190 state->vel = 4.0f;
191#else
192 state->vel = 3.0f;
193#endif
194 battleStatus->actionResult = ACTION_RESULT_FAIL;
197 script->functionTemp[0] = 1;
198 break;
199 case 1:
201 shellShotTimer = 0;
202 }
203
204 if (shellShotTimer != 0) {
205 shellShotTimer--;
206 if (shellShotTimer == 0) {
207 if (rand_int(100) < 50) {
208 state->angle = state->unk_18.x;
209 } else {
210 state->angle = state->unk_18.y;
211 }
212 } else {
213 break;
214 }
215 }
216
218 shellShotTimer = 60;
219 script->functionTemp[0] = 2;
220 break;
221 case 2:
223 if (!(battleStatus->curButtonsDown & BUTTON_STICK_LEFT)) {
224 script->functionTemp[0] = 3;
225 break;
226 }
227 } else {
228 if (shellShotTimer == 0) {
229 targetActor = get_actor(parakarry->targetActorID);
230 aimAngle = fabsf(get_clamped_angle_diff(state->angle, state->bounceDivisor)) / state->unk_24 * targetActor->scalingFactor;
231
232 if (aimAngle < 3.0f) {
233 script->functionTemp[0] = 3;
234 break;
235 }
236 } else {
237 shellShotTimer--;
238 }
239 }
240
241 state->angle += state->vel;
242
243 if (state->angle <= state->unk_18.x) {
244 state->angle = state->unk_18.x;
245 state->vel = 0.0f - state->vel;
246 }
247
248 if (state->angle >= state->unk_18.y) {
249 state->angle = state->unk_18.y;
250 state->vel = 0.0f - state->vel;
251 }
252 break;
253 case 3:
254 targetActor = get_actor(parakarry->targetActorID);
256 aimAngle = fabsf(clampedAngleDiff) / state->unk_24 * targetActor->scalingFactor;
257
258 if (state->vel >= 0.0f) {
259 if (clampedAngleDiff < 0.0f) {
260 battleStatus->actionResult = ACTION_RESULT_FAIL;
261 } else {
262 battleStatus->actionResult = ACTION_RESULT_EARLY;
263 }
264 } else if (clampedAngleDiff < 0.0f) {
265 battleStatus->actionResult = ACTION_RESULT_EARLY;
266 } else {
267 battleStatus->actionResult = ACTION_RESULT_FAIL;
268 }
269 battleStatus->actionProgress = 0;
270
271 if (aimAngle < 7.0f) {
272 battleStatus->actionProgress = 1;
273 battleStatus->actionResult = ACTION_RESULT_SUCCESS;
275 } else if (state->angle < state->bounceDivisor) {
276 battleStatus->actionProgress = -1;
277 }
278
279 for (i = 0; i < ARRAY_COUNT(hudMarkers); i++) {
280 hud_element_free(hudMarkers[i]);
281 }
282
283 for (i = 0; i < ARRAY_COUNT(hudShimmers); i++) {
284 hud_element_free(hudShimmers[i]);
285 }
286
287 hud_element_free(hudTarget);
288 hud_element_free(hudStick);
290 return ApiStatus_DONE2;
291 }
292
293 if (script->functionTemp[0] < 3) {
294 if (script->functionTemp[0] > 0) {
295 hid = hudStick;
296 targetActor = get_actor(parakarry->targetActorID);
298 aimAngle = fabsf(clampedAngleDiff) / state->unk_24 * targetActor->scalingFactor;
299
300 if (aimAngle < 7.0f) {
302 } else {
304 }
305
306 hudStickPosX += 20;
307 if (hudStickPosX >= 51) {
308 hudStickPosX = 50;
309 }
310 hud_element_set_render_pos(hid, hudStickPosX, hudStickPosY);
311 }
312 }
313
315 hid = hudTarget;
317 hud_element_set_transform_rotation(hid, 0.0f, 0.0f, hudTargetRotation);
318 hudTargetRotation -= 10;
319 hudTargetRotation = clamp_angle(hudTargetRotation);
320
321 if (script->functionTemp[0] >= 2) {
322 if (script->functionTemp[0] < 3) {
323 aimAngle = clamp_angle(state->angle);
324 aimX = state->curPos.x;
325 aimY = state->curPos.y;
326 aimZ = state->curPos.z;
328 z = state->curPos.z;
329 x = state->curPos.x;
330 y = state->curPos.y;
331
332 for (i = 0; i < ARRAY_COUNT(hudShimmers); i++) {
333 x += (aimX - state->curPos.x) / 6.0f;
334 y += (aimY - state->curPos.y) / 6.0f;
335 z += (aimZ - state->curPos.z) / 6.0f;
338 hid = hudShimmers[i];
340 }
341
344 }
345 }
346
347 return ApiStatus_BLOCK;
348}
349
350API_CALLABLE(N(GetShellShotDamage)) {
352 s32 damage = 0;
353
354 switch (battleStatus->partnerActor->actorBlueprint->level) {
356 damage = 5;
357 break;
359 damage = 6;
360 break;
362 damage = 7;
363 break;
364 }
365
366 script->varTable[15] = damage;
367 return ApiStatus_DONE2;
368}
369
370API_CALLABLE(N(AirLiftChance)) {
372 Actor* partnerActor = battleStatus->partnerActor;
373 Actor* targetActor = get_actor(partnerActor->targetActorID);
375 s32 airLiftChance = targetActor->actorBlueprint->airLiftChance;
376 s32 hpPercentLost = 100 - targetActor->curHP * 100 / targetActor->maxHP;
377
378 if (targetActor->transparentStatus == STATUS_KEY_TRANSPARENT) {
379 airLiftChance = 0;
380 }
381
382 if (targetActorPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
383 airLiftChance = 0;
384 }
385
386 if (airLiftChance > 0) {
387 airLiftChance += airLiftChance * hpPercentLost / 100;
388
389 if (airLiftChance > 100) {
390 airLiftChance = 100;
391 }
392
393 if (targetActor->debuff != 0) {
394 airLiftChance = airLiftChance * 150 / 100;
395
396 if (airLiftChance > 150) {
397 airLiftChance = 150;
398 }
399 }
400 }
401
402 script->varTable[0] = airLiftChance;
403
404 return ApiStatus_DONE2;
405}
406
407API_CALLABLE(N(CarryAway)) {
409 Actor* parakarry = battleStatus->partnerActor;
411 f32* animationRatePtr = &parakarry->partsTable->animationRate;
413 f64 y;
414 u32 temp_s4;
415
416 if (isInitialCall) {
417 script->functionTempPtr[1] = get_actor(parakarry->targetActorID);
418 script->functionTemp[0] = 0;
419 }
420
421 temp_s4 = script->functionTemp[0];
422 targetActor = script->functionTempPtr[1];
423
424 switch (script->functionTemp[0]) {
425 case 0:
426 parakarry->state.goalPos.x = targetActor->curPos.x - parakarry->curPos.x;
427 parakarry->state.goalPos.y = targetActor->curPos.y - parakarry->curPos.y;
428 parakarry->state.goalPos.z = targetActor->curPos.z - parakarry->curPos.z;
429 parakarry->state.speed = 2.0f;
430 parakarry->state.moveTime = 0;
431 script->functionTemp[0] = 1;
432 break;
433 case 1:
434 parakarry->state.curPos.x += parakarry->state.speed;
435 *animationRatePtr = 1.0f;
436 y = parakarry->state.curPos.y;
437 parakarry->state.curPos.y = y + (sin_rad(2.0f * sin_rad(DEG_TO_RAD(parakarry->state.moveTime)) * PI_S) * 1.4 + 0.5);
438 parakarry->state.moveTime += 6;
439 parakarry->state.moveTime = clamp_angle(parakarry->state.moveTime);
440
441 if (gGameStatusPtr->frameCounter % 10 == 0) {
442 sfx_play_sound_at_position(SOUND_PARAKARRY_FLAP, SOUND_SPACE_DEFAULT, parakarry->state.curPos.x, parakarry->state.curPos.y, parakarry->state.curPos.z);
443 }
444
445 if (parakarry->state.curPos.x > 240.0f) {
446 battleStatus->actionProgress = temp_s4;
447 return ApiStatus_DONE2;
448 }
449 break;
450 }
451
452 parakarry->curPos.x = actorState->curPos.x;
453 parakarry->curPos.y = actorState->curPos.y;
454 parakarry->curPos.z = actorState->curPos.z;
455
456 targetActor->curPos.x = actorState->curPos.x + actorState->goalPos.x;
457 targetActor->curPos.y = actorState->curPos.y + actorState->goalPos.y;
458 targetActor->curPos.z = actorState->curPos.z + actorState->goalPos.z;
459 return ApiStatus_BLOCK;
460}
461
462API_CALLABLE(N(FlyAround)) {
464 ActorState* state = &partner->state;
465
466 if (isInitialCall) {
467 script->functionTemp[0] = 0;
468 }
469
470 switch (script->functionTemp[0]) {
471 case 0:
472 state->curPos.x = partner->curPos.x;
473 state->curPos.y = partner->curPos.y;
474 state->curPos.z = partner->curPos.z;
475 state->angle = 60 - rand_int(10);
476 state->bounceDivisor = 0.0f;
477 state->moveTime = 90;
478 state->speed = 48.0f;
479 script->functionTemp[1] = 0;
480 script->functionTemp[2] = 0;
481 script->functionTemp[3] = 0;
482 airRaidEffect = fx_effect_65(0, state->curPos.x, state->curPos.y, state->curPos.z, 1.0f, 0);
483 script->functionTemp[0] = 1;
484 break;
485 case 1:
486 add_vec2D_polar(&state->curPos.x, &state->curPos.y, state->speed, state->angle);
487 airRaidEffect->data.unk_65->pos.x = state->curPos.x;
488 airRaidEffect->data.unk_65->pos.y = state->curPos.y;
489 airRaidEffect->data.unk_65->pos.z = state->curPos.z;
490 if (state->curPos.x < -190.0f) {
491 if (script->functionTemp[1] != 0) {
492 script->functionTemp[0] = 2;
493 break;
494 }
495 if (state->angle >= 270.0f && state->angle < 360.0f) {
496 state->angle = 90.0f + (90.0f - clamp_angle(state->angle + 180.0f));
497 state->bounceDivisor = rand_int(4) - 2;
498 }
499 if (state->angle >= 180.0f && state->angle < 270.0f) {
500 state->angle = 90.0f - (clamp_angle(state->angle + 180.0f) - 90.0f);
501 state->bounceDivisor = rand_int(4) - 2;
502 }
503
504 if (script->functionTemp[3] != 0) {
506 } else {
508 }
509 script->functionTemp[3] = 1 - script->functionTemp[3];
510 }
511
512 if (state->curPos.x > 190.0f) {
513 if (script->functionTemp[1] != 0) {
514 script->functionTemp[0] = 2;
515 break;
516 }
517
518 do {
519 if (state->angle >= 0.0f && state->angle < 90.0f) {
520 state->angle = 270.0f + (270.0f - clamp_angle(state->angle + 180.0f));
521 } else if (state->angle >= 90.0f && state->angle < 180.0f) {
522 state->angle = 270.0f - (clamp_angle(state->angle + 180.0f) - 270.0f);
523 }
524 } while (0); // TODO macro?
525
526 if (script->functionTemp[3] != 0) {
528 } else {
530 }
531 script->functionTemp[3] = 1 - script->functionTemp[3];
532 }
533
534 if (state->curPos.y < -30.0f) {
535 if (script->functionTemp[1] != 0) {
536 script->functionTemp[0] = 2;
537 break;
538 }
539
540 do {
541 if (state->angle >= 270.0f && state->angle < 360.0f) {
542 state->angle = 180.0f + (180.0f - clamp_angle(state->angle + 180.0f));
543 } else if (state->angle >= 0.0f && state->angle < 90.0f) {
544 state->angle = 180.0f - (clamp_angle(state->angle + 180.0f) - 180.0f);
545 }
546 } while (0); // TODO macro?
547
548 if (script->functionTemp[3] != 0) {
550 } else {
552 }
553 script->functionTemp[3] = 1 - script->functionTemp[3];
554 }
555
556 if (state->curPos.y > 160.0f) {
557 if (script->functionTemp[1] != 0) {
558 script->functionTemp[0] = 2;
559 break;
560 }
561
562 do {
563 if (state->angle >= 90.0f && state->angle < 180.0f) {
564 state->angle = 360.0f + (360.0f - clamp_angle(state->angle + 180.0f));
565 } else if (state->angle >= 180.0f && state->angle < 270.0f) {
566 state->angle = 360.0f - (clamp_angle(state->angle + 180.0f) - 360.0f);
567 }
568 } while (0); // TODO macro?
569
570 if (script->functionTemp[3] != 0) {
572 } else {
574 }
575 script->functionTemp[3] = 1 - script->functionTemp[3];
576 }
577
578 state->angle = clamp_angle(state->angle + (state->bounceDivisor * 0.5));
579 if (state->moveTime != 0) {
580 state->moveTime--;
581 } else {
582 script->functionTemp[1] = 1;
583 }
584 break;
585 }
586
587 switch (script->functionTemp[0]) {
588 case 2:
589 state->moveTime = 5;
590 script->functionTemp[0] = 3;
591 airRaidEffect->flags |= FX_INSTANCE_FLAG_DISMISS;
592 // fallthrough
593 case 3:
594 add_vec2D_polar(&state->curPos.x, &state->curPos.y, state->speed, state->angle);
595 if (state->moveTime == 0) {
596 partner->rot.z = 0.0f;
597 return ApiStatus_DONE2;
598 }
599 state->moveTime--;
600 // fallthrough
601 default:
602 partner->curPos.x = state->curPos.x;
603 partner->curPos.y = state->curPos.y;
604 partner->curPos.z = state->curPos.z;
605 return ApiStatus_BLOCK;
606 }
607}
608
609API_CALLABLE(N(GetAirRaidDamage)) {
610 script->varTable[15] = ((script->varTable[0] * 100) / 2499) + 2;
611
612 return ApiStatus_DONE2;
613}
614
615s32 N(DefaultAnims)[] = {
624};
625
626s32 N(DefenseTable)[] = {
629};
630
631s32 N(StatusTable)[] = {
634 STATUS_KEY_SLEEP, 100,
637 STATUS_KEY_DIZZY, 100,
642 STATUS_KEY_STOP, 100,
654};
655
656ActorPartBlueprint N(ActorParts)[] = {
657 {
658 .flags = 0,
659 .index = PRT_MAIN,
660 .posOffset = { 0, 0, 0 },
661 .targetOffset = { 11, 28 },
662 .opacity = 255,
663 .idleAnimations = N(DefaultAnims),
664 .defenseTable = N(DefenseTable),
665 .eventFlags = ACTOR_EVENT_FLAG_GROUNDABLE,
666 .elementImmunityFlags = 0,
667 .projectileTargetOffset = { 0, 0 },
668 },
669};
670
671ActorBlueprint NAMESPACE = {
672 .flags = ACTOR_FLAG_FLYING,
673 .type = ACTOR_TYPE_PARAKARRY,
674 .level = ACTOR_LEVEL_PARAKARRY,
675 .maxHP = 99,
676 .partCount = ARRAY_COUNT(N(ActorParts)),
677 .partsData = N(ActorParts),
678 .initScript = &N(EVS_Init),
679 .statusTable = N(StatusTable),
680 .escapeChance = 0,
681 .airLiftChance = 0,
682 .hurricaneChance = 0,
683 .spookChance = 0,
684 .upAndAwayChance = 0,
685 .spinSmashReq = 4,
686 .powerBounceChance = 80,
687 .coinReward = 0,
688 .size = { 38, 38 },
689 .healthBarOffset = { 0, 0 },
690 .statusIconOffset = { -10, 30 },
691 .statusTextOffset = { 10, 30 },
692};
693
694EvtScript N(EVS_Init) = {
695 Call(BindTakeTurn, ACTOR_PARTNER, Ref(N(EVS_TakeTurn)))
696 Call(BindIdle, ACTOR_PARTNER, Ref(N(EVS_Idle)))
697 Call(BindHandleEvent, ACTOR_PARTNER, Ref(N(EVS_HandleEvent)))
699 Return
700 End
701};
702
703EvtScript N(EVS_Idle) = {
704 Return
705 End
706};
707
708EvtScript N(EVS_HandleEvent) = {
724 SetConst(LVar0, PRT_MAIN)
729 SetConst(LVar0, PRT_MAIN)
731 Set(LVar2, 22)
737 Set(LVar2, 22)
751 SetConst(LVar0, PRT_MAIN)
753 Set(LVar2, 22)
761 Set(LVar3, 30)
766 SetConst(LVar0, PRT_MAIN)
769 Wait(10)
775 Return
776 End
777};
778
779EvtScript N(EVS_TakeTurn) = {
789 ExecWait(N(runAway))
793 Return
794 End
795};
796
798 SetConst(LVar0, PRT_MAIN)
803 Return
804 End
805};
806
808 Call(ShowActionHud, true)
814 Return
820 Set(LVarE, 1)
821 Set(LVarF, 2)
822 ExecWait(N(skyDive))
825 Set(LVarE, 2)
826 Set(LVarF, 3)
827 ExecWait(N(skyDive))
830 Set(LVarE, 4)
831 Set(LVarF, 5)
832 ExecWait(N(skyDive))
837 ExecWait(N(airLift))
839 ExecWait(N(airRaid))
841 Return
842 End
843};
844
846 Return
847 End
848};
849
850EvtScript N(runAway) = {
851 SetConst(LVar0, PRT_MAIN)
854 Return
855 End
856};
857
867 Return
868 End
869};
870
872 Return
873 End
874};
875
881 Call(AddGoalPos, ACTOR_PARTNER, -50, 0, 0)
885 Wait(4)
888 Call(AddGoalPos, ACTOR_PARTNER, -30, 0, 0)
891 Wait(2)
897 Return
898 End
899};
900
906 Call(AddGoalPos, ACTOR_PARTNER, -30, 0, 0)
910 Wait(4)
913 Call(AddGoalPos, ACTOR_PARTNER, -20, 0, 0)
916 Wait(2)
922 Return
923 End
924};
925
926s32 N(actionCommandTable)[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
927
928EvtScript N(skyDive) = {
939 Call(AddGoalPos, ACTOR_PARTNER, -20, 0, 0)
943 Wait(3)
948 Call(AddGoalPos, ACTOR_PARTNER, 0, 10, 0)
950 Wait(2)
952 Wait(3)
956 Call(AddGoalPos, ACTOR_PARTNER, -26, 25, 0)
961 Call(AddGoalPos, ACTOR_PARTNER, -10, 0, 0)
967 Wait(5)
971 Call(AddGoalPos, ACTOR_PARTNER, 40, 10, 0)
973 Wait(20)
980 Return
981 EndIf
984 Wait(2)
987 CaseGt(0)
1004 EndSwitch
1007 Return
1008 End
1009};
1010
1011EvtScript N(shellShot) = {
1014 Wait(15)
1023 Set(LVar0, -2)
1024 EndIf
1025 Switch(LVar0)
1026 CaseEq(1)
1034 CaseEq(-1)
1039 Call(AddGoalPos, ACTOR_PARTNER, 50, -50, 0)
1041 Call(FlyToGoal, ACTOR_PARTNER, 7, 0, 100)
1043 CaseEq(0)
1048 Call(AddGoalPos, ACTOR_PARTNER, 50, 50, 0)
1052 CaseEq(-2)
1057 Call(AddGoalPos, ACTOR_PARTNER, 40, 0, 0)
1061 EndSwitch
1063 Switch(LVar0)
1064 CaseGt(0)
1069 EndSwitch
1071 Label(10)
1072 Switch(LVar0)
1075 IfEq(LFlag0, true)
1077 Else
1079 EndIf
1087 EndSwitch
1088 Return
1089 End
1090};
1091
1092EvtScript N(airLift) = {
1097 Call(SetupMashMeter, 1, 100, 0, 0, 0, 0)
1102 Div(LVar0, 4)
1106 Sub(LVar0, 12)
1107 IfLt(LVar0, 0)
1108 Set(LVar0, 0)
1109 EndIf
1115 Wait(15)
1117 Call(AddBattleCamDist, -160)
1121 Wait(2)
1127 Add(LVar1, 20)
1132 Wait(10)
1140 Return
1141 EndIf
1142 Wait(3)
1145 IfNe(LVar0, -1)
1149 Wait(1)
1151 Div(LVar1, 10)
1152 Add(LVar1, 1)
1153 Loop(88 * DT)
1155 Set(LVar2, LVar1)
1156 Mul(LVar2, 10)
1157 IfGt(LVar0, LVar2)
1161 Add(LVar1, 1)
1162 EndIf
1163 Wait(1)
1164 EndLoop
1166 Wait(90 * DT)
1168 Else
1170 Set(LVar0, 0)
1171 EndIf
1172 Switch(LVar0)
1173 CaseEq(1)
1177 Call(N(CarryAway), LVar0)
1178 Wait(30)
1187 Add(LVar1, 20)
1192 Wait(10)
1193 EndSwitch
1201 Return
1202 End
1203};
1204
1205EvtScript N(airRaid) = {
1208 Call(SetupMashMeter, 4, 25, 50, 75, 100, 0)
1214 Add(LVar0, 70)
1221 Wait(2)
1224 Sub(LVar0, 50)
1225 Add(LVar1, 30)
1226 Add(LVar2, 40)
1229 Wait(2)
1234 Loop(5)
1235 Wait(18)
1238 EndLoop
1241 Loop(5)
1242 Wait(18)
1245 EndLoop
1248 Call(N(FlyAround))
1255 Label(10)
1258 IfEq(LVar0, 6)
1259 Goto(11)
1260 EndIf
1262 Switch(LVar0)
1263 CaseGt(99)
1268 EndSwitch
1270 Wait(5)
1271 Label(11)
1274 Goto(10)
1275 EndIf
1277 Switch(LVar0)
1278 CaseGt(99)
1282 EndSwitch
1284 Wait(10)
1285 Call(SetActorPos, ACTOR_PARTNER, -200, 50, 0)
1292 Wait(20)
1294 Wait(20)
1295 Return
1296 End
1297};
BSS s32 PopupMenu_SelectedIndex
BSS ActionCommandStatus gActionCommandStatus
Definition action_cmd.c:91
void increment_action_command_attempt_count(void)
Definition action_cmd.c:640
void increment_action_command_success_count(void)
Definition action_cmd.c:654
void action_command_init_status(void)
Definition action_cmd.c:256
@ AC_DIFFICULTY_3
Definition action_cmd.h:45
HudScript HES_StickNeutral
HudScript HES_StickHoldLeft
HudScript HES_AimShimmerD
HudScript HES_AimShimmerE
HudScript HES_AimMarkerE
HudScript HES_AimMarkerA
HudScript HES_AimMarkerD
HudScript HES_AimMarkerB
HudScript HES_AimMarkerF
HudScript HES_AimMarkerC
HudScript HES_AimShimmerF
HudScript HES_AimShimmerA
HudScript HES_AimShimmerB
HudScript HES_AimShimmerC
HudScript HES_AimTarget
HudScript HES_AimReticle
s16 targetActorID
s32 HudElemID
Bytecode EvtScript[]
#define sfx_play_sound_at_position
#define rand_int
#define clamp_angle
#define atan2
EffectInstanceDataPtr data
Definition effects.h:2605
struct Effect65FXData * unk_65
Definition effects.h:2565
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3551
@ ACTION_COMMAND_AIR_LIFT
Definition enums.h:3519
@ ACTION_COMMAND_AIR_RAID
Definition enums.h:3520
@ ACTION_COMMAND_JUMP
Definition enums.h:3507
@ BUTTON_STICK_LEFT
Definition enums.h:2779
@ BS_FLAGS1_STAR_POINTS_DROPPED
Definition enums.h:3626
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3609
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ BS_FLAGS1_4000
Definition enums.h:3616
@ 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_GROUNDABLE
Actor can be knocked down from flight; triggered by jump attacks.
Definition enums.h:3416
@ 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
@ PHASE_FIRST_STRIKE
Definition enums.h:2092
@ BTL_MENU_TYPE_STAR_POWERS
Definition enums.h:3834
#define SUPPRESS_EVENTS_KOOPER_DAMAGE
Definition enums.h:2957
@ 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_STONE
Definition enums.h:2813
@ 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_RETURN_HOME
Definition enums.h:4411
@ BTL_CAM_DEFAULT
Definition enums.h:4409
@ BTL_CAM_PARTNER_MIDAIR
Definition enums.h:4459
@ BTL_CAM_ACTOR
Definition enums.h:4421
@ BTL_CAM_VIEW_ENEMIES
Definition enums.h:4410
@ BTL_CAM_PARTNER_MISTAKE
Definition enums.h:4458
@ SUPPRESS_EVENT_SPIKY_TOP
Definition enums.h:2934
@ SUPPRESS_EVENT_ALT_SPIKY
Definition enums.h:2939
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2936
@ SUPPRESS_EVENT_BURN_CONTACT
Definition enums.h:2938
@ EASING_COS_IN
Definition enums.h:522
@ EASING_COS_IN_OUT
Definition enums.h:520
@ EASING_QUARTIC_OUT
Definition enums.h:516
@ EASING_QUADRATIC_OUT
Definition enums.h:514
@ EASING_LINEAR
Definition enums.h:510
@ IDLE_SCRIPT_ENABLE
Definition enums.h:5999
@ IDLE_SCRIPT_DISABLE
Definition enums.h:5998
@ PARTNER_RANK_NORMAL
Definition enums.h:2051
@ PARTNER_RANK_SUPER
Definition enums.h:2052
@ PARTNER_RANK_ULTRA
Definition enums.h:2053
@ SOUND_PARAKARRY_FLAP
Definition enums.h:1321
@ SOUND_PARAKARRY_PREDIVE
Definition enums.h:1318
@ SOUND_NO_DAMGE
Definition enums.h:1436
@ SOUND_PARAKARRY_SHELL_SHOT
Definition enums.h:1320
@ SOUND_NONE
Definition enums.h:550
@ SOUND_PARAKARRY_AIR_RAID_1
Definition enums.h:1322
@ SOUND_PARAKARRY_AIR_RAID_2
Definition enums.h:1323
@ SOUND_AIM_SHELL_SHOT
Definition enums.h:1107
@ SOUND_PARAKARRY_DIVE
Definition enums.h:1319
@ SOUND_HIT_RATTLE
Definition enums.h:752
@ ACTOR_PARTNER
Definition enums.h:2119
@ ACTOR_SELF
Definition enums.h:2117
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3363
@ ACTION_RESULT_EARLY
Definition enums.h:1992
@ ACTION_RESULT_SUCCESS
Definition enums.h:1994
@ ACTION_RESULT_FAIL
Definition enums.h:1993
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740
@ ACTOR_BLUR_ENABLE
Definition enums.h:6005
@ ACTOR_BLUR_DISABLE
Definition enums.h:6004
@ 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_15
Definition enums.h:2170
@ EVENT_AIR_LIFT_FAILED
Definition enums.h:2185
@ 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
@ DAMAGE_TYPE_AIR_LIFT
Definition enums.h:2900
@ 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)
f32 fabsf(f32 f)
void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32 *screenX, s32 *screenY, s32 *screenZ)
Definition cam_main.c:409
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
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
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:606
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_Hit
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_Partner_SpikeContact
EvtScript EVS_Partner_RunAway
void sfx_play_sound(s32 soundID)
ApiStatus StopSound(Evt *script, b32 isInitialCall)
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:296
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:312
#define Ref(sym)
Address/pointer constant.
Definition macros.h:61
#define Mul(VAR, INT_VALUE)
Definition macros.h:379
#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 Goto(LABEL_ID)
Moves execution to the given label.
Definition macros.h:233
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define IfGt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR <= RVAR.
Definition macros.h:279
#define IfLt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR < RVAR.
Definition macros.h:276
#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 CaseDefault
Marks the start of a switch case that executes unconditionally. It also marks the end of any previous...
Definition macros.h:338
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:476
#define Div(VAR, INT_VALUE)
Definition macros.h:380
#define LVar2
Definition macros.h:151
#define DEG_TO_RAD(deg)
Definition macros.h:145
#define DT
Definition macros.h:534
#define LVar1
Definition macros.h:150
#define LFlag0
Definition macros.h:168
#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 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 Loop(TIMES)
Marks the beginning of a loop.
Definition macros.h:246
#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
#define POPUP_MSG_OFF
Definition battle.h:280
#define POPUP_MSG_ON
Definition battle.h:279
struct Actor * partnerActor
GameStatus * gGameStatusPtr
Definition main_loop.c:31
BattleStatus gBattleStatus
Definition battle.cpp:14
s32 gCurrentCameraID
Definition cam_math.c:5