summaryrefslogtreecommitdiff
path: root/src/clear_save_data_screen.c
diff options
context:
space:
mode:
authorultima-soul <akshayjhanji@hotmail.com>2020-03-13 00:32:04 -0700
committerultima-soul <akshayjhanji@hotmail.com>2020-03-13 00:32:04 -0700
commit99e4de062ae43aa978ad4f1a8cd70bc739c64c9d (patch)
tree1164d31577e6ebddc1cb313d40bb69ce0d426170 /src/clear_save_data_screen.c
parent339c2914affc3c62ac9a5725aa1a0c7ccc3161ca (diff)
parent6af8c04d8fa6aaeaeb6c8b919e7770a65b9a883d (diff)
Merge branch 'master' into event_object_movement
Diffstat (limited to 'src/clear_save_data_screen.c')
-rw-r--r--src/clear_save_data_screen.c224
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..b6f8b83e9
--- /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 MENU_B_PRESSED:
+ 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 MENU_NOTHING_CHOSEN:
+ 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);
+}