2#if DX_DEBUG_MENU || defined(DX_QUICK_LAUNCH_BATTLE)
14const s32 MainMenuPosX = 26;
15const s32 MainMenuPosY = 60;
17const s32 RowHeight = 15;
18const s32 BottomRowY = 222;
20const s32 SubmenuPosX = 140;
21const s32 SubmenuPosY = MainMenuPosY;
23const s32 SubBoxPosX = SubmenuPosX - 10;
24const s32 SubBoxPosY = SubmenuPosY - 4;
47 DBM_INV_EDIT_STAR_POINTS,
48 DBM_INV_EDIT_STAR_PIECES,
52} DebugMenuState = DBM_NONE;
53b32 DebugStateChanged = FALSE;
63char LastStageName[16];
67void dx_debug_set_map_info(
char* mapName, s32 entryID) {
68 strcpy(LastMapName, mapName);
69 LastMapEntry = entryID;
72void dx_debug_set_battle_info(s32 battleID,
char* stageName) {
73 s32 len = strlen(stageName);
75 strcpy(LastStageName, stageName);
78 LastStageName[len - 6] =
'\0';
80 LastBattleID = battleID;
89u32 DebugButtonsRelease;
91typedef struct DebugHold {
96DebugHold DebugHoldU = { 0 };
97DebugHold DebugHoldD = { 0 };
98DebugHold DebugHoldL = { 0 };
99DebugHold DebugHoldR = { 0 };
101#define PRESSED(but) (DebugButtonsPress & (but))
102#define RELEASED(but) (DebugButtonsRelease & (but))
103#define HELD(but) (DebugButtonsHold & (but))
105#define INIT_HOLD_RATE 6
106#define SLOW_HOLD_RATE 4
107#define FAST_HOLD_RATE 2
109void dx_debug_update_hold_frames(DebugHold* hold, u32 but) {
111 hold->delay = INIT_HOLD_RATE;
113 }
else if (HELD(but)) {
115 if (hold->delay < 0) {
118 if (hold->triggers < 5) {
119 hold->delay = SLOW_HOLD_RATE;
120 }
else if (hold->triggers < 15) {
121 hold->delay = FAST_HOLD_RATE;
132void dx_debug_update_buttons() {
133 DebugButtonsPrev = DebugButtonsCur;
135 DebugButtonsHold = DebugButtonsCur & DebugButtonsPrev;
136 DebugButtonsPress = DebugButtonsCur & (DebugButtonsCur ^ DebugButtonsPrev);
137 DebugButtonsRelease = DebugButtonsPrev & (DebugButtonsCur ^ DebugButtonsPrev);
139 dx_debug_update_hold_frames(&DebugHoldU,
BUTTON_D_UP);
145#define NAV_UP (PRESSED(BUTTON_D_UP) || DebugHoldU.delay == 0)
146#define NAV_DOWN (PRESSED(BUTTON_D_DOWN) || DebugHoldD.delay == 0)
147#define NAV_LEFT (PRESSED(BUTTON_D_LEFT) || DebugHoldL.delay == 0)
148#define NAV_RIGHT (PRESSED(BUTTON_D_RIGHT) || DebugHoldR.delay == 0)
152void dx_debug_draw_box(s32 posX, s32 posY, s32 sizeX, s32 sizeY,
int style, s32 opacity) {
154 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, NULL, 0, NULL,
SCREEN_WIDTH,
SCREEN_HEIGHT, NULL);
157void dx_debug_draw_ascii(
char* text, s32 color, s32 posX, s32 posY) {
162 draw_msg((s32)buf, posX, posY, 255, color, 0);
165void dx_debug_draw_ascii_with_effect(
char* text, s32 color, s32 posX, s32 posY, s32 effect) {
170 draw_msg((s32)buf, posX, posY, 255, color, effect);
173void dx_debug_draw_msg(s32 msgID, s32 color, s32 alpha, s32 posX, s32 posY) {
178 draw_msg((s32)buf, posX, posY, alpha, color, 0);
181void dx_debug_draw_number(s32 number,
char* fmt, s32 color, s32 alpha, s32 posX, s32 posY) {
186 sprintf(fmtBuf, fmt, number);
188 draw_msg((s32)buf, posX, posY, alpha, color, 0);
192void dx_debug_draw_editable_number(s32 number,
char* fmt, s32 selectedDigit,
b32 hasSelected, s32 posX, s32 posY) {
200 s32 len = sprintf(fmtBuf, fmt, number);
203 for (idx = 0; idx < len; idx++) {
204 if (hasSelected && selectedDigit == idx) {
209 msgBuf[
pos++] = HighlightColor;
212 if (hasSelected && selectedDigit == idx) {
219 if (hasSelected && selectedDigit == -1) {
220 draw_msg((s32)msgBuf, posX, posY, 255, HighlightColor, 0);
222 draw_msg((s32)msgBuf, posX, posY, 255, DefaultColor, 0);
228s32 dx_debug_clamp(s32 v, s32 min, s32 max) {
229 const s32 u = v < min ? min : v;
230 return u > max ? max : u;
233s32 dx_debug_wrap(s32 v, s32 min, s32 max) {
234 const s32 u = v < min ? v + (max - min + 1) : v;
235 return u > max ? u - (max - min + 1) : u;
239s32 dx_debug_menu_nav_1D_vertical(s32 cur, s32 min, s32 max,
b32 flip) {
256 cur += (1 + max - min);
259 cur -= (1 + max - min);
265s32 dx_debug_menu_nav_1D_horizontal(s32 cur, s32 min, s32 max,
b32 flip) {
282 cur += (1 + max - min);
285 cur -= (1 + max - min);
290s32 dx_debug_menu_nav_2D(s32 cur, s32 max, s32 nrows) {
291 s32 ncols = max / nrows;
292 if ((max % nrows) != 0) {
301 else if (cur % nrows == nrows - 1) {
311 cur = (cur / nrows) * nrows;
313 else if (cur % nrows == 0) {
320 cur += (nrows * ncols);
329 cur -= (nrows * ncols);
340typedef struct DebugEditableNumber {
345} DebugEditableNumber;
347void dx_debug_nav_editable_num(DebugEditableNumber* num) {
348 s32 max = num->isHex ? 0xF : 9;
351 num->pos = dx_debug_menu_nav_1D_horizontal(num->pos, 0, num->size - 1, FALSE);
353 num->digits[num->pos] = dx_debug_menu_nav_1D_vertical(num->digits[num->pos], 0, max, TRUE);
356void dx_debug_draw_editable_num(DebugEditableNumber* num, s32 posX, s32 posY) {
357 char* fmt = num->isHex ?
"%X" :
"%d";
360 for (idx = 0; idx < num->size; idx++) {
361 s32 color = (num->pos == idx) ? HighlightColor : DefaultColor;
362 dx_debug_draw_number(num->digits[idx], fmt, color, 255, posX + (7 * idx), posY);
366s32 dx_debug_get_editable_num(DebugEditableNumber* num) {
371 for (idx = 0; idx < num->size; idx++) {
373 out |= (num->digits[idx] & 0xF);
376 for (idx = 0; idx < num->size; idx++) {
378 out += num->digits[idx];
385void dx_debug_set_editable_num(DebugEditableNumber* num, s32 in) {
389 for (idx = num->size - 1; idx >= 0; idx--) {
390 num->digits[idx] = (in & 0xF);
394 for (idx = num->size - 1; idx >= 0; idx--) {
395 num->digits[idx] = in % 10;
403void dx_debug_draw_main_menu();
405b32 dx_debug_menu_is_open() {
406 return DebugMenuState != DBM_NONE;
409void dx_debug_exec_full_restore() {
416typedef struct DebugMenuEntry {
422DebugMenuEntry DebugMainMenu[] = {
423 {
"Full Restore", dx_debug_exec_full_restore },
424 {
"Save/Load", NULL, DBM_QUICK_SAVE },
425 {
"Map Select", NULL, DBM_SELECT_AREA },
426 {
"Battle Select", NULL, DBM_SELECT_BATTLE },
427 {
"Set Story Byte", NULL, DBM_SET_STORY },
428 {
"Sound Player", NULL, DBM_SOUND_PLAYER },
429 {
"Edit Partners", NULL, DBM_EDIT_PARTNERS },
430 {
"Edit Inventory", NULL, DBM_EDIT_INVENTORY },
432 {
"View Collision", NULL, DBM_VIEW_COLLISION },
433 {
"Cheats", NULL, DBM_CHEAT_MENU },
438const s32 MainBoxPosX = MainMenuPosX - 10;
439const s32 MainBoxPosY = MainMenuPosY - 4;
440const s32 MainBoxWidth = 96;
441const s32 MainBoxHeight =
ARRAY_COUNT(DebugMainMenu) * RowHeight + 8;
443f32 ArrowAnimOffset = 0;
444f32 DebugArrowPhase = 0.0f;
445#define DEBUG_ARROW_ANIM_RATE 6
447void dx_debug_update_banner();
448void dx_debug_update_main_menu();
449void dx_debug_update_quick_save();
450void dx_debug_update_select_area();
451void dx_debug_update_select_map();
452void dx_debug_update_select_entry();
453void dx_debug_update_select_battle();
454void dx_debug_update_edit_progress();
455void dx_debug_update_sound_player();
456void dx_debug_update_select_sound();
457void dx_debug_update_edit_partners();
458void dx_debug_update_edit_inventory();
459void dx_debug_update_edit_items();
460void dx_debug_update_edit_items();
461void dx_debug_update_edit_items();
462void dx_debug_update_edit_gear();
463void dx_debug_update_edit_stats();
464void dx_debug_update_edit_coins();
465void dx_debug_update_edit_star_points();
466void dx_debug_update_edit_star_pieces();
467void dx_debug_update_view_collision();
468void dx_debug_update_cheat_menu();
470void dx_debug_menu_main() {
471 s32 initialMenuState = DebugMenuState;
473 dx_debug_update_buttons();
475 HighlightColor = HELD(
BUTTON_R) ? SelectColor : HoverColor;
477 DebugArrowPhase += DEBUG_ARROW_ANIM_RATE;
478 if (DebugArrowPhase >= 360.0f) {
479 DebugArrowPhase -= 360.0f;
481 ArrowAnimOffset =
cos_deg(DebugArrowPhase);
483 dx_debug_update_banner();
486 if (DebugMenuState == DBM_NONE) {
488 DebugMenuState = DBM_MAIN_MENU;
490 }
else if (DebugMenuState == DBM_MAIN_MENU) {
492 DebugMenuState = DBM_NONE;
496 if (DebugMenuState != DBM_NONE) {
498 dx_debug_draw_main_menu();
500 switch (DebugMenuState) {
504 dx_debug_update_main_menu();
507 dx_debug_update_quick_save();
509 case DBM_SELECT_AREA:
510 dx_debug_update_select_area();
513 dx_debug_update_select_map();
515 case DBM_SELECT_ENTRY:
516 dx_debug_update_select_entry();
518 case DBM_SELECT_BATTLE:
519 dx_debug_update_select_battle();
522 dx_debug_update_edit_progress();
524 case DBM_SOUND_PLAYER:
525 dx_debug_update_sound_player();
527 case DBM_SELECT_SOUND:
528 dx_debug_update_select_sound();
530 case DBM_EDIT_PARTNERS:
531 dx_debug_update_edit_partners();
533 case DBM_EDIT_INVENTORY:
534 dx_debug_update_edit_inventory();
536 case DBM_INV_EDIT_ITEMS:
537 dx_debug_update_edit_items();
539 case DBM_INV_EDIT_BADGES:
540 dx_debug_update_edit_items();
542 case DBM_INV_EDIT_KEYS:
543 dx_debug_update_edit_items();
545 case DBM_INV_EDIT_GEAR:
546 dx_debug_update_edit_gear();
548 case DBM_INV_EDIT_STATS:
549 dx_debug_update_edit_stats();
551 case DBM_INV_EDIT_COINS:
552 dx_debug_update_edit_coins();
554 case DBM_INV_EDIT_STAR_POINTS:
555 dx_debug_update_edit_star_points();
557 case DBM_INV_EDIT_STAR_PIECES:
558 dx_debug_update_edit_star_pieces();
560 case DBM_EDIT_MEMORY:
562 case DBM_VIEW_COLLISION:
563 dx_debug_update_view_collision();
566 dx_debug_update_cheat_menu();
571 DebugStateChanged = (initialMenuState != DebugMenuState);
574void dx_debug_update_main_menu() {
575 MainMenuPos = dx_debug_menu_nav_1D_vertical(MainMenuPos, 0,
ARRAY_COUNT(DebugMainMenu) - 1, FALSE);
577 if (DebugMainMenu[MainMenuPos].onSelect != NULL) {
578 DebugMainMenu[MainMenuPos].onSelect();
580 DebugMenuState = DebugMainMenu[MainMenuPos].nextState;
585void dx_debug_draw_main_menu() {
588 dx_debug_draw_box(MainBoxPosX, MainBoxPosY, MainBoxWidth, MainBoxHeight,
WINDOW_STYLE_4, 192);
590 for (idx = 0; idx <
ARRAY_COUNT(DebugMainMenu); idx++) {
591 s32 color = DefaultColor;
592 if (MainMenuPos == idx) {
593 color = (DebugMenuState == DBM_MAIN_MENU) ? HighlightColor : HoverColor;
595 dx_debug_draw_ascii(DebugMainMenu[idx].text, color, MainMenuPosX, MainMenuPosY + idx * RowHeight);
603void dx_debug_exec_quick_save() {
609 DebugMenuState = DBM_MAIN_MENU;
612void dx_debug_exec_quick_load() {
616 DebugMenuState = DBM_MAIN_MENU;
619DebugMenuEntry DebugQuickSaveMenu[] = {
620 {
"Cancel", NULL, DBM_MAIN_MENU },
621 {
"Quick Save", dx_debug_exec_quick_save },
622 {
"Quick Load", dx_debug_exec_quick_load },
624s32 QuickSaveMenuPos = 0;
626void dx_debug_update_quick_save() {
630 QuickSaveMenuPos = dx_debug_menu_nav_1D_vertical(QuickSaveMenuPos, 0,
ARRAY_COUNT(DebugQuickSaveMenu) - 1, FALSE);
632 DebugMenuState = DBM_MAIN_MENU;
634 if (DebugQuickSaveMenu[QuickSaveMenuPos].onSelect != NULL) {
635 DebugQuickSaveMenu[QuickSaveMenuPos].onSelect();
637 DebugMenuState = DebugQuickSaveMenu[QuickSaveMenuPos].nextState;
642 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 75,
ARRAY_COUNT(DebugQuickSaveMenu) * RowHeight + 8,
WINDOW_STYLE_20, 192);
644 for (idx = 0; idx <
ARRAY_COUNT(DebugQuickSaveMenu); idx++) {
645 s32 color = (QuickSaveMenuPos == idx) ? HighlightColor : DefaultColor;
646 dx_debug_draw_ascii(DebugQuickSaveMenu[idx].text, color, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
653s32 SelectAreaMenuPos = 0;
654s32 SelectMapMenuPos = 0;
655s32 SelectedEntryValue = 0;
657const s32 AreaSizeX = 30;
658const s32 MapSizeX = 50;
660void dx_debug_update_select_area() {
664 s32 prev = SelectAreaMenuPos;
672 }
else if (numAreas <= 12) {
675 }
else if (numAreas <= 18) {
678 }
else if (numAreas <= 24) {
681 }
else if (numAreas <= 30) {
684 }
else if (numAreas <= 35) {
687 }
else if (numAreas <= 40) {
697 SelectAreaMenuPos = dx_debug_menu_nav_2D(SelectAreaMenuPos, numAreas, nrows);
698 if (SelectAreaMenuPos != prev) {
699 SelectMapMenuPos = 0;
700 SelectedEntryValue = 0;
703 DebugMenuState = DBM_MAIN_MENU;
705 DebugMenuState = DBM_SELECT_MAP;
710 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, AreaSizeX * ncols + 8, RowHeight * nrows + 8,
WINDOW_STYLE_20, 192);
713 for (i = 0; i < ncols; i++) {
714 for (j = 0; j < nrows; j++) {
715 if (idx < numAreas) {
716 s32 color = (SelectAreaMenuPos == idx) ? HighlightColor : DefaultColor;
718 dx_debug_draw_ascii(name, color, SubmenuPosX + i * AreaSizeX, SubmenuPosY + (j + 1) * RowHeight);
725void dx_debug_update_select_map() {
727 s32 numRows, numCols;
728 s32 curCol, maxCol, startCol;
731 s32 prev = SelectMapMenuPos;
738 }
else if (numMaps <= 12) {
748 SelectMapMenuPos = dx_debug_menu_nav_2D(SelectMapMenuPos, numMaps, numRows);
749 if (SelectMapMenuPos != prev) {
750 SelectedEntryValue = 0;
753 DebugMenuState = DBM_SELECT_AREA;
755 DebugMenuState = DBM_SELECT_ENTRY;
760 curCol = SelectMapMenuPos / numRows;
761 maxCol = numMaps / numRows;
764 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, MapSizeX * numCols + 8, RowHeight * (numRows + 1) + 8,
WINDOW_STYLE_20, 192);
766 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, MapSizeX * numCols + 8, RowHeight * numRows + 8,
WINDOW_STYLE_20, 192);
771 }
else if (curCol == 0) {
773 }
else if (curCol == maxCol) {
774 startCol = maxCol - 2;
776 startCol = curCol - 1;
779 idx = numRows * startCol;
780 for (i = startCol; i <= startCol + 2; i++) {
781 for (j = 0; j < numRows; j++) {
783 s32 color = (SelectMapMenuPos == idx) ? HighlightColor : DefaultColor;
784 char* name = maps[idx].
id;
785 dx_debug_draw_ascii(name, color, SubmenuPosX + (i - startCol) * MapSizeX, SubmenuPosY + (j + 1) * RowHeight);
794 char msgLeftArrow[] = {
797 draw_msg((s32)msgLeftArrow, SubmenuPosX - 2 -
round(3.0f * ArrowAnimOffset), SubmenuPosY + 104, 255, DefaultColor, 0);
800 if (curCol < maxCol - 1) {
801 char msgRightArrow[] = {
804 draw_msg((s32)msgRightArrow, SubmenuPosX + 128 +
round(3.0f * ArrowAnimOffset), SubmenuPosY + 104, 255, DefaultColor, 0);
809void dx_debug_update_select_entry() {
810 s32 idx, areaID, mapID;
815 DebugMenuState = DBM_SELECT_MAP;
823 DebugMenuState = DBM_NONE;
827 SelectedEntryValue++;
830 SelectedEntryValue--;
833 if (SelectedEntryValue < 0) {
834 SelectedEntryValue = 0;
836 if (SelectedEntryValue > 0x7F) {
837 SelectedEntryValue = 0x7F;
841 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 80, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
843 for (idx = 0; idx <
ARRAY_COUNT(DebugQuickSaveMenu); idx++) {
845 dx_debug_draw_ascii(map.
id, DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
846 dx_debug_draw_ascii(
"Entry:", DefaultColor, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
847 sprintf(fmtBuf,
"%2lX", SelectedEntryValue);
848 dx_debug_draw_ascii(fmtBuf, HighlightColor, SubmenuPosX + 40, SubmenuPosY + 2 * RowHeight);
855enum DebugBattleValues {
856 DEBUG_BATTLE_AREA_TENS,
857 DEBUG_BATTLE_AREA_ONES,
858 DEBUG_BATTLE_FORMATION_TENS,
859 DEBUG_BATTLE_FORMATION_ONES,
863s32 DebugBattleNum[] = {
864 [DEBUG_BATTLE_AREA_TENS] 0,
865 [DEBUG_BATTLE_AREA_ONES] 0,
866 [DEBUG_BATTLE_FORMATION_TENS] 0,
867 [DEBUG_BATTLE_FORMATION_ONES] 0,
868 [DEBUG_BATTLE_STAGE] -1,
871s32 BattleDigitOffsets[] = {
872 [DEBUG_BATTLE_AREA_TENS] 10,
873 [DEBUG_BATTLE_AREA_ONES] 17,
874 [DEBUG_BATTLE_FORMATION_TENS] 35,
875 [DEBUG_BATTLE_FORMATION_ONES] 42,
876 [DEBUG_BATTLE_STAGE] 63,
879s32 DebugBattleColumn = 0;
883Enemy DebugDummyEnemy = {
884 .
npcID = DX_DEBUG_DUMMY_ID,
885 .drops = &DebugDummyDrops,
890 .enemy = { &DebugDummyEnemy },
896void dx_debug_begin_battle_with_IDs(s16 battle, s16 stage) {
899 DebugDummyEncounter.
battle = battle;
900 DebugDummyEncounter.
stage = stage;
921void dx_debug_begin_battle() {
922 s16 battle = (DebugBattleNum[DEBUG_BATTLE_AREA_TENS] & 0xF) << 12
923 | (DebugBattleNum[DEBUG_BATTLE_AREA_ONES] & 0xF) << 8
924 | (DebugBattleNum[DEBUG_BATTLE_FORMATION_TENS] & 0xF) << 4
925 | (DebugBattleNum[DEBUG_BATTLE_FORMATION_ONES] & 0xF);
926 s16 stage = DebugBattleNum[DEBUG_BATTLE_STAGE] & 0xFFFF;
928 dx_debug_begin_battle_with_IDs(battle, stage);
931void dx_debug_update_select_battle() {
938 DebugMenuState = DBM_MAIN_MENU;
940 dx_debug_begin_battle();
941 DebugMenuState = DBM_NONE;
944 DebugBattleColumn = dx_debug_menu_nav_1D_horizontal(DebugBattleColumn, 0, 4, FALSE);
946 s32 value = DebugBattleNum[DebugBattleColumn] + 1;
947 if (DebugBattleColumn == DEBUG_BATTLE_STAGE) {
948 value = dx_debug_clamp(value, -1, 0x7F);
949 }
else if (DebugBattleColumn == DEBUG_BATTLE_AREA_TENS) {
950 value = dx_debug_wrap(value, 0, maxAreaTens);
952 value = dx_debug_wrap(value, 0, 0xF);
954 DebugBattleNum[DebugBattleColumn] = value;
957 s32 value = DebugBattleNum[DebugBattleColumn] - 1;
958 if (DebugBattleColumn == DEBUG_BATTLE_STAGE) {
959 value = dx_debug_clamp(value, -1, 0x7F);
960 }
else if (DebugBattleColumn == DEBUG_BATTLE_AREA_TENS) {
961 value = dx_debug_wrap(value, 0, maxAreaTens);
963 value = dx_debug_wrap(value, 0, 0xF);
965 DebugBattleNum[DebugBattleColumn] = value;
969 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 104, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
970 dx_debug_draw_ascii(
"Start Battle:", DefaultColor, SubmenuPosX, SubmenuPosY + 1 * RowHeight);
971 dx_debug_draw_ascii(
"-", DefaultColor, SubmenuPosX + 26, SubmenuPosY + 2 * RowHeight);
972 dx_debug_draw_ascii(
"(", DefaultColor, SubmenuPosX + 55, SubmenuPosY + 2 * RowHeight);
973 dx_debug_draw_ascii(
")", DefaultColor, SubmenuPosX + 77, SubmenuPosY + 2 * RowHeight);
975 for (idx = 0; idx < 5; idx++) {
976 s32 color = (DebugBattleColumn == idx) ? HighlightColor : DefaultColor;
977 s32 offset = BattleDigitOffsets[idx];
978 char* fmt = (idx == 4) ?
"%02X" :
"%X";
980 dx_debug_draw_number(DebugBattleNum[idx] & 0xFF, fmt, color, 255, SubmenuPosX + offset, SubmenuPosY + 2 * RowHeight);
987DebugEditableNumber DebugStoryProgress = {
994void dx_debug_update_edit_progress() {
995 if (DebugStateChanged) {
997 dx_debug_set_editable_num(&DebugStoryProgress, val);
1002 DebugMenuState = DBM_MAIN_MENU;
1004 s32 val = dx_debug_get_editable_num(&DebugStoryProgress);
1009 dx_debug_nav_editable_num(&DebugStoryProgress);
1012 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 104, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1013 dx_debug_draw_ascii(
"Set Progress:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1014 dx_debug_draw_editable_num(&DebugStoryProgress, SubmenuPosX + 35, SubmenuPosY + 2 * RowHeight);
1020DebugMenuEntry DebugSoundPlayerMenu[] = {
1021 {
"Play Sound", NULL, DBM_SELECT_SOUND },
1022 {
"Stop Sound", NULL, DBM_SELECT_SOUND },
1024s32 SoundPlayerMenuPos = 0;
1026void dx_debug_draw_sound_player(
b32 activeMenu) {
1029 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 75,
ARRAY_COUNT(DebugSoundPlayerMenu) * RowHeight + 8,
WINDOW_STYLE_20, 192);
1031 for (idx = 0; idx <
ARRAY_COUNT(DebugSoundPlayerMenu); idx++) {
1034 color = (SoundPlayerMenuPos == idx) ? HighlightColor : DefaultColor;
1036 color = (SoundPlayerMenuPos == idx) ? HoverColor : DefaultColor;
1038 dx_debug_draw_ascii(DebugSoundPlayerMenu[idx].text, color, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
1042void dx_debug_update_sound_player() {
1044 SoundPlayerMenuPos = dx_debug_menu_nav_1D_vertical(SoundPlayerMenuPos, 0,
ARRAY_COUNT(DebugSoundPlayerMenu) - 1, FALSE);
1046 DebugMenuState = DBM_MAIN_MENU;
1048 DebugMenuState = DBM_SELECT_SOUND;
1051 dx_debug_draw_sound_player(TRUE);
1054DebugEditableNumber DebugSoundID = {
1056 .digits = { 0, 0, 0, 0 },
1061void dx_debug_update_select_sound() {
1064 DebugMenuState = DBM_SOUND_PLAYER;
1066 if (SoundPlayerMenuPos == 0) {
1067 sfx_play_sound(dx_debug_get_editable_num(&DebugSoundID) & 0xFFFF);
1069 sfx_stop_sound(dx_debug_get_editable_num(&DebugSoundID) & 0xFFFF);
1073 dx_debug_nav_editable_num(&DebugSoundID);
1075 dx_debug_draw_sound_player(FALSE);
1076 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + (4 * RowHeight), 75, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1077 dx_debug_draw_ascii(
"Sound ID:", DefaultColor, SubmenuPosX, SubmenuPosY + 4 * RowHeight);
1078 dx_debug_draw_editable_num(&DebugSoundID, SubmenuPosX, SubmenuPosY + 5 * RowHeight);
1085s32 SelectPartnerMenuPos = 1;
1087void dx_debug_update_edit_partners() {
1090 if (DebugStateChanged) {
1098 DebugPartnerLevels[SelectPartnerMenuPos] = dx_debug_menu_nav_1D_horizontal(DebugPartnerLevels[SelectPartnerMenuPos], -1, 2, FALSE);
1100 DebugMenuState = DBM_MAIN_MENU;
1103 s32 val = DebugPartnerLevels[idx];
1116 dx_debug_draw_box(SubBoxPosX, SubBoxPosY, 120, 14 * 11 + 8,
WINDOW_STYLE_20, 192);
1119 b32 isSelected = (SelectPartnerMenuPos == idx);
1120 s32 color = isSelected ? HighlightColor : DefaultColor;
1121 s32 posY = SubmenuPosY + (idx - 1) * 14;
1122 s32 level = DebugPartnerLevels[idx];
1123 s32 alpha = (isSelected || level >= 0) ? 254 : 120;
1126 dx_debug_draw_number(level,
"%d", color, alpha, SubmenuPosX - 3, posY);
1128 dx_debug_draw_number(level,
"%d", color, alpha, SubmenuPosX + 3, posY);
1136 }
else if (level == 2) {
1146DebugMenuEntry DebugInventoryMenu[] = {
1147 {
"Items", NULL, DBM_INV_EDIT_ITEMS },
1148 {
"Badges", NULL, DBM_INV_EDIT_BADGES },
1149 {
"Key Items", NULL, DBM_INV_EDIT_KEYS },
1150 {
"Equipment", NULL, DBM_INV_EDIT_GEAR },
1151 {
"Stats", NULL, DBM_INV_EDIT_STATS },
1152 {
"Coins", NULL, DBM_INV_EDIT_COINS },
1153 {
"Star Points", NULL, DBM_INV_EDIT_STAR_POINTS },
1154 {
"Star Pieces", NULL, DBM_INV_EDIT_STAR_PIECES },
1156s32 InventoryMenuPos = 0;
1158void dx_debug_update_edit_inventory() {
1162 InventoryMenuPos = dx_debug_menu_nav_1D_vertical(InventoryMenuPos, 0,
ARRAY_COUNT(DebugInventoryMenu) - 1, FALSE);
1164 DebugMenuState = DBM_MAIN_MENU;
1166 if (DebugInventoryMenu[InventoryMenuPos].onSelect != NULL) {
1167 DebugInventoryMenu[InventoryMenuPos].onSelect();
1169 DebugMenuState = DebugInventoryMenu[InventoryMenuPos].nextState;
1174 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 75,
ARRAY_COUNT(DebugInventoryMenu) * RowHeight + 8,
WINDOW_STYLE_20, 192);
1176 for (idx = 0; idx <
ARRAY_COUNT(DebugInventoryMenu); idx++) {
1177 s32 color = (InventoryMenuPos == idx) ? HighlightColor : DefaultColor;
1178 dx_debug_draw_ascii(DebugInventoryMenu[idx].text, color, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
1182b32 DebugEditingItem = FALSE;
1184#define _MAX_INV_SIZE(a,b,c) MAX(MAX(ARRAY_COUNT(a), ARRAY_COUNT(b)), ARRAY_COUNT(c))
1187typedef struct DebugItemsMenu {
1193DebugItemsMenu DebugItems = {
1199DebugItemsMenu DebugKeys = {
1205DebugItemsMenu DebugBadges = {
1211void dx_debug_set_item_id(s32 idx, s16 itemID) {
1214 for (j = 2; j >= 0; j--) {
1215 DebugItemDigits[idx][j] = (itemID & 0xF);
1220s16 dx_debug_get_item_id(s32 idx) {
1224 for (j = 0; j < 3; j++) {
1226 val |= (DebugItemDigits[idx][j] & 0xF);
1231void dx_debug_update_edit_items() {
1232 DebugItemsMenu* menu;
1237 switch (DebugMenuState) {
1238 case DBM_INV_EDIT_ITEMS:
1243 case DBM_INV_EDIT_KEYS:
1248 case DBM_INV_EDIT_BADGES:
1249 menu = &DebugBadges;
1257 if (DebugStateChanged) {
1258 for (i = 0; i < invSize; i++) {
1259 dx_debug_set_item_id(i, invItems[i]);
1264 if (DebugEditingItem) {
1265 DebugEditingItem = FALSE;
1267 DebugMenuState = DBM_EDIT_INVENTORY;
1270 if (!DebugEditingItem) {
1271 DebugEditingItem = TRUE;
1273 for (i = 0; i < invSize; i++) {
1274 invItems[i] = dx_debug_get_item_id(i);
1280 if (DebugEditingItem) {
1282 menu->col = dx_debug_menu_nav_1D_horizontal(menu->col, 0, 2, FALSE);
1283 digit = DebugItemDigits[menu->pos][menu->col];
1284 digit = dx_debug_menu_nav_1D_vertical(digit, 0, 0xF, TRUE);
1285 DebugItemDigits[menu->pos][menu->col] = digit;
1289 if (menu->pos < 0) {
1290 menu->pos = invSize - 1;
1291 menu->startPos = menu->pos - 9;
1293 menu->startPos = MIN(menu->startPos, menu->pos);
1298 if (menu->pos >= invSize) {
1302 menu->startPos = MAX(menu->startPos, menu->pos - 9);
1308 dx_debug_draw_box(SubBoxPosX, SubBoxPosY, 160, 10 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1310 for (i = menu->startPos; i <= menu->startPos + 9; i++) {
1311 s32 posY = SubmenuPosY + (i - menu->startPos) * RowHeight;
1312 s32 itemID = dx_debug_get_item_id(i);
1313 b32 isSelectedRow = (menu->pos == i);
1315 if (DebugEditingItem) {
1316 dx_debug_draw_editable_number(i,
"%02X", -1, FALSE, SubmenuPosX, posY);
1317 dx_debug_draw_editable_number(itemID,
"%03X", menu->col, isSelectedRow, SubmenuPosX + 20, posY);
1319 dx_debug_draw_editable_number(i,
"%02X", -1, isSelectedRow, SubmenuPosX, posY);
1320 dx_debug_draw_editable_number(itemID,
"%03X", -1, FALSE, SubmenuPosX + 20, posY);
1323 s32 itemMsg = MSG_NONE;
1324 if (itemID > 0 && itemID < NUM_ITEMS) {
1327 if (itemMsg != MSG_NONE) {
1328 dx_debug_draw_msg(itemMsg, DefaultColor, 255, SubmenuPosX + 50, posY);
1335 draw_msg((s32)msgBuf, SubmenuPosX + 50, posY, 255, DefaultColor, 0);
1340 if (menu->startPos > 0) {
1344 draw_msg((s32)msgArrow, SubmenuPosX + 132, SubmenuPosY +
round(3.0f * ArrowAnimOffset), 255, DefaultColor, 0);
1347 if (menu->startPos + 10 < invSize) {
1351 draw_msg((s32)msgArrow, SubmenuPosX + 132, SubmenuPosY + 134 -
round(3.0f * ArrowAnimOffset), 255, DefaultColor, 0);
1358 DEBUG_GEAR_LUCKY_STAR,
1359 DEBUG_GEAR_STAR_BEAM,
1362s32 DebugGearValues[] = {
1363 [DEBUG_GEAR_BOOTS] 0,
1364 [DEBUG_GEAR_HAMMER] 0,
1365 [DEBUG_GEAR_LUCKY_STAR] 0,
1366 [DEBUG_GEAR_STAR_BEAM] 0,
1368s32 DebugGearPos = 0;
1370void dx_debug_update_edit_gear() {
1374 if (DebugStateChanged) {
1382 DebugMenuState = DBM_EDIT_INVENTORY;
1402 DebugGearPos = dx_debug_menu_nav_1D_vertical(DebugGearPos, 0,
ARRAY_COUNT(DebugGearValues) - 1, FALSE);
1415 switch (DebugGearPos) {
1416 case DEBUG_GEAR_BOOTS:
1420 case DEBUG_GEAR_HAMMER:
1424 case DEBUG_GEAR_LUCKY_STAR:
1428 case DEBUG_GEAR_STAR_BEAM:
1434 DebugGearValues[DebugGearPos] = dx_debug_clamp(DebugGearValues[DebugGearPos] + dx, min, max);
1438 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 95, 5 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1439 dx_debug_draw_ascii(
"Gear:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1440 dx_debug_draw_ascii(
"Boots", DefaultColor, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
1441 dx_debug_draw_ascii(
"Hammer", DefaultColor, SubmenuPosX, SubmenuPosY + 3 * RowHeight);
1442 dx_debug_draw_ascii(
"Lucky Star", DefaultColor, SubmenuPosX, SubmenuPosY + 4 * RowHeight);
1443 dx_debug_draw_ascii(
"Star Beam", DefaultColor, SubmenuPosX, SubmenuPosY + 5 * RowHeight);
1445 for (idx = 0; idx <
ARRAY_COUNT(DebugGearValues); idx++) {
1446 s32 color = (DebugGearPos == idx) ? HighlightColor : DefaultColor;
1447 dx_debug_draw_number(DebugGearValues[idx],
"%2d", color, 255, SubmenuPosX + 63, SubmenuPosY + (idx + 2) * RowHeight);
1459s32 DebugStatValues[] = {
1463 [DEBUG_STAT_LEVEL] 0,
1464 [DEBUG_STAT_SPIRITS] 0,
1466s32 DebugStatPos = 0;
1468void dx_debug_update_edit_stats() {
1472 if (DebugStateChanged) {
1481 DebugMenuState = DBM_EDIT_INVENTORY;
1492 DebugStatPos = dx_debug_menu_nav_1D_vertical(DebugStatPos, 0,
ARRAY_COUNT(DebugStatValues) - 1, FALSE);
1502 switch (DebugStatPos) {
1504 val = DebugStatValues[DEBUG_STAT_HP] + 5 * dx;
1505 DebugStatValues[DEBUG_STAT_HP] = dx_debug_clamp(val, 5, 50);
1508 val = DebugStatValues[DEBUG_STAT_FP] + 5 * dx;
1509 DebugStatValues[DEBUG_STAT_FP] = dx_debug_clamp(val, 0, 50);
1512 val = DebugStatValues[DEBUG_STAT_BP] + 3 * dx;
1513 DebugStatValues[DEBUG_STAT_BP] = dx_debug_clamp(val, 3, 30);
1515 case DEBUG_STAT_LEVEL:
1516 val = DebugStatValues[DEBUG_STAT_LEVEL] + dx;
1517 DebugStatValues[DEBUG_STAT_LEVEL] = dx_debug_clamp(val, 1, 27);
1519 case DEBUG_STAT_SPIRITS:
1520 val = DebugStatValues[DEBUG_STAT_SPIRITS] + dx;
1521 DebugStatValues[DEBUG_STAT_SPIRITS] = dx_debug_clamp(val, 0, 7);
1527 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 88, 6 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1528 dx_debug_draw_ascii(
"Stats:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1529 dx_debug_draw_ascii(
"Max HP", DefaultColor, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
1530 dx_debug_draw_ascii(
"Max FP", DefaultColor, SubmenuPosX, SubmenuPosY + 3 * RowHeight);
1531 dx_debug_draw_ascii(
"Max BP", DefaultColor, SubmenuPosX, SubmenuPosY + 4 * RowHeight);
1532 dx_debug_draw_ascii(
"Level", DefaultColor, SubmenuPosX, SubmenuPosY + 5 * RowHeight);
1533 dx_debug_draw_ascii(
"Spirits", DefaultColor, SubmenuPosX, SubmenuPosY + 6 * RowHeight);
1535 for (idx = 0; idx <
ARRAY_COUNT(DebugStatValues); idx++) {
1536 s32 color = (DebugStatPos == idx) ? HighlightColor : DefaultColor;
1537 dx_debug_draw_number(DebugStatValues[idx],
"%2d", color, 255, SubmenuPosX + 55, SubmenuPosY + (idx + 2) * RowHeight);
1541DebugEditableNumber DebugCoins = {
1543 .digits = { 0, 0, 0 },
1548void dx_debug_update_edit_coins() {
1549 if (DebugStateChanged) {
1555 DebugMenuState = DBM_EDIT_INVENTORY;
1561 dx_debug_nav_editable_num(&DebugCoins);
1564 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 50, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1565 dx_debug_draw_ascii(
"Coins:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1566 dx_debug_draw_editable_num(&DebugCoins, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
1569DebugEditableNumber DebugStarPoints = {
1576void dx_debug_update_edit_star_points() {
1577 if (DebugStateChanged) {
1583 DebugMenuState = DBM_EDIT_INVENTORY;
1589 dx_debug_nav_editable_num(&DebugStarPoints);
1592 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 86, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1593 dx_debug_draw_ascii(
"Star Points:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1594 dx_debug_draw_editable_num(&DebugStarPoints, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
1597DebugEditableNumber DebugStarPieces = {
1599 .digits = { 0, 0, 0 },
1604void dx_debug_update_edit_star_pieces() {
1605 if (DebugStateChanged) {
1611 DebugMenuState = DBM_EDIT_INVENTORY;
1617 dx_debug_nav_editable_num(&DebugStarPieces);
1620 if (dx_debug_get_editable_num(&DebugStarPieces) > 255) {
1621 dx_debug_set_editable_num(&DebugStarPieces, 255);
1625 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 86, 2 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1626 dx_debug_draw_ascii(
"Star Pieces:", DefaultColor, SubmenuPosX, SubmenuPosY + RowHeight);
1627 dx_debug_draw_editable_num(&DebugStarPieces, SubmenuPosX, SubmenuPosY + 2 * RowHeight);
1633typedef struct DebugCollisionEntry {
1636} DebugCollisionEntry;
1644 DBC_HIGHLIGHT_FLOOR,
1649DebugCollisionEntry DebugCollisionMenu[] = {
1650 [DBC_SHOW_COLLISION] {
"Show Collision", FALSE },
1651 [DBC_CULL_BACK] {
"Cull Back", TRUE },
1652 [DBC_SHOW_DISABLED] {
"Show Disabled", TRUE },
1653 [DBC_HIDE_MODELS] {
"Hide Models", FALSE },
1654 [DBC_EXTRUDE_FACES] {
"Extrude Faces", FALSE },
1655 [DBC_HIGHLIGHT_FLOOR] {
"Highlight Floor", FALSE },
1656 [DBC_HIGHLIGHT_WALL] {
"Highlight Wall", FALSE },
1657 [DBC_FADE_DIST] {
"Near Fade Dist", 1 },
1660s32 DebugCollisionPos = 0;
1662void dx_debug_update_view_collision() {
1667 DebugMenuState = DBM_MAIN_MENU;
1670 if (DebugCollisionPos != DBC_FADE_DIST) {
1671 if (NAV_LEFT || NAV_RIGHT) {
1672 DebugCollisionMenu[DebugCollisionPos].state = !DebugCollisionMenu[DebugCollisionPos].state;
1675 s32 fadeDist = DebugCollisionMenu[DebugCollisionPos].state;
1676 fadeDist = dx_debug_menu_nav_1D_horizontal(fadeDist, 0, 9, FALSE);
1677 DebugCollisionMenu[DebugCollisionPos].state = fadeDist;
1679 DebugCollisionPos = dx_debug_menu_nav_1D_vertical(DebugCollisionPos, 0,
ARRAY_COUNT(DebugCollisionMenu) - 1, FALSE);
1682 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 120, 8 * RowHeight + 8,
WINDOW_STYLE_20, 192);
1684 for (idx = 0; idx <
ARRAY_COUNT(DebugCollisionMenu); idx++) {
1685 s32 color = (DebugCollisionPos == idx) ? HighlightColor : DefaultColor;
1686 if (idx != DBC_FADE_DIST) {
1687 char* onoff = DebugCollisionMenu[idx].state ?
"On" :
"Off";
1688 dx_debug_draw_ascii(onoff, color, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
1690 s32 fadeDist = DebugCollisionMenu[idx].state;
1691 dx_debug_draw_number(fadeDist,
"%d", color, 255, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
1693 dx_debug_draw_ascii(DebugCollisionMenu[idx].text, DefaultColor, SubmenuPosX + 28, SubmenuPosY + (idx + 1) * RowHeight);
1697void dx_debug_add_collision_vtx(Vtx_t* vtxBuffer,
Vec3f* vert,
Vec3f* normal, s32 r, s32 g, s32 b, s32 a) {
1698 if (DebugCollisionMenu[DBC_EXTRUDE_FACES].state) {
1699 vtxBuffer->ob[0] = vert->
x + normal->
x;
1700 vtxBuffer->ob[1] = vert->
y + normal->
y;
1701 vtxBuffer->ob[2] = vert->
z + normal->
z;
1703 vtxBuffer->ob[0] = vert->
x;
1704 vtxBuffer->ob[1] = vert->
y;
1705 vtxBuffer->ob[2] = vert->
z;
1707 vtxBuffer->tc[0] = 0;
1708 vtxBuffer->tc[1] = 0;
1709 vtxBuffer->cn[0] = r;
1710 vtxBuffer->cn[1] = g;
1711 vtxBuffer->cn[2] = b;
1712 vtxBuffer->cn[3] = a;
1715#define MAX_DEBUG_TRIS 1024
1717typedef struct DebugTriangle {
1723DebugTriangle DebugTris[MAX_DEBUG_TRIS];
1726Vtx_t DebugVtxBuf[3 * MAX_DEBUG_TRIS];
1729void dx_debug_draw_collision() {
1739 if (!DebugCollisionMenu[DBC_SHOW_COLLISION].state) {
1753 if (DebugTriPos < MAX_DEBUG_TRIS) {
1755 f32 outX, outY, outZ, outW;
1756 f32 cX = (tri->
v1->
x + tri->
v2->
x + tri->
v3->
x) / 3;
1757 f32 cY = (tri->
v1->
y + tri->
v2->
y + tri->
v3->
y) / 3;
1758 f32 cZ = (tri->
v1->
z + tri->
v2->
z + tri->
v3->
z) / 3;
1766 DebugTris[DebugTriPos].tri = tri;
1767 DebugTris[DebugTriPos].depth = outZ;
1768 DebugTris[DebugTriPos].colliderID = i;
1775 ASSERT(DebugTriPos < MAX_DEBUG_TRIS)
1778#define LESS(i, j) DebugTris[i].depth > DebugTris[j].depth
1779#define SWAP(i, j) temp = DebugTris[i], DebugTris[i] = DebugTris[j], DebugTris[j] = temp
1786 gDPSetRenderMode(
gMainGfxPos++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
1787 gDPSetCombineMode(
gMainGfxPos++, G_CC_SHADE, G_CC_SHADE);
1788 gSPTexture(
gMainGfxPos++, 0x0080, 0x0080, 0, G_TX_RENDERTILE, G_OFF);
1789 gSPClearGeometryMode(
gMainGfxPos++, G_LIGHTING | G_CULL_BACK);
1791 if (DebugCollisionMenu[DBC_CULL_BACK].state) {
1792 gSPSetGeometryMode(
gMainGfxPos++, G_CULL_BACK | G_SHADING_SMOOTH);
1795 gSPSetGeometryMode(
gMainGfxPos++, G_SHADING_SMOOTH);
1803 for (i = 0; i < DebugTriPos; i++) {
1804 DebugTriangle* debugTri = &DebugTris[i];
1808 b32 highlight = FALSE;
1816 if (rdpBufPos == 0) {
1818 gSPVertex(
gMainGfxPos++, &DebugVtxBuf[DebugVtxPos], 30, 0);
1822 if (DebugCollisionMenu[DBC_CULL_BACK].state) {
1827 }
else if (tri->
oneSided && !culling) {
1836 gSP1Triangle(
gMainGfxPos++, rdpBufPos, rdpBufPos + 1, rdpBufPos + 2, 0);
1840 if (rdpBufPos == 30) {
1854 fadeDist = DebugCollisionMenu[DBC_FADE_DIST].state;
1856 dist = debugTri->depth - (fadeDist - 1) * 25;
1859 a = dx_debug_clamp((dist + 100) / 6, 0, 20);
1861 a = dx_debug_clamp(dist, 20, 180);
1866 dx_debug_add_collision_vtx(&DebugVtxBuf[DebugVtxPos++], tri->
v1, &tri->
normal, r, g, b, a);
1867 dx_debug_add_collision_vtx(&DebugVtxBuf[DebugVtxPos++], tri->
v2, &tri->
normal, r, g, b, a);
1868 dx_debug_add_collision_vtx(&DebugVtxBuf[DebugVtxPos++], tri->
v3, &tri->
normal, r, g, b, a);
1875b32 dx_debug_should_hide_models() {
1876 return DebugCollisionMenu[DBC_HIDE_MODELS].state;
1882typedef struct DebugCheatEntry {
1887DebugCheatEntry DebugCheatMenu[] = {
1888 [DEBUG_CHEAT_GOD_MODE] {
"God Mode", FALSE },
1889 [DEBUG_CHEAT_SPEED_MODE] {
"Speed Mode", FALSE },
1890 [DEBUG_CHEAT_FLY] {
"Fly With L", FALSE },
1891 [DEBUG_CHEAT_HIGH_JUMP] {
"High Jump", FALSE },
1892 [DEBUG_CHEAT_IGNORE_WALLS] {
"Ignore Walls", FALSE },
1895s32 DebugCheatPos = 0;
1897void dx_debug_update_cheat_menu() {
1902 DebugMenuState = DBM_MAIN_MENU;
1904 if (NAV_LEFT || NAV_RIGHT) {
1905 DebugCheatMenu[DebugCheatPos].enabled = !DebugCheatMenu[DebugCheatPos].enabled;
1908 switch (DebugCheatPos) {
1909 case DEBUG_CHEAT_GOD_MODE:
1910 case DEBUG_CHEAT_FLY:
1911 case DEBUG_CHEAT_HIGH_JUMP:
1912 case DEBUG_CHEAT_IGNORE_WALLS:
1914 case DEBUG_CHEAT_SPEED_MODE:
1915 if (!DebugCheatMenu[DebugCheatPos].enabled) {
1928 DebugCheatPos = dx_debug_menu_nav_1D_vertical(DebugCheatPos, 0,
ARRAY_COUNT(DebugCheatMenu) - 1, FALSE);
1931 dx_debug_draw_box(SubBoxPosX, SubBoxPosY + RowHeight, 120,
ARRAY_COUNT(DebugCheatMenu) * RowHeight + 8,
WINDOW_STYLE_20, 192);
1933 for (idx = 0; idx <
ARRAY_COUNT(DebugCheatMenu); idx++) {
1934 s32 color = (DebugCheatPos == idx) ? HighlightColor : DefaultColor;
1935 char* onoff = DebugCheatMenu[idx].enabled ?
"On" :
"Off";
1937 dx_debug_draw_ascii(onoff, color, SubmenuPosX, SubmenuPosY + (idx + 1) * RowHeight);
1938 dx_debug_draw_ascii(DebugCheatMenu[idx].text, DefaultColor, SubmenuPosX + 28, SubmenuPosY + (idx + 1) * RowHeight);
1942b32 dx_debug_is_cheat_enabled(DebugCheat cheat) {
1943 return DebugCheatMenu[cheat].enabled;
1949void dx_debug_update_banner() {
1954 sprintf(fmtBuf,
"Map: %7s (%lX)", LastMapName, LastMapEntry);
1955 dx_debug_draw_ascii(fmtBuf, DefaultColor, 220, BottomRowY);
1957 dx_debug_draw_ascii(
"Pos:", DefaultColor, 20, BottomRowY);
1962 dx_debug_draw_ascii_with_effect(fmtBuf, DefaultColor, 48, BottomRowY, effect);
1965 dx_debug_draw_ascii_with_effect(fmtBuf, DefaultColor, 80, BottomRowY, effect);
1968 dx_debug_draw_ascii_with_effect(fmtBuf, DefaultColor, 112, BottomRowY, effect);
1970 if (dx_debug_is_cheat_enabled(DEBUG_CHEAT_GOD_MODE)) {
1971 dx_debug_draw_ascii(
"(GOD MODE)",
MSG_PAL_YELLOW, 151, BottomRowY);
1974 s32 areaID = (LastBattleID >> 24) & 0xFF;
1975 s32 battleID = (LastBattleID >> 16) & 0xFF;
1976 s32 stageID = LastBattleID & 0xFFFF;
1978 sprintf(fmtBuf,
"Battle: %02lX-%02lX (%lX)", areaID, battleID, stageID);
1979 dx_debug_draw_ascii(fmtBuf, DefaultColor, 200, BottomRowY);
1981 sprintf(fmtBuf,
"Stage: %-15s", LastStageName);
1982 dx_debug_draw_ascii(fmtBuf, DefaultColor, 20, BottomRowY);
1984 if (dx_debug_is_cheat_enabled(DEBUG_CHEAT_GOD_MODE)) {
1985 dx_debug_draw_ascii(
"(GOD MODE)",
MSG_PAL_YELLOW, 128, BottomRowY);
1993#define DEBUG_CONSOLE_DEFAULT_TIMELEFT 60
1994#define DEBUG_CONSOLE_MSG_BUF_SIZE 85
1996typedef struct DebugConsoleLine {
1999 u8 buf[DEBUG_CONSOLE_MSG_BUF_SIZE];
2002DebugConsoleLine DebugConsoleLine0 = { 0 };
2003DebugConsoleLine DebugConsoleLine1 = { 0 };
2004DebugConsoleLine DebugConsoleLine2 = { 0 };
2005DebugConsoleLine DebugConsoleLine3 = { 0 };
2006DebugConsoleLine DebugConsoleLine4 = { 0 };
2007DebugConsoleLine DebugConsoleLine5 = { 0 };
2008DebugConsoleLine DebugConsoleLine6 = { 0 };
2009DebugConsoleLine DebugConsoleLine7 = { 0 };
2011DebugConsoleLine *DebugConsole[8] = {
2022u32 dx_debug_hash_location(
const char* filename, s32 line) {
2026 while ((c = *filename++)) {
2027 hash = ((hash << 5) + hash) + c;
2030 hash = ((hash << 5) + hash) + line;
2035static char *proutSprintf(
char *dst,
const char *src,
size_t count) {
2036 return (
char *)memcpy((u8 *)dst, (u8 *)src, count) + count;
2039void dx_hashed_debug_printf(
const char* filename, s32 line,
const char* fmt, ...) {
2042 va_start(args, fmt);
2043 s32 len = _Printf(&proutSprintf, fmtBuf, fmt, args);
2049 u32 hash = dx_debug_hash_location(filename, line);
2050 s32 matchedLine = -1;
2054 for (idx = 0; idx <
ARRAY_COUNT(DebugConsole); idx++) {
2055 if (DebugConsole[idx]->hash == hash) {
2062 if (matchedLine == -1) {
2063 s32 minTimeLeft = DEBUG_CONSOLE_DEFAULT_TIMELEFT;
2065 for (idx = 0; idx <
ARRAY_COUNT(DebugConsole); idx++) {
2066 if (DebugConsole[idx]->timeLeft == 0) {
2070 if (DebugConsole[idx]->timeLeft < minTimeLeft) {
2071 minTimeLeft = DebugConsole[idx]->timeLeft;
2078 if (matchedLine != -1) {
2081 DebugConsole[matchedLine]->buf[2] = 12;
2082 DebugConsole[matchedLine]->buf[3] = 12;
2086 DebugConsole[matchedLine]->hash = hash;
2087 DebugConsole[matchedLine]->timeLeft = DEBUG_CONSOLE_DEFAULT_TIMELEFT;
2091API_CALLABLE(_dxDebugIntPrintf) {
2092 Bytecode* args = script->ptrReadPos;
2097 char* filename = (
char*)*args++;
2099 char* fmt = (
char*)*args++;
2101 for (idx = 0; idx < 8; idx++) {
2111 case 0: dx_hashed_debug_printf(filename, line, fmt);
break;
2112 case 1: dx_hashed_debug_printf(filename, line, fmt, i[0]);
break;
2113 case 2: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1]);
break;
2114 case 3: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1], i[2]);
break;
2115 case 4: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1], i[2], i[3]);
break;
2116 case 5: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1], i[2], i[3], i[4]);
break;
2117 case 6: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1], i[2], i[3], i[4], i[5]);
break;
2118 case 7: dx_hashed_debug_printf(filename, line, fmt, i[0], i[1], i[2], i[3], i[4], i[5], i[6]);
break;
2124API_CALLABLE(_dxDebugFloatPrintf) {
2125 Bytecode* args = script->ptrReadPos;
2130 char* filename = (
char*)*args++;
2132 char* fmt = (
char*)*args++;
2134 for (idx = 0; idx < 8; idx++) {
2144 case 0: dx_hashed_debug_printf(filename, line, fmt);
break;
2145 case 1: dx_hashed_debug_printf(filename, line, fmt, f[0]);
break;
2146 case 2: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1]);
break;
2147 case 3: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1], f[2]);
break;
2148 case 4: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1], f[2], f[3]);
break;
2149 case 5: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1], f[2], f[3], f[4]);
break;
2150 case 6: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1], f[2], f[3], f[4], f[5]);
break;
2151 case 7: dx_hashed_debug_printf(filename, line, fmt, f[0], f[1], f[2], f[3], f[4], f[5], f[6]);
break;
2157void dx_debug_console_main() {
2158 DebugConsoleLine* temp;
2161#define LESS(i, j) DebugConsole[i]->timeLeft > DebugConsole[j]->timeLeft
2162#define SWAP(i, j) temp = DebugConsole[i], DebugConsole[i] = DebugConsole[j], DebugConsole[j] = temp
2167 for (idx = 0; idx <
ARRAY_COUNT(DebugConsole); idx++) {
2168 s32 timeLeft = DebugConsole[idx]->timeLeft;
2172 if (timeLeft < 20) {
2173 alpha =
round(254 * (timeLeft / 20.0f));
2176 draw_msg((s32)DebugConsole[idx]->buf, 32, 200 - 15 * idx, alpha, DefaultColor, 0);
2177 DebugConsole[idx]->timeLeft--;
PartnerPopupProperties gPartnerPopupProperties[]
BattleArea gBattleAreas[]
struct ColliderTriangle * triangleTable
#define ASSERT(condition)
@ MSG_READ_FUNC_RESTORE_COLOR
@ MSG_READ_FUNC_SAVE_COLOR
@ DEBUG_CONTACT_CANT_TOUCH
@ COLLIDER_FLAG_IGNORE_PLAYER
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_INIT
@ SOUND_STAR_PIECE_BOUNCE
@ SOUND_UNUSED_STAR_SPIRIT_APPEARS
@ SOUND_STAR_POINT_PICKUP
@ ENCOUNTER_STATE_PRE_BATTLE
b32 fio_load_game(s32 saveSlot)
void fio_save_game(s32 saveSlot)
s32 evt_get_variable(Evt *script, Bytecode var)
s32 play_ambient_sounds(s32 fadeInTime, s32 fadeOutTime)
void partner_disable_input(void)
void set_map_transition_effect(ScreenTransition)
s32 disable_player_input(void)
void open_status_bar_quickly(void)
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
f32 evt_get_float_variable(Evt *script, Bytecode var)
void set_game_mode(s32 modeID)
void dma_load_msg(u32 msgID, void *dest)
s8 scriptedBattle
battle started by StartBattle but not by encounter
EncounterStatus gCurrentEncounter
void sfx_stop_sound(s32 soundID)
void sfx_play_sound(s32 soundID)
#define QSORT(Q_N, Q_LESS, Q_SWAP)
#define PANIC_MSG(msg, args...)
AreaConfig gAreas[29]
Zero-terminated.
u8 dx_ascii_char_to_msg(char in)
u8 * dx_string_to_msg(u8 *msg, const char *str)
PlayerStatus * gPlayerStatusPtr
CollisionStatus gCollisionStatus
GameStatus * gGameStatusPtr
PlayerStatus gPlayerStatus
CollisionData gCollisionData
b32 EncounterStateChanged