Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
three_chances.c
Go to the documentation of this file.
1#include "common.h"
2#include "battle/action_cmd.h"
3#include "include_asset.h"
4
5#define NAMESPACE action_command_three_chances
6
7extern s32 actionCmdTableWaterBlock[][2];
8
9// indices into ActionCommandStatus::hudElements for this action command
10enum {
16 HIDX_05 = 5, // unused 4th light
20 HIDX_09 = 9, // unused rating for 4th light
25};
26
27// states for this action command
28enum {
29 THREE_CHANCES_STATE_INIT = 0, // create hud elements
30 THREE_CHANCES_STATE_APPEAR = 1, // hud elements move into position
31 THREE_CHANCES_STATE_START = 10, // begin the input-checking phase
32 THREE_CHANCES_STATE_PREFACE = 11, // first two ticks light up
33 THREE_CHANCES_STATE_FIRST_CHANCE = 12, // first window to match timing
34 THREE_CHANCES_STATE_SECOND_CHANCE = 13, // second window to match timing
35 THREE_CHANCES_STATE_THIRD_CHANCE = 14, // third window to match timing
36 THREE_CHANCES_STATE_UNUSED_CHANCE = 15, // unimplemented fourth chance to match timing
37 THREE_CHANCES_STATE_WRAPUP = 16, // tally overall success
38 THREE_CHANCES_STATE_DISPOSE = 17, // delay and disappear
39};
40
41// input window before the light appears where A inputs cause timing test to fail
42#define ANTI_MASH_TIME 5
43
44INCLUDE_IMG("battle/action_cmd/three_chances_1.png", battle_action_cmd_three_chances_1_png);
45INCLUDE_PAL("battle/action_cmd/three_chances_1.pal", battle_action_cmd_three_chances_1_pal);
46
47INCLUDE_IMG("battle/action_cmd/three_chances_2.png", battle_action_cmd_three_chances_2_png);
48INCLUDE_PAL("battle/action_cmd/three_chances_2.pal", battle_action_cmd_three_chances_2_pal);
49
50INCLUDE_IMG("battle/action_cmd/three_chances_3.png", battle_action_cmd_three_chances_3_png);
51INCLUDE_PAL("battle/action_cmd/three_chances_3.pal", battle_action_cmd_three_chances_3_pal);
52
53INCLUDE_IMG("battle/action_cmd/three_chances_0.png", battle_action_cmd_three_chances_0_png);
54INCLUDE_PAL("battle/action_cmd/three_chances_0.pal", battle_action_cmd_three_chances_0_pal);
55
56INCLUDE_IMG("battle/action_cmd/three_chances_block.png", battle_action_cmd_three_chances_block_png);
57INCLUDE_PAL("battle/action_cmd/three_chances_block.pal", battle_action_cmd_three_chances_block_pal);
58
59INCLUDE_IMG("battle/action_cmd/three_chances_circle.png", battle_action_cmd_three_chances_circle_png);
60INCLUDE_PAL("battle/action_cmd/three_chances_circle.pal", battle_action_cmd_three_chances_circle_pal);
61
62INCLUDE_IMG("battle/action_cmd/three_chances_cloud.png", battle_action_cmd_three_chances_cloud_png);
63INCLUDE_PAL("battle/action_cmd/three_chances_cloud.pal", battle_action_cmd_three_chances_cloud_pal);
64
65INCLUDE_IMG("battle/action_cmd/three_chances_4.png", battle_action_cmd_three_chances_4_png);
66INCLUDE_PAL("battle/action_cmd/three_chances_4.pal", battle_action_cmd_three_chances_4_pal);
67
68HudScript HES_Digit1 = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_1, 24, 24);
69HudScript HES_Digit2 = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_2, 24, 24);
70HudScript HES_Digit3 = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_3, 24, 24);
71HudScript HES_Digit0 = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_0, 24, 24);
72HudScript HES_Digit4 = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_4, 24, 24);
73
74HudScript HES_WaterBlock = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_block, 32, 32);
75HudScript HES_TurboCharge = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_circle, 40, 40);
76HudScript HES_CloudNine = HES_TEMPLATE_CI_ENUM_SIZE(battle_action_cmd_three_chances_cloud, 40, 40);
77
90
91API_CALLABLE(N(init)) {
93 BattleStatus* battleStatus = &gBattleStatus;
94 Bytecode* args = script->ptrReadPos;
95 HudElemID hid;
96
97 battleStatus->maxActionQuality = 5;
99
100 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
101 battleStatus->actionQuality = 0;
102 return ApiStatus_DONE2;
103 }
104
106
109 acs->wrongButtonPressed = FALSE;
110 acs->meterFillLevel = 0;
111 acs->meterFillWidth = 0;
112 acs->variation = evt_get_variable(script, *args++);
113 battleStatus->actionProgress = 1;
114 acs->hudPrepareTime = 30;
115 acs->hudPosX = -48;
116 acs->hudPosY = 80;
117
119 acs->hudElemIDs[HIDX_BUTTON] = hid;
123
125 acs->hudElemIDs[HIDX_FRAME] = hid;
126 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
129
131 acs->hudElemIDs[HIDX_LIGHT_1] = hid;
132 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
135
137 acs->hudElemIDs[HIDX_LIGHT_2] = hid;
138 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
141
143 acs->hudElemIDs[HIDX_LIGHT_3] = hid;
144 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
147
149 acs->hudElemIDs[HIDX_RATING_1] = hid;
153
155 acs->hudElemIDs[HIDX_RATING_2] = hid;
159
161 acs->hudElemIDs[HIDX_RATING_3] = hid;
165
168
171
173 acs->hudElemIDs[HIDX_TICK_2] = hid;
175
176 switch (acs->variation) {
179 hid = acs->hudElemIDs[HIDX_BUFF_ICON];
180 break;
183 hid = acs->hudElemIDs[HIDX_BUFF_ICON];
184 break;
187 hid = acs->hudElemIDs[HIDX_BUFF_ICON];
188 break;
189 }
190
192 return ApiStatus_DONE2;
193}
194
195API_CALLABLE(N(start)) {
197 BattleStatus* battleStatus = &gBattleStatus;
198 Bytecode* args = script->ptrReadPos;
199
200 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
201 battleStatus->actionQuality = 0;
202 return ApiStatus_DONE2;
203 }
204
206
207 acs->prepareTime = evt_get_variable(script, *args++);
208 acs->duration = evt_get_variable(script, *args++);
209 acs->difficulty = evt_get_variable(script, *args++);
211
212 acs->wrongButtonPressed = FALSE;
213 acs->meterFillLevel = 0;
214 acs->meterFillWidth = 0;
215 battleStatus->actionProgress = 1;
216 battleStatus->actionQuality = 0;
217 battleStatus->actionResult = ACTION_RESULT_FAIL;
218 acs->state = 10;
219 battleStatus->flags1 &= ~BS_FLAGS1_FREE_ACTION_COMMAND;
220
222
223 return ApiStatus_DONE2;
224}
225
226void N(update)(void) {
228 BattleStatus* battleStatus = &gBattleStatus;
229 s32 pos;
230 s32 i;
231 s32 window;
232 HudElemID hid;
233
234 switch (acs->state) {
237 hid = acs->hudElemIDs[HIDX_BUTTON];
238 if (acs->showHud) {
240 }
241 hud_element_set_alpha(hid, 255);
242 hid = acs->hudElemIDs[HIDX_FRAME];
243 hud_element_set_alpha(hid, 255);
244 if (acs->showHud) {
246 }
247 hid = acs->hudElemIDs[HIDX_LIGHT_1];
248 hud_element_set_alpha(hid, 255);
249 if (acs->showHud) {
251 }
252 hid = acs->hudElemIDs[HIDX_LIGHT_2];
253 hud_element_set_alpha(hid, 255);
254 if (acs->showHud) {
256 }
257 hid = acs->hudElemIDs[HIDX_LIGHT_3];
258 hud_element_set_alpha(hid, 255);
259 if (acs->showHud) {
261 }
262 hid = acs->hudElemIDs[HIDX_DIGIT];
263 hud_element_set_alpha(hid, 255);
264 if (acs->showHud) {
266 }
267 hid = acs->hudElemIDs[HIDX_TICK_1];
268 hud_element_set_alpha(hid, 255);
269 if (acs->showHud) {
271 }
272 hid = acs->hudElemIDs[HIDX_TICK_2];
273 hud_element_set_alpha(hid, 255);
274 if (acs->showHud) {
276 }
277 hid = acs->hudElemIDs[HIDX_BUFF_ICON];
278 hud_element_set_alpha(hid, 255);
279 if (acs->showHud) {
281 }
283 break;
286 if (acs->hudPrepareTime != 0) {
287 acs->hudPrepareTime--;
288 return;
289 }
290 acs->hudPosX += 20;
291 if (acs->hudPosX > 50) {
292 acs->hudPosX = 50;
293 }
299
300 hid = acs->hudElemIDs[HIDX_DIGIT];
301 switch (acs->variation) {
303 hud_element_set_render_pos(hid, acs->hudPosX + 91, acs->hudPosY + 7);
304 break;
306 hud_element_set_render_pos(hid, acs->hudPosX + 91, acs->hudPosY + 13);
307 break;
309 hud_element_set_render_pos(hid, acs->hudPosX + 91, acs->hudPosY + 13);
310 break;
311 }
312
316 break;
319 if (acs->prepareTime != 0) {
320 acs->prepareTime--;
321 return;
322 }
323
324 acs->stateTimer = acs->duration - 60;
325 if (acs->stateTimer < 42) {
326 acs->stateTimer = 42;
327 }
329
330 // fallthrough
333
334 // first two minor ticks
335 if (acs->stateTimer == 42) {
338 }
339 if (acs->stateTimer == 22) {
342 }
343
344 // activate the first light
345 if (acs->stateTimer == 2) {
349 }
350
351 acs->stateTimer--;
352
353 // prepare to listen for input
354 if (acs->stateTimer == 0) {
355 acs->stateTimer = 20;
356 acs->threeChances.time = 0;
358 acs->threeChances.hadCorrectTiming = FALSE;
359 acs->wrongButtonPressed = FALSE;
360 }
361 break;
364 // in this state, test for input during the first six frames (threeChances.time >= -5), then display
365 // a verdict and wait until the full 20 frame state lifetime is complete before beginning the next one.
366
367 // first six frames, if no input has been received
368 if (!(acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
369 && acs->threeChances.time >= -5
370 ) {
371 s32 (*difficultyVec)[2] = (s32 (*)[2])battleStatus->actionCmdDifficultyTable;
372 window = difficultyVec[acs->difficulty][0] + difficultyVec[acs->difficulty][1] + ANTI_MASH_TIME;
373 pos = battleStatus->inputBufferPos;
374 pos -= window;
375 if (pos < 0) {
376 pos += ARRAY_COUNT(battleStatus->pushInputBuffer);
377 }
378 if (window == 0) {
379 window = 1;
380 }
381 // iterate through last N inputs looking for button presses
382 for (i = 0; i < window; pos++, i++) {
383 if (pos >= ARRAY_COUNT(battleStatus->pushInputBuffer)) {
384 pos -= ARRAY_COUNT(battleStatus->pushInputBuffer);
385 }
386
387 if (i < ANTI_MASH_TIME && (battleStatus->pushInputBuffer[pos] & BUTTON_A)) {
388 acs->wrongButtonPressed = TRUE;
389 }
390
391 if (((battleStatus->pushInputBuffer[pos] & BUTTON_A) && !acs->wrongButtonPressed) || acs->autoSucceed) {
392 acs->threeChances.hadCorrectTiming = TRUE;
393 battleStatus->actionProgress++;
394 break;
395 }
396 }
397 }
398
399 // if an input is received, show an early verdict
400 if ((acs->threeChances.time > -5)
401 && (acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
402 ) {
403 hid = acs->hudElemIDs[HIDX_RATING_1];
404 if (acs->threeChances.hadCorrectTiming) {
406 } else {
408 }
409 hud_element_set_render_pos(hid, acs->hudPosX + 28, acs->hudPosY + 38);
411 }
412
413 // after six frames, show the verdict
414 if (acs->threeChances.time == -5) {
415 hid = acs->hudElemIDs[HIDX_RATING_1];
416 if (acs->threeChances.hadCorrectTiming) {
418 } else {
420 }
421 hud_element_set_render_pos(hid, acs->hudPosX + 28, acs->hudPosY + 38);
424 }
425
426 acs->threeChances.time--;
427
428 // activate the second light just before the next state begins
429 if (acs->stateTimer == 2) {
433 }
434
435 acs->stateTimer--;
436
437 if (acs->stateTimer == 0) {
438 acs->stateTimer = 20;
439 acs->threeChances.time = 0;
441 acs->threeChances.hadCorrectTiming = FALSE;
442 acs->wrongButtonPressed = FALSE;
443 }
444 break;
447 // in this state, test for input during the first six frames (threeChances.time >= -5), then display
448 // a verdict and wait until the full 20 frame state lifetime is complete before beginning the next one.
449
450 // first six frames, if no input has been received
451 if (!(acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
452 && acs->threeChances.time >= -5
453 ) {
454 s32 (*difficultyVec)[2] = (s32 (*)[2])battleStatus->actionCmdDifficultyTable;
455 window = difficultyVec[acs->difficulty][0] + difficultyVec[acs->difficulty][1] + ANTI_MASH_TIME - 1;
456 if (window < 6) {
457 window = 6;
458 }
459 pos = battleStatus->inputBufferPos;
460 pos -= window;
461 if (pos < 0) {
462 pos += ARRAY_COUNT(battleStatus->pushInputBuffer);
463 }
464 if (window == 0) {
465 window = 1;
466 }
467 // iterate through last N inputs looking for button presses
468 for (i = 0; i < window; pos++, i++) {
469 if (pos >= ARRAY_COUNT(battleStatus->pushInputBuffer)) {
470 pos -= ARRAY_COUNT(battleStatus->pushInputBuffer);
471 }
472
473 if (i < ANTI_MASH_TIME) {
474 if (battleStatus->pushInputBuffer[pos] & BUTTON_A) {
475 acs->wrongButtonPressed = TRUE;
476 }
477 }
478
479 if (((battleStatus->pushInputBuffer[pos] & BUTTON_A) && !acs->wrongButtonPressed) || acs->autoSucceed) {
480 acs->threeChances.hadCorrectTiming = TRUE;
481 battleStatus->actionProgress++;
482 break;
483 }
484 }
485 }
486
487 // if an input is received, show an early verdict
488 if ((acs->threeChances.time > -5)
489 && (acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
490 ) {
491 hid = acs->hudElemIDs[HIDX_RATING_2];
492 if (acs->threeChances.hadCorrectTiming) {
494 } else {
496 }
497 hud_element_set_render_pos(hid, acs->hudPosX + 48, acs->hudPosY + 38);
499 }
500
501 // after six frames, show the verdict
502 if (acs->threeChances.time == -5) {
503 hid = acs->hudElemIDs[HIDX_RATING_2];
504 if (acs->threeChances.hadCorrectTiming) {
506 } else {
508 }
509 hud_element_set_render_pos(hid, acs->hudPosX + 48, acs->hudPosY + 38);
512 }
513
514 acs->threeChances.time--;
515
516 // activate the third light just before the next state begins
517 if (acs->stateTimer == 2) {
521 }
522
523 acs->stateTimer--;
524
525 if (acs->stateTimer == 0) {
526 acs->stateTimer = 20;
527 acs->threeChances.time = 0;
529 acs->threeChances.hadCorrectTiming = FALSE;
530 acs->wrongButtonPressed = FALSE;
531 }
532 break;
535 // in this state, test for input during the first six frames (threeChances.time >= -5), then display
536 // a verdict and begin wrapping up the action command.
537
538 // first six frames, if no input has been received
539 if (!(acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
540 && acs->threeChances.time >= -5
541 ) {
542 s32 (*difficultyVec)[2] = (s32 (*)[2])battleStatus->actionCmdDifficultyTable;
543 window = difficultyVec[acs->difficulty][0] + difficultyVec[acs->difficulty][1] + ANTI_MASH_TIME - 2;
544 if (window < 6) {
545 window = 6;
546 }
547 pos = battleStatus->inputBufferPos;
548 pos -= window;
549 if (pos < 0) {
550 pos += ARRAY_COUNT(battleStatus->pushInputBuffer);
551 }
552 if (window == 0) {
553 window = 1;
554 }
555 // iterate through last N inputs looking for button presses
556 for (i = 0; i < window; pos++, i++) {
557 if (pos >= ARRAY_COUNT(battleStatus->pushInputBuffer)) {
558 pos -= ARRAY_COUNT(battleStatus->pushInputBuffer);
559 }
560
561 if (i < ANTI_MASH_TIME) {
562 if (battleStatus->pushInputBuffer[pos] & BUTTON_A) {
563 acs->wrongButtonPressed = TRUE;
564 }
565 }
566
567 if (((battleStatus->pushInputBuffer[pos] & BUTTON_A) && !acs->wrongButtonPressed) ||
568 acs->autoSucceed) {
569 acs->threeChances.hadCorrectTiming = TRUE;
570 battleStatus->actionProgress++;
571 break;
572 }
573 }
574 }
575
576 // if an input is received, show an early verdict
577 if ((acs->threeChances.time > -5)
578 && (acs->wrongButtonPressed || acs->threeChances.hadCorrectTiming)
579 ) {
580 hid = acs->hudElemIDs[HIDX_RATING_3];
581 if (acs->threeChances.hadCorrectTiming) {
583 } else {
585 }
586 hud_element_set_render_pos(hid, acs->hudPosX + 68, acs->hudPosY + 38);
588 }
589
590 // after six frames, show the verdict
591 if (acs->threeChances.time == -5) {
592 hid = acs->hudElemIDs[HIDX_RATING_3];
593 if (acs->threeChances.hadCorrectTiming) {
595 } else {
597 }
598 hud_element_set_render_pos(hid, acs->hudPosX + 68, acs->hudPosY + 38);
602 return;
603 }
604
605 acs->threeChances.time--;
606 break;
608 if (battleStatus->actionProgress == 0) {
609 battleStatus->actionQuality = AC_QUALITY_FAILED;
610 } else {
611 battleStatus->actionQuality = battleStatus->actionProgress;
612 }
613 battleStatus->actionResult = ACTION_RESULT_SUCCESS;
614 if (battleStatus->actionQuality == 3) {
616 }
618 acs->stateTimer = 5;
620 break;
622 if (acs->stateTimer != 0) {
623 acs->stateTimer--;
624 return;
625 }
627 break;
628 }
629}
630
655
BSS ActionCommandStatus gActionCommandStatus
Definition action_cmd.c:91
void action_command_free(void)
Definition action_cmd.c:446
void increment_action_command_attempt_count(void)
Definition action_cmd.c:641
s32 adjust_action_command_difficulty(s32 difficultyLevel)
Definition action_cmd.c:101
void increment_action_command_success_count(void)
Definition action_cmd.c:655
void action_command_init_status(void)
Definition action_cmd.c:256
HudScript HES_TimingCharge3
#define AC_QUALITY_FAILED
Definition action_cmd.h:66
HudScript HES_AButton
HudElemID hudElemIDs[16]
Definition action_cmd.h:83
HudScript HES_TimingReady
HudScript HES_TimingOK
HudScript HES_TimingCharge4b
HudScript HES_TimingBar3Chances
HudScript HES_TimingWait
HudScript HES_TimingCharge4c
HudScript HES_AButtonDown
HudScript HES_TimingMiss
HudScript HES_TimingCharge2
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
s32 HudElemID
Vec3s pos
Definition demo_api.c:17
@ ACTION_COMMAND_THREE_CHANCES
Definition enums.h:3494
@ BUTTON_A
Definition enums.h:2790
@ SOUND_TIMING_BAR_TICK
Definition enums.h:952
@ SOUND_TIMING_BAR_GO
Definition enums.h:953
@ ACTION_RESULT_SUCCESS
Definition enums.h:1968
@ ACTION_RESULT_FAIL
Definition enums.h:1967
#define ApiStatus_DONE2
Definition evt.h:118
s32 Bytecode
Definition evt.h:7
void btl_set_popup_duration(s32 duration)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
void hud_element_set_alpha(s32 id, s32 opacity)
void hud_element_set_script(s32 id, HudScript *anim)
void hud_element_set_render_depth(s32 id, s32 z)
HudScript * hud_element_get_script(s32 id)
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_set_flags(s32 id, s32 flags)
Turns on the given flags.
void hud_element_clear_flags(s32 id, s32 flags)
Turns off the given flags.
void hud_element_draw_clipped(s32 id)
void hud_element_free(s32 id)
@ HUD_ELEMENT_FLAG_DISABLED
Definition hud_element.h:72
@ HUD_ELEMENT_FLAG_80
Definition hud_element.h:78
#define HES_TEMPLATE_CI_ENUM_SIZE(name, sizeX, sizeY)
Basic HudScript used for static CI images, setting size with hs_SetTileSize.
s32 HudScript[]
Definition hud_element.h:9
#define INCLUDE_PAL(FILENAME, SYMBOLNAME)
#define INCLUDE_IMG(FILENAME, SYMBOLNAME)
void sfx_play_sound(s32 soundID)
Definition sfx.c:517
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define POPUP_MSG_OFF
Definition battle.h:270
#define POPUP_MSG_ON
Definition battle.h:269
s32 * actionCmdDifficultyTable
s32 pushInputBuffer[64]
#define ANTI_MASH_TIME
HudScript HES_CloudNine
HudScript HES_WaterBlock
HudScript HES_Digit4
@ HIDX_09
@ HIDX_BUTTON
@ HIDX_LIGHT_2
@ HIDX_TICK_1
@ HIDX_LIGHT_1
@ HIDX_FRAME
@ HIDX_RATING_2
@ HIDX_RATING_1
@ HIDX_BUFF_ICON
@ HIDX_TICK_2
@ HIDX_RATING_3
@ HIDX_DIGIT
@ HIDX_05
@ HIDX_LIGHT_3
HudScript HES_Digit2
s32 actionCmdTableWaterBlock[][2]
Definition action_cmd.c:49
HudScript HES_TurboCharge
HudScript * DigitScripts[]
void N free(void)
@ THREE_CHANCES_STATE_SECOND_CHANCE
@ THREE_CHANCES_STATE_DISPOSE
@ THREE_CHANCES_STATE_UNUSED_CHANCE
@ THREE_CHANCES_STATE_WRAPUP
@ THREE_CHANCES_STATE_PREFACE
@ THREE_CHANCES_STATE_THIRD_CHANCE
@ THREE_CHANCES_STATE_FIRST_CHANCE
@ THREE_CHANCES_STATE_INIT
@ THREE_CHANCES_STATE_START
@ THREE_CHANCES_STATE_APPEAR
HudScript HES_Digit3
HudScript HES_Digit1
HudScript HES_Digit0
void N update(void)
void N draw(void)
@ ACV_THREE_CHANCES_CLOUD_NINE
@ ACV_THREE_CHANCES_TURBO_CHARGE
@ ACV_THREE_CHANCES_WATER_BLOCK
BattleStatus gBattleStatus
Definition battle.c:11
void N init(Npc *bombette)
Definition bombette.c:66