diff options
Diffstat (limited to 'src/save_failed_screen.c')
-rw-r--r-- | src/save_failed_screen.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c new file mode 100644 index 000000000..dda0515a0 --- /dev/null +++ b/src/save_failed_screen.c @@ -0,0 +1,125 @@ +#include "global.h" +#include "decompress.h" +#include "dma3.h" +#include "gpu_regs.h" +#include "help_system.h" +#include "m4a.h" +#include "save.h" +#include "save_failed_screen.h" +#include "strings.h" + +bool32 gUnknown_3005430; +EWRAM_DATA u16 gUnknown_203AB4C = SAVE_NORMAL; +EWRAM_DATA u8 gUnknown_203AB50 = 0; + +void sub_80F52EC(void); +void sub_80F53CC(void); +void sub_80F53E8(void); +void sub_80F5404(const u8 *a0); +bool32 sub_80F5458(void); + +extern const u16 gUnknown_841EE44[]; + +void sub_80F50F4(void) +{ + gUnknown_3005430 = FALSE; +} + +void DoSaveFailedScreen(u8 saveType) +{ + gUnknown_203AB4C = saveType; + gUnknown_3005430 = TRUE; +} + +bool32 sub_80F5118(void) +{ + switch (gUnknown_203AB50) + { + case 0: + if (!gUnknown_3005430) + return FALSE; + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 128); + SaveCallbacks(); + gUnknown_203AB50 = 1; + break; + case 1: + SaveMapTiles(); + SaveMapGPURegs(); + SaveMapTextColors(); + sub_80F52EC(); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + gUnknown_203AB50 = 2; + break; + case 2: + RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, 0); + RequestDma3Copy(gUnknown_841EE44, (void *)PLTT, 0x20, 0); + gUnknown_203AB50 = 3; + break; + case 3: + sub_80F53E8(); + sub_80F5404(gUnknown_8418C83); + sub_80F53CC(); + gUnknown_203AB50 = 4; + break; + case 4: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON); + gUnknown_203AB50 = 5; + break; + case 5: + if (sub_80F5458() == TRUE) + { + gSaveSucceeded = SAVE_STATUS_OK; + sub_80F5404(gUnknown_8418E09); + } + else + { + gSaveSucceeded = SAVE_STATUS_ERROR; + sub_80F5404(gUnknown_8418CD9); + } + gUnknown_203AB50 = 6; + break; + case 6: + if (JOY_NEW(A_BUTTON)) + gUnknown_203AB50 = 7; + break; + case 7: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + RestoreMapTiles(); + sub_80F52EC(); + gUnknown_203AB50 = 8; + break; + case 8: + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256); + RestoreMapTextColors(); + RestoreGPURegs(); + RestoreCallbacks(); + gUnknown_3005430 = FALSE; + gUnknown_203AB50 = 0; + break; + } + return TRUE; +} + +void sub_80F52EC(void) +{ + int i; + for (i = 0; i < BG_PLTT_SIZE; i += sizeof(u16)) + { + *((u16 *)(BG_PLTT + i)) = RGB_BLACK; + *((u16 *)(OBJ_PLTT + i)) = RGB_BLACK; + } +} + +void sub_80F5318(void) +{ + RequestDma3Copy(gDecompressionBuffer + 0x3800, (void *)BG_SCREEN_ADDR(31), 0x500, 0); +} + +void sub_80F5334(void) +{ + RequestDma3Copy(gDecompressionBuffer + 0x020, (void *)BG_CHAR_ADDR(3) + 0x20, 0x2300, 0); +} |