Decomp and doc clear_save_data_screen
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user