Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
menus.c
Go to the documentation of this file.
1#include "common_structs.h"
2#include "hud_element.h"
3#include "world/partners.h"
4#include "macros.h"
5#include "common.h"
6#include "sprite.h"
7#include "game_modes.h"
9#include "world/partners.h"
11
20
26
33
35
47
51 s32 actionState = playerStatus->actionState;
52
53 if (playerStatus->animFlags & PA_FLAG_CHANGING_MAP) {
54 return false;
55 }
56
57 if (partnerStatus->partnerActionState == PARTNER_ACTION_NONE) {
59 (actionState == ACTION_STATE_IDLE || actionState == ACTION_STATE_WALK || actionState == ACTION_STATE_RUN))
60 {
61 return true;
62 }
63 } else if (partner_can_open_world_menus()) {
64 if (partnerStatus->actingPartner == PARTNER_WATT) {
65 return true;
66 } else if (partnerStatus->actingPartner == PARTNER_BOW) {
67 if (actionState == ACTION_STATE_RIDE) {
68 return true;
69 }
70 } else if (partnerStatus->actingPartner == PARTNER_LAKILESTER) {
71 if (actionState == ACTION_STATE_RIDE) {
72 return true;
73 }
75 }
76 }
77 return false;
78}
79
82 s32 actionState = gPlayerStatus.actionState;
83
87 && (pressedButtons & (BUTTON_START | BUTTON_C_LEFT | BUTTON_C_RIGHT))
91 ) {
94 return false;
95 }
96 if (partnerStatus->partnerActionState == PARTNER_ACTION_NONE) {
98 if (actionState == ACTION_STATE_IDLE ||
99 actionState == ACTION_STATE_WALK ||
100 actionState == ACTION_STATE_RUN
101 ) {
102 return true;
103 }
104 }
105 } else if (partner_can_open_world_menus()) {
106 if (partnerStatus->actingPartner == PARTNER_WATT) {
107 return actionState == ACTION_STATE_IDLE ||
108 actionState == ACTION_STATE_WALK ||
109 actionState == ACTION_STATE_RUN;
110 } else if (partnerStatus->actingPartner == PARTNER_BOW) {
111 if (actionState == ACTION_STATE_RIDE) {
113 return true;
114 }
115 } else if (partnerStatus->actingPartner == PARTNER_LAKILESTER) {
116 if (actionState == ACTION_STATE_RIDE) {
118 return true;
119 }
121 }
122 } else if (partnerStatus->actingPartner == PARTNER_SUSHIE) {
124 }
125 }
126 }
127 return false;
128}
129
133
136 s32 optionCount = 0;
137 s32 i;
138
139 for (i = 1; i < ARRAY_COUNT(PartnerIDFromMenuIndex); i++) {
140 s32 partnerID = PartnerIDFromMenuIndex[i];
141
142 if (playerData->partners[partnerID].enabled && partnerID != PARTNER_GOOMPA) {
143 PartnerPopupProperties* properties = &gPartnerPopupProperties[partnerID];
144
145 menu->ptrIcon[optionCount] = wPartnerHudScripts[partnerID];
146 menu->userIndex[optionCount] = partnerID;
147 menu->enabled[optionCount] = true;
148 menu->nameMsg[optionCount] = properties->nameMsg;
149 menu->descMsg[optionCount] = properties->worldDescMsg;
150 menu->value[optionCount] = playerData->partners[partnerID].level;
151 if (playerData->curPartner == partnerID) {
152 menu->enabled[optionCount] = false;
153 menu->ptrIcon[optionCount] = wDisabledPartnerHudScripts[partnerID];
154 }
155 optionCount++;
156 }
157 }
158 return optionCount;
159}
160
163 s32 optionCount = 0;
164 s32 i;
165
166 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
168
169 if (itemIdx != 0) {
170 ItemData* item = &gItemTable[itemIdx];
172
174 menu->ptrIcon[optionCount] = itemScripts->enabled;
175 menu->userIndex[optionCount] = i;
176 menu->enabled[optionCount] = 1;
177 } else {
178 menu->ptrIcon[optionCount] = itemScripts->disabled;
179 menu->userIndex[optionCount] = i;
180 menu->enabled[optionCount] = false;
181 }
182 menu->nameMsg[optionCount] = item->nameMsg;
183 menu->descMsg[optionCount] = item->shortDescMsg;
184 optionCount++;
185 }
186 }
187 return optionCount;
188}
189
191 static s16 SwappedWorldMenus;
192
197 s32 flags;
198 s32 numEntries;
199 s32 pressedButtons;
201 s8* partnerActionState;
202
207
211 ) {
212 return;
213 }
214
215 if (partnerStatus->partnerActionState != PARTNER_ACTION_NONE &&
216 (partnerStatus->actingPartner == PARTNER_SUSHIE ||
217 partnerStatus->actingPartner == PARTNER_LAKILESTER ||
218 partnerStatus->actingPartner == PARTNER_BOW))
219 {
220 currentButtons = partnerStatus->curButtons;
221 pressedButtons = partnerStatus->pressedButtons;
222 } else {
223 currentButtons = playerStatus->curButtons;
224 pressedButtons = playerStatus->pressedButtons;
225 }
226 partnerActionState = &partnerStatus->partnerActionState;
227
228 // prevent opening popup menus during the epilogue
231 pressedButtons &= ~(BUTTON_C_LEFT | BUTTON_C_RIGHT);
232 }
233
234 switch (WorldMenuState) {
236 if (can_open_world_menu(currentButtons, pressedButtons)) {
238 if (pressedButtons & BUTTON_C_RIGHT) {
240 }
241 if (pressedButtons & BUTTON_START) {
243 }
244 SwappedWorldMenus = false;
246 switch (WorldMenuType) {
250 if (SwappedWorldMenus) {
255 }
256 } else {
257 numEntries = setup_partner_popup(popup);
258 if (numEntries == 0) {
259 return;
260 }
261 popup->numEntries = numEntries;
262 popup->popupType = POPUP_MENU_SWITCH_PARTNER;
263 popup->initialPos = MenuIndexFromPartnerID[playerData->curPartner] - 1;
264 break;
265 }
266 return;
268 numEntries = setup_item_popup(popup);
269 if (numEntries == 0) {
270 return;
271 }
272 popup->popupType = POPUP_MENU_USE_ITEM;
273 popup->numEntries = numEntries;
274 popup->initialPos = 0;
275 break;
276 }
280 WorldMenuDelay = 3;
282 OpenMenuDisableCount = playerStatus->inputDisabledCount;
283 }
284 break;
288 playerStatus->flags &= flags;
292 if (SwappedWorldMenus) {
297 }
298 } else {
300 if (WorldMenuDelay == 0) {
303 }
304 }
305 break;
310 WorldMenuDelay = 10;
312 return;
313 }
316 if (*partnerActionState == PARTNER_ACTION_NONE) {
318 }
320 break;
322 if (popup->result != POPUP_RESULT_INVALID) {
323 WorldPopupResult = popup->result;
326 WorldMenuDelay = 15;
328 }
329 }
330 break;
333 if (WorldMenuDelay != 0) {
334 break;
335 }
341 if ((setup_partner_popup(popup) == 0) || (setup_item_popup(popup) == 0)) {
343 } else {
344 // swap to other menu
345 switch (WorldMenuType) {
348 break;
351 break;
352 }
353 SwappedWorldMenus = true;
354 goto block_17; // TODO required to match
355 }
356 }
357
359 switch (WorldMenuType) {
362 break;
364 use_consumable(popup->userIndex[WorldPopupResult - 1]);
365#ifndef VERSION_JP
367#endif
368 break;
369 }
370 }
375 break;
378 if (WorldMenuDelay == 0) {
385 }
386 break;
387 }
388}
389
392 s32 pressedButtons;
393
395 if (playerStatus->actionState != ACTION_STATE_RIDE) {
396 pressedButtons = playerStatus->pressedButtons;
397 } else {
398 pressedButtons = gGameStatusPtr->pressedButtons[0];
399 }
400
401 if (!is_status_bar_visible()) {
402 if (!(playerStatus->curButtons & (Z_TRIG | R_TRIG))
403 && (pressedButtons & BUTTON_C_UP)
405 ) {
407#if VERSION_JP
409#else
410 if (!is_picking_up_item()) {
412 }
413#endif
414 }
415 } else if (!(playerStatus->curButtons & (Z_TRIG | R_TRIG))
416 && (pressedButtons & BUTTON_C_UP)
418 ) {
420#if VERSION_JP
422#else
423 if (!is_picking_up_item()) {
425 }
426#endif
427 }
428 }
429}
PartnerPopupProperties gPartnerPopupProperties[]
Definition 5B320.c:331
void create_standard_popup_menu(PopupMenu *popup)
BSS s32 PopupMenu_SelectedIndex
IconHudScriptPair gItemHudScripts[]
u32 pressedButtons[4]
struct Shop * mapShop
s32 b32
s16 invItems[10]
s8 flags
Definition demo_api.c:15
@ DEBUG_SCRIPTS_NONE
Definition enums.h:3874
@ BUTTON_C_UP
Definition enums.h:2766
@ BUTTON_START
Definition enums.h:2773
@ BUTTON_R
Definition enums.h:2767
@ BUTTON_C_RIGHT
Definition enums.h:2763
@ BUTTON_C_LEFT
Definition enums.h:2764
@ BUTTON_Z
Definition enums.h:2774
@ IMGFX_SET_ALPHA
Definition enums.h:4709
@ PEACH_FLAG_IS_PEACH
Definition enums.h:2474
@ STORY_INTRO
Definition enums.h:10
@ STORY_EPILOGUE
Definition enums.h:234
@ POPUP_MENU_USE_ITEM
Definition enums.h:3165
@ POPUP_MENU_SWITCH_PARTNER
Definition enums.h:3166
@ PS_FLAG_PAUSED
Definition enums.h:3074
@ PS_FLAG_NO_CHANGE_PARTNER
Definition enums.h:3075
@ PS_FLAG_PAUSE_DISABLED
Definition enums.h:3078
@ PS_FLAG_NO_STATIC_COLLISION
Definition enums.h:3085
@ PARTNER_ACTION_NONE
Definition enums.h:2966
@ ITEM_TYPE_FLAG_WORLD_USABLE
Definition enums.h:1860
@ NPC_PARTNER
Definition enums.h:2514
@ POPUP_RESULT_CANCEL
Definition enums.h:3212
@ POPUP_RESULT_CHOOSING
Definition enums.h:3211
@ POPUP_RESULT_INVALID
Definition enums.h:3209
@ POPUP_RESULT_SWAP_MENU
Definition enums.h:3210
@ PA_FLAG_8BIT_MARIO
Definition enums.h:3139
@ PA_FLAG_CHANGING_MAP
Definition enums.h:3146
@ TIME_FREEZE_POPUP_MENU
Definition enums.h:3501
@ TIME_FREEZE_NONE
Definition enums.h:3498
@ SHOP_FLAG_SHOWING_ITEM_INFO
Definition enums.h:4531
@ SOUND_LOWER_STATUS_BAR
Definition enums.h:553
@ SOUND_MENU_OPEN
Definition enums.h:699
@ SOUND_RAISE_STATUS_BAR
Definition enums.h:554
@ SOUND_MENU_ERROR
Definition enums.h:936
@ PARTNER_LAKILESTER
Definition enums.h:2927
@ PARTNER_WATT
Definition enums.h:2925
@ PARTNER_BOW
Definition enums.h:2928
@ PARTNER_SUSHIE
Definition enums.h:2926
@ PARTNER_GOOMPA
Definition enums.h:2924
@ ACTION_STATE_RIDE
Definition enums.h:2447
@ ACTION_STATE_IDLE
Definition enums.h:2412
@ ACTION_STATE_WALK
Definition enums.h:2413
@ ACTION_STATE_RUN
Definition enums.h:2414
@ GLOBAL_OVERRIDES_CANT_PICK_UP_ITEMS
Definition enums.h:3924
@ GLOBAL_OVERRIDES_40
Definition enums.h:3910
@ GLOBAL_OVERRIDES_DISABLE_MENUS
Definition enums.h:3922
b32 can_control_status_bar(void)
Definition inventory.c:1491
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1725
void hide_popup_menu(void)
b32 is_picking_up_item(void)
void partner_disable_input(void)
Definition partners.c:2489
s32 disable_player_input(void)
Definition 77480.c:989
void close_status_bar(void)
Definition inventory.c:1450
s32 enable_player_input(void)
Definition 77480.c:997
void destroy_popup_menu(void)
void switch_to_partner(s32 arg0)
Definition partners.c:906
void set_action_state(s32 actionState)
Definition 7E9D0.c:209
s32 use_consumable(s32 invSlot)
Definition partners.c:479
s32 partner_can_open_world_menus(void)
Definition partners.c:983
void set_time_freeze_mode(s32)
Time freeze modes: 0: none 1: NPCs move, can't be interacted with 2: NPCs don't move,...
Definition main_loop.c:356
s32 is_status_bar_visible(void)
Definition inventory.c:1536
void open_status_bar_slowly(void)
Definition inventory.c:1430
void set_game_mode(s32 modeID)
Definition game_modes.c:127
@ GAME_MODE_PAUSE
Definition game_modes.h:17
HudScript * wDisabledPartnerHudScripts[]
Definition partners.c:136
HudScript * wPartnerHudScripts[]
Definition partners.c:130
s16 flags
HudScript * enabled
s32 world_lakilester_can_dismount(void)
void reset_outta_sight_alpha_on_menu_close(void)
Definition menus.c:36
BSS s16 WorldMenuState
Definition menus.c:32
void clear_world_menus(void)
Definition menus.c:130
b32 should_cancel_open_world_menu(void)
Definition menus.c:48
BSS s16 OpenMenuDisableCount
Definition menus.c:31
WorldMenuStates
Definition menus.c:12
@ WORLD_MENU_STATE_CLOSE
Definition menus.c:17
@ WORLD_MENU_STATE_UNPAUSE
Definition menus.c:18
@ WORLD_MENU_STATE_HOLD
Definition menus.c:16
@ WORLD_MENU_STATE_NONE
Definition menus.c:13
@ WORLD_MENU_STATE_OPEN
Definition menus.c:15
@ WORLD_MENU_STATE_DELAY
Definition menus.c:14
BSS s16 WorldPopupResult
Definition menus.c:30
void check_input_open_menus(void)
Definition menus.c:190
b32 can_open_world_menu(s32 currentButtons, s32 pressedButtons)
Definition menus.c:80
s32 MenuIndexFromPartnerID[]
Definition 5B320.c:316
s32 setup_item_popup(PopupMenu *menu)
Definition menus.c:161
WorldMenuTypes
Definition menus.c:21
@ WORLD_MENU_USE_ITEM
Definition menus.c:23
@ WORLD_MENU_PAUSE
Definition menus.c:24
@ WORLD_MENU_CHANGE_PARTNER
Definition menus.c:22
void check_input_status_bar(void)
Definition menus.c:390
BSS s16 WorldMenuDelay
Definition menus.c:29
s32 setup_partner_popup(PopupMenu *menu)
Definition menus.c:134
BSS PopupMenu WorldPopupMenu
Definition menus.c:27
BSS s16 WorldMenuType
Definition menus.c:28
void npc_set_imgfx_params(Npc *npc, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6)
Definition npc.c:2160
Npc * get_npc_unsafe(s32 npcID)
Definition npc.c:993
void partner_enable_input(void)
Definition partners.c:2480
void sfx_play_sound(s32 soundID)
@ GB_StoryProgress
#define BSS
Definition macros.h:6
#define ARRAY_COUNT(arr)
Definition macros.h:39
void set_player_imgfx_comp(s32 spriteIdx, s32 compIdx, ImgFXType imgfx, s32 imgfxArg1, s32 imgfxArg2, s32 imgfxArg3, s32 imgfxArg4, s32 flags)
Definition sprite.c:958
@ PLAYER_SPRITE_MAIN
Definition sprite.h:30
s32 gOverrideFlags
Definition main_loop.c:10
ItemData gItemTable[]
s32 PartnerIDFromMenuIndex[12]
Definition 5B320.c:300
PartnerStatus gPartnerStatus
Definition partners.c:42
GameStatus * gGameStatusPtr
Definition main_loop.c:31
PlayerData gPlayerData
Definition 77480.c:39
PlayerStatus gPlayerStatus
Definition 77480.c:38