Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
stop_leech.c
Go to the documentation of this file.
1#include "common.h"
2#include "battle/action_cmd.h"
3
9#define NAMESPACE action_command_stop_leech
10
11extern s32 actionCmdTableStopLeech[];
12
13// indices into ActionCommandStatus::hudElements for this action command
14enum {
17};
18
19// how much to add to the meter per input if all modifiers are neutral
20#define METER_FILL_TICK 100
21
22API_CALLABLE(N(init)) {
26
28 battleStatus->actionCmdDifficultyTable = actionCmdTableStopLeech;
29 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
30 battleStatus->actionQuality = 0;
31 return ApiStatus_DONE2;
32 }
33
35
36 acs->actionCommandID = ACTION_COMMAND_STOP_LEECH;
37 acs->hudPosX = -48;
38 acs->state = AC_STATE_INIT;
39 acs->wrongButtonPressed = FALSE;
40 acs->meterFillLevel = 0;
41 acs->meterFillWidth = 0;
42 acs->hudPosY = 80;
43
45 acs->hudElemIDs[HIDX_BUTTON] = hid;
47 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY);
49
51 acs->hudElemIDs[HIDX_METER] = hid;
52 hud_element_set_render_pos(hid, acs->hudPosX, acs->hudPosY + 28);
55 return ApiStatus_DONE2;
56}
57
58API_CALLABLE(N(start)) {
59 Bytecode* args = script->ptrReadPos;
62
63 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
65 return ApiStatus_DONE2;
66 }
67
69
70 acs->prepareTime = evt_get_variable(script, *args++);
71 acs->duration = evt_get_variable(script, *args++);
72 acs->difficulty = evt_get_variable(script, *args++);
73 acs->difficulty = adjust_action_command_difficulty(acs->difficulty);
74
75 acs->wrongButtonPressed = FALSE;
76 acs->meterFillLevel = 0;
77 acs->meterFillWidth = 0;
78 battleStatus->actionQuality = 0;
79 battleStatus->actionResult = ACTION_RESULT_FAIL;
80 acs->state = AC_STATE_START;
82
83 return ApiStatus_DONE2;
84}
85
86void N(update)(void) {
90
91 switch (acs->state) {
92 case AC_STATE_INIT:
94 hid = acs->hudElemIDs[HIDX_BUTTON];
95 if (acs->showHud) {
97 }
99 hid = acs->hudElemIDs[HIDX_METER];
101 if (acs->showHud) {
103 }
104 acs->state = AC_STATE_APPEAR;
105 break;
106 case AC_STATE_APPEAR:
108 acs->hudPosX = acs->hudPosX + 20;
109 if (acs->hudPosX > 50) {
110 acs->hudPosX = 50;
111 }
112 hud_element_set_render_pos(acs->hudElemIDs[HIDX_BUTTON], acs->hudPosX, acs->hudPosY);
113 hud_element_set_render_pos(acs->hudElemIDs[HIDX_METER], acs->hudPosX, acs->hudPosY + 28);
114 break;
115 case AC_STATE_START:
117 if (acs->prepareTime != 0) {
118 acs->prepareTime--;
119 break;
120 }
122 acs->meterFillLevel = 0;
123 acs->state = AC_STATE_ACTIVE;
124 acs->stateTimer = acs->duration;
125
126 // fallthrough
127 case AC_STATE_ACTIVE:
129
130 // check for meter-filling input
131 if (!acs->berserkerEnabled) {
132 if (battleStatus->curButtonsPressed & BUTTON_A) {
133 acs->meterFillLevel += SCALE_BY_PCT(METER_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]);
134 }
135 } else {
136 acs->meterFillLevel += SCALE_BY_PCT(METER_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]) / 6;
137 acs->meterFillLevel += rand_int(SCALE_BY_PCT(METER_FILL_TICK, battleStatus->actionCmdDifficultyTable[acs->difficulty]) / 6);
138 }
139 battleStatus->actionProgress = acs->meterFillLevel / ONE_PCT_MASH;
140
141 // handle filling the meter
142 if (acs->mashMeterCutoffs[acs->mashMeterNumIntervals] <= battleStatus->actionProgress) {
143 acs->stateTimer = 0;
144 }
145
146 if (acs->stateTimer == 0) {
148 acs->stateTimer = 5;
149 acs->state = AC_STATE_DISPOSE;
150 break;
151 }
152 acs->stateTimer--;
153 break;
154 case AC_STATE_DISPOSE:
155 if (acs->stateTimer != 0) {
156 acs->stateTimer--;
157 break;
158 }
159 battleStatus->actionQuality = 1;
160 battleStatus->actionResult = ACTION_RESULT_NONE;
162 default:
163 break;
164 }
165}
166
167void N(draw)(void) {
169 s32 hudX, hudY;
171
172 if (!acs->berserkerEnabled) {
174 }
175
176 hid = acs->hudElemIDs[HIDX_METER];
180}
181
BSS s32 PopupMenu_SelectedIndex
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 action_command_init_status(void)
Definition action_cmd.c:256
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_MashAButton
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
s32 HudElemID
#define rand_int
@ ACTION_COMMAND_STOP_LEECH
Definition enums.h:3478
@ BUTTON_A
Definition enums.h:2790
@ ACTION_RESULT_NONE
Definition enums.h:1963
@ 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 POPUP_MSG_OFF
Definition battle.h:270
#define POPUP_MSG_ON
Definition battle.h:269
#define METER_FILL_TICK
Definition stop_leech.c:20
void N free(void)
Definition stop_leech.c:182
s32 actionCmdTableStopLeech[]
Definition action_cmd.c:33
void N update(void)
Definition stop_leech.c:86
void N draw(void)
Definition stop_leech.c:167
@ HIDX_METER
Definition stop_leech.c:16
@ HIDX_BUTTON
Definition stop_leech.c:15
BattleStatus gBattleStatus
Definition battle.c:11
void N init(Npc *bombette)
Definition bombette.c:66