Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
bomb.c
Go to the documentation of this file.
1#include "common.h"
2#include "battle/action_cmd.h"
3
4#define NAMESPACE action_command_bomb
5
6extern s32 actionCmdTableBomb[];
7
8// indices into ActionCommandStatus::hudElements for this action command
9enum {
13};
14
15// how much to add to the meter per input if all modifiers are neutral
16#define BASIC_FILL_TICK 940
17#define SUPER_FILL_TICK 800
18#define ULTRA_FILL_TICK 740
19
20s32 N(DrainRateTable)[] = { 0, 25, 50, 75, 75 };
21
22#define GET_DRAIN_RATE(pct) PCT_TO_TABLE_RATE(N(DrainRateTable), pct)
23
24API_CALLABLE(N(init)) {
28
30 battleStatus->actionCmdDifficultyTable = actionCmdTableBomb;
31 battleStatus->actionResult = ACTION_RESULT_NONE;
32
33 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
34 battleStatus->actionQuality = 0;
35 return ApiStatus_DONE2;
36 }
37
39 acs->actionCommandID = ACTION_COMMAND_BOMB;
40 acs->showHud = TRUE;
41 acs->state = AC_STATE_INIT;
42 acs->wrongButtonPressed = FALSE;
43 acs->meterFillLevel = 0;
44 acs->meterFillWidth = 0;
45 acs->isMeterFilled = FALSE;
46 battleStatus->actionQuality = 0;
47
48 acs->hudPosX = -48;
49 acs->hudPosY = 80;
50
52 acs->hudElemIDs[HIDX_BUTTON] = hid;
53 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY);
56
58 acs->hudElemIDs[HIDX_METER] = hid;
59 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
62
64 acs->hudElemIDs[HIDX_100_PCT] = hid;
65 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
68
69 return ApiStatus_DONE2;
70}
71
72API_CALLABLE(N(start)) {
75 Bytecode* args = script->ptrReadPos;
76
77 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
79 return ApiStatus_DONE2;
80 }
81
83
84 acs->prepareTime = evt_get_variable(script, *args++);
85 acs->duration = evt_get_variable(script, *args++);
86 acs->difficulty = evt_get_variable(script, *args++);
87 acs->difficulty = adjust_action_command_difficulty(acs->difficulty);
88 acs->variation = evt_get_variable(script, *args++);
89
90 acs->wrongButtonPressed = FALSE;
91 acs->meterFillLevel = 0;
92 acs->meterFillWidth = 0;
93 battleStatus->actionQuality = 0;
94 battleStatus->actionResult = ACTION_RESULT_NONE;
95 battleStatus->maxActionQuality = acs->mashMeterCutoffs[(acs->mashMeterNumIntervals - 1)];
97 acs->state = AC_STATE_START;
98
100
101 return ApiStatus_DONE2;
102}
103
104void N(update)(void) {
108 s32 cutoff;
109
110 switch (acs->state) {
111 case AC_STATE_INIT:
113 hid = acs->hudElemIDs[HIDX_BUTTON];
115 if (acs->showHud) {
117 }
118
119 hid = acs->hudElemIDs[HIDX_METER];
121 if (acs->showHud) {
123 }
124
125 acs->state = AC_STATE_APPEAR;
126 break;
127 case AC_STATE_APPEAR:
129
130 acs->hudPosX += 20;
131 if (acs->hudPosX > 50) {
132 acs->hudPosX = 50;
133 }
134
135 hud_element_set_render_pos(acs->hudElemIDs[HIDX_BUTTON], acs->hudPosX, acs->hudPosY);
136 hud_element_set_render_pos(acs->hudElemIDs[HIDX_METER], acs->hudPosX, acs->hudPosY + 28);
137 break;
138 case AC_STATE_START:
140
141 if (acs->prepareTime != 0) {
142 acs->prepareTime--;
143 break;
144 }
145
147 acs->meterFillLevel = 0;
148 acs->stateTimer = acs->duration;
150 acs->state = AC_STATE_ACTIVE;
151
152 // fallthrough
153 case AC_STATE_ACTIVE:
155
156 // meter can drain if it hasn't been fully filled
157 if (!acs->isMeterFilled) {
158 cutoff = acs->mashMeterCutoffs[acs->mashMeterNumIntervals];
159 acs->meterFillLevel -= GET_DRAIN_RATE(acs->meterFillLevel / cutoff);
160 if (acs->meterFillLevel < 0) {
161 acs->meterFillLevel = 0;
162 }
163 }
164
165 // check for meter-filling input
166 if (battleStatus->curButtonsPressed & BUTTON_A) {
167 switch (acs->variation) {
168 case ACV_BOMB_BASIC:
169 acs->meterFillLevel += SCALE_BY_PCT(BASIC_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]);
170 break;
171 case ACV_BOMB_SUPER:
172 acs->meterFillLevel += SCALE_BY_PCT(SUPER_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]);
173 break;
174 case ACV_BOMB_ULTRA:
175 acs->meterFillLevel += SCALE_BY_PCT(ULTRA_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]);
176 break;
177 }
178 }
179
180 // handle meter reaching 100%
181 if (acs->meterFillLevel > MAX_MASH_UNITS) {
182 acs->meterFillLevel = MAX_MASH_UNITS;
183 acs->isMeterFilled = TRUE;
184 hid = acs->hudElemIDs[HIDX_100_PCT];
185 hud_element_set_render_pos(hid, acs->hudPosX + 50, acs->hudPosY + 28);
187 }
188
189 battleStatus->actionProgress = acs->meterFillLevel / ONE_PCT_MASH;
191
192 if (acs->stateTimer != 0) {
193 acs->stateTimer--;
194 break;
195 }
196
197 if (acs->meterFillLevel == 0) {
198 battleStatus->actionQuality = AC_QUALITY_FAILED;
199 } else {
200 battleStatus->actionQuality = acs->meterFillLevel / ONE_PCT_MASH;
201 }
202
203 cutoff = acs->mashMeterCutoffs[acs->mashMeterNumIntervals - 1];
204 if (battleStatus->actionQuality > cutoff) {
205 battleStatus->actionResult = ACTION_RESULT_SUCCESS;
206 } else {
208 }
209
210 if (battleStatus->actionQuality == 100) {
211 // only count 100% fill as success for this action command
213 }
214
217 acs->stateTimer = 5;
218 acs->state = AC_STATE_DISPOSE;
219 break;
220 case AC_STATE_DISPOSE:
221 if (acs->stateTimer != 0) {
222 acs->stateTimer--;
223 break;
224 }
226 break;
227 }
228}
229
231
BSS s32 PopupMenu_SelectedIndex
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
#define AC_QUALITY_FAILED
Definition action_cmd.h:66
HudScript HES_AButton
@ AC_STATE_APPEAR
Definition action_cmd.h:35
@ AC_STATE_DISPOSE
Definition action_cmd.h:38
@ AC_STATE_INIT
Definition action_cmd.h:34
@ AC_STATE_ACTIVE
Definition action_cmd.h:37
@ AC_STATE_START
Definition action_cmd.h:36
#define ONE_PCT_MASH
Definition action_cmd.h:69
#define SCALE_BY_PCT(x, pct)
Definition action_cmd.h:77
HudScript HES_BlueMeter
HudScript HES_MashAButton
HudScript HES_100pct
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
#define MAX_MASH_UNITS
Definition action_cmd.h:75
#define ULTRA_FILL_TICK
Definition bomb.c:18
#define GET_DRAIN_RATE(pct)
Definition bomb.c:22
#define SUPER_FILL_TICK
Definition bomb.c:17
#define BASIC_FILL_TICK
Definition bomb.c:16
s32 actionCmdTableBomb[]
Definition action_cmd.c:38
void N update(void)
Definition bomb.c:104
@ HIDX_METER
Definition bomb.c:11
@ HIDX_BUTTON
Definition bomb.c:10
@ HIDX_100_PCT
Definition bomb.c:12
@ ACV_BOMB_ULTRA
Definition bomb.h:20
@ ACV_BOMB_BASIC
Definition bomb.h:18
@ ACV_BOMB_SUPER
Definition bomb.h:19
s32 HudElemID
@ ACTION_COMMAND_BOMB
Definition enums.h:3483
@ BUTTON_A
Definition enums.h:2790
@ SOUND_LOOP_CHARGE_METER
Definition enums.h:1646
@ ACTION_RESULT_NONE
Definition enums.h:1963
@ ACTION_RESULT_METER_NOT_ENOUGH
Definition enums.h:1965
@ ACTION_RESULT_SUCCESS
Definition enums.h:1968
#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)
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.
@ HUD_ELEMENT_FLAG_DISABLED
Definition hud_element.h:72
@ HUD_ELEMENT_FLAG_80
Definition hud_element.h:78
void sfx_stop_sound(s32 soundID)
Definition sfx.c:507
void sfx_adjust_env_sound_params(s32 soundID, u8 volume, u8 pan, s16 pitchShift)
Definition sfx.c:492
void sfx_play_sound_with_params(s32 soundID, u8 volume, u8 pan, s16 pitchShift)
Definition sfx.c:458
#define POPUP_MSG_OFF
Definition battle.h:270
#define POPUP_MSG_ON
Definition battle.h:269
BattleStatus gBattleStatus
Definition battle.c:11
void N init(Npc *bombette)
Definition bombette.c:66