diff options
Diffstat (limited to 'src/engine/clear_save_data_menu.c')
-rw-r--r-- | src/engine/clear_save_data_menu.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/engine/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c new file mode 100644 index 000000000..498562fe0 --- /dev/null +++ b/src/engine/clear_save_data_menu.c @@ -0,0 +1,177 @@ +#include "global.h" +#include "clear_save_data_menu.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "save.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" + +static void VBlankCB_ClearSaveDataScreen(void); +static void Task_InitMenu(u8); +static void Task_ProcessMenuInput(u8); +static void Task_ClearSaveData(u8); +static void CB2_ClearSaveDataScreen(void); +static void VBlankCB_InitClearSaveDataScreen(void); +static u8 InitClearSaveDataScreen(void); +static void CB2_SoftReset(void); + +void CB2_InitClearSaveDataScreen(void) +{ + if (InitClearSaveDataScreen()) + { + CreateTask(Task_InitMenu, 0); + } +} + +static void VBlankCB_ClearSaveDataScreen(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void Task_InitMenu(u8 taskId) +{ + ResetSpriteData(); + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + SetVBlankCallback(VBlankCB_ClearSaveDataScreen); + MenuDrawTextWindow(2, 14, 27, 19); + MenuPrint(gSystemText_ClearAllSaveDataPrompt, 3, 15); + + MenuDrawTextWindow(2, 1, 8, 6); + PrintMenuItems(3, 2, 2, gMenuYesNoItems); + InitMenu(0, 3, 2, 2, 1, 5); + + gTasks[taskId].func = Task_ProcessMenuInput; +} + +static void Task_ProcessMenuInput(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + sub_8071F40(gSystemText_ClearingData); + gTasks[taskId].func = Task_ClearSaveData; + break; + case -1: + case 1: + PlaySE(SE_SELECT); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); + break; + } + AnimateSprites(); + BuildOamBuffer(); +} + +static void Task_ClearSaveData(u8 taskId) +{ + ClearSaveData(); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); +} + +static void CB2_ClearSaveDataScreen(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB_InitClearSaveDataScreen(void) +{ + TransferPlttBuffer(); +} + +static u8 InitClearSaveDataScreen(void) +{ + u16 i; + u16 ime; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + + gPlttBufferUnfaded[0] = 0x7fff; + gPlttBufferFaded[0] = 0x7fff; + gPlttBufferUnfaded[1] = 0x3945; + gPlttBufferFaded[1] = 0x3945; + + for (i = 0; i < 0x10; i++) + ((u16 *)(VRAM + 0x20))[i] = 0x1111; + + for (i = 0; i < 0x500; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0x0001; + + ResetTasks(); + ResetSpriteData(); + + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); + + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VBlankCB_InitClearSaveDataScreen); + + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON; + gMain.state = 1; + return 0; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return 0; + SetMainCallback2(CB2_ClearSaveDataScreen); + return 1; + } +} + +static void CB2_SoftReset(void) +{ + switch (gMain.state) + { + case 0: + default: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff); + gMain.state = 1; + break; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return; + DoSoftReset(); + break; + } +} |