diff options
Diffstat (limited to 'src/engine/save_failed_screen.c')
-rw-r--r-- | src/engine/save_failed_screen.c | 230 |
1 files changed, 207 insertions, 23 deletions
diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index ba2d46546..49cf166d4 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -61,16 +61,18 @@ static const u8 sClockFrames[8][3] = static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); +#define static + static void VBlankCB(void); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); -static void CB2_GameplayCannotBeContinued(void); +/*static*/ void CB2_GameplayCannotBeContinued(void); static void CB2_FadeAndReturnToTitleScreen(void); static void CB2_ReturnToTitleScreen(void); static void VBlankCB_UpdateClockGraphics(void); static bool8 VerifySectorWipe(u16 sector); static bool8 WipeSector(u16 sector); -static bool8 WipeSectors(u32 sectorBits); +/*static*/ bool8 WipeSectors(u32 sectorBits); void DoSaveFailedScreen(u8 saveType) { @@ -120,11 +122,11 @@ static void CB2_SaveFailedScreen(void) ResetPaletteFade(); LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_DrawStdWindowFrame(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // message window + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); ime = REG_IME; REG_IME = 0; @@ -148,6 +150,151 @@ static void CB2_SaveFailedScreen(void) } } +#if DEBUG +__attribute__((naked)) +void CB2_WipeSave() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r0, ._20 @ gSaveFailedClockInfo\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n" + " ldr r0, [r0]\n" + " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n" + " cmp r0, #0\n" + " beq ._12 @cond_branch\n" + " str r2, [r1]\n" + "._12:\n" + " ldr r0, [r1]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " add r5, r1, #0\n" + "._17:\n" + " ldr r0, [r5]\n" + " bl WipeSectors\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._14 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 16 @ gSaveFailedType\n" + " ldrb r0, [r0]\n" + " bl Save_WriteDataInternal\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._15 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._15:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " cmp r4, #0x2\n" + " bls ._17 @cond_branch\n" + "._16:\n" + " cmp r4, #0x3\n" + " bne ._18 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n" + " bl SetMainCallback2\n" + " b ._23\n" + "._21:\n" + " .align 2, 0\n" + "._20:\n" + " .word gSaveFailedClockInfo\n" + " .word gUnknown_Debug_03004BD0\n" + " .word gDamagedSaveSectors\n" + " .word gSystemText_CheckCompleteSaveAttempt\n" + " .word gSaveFailedType\n" + " .word gSystemText_SaveFailedBackupCheck\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "._18:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._24 @ gGameContinueCallback\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " bne ._22 @cond_branch\n" + " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gGameContinueCallback\n" + " .word gSystemText_SaveCompletedGameEnd\n" + "._14:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n" + " bl SetMainCallback2\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_GameplayCannotBeContinued+1\n" + "._22:\n" + " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._23:\n" + " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n" + " bl SetMainCallback2\n" + "._26:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gSystemText_SaveCompletedPressA\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "\n" + ); +} +#else static void CB2_WipeSave(void) { u8 wipeTries = 0; @@ -158,22 +305,22 @@ static void CB2_WipeSave(void) { if (WipeSectors(gDamagedSaveSectors) != FALSE) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); SetMainCallback2(CB2_GameplayCannotBeContinued); return; } - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); - HandleSavingData(gSaveFailedType); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); + Save_WriteDataInternal(gSaveFailedType); if (gDamagedSaveSectors != 0) { #ifdef BUGFIX_SAVEFAILEDSCREEN2 - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); #endif - MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); } wipeTries++; @@ -181,32 +328,33 @@ static void CB2_WipeSave(void) if (wipeTries == 3) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below } else { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // no callback exists, so the game cannot continue. if (gGameContinueCallback == 0) - MenuPrint(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); else // callback exists, so continue - MenuPrint(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); + Menu_PrintText(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); } SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } +#endif -static void CB2_GameplayCannotBeContinued(void) +/*static*/ void CB2_GameplayCannotBeContinued(void) { gSaveFailedClockInfo[0] = FALSE; if (gMain.newKeys & A_BUTTON) { - MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); - MenuPrint(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } @@ -264,6 +412,41 @@ static void VBlankCB_UpdateClockGraphics(void) gSaveFailedClockInfo[1]--; } +#if DEBUG +__attribute__((naked)) +bool8 VerifySectorWipe(u16 sector) +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldr r2, ._50 @ \n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x5\n" + " mov r1, #0x0\n" + " bl ReadFlash\n" + " mov r0, #0x0\n" + " ldr r1, ._50 + 4 @ \n" + "._49:\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, r1\n" + " bls ._49 @cond_branch\n" + " ldr r0, ._50 + 8 @ \n" + " ldrb r0, [r0]\n" + " pop {r1}\n" + " bx r1\n" + "._51:\n" + " .align 2, 0\n" + "._50:\n" + " .word +0x2000000\n" + " .word 0x3ff\n" + " .word gUnknown_Debug_03004BD0\n" + "\n" + ); +} +#else static bool8 VerifySectorWipe(u16 sector) { u32 *ptr = (u32 *)&gSharedMem; @@ -277,6 +460,7 @@ static bool8 VerifySectorWipe(u16 sector) return FALSE; } +#endif static bool8 WipeSector(u16 sector) { @@ -294,7 +478,7 @@ static bool8 WipeSector(u16 sector) return failed; } -static bool8 WipeSectors(u32 sectorBits) +/*static*/ bool8 WipeSectors(u32 sectorBits) { u16 i; |