diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-03-06 10:57:42 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-03-06 10:57:42 -0500 |
commit | 3581ce9ba202377282ee58ffe14037088634b954 (patch) | |
tree | 1b950eaec4c23865f495b328ad0c0b53b8efef9c /src/clear_save_data_screen.c | |
parent | f483a93beaaeff82ad0a6b8b6e67a5a1b25ec989 (diff) |
Decomp and doc clear_save_data_screen
Diffstat (limited to 'src/clear_save_data_screen.c')
-rw-r--r-- | src/clear_save_data_screen.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c new file mode 100644 index 000000000..5485e8da9 --- /dev/null +++ b/src/clear_save_data_screen.c @@ -0,0 +1,224 @@ +#include "global.h" +#include "gflib.h" +#include "menu.h" +#include "save.h" +#include "strings.h" +#include "task.h" +#include "text_window.h" +#include "constants/songs.h" + +struct ClearSaveDataStruct { + u8 unk0; + u8 unk1; + u8 unk2; +}; + +static EWRAM_DATA struct ClearSaveDataStruct * sClearSaveDataState = NULL; + +static void Task_DrawClearSaveDataScreen(u8 taskId); +static void Task_HandleYesNoMenu(u8 taskId); +static void Task_CleanUpAndSoftReset(u8 taskId); +static void CB2_Sub_SaveClearScreen_Init(void); +static void SaveClearScreen_GpuInit(void); + +static const struct BgTemplate sBgTemplates[] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + } +}; + +static const struct WindowTemplate sWindowTemplates[] = { + { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 5, + .width = 6, + .height = 4, + .paletteNum = 0xF, + .baseBlock = 0x00A + }, { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 15, + .width = 23, + .height = 4, + .paletteNum = 0xF, + .baseBlock = 0x022 + }, DUMMY_WIN_TEMPLATE +}; + +static const u8 sTextColor[] = { + TEXT_COLOR_WHITE, + TEXT_COLOR_DARK_GREY, + TEXT_COLOR_LIGHT_GREY +}; + +static void CB2_RunClearSaveDataScreen(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB_WaitYesNo(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_SaveClearScreen_Init(void) +{ + sClearSaveDataState = AllocZeroed(sizeof(struct ClearSaveDataStruct)); + sClearSaveDataState->unk1 = 0; + sClearSaveDataState->unk0 = 0; + sClearSaveDataState->unk2 = 0; + CB2_Sub_SaveClearScreen_Init(); + CreateTask(Task_DrawClearSaveDataScreen, 0); + SetMainCallback2(CB2_RunClearSaveDataScreen); +} + +static void Task_DrawClearSaveDataScreen(u8 taskId) +{ + switch (sClearSaveDataState->unk1) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + break; + case 1: + if (gPaletteFade.active) + return; + SetVBlankCallback(NULL); + break; + case 2: + SaveClearScreen_GpuInit(); + break; + case 3: + TextWindow_SetStdFrame0_WithPal(0, 0x001, 0xF0); + TextWindow_SetStdFrame0_WithPal(1, 0x001, 0xF0); + break; + case 4: + DrawStdFrameWithCustomTileAndPalette(1, TRUE, 0x001, 0xF); + AddTextPrinterParameterized4(1, 2, 0, 3, 1, 1, sTextColor, 0, gUnknown_841B69E); + CopyWindowToVram(1, 2); + break; + case 5: + CreateYesNoMenu(&sWindowTemplates[0], 2, 0, 2, 0x001, 0xF, 1); + CopyBgTilemapBufferToVram(0); + break; + default: + BeginNormalPaletteFade(0xFFFF, 0, 16, 0, RGB_WHITEALPHA); + SetVBlankCallback(VBlankCB_WaitYesNo); + gTasks[taskId].func = Task_HandleYesNoMenu; + break; + } + sClearSaveDataState->unk1++; +} + +static void Task_HandleYesNoMenu(u8 taskId) +{ + // agbcc refuses to keep &sClearSaveDataState in a register + // unless explicitly told to do so as such: + struct ClearSaveDataStruct ** r5 = &sClearSaveDataState; + if ((*r5)->unk0 == 0) + { + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case -1: + case 1: + PlaySE(SE_SELECT); + break; + case 0: + PlaySE(SE_SELECT); + FillWindowPixelBuffer(1, PIXEL_FILL(1)); + AddTextPrinterParameterized4(1, 2, 0, 3, 1, 1, sTextColor, 0, gUnknown_841B6B9); + CopyWindowToVram(1, 3); + ClearSaveData(); + break; + case -2: + default: + return; + } + (*r5)->unk0++; + } + else + { + Task_CleanUpAndSoftReset(taskId); + } +} + +static void Task_CleanUpAndSoftReset(u8 taskId) +{ + switch (sClearSaveDataState->unk2) + { + case 0: + BeginNormalPaletteFade(0xFFFF, 0, 0, 16, RGB_WHITEALPHA); + sClearSaveDataState->unk2++; + break; + case 1: + if (!gPaletteFade.active) + { + DestroyYesNoMenu(); + DestroyTask(taskId); + FreeAllWindowBuffers(); + FREE_AND_SET_NULL(sClearSaveDataState); + DoSoftReset(); + // noreturn + } + break; + } +} + +static void CB2_Sub_SaveClearScreen_Init(void) +{ + ResetSpriteData(); + ResetPaletteFade(); + ResetTasks(); +} + +static void SaveClearScreen_GpuInit(void) +{ + DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); + +#ifndef NONMATCHING + asm("":::"ip"); +#endif + + do + { + void * dest = (void *)OAM; + size_t size = OAM_SIZE; + DmaClear32(3, dest, size); + } while (0); + + do + { + void * dest = (void *)PLTT; + size_t size = PLTT_SIZE; + DmaClear16(3, dest, size); + } while (0); + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + InitWindows(sWindowTemplates); + DeactivateAllTextPrinters(); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); +} |