From 8980f61306f53affdf020b3fa60b73f2c69f92a6 Mon Sep 17 00:00:00 2001 From: BRODY MORAN Date: Wed, 25 May 2022 13:40:25 +0000 Subject: [PATCH] feat: try adding a debug menu --- Makefile | 5 ++ include/debug.h | 8 +++ ld_script.txt | 2 + src/debug.c | 128 +++++++++++++++++++++++++++++++++++++ src/field_control_avatar.c | 18 ++++++ 5 files changed, 161 insertions(+) create mode 100644 include/debug.h create mode 100644 src/debug.c diff --git a/Makefile b/Makefile index a08e0ec..f480110 100644 --- a/Makefile +++ b/Makefile @@ -301,6 +301,11 @@ else $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast endif +ifeq ($(DDEBUG), 1) +override ASFLAGS += --defsym DEBUG=1 +override CPPFLAGS += -D DEBUG=1 +endif + ifeq ($(DINFO),1) override CFLAGS += -g endif diff --git a/include/debug.h b/include/debug.h new file mode 100644 index 0000000..030dc8c --- /dev/null +++ b/include/debug.h @@ -0,0 +1,8 @@ +#ifndef GUARD_DEBUG_H +#define GUARD_DEBUG_H +#if DEBUG + +void Debug_ShowMainMenu(void); + +#endif +#endif // GUARD_DEBUG_H diff --git a/ld_script.txt b/ld_script.txt index 61f61ab..8951475 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -101,6 +101,7 @@ SECTIONS { src/random.o(.text); src/util.o(.text); src/daycare.o(.text); + src/debug.o(.text); src/egg_hatch.o(.text); src/battle_interface.o(.text); src/battle_anim_smokescreen.o(.text); @@ -486,6 +487,7 @@ SECTIONS { src/trig.o(.rodata); src/util.o(.rodata); src/daycare.o(.rodata); + src/debug.o(.rodata); src/egg_hatch.o(.rodata); src/battle_gfx_sfx_util.o(.rodata); src/battle_interface.o(.rodata); diff --git a/src/debug.c b/src/debug.c new file mode 100644 index 0000000..7d6a3e1 --- /dev/null +++ b/src/debug.c @@ -0,0 +1,128 @@ +#if DEBUG + +#include "global.h" +#include "list_menu.h" +#include "main.h" +#include "map_name_popup.h" +#include "menu.h" +#include "script.h" +#include "sound.h" +#include "strings.h" +#include "task.h" +#include "constants/songs.h" + +#define DEBUG_MAIN_MENU_HEIGHT 7 +#define DEBUG_MAIN_MENU_WIDTH 11 + +void Debug_ShowMainMenu(void); +static void Debug_DestroyMainMenu(u8); +static void DebugAction_Cancel(u8); +static void DebugTask_HandleMainMenuInput(u8); + +enum { + DEBUG_MENU_ITEM_CANCEL, +}; + +static const u8 gDebugText_Cancel[] = _("Cancel"); + +static const struct ListMenuItem sDebugMenuItems[] = +{ + [DEBUG_MENU_ITEM_CANCEL] = {gDebugText_Cancel, DEBUG_MENU_ITEM_CANCEL} +}; + +static void (*const sDebugMenuActions[])(u8) = +{ + [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel +}; + +static const struct WindowTemplate sDebugMenuWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = DEBUG_MAIN_MENU_WIDTH, + .height = 2 * DEBUG_MAIN_MENU_HEIGHT, + .paletteNum = 15, + .baseBlock = 1, +}; + +static const struct ListMenuTemplate sDebugMenuListTemplate = +{ + .items = sDebugMenuItems, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenuItems), + .maxShowed = DEBUG_MAIN_MENU_HEIGHT, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 1, + .cursorKind = 0 +}; + +void Debug_ShowMainMenu(void) { + struct ListMenuTemplate menuTemplate; + u8 windowId; + u8 menuTaskId; + u8 inputTaskId; + + // create window + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplate); + DrawStdWindowFrame(windowId, FALSE); + + // create list menu + menuTemplate = sDebugMenuListTemplate; + menuTemplate.windowId = windowId; + menuTaskId = ListMenuInit(&menuTemplate, 0, 0); + + // draw everything + CopyWindowToVram(windowId, 3); + + // create input handler task + inputTaskId = CreateTask(DebugTask_HandleMainMenuInput, 3); + gTasks[inputTaskId].data[0] = menuTaskId; + gTasks[inputTaskId].data[1] = windowId; +} + +static void Debug_DestroyMainMenu(u8 taskId) +{ + DestroyListMenuTask(gTasks[taskId].data[0], NULL, NULL); + ClearStdWindowAndFrame(gTasks[taskId].data[1], TRUE); + RemoveWindow(gTasks[taskId].data[1]); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void DebugTask_HandleMainMenuInput(u8 taskId) +{ + void (*func)(u8); + u32 input = ListMenu_ProcessInput(gTasks[taskId].data[0]); + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if ((func = sDebugMenuActions[input]) != NULL) + func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Debug_DestroyMainMenu(taskId); + } +} + +static void DebugAction_Cancel(u8 taskId) +{ + Debug_DestroyMainMenu(taskId); +} + +#endif \ No newline at end of file diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index eb27322..de04eb3 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -3,6 +3,7 @@ #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" +#include "debug.h" #include "faraway_island.h" #include "event_data.h" #include "event_object_movement.h" @@ -132,6 +133,14 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; + +#if DEBUG + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } +#endif } int ProcessPlayerFieldInput(struct FieldInput *input) @@ -194,6 +203,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->pressedRButton && EnableAutoRun()) return TRUE; +#if DEBUG + if (input->input_field_1_2) + { + PlaySE(SE_WIN_OPEN); + Debug_ShowMainMenu(); + return TRUE; + } +#endif + return FALSE; }