Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
pause_items.c
Go to the documentation of this file.
1#include "pause_common.h"
2#include "message_ids.h"
3
4void pause_items_draw_contents(MenuPanel* menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening);
9
10static s16 gPauseItemsItemIDs[100];
11static s32 gPauseItemsCurrentPage;
12static PauseItemPage gPauseItemsPages[20];
13static s32 gPauseItemsSelectedIndex;
14static u32 D_802705C4;
15static s32 gPauseItemsSelectedItem;
16static s16 gPauseItemsNumItems;
17static s32 D_802705D0;
18static s32 gPauseItemsCurrentScrollPos;
19static s32 gPauseItemsTargetScrollPos;
20static s32 gPauseItemsTargetScrollIndex;
21static s32 gPauseItemsLevel;
22static s32 gPauseItemsCurrentTab;
23static HudElemID gPauseItemsHIDs[20];
24
25#define ITEM_NONE_STANDIN 0x7FFE
26#define ITEM_INVALID 0x7FFF
27
36 {
38 .unk_01 = 0,
39 .pos = { .x = 3, .y = 16 },
40 .width = 289,
41 .height = 154,
42 .priority = WINDOW_PRIORITY_1,
43 .fpDrawContents = &pause_items_draw_contents,
44 .tab = nullptr,
45 .parentID = WIN_PAUSE_MAIN,
46 .fpUpdate = { WINDOW_UPDATE_HIDE },
47 .extraFlags = 0,
48 .style = { .customStyle = &gPauseWS_19 }
49 }
50};
52 .initialized = false,
53 .col = 0,
54 .row = 0,
55 .selected = 0,
56 .state = 0,
57 .numCols = 0,
58 .numRows = 0,
59 .numPages = 0,
60 .gridData = nullptr,
61 .fpInit = &pause_items_init,
62 .fpHandleInput = &pause_items_handle_input,
63 .fpUpdate = &pause_items_update,
64 .fpCleanup = &pause_items_cleanup
65};
66
68 if (*a > *b) {
69 return 1;
70 } else {
71 return -1;
72 }
73}
74
78
80 return ((page + 1) * 11) + (ITEM_MENU_PAGE(page)->listStart * 16) + ((itemIndex / ITEM_MENU_PAGE(page)->numCols) * 16);
81}
82
86
88 return ITEM_MENU_PAGE(page)->listStart + (itemIdx / ITEM_MENU_PAGE(page)->numCols);
89}
90
92 if (y < gPauseItemsCurrentScrollPos - 32) {
93 return false;
94 }
95 return y < gPauseItemsCurrentScrollPos + 128;
96}
97
99 return beforeY - gPauseItemsCurrentScrollPos;
100}
101
105
106#if VERSION_PAL
107INCLUDE_ASM(void, "pause/pause_items", pause_items_draw_contents);
108#else
109void pause_items_draw_contents(MenuPanel* menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening) {
114 s32 style;
115 s32 palette;
116 s32 posX, posY;
117 s32 sp6C;
118 s32 sp70;
119 s32 isNone;
121 s32 x1, y1, x2, y2;
122 s16 itemID;
124 s32* iconIDs;
129
130 style = DRAW_MSG_STYLE_MENU;
131 palette = MSG_PAL_STANDARD;
132 currentItemColumn = gPauseItemsSelectedIndex / gPauseItemsPages[gPauseItemsCurrentPage].numCols;
133 currentItemRow = gPauseItemsSelectedIndex % gPauseItemsPages[gPauseItemsCurrentPage].numCols;
134 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_18, baseX + 68, baseY, 0, width - 68, height, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
135
136 x1 = baseX + 1;
137 y1 = baseY + 7;
138 x2 = baseX + width - 1;
139 y2 = baseY + height - 7;
140
141 if (x1 <= 0) {
142 x1 = 1;
143 }
144 if (y1 <= 0) {
145 y1 = 1;
146 }
147
148 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
149 return;
150 }
151
152 if (x2 >= SCREEN_WIDTH - 1) {
153 x2 = SCREEN_WIDTH - 1;
154 }
155 if (y2 >= SCREEN_HEIGHT - 1) {
156 y2 = SCREEN_HEIGHT - 1;
157 }
158
159 totalItemIndex = 0;
160 sp6C = baseX + 119;
161 sp70 = baseY + 17;
162
164
165 for (i = 0; i < 3; i++) {
166 for (pageIndex = 0; pageIndex < 20; pageIndex++) {
167 iconIDs = gPauseItemsHIDs;
168
169 page = &gPauseItemsPages[pageIndex];
170 if (!page->enabled) {
171 break;
172 }
173
175
176 for (itemIndex = 0; itemIndex < page->count; itemIndex++) {
177 itemID = gPauseItemsItemIDs[page->startIndex + itemIndex];
178 isSelected = false;
179 if (itemID == ITEM_INVALID) {
180 continue;
181 }
182
185
186 isNone = itemID == ITEM_NONE_STANDIN;
187
188 if (gPauseMenuCurrentTab == 3 &&
189 gPauseItemsLevel == 1 &&
192 isSelected = true;
193 }
194
195 itemOffsetX = 0;
196 itemOffsetY = 0;
197 if (isSelected) {
198 itemOffsetX = -1;
199 itemOffsetY = -1;
200 }
201
202 if (i == 0) {
203 style = DRAW_MSG_STYLE_MENU;
204 palette = MSG_PAL_STANDARD;
205
206 if (isSelected) {
208 }
209 }
210
211 if (!pause_items_is_visible(posY)) {
212 continue;
213 }
214
215 if (i == 0) {
216 if (isNone) {
218 sp70 + pause_items_scroll_offset_y(posY) + itemOffsetY, 255, palette, style);
219 } else {
220 if (gItemTable[itemID].nameMsg) {
221 if (gItemTable[itemID].nameMsg > 0) {
223 sp70 + pause_items_scroll_offset_y(posY) + itemOffsetY, 255, palette, style);
224 }
225 }
226 }
227 }
228
229 if (i == 1) {
233 if (isNone) {
234 itemIcon = gPauseItemsHIDs[19];
235 } else {
236 if (isSelected) {
239 }
240
241 hud_element_set_script(itemIcon, gItemHudScripts[gItemTable[itemID].hudElemID].enabled);
243 }
244
247 if (totalItemIndex == 0) {
249 } else {
251 }
252
254 }
255 }
256 }
257 }
258
259 x1 = baseX + 1;
260 y1 = baseY + 1;
261 x2 = baseX + width - 1;
262 y2 = baseY + height - 1;
264
265 if (x1 <= 0) {
266 x1 = 1;
267 }
268 if (y1 <= 0) {
269 y1 = 1;
270 }
271
272 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
273 return;
274 }
275
276 if (x2 >= SCREEN_WIDTH - 1) {
277 x2 = SCREEN_WIDTH - 1;
278 }
279 if (y2 >= SCREEN_HEIGHT - 1) {
280 y2 = SCREEN_HEIGHT - 1;
281 }
282
284
285 if (gPauseMenuCurrentTab == 3 && gPauseItemsLevel == 1) {
286 if (gPauseItemsCurrentPage > 0) {
287 hud_element_set_render_pos(gPauseItemsHIDs[16], baseX + 278, baseY + 14);
288 hud_element_draw_without_clipping(gPauseItemsHIDs[16]);
289 }
290
291 if (gPauseItemsPages [gPauseItemsCurrentPage + 1].enabled) {
292 hud_element_set_render_pos(gPauseItemsHIDs[17], baseX + 278, baseY + 146);
293 hud_element_draw_without_clipping(gPauseItemsHIDs[17]);
294 }
295 }
296
297 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_17, gPauseItemsCurrentTab == 0 ? baseX + 9 : baseX, baseY + 7, 0,
298 91, 34, 255, gPauseItemsCurrentTab == 1 ? 128 : 0, 0, 0,
299 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
300
302 msgX = baseX + 12;
303 if (gPauseItemsCurrentTab == 0) {
304 msgX = baseX + 21;
305 }
306 opacity1 = 255;
307 msgY = baseY + 17;
308 if (gPauseItemsCurrentTab == 1) {
309 opacity1 = 191;
310 }
312
313 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_17, gPauseItemsCurrentTab == 1 ? baseX + 9 : baseX, baseY + 39, 0,
314 91, 34, 255, gPauseItemsCurrentTab == 0 ? 128 : 0, 0, 0,
315 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
316
318 msgX = baseX + 25;
319 if (gPauseItemsCurrentTab == 1) {
320 msgX = baseX + 34;
321 }
322 opacity1 = 255;
323 msgY = baseY + 49;
324 if (gPauseItemsCurrentTab == 0) {
325 opacity1 = 191;
326 }
328
329 if (gPauseMenuCurrentTab == 3) {
330 if (gPauseItemsLevel == 0) {
331 pause_set_cursor_pos(WIN_PAUSE_ITEMS, baseX + 12, baseY + 26 + gPauseItemsCurrentTab * 32);
332 } else {
333 selectedPosX = pause_items_get_pos_x(gPauseItemsCurrentPage, gPauseItemsSelectedIndex - gPauseItemsPages[gPauseItemsCurrentPage].listStart * gPauseItemsPages[gPauseItemsCurrentPage].numCols);
334 selectedPosY = pause_items_get_pos_y(gPauseItemsCurrentPage, gPauseItemsSelectedIndex - gPauseItemsPages[gPauseItemsCurrentPage].listStart * gPauseItemsPages[gPauseItemsCurrentPage].numCols);
337 if (cursorOffsetY < 0) {
338 cursorOffsetY = 0;
339 } else if (cursorOffsetY > 112) {
340 cursorOffsetY = 112;
341 }
342
343 if (gPauseItemsCurrentScrollPos != gPauseItemsTargetScrollPos) {
345 } else {
347 }
348 }
349 }
350}
351#endif
352
355 s32 i;
356 s32 totalItems = 0;
358
359 D_802705D0 = 0;
360 if (invItems == true) {
361 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
362 if (playerData->invItems[i] != ITEM_NONE) {
363 gPauseItemsItemIDs[totalItems] = playerData->invItems[i];
364 totalItems++;
365 }
366 }
367 } else {
368 for (i = 0; i < ARRAY_COUNT(playerData->keyItems); i++) {
369 if (playerData->keyItems[i] != ITEM_NONE) {
370 gPauseItemsItemIDs[totalItems] = playerData->keyItems[i];
371 totalItems++;
372 }
373 }
374 }
375
376 if (totalItems == 0) {
377 gPauseItemsItemIDs[0] = ITEM_NONE_STANDIN;
378 totalItems = 1;
379 } else {
381 }
382
383 gPauseItemsNumItems = totalItems;
384
385 for (i = totalItems; i < ARRAY_COUNT(gPauseItemsItemIDs); i++) {
386 gPauseItemsItemIDs[i] = ITEM_INVALID;
387 }
388
389 page = gPauseItemsPages;
390 gPauseItemsSelectedIndex = 0;
391 gPauseItemsSelectedItem = 0;
392 D_802705C4 = 0;
393 gPauseItemsTargetScrollIndex = 0;
394 gPauseItemsCurrentPage = 0;
395
396 for (i = 0; i < gPauseItemsNumItems / 8; i++, page++) {
397 page->listStart = i * 8;
398 page->numCols = 1;
399 page->numRows = 8;
400 page->enabled = true;
401 page->startIndex = i * 8;
402 page->count = 8;
403 }
404
405 if ((gPauseItemsNumItems % 8) != 0) {
406 page->listStart = i * 8;
407 page->numCols = 1;
408 page->enabled = true;
409 page->startIndex = i * 8;
410 page->count = gPauseItemsNumItems % 8;
411 page->numRows = page->count;
412 i++;
413 page++;
414 }
415
416 for (; i < ARRAY_COUNT(gPauseItemsPages); i++, page++) {
417 page->enabled = false;
418 }
419
420 gPauseItemsTargetScrollPos = gPauseItemsCurrentScrollPos = pause_items_get_pos_y(0, 0);
421}
422
424 s32 i;
425
426 gPauseItemsLevel = 0;
427 gPauseItemsCurrentTab = 0;
429
430 for (i = 0; i < ARRAY_COUNT(gPauseItemsHIDs); i++) {
431 gPauseItemsHIDs[i] = hud_element_create(gPauseItemsHudScripts[i]);
433 }
434
435 for (i = 0; i < ARRAY_COUNT(gPauseItemsWindowBPs); i++) {
437 }
438
440 panel->initialized = true;
441}
442
444 s32 oldTab;
445 s32 oldSelectedIndex = gPauseItemsSelectedIndex;
446 s32 row = gPauseItemsSelectedIndex / gPauseItemsPages[gPauseItemsCurrentPage].numCols;
447 s32 column = gPauseItemsSelectedIndex % gPauseItemsPages[gPauseItemsCurrentPage].numCols;
448
449 if ((gPausePressedButtons & BUTTON_A) && gPauseItemsLevel == 0) {
450 if (gPauseItemsItemIDs[gPauseItemsSelectedIndex] == ITEM_NONE_STANDIN) {
452 } else {
453 gPauseItemsLevel = 1;
455 }
456 return;
457 }
458
459 if (gPauseItemsNumItems != 0) {
460 if (gPauseItemsLevel == 0) {
461 oldTab = gPauseItemsCurrentTab;
463 gPauseItemsCurrentTab ^= 1;
464 }
465
466 if (oldTab != gPauseItemsCurrentTab) {
468 pause_items_load_items(gPauseItemsCurrentTab);
469 }
470 } else {
472 row--;
474 if (row < 0) {
475 row = 0;
476 }
477
478 if (row < gPauseItemsPages[gPauseItemsCurrentPage].listStart) {
479 gPauseItemsCurrentPage--;
480 }
481 } else {
482 gPauseItemsCurrentPage--;
483 if (gPauseItemsCurrentPage < 0) {
484 gPauseItemsCurrentPage = 0;
485 }
486 row = gPauseItemsPages[gPauseItemsCurrentPage].listStart;
487 }
488 }
489
492 row++;
493 if (row >= gPauseItemsPages[gPauseItemsCurrentPage].listStart + gPauseItemsPages[gPauseItemsCurrentPage].numRows) {
494 gPauseItemsCurrentPage++;
495
496 if (!gPauseItemsPages[gPauseItemsCurrentPage].enabled) {
497 gPauseItemsCurrentPage--;
498 row--;
499 }
500 }
501 } else {
502 gPauseItemsCurrentPage++;
503
504 if (!gPauseItemsPages[gPauseItemsCurrentPage].enabled) {
505 gPauseItemsCurrentPage--;
506 } else {
507 row = gPauseItemsPages[gPauseItemsCurrentPage].listStart;
508 }
509 }
510 }
511
512 if (gPauseItemsItemIDs[row * gPauseItemsPages[gPauseItemsCurrentPage].numCols] != ITEM_NONE_STANDIN) {
514 column--;
515
516 if (column < 0) {
517 column = gPauseItemsPages[gPauseItemsCurrentPage].numCols - 1;
518 }
520 column++;
521 if (column >= gPauseItemsPages[gPauseItemsCurrentPage].numCols) {
522 column = 0;
523 }
524 }
525 } else {
526 column = 0;
527 }
528
529 gPauseItemsSelectedIndex = column + row * gPauseItemsPages[gPauseItemsCurrentPage].numCols;
530 if (gPauseItemsSelectedIndex != oldSelectedIndex) {
532 }
533
534 gPauseItemsSelectedItem = gPauseItemsItemIDs[gPauseItemsSelectedIndex];
535 }
536 }
537
538 if (gPauseItemsLevel == 1) {
539 if (gPauseItemsSelectedItem != ITEM_NONE_STANDIN && gPauseItemsSelectedItem != ITEM_INVALID && gPauseItemsSelectedItem != 0) {
540 gPauseCurrentDescMsg = gItemTable[gPauseItemsSelectedItem].fullDescMsg;
541 } else {
544 }
545 } else {
546 if (gPauseItemsCurrentTab == 1) {
548 } else {
550 }
551
553 }
554
556 if (gPauseItemsLevel == 0) {
559 } else {
561 gPauseItemsLevel = 0;
562 }
563 }
564}
565
567 PauseItemPage* page = &gPauseItemsPages[gPauseItemsCurrentPage];
568 s32 selectedIndex = (gPauseItemsSelectedIndex / page->numCols) - page->listStart;
569
570 if (selectedIndex < 2 || page->numRows < 9) {
571 gPauseItemsTargetScrollIndex = 0;
572 } else if (selectedIndex >= page->numRows - 2) {
573 gPauseItemsTargetScrollIndex = page->numRows - 8;
574 } else if (selectedIndex - gPauseItemsTargetScrollIndex > 6) {
575 gPauseItemsTargetScrollIndex = selectedIndex - 6;
576 } else if (selectedIndex - gPauseItemsTargetScrollIndex < 1) {
577 gPauseItemsTargetScrollIndex = selectedIndex - 1;
578 }
579
580 gPauseItemsTargetScrollPos = pause_items_get_pos_y(gPauseItemsCurrentPage, gPauseItemsTargetScrollIndex * page->numCols);
581 gPauseItemsCurrentScrollPos += pause_interp_vertical_scroll(gPauseItemsTargetScrollPos - gPauseItemsCurrentScrollPos);
582}
583
585 s32 i;
586
587 for (i = 0; i < ARRAY_COUNT(gPauseItemsHIDs); i++) {
588 hud_element_free(gPauseItemsHIDs[i]);
589 }
590}
BSS s32 PopupMenu_SelectedIndex
IconHudScriptPair gItemHudScripts[]
s32 HudElemID
#define draw_msg
#define draw_box
@ DRAW_MSG_STYLE_DROP_SHADOW
Definition enums.h:4973
@ DRAW_MSG_STYLE_MENU
Definition enums.h:4970
@ BUTTON_A
Definition enums.h:2776
@ BUTTON_R
Definition enums.h:2767
@ BUTTON_STICK_UP
Definition enums.h:2777
@ BUTTON_STICK_DOWN
Definition enums.h:2778
@ BUTTON_STICK_LEFT
Definition enums.h:2779
@ BUTTON_STICK_RIGHT
Definition enums.h:2780
@ BUTTON_B
Definition enums.h:2775
@ BUTTON_Z
Definition enums.h:2774
@ WINDOW_PRIORITY_1
Definition enums.h:3217
@ DRAW_FLAG_NO_CLIP
Definition enums.h:4590
@ MSG_PAL_WHITE
Definition enums.h:4990
@ MSG_PAL_STANDARD
Definition enums.h:5000
@ WINDOW_UPDATE_HIDE
Definition enums.h:4897
@ SOUND_MENU_BACK
Definition enums.h:704
@ SOUND_MENU_CHANGE_TAB
Definition enums.h:702
@ SOUND_MENU_CHANGE_SELECTION
Definition enums.h:701
@ SOUND_MENU_NEXT
Definition enums.h:703
@ SOUND_MENU_ERROR
Definition enums.h:936
@ WIN_PAUSE_ITEMS
Definition enums.h:4861
@ WIN_PAUSE_MAIN
Definition enums.h:4848
void setup_pause_menu_tab(MenuWindowBP *bpArray, s32 arraySize)
Definition windows.c:461
HudScript HES_StatusStar1
void hud_element_set_scale(s32 index, f32 scale)
void hud_element_draw_without_clipping(s32 id)
void hud_element_set_script(s32 id, HudScript *anim)
void hud_element_draw_next(s32 id)
HudElemID hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
void hud_element_set_render_pos(s32 id, s32 x, s32 y)
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_free(s32 id)
@ HUD_ELEMENT_FLAG_DROP_SHADOW
Definition hud_element.h:97
@ HUD_ELEMENT_FLAG_MANUAL_RENDER
Definition hud_element.h:78
@ HUD_ELEMENT_FLAG_FILTER_TEX
Definition hud_element.h:86
s32 HudScript[]
Definition hud_element.h:9
HudScript * enabled
HudScript HES_Dash
HudScript HES_ListPrevPage
HudScript HES_ListNextPage
HudScript HES_StatBp
s32 gPausePressedButtons
Definition pause_main.c:24
HudScript * gPauseCurrentDescIconScript
Definition pause_main.c:26
s32 pause_interp_vertical_scroll(s32 deltaBefore)
Definition pause_main.c:447
WindowStyleCustom gPauseWS_19
WindowStyleCustom gPauseWS_18
void pause_set_cursor_pos_immediate(s32 windowID, s32 posX, s32 posY)
Definition pause_main.c:193
s32 pause_get_menu_msg(s32 index)
Definition pause_gfx.c:583
@ PAUSE_MSG_KEY_ITEMS
@ PAUSE_MSG_DESC_KEY_ITEMS
@ PAUSE_MSG_CONSUMABLES
@ PAUSE_MSG_DESC_CONSUMABLES
@ PAUSE_MSG_BAGDE_DESC_NONE
s32 gPauseHeldButtons
Definition pause_main.c:23
WindowStyleCustom gPauseWS_17
s8 gPauseMenuCurrentTab
Definition pause_main.c:28
void pause_set_cursor_pos(s32 windowID, s32 posX, s32 posY)
Definition pause_main.c:225
void pause_sort_item_list(s16 *arr, s32 len, s32(*compare)(s16 *, s16 *))
Definition pause_main.c:847
s32 gPauseCurrentDescMsg
Definition pause_main.c:25
void pause_items_draw_contents(MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
s32 pause_items_get_column(s32 page, s32 itemIdx)
Definition pause_items.c:83
s32 pause_items_comparator(s16 *a, s16 *b)
Definition pause_items.c:67
s32 pause_items_scroll_offset_x(s32 beforeX)
void pause_items_handle_input(MenuPanel *panel)
s32 pause_items_get_pos_x(s32 page, s32 itemIndex)
Definition pause_items.c:75
s32 pause_items_scroll_offset_y(s32 beforeY)
Definition pause_items.c:98
void pause_items_load_items(s32 invItems)
void pause_items_init(MenuPanel *panel)
#define ITEM_NONE_STANDIN
Definition pause_items.c:25
s32 pause_items_get_row(s32 page, s32 itemIdx)
Definition pause_items.c:87
MenuPanel gPausePanelItems
Definition pause_items.c:51
MenuWindowBP gPauseItemsWindowBPs[]
Definition pause_items.c:35
s32 pause_items_get_pos_y(s32 page, s32 itemIndex)
Definition pause_items.c:79
#define ITEM_INVALID
Definition pause_items.c:26
s32 pause_items_is_visible(s32 y)
Definition pause_items.c:91
HudScript * gPauseItemsHudScripts[]
Definition pause_items.c:28
void pause_items_cleanup(MenuPanel *panel)
void pause_items_update(MenuPanel *panel)
void sfx_play_sound(s32 soundID)
#define SCREEN_WIDTH
Definition macros.h:108
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define SCREEN_HEIGHT
Definition macros.h:109
#define ITEM_MENU_PAGE(index)
Definition macros.h:73
MenuPanel * tab
ItemData gItemTable[]
Gfx * gMainGfxPos
Definition cam_main.c:14
PlayerData gPlayerData
Definition 77480.c:39