Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
pause_badges.c File Reference

Go to the source code of this file.

Macros

#define BADGE_NONE_STANDIN   0x7FFE
 
#define BADGE_INVALID   0x7FFF
 
#define TRY_REMOVE_NOT_ENOUGH_BP_RESULT   -1
 
#define OFFSET_1_X   43
 
#define OFFSET_1_Y   81
 
#define OFFSET_2_X   16
 
#define OFFSET_3_X   69
 
#define OFFSET_3_Y   74
 

Enumerations

enum  BadgeEquipResult { EQUIP_RESULT_ALREADY_EQUIPPED , EQUIP_RESULT_NOT_ENOUGH_BP , EQUIP_RESULT_TOO_MANY_BADGES , EQUIP_RESULT_SUCCESS }
 

Functions

void pause_badges_draw_contents (MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
 
void pause_badges_init (MenuPanel *panel)
 
void pause_badges_handle_input (MenuPanel *panel)
 
void pause_badges_update (MenuPanel *panel)
 
void pause_badges_cleanup (MenuPanel *panel)
 
s32 pause_badges_comparator (s16 *a, s16 *b)
 
s32 pause_badges_count_all (void)
 
s32 pause_badges_count_equipped (void)
 
s32 pause_badges_get_pos_x (s32 page, s32 itemIndex)
 
s32 pause_badges_get_pos_y (s32 page, s32 itemIndex)
 
s32 pause_badges_get_column (s32 page, s32 itemIdx)
 
s32 pause_badges_get_row (s32 page, s32 itemIdx)
 
s32 pause_badges_is_visible (s32 y)
 
s32 pause_badges_scroll_offset_y (s32 offset)
 
s32 pause_badges_scroll_offset_x (s32 x)
 
s32 pause_badges_try_remove (s16 badgeID)
 
s32 pause_badges_try_equip (s16 badgeID)
 
void pause_badges_draw_bp_orbs (s32 orbState, s32 x, s32 y)
 
void pause_badges_load_badges (s32 onlyEquipped)
 

Variables

Gfx PauseGfxOrbs []
 
HudScriptgPauseBadgesElements [][22]
 
MenuWindowBP gPauseBadgesWindowBPs []
 
MenuPanel gPausePanelBadges
 

Macro Definition Documentation

◆ BADGE_NONE_STANDIN

◆ BADGE_INVALID

◆ TRY_REMOVE_NOT_ENOUGH_BP_RESULT

#define TRY_REMOVE_NOT_ENOUGH_BP_RESULT   -1

Definition at line 38 of file pause_badges.c.

Referenced by pause_badges_handle_input(), and pause_badges_try_remove().

◆ OFFSET_1_X

#define OFFSET_1_X   43

Definition at line 47 of file pause_badges.c.

Referenced by pause_badges_draw_contents().

◆ OFFSET_1_Y

#define OFFSET_1_Y   81

Definition at line 48 of file pause_badges.c.

Referenced by pause_badges_draw_contents().

◆ OFFSET_2_X

#define OFFSET_2_X   16

Definition at line 49 of file pause_badges.c.

Referenced by pause_badges_draw_contents().

◆ OFFSET_3_X

#define OFFSET_3_X   69

Definition at line 50 of file pause_badges.c.

Referenced by pause_badges_draw_contents().

◆ OFFSET_3_Y

#define OFFSET_3_Y   74

Definition at line 51 of file pause_badges.c.

Referenced by pause_badges_draw_contents().

Enumeration Type Documentation

◆ BadgeEquipResult

Enumerator
EQUIP_RESULT_ALREADY_EQUIPPED 
EQUIP_RESULT_NOT_ENOUGH_BP 
EQUIP_RESULT_TOO_MANY_BADGES 
EQUIP_RESULT_SUCCESS 

Definition at line 252 of file pause_badges.c.

252 {
BadgeEquipResult
@ EQUIP_RESULT_SUCCESS
@ EQUIP_RESULT_TOO_MANY_BADGES
@ EQUIP_RESULT_NOT_ENOUGH_BP
@ EQUIP_RESULT_ALREADY_EQUIPPED

Function Documentation

◆ pause_badges_draw_contents()

void pause_badges_draw_contents ( MenuPanel * menu,
s32 baseX,
s32 baseY,
s32 width,
s32 height,
s32 opacity,
s32 darkening )

Definition at line 321 of file pause_badges.c.

321 {
322 s32 pageIndex, i;
326 s32 style;
327 s32 palette;
329 s32 costBP;
335 s32 isNone;
337 s32 x1, y1, x2, y2;
338 s16 badgeID;
343 s32 numOrbs;
344 s32 orbY, orbX;
353 s32 msg;
354 s32 msgX, msgY;
356 s32 maxBP;
357 s32 itemIndex, j;
358 s16* equippedBadges;
359 s32 itemID;
361 s32* iconIDs;
363 PauseItemPage* currentPage = &gPauseBadgesPages[gPauseBadgesCurrentPage];
365
366 costBP = 0;
367 canBeEquipped = false;
368 style = DRAW_MSG_STYLE_MENU;
370 currentBadgeColumn = gPauseBadgesSelectedIndex / currentPage->numCols;
371 currentBadgeRow = gPauseBadgesSelectedIndex % currentPage->numCols;
372
373 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_15, baseX + 84, baseY, 0, width - 84, height, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
374 hud_element_set_render_pos(gPauseBadgesIconIDs[20], baseX + 241, baseY + 11);
375 palette = MSG_PAL_STANDARD;
376 hud_element_draw_without_clipping(gPauseBadgesIconIDs[20]);
377
378 x1 = baseX + 1;
379 y1 = baseY + 14;
380 x2 = baseX + width - 1;
381 y2 = baseY + height - 9;
382
383 if (x1 <= 0) {
384 x1 = 1;
385 }
386 if (y1 <= 0) {
387 y1 = 1;
388 }
389
390 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
391 return;
392 }
393
394 if (x2 >= SCREEN_WIDTH - 1) {
395 x2 = SCREEN_WIDTH - 1;
396 }
397 if (y2 >= SCREEN_HEIGHT - 1) {
398 y2 = SCREEN_HEIGHT - 1;
399 }
401
402 badgeIndex = 0;
403 for (i = 0; i < 3; i++) {
404 for (pageIndex = 0; pageIndex < 20; pageIndex++) {
405 iconIDs = gPauseBadgesIconIDs;
406 badgeListX = baseX + 119;
407 badgeListY = baseY + 17;
408
409 page = &gPauseBadgesPages[pageIndex];
410 if (!page->enabled) {
411 break;
412 }
413
415
416 for (itemIndex = 0; itemIndex < page->count; itemIndex++) {
417 badgeID = gPauseBadgesItemIds[page->startIndex + itemIndex];
418 isEquipped = false;
419 isSelected = false;
420 equippedBadges = gPlayerData.equippedBadges;
421 cannotBeEquipped = false;
422 if (badgeID == BADGE_INVALID) {
423 continue;
424 }
425
429
430 for (j = 0; j < ARRAY_COUNT(gPlayerData.equippedBadges); equippedBadges++, j++) {
431 if (badgeID == *equippedBadges) {
432 isEquipped = true;
433 break;
434 }
435 }
436
437 if (gPauseMenuCurrentTab == 2 &&
438 gPauseBadgesLevel == 1 &&
441 itemID = badgeID;
442 isSelected = true;
443 if (!isNone) {
444 costBP = gMoveTable[gItemTable[itemID].moveID].costBP;
445 if (!isEquipped && bpAvailable >= costBP) {
446 canBeEquipped = true;
447 }
448 }
449 }
450
451 if (!isNone && bpAvailable < gMoveTable[gItemTable[badgeID].moveID].costBP) {
452 cannotBeEquipped = true;
453 }
454
457 if (isSelected) {
460 }
461
462 if (i == 0) {
463 style = DRAW_MSG_STYLE_MENU;
464 palette = MSG_PAL_STANDARD;
465 if (isSelected) {
467 }
468
469 if (isEquipped) {
471 baseY + pause_badges_scroll_offset_y(posY) + 17, 0, 200, 13, 255, 0, 0, 0, 0, 0,
472 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
473 } else if (cannotBeEquipped) {
474 palette = MSG_PAL_0B;
475 }
476 }
477
478 if (!pause_badges_is_visible(posY)) {
479 continue;
480 }
481
482 if (i == 0) {
483 if (isNone) {
485 badgeListY + pause_badges_scroll_offset_y(posY) + badgeEntryOffsetY, 255, palette, style);
486 } else {
487 if (gItemTable[badgeID].nameMsg) {
488 if (gItemTable[badgeID].nameMsg > 0) {
490 badgeListY + pause_badges_scroll_offset_y(posY) + badgeEntryOffsetY, 255, palette, style);
491 }
492 }
495 }
496 }
497
498 if (i == 1) {
502 if (isNone) {
503 badgeIconElement = gPauseBadgesIconIDs[21];
504 } else {
505 if (isSelected) {
508 }
509
512 } else {
514 }
515
517 }
518
521 if (badgeIndex == 0) {
523 } else {
525 }
526
527 badgeIndex++;
528 }
529
530 if (i == 2 && !isNone) {
532 orbOffsetY = 1;
533 if (numOrbs < 11) {
534 orbOffsetY = 4;
535 }
536
537 orbColorR1 = 0;
538 orbColorG1 = 255;
539 orbColorB1 = 100;
540
543
544 if (isEquipped == 0) {
545 for (j = 0; j < numOrbs; j++) {
546 gDPSetPrimColor(gMainGfxPos++, 0, 0, 227, 227, 227, 255);
547 orbX = baseX + 235 + pause_badges_scroll_offset_x(posX) + 1 + (j % 5) * 6;
549 if (numOrbs > 5) {
550 orbY += j / 5 * 6 - 3;
551 }
553 }
554
558
559 for (j = 0; j < numOrbs; j++) {
560 if (j < bpAvailable) {
561 orbX = baseX + 235 + pause_badges_scroll_offset_x(posX) + 1 + (j % 5) * 6;
563 if (numOrbs > 5) {
564 orbY += j / 5 * 6 - 3;
565 }
567 }
568 }
569 } else {
570 gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 255, 100, 255);
571 for (j = 0; j < numOrbs; j++) {
572 orbX = baseX + 235 + pause_badges_scroll_offset_x(posX) + 1 + (j % 5) * 6;
574 if (numOrbs > 5) {
575 orbY += j / 5 * 6 - 3;
576 }
578 }
580 }
581 }
582 }
583 }
584 }
585
586 x1 = baseX + 1;
587 y1 = baseY + 1;
588 x2 = baseX + width - 1;
589 y2 = baseY + height - 1;
591
592 if (x1 <= 0) {
593 x1 = 1;
594 }
595 if (y1 <= 0) {
596 y1 = 1;
597 }
598
599 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
600 return;
601 }
602
603 if (x2 >= SCREEN_WIDTH - 1) {
604 x2 = SCREEN_WIDTH - 1;
605 }
606 if (y2 >= SCREEN_HEIGHT - 1) {
607 y2 = SCREEN_HEIGHT - 1;
608 }
609
611
612 if (gPauseMenuCurrentTab == 2 && gPauseBadgesLevel == 1) {
613 if (gPauseBadgesCurrentPage > 0) {
614 hud_element_set_render_pos(gPauseBadgesIconIDs[17], baseX + 278, baseY + 14);
615 hud_element_draw_without_clipping(gPauseBadgesIconIDs[17]);
616 }
617
618 if (gPauseBadgesPages[gPauseBadgesCurrentPage + 1].enabled) {
619 hud_element_set_render_pos(gPauseBadgesIconIDs[18], baseX + 278, baseY + 146);
620 hud_element_draw_without_clipping(gPauseBadgesIconIDs[18]);
621 }
622 }
623
624 hud_element_set_render_pos(gPauseBadgesIconIDs[16], baseX + OFFSET_1_X, baseY + OFFSET_1_Y);
625 hud_element_draw_without_clipping(gPauseBadgesIconIDs[16]);
629 bpAvailOffsetX = 0;
630 bpAvailOffsetY = (playerData->maxBP - 1) / 10 * 8;
631 if (bpAmount < 10) {
632 bpAvailOffsetX = -4;
633 }
635
636#if VERSION_PAL
637 bpAmountX = baseX + (73 + bpAvailOffsetX);
639 bpAmountX += 8;
640 }
641#else
643#endif
644
647
648 orbColorR = 0;
649 orbColorG = 255;
650 orbColorB = 100;
651 maxBP = playerData->maxBP;
654 for (orbIndex = 0; orbIndex < maxBP; orbIndex++) {
655 gDPSetPrimColor(gMainGfxPos++, 0, 0, 227, 227, 227, 255);
656 pause_badges_draw_bp_orbs(0, baseX + 11 + (orbIndex % 10) * 6, baseY + 92 + (orbIndex / 10) * 8);
657 }
658
660 if (canBeEquipped) {
662 for (orbIndex = 0; orbIndex < bpAvailable - costBP; orbIndex++) {
663 pause_badges_draw_bp_orbs(2, baseX + 11 +(orbIndex % 10) * 6, baseY + 92 + (orbIndex / 10) * 8);
664 }
665
667 orbBlinkValue = (sin_deg(gGameStatusPtr->frameCounter * 15) + 1.0f) * 0.2 + 0.5;
669
672
673 for (orbIndex = bpAvailable - costBP; orbIndex < bpAvailable; orbIndex++) {
674 pause_badges_draw_bp_orbs(2, baseX + 11 +(orbIndex % 10) * 6, baseY + 92 + (orbIndex / 10) * 8);
675 }
677 } else {
679 for (orbIndex = 0; orbIndex < bpAvailable; orbIndex++) {
680 pause_badges_draw_bp_orbs(2, baseX + 11 + (orbIndex % 10) * 6, baseY + 92 + (orbIndex / 10) * 8);
681 }
683 }
684
685 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_13, gPauseBadgesCurrentTab == 0 ? baseX + 9 : baseX, baseY + 7, 0,
686 91, 34, 255, gPauseBadgesCurrentTab == 1 ? 128 : 0, 0, 0,
687 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
688
689#if VERSION_PAL
690 if (gCurrentLanguage < 2) {
692 msgX = baseX + 10;
693 if (gPauseBadgesCurrentTab == 0) {
694 msgX = baseX + 19;
695 }
696 msgOpacity = 255;
697 msgY = baseY + 17;
698 if (gPauseBadgesCurrentTab == 1) {
699 msgOpacity = 191;
700 }
701 draw_msg(msg2, msgX, msgY, msgOpacity, 0, 1);
702 } else {
704 msgX = baseX + 12;
705 if (gPauseBadgesCurrentTab == 0) {
706 msgX = baseX + 21;
707 }
708 draw_msg(msg2, msgX, baseY + 12, gPauseBadgesCurrentTab == 1 ? 191 : 255, 0, 1);
709
711 msgX = baseX + 24;
712 if (gCurrentLanguage == 2) {
713 msgX = baseX + 26;
714 }
715 if (gPauseBadgesCurrentTab == 0) {
716 msgX += 9;
717 }
718 msgY = baseY + 22;
719 msgOpacity = 255;
720 if (gPauseBadgesCurrentTab == 1) {
721 msgOpacity = 191;
722 }
723 draw_msg(msg, msgX, msgY, msgOpacity, 0, 1);
724 }
725
726 draw_box(4, &gPauseWS_13, gPauseBadgesCurrentTab == 1 ? baseX + 9 : baseX, baseY + 37, 0, 91, 34, 255,
727 gPauseBadgesCurrentTab != 0 ? 0 : 128, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, nullptr, nullptr, nullptr,
729
731 msgX = baseX + 12;
732 if (gPauseBadgesCurrentTab == 1) {
733 msgX = baseX + 21;
734 }
735 draw_msg(msg2, msgX, baseY + 42, gPauseBadgesCurrentTab == 0 ? 191 : 255, 0, 1);
736
737 draw_msg(pause_get_menu_msg(PAUSE_MSG_BADGES), (gPauseBadgesCurrentTab == 1) ? baseX + D_PAL_80271B2C[gCurrentLanguage] + 9 :baseX + D_PAL_80271B2C[gCurrentLanguage], baseY + 52, gPauseBadgesCurrentTab == 0 ? 191 : 255, 0, 1);
738#else
740 msgX = baseX + 10;
741 if (gPauseBadgesCurrentTab == 0) {
742 msgX = baseX + 19;
743 }
744 msgOpacity = 255;
745 msgY = baseY + 17;
746 if (gPauseBadgesCurrentTab == 1) {
747 msgOpacity = 191;
748 }
750
751 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_13, gPauseBadgesCurrentTab == 1 ? baseX + 9 : baseX, baseY + 37, 0, 91, 34, 255,
752 gPauseBadgesCurrentTab == 0 ? 128 : 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
753
755 msgX = baseX + 12;
756 if (gPauseBadgesCurrentTab == 1) {
757 msgX = baseX + 21;
758 }
759 msgY = baseY + 42;
760 msgOpacity = 255;
761 if (gPauseBadgesCurrentTab == 0) {
762 msgOpacity = 191;
763 }
765
767 msgX = baseX + 26;
768 if (gPauseBadgesCurrentTab == 1) {
769 msgX = baseX + 35;
770 }
771 msgY = baseY + 52;
772 msgOpacity = 255;
773 if (gPauseBadgesCurrentTab == 0) {
774 msgOpacity = 191;
775 }
777#endif
778
779 if (gPauseMenuCurrentTab == 2) {
780 if (gPauseBadgesLevel == 0) {
781 pause_set_cursor_pos(32, baseX + 10, baseY + 26 + gPauseBadgesCurrentTab * 32);
782 } else {
783 selectedPosX = pause_badges_get_pos_x(gPauseBadgesCurrentPage, gPauseBadgesSelectedIndex - gPauseBadgesPages[gPauseBadgesCurrentPage].listStart * gPauseBadgesPages[gPauseBadgesCurrentPage].numCols);
784 selectedPosY = pause_badges_get_pos_y(gPauseBadgesCurrentPage, gPauseBadgesSelectedIndex - gPauseBadgesPages[gPauseBadgesCurrentPage].listStart * gPauseBadgesPages[gPauseBadgesCurrentPage].numCols);
787 if (cursorOffsetY < 0) {
788 cursorOffsetY = 0;
789 } else if (cursorOffsetY > 112) {
790 cursorOffsetY = 112;
791 }
792
793 if (gPauseBadgesCurrentScrollPos != gPauseBadgesTargetScrollPos) {
795 } else {
797 }
798 }
799 }
800
801 if (gPauseBadgesShowNotEnoughBP != 0) {
803 if (gPauseBadgesShowNotEnoughBP == 1) {
804#if VERSION_PAL
806
807 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_13, baseX + (256 - wid) / 2, baseY + 60, 0, wid + 36, 26, 255,
808 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
811#else
812 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_13, baseX + 67, baseY + 60, 0, 137, 26, 255,
813 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
816#endif
817 } else {
818 draw_box(DRAW_FLAG_NO_CLIP, &gPauseWS_13, baseX + 67, baseY + 60, 0, 173, 26, 255,
819 0, 0, 0, 0, 0, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
822 }
823 }
824}
BSS s32 PopupMenu_SelectedIndex
IconHudScriptPair gItemHudScripts[]
s16 equippedBadges[64]
#define get_msg_width
#define sin_deg
#define draw_msg
#define draw_box
@ DRAW_MSG_STYLE_DROP_SHADOW
Definition enums.h:4973
@ DRAW_MSG_STYLE_MENU
Definition enums.h:4970
@ DRAW_NUMBER_STYLE_ALIGN_RIGHT
drawn to the left of posX
Definition enums.h:4978
@ DRAW_NUMBER_STYLE_MONOSPACE
Definition enums.h:4979
@ LANGUAGE_ES
Definition enums.h:5994
@ DRAW_FLAG_NO_CLIP
Definition enums.h:4590
@ MSG_PAL_WHITE
Definition enums.h:4990
@ MSG_PAL_STANDARD
Definition enums.h:5000
@ MSG_PAL_0B
Definition enums.h:5001
@ DRAW_NUMBER_CHARSET_THIN
Definition enums.h:4986
@ WIN_PAUSE_BADGES
Definition enums.h:4860
void draw_number(s32 value, s32 x, s32 y, s32 variableWidthChars, s32 palette, s32 opacity, u16 style)
Definition msg.c:2225
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)
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.
@ HUD_ELEMENT_FLAG_DROP_SHADOW
Definition hud_element.h:97
@ HUD_ELEMENT_FLAG_FILTER_TEX
Definition hud_element.h:86
HudScript * enabled
void pause_badges_draw_bp_orbs(s32 orbState, s32 x, s32 y)
s32 pause_badges_get_column(s32 page, s32 itemIdx)
#define BADGE_INVALID
#define OFFSET_3_X
#define OFFSET_3_Y
s32 pause_badges_scroll_offset_x(s32 x)
#define BADGE_NONE_STANDIN
s32 pause_badges_get_row(s32 page, s32 itemIdx)
s32 pause_badges_get_pos_y(s32 page, s32 itemIndex)
s32 pause_badges_scroll_offset_y(s32 offset)
#define OFFSET_1_Y
#define OFFSET_2_X
#define OFFSET_1_X
s32 pause_badges_is_visible(s32 y)
Gfx PauseGfxOrbs[]
Definition pause_gfx.c:264
s32 pause_badges_get_pos_x(s32 page, s32 itemIndex)
HudScript * gPauseCurrentDescIconScript
Definition pause_main.c:26
WindowStyleCustom gPauseWS_13
s32 pause_get_total_equipped_bp_cost(void)
Definition pause_main.c:821
void pause_set_cursor_opacity(s32 val)
Definition pause_main.c:189
WindowStyleCustom gPauseWS_14
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
WindowStyleCustom gPauseWS_15
@ PAUSE_MSG_DONT_WEAR_MORE
@ PAUSE_MSG_NO_BADGE
@ PAUSE_MSG_BADGES
@ PAUSE_MSG_ACTIVE
@ PAUSE_MSG_ALL_BADGES
@ PAUSE_MSG_BADGE_BP
@ PAUSE_MSG_NOT_ENOUGH_BP
s8 gPauseMenuCurrentTab
Definition pause_main.c:28
void pause_draw_menu_label(s32 index, s32 x, s32 y)
Definition pause_gfx.c:587
void pause_set_cursor_pos(s32 windowID, s32 posX, s32 posY)
Definition pause_main.c:225
@ PAUSE_LBL_AVAILABLE
#define SCREEN_WIDTH
Definition macros.h:108
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define SCREEN_HEIGHT
Definition macros.h:109
ItemData gItemTable[]
#define gCurrentLanguage
Definition variables.h:119
GameStatus * gGameStatusPtr
Definition main_loop.c:31
Gfx * gMainGfxPos
Definition cam_main.c:14
PlayerData gPlayerData
Definition 77480.c:39
MoveData gMoveTable[]

◆ pause_badges_init()

void pause_badges_init ( MenuPanel * panel)

Definition at line 908 of file pause_badges.c.

908 {
909 s32 i;
910
911 // This sorts the badge list and then discards the count
913
914 gPauseBadgesLevel = 0;
915 gPauseBadgesCurrentTab = 0;
916 gPauseBadgesShowNotEnoughBP = 0;
917
919 if (gPauseBadgesItemIds[0] == BADGE_NONE_STANDIN) {
920 panel->initialized = false;
921 return;
922 }
923
924 for (i = 0; i < ARRAY_COUNT(gPauseBadgesIconIDs); i++) {
925 gPauseBadgesIconIDs[i] = hud_element_create(gPauseBadgesElements[gCurrentLanguage][i]);
927 }
928
929 for (i = 0; i < ARRAY_COUNT(gPauseBadgesWindowBPs); i++) {
931 }
933 panel->initialized = true;
934}
void setup_pause_menu_tab(MenuWindowBP *bpArray, s32 arraySize)
Definition windows.c:461
HudElemID hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
@ HUD_ELEMENT_FLAG_MANUAL_RENDER
Definition hud_element.h:78
void pause_badges_load_badges(s32 onlyEquipped)
MenuWindowBP gPauseBadgesWindowBPs[]
s32 pause_badges_count_all(void)
HudScript * gPauseBadgesElements[][22]
MenuPanel * tab

◆ pause_badges_handle_input()

void pause_badges_handle_input ( MenuPanel * panel)

Definition at line 936 of file pause_badges.c.

936 {
937 s32 selectedIndex = gPauseBadgesSelectedIndex;
938 s32 numCols = gPauseBadgesPages[gPauseBadgesCurrentPage].numCols;
939
940 s32 selectedCol = selectedIndex % numCols;
941 s32 selectedRow = selectedIndex / numCols;
942
944 s16 badgeID;
945
946 if (gPauseBadgesShowNotEnoughBP != 0) {
947 gPauseBadgesShowNotEnoughBP = 0;
948 } else if (gPauseBadgesLevel == 0) {
949 if (gPauseBadgesItemIds[selectedIndex] == BADGE_NONE_STANDIN) {
951 } else {
952 gPauseBadgesLevel = 1;
954 }
955 } else {
956 badgeID = gPauseBadgesItemIds[selectedIndex];
962 gPauseBadgesShowNotEnoughBP = 1;
963 break;
964 default:
966 break;
967 }
968 break;
971 gPauseBadgesShowNotEnoughBP = 1;
972 break;
975 gPauseBadgesShowNotEnoughBP = 2;
976 break;
979 break;
980 }
981 }
982 return;
983 }
984
985 if ((gPausePressedButtons != 0) || (gPauseHeldButtons != 0)) {
986 gPauseBadgesShowNotEnoughBP = 0;
987 }
988
989 if (gPauseBadgesNumItems != 0) {
990 if (gPauseBadgesLevel == 0) {
991 s32 oldTab = gPauseBadgesCurrentTab;
992
994 gPauseBadgesCurrentTab ^= 1;
995 }
996 if (oldTab != gPauseBadgesCurrentTab) {
998 pause_badges_load_badges(gPauseBadgesCurrentTab);
999 }
1000 } else {
1001 s32 heldButtons = gPauseHeldButtons;
1004
1005 if (heldButtons & (BUTTON_STICK_UP | BUTTON_Z)) {
1006 if (heldButtons & BUTTON_STICK_UP) {
1007 selectedRow--;
1008 if (selectedRow < 0) {
1009 selectedRow = 0;
1010 }
1011 if (selectedRow < gPauseBadgesPages[gPauseBadgesCurrentPage].listStart) {
1012 gPauseBadgesCurrentPage--;
1013 }
1014 } else {
1015 // Z button press
1016 gPauseBadgesCurrentPage--;
1017 if (gPauseBadgesCurrentPage < 0) {
1018 gPauseBadgesCurrentPage = 0;
1019 }
1020 selectedRow = gPauseBadgesPages[gPauseBadgesCurrentPage].listStart;
1021 }
1022 }
1023
1024 // Need to re-read button state here for strange regalloc reasons
1028 PauseItemPage* page = &gPauseBadgesPages[gPauseBadgesCurrentPage];
1029
1030 selectedRow += 1;
1031 if (selectedRow >= (page->listStart + page->numRows)) {
1032 gPauseBadgesCurrentPage += 1;
1033 if (!gPauseBadgesPages[gPauseBadgesCurrentPage].enabled) {
1034 gPauseBadgesCurrentPage--;
1035 selectedRow--;
1036 }
1037 }
1038 } else {
1039 // R button press
1041
1042 gPauseBadgesCurrentPage++;
1043 newPage = &gPauseBadgesPages[gPauseBadgesCurrentPage];
1044
1045 if (!newPage->enabled) {
1046 gPauseBadgesCurrentPage--;
1047 } else {
1048 selectedRow = newPage->listStart;
1049 }
1050 }
1051 }
1052
1053 newPageNumCols = gPauseBadgesPages[gPauseBadgesCurrentPage].numCols;
1054 if (gPauseBadgesItemIds[selectedRow * newPageNumCols] != BADGE_NONE_STANDIN) {
1056 selectedCol--;
1057 if (selectedCol < 0) {
1059 }
1061 selectedCol += 1;
1062 if (selectedCol >= newPageNumCols) {
1063 selectedCol = 0;
1064 }
1065 }
1066 } else {
1067 selectedCol = 0;
1068 }
1069 gPauseBadgesSelectedIndex = selectedCol + (selectedRow * gPauseBadgesPages[gPauseBadgesCurrentPage].numCols);
1070 if (gPauseBadgesSelectedIndex != selectedIndex) {
1072 }
1073 gPauseBadgesSelectedItem = gPauseBadgesItemIds[gPauseBadgesSelectedIndex];
1074 }
1075 }
1076
1077 if (gPauseBadgesLevel == 1) {
1078 s32 itemID = gPauseBadgesSelectedItem;
1079
1080 if (((itemID != BADGE_NONE_STANDIN) && (itemID != BADGE_INVALID) && (itemID != 0))) {
1082 } else {
1085 }
1086 } else {
1089 }
1090
1092 if (gPauseBadgesLevel == 0) {
1095 } else {
1097 gPauseBadgesLevel = 0;
1099 if (gPauseBadgesCurrentTab == 1) {
1101 }
1102 }
1103 }
1104}
@ 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
@ SOUND_MENU_BADGE_EQUIP
Definition enums.h:555
@ SOUND_MENU_BADGE_UNEQUIP
Definition enums.h:556
@ 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
void enforce_hpfp_limits(void)
Definition inventory.c:462
s32 pause_badges_try_equip(s16 badgeID)
#define TRY_REMOVE_NOT_ENOUGH_BP_RESULT
s32 pause_badges_try_remove(s16 badgeID)
s32 gPausePressedButtons
Definition pause_main.c:24
@ PAUSE_MSG_BAGDE_DESC_ALL
@ PAUSE_MSG_BAGDE_DESC_ACTIVE
s32 gPauseHeldButtons
Definition pause_main.c:23
s32 gPauseCurrentDescMsg
Definition pause_main.c:25
void sfx_play_sound(s32 soundID)

◆ pause_badges_update()

void pause_badges_update ( MenuPanel * panel)

Definition at line 1106 of file pause_badges.c.

1106 {
1107 PauseItemPage* menuPages = gPauseBadgesPages;
1108 PauseItemPage* currentMenuPage = &menuPages[gPauseBadgesCurrentPage];
1109 s32 itemIndex = (gPauseBadgesSelectedIndex / currentMenuPage->numCols) - currentMenuPage->listStart;
1110
1111 if (itemIndex < 2 || currentMenuPage->numRows < 9) {
1112 gPauseBadgesTargetScrollIndex = 0;
1113 } else if (itemIndex >= currentMenuPage->numRows - 2) {
1114 gPauseBadgesTargetScrollIndex = currentMenuPage->numRows - 8;
1115 } else {
1116 if (itemIndex - gPauseBadgesTargetScrollIndex >= 7) {
1117 gPauseBadgesTargetScrollIndex = itemIndex - 6;
1118 } else if (itemIndex - gPauseBadgesTargetScrollIndex <= 0) {
1119 gPauseBadgesTargetScrollIndex = itemIndex - 1;
1120 }
1121 }
1122
1123 gPauseBadgesTargetScrollPos = pause_badges_get_pos_y(gPauseBadgesCurrentPage, gPauseBadgesTargetScrollIndex * currentMenuPage->numCols);
1124 gPauseBadgesCurrentScrollPos += pause_interp_vertical_scroll(gPauseBadgesTargetScrollPos - gPauseBadgesCurrentScrollPos);
1125}
s32 pause_interp_vertical_scroll(s32 deltaBefore)
Definition pause_main.c:447

◆ pause_badges_cleanup()

void pause_badges_cleanup ( MenuPanel * panel)

Definition at line 1127 of file pause_badges.c.

1127 {
1128 s32 i;
1129
1130 for (i = 0; i < ARRAY_COUNT(gPauseBadgesIconIDs); i++) {
1131 hud_element_free(gPauseBadgesIconIDs[i]);
1132 }
1133}
void hud_element_free(s32 id)

◆ pause_badges_comparator()

s32 pause_badges_comparator ( s16 * a,
s16 * b )

Definition at line 127 of file pause_badges.c.

127 {
128 s16 aVal;
129 s16 bVal;
130
131 if (*a == 0) {
133 } else {
135 }
136
137 if (*b == 0) {
139 } else {
141 }
142
143 if (aVal == bVal) {
144 return 0;
145 } else if (aVal < bVal) {
146 return -1;
147 } else {
148 return 1;
149 }
150}

Referenced by pause_badges_count_all(), and pause_badges_count_equipped().

◆ pause_badges_count_all()

s32 pause_badges_count_all ( void )

Definition at line 152 of file pause_badges.c.

152 {
154 s32 i;
155
157
158 for (i = 0; i < ARRAY_COUNT(playerData->badges); i++) {
159 if (playerData->badges[i] == 0) {
160 break;
161 }
162 }
163
164 return i;
165}
s32 pause_badges_comparator(s16 *a, s16 *b)
void pause_sort_item_list(s16 *arr, s32 len, s32(*compare)(s16 *, s16 *))
Definition pause_main.c:847

Referenced by pause_badges_init().

◆ pause_badges_count_equipped()

s32 pause_badges_count_equipped ( void )

Definition at line 167 of file pause_badges.c.

167 {
169 s32 i;
170
172
173 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++) {
174 if (playerData->equippedBadges[i] == 0) {
175 break;
176 }
177 }
178
179 return i;
180}

Referenced by pause_badges_load_badges().

◆ pause_badges_get_pos_x()

s32 pause_badges_get_pos_x ( s32 page,
s32 itemIndex )

Definition at line 182 of file pause_badges.c.

182 {
183 return (itemIndex % BADGE_MENU_PAGE(page)->numCols) * 141;
184}
#define BADGE_MENU_PAGE(index)
Definition macros.h:72

Referenced by pause_badges_draw_contents().

◆ pause_badges_get_pos_y()

s32 pause_badges_get_pos_y ( s32 page,
s32 itemIndex )

Definition at line 186 of file pause_badges.c.

186 {
187 return ((page + 1) * 11) + (BADGE_MENU_PAGE(page)->listStart * 16) + ((itemIndex / BADGE_MENU_PAGE(
188 page)->numCols) * 16);
189}

Referenced by pause_badges_draw_contents(), pause_badges_load_badges(), and pause_badges_update().

◆ pause_badges_get_column()

s32 pause_badges_get_column ( s32 page,
s32 itemIdx )

Definition at line 191 of file pause_badges.c.

191 {
192 return itemIdx % BADGE_MENU_PAGE(page)->numCols;
193}

Referenced by pause_badges_draw_contents().

◆ pause_badges_get_row()

s32 pause_badges_get_row ( s32 page,
s32 itemIdx )

Definition at line 195 of file pause_badges.c.

195 {
196 return BADGE_MENU_PAGE(page)->listStart + (itemIdx / BADGE_MENU_PAGE(page)->numCols);
197}

Referenced by pause_badges_draw_contents().

◆ pause_badges_is_visible()

s32 pause_badges_is_visible ( s32 y)

Definition at line 199 of file pause_badges.c.

199 {
200 if (y < gPauseBadgesCurrentScrollPos - 32) {
201 return false;
202 } else {
203 return y < gPauseBadgesCurrentScrollPos + 128;
204 }
205}

Referenced by pause_badges_draw_contents().

◆ pause_badges_scroll_offset_y()

s32 pause_badges_scroll_offset_y ( s32 offset)

Definition at line 207 of file pause_badges.c.

207 {
208 return offset - gPauseBadgesCurrentScrollPos;
209}

Referenced by pause_badges_draw_contents().

◆ pause_badges_scroll_offset_x()

s32 pause_badges_scroll_offset_x ( s32 x)

Definition at line 211 of file pause_badges.c.

211 {
212 return x;
213}

Referenced by pause_badges_draw_contents().

◆ pause_badges_try_remove()

s32 pause_badges_try_remove ( s16 badgeID)

Definition at line 215 of file pause_badges.c.

215 {
218 s32 result = 0;
219 s32 i;
220 s32 bpCost;
221
222 if (badgeID == BADGE_INVALID) {
223 return 0;
224 }
225
226 // handle negative bp cost badges
230 }
231
232 for (i = 0; i < ARRAY_COUNT(gPlayerData.equippedBadges); i++, currentSlot++) {
233 if (badgeID == *currentSlot) {
235 result = 1;
236 break;
237 }
238 }
239
240 // Remove and shift array contents
241 for (; i < ARRAY_COUNT(gPlayerData.equippedBadges) - 1; i++, currentSlot++) {
242 *currentSlot = *(currentSlot + 1);
243 }
244 *currentSlot = 0;
245
246 if (*slotToRemove == 0) {
247 result = 2;
248 }
249 return result;
250}

Referenced by pause_badges_handle_input().

◆ pause_badges_try_equip()

s32 pause_badges_try_equip ( s16 badgeID)

Definition at line 259 of file pause_badges.c.

259 {
262 s32 i;
264
266 badgeID = 0;
267 }
268 if (badgeID == BADGE_INVALID) {
269 badgeID = 0;
270 }
271 if (badgeID == 0) {
273 }
274
275 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++, badgeSlot++) {
276 if (*badgeSlot == badgeID) {
278 }
279 }
280
282 if (badgeID != 0) {
283 u8 moveID = gItemTable[badgeID].moveID;
285
286 if (playerData->maxBP < requiredBP) {
288 }
289 }
290
291 badgeSlot = &playerData->equippedBadges[0];
292 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++, badgeSlot++) {
293 if (*badgeSlot == 0) {
295 break;
296 }
297 }
298 if (i == ARRAY_COUNT(playerData->equippedBadges)) {
300 } else {
302 }
303}

Referenced by pause_badges_handle_input().

◆ pause_badges_draw_bp_orbs()

void pause_badges_draw_bp_orbs ( s32 orbState,
s32 x,
s32 y )

Definition at line 305 of file pause_badges.c.

305 {
306 s32 orbSize = 8;
307
308 switch (orbState) {
309 case 0:
310 pause_draw_rect(x * 4, y * 4, (x + orbSize) * 4, (y + orbSize) * 4, 0, 0, 256, 1024, 1024);
311 break;
312 case 1:
313 pause_draw_rect(x * 4, y * 4, (x + orbSize) * 4, (y + orbSize) * 4, 0, 0, 0, 1024, 1024);
314 break;
315 default:
316 pause_draw_rect(x * 4, y * 4, (x + orbSize) * 4, (y + orbSize) * 4, 0, 0, 512, 1024, 1024);
317 break;
318 }
319}
void pause_draw_rect(s32 ulx, s32 uly, s32 lrx, s32 lry, s32 tileIdx, s32 uls, s32 ult, s32 dsdx, s32 dtdy)
Definition pause_main.c:837

Referenced by pause_badges_draw_contents().

◆ pause_badges_load_badges()

void pause_badges_load_badges ( s32 onlyEquipped)

Definition at line 826 of file pause_badges.c.

826 {
828 s32 numItems = 0;
830 s32 i;
831
832 D_80270388 = 0;
833 if (!onlyEquipped) {
834 for (i = 0; i < ARRAY_COUNT(playerData->badges); i++) {
835 s16 badgeItemID = playerData->badges[i];
836
837 if (badgeItemID == ITEM_NONE) {
838 continue;
839 } else {
840 gPauseBadgesItemIds[numItems] = badgeItemID;
841 numItems += 1;
842 }
843 }
844 } else {
845 s16* equippedBadges;
846
847 // This is just called to sort equippedBadges, the count is discarded
849
850 equippedBadges = playerData->equippedBadges;
851 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++) {
852 // This can be written more clearly as equippedBadges[i],
853 // but that causes some instruction reordering
854 s16 badgeItemID = *equippedBadges;
855
856 if (badgeItemID != 0) {
857 gPauseBadgesItemIds[numItems] = badgeItemID;
858 numItems += 1;
859 }
860 equippedBadges++;
861 }
862 }
863 if (numItems == 0) {
864 gPauseBadgesItemIds[0] = BADGE_NONE_STANDIN;
865 numItems = 1;
866 }
867 gPauseBadgesNumItems = numItems;
868 for (i = numItems; i < ARRAY_COUNT(gPauseBadgesItemIds); i++) {
869 gPauseBadgesItemIds[i] = BADGE_INVALID;
870 }
871
872 gPauseBadgesSelectedIndex = 0;
873 gPauseBadgesSelectedItem = 0;
874 D_8027037C = 0;
875 gPauseBadgesTargetScrollIndex = 0;
876 gPauseBadgesCurrentPage = 0;
877
878 page = &gPauseBadgesPages[0];
879 for (i = 0; i < gPauseBadgesNumItems / 8; i++, page++) {
880 page->listStart = i * 8;
881 page->numCols = 1;
882 page->numRows = 8;
883 page->enabled = true;
884 page->startIndex = i * 8;
885 page->count = 8;
886 }
887
888 if ((gPauseBadgesNumItems % 8) != 0) {
889 page->listStart = i * 8;
890 page->numCols = 1;
891 page->enabled = true;
892 page->startIndex = i * 8;
893 page->count = gPauseBadgesNumItems % 8;
894 page->numRows = page->count;
895 i++;
896 page++;
897 }
898
899 while (i < ARRAY_COUNT(gPauseBadgesPages)) {
900 page->enabled = false;
901 i++;
902 page++;
903 }
904
905 gPauseBadgesTargetScrollPos = gPauseBadgesCurrentScrollPos = pause_badges_get_pos_y(0, 0);
906}
s32 pause_badges_count_equipped(void)

Referenced by pause_badges_handle_input(), and pause_badges_init().

Variable Documentation

◆ PauseGfxOrbs

◆ gPauseBadgesElements

HudScript* gPauseBadgesElements[][22]

Definition at line 54 of file pause_badges.c.

54 {
62 },
63#if VERSION_PAL
64 [LANGUAGE_DE] = {
71 },
72 [LANGUAGE_FR] = {
79 },
80 [LANGUAGE_ES] = {
87 },
88#endif
89};
@ LANGUAGE_DE
Definition enums.h:5992
@ LANGUAGE_FR
Definition enums.h:5993
#define LANGUAGE_DEFAULT
Definition enums.h:5989
HudScript HES_StatusStar1
HudScript HES_Dash
HudScript HES_ListPrevPage
HudScript HES_LabelBpNeeded
HudScript HES_ListNextPage
HudScript HES_StatBp

Referenced by pause_badges_init().

◆ gPauseBadgesWindowBPs

MenuWindowBP gPauseBadgesWindowBPs[]
Initial value:
= {
{
.windowID = WIN_PAUSE_BADGES,
.unk_01 = 0,
.pos = { .x = 3, .y = 16 },
.width = 289,
.height = 154,
.priority = WINDOW_PRIORITY_1,
.fpDrawContents = &pause_badges_draw_contents,
.tab = nullptr,
.parentID = WIN_PAUSE_MAIN,
.fpUpdate = { WINDOW_UPDATE_HIDE },
.extraFlags = 0,
.style = { .customStyle = &gPauseWS_16 }
}
}
@ WINDOW_PRIORITY_1
Definition enums.h:3217
@ WINDOW_UPDATE_HIDE
Definition enums.h:4897
@ WIN_PAUSE_MAIN
Definition enums.h:4848
void pause_badges_draw_contents(MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
WindowStyleCustom gPauseWS_16

Definition at line 95 of file pause_badges.c.

95 {
96 {
97 .windowID = WIN_PAUSE_BADGES,
98 .unk_01 = 0,
99 .pos = { .x = 3, .y = 16 },
100 .width = 289,
101 .height = 154,
102 .priority = WINDOW_PRIORITY_1,
103 .fpDrawContents = &pause_badges_draw_contents,
104 .tab = nullptr,
105 .parentID = WIN_PAUSE_MAIN,
106 .fpUpdate = { WINDOW_UPDATE_HIDE },
107 .extraFlags = 0,
108 .style = { .customStyle = &gPauseWS_16 }
109 }
110};

Referenced by pause_badges_init().

◆ gPausePanelBadges

MenuPanel gPausePanelBadges
Initial value:
= {
.initialized = false,
.col = 0,
.row = 0,
.selected = 0,
.state = 0,
.numCols = 0,
.numRows = 0,
.numPages = 0,
.gridData = nullptr,
.fpInit = &pause_badges_init,
.fpHandleInput = &pause_badges_handle_input,
.fpUpdate = &pause_badges_update,
.fpCleanup = &pause_badges_cleanup
}
void pause_badges_init(MenuPanel *panel)
void pause_badges_handle_input(MenuPanel *panel)
void pause_badges_cleanup(MenuPanel *panel)
void pause_badges_update(MenuPanel *panel)

Definition at line 111 of file pause_badges.c.

111 {
112 .initialized = false,
113 .col = 0,
114 .row = 0,
115 .selected = 0,
116 .state = 0,
117 .numCols = 0,
118 .numRows = 0,
119 .numPages = 0,
120 .gridData = nullptr,
121 .fpInit = &pause_badges_init,
122 .fpHandleInput = &pause_badges_handle_input,
123 .fpUpdate = &pause_badges_update,
124 .fpCleanup = &pause_badges_cleanup
125};