Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
unused_flee.c
Go to the documentation of this file.
1#include "common.h"
2#include "battle/action_cmd.h"
3
12#define NAMESPACE action_command_unused_flee
13
15
16extern s32 actionCmdTable07[];
17
18// indices into ActionCommandStatus::hudElements for this action command
19enum {
23};
24
25// how much to add to the meter per input if all modifiers are neutral
26#define METER_FILL_TICK 600
27
28BSS b32 N(HasStarted);
29
30API_CALLABLE(N(init)) {
32 BattleStatus* battleStatus = &gBattleStatus;
33 Bytecode* args = script->ptrReadPos;
34 HudElemID hid;
35 s32 temp;
36
37 battleStatus->maxActionQuality = 5;
39
40 acs->autoSucceed = FALSE;
42 acs->state = AC_STATE_INIT;
43 acs->wrongButtonPressed = FALSE;
44 acs->meterFillLevel = evt_get_variable(script, *args);
45 acs->hudPosX = -48;
46 acs->meterFillWidth = 0;
47 N(HasStarted) = FALSE;
48 acs->hudPosY = 80;
49
51 acs->hudElemIDs[HIDX_BUTTON] = hid;
55
56 // Weird use of an extra temp settles regalloc here.
57 hid = temp = hud_element_create(&HES_BlueMeter);
58 acs->hudElemIDs[HIDX_METER] = hid;
59 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
62
64 acs->hudElemIDs[HIDX_OK] = hid;
65 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
68
69 battleStatus->flags1 &= ~BS_FLAGS1_FREE_ACTION_COMMAND;
70
71 return ApiStatus_DONE2;
72}
73
74API_CALLABLE(N(start)) {
76 BattleStatus* battleStatus = &gBattleStatus;
77 Bytecode* args = script->ptrReadPos;
78
79 acs->autoSucceed = FALSE;
80 acs->prepareTime = evt_get_variable(script, *args++);
81 acs->duration = evt_get_variable(script, *args++);
82 acs->difficulty = evt_get_variable(script, *args++);
84
85 acs->wrongButtonPressed = FALSE;
86 battleStatus->actionQuality = 0;
87 battleStatus->actionResult = ACTION_RESULT_FAIL;
88
89 battleStatus->flags1 &= ~BS_FLAGS1_FREE_ACTION_COMMAND;
91 acs->state = AC_STATE_START;
92
93 return ApiStatus_DONE2;
94}
95
96void N(update)(void) {
98 BattleStatus* battleStatus = &gBattleStatus;
99 HudElemID hid;
100
101 switch (acs->state) {
102 case AC_STATE_INIT:
104
105 hid = acs->hudElemIDs[HIDX_BUTTON];
106 if (acs->showHud) {
108 }
109 hud_element_set_alpha(hid, 255);
110
111 hid = acs->hudElemIDs[HIDX_METER];
112 hud_element_set_alpha(hid, 255);
113 if (acs->showHud) {
115 }
116
117 hid = acs->hudElemIDs[HIDX_OK];
118 hud_element_set_alpha(hid, 255);
119 if (acs->showHud) {
121 }
122
123 acs->state = AC_STATE_APPEAR;
124 break;
125 case AC_STATE_APPEAR:
127
128 acs->hudPosX += 20;
129 if (acs->hudPosX > 50) {
130 acs->hudPosX = 50;
131 }
132
135 hud_element_set_render_pos(acs->hudElemIDs[HIDX_OK], acs->hudPosX + 31, acs->hudPosY + 14);
136 break;
137 case AC_STATE_START:
139
140 if (acs->prepareTime != 0) {
141 acs->prepareTime--;
142 return;
143 }
144
146 battleStatus->actionQuality = 0;
147 N(HasStarted) = TRUE;
148 acs->flee.drainDelay = 0;
149 acs->state = AC_STATE_ACTIVE;
150 acs->stateTimer = acs->duration;
151
152 // fallthrough
153 case AC_STATE_ACTIVE:
155
156 // check for meter-filling input
157 if (battleStatus->curButtonsPressed & BUTTON_A) {
158 s32 fillAmt = SCALE_BY_PCT(METER_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]);
159
160 if (acs->flee.drainDelay == 0) {
161 acs->meterFillLevel += fillAmt;
162 }
163 }
164
165 // handle meter reaching 100%
166 if (acs->meterFillLevel > MAX_MASH_UNITS) {
168 acs->flee.drainDelay = 3;
169 }
170
171 // meter can reset if mashing stops after it's been fully filled
172 if (acs->flee.drainDelay != 0) {
173 acs->flee.drainDelay--;
174 if (acs->flee.drainDelay == 0) {
175 acs->meterFillLevel = 0;
176 battleStatus->actionQuality++;
177 }
178 }
179
180 battleStatus->actionProgress = acs->meterFillLevel / ONE_PCT_MASH;
181
182 if (acs->stateTimer != 0) {
183 acs->stateTimer--;
184 return;
185 }
187 acs->stateTimer = 5;
188 acs->state = AC_STATE_DISPOSE;
189 break;
190 case AC_STATE_DISPOSE:
191 if (acs->stateTimer != 0) {
192 acs->stateTimer--;
193 return;
194 }
196 break;
197 }
198}
199
200void N(draw)(void) {
202 s32 hudX, hudY;
203 HudElemID hid;
204
206 hid = acs->hudElemIDs[HIDX_METER];
208 hud_element_get_render_pos(hid, &hudX, &hudY);
209
210 if (!N(HasStarted)) {
212 } else {
214 }
215
217}
218
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
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
#define MAX_MASH_UNITS
Definition action_cmd.h:75
s32 HudElemID
s32 b32
@ ACTION_COMMAND_UNUSED_FLEE
Definition enums.h:3479
@ BUTTON_A
Definition enums.h:2790
@ 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_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
#define POPUP_MSG_OFF
Definition battle.h:270
#define POPUP_MSG_ON
Definition battle.h:269
s32 * actionCmdDifficultyTable
#define METER_FILL_TICK
Definition unused_flee.c:26
s32 actionCmdTable07[]
Definition action_cmd.c:34
void N free(void)
void btl_message_unlock_box_pos(void)
void N update(void)
Definition unused_flee.c:96
void N draw(void)
@ HIDX_METER
Definition unused_flee.c:21
@ HIDX_BUTTON
Definition unused_flee.c:20
@ HIDX_OK
Definition unused_flee.c:22
BattleStatus gBattleStatus
Definition battle.c:11
void N init(Npc *bombette)
Definition bombette.c:66