Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
flee.c
Go to the documentation of this file.
1#include "common.h"
2#include "battle/action_cmd.h"
3
4#define NAMESPACE action_command_flee
5
6extern s32 actionCmdTableFlee[];
7
8// indices into ActionCommandStatus::hudElements for this action command
9enum {
15};
16
17// how much to add to the meter per input if all modifiers are neutral
18#define METER_FILL_RATE 180
19
20BSS b32 N(HasStarted);
21
22API_CALLABLE(N(init)) {
24 BattleStatus* battleStatus = &gBattleStatus;
25 Bytecode* args = script->ptrReadPos;
26 s32 offsetX;
27 HudElemID hid;
28
29 battleStatus->maxActionQuality = 0;
31 battleStatus->actionResult = ACTION_RESULT_NONE;
32
34
35 acs->escapeChance = evt_get_variable(script, *args++);
36
38 acs->state = AC_STATE_INIT;
39 acs->wrongButtonPressed = FALSE;
40 acs->meterFillLevel = acs->escapeChance * 100;
41 acs->escapeThreshold = rand_int(50);
42 acs->meterFillWidth = 0;
43 acs->flee.dir = 1;
44 acs->escapeChance = rand_int(1);
45 acs->isMeterFilled = FALSE;
46 battleStatus->actionQuality = 0;
47 N(HasStarted) = FALSE;
48 acs->hudPosX = -48;
49 acs->hudPosY = 80;
50
52 acs->hudElemIDs[HIDX_BUTTON] = hid;
56
58 acs->hudElemIDs[HIDX_METER] = hid;
59 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
62
64 acs->hudElemIDs[HIDX_RUN_AWAY] = hid;
65 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
68
70 acs->hudElemIDs[HIDX_OK] = hid;
71 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
74
75 offsetX = 29 - ((100 - acs->escapeThreshold) * 60) / 100;
76 hud_element_set_render_pos(acs->hudElemIDs[HIDX_OK], acs->hudPosX - offsetX, acs->hudPosY + 17);
77 hud_element_set_render_pos(acs->hudElemIDs[HIDX_RUN_AWAY], acs->hudPosX - offsetX, acs->hudPosY - 1);
78
80 acs->hudElemIDs[HIDX_100_PCT] = hid;
81 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
84
85 return ApiStatus_DONE2;
86}
87
88API_CALLABLE(N(start)) {
90 BattleStatus* battleStatus = &gBattleStatus;
91 Bytecode* args = script->ptrReadPos;
92
94
95 acs->prepareTime = evt_get_variable(script, *args++);
96 acs->duration = evt_get_variable(script, *args++);
97 acs->difficulty = evt_get_variable(script, *args++);
99
100 acs->wrongButtonPressed = FALSE;
101 battleStatus->actionQuality = 0;
102 battleStatus->actionResult = ACTION_RESULT_NONE;
103 battleStatus->maxActionQuality = acs->mashMeterCutoffs[acs->mashMeterNumIntervals - 1];
104 battleStatus->flags1 &= ~BS_FLAGS1_FREE_ACTION_COMMAND;
105 acs->state = AC_STATE_START;
106
107 return ApiStatus_DONE2;
108}
109
110void N(update)(void) {
111 BattleStatus* battleStatus = &gBattleStatus;
113 HudElemID hid;
114 s32 escapeDelta;
115
116 switch (acs->state) {
117 case AC_STATE_INIT:
118 hid = acs->hudElemIDs[HIDX_BUTTON];
119 hud_element_set_alpha(hid, 255);
120 if (acs->showHud) {
122 }
123
124 hid = acs->hudElemIDs[HIDX_METER];
125 hud_element_set_alpha(hid, 255);
126 if (acs->showHud) {
128 }
129
130 hid = acs->hudElemIDs[HIDX_RUN_AWAY];
131 hud_element_set_alpha(hid, 255);
132 if (acs->showHud) {
134 }
135
136 hid = acs->hudElemIDs[HIDX_OK];
137 hud_element_set_alpha(hid, 255);
138 if (acs->showHud) {
140 }
141
142 acs->state = AC_STATE_APPEAR;
143 break;
144 case AC_STATE_APPEAR:
145 acs->hudPosX += 20;
146 if (acs->hudPosX > 50) {
147 acs->hudPosX = 50;
148 }
151 break;
152 case AC_STATE_START:
153 if (acs->prepareTime != 0) {
154 acs->prepareTime--;
155 break;
156 }
157
159 N(HasStarted) = TRUE;
160 acs->state = AC_STATE_ACTIVE;
161 acs->stateTimer = acs->duration;
162
163 // fallthrough
164 case AC_STATE_ACTIVE:
165 // check for meter-filling input
166 if (battleStatus->actionCommandMode != AC_MODE_NOT_LEARNED && (battleStatus->curButtonsPressed & BUTTON_A)) {
168 }
169
170 // handle meter reaching 100%
171 if (acs->meterFillLevel >= MAX_MASH_UNITS) {
173 acs->isMeterFilled = TRUE;
174 hid = acs->hudElemIDs[HIDX_100_PCT];
175 hud_element_set_render_pos(hid, acs->hudPosX + 50, acs->hudPosY + 28);
177 }
178
179 battleStatus->actionQuality = acs->meterFillLevel / ONE_PCT_MASH;
180
181 if (acs->stateTimer != 0) {
182 acs->stateTimer--;
183 break;
184 }
185
186 if (battleStatus->actionQuality >= (100 - acs->escapeThreshold)) {
187 battleStatus->actionResult = ACTION_RESULT_SUCCESS;
188 battleStatus->actionQuality = 1;
189 } else {
191 battleStatus->actionQuality = AC_QUALITY_FAILED;
192 }
193
194 acs->stateTimer = 20;
195 acs->state = AC_STATE_DISPOSE;
196 break;
197 case AC_STATE_DISPOSE:
198 if (acs->stateTimer != 0) {
199 acs->stateTimer--;
200 break;
201 }
203 break;
204 }
205
206 // update the position of the 'OK' tick
207 switch (acs->state) {
208 case AC_STATE_APPEAR:
209 case AC_STATE_START:
210 case AC_STATE_ACTIVE:
211 escapeDelta = acs->escapeChance == 0 ? 7 : 8;
212 if (acs->flee.dir == 0) {
213 acs->escapeThreshold += escapeDelta;
214 if (acs->escapeThreshold >= 100) {
215 acs->escapeThreshold = 100;
216 acs->flee.dir = 1;
217 }
218 } else {
219 acs->escapeThreshold -= escapeDelta;
220 if (acs->escapeThreshold <= 0) {
221 acs->escapeThreshold = 0;
222 acs->flee.dir = 0;
223 }
224 }
225 break;
226 }
227}
228
229void N(draw)(void) {
230 BattleStatus* battleStatus = &gBattleStatus;
232 s32 hudX, hudY;
233 HudElemID hid;
234
235 // equivalent to 60 * acs->escapeThreshold / 100
236 hudX = 60 - ((100 - acs->escapeThreshold) * 60 / 100);
237
238 hud_element_set_render_pos(acs->hudElemIDs[HIDX_OK], acs->hudPosX + 31 - hudX, acs->hudPosY + 17);
239 hud_element_set_render_pos(acs->hudElemIDs[HIDX_RUN_AWAY], acs->hudPosX + 31 - hudX, acs->hudPosY - 1);
240
241 if (battleStatus->actionCommandMode != AC_MODE_NOT_LEARNED) {
243 }
244
245 hid = acs->hudElemIDs[HIDX_METER];
247 hud_element_get_render_pos(hid, &hudX, &hudY);
248
249 if (!N(HasStarted)) {
251 } else if (!acs->isMeterFilled) {
253 } else {
255 }
256
260}
261
BSS ActionCommandStatus gActionCommandStatus
Definition action_cmd.c:91
void action_command_free(void)
Definition action_cmd.c:446
void draw_mash_meter_multicolor_with_divisor(s32 posX, s32 posY, s32 fillValue, s32 divisor)
Definition action_cmd.c:231
s32 adjust_action_command_difficulty(s32 difficultyLevel)
Definition action_cmd.c:101
void draw_mash_meter_blink(s32 posX, s32 posY, s32 fillValue)
Definition action_cmd.c:246
void action_command_init_status(void)
Definition action_cmd.c:256
#define AC_QUALITY_FAILED
Definition action_cmd.h:66
HudScript HES_AButton
HudElemID hudElemIDs[16]
Definition action_cmd.h:83
@ 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_RunAwayOK
HudScript HES_MashAButton
HudScript HES_100pct
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
HudScript HES_RunningAway
#define MAX_MASH_UNITS
Definition action_cmd.h:75
s32 HudElemID
s32 b32
#define rand_int
@ ACTION_COMMAND_FLEE
Definition enums.h:3475
@ BUTTON_A
Definition enums.h:2790
@ 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
s32 actionCmdTableFlee[]
Definition action_cmd.c:30
#define METER_FILL_RATE
Definition flee.c:18
void N free(void)
Definition flee.c:262
void N update(void)
Definition flee.c:110
void N draw(void)
Definition flee.c:229
@ HIDX_RUN_AWAY
Definition flee.c:12
@ HIDX_METER
Definition flee.c:11
@ HIDX_BUTTON
Definition flee.c:10
@ HIDX_OK
Definition flee.c:13
@ HIDX_100_PCT
Definition flee.c:14
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
void hud_element_get_render_pos(s32 id, s32 *x, s32 *y)
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.
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 BSS
Definition macros.h:7
s32 * actionCmdDifficultyTable
BattleStatus gBattleStatus
Definition battle.c:11
void N init(Npc *bombette)
Definition bombette.c:66