Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
goombario.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"
6#include "sprite/npc/BattleGoombario.h"
7
8#define NAMESPACE battle_partner_goombario
9
10extern s32 bActorTattles[];
11
13static b32 N(isCharged);
14extern s32 N(MultibonkChance);
15
16extern EvtScript N(EVS_Init);
17extern EvtScript N(EVS_Idle);
18extern EvtScript N(EVS_HandleEvent);
20extern EvtScript N(EVS_TakeTurn);
29extern EvtScript N(EVS_RunAway);
31extern EvtScript N(EVS_Celebrate);
32
33enum N(ActorPartIDs) {
34 PRT_MAIN = 1,
35};
36
37API_CALLABLE(N(GetReturnMoveTime)) {
39 Actor* partner = battleStatus->partnerActor;
40 f32 posX = partner->curPos.x;
41 f32 posY = partner->curPos.y;
42 f32 posZ = partner->curPos.z;
43 f32 goalX = partner->state.goalPos.x;
44 f32 goalY = partner->state.goalPos.y;
45 f32 goalZ = partner->state.goalPos.z;
46
47 script->varTable[0] = (dist3D(posX, posY, posZ, goalX, goalY, goalZ) * 15.0f) / 100.0f;
48
49 if (script->varTable[0] > 20) {
50 script->varTable[0] = 20;
51 }
52
53 if (battleStatus->actionCommandMode != AC_MODE_NOT_LEARNED) {
54 if (script->varTable[0] < 10) {
55 script->varTable[0] = 10;
56 }
57 } else if (script->varTable[0] < 15) {
58 script->varTable[0] = 15;
59 }
60
61 return ApiStatus_DONE2;
62}
63
64API_CALLABLE(N(AdjustMultibonkChance)) {
66
67 script->varTable[0] = 99;
68
69 N(MultibonkChance) *= targetActor->actorBlueprint->powerBounceChance;
70 N(MultibonkChance) /= 100;
71 if (N(MultibonkChance) < rand_int(100)) {
72 script->varTable[0] = 0;
73 }
74
75 return ApiStatus_DONE2;
76}
77
78API_CALLABLE(N(ResetMultibonkChance)) {
79 N(MultibonkChance) = 200;
80 return ApiStatus_DONE2;
81}
82
83API_CALLABLE(N(JumpOnTarget)) {
84 Bytecode* args = script->ptrReadPos;
86 Actor* actor = battleStatus->partnerActor;
87 ActorState* state = &actor->state;
95 f64 acc1, acc2;
96 f64 acc3, acc4;
97 f64 vel1, vel2;
98 f64 vel3, vel4;
99 f32 temp;
100
101 if (isInitialCall) {
102 actor->state.moveTime = evt_get_variable(script, *args++);
104 script->functionTemp[1] = 0;
105 script->functionTemp[0] = 0;
106 if (actor->state.moveArcAmplitude == 1) {
107 script->functionTemp[0] = 2;
108 }
109 }
110
111 if (script->functionTemp[0] == 0) {
112 state->curPos.x = actor->curPos.x;
113 state->curPos.y = actor->curPos.y;
114 stateGoalX = state->goalPos.x;
115 stateGoalZ = state->goalPos.z;
116 stateCurrentX = state->curPos.x;
117 stateCurrentZ = actor->curPos.z;
118 state->curPos.z = stateCurrentZ;
121 if (state->moveTime == 0) {
122 state->moveTime = state->dist / state->speed;
123 temp = state->dist - (state->moveTime * state->speed);
124 } else {
125 state->speed = state->dist / state->moveTime;
126 temp = state->dist - (state->moveTime * state->speed);
127 }
128
129 if (state->moveTime == 0) {
130 return ApiStatus_DONE2;
131 }
132
133 state->velStep.x = (state->goalPos.x - state->curPos.x) / state->moveTime;
134 state->velStep.y = (state->goalPos.y - state->curPos.y) / state->moveTime;
135 state->velStep.z = (state->goalPos.z - state->curPos.z) / state->moveTime;
136 state->acceleration = PI_S / state->moveTime;
137 state->vel = 0.0f;
138 state->speed += temp / state->moveTime;
139
140 if (state->moveArcAmplitude < 3) {
141 state->unk_24 = 90.0f;
142 state->unk_28 = 360 / state->moveTime;
143 temp = state->dist;
144 temp -= 20.0;
145 temp /= 6.0;
146 temp += 47.0;
147 state->bounceDivisor = temp;
148 if (state->moveArcAmplitude == 2) {
149 state->bounceDivisor *= 1.12;
150 }
151 state->unk_18.x = 0.0f;
152 state->unk_18.y = 0.0f;
153 vel3 = state->vel;
154 acc3 = state->acceleration;
155 state->vel = vel3 + ((sin_rad(DEG_TO_RAD(state->unk_24)) * 0.53 * acc3) + acc3);
156 } else {
157 state->unk_24 = 90.0f;
158 state->unk_28 = 360 / state->moveTime;
159 temp = state->dist;
160 temp -= 20.0;
161 temp /= 6.0;
162 temp += 47.0;
163 state->bounceDivisor = temp;
164 if (state->moveArcAmplitude == 4) {
165 state->bounceDivisor *= 1.25;
166 }
167 state->unk_18.x = 0.0f;
168 state->unk_18.y = 0.0f;
169 vel4 = state->vel;
170 acc4 = state->acceleration;
171 state->vel = vel4 + ((sin_rad(DEG_TO_RAD(state->unk_24)) * 0.8 * acc4) + acc4);
172 }
173 set_actor_anim(ACTOR_PARTNER, PRT_MAIN, state->animJumpRise);
174 script->functionTemp[0] = 1;
175 }
176
177 switch (script->functionTemp[0]) {
178 case 1:
179 if (state->vel > PI_S / 2) {
180 set_actor_anim(ACTOR_PARTNER, PRT_MAIN, state->animJumpFall);
181 }
182 oldActorX = actor->curPos.x;
183 oldActorY = actor->curPos.y;
184 state->curPos.x += state->velStep.x;
185 state->curPos.y += state->velStep.y;
186 state->curPos.z += state->velStep.z;
187 state->unk_18.x = actor->curPos.y;
188 actor->curPos.x = state->curPos.x;
189 actor->curPos.y = state->curPos.y + (state->bounceDivisor * sin_rad(state->vel));
190 actor->curPos.z = state->curPos.z;
191 if (state->goalPos.y > actor->curPos.y && state->moveTime < 3) {
192 actor->curPos.y = state->goalPos.y;
193 }
194
195 actor->rot.z = -atan2(oldActorX, -oldActorY, actor->curPos.x, -actor->curPos.y);
196 state->unk_18.y = actor->curPos.y;
197 if (state->moveArcAmplitude < 3) {
198 vel1 = state->vel;
199 acc1 = state->acceleration;
200 state->vel = vel1 + ((sin_rad(DEG_TO_RAD(state->unk_24)) * 0.53 * acc1) + acc1);
201 } else {
202 vel2 = state->vel;
203 acc2 = state->acceleration;
204 state->vel = vel2 + ((sin_rad(DEG_TO_RAD(state->unk_24)) * 0.8 * acc2) + acc2);
205 }
206
207 state->unk_24 += state->unk_28;
208 state->unk_24 = clamp_angle(state->unk_24);
209 state->moveTime--;
210 if (state->moveTime == 0) {
211 actor->curPos.y = state->goalPos.y;
212 state->acceleration = 1.8f;
213 state->vel = -(state->unk_18.x - state->unk_18.y);
214 set_actor_anim(ACTOR_PARTNER, PRT_MAIN, state->animJumpLand);
215 return ApiStatus_DONE1;
216 }
217 break;
218 case 2:
219 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
220 return ApiStatus_DONE2;
221 }
222 state->moveTime = 1;
223 state->acceleration = 1.8f;
224 state->unk_24 = 90.0f;
225 state->vel = -(state->unk_18.x - state->unk_18.y);
226 state->bounceDivisor = fabsf(state->unk_18.x - state->unk_18.y) / 16.5;
227 state->unk_28 = 360 / state->moveTime;
228 state->curPos.x = actor->curPos.x;
229 state->curPos.y = actor->curPos.y;
230 state->curPos.z = actor->curPos.z;
231 script->functionTemp[0] = 3;
232 // fallthrough
233 case 3:
234 currentPosX64 = state->curPos.x; // required to match
235 state->curPos.x = currentPosX64 + state->bounceDivisor * sin_rad(DEG_TO_RAD(state->unk_24)) / 33.0;
236 state->curPos.y -= state->bounceDivisor * sin_rad(DEG_TO_RAD(state->unk_24));
237 state->unk_24 += state->unk_28;
238 state->unk_24 = clamp_angle(state->unk_24);
239 actor->curPos.x = state->curPos.x;
240 actor->curPos.y = state->curPos.y;
241 actor->curPos.z = state->curPos.z;
242
244 return ApiStatus_DONE2;
245 }
246
247 state->moveTime--;
248 if (state->moveTime == 0) {
249 return ApiStatus_DONE1;
250 }
251 break;
252 }
253
254 return ApiStatus_BLOCK;
255}
256
257API_CALLABLE(N(OnMissHeadbonk)) {
259 Vec3f* pos = &partner->state.curPos;
260
261 if (isInitialCall) {
262 script->functionTemp[0] = 0;
263 }
264
265 if (script->functionTemp[0] == 0) {
266 partner->state.curPos.x = partner->curPos.x;
267 partner->state.curPos.y = partner->curPos.y;
268 partner->state.curPos.z = partner->curPos.z;
269 script->functionTemp[0] = 1;
270 }
271
272 if (partner->state.vel > 0.0f) {
273 set_actor_anim(ACTOR_PARTNER, 0, partner->state.animJumpRise);
274 }
275
276 if (partner->state.vel < 0.0f) {
277 set_actor_anim(ACTOR_PARTNER, 0, partner->state.animJumpFall);
278 }
279
280 partner->state.curPos.y = (partner->state.curPos.y + partner->state.vel);
281 partner->state.vel = (partner->state.vel - partner->state.acceleration);
282 add_xz_vec3f(pos, partner->state.speed, partner->state.angle);
283 partner->curPos.x = partner->state.curPos.x;
284 partner->curPos.y = partner->state.curPos.y;
285 partner->curPos.z = partner->state.curPos.z;
286
287 if (partner->curPos.y < 10.0f) {
288 partner->curPos.y = 10.0f;
289
290 play_movement_dust_effects(2, partner->curPos.x, partner->curPos.y, partner->curPos.z, partner->yaw);
292
293 return ApiStatus_DONE1;
294 }
295
296 return ApiStatus_BLOCK;
297}
298
299API_CALLABLE(N(GetTattleMessage)) {
301 Actor* partner = battleStatus->partnerActor;
302 Actor* target = get_actor(partner->targetActorID);
303 s32* tattle = &bActorTattles[target->actorType];
304
305 script->varTable[0] = *tattle;
306
307 if (script->varTable[0] == nullptr) {
308 script->varTable[0] = bActorTattles[0];
309 }
310
311 save_tattle_flags(target->actorType);
312
313 return ApiStatus_DONE2;
314}
315
316API_CALLABLE(N(GetTattleCamPos)) {
318 s32 xSize;
319
320 if (!(target->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
321 script->varTable[1] = script->varTable[1] + (((target->size.y / 3) & 0xFF) * target->scalingFactor);
322 script->varTable[1] += ((target->size.y / 4) * target->scalingFactor);
323 } else {
324 script->varTable[1] = script->varTable[1] - (((target->size.y / 3) & 0xFF) * target->scalingFactor);
325 script->varTable[1] -= ((target->size.y / 4) * target->scalingFactor);
326 }
327
328 if (target->flags & ACTOR_FLAG_HALF_HEIGHT) {
329 script->varTable[1] -= (target->size.y / 2) * target->scalingFactor;
330 }
331
332 xSize = target->size.y * target->scalingFactor;
333 if (xSize < target->size.x) {
334 xSize = target->size.x;
335 }
336
337 script->varTable[3] = xSize + 76;
338 script->varTable[0] += bActorOffsets[target->actorType].tattleCam.x;
339 script->varTable[1] += bActorOffsets[target->actorType].tattleCam.y;
340 script->varTable[3] += bActorOffsets[target->actorType].tattleCam.z;
341
342 return ApiStatus_DONE2;
343}
344
345API_CALLABLE(N(OpenTattleWindow)) {
346 N(TattleWindowEffect) = fx_tattle_window(0, 206, 144, 0, 1.0f, 0);
347
348 return ApiStatus_DONE2;
349}
350
351API_CALLABLE(N(CloseTattleWindow)) {
353
354 effect->data.tattleWindow->pos.y = 144.0f;
356
357 return ApiStatus_DONE2;
358}
359
360API_CALLABLE(N(CanChargeMore)) {
362 Actor* partner = battleStatus->partnerActor;
363
364 script->varTable[0] = false;
365
366 switch (battleStatus->selectedMoveID) {
367 case MOVE_TATTLE:
368 if (partner->isGlowing >= 99) {
369 script->varTable[0] = true;
370 }
371 break;
372 case MOVE_CHARGE:
373 if (partner->isGlowing >= 99) {
374 script->varTable[0] = true;
375 }
376 break;
377 case MOVE_MULTIBONK:
378 if (partner->isGlowing >= 99) {
379 script->varTable[0] = true;
380 }
381 break;
382 }
383
384 return ApiStatus_DONE2;
385}
386
387API_CALLABLE(N(ChargeAtPos)) {
388 Bytecode* args = script->ptrReadPos;
390 Actor* partner = battleStatus->partnerActor;
392 s32 x, y, z;
393
394 N(isCharged) = false;
395 if (partner->isGlowing > 0) {
396 N(isCharged) = true;
397 }
398
399 boostAmount = 0;
400 switch (battleStatus->selectedMoveID) {
401 case MOVE_TATTLE:
402 partner->isGlowing += 2;
403 boostAmount = 1;
404 if (partner->isGlowing >= 99) {
405 partner->isGlowing = 99;
406 }
407 break;
408 case MOVE_CHARGE:
409 partner->isGlowing += 2;
410 boostAmount = 1;
411 if (partner->isGlowing >= 99) {
412 partner->isGlowing = 99;
413 }
414 break;
415 case MOVE_MULTIBONK:
416 partner->isGlowing += 2;
417 boostAmount = 1;
418 if (partner->isGlowing >= 99) {
419 partner->isGlowing = 99;
420 }
421 break;
422 }
423
424 x = evt_get_variable(script, *args++);
425 y = evt_get_variable(script, *args++);
426 z = evt_get_variable(script, *args++);
427 fx_stat_change(boostAmount, x, y, z, 1.0f, 60);
428
430 return ApiStatus_DONE2;
431}
432
433API_CALLABLE(N(StopCharge)) {
435
438
439 return ApiStatus_DONE2;
440}
441
442API_CALLABLE(N(StopChargeAndGet)) {
444
446 partner->isGlowing = 0;
447 }
448
449 script->varTable[0] = partner->isGlowing;
450 partner->isGlowing = 0;
452
453 return ApiStatus_DONE2;
454}
455
456API_CALLABLE(N(GetChargeAmount)) {
458
459 script->varTable[0] = battleStatus->partnerActor->isGlowing;
460
461 return ApiStatus_DONE2;
462}
463
464API_CALLABLE(N(PlayChargeFX)) {
465 Bytecode* args = script->ptrReadPos;
466 s32 var1 = evt_get_variable(script, *args++);
467 s32 var2 = evt_get_variable(script, *args++);
468 s32 var3 = evt_get_variable(script, *args++);
470
471 fx_energy_in_out(6, var1, var2, var3, var4, 45);
472
473 return ApiStatus_DONE2;
474}
475
476API_CALLABLE(N(GetChargeMessage)) {
477 if (!N(isCharged)) {
478 script->varTable[0] = BTL_MSG_CHARGE_GOOMBARIO;
479 } else {
481 }
482
483 return ApiStatus_DONE2;
484}
485
486s32 N(DefaultAnims)[] = {
495};
496
497s32 N(DefenseTable)[] = {
500};
501
502s32 N(StatusTable)[] = {
505 STATUS_KEY_SLEEP, 100,
508 STATUS_KEY_DIZZY, 100,
513 STATUS_KEY_STOP, 100,
525};
526
527ActorPartBlueprint N(ActorParts)[] = {
528 {
529 .flags = 0,
530 .index = PRT_MAIN,
531 .posOffset = { 0, 0, 0 },
532 .targetOffset = { 8, 22 },
533 .opacity = 255,
534 .idleAnimations = N(DefaultAnims),
535 .defenseTable = N(DefenseTable),
536 .eventFlags = ACTOR_EVENT_FLAGS_NONE,
537 .elementImmunityFlags = 0,
538 },
539};
540
541ActorBlueprint NAMESPACE = {
542 .flags = 0,
543 .type = ACTOR_TYPE_GOOMBARIO,
544 .level = ACTOR_LEVEL_GOOMBARIO,
545 .maxHP = 99,
546 .partCount = ARRAY_COUNT(N(ActorParts)),
547 .partsData = N(ActorParts),
548 .initScript = &N(EVS_Init),
549 .statusTable = N(StatusTable),
550 .escapeChance = 0,
551 .airLiftChance = 0,
552 .hurricaneChance = 0,
553 .spookChance = 0,
554 .upAndAwayChance = 0,
555 .spinSmashReq = 4,
556 .powerBounceChance = 80,
557 .coinReward = 0,
558 .size = { 29, 26 },
559 .healthBarOffset = { 0, 0 },
560 .statusIconOffset = { -10, 20 },
561 .statusTextOffset = { 10, 20 },
562};
563
564EvtScript N(EVS_Init) = {
565 Call(BindTakeTurn, ACTOR_PARTNER, Ref(N(EVS_TakeTurn)))
566 Call(BindIdle, ACTOR_PARTNER, Ref(N(EVS_Idle)))
567 Call(BindHandleEvent, ACTOR_PARTNER, Ref(N(EVS_HandleEvent)))
569 Return
570 End
571};
572
573EvtScript N(EVS_Idle) = {
574 Return
575 End
576};
577
578EvtScript N(EVS_HandleEvent) = {
594 SetConst(LVar0, PRT_MAIN)
600 Set(LVar2, 12)
606 Set(LVar2, 12)
619 Set(LVar2, 12)
622 Call(N(StopCharge))
626 SetConst(LVar0, PRT_MAIN)
629 Set(LVar3, 0)
634 SetConst(LVar0, PRT_MAIN)
637 Wait(10)
642 Return
643 End
644};
645
646EvtScript N(EVS_TakeTurn) = {
660 Return
661 End
662};
663
665 SetConst(LVar0, PRT_MAIN)
670 Return
671 End
672};
673
676 Call(ShowActionHud, true)
682 Return
686 Return
702 Return
703 End
704};
705
707 Return
708 End
709};
710
712 SetConst(LVar0, PRT_MAIN)
715 Return
716 End
717};
718
728 Return
729 End
730};
731
741 Wait(10)
743 Wait(1)
745 Wait(1)
747 Wait(1)
749 Wait(1)
751 Wait(1)
753 Wait(5)
756 Wait(1)
758 Wait(1)
760 Wait(1)
762 Wait(1)
764 Wait(1)
766 Wait(5)
769 EndIf
771 Return
772 End
773};
774
779 Thread
780 Wait(4)
782 Set(LVar0, 180)
783 Loop(3)
784 Add(LVar0, 60)
786 Wait(1)
787 EndLoop
792 Sub(LVar0, 30)
793 Set(LVar1, 0)
800 Wait(1)
802 Wait(1)
806 Call(AddGoalPos, ACTOR_PARTNER, -10, 0, 0)
811 Wait(1)
813 Wait(1)
816 Wait(2)
822 Return
823 End
824};
825
832 Add(LVar0, 60)
836 Thread
837 Wait(4)
839 Sub(LVar0, 4)
840 Set(LVar1, LVar0)
841 Div(LVar1, 3)
842 IfLt(LVar1, 1)
843 Set(LVar1, 1)
844 EndIf
845 Set(LVar2, LVar1)
846 Mod(LVar2, 2)
847 IfEq(LVar2, 0)
848 Sub(LVar1, 1)
849 EndIf
850 Set(LVar0, 180)
851 Loop(LVar1)
852 Loop(3)
853 Add(LVar0, 60)
855 Wait(1)
856 EndLoop
857 EndLoop
864 Wait(1)
868 Call(AddGoalPos, ACTOR_PARTNER, -20, 0, 0)
872 Wait(1)
873 Call(AddGoalPos, ACTOR_PARTNER, -10, 0, 0)
879 Wait(1)
882 Wait(2)
888 Return
889 End
890};
891
895 Sub(LVar0, 40)
899 Sub(LVar3, Float(70.0))
901 Set(LVar3, LVar0)
902 EndIf
909 Return
910 End
911};
912
918 Sub(LVarB, LVar7)
919 Else
920 Sub(LVar7, LVarB)
921 Set(LVarB, LVar7)
922 EndIf
923 Sub(LVarB, 20)
924 DivF(LVarB, Float(10.588))
925 AddF(LVarB, 15)
926 Set(LVarA, LVarB)
927 Return
928 End
929};
930
938 Wait(5)
940 Wait(1)
949 Call(N(JumpOnTarget), LVarA, 0)
954 Thread
955 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(1.0))
958 Wait(20)
960 Return
961 EndIf
963 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
964 Wait(1)
965 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
966 Wait(1)
967 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
969 Wait(1)
972 CaseGt(0)
974 Add(LVar0, 1)
978 Add(LVar0, 1)
986 Return
992 Thread
994 Wait(5)
1004 Set(LVarA, 24)
1005 Thread
1006 Wait(4)
1007 Set(LVar0, 0)
1008 Loop(6)
1009 Add(LVar0, -30)
1011 Wait(1)
1012 EndLoop
1013 EndThread
1017 Call(N(JumpOnTarget), LVarA, 3)
1019 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1020 Wait(1)
1021 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1022 Wait(1)
1023 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1025 Wait(1)
1027 Add(LVar0, 1)
1032 Return
1033 End
1034};
1035
1043 Wait(5)
1045 Wait(1)
1054 Call(N(JumpOnTarget), LVarA, 0)
1059 Thread
1060 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(1.0))
1061 EndThread
1063 Wait(20)
1065 Return
1066 EndIf
1068 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1069 Wait(1)
1070 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1071 Wait(1)
1072 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1074 Wait(1)
1076 Switch(LVar0)
1077 CaseGt(0)
1079 Add(LVar0, 2)
1083 Add(LVar0, 2)
1085 EndSwitch
1087 Switch(LVar0)
1091 Return
1096 EndSwitch
1097 Thread
1099 Wait(5)
1102 EndThread
1109 Set(LVarA, 24)
1110 Thread
1111 Wait(4)
1112 Set(LVar0, 0)
1113 Loop(6)
1114 Add(LVar0, -30)
1116 Wait(1)
1117 EndLoop
1118 EndThread
1123 Call(N(JumpOnTarget), LVarA, 3)
1126 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1127 Wait(1)
1128 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1129 Wait(1)
1130 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1132 Wait(1)
1134 Add(LVar0, 2)
1139 Return
1140 End
1141};
1142
1150 Wait(5)
1152 Wait(1)
1161 Call(N(JumpOnTarget), LVarA, 0)
1166 Thread
1167 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(1.0))
1168 EndThread
1170 Wait(20)
1172 Return
1173 EndIf
1175 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1176 Wait(1)
1177 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1178 Wait(1)
1179 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1181 Wait(1)
1183 Switch(LVar0)
1184 CaseGt(0)
1186 Add(LVar0, 3)
1190 Add(LVar0, 3)
1192 EndSwitch
1194 Switch(LVar0)
1198 Return
1203 EndSwitch
1204 Thread
1206 Wait(5)
1209 EndThread
1216 Set(LVarA, 24)
1217 Thread
1218 Wait(4)
1219 Set(LVar0, 0)
1220 Loop(6)
1221 Add(LVar0, -30)
1223 Wait(1)
1224 EndLoop
1226 EndThread
1227 Thread
1228 Set(LVar0, 0)
1229 Loop(LVarA)
1230 Add(LVar0, 133)
1232 Wait(1)
1233 EndLoop
1234 EndThread
1239 Call(N(JumpOnTarget), LVarA, 3)
1242 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1243 Wait(1)
1244 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1245 Wait(1)
1246 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1248 Wait(1)
1250 Add(LVar0, 3)
1255 Return
1256 End
1257};
1258
1259s32 N(actionCommandTable)[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
1260
1261s32 N(MultibonkChance) = 200;
1262
1270 Wait(5)
1272 Wait(1)
1281 Call(N(JumpOnTarget), LVarA, 0)
1286 Thread
1287 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(1.0))
1288 EndThread
1290 Wait(20)
1292 Return
1293 EndIf
1295 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1296 Wait(1)
1297 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1298 Wait(1)
1299 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1301 Wait(1)
1303 Switch(LVar0)
1304 CaseGt(0)
1306 Add(LVar0, 3)
1310 Add(LVar0, 3)
1312 EndSwitch
1314 Switch(LVar0)
1318 Return
1323 EndSwitch
1324 Thread
1326 Wait(5)
1329 EndThread
1331 Set(LVarD, 0)
1332 Set(LVarF, 0)
1333 Set(LFlag0, false)
1334 Label(10)
1335 Thread
1337 Wait(5)
1340 EndThread
1345 Set(LVarA, 24)
1346 Switch(LVarF)
1347 CaseEq(0)
1349 CaseEq(1)
1351 CaseEq(2)
1353 CaseEq(3)
1357 EndSwitch
1358 Thread
1359 Wait(4)
1360 Set(LVar0, 0)
1361 Loop(6)
1362 Add(LVar0, -30)
1364 Wait(1)
1365 EndLoop
1367 EndThread
1368 Thread
1369 Set(LVar0, 0)
1370 Loop(LVarA)
1371 Add(LVar0, 133)
1373 Wait(1)
1374 EndLoop
1375 EndThread
1380 Call(N(JumpOnTarget), LVarA, 3)
1382 Sub(LVarD, 1)
1384 IfGe(LVarF, LVar0)
1385 Set(LFlag0, true)
1386 EndIf
1388 Call(SetActorScale, ACTOR_PARTNER, Float(1.1), Float(0.8), Float(1.0))
1389 Wait(1)
1390 Call(SetActorScale, ACTOR_PARTNER, Float(1.3), Float(0.5), Float(1.0))
1391 Wait(1)
1392 Call(SetActorScale, ACTOR_PARTNER, Float(1.0), Float(1.0), Float(1.0))
1394 Wait(1)
1396 Switch(LVar0)
1397 CaseGt(0)
1398 IfEq(LFlag0, false)
1400 Add(LVar0, 3)
1402 Else
1404 Add(LVar0, 3)
1406 EndIf
1409 Add(LVar0, 3)
1411 Set(LFlag0, false)
1412 EndSwitch
1415 Switch(LVar0)
1419 Return
1423 IfEq(LFlag0, true)
1425 Return
1426 EndIf
1428 EndSwitch
1429 Add(LVarF, 1)
1430 Goto(10)
1431 Return
1432 End
1433};
1434
1437 Add(LVar0, 30)
1447 Wait(12)
1451 Call(SetCamViewport, CAM_TATTLE, 137, 95, 138, 99)
1456 Wait(1)
1459 Wait(2)
1462 Wait(10)
1466 Wait(12)
1468 Wait(32)
1478 Return
1479 End
1480};
1481
1484 Wait(10)
1488 Add(LVar1, 15)
1490 Call(N(PlayChargeFX), LVar0, LVar1, LVar2, Float(1.2))
1491 Wait(3)
1492 Call(N(PlayChargeFX), LVar0, LVar1, LVar2, Float(0.8))
1493 Thread
1494 Wait(15)
1496 Add(LVar1, 15)
1497 Add(LVar2, -5)
1500 EndThread
1501 Wait(30)
1507 IfEq(LVar0, 0)
1509 Add(LVar0, 10)
1510 Add(LVar1, 25)
1511 Add(LVar2, 5)
1514 Wait(4)
1522 Switch(LVar2)
1530 EndSwitch
1531 Else
1533 EndIf
1534 Label(0)
1535 Wait(1)
1537 IfEq(LVar0, 1)
1538 Goto(0)
1539 EndIf
1540 Return
1541 End
1542};
BSS s32 PopupMenu_SelectedIndex
@ AC_DIFFICULTY_2
Definition action_cmd.h:44
@ AC_DIFFICULTY_1
Definition action_cmd.h:43
@ AC_DIFFICULTY_3
Definition action_cmd.h:45
@ AC_DIFFICULTY_4
Definition action_cmd.h:46
@ AC_DIFFICULTY_5
Definition action_cmd.h:47
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
s32 bActorTattles[]
ActorState state
s16 targetActorID
s32 b32
Vec3f curPos
Bytecode EvtScript[]
Vec3s pos
Definition demo_api.c:17
#define rand_int
#define clamp_angle
#define atan2
EffectInstanceDataPtr data
Definition effects.h:2605
struct TattleWindowFXData * tattleWindow
Definition effects.h:2572
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3551
@ ACTION_COMMAND_JUMP
Definition enums.h:3507
@ BS_FLAGS1_GOOMBARIO_CHARGED
Definition enums.h:3632
@ BS_FLAGS1_TATTLE_OPEN
Definition enums.h:3600
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3609
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_2000
Definition enums.h:3615
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ BS_FLAGS1_4000
Definition enums.h:3616
@ BTL_MSG_CHARGE_GOOMBARIO_MORE
Definition enums.h:3737
@ BTL_MSG_CANT_CHARGE
Definition enums.h:3708
@ BTL_MSG_CHARGE_GOOMBARIO
Definition enums.h:3736
@ ELEMENT_END
Definition enums.h:2147
@ ELEMENT_NORMAL
Definition enums.h:2148
@ ACTOR_EVENT_FLAGS_NONE
Definition enums.h:3404
@ PHASE_RUN_AWAY_START
Definition enums.h:2093
@ PHASE_EXECUTE_ACTION
Definition enums.h:2091
@ PHASE_CELEBRATE
Definition enums.h:2095
@ PHASE_PLAYER_BEGIN
Definition enums.h:2099
@ PHASE_RUN_AWAY_FAIL
Definition enums.h:2097
@ PHASE_FIRST_STRIKE
Definition enums.h:2092
@ BTL_MENU_TYPE_STAR_POWERS
Definition enums.h:3834
@ BTL_MENU_TYPE_ITEMS
Definition enums.h:3828
@ CAM_UPDATE_NO_INTERP
Definition enums.h:4346
@ 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_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_GOOMBARIO_BONK_FOLLOWUP_2
Definition enums.h:4460
@ BTL_CAM_GOOMBARIO_BONK_FOLLOWUP_1
Definition enums.h:4457
@ BTL_CAM_DEFAULT
Definition enums.h:4409
@ BTL_CAM_PARTNER_MIDAIR
Definition enums.h:4459
@ BTL_CAM_ACTOR
Definition enums.h:4421
@ BTL_CAM_PARTNER_GOOMPA
Definition enums.h:4462
@ BTL_CAM_VIEW_ENEMIES
Definition enums.h:4410
@ BTL_CAM_PARTNER_MISTAKE
Definition enums.h:4458
@ BTL_CAM_PARTNER_APPROACH
Definition enums.h:4454
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2936
@ SUPPRESS_EVENT_BURN_CONTACT
Definition enums.h:2938
@ SOUND_GOOMBARIO_HEADBONK
Definition enums.h:996
@ SOUND_LAND_SOFTLY
Definition enums.h:768
@ SOUND_GOOMBARIO_GATHERING
Definition enums.h:1317
@ SOUND_NO_DAMGE
Definition enums.h:1436
@ SOUND_GROW
Definition enums.h:1438
@ SOUND_TATTLE_WINDOW_OPEN
Definition enums.h:997
@ SOUND_NONE
Definition enums.h:550
@ SOUND_GOOMBARIO_JUMP
Definition enums.h:1325
@ SOUND_TRIP
Definition enums.h:787
@ SOUND_CHARGE_UP
Definition enums.h:1439
@ ACTOR_PLAYER
Definition enums.h:2118
@ ACTOR_PARTNER
Definition enums.h:2119
@ ACTOR_SELF
Definition enums.h:2117
@ ACTOR_FLAG_HALF_HEIGHT
Definition enums.h:3369
@ ACTOR_FLAG_UPSIDE_DOWN
HP bar offset below actor (e.g. Swooper when upside-down).
Definition enums.h:3365
@ ACTOR_BLUR_RESET
Definition enums.h:6006
@ ACTOR_BLUR_ENABLE
Definition enums.h:6005
@ 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
@ CAM_TATTLE
Definition enums.h:1828
@ CAM_BATTLE
Definition enums.h:1827
@ DAMAGE_TYPE_POWER_BOUNCE
Definition enums.h:2904
@ DAMAGE_TYPE_JUMP
Definition enums.h:2892
#define ApiStatus_DONE2
Definition evt.h:119
s32 Bytecode
Definition evt.h:7
#define ApiStatus_DONE1
Definition evt.h:118
#define ApiStatus_BLOCK
Definition evt.h:117
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
f32 fabsf(f32 f)
f32 dist3D(f32 ax, f32 ay, f32 az, f32 bx, f32 by, f32 bz)
Definition 43F0.c:677
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
void add_xz_vec3f(Vec3f *vector, f32 speed, f32 angleDeg)
Definition 190B20.c:871
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 play_movement_dust_effects(s32 var0, f32 xPos, f32 yPos, f32 zPos, f32 angleDeg)
Definition 190B20.c:898
f32 evt_get_float_variable(Evt *script, Bytecode var)
Definition evt.c:1970
f32 sin_rad(f32 x)
Definition 43F0.c:713
void save_tattle_flags(s32)
Definition 181810.c:533
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_RunAwayFail
EvtScript EVS_Partner_SpikeContact
EvtScript EVS_Partner_RunAway
void sfx_play_sound(s32 soundID)
@ GF_Tutorial_SwapTurnOrder
ApiStatus SetCamEnabled(Evt *script, b32 isInitialCall)
ApiStatus SetCamViewport(Evt *script, b32 isInitialCall)
ApiStatus SetCamLookTarget(Evt *script, b32 isInitialCall)
ApiStatus ShakeCam(Evt *script, b32 isInitialCall)
ApiStatus SetNoInterpCamParams(Evt *script, b32 isInitialCall)
ApiStatus SetCamNoDraw(Evt *script, b32 isInitialCall)
ApiStatus SetCamPerspective(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 DivF(VAR, FLOAT_VALUE)
Definition macros.h:387
#define IfGe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR >= RVAR.
Definition macros.h:285
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
Definition macros.h:366
#define AddF(VAR, FLOAT_VALUE)
Definition macros.h:384
#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 End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:214
#define Mod(VAR, INT_VALUE)
Definition macros.h:381
#define Add(VAR, INT_VALUE)
Definition macros.h:377
#define IfFalse(b)
Definition macros.h:650
#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 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 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 Div(VAR, INT_VALUE)
Definition macros.h:380
#define LVar2
Definition macros.h:151
#define DEG_TO_RAD(deg)
Definition macros.h:145
#define EVT_IGNORE_ARG
Definition macros.h:47
#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 LVarD
Definition macros.h:162
#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 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
ActorOffsets bActorOffsets[]
Vec3b tattleCam
Definition battle.h:245
struct Actor * partnerActor
BattleStatus gBattleStatus
Definition battle.cpp:14