diff options
Diffstat (limited to 'src/option_menu.c')
-rw-r--r-- | src/option_menu.c | 750 |
1 files changed, 199 insertions, 551 deletions
diff --git a/src/option_menu.c b/src/option_menu.c index 8450633f5..35fe957be 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -29,16 +29,51 @@ enum MENUITEM_BUTTONMODE, MENUITEM_FRAMETYPE, MENUITEM_CANCEL, - MENUITEM_COUNT, + MENUITEM_COUNT }; + // Window Ids enum { WIN_TEXT_OPTION, - WIN_OPTIONS, + WIN_OPTIONS +}; + +// RAM symbols +struct OptionMenu +{ + /*0x00*/ u16 option[MENUITEM_COUNT]; + /*0x0E*/ u16 unkE; + /*0x10*/ u8 state3; + /*0x11*/ u8 state; + /*0x12*/ u8 state2; + /*0x13*/ u8 unk13; }; -static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 +static EWRAM_DATA struct OptionMenu *sOptionMenuPtr = NULL; + +//Function Declarataions +static void CB2_InitOptionMenu(void); +static void VBlankCB_OptionMenu(void); +static void OptionMenu_InitCallbacks(void); +static void OptionMenu_SetVBlankCallback(void); +static void CB2_OptionMenu(void); +static void SetOptionMenuTask(void); +static void InitOptionMenuBg(void); +static void OptionMenu_PickSwitchCancel(void); +static void OptionMenu_ResetSpriteData(void); +static bool8 LoadOptionMenuPalette(void); +static void Task_OptionMenu(u8 taskId); +static u8 OptionMenu_ProcessInput(void); +static void BufferOptionMenuString(u8 selection); +static void CloseAndSaveOptionMenu(u8 taskId); +static void PrintOptionMenuHeader(void); +static void sub_8088C0C(void); +static void LoadOptionMenuItemNames(void); +static void sub_8088DE0(u16 selection); + +// Data Definitions +static const struct WindowTemplate sOptionMenuWinTemplates[] = { { .bg = 1, @@ -47,7 +82,7 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 26, .height = 2, .paletteNum = 1, - .baseBlock = 2, + .baseBlock = 2 }, { .bg = 0, @@ -56,7 +91,7 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 26, .height = 12, .paletteNum = 1, - .baseBlock = 0x36, + .baseBlock = 0x36 }, { .bg = 2, @@ -65,11 +100,12 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 30, .height = 2, .paletteNum = 0xF, - .baseBlock = 0x16e, + .baseBlock = 0x16e }, - DUMMY_WIN_TEMPLATE, + DUMMY_WIN_TEMPLATE }; -static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 + +static const struct BgTemplate sOptionMenuBgTemplates[] = { { .bg = 1, @@ -78,7 +114,7 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 0, - .baseTile = 0, + .baseTile = 0 }, { .bg = 0, @@ -87,7 +123,7 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 1, - .baseTile = 0, + .baseTile = 0 }, { .bg = 2, @@ -96,12 +132,14 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 2, - .baseTile = 0, + .baseTile = 0 }, }; -static const u16 sOptionsMenuPalette[] = INCBIN_U16("graphics/misc/unk_83cc2e4.gbapal"); //3CC2E4 -static const u16 sOptionsMenuItemCounts[MENUITEM_COUNT] = {3, 2, 2, 2, 3, 10, 0}; //3CC304 -static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = //3CC314 + +static const u16 sOptionMenuPalette[] = INCBIN_U16("graphics/misc/unk_83cc2e4.gbapal"); +static const u16 sOptionMenuItemCounts[MENUITEM_COUNT] = {3, 2, 2, 2, 3, 10, 0}; + +static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = { [MENUITEM_TEXTSPEED] = gText_TextSpeed, [MENUITEM_BATTLESCENE] = gText_BattleScene, @@ -111,73 +149,44 @@ static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = //3CC314 [MENUITEM_FRAMETYPE] = gText_Frame, [MENUITEM_CANCEL] = gText_OptionMenuCancel, }; -static const u8 *const sTextSpeedOptions[] = //3CC330 + +static const u8 *const sTextSpeedOptions[] = { gText_TextSpeedSlow, gText_TextSpeedMid, gText_TextSpeedFast }; -static const u8 *const sBattleSceneOptions[] = //3CC33C + +static const u8 *const sBattleSceneOptions[] = { gText_BattleSceneOn, gText_BattleSceneOff }; -static const u8 *const sBattleStyleOptions[] = //3CC344 + +static const u8 *const sBattleStyleOptions[] = { gText_BattleStyleShift, gText_BattleStyleSet }; -static const u8 *const sSoundOptions[] = //3CC34C + +static const u8 *const sSoundOptions[] = { gText_SoundMono, gText_SoundStereo }; -static const u8 *const sButtonTypeOptions[] = //3CC354 -{ - gText_ButtonTypeNormal, - gText_ButtonTypeLEqualsA, - gText_ButtonTypeLR, -}; -static const u8 sOptionsMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; //3CC360 -static const u8 sOptionsMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; //3CC363 - - -//This file's functions -static void sub_808835C(void); -static void sub_8088374(void); -static void sub_8088430(void); -static void sub_8088444(void); -static void sub_8088454(void); -static void sub_8088514(void); -static void sub_8088530(void); -static void sub_8088680(void); -static void sub_80886D4(void); -static bool8 sub_80886F0(void); -static void sub_8088780(u8 taskId); -static u8 sub_80888C0(void); -static void sub_80889A8(u8 selection); -static void sub_8088B00(u8 taskId); -static void sub_8088BD0(void); -static void sub_8088C0C(void); -static void sub_8088D8C(void); -static void sub_8088DE0(u16 selection); -struct OptionsMenu +static const u8 *const sButtonTypeOptions[] = { - /*0x00*/ u16 option[MENUITEM_COUNT]; //0,2,4,6,8,a,c - /*0x0E*/ u16 unkE; - /*0x10*/ u8 state3; - /*0x11*/ u8 state; - /*0x12*/ u8 state2; - /*0x13*/ u8 unk13; + gText_ButtonTypeHelp, + gText_ButtonTypeLR, + gText_ButtonTypeLEqualsA }; -EWRAM_DATA struct OptionsMenu *sOptionsMenuPtr = {0}; +static const u8 sOptionMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; +static const u8 sOptionMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; - - -//CB2_InitOptionsMenu -static void sub_808835C(void) +// Functions +static void CB2_InitOptionMenu(void) { RunTasks(); AnimateSprites(); @@ -185,123 +194,111 @@ static void sub_808835C(void) UpdatePaletteFade(); } - -//VBlankCB_OptionsMenu -static void sub_8088374(void) +static void VBlankCB_OptionMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } - -//sub_8088388 void CB2_OptionsMenuFromStartMenu(void) { u8 i; if (gMain.savedCallback == NULL) gMain.savedCallback = CB2_ReturnToStartMenu; - sOptionsMenuPtr = AllocZeroed(sizeof(struct OptionsMenu)); - sOptionsMenuPtr->state3 = 0; - sOptionsMenuPtr->state2 = 0; - sOptionsMenuPtr->state = 0; - sOptionsMenuPtr->unkE = 0; - sOptionsMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed; - sOptionsMenuPtr->option[MENUITEM_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff; - sOptionsMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle; - sOptionsMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound; - sOptionsMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode; - sOptionsMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType; + sOptionMenuPtr = AllocZeroed(sizeof(struct OptionMenu)); + sOptionMenuPtr->state3 = 0; + sOptionMenuPtr->state2 = 0; + sOptionMenuPtr->state = 0; + sOptionMenuPtr->unkE = 0; + sOptionMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed; + sOptionMenuPtr->option[MENUITEM_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff; + sOptionMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle; + sOptionMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound; + sOptionMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode; + sOptionMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType; - for (i = 0; i < MENUITEM_COUNT-1; i++) + for (i = 0; i < MENUITEM_COUNT - 1; i++) { - if (sOptionsMenuPtr->option[i] > (sOptionsMenuItemCounts[i])-1) - sOptionsMenuPtr->option[i] = 0; + if (sOptionMenuPtr->option[i] > (sOptionMenuItemCounts[i]) - 1) + sOptionMenuPtr->option[i] = 0; } HelpSystem_SetSomeVariable2(0xD); - SetMainCallback2(sub_8088454); + SetMainCallback2(CB2_OptionMenu); } - -//sub_8088430 -static void sub_8088430(void) +static void OptionMenu_InitCallbacks(void) { - SetVBlankCallback(0); - SetHBlankCallback(0); + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); } - -//sub_8088444 -static void sub_8088444(void) +static void OptionMenu_SetVBlankCallback(void) { - SetVBlankCallback(sub_8088374); + SetVBlankCallback(VBlankCB_OptionMenu); } -//sub_8088454 -static void sub_8088454(void) +static void CB2_OptionMenu(void) { u8 i, state; - state = sOptionsMenuPtr->state; + state = sOptionMenuPtr->state; switch (state) { case 0: - sub_8088430(); + OptionMenu_InitCallbacks(); break; case 1: - sub_8088530(); + InitOptionMenuBg(); break; case 2: - sub_80886D4(); + OptionMenu_ResetSpriteData(); break; case 3: - if (sub_80886F0() != TRUE) //silly matching quirk + if (LoadOptionMenuPalette() != TRUE) return; break; case 4: - sub_8088BD0(); + PrintOptionMenuHeader(); break; case 5: sub_8088C0C(); break; case 6: - sub_8088D8C(); + LoadOptionMenuItemNames(); break; case 7: for (i = 0; i < MENUITEM_COUNT; i++) - sub_80889A8(i); + BufferOptionMenuString(i); break; case 8: - sub_8088DE0(sOptionsMenuPtr->unkE); + sub_8088DE0(sOptionMenuPtr->unkE); break; case 9: - sub_8088680(); + OptionMenu_PickSwitchCancel(); break; default: - sub_8088514(); + SetOptionMenuTask(); + break; } - sOptionsMenuPtr->state++; + sOptionMenuPtr->state++; } -//sub_8088514 -static void sub_8088514(void) +static void SetOptionMenuTask(void) { - CreateTask(sub_8088780, 0); - SetMainCallback2(sub_808835C); + CreateTask(Task_OptionMenu, 0); + SetMainCallback2(CB2_InitOptionMenu); } - -//sub_8088530 -static void sub_8088530(void) +static void InitOptionMenuBg(void) { - void * dest = (void *) VRAM; - DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); - + void * dest = (void *)VRAM; + DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); - SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sOptionMenuBgTemplates, ARRAY_COUNT(sOptionMenuBgTemplates)); + InitBgsFromTemplates(0, sOptionMenuBgTemplates, NELEMS(sOptionMenuBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -312,30 +309,27 @@ static void sub_8088530(void) ChangeBgY(3, 0, 0); InitWindows(sOptionMenuWinTemplates); DeactivateAllTextPrinters(); - SetGpuReg(REG_OFFSET_BLDCNT, 0xC1); - SetGpuReg(REG_OFFSET_BLDY, 2); - SetGpuReg(REG_OFFSET_WININ, 1); - SetGpuReg(REG_OFFSET_WINOUT, 0x27); - SetGpuReg(0, 0x3040); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); ShowBg(0); ShowBg(1); ShowBg(2); }; -//sub_8088680 -static void sub_8088680(void) +static void OptionMenu_PickSwitchCancel(void) { s32 x; x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancel, 0); - FillWindowPixelBuffer(2, 0xFF); - AddTextPrinterParameterized3(2, 0, x, 0, sOptionsMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); + FillWindowPixelBuffer(2, PIXEL_FILL(15)); + AddTextPrinterParameterized3(2, 0, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); PutWindowTilemap(2); CopyWindowToVram(2, 3); } - -//sub_80886D4 -static void sub_80886D4(void) +static void OptionMenu_ResetSpriteData(void) { ResetSpriteData(); ResetPaletteFade(); @@ -344,19 +338,18 @@ static void sub_80886D4(void) ScanlineEffect_Stop(); } -//sub_80886F0 -static bool8 sub_80886F0(void) +static bool8 LoadOptionMenuPalette(void) { - switch (sOptionsMenuPtr->state2) + switch (sOptionMenuPtr->state2) { case 0: - LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); + LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); break; case 1: - LoadPalette(GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); + LoadPalette(GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); break; case 2: - LoadPalette(sOptionsMenuPalette, 0x10, 0x20); + LoadPalette(sOptionMenuPalette, 0x10, 0x20); LoadPalette(stdpal_get(2), 0xF0, 0x20); break; case 3: @@ -365,266 +358,104 @@ static bool8 sub_80886F0(void) default: return TRUE; } - sOptionsMenuPtr->state2++; + sOptionMenuPtr->state2++; return FALSE; } - - -// I could not get this function to match. GOTO statements weren't even compiling correctly. -#ifdef NONMATCHING -static void sub_8088780(u8 taskId) +static void Task_OptionMenu(u8 taskId) { - u8 v2, v5; - struct OptionsMenu v4; - - switch (sOptionsMenuPtr->state3) + switch (sOptionMenuPtr->state3) { case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - sub_8088444(); - sOptionsMenuPtr->state3++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + OptionMenu_SetVBlankCallback(); + sOptionMenuPtr->state3++; break; case 2: - if ((bool32) sub_80BF72C() == TRUE) //cast to bool32 to remove the lsl/lsr 0x18 after func call - return; - switch (sub_80888C0()) + if (sub_80BF72C() == TRUE) + break; + switch (OptionMenu_ProcessInput()) { + case 0: + break; case 1: - sOptionsMenuPtr->state3++; + sOptionMenuPtr->state3++; break; case 2: - LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); - LoadPalette(GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); - sub_80889A8(sOptionsMenuPtr->unkE); - sOptionsMenuPtr->state3++; + LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); + LoadPalette(GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); + BufferOptionMenuString(sOptionMenuPtr->unkE); break; case 3: - sub_8088DE0(sOptionsMenuPtr->unkE); + sub_8088DE0(sOptionMenuPtr->unkE); break; case 4: - sub_80889A8(sOptionsMenuPtr->unkE); - sOptionsMenuPtr->state3++; + BufferOptionMenuString(sOptionMenuPtr->unkE); break; - default: - return; } + break; case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - sOptionsMenuPtr->state3++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + sOptionMenuPtr->state3++; + break; case 1: case 4: if (gPaletteFade.active) return; - sOptionsMenuPtr->state3++; + sOptionMenuPtr->state3++; + break; case 5: - sub_8088B00(taskId); + CloseAndSaveOptionMenu(taskId); break; - default: - return; } } -#else -NAKED -static void sub_8088780(u8 taskId) -{ - asm_unified("\tpush {r4,lr}\n" - "\tsub sp, 0x4\n" - "\tlsls r0, 24\n" - "\tlsrs r2, r0, 24\n" - "\tldr r1, _080887A0 @ =sOptionsMenuPtr\n" - "\tldr r0, [r1]\n" - "\tldrb r0, [r0, 0x10]\n" - "\tadds r3, r1, 0\n" - "\tcmp r0, 0x5\n" - "\tbls _08088796\n" - "\tb _080888B6\n" - "_08088796:\n" - "\tlsls r0, 2\n" - "\tldr r1, _080887A4 @ =_080887A8\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_080887A0: .4byte sOptionsMenuPtr\n" - "_080887A4: .4byte _080887A8\n" - "\t.align 2, 0\n" - "_080887A8:\n" - "\t.4byte _080887C0\n" - "\t.4byte _08088894\n" - "\t.4byte _080887E0\n" - "\t.4byte _08088878\n" - "\t.4byte _08088894\n" - "\t.4byte _080888B0\n" - "_080887C0:\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x10\n" - "\tmovs r3, 0\n" - "\tbl BeginNormalPaletteFade\n" - "\tbl sub_8088444\n" - "\tldr r0, _080887DC @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_080887DC: .4byte sOptionsMenuPtr\n" - "_080887E0:\n" - "\tbl sub_80BF72C\n" - "\tcmp r0, 0x1\n" - "\tbeq _080888B6\n" - "\tbl sub_80888C0\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x4\n" - "\tbhi _080888B6\n" - "\tlsls r0, 2\n" - "\tldr r1, _08088800 @ =_08088804\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_08088800: .4byte _08088804\n" - "\t.align 2, 0\n" - "_08088804:\n" - "\t.4byte _080888B6\n" - "\t.4byte _08088818\n" - "\t.4byte _08088824\n" - "\t.4byte _08088858\n" - "\t.4byte _08088868\n" - "_08088818:\n" - "\tldr r0, _08088820 @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_08088820: .4byte sOptionsMenuPtr\n" - "_08088824:\n" - "\tldr r4, _08088854 @ =sOptionsMenuPtr\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0xA]\n" - "\tbl GetUserFrameGraphicsInfo\n" - "\tldr r1, [r0]\n" - "\tmovs r2, 0x90\n" - "\tlsls r2, 1\n" - "\tmovs r3, 0xD5\n" - "\tlsls r3, 1\n" - "\tmovs r0, 0x1\n" - "\tbl LoadBgTiles\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0xA]\n" - "\tbl GetUserFrameGraphicsInfo\n" - "\tldr r0, [r0, 0x4]\n" - "\tmovs r1, 0x20\n" - "\tmovs r2, 0x20\n" - "\tbl LoadPalette\n" - "\tldr r0, [r4]\n" - "\tb _0808886C\n" - "\t.align 2, 0\n" - "_08088854: .4byte sOptionsMenuPtr\n" - "_08088858:\n" - "\tldr r0, _08088864 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tldrh r0, [r0, 0xE]\n" - "\tbl sub_8088DE0\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_08088864: .4byte sOptionsMenuPtr\n" - "_08088868:\n" - "\tldr r0, _08088874 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "_0808886C:\n" - "\tldrb r0, [r0, 0xE]\n" - "\tbl sub_80889A8\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_08088874: .4byte sOptionsMenuPtr\n" - "_08088878:\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0\n" - "\tmovs r3, 0x10\n" - "\tbl BeginNormalPaletteFade\n" - "\tldr r0, _08088890 @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_08088890: .4byte sOptionsMenuPtr\n" - "_08088894:\n" - "\tldr r0, _080888AC @ =gPaletteFade\n" - "\tldrb r1, [r0, 0x7]\n" - "\tmovs r0, 0x80\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _080888B6\n" - "\tldr r1, [r3]\n" - "_080888A2:\n" - "\tldrb r0, [r1, 0x10]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1, 0x10]\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_080888AC: .4byte gPaletteFade\n" - "_080888B0:\n" - "\tadds r0, r2, 0\n" - "\tbl sub_8088B00\n" - "_080888B6:\n" - "\tadd sp, 0x4\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n"); -} -#endif -//OptionsMenu_ProcessInput -static u8 sub_80888C0(void) +static u8 OptionMenu_ProcessInput(void) { u16 current; u16* curr; - if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + if (JOY_REPT(DPAD_RIGHT)) { - current = sOptionsMenuPtr->option[(sOptionsMenuPtr->unkE)]; - if (current == (sOptionsMenuItemCounts[sOptionsMenuPtr->unkE] - 1)) - sOptionsMenuPtr->option[sOptionsMenuPtr->unkE] = 0; + current = sOptionMenuPtr->option[(sOptionMenuPtr->unkE)]; + if (current == (sOptionMenuItemCounts[sOptionMenuPtr->unkE] - 1)) + sOptionMenuPtr->option[sOptionMenuPtr->unkE] = 0; else - sOptionsMenuPtr->option[sOptionsMenuPtr->unkE] = current + 1; - if (sOptionsMenuPtr->unkE == MENUITEM_FRAMETYPE) + sOptionMenuPtr->option[sOptionMenuPtr->unkE] = current + 1; + if (sOptionMenuPtr->unkE == MENUITEM_FRAMETYPE) return 2; else return 4; } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + else if (JOY_REPT(DPAD_LEFT)) { - curr = &sOptionsMenuPtr->option[sOptionsMenuPtr->unkE]; + curr = &sOptionMenuPtr->option[sOptionMenuPtr->unkE]; if (*curr == 0) - *curr = sOptionsMenuItemCounts[sOptionsMenuPtr->unkE] - 1; + *curr = sOptionMenuItemCounts[sOptionMenuPtr->unkE] - 1; else - --*(curr); + --*curr; - if (sOptionsMenuPtr->unkE == MENUITEM_FRAMETYPE) + if (sOptionMenuPtr->unkE == MENUITEM_FRAMETYPE) return 2; else return 4; } - else if (gMain.newAndRepeatedKeys & DPAD_UP) + else if (JOY_REPT(DPAD_UP)) { - if (sOptionsMenuPtr->unkE == MENUITEM_TEXTSPEED) - sOptionsMenuPtr->unkE = MENUITEM_CANCEL; + if (sOptionMenuPtr->unkE == MENUITEM_TEXTSPEED) + sOptionMenuPtr->unkE = MENUITEM_CANCEL; else - sOptionsMenuPtr->unkE = sOptionsMenuPtr->unkE - 1; + sOptionMenuPtr->unkE = sOptionMenuPtr->unkE - 1; return 3; } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + else if (JOY_REPT(DPAD_DOWN)) { - if (sOptionsMenuPtr->unkE == MENUITEM_CANCEL) - sOptionsMenuPtr->unkE = MENUITEM_TEXTSPEED; + if (sOptionMenuPtr->unkE == MENUITEM_CANCEL) + sOptionMenuPtr->unkE = MENUITEM_TEXTSPEED; else - sOptionsMenuPtr->unkE = sOptionsMenuPtr->unkE + 1; + sOptionMenuPtr->unkE = sOptionMenuPtr->unkE + 1; return 3; } - else if ((gMain.newKeys & B_BUTTON) || (gMain.newKeys & A_BUTTON)) + else if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { return 1; } @@ -634,42 +465,39 @@ static u8 sub_80888C0(void) } } - -//sub_80889A8 -#ifdef NONMATCHING // could not get it to match perfectly, no idea how they put so many vars on the stack -static void sub_80889A8(u8 selection) +static void BufferOptionMenuString(u8 selection) { - u8* dst; - u8* str; - u8* v8; + u8 str[20]; + u8 buf[12]; + u8 dst[3]; u8 x, y; - memcpy(&dst, sOptionsMenuTextColor, 3); - y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; + memcpy(dst, sOptionMenuTextColor, 3); x = 0x82; + y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; FillWindowPixelRect(1, 1, x, y, 0x46, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT)); switch (selection) { case MENUITEM_TEXTSPEED: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sTextSpeedOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sTextSpeedOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESCENE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleSceneOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleSceneOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESTYLE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleStyleOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleStyleOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_SOUND: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sSoundOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sSoundOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BUTTONMODE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sButtonTypeOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sButtonTypeOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_FRAMETYPE: StringCopy(str, gText_FrameType); - ConvertIntToDecimalStringN(v8, sOptionsMenuPtr->option[2*selection] + 1, 1, 2); - StringAppendN(str, v8, 3); + ConvertIntToDecimalStringN(buf, sOptionMenuPtr->option[selection] + 1, 1, 2); + StringAppendN(str, buf, 3); AddTextPrinterParameterized3(1, 2, x, y, dst, -1, str); break; default: @@ -678,207 +506,31 @@ static void sub_80889A8(u8 selection) PutWindowTilemap(1); CopyWindowToVram(1, 3); } -#else -NAKED -static void sub_80889A8(u8 selection) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tsub sp, 0x30\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tadd r4, sp, 0x2C\n" - "\tldr r1, _08088A08 @ =sOptionsMenuTextColor\n" - "\tadds r0, r4, 0\n" - "\tmovs r2, 0x3\n" - "\tbl memcpy\n" - "\tmovs r0, 0x82\n" - "\tmov r8, r0\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tbl GetFontAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tsubs r0, 0x1\n" - "\tmuls r0, r5\n" - "\tadds r0, 0x2\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tbl GetFontAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmovs r1, 0x46\n" - "\tstr r1, [sp]\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x1\n" - "\tmovs r2, 0x82\n" - "\tadds r3, r7, 0\n" - "\tbl FillWindowPixelRect\n" - "\tadds r6, r4, 0\n" - "\tcmp r5, 0x5\n" - "\tbhi _08088ADE\n" - "\tlsls r0, r5, 2\n" - "\tldr r1, _08088A0C @ =_08088A10\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_08088A08: .4byte sOptionsMenuTextColor\n" - "_08088A0C: .4byte _08088A10\n" - "\t.align 2, 0\n" - "_08088A10:\n" - "\t.4byte _08088A28\n" - "\t.4byte _08088A38\n" - "\t.4byte _08088A48\n" - "\t.4byte _08088A58\n" - "\t.4byte _08088A68\n" - "\t.4byte _08088A9C\n" - "_08088A28:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A34 @ =sTextSpeedOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A34: .4byte sTextSpeedOptions\n" - "_08088A38:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A44 @ =sBattleSceneOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A44: .4byte sBattleSceneOptions\n" - "_08088A48:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A54 @ =sBattleStyleOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A54: .4byte sBattleStyleOptions\n" - "_08088A58:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A64 @ =sSoundOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A64: .4byte sSoundOptions\n" - "_08088A68:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A94 @ =sButtonTypeOptions\n" - "_08088A72:\n" - "\tldr r0, _08088A98 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tlsls r1, r5, 1\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tldr r0, [r0]\n" - "\tstr r0, [sp, 0x8]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x2\n" - "\tmov r2, r8\n" - "\tadds r3, r7, 0\n" - "\tbl AddTextPrinterParameterized3\n" - "\tb _08088ADE\n" - "\t.align 2, 0\n" - "_08088A94: .4byte sButtonTypeOptions\n" - "_08088A98: .4byte sOptionsMenuPtr\n" - "_08088A9C:\n" - "\tldr r1, _08088AF8 @ =gText_FrameType\n" - "\tadd r0, sp, 0xC\n" - "\tbl StringCopy\n" - "\tadd r4, sp, 0x20\n" - "\tldr r0, _08088AFC @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tlsls r1, r5, 1\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tadds r1, 0x1\n" - "\tadds r0, r4, 0\n" - "\tmovs r2, 0x1\n" - "\tmovs r3, 0x2\n" - "\tbl ConvertIntToDecimalStringN\n" - "\tadd r0, sp, 0xC\n" - "\tadds r1, r4, 0\n" - "\tmovs r2, 0x3\n" - "\tbl StringAppendN\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tadd r0, sp, 0xC\n" - "\tstr r0, [sp, 0x8]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x2\n" - "\tmov r2, r8\n" - "\tadds r3, r7, 0\n" - "\tbl AddTextPrinterParameterized3\n" - "_08088ADE:\n" - "\tmovs r0, 0x1\n" - "\tbl PutWindowTilemap\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x3\n" - "\tbl CopyWindowToVram\n" - "\tadd sp, 0x30\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08088AF8: .4byte gText_FrameType\n" - "_08088AFC: .4byte sOptionsMenuPtr\n"); -} -#endif - -//sub_8088B00 -static void sub_8088B00(u8 taskId) +static void CloseAndSaveOptionMenu(u8 taskId) { gFieldCallback = sub_807DF64; SetMainCallback2(gMain.savedCallback); FreeAllWindowBuffers(); - - gSaveBlock2Ptr->optionsTextSpeed = (u8) sOptionsMenuPtr->option[MENUITEM_TEXTSPEED]; - gSaveBlock2Ptr->optionsBattleSceneOff = (u8) sOptionsMenuPtr->option[MENUITEM_BATTLESCENE]; - gSaveBlock2Ptr->optionsBattleStyle = (u8) sOptionsMenuPtr->option[MENUITEM_BATTLESTYLE]; - gSaveBlock2Ptr->optionsSound = sOptionsMenuPtr->option[MENUITEM_SOUND]; - gSaveBlock2Ptr->optionsButtonMode = (u8) sOptionsMenuPtr->option[MENUITEM_BUTTONMODE]; - gSaveBlock2Ptr->optionsWindowFrameType = (u8) sOptionsMenuPtr->option[MENUITEM_FRAMETYPE]; + gSaveBlock2Ptr->optionsTextSpeed = sOptionMenuPtr->option[MENUITEM_TEXTSPEED]; + gSaveBlock2Ptr->optionsBattleSceneOff = sOptionMenuPtr->option[MENUITEM_BATTLESCENE]; + gSaveBlock2Ptr->optionsBattleStyle = sOptionMenuPtr->option[MENUITEM_BATTLESTYLE]; + gSaveBlock2Ptr->optionsSound = sOptionMenuPtr->option[MENUITEM_SOUND]; + gSaveBlock2Ptr->optionsButtonMode = sOptionMenuPtr->option[MENUITEM_BUTTONMODE]; + gSaveBlock2Ptr->optionsWindowFrameType = sOptionMenuPtr->option[MENUITEM_FRAMETYPE]; SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); - Free(sOptionsMenuPtr); - sOptionsMenuPtr = NULL; + FREE_AND_SET_NULL(sOptionMenuPtr); DestroyTask(taskId); } - - -//sub_8088BD0 -static void sub_8088BD0(void) +static void PrintOptionMenuHeader(void) { - FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized(WIN_TEXT_OPTION, 2, gText_MenuOptionOption, 8, 1, TEXT_SPEED_FF, NULL); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized(WIN_TEXT_OPTION, 2, gText_MenuOption, 8, 1, TEXT_SPEED_FF, NULL); PutWindowTilemap(0); CopyWindowToVram(0, 3); } - -//sub_8088C0C static void sub_8088C0C(void) { u8 h; @@ -903,27 +555,23 @@ static void sub_8088C0C(void) CopyBgTilemapBufferToVram(1); } -//sub_8088D8C -static void sub_8088D8C(void) +static void LoadOptionMenuItemNames(void) { u8 i; - FillWindowPixelBuffer(1, 0x11); + FillWindowPixelBuffer(1, PIXEL_FILL(1)); for (i = 0; i < MENUITEM_COUNT; i++) { - AddTextPrinterParameterized(1, 2, sOptionMenuItemsNames[i], 8, (u8) ((i*(GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, 0xFF, 0); + AddTextPrinterParameterized(WIN_OPTIONS, 2, sOptionMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SPEED_FF, NULL); } } - -//sub_8088DE0 static void sub_8088DE0(u16 selection) { u16 v1, v2; v1 = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT); v2 = selection * (v1 - 1) + 0x3A; - SetGpuReg(0x44, (v2 << 8) | (v2 + v1)); - SetGpuReg(0x40, 0x10E0); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(v2, v2 + v1)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0)); } - |