diff options
Diffstat (limited to 'src/start_menu.c')
-rw-r--r-- | src/start_menu.c | 1008 |
1 files changed, 1008 insertions, 0 deletions
diff --git a/src/start_menu.c b/src/start_menu.c new file mode 100644 index 000000000..1bfca6761 --- /dev/null +++ b/src/start_menu.c @@ -0,0 +1,1008 @@ +#include "global.h" +#include "palette.h" +#include "bg.h" +#include "gpu_regs.h" +#include "scanline_effect.h" +#include "overworld.h" +#include "link.h" +#include "pokedex.h" +#include "item_menu.h" +#include "party_menu.h" +#include "save.h" +#include "link_rfu.h" +#include "event_data.h" +#include "fieldmap.h" +#include "safari_zone.h" +#include "start_menu.h" +#include "menu.h" +#include "load_save.h" +#include "strings.h" +#include "string_util.h" +#include "menu_helpers.h" +#include "text_window.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "new_menu_helpers.h" +#include "map_obj_80688E4.h" +#include "map_obj_lock.h" +#include "script.h" +#include "sound.h" +#include "quest_log.h" +#include "new_game.h" +#include "event_scripts.h" +#include "field_weather.h" +#include "field_specials.h" +#include "pokedex_screen.h" +#include "trainer_card.h" +#include "option_menu.h" +#include "save_menu_util.h" +#include "help_system.h" +#include "constants/songs.h" +#include "constants/flags.h" + +enum StartMenuOption +{ + STARTMENU_POKEDEX = 0, + STARTMENU_POKEMON, + STARTMENU_BAG, + STARTMENU_PLAYER, + STARTMENU_SAVE, + STARTMENU_OPTION, + STARTMENU_EXIT, + STARTMENU_RETIRE, + STARTMENU_PLAYER2, + MAX_STARTMENU_ITEMS +}; + +enum SaveCBReturn +{ + SAVECB_RETURN_CONTINUE = 0, + SAVECB_RETURN_OKAY, + SAVECB_RETURN_CANCEL, + SAVECB_RETURN_ERROR +}; + +static EWRAM_DATA bool8 (*sStartMenuCallback)(void) = NULL; +static EWRAM_DATA u8 sStartMenuCursorPos = 0; +static EWRAM_DATA u8 sNumStartMenuItems = 0; +static EWRAM_DATA u8 sStartMenuOrder[MAX_STARTMENU_ITEMS] = {}; +static EWRAM_DATA s8 sDrawStartMenuState[2] = {}; +static EWRAM_DATA u8 sSafariZoneStatsWindowId = 0; +static ALIGNED(4) EWRAM_DATA u8 sSaveStatsWindowId = 0; + +static u8 (*sSaveDialogCB)(void); +static u8 sSaveDialogDelay; +static u8 sSaveDialogIsPrinting; + +static void SetUpStartMenu_Link(void); +static void SetUpStartMenu_UnionRoom(void); +static void SetUpStartMenu_SafariZone(void); +static void SetUpStartMenu_NormalField(void); +static bool8 StartCB_HandleInput(void); +static void StartMenu_FadeScreenIfLeavingOverworld(void); +static bool8 StartMenuPokedexSanityCheck(void); +static bool8 StartMenuPokedexCallback(void); +static bool8 StartMenuPokemonCallback(void); +static bool8 StartMenuBagCallback(void); +static bool8 StartMenuPlayerCallback(void); +static bool8 StartMenuSaveCallback(void); +static bool8 StartMenuOptionCallback(void); +static bool8 StartMenuExitCallback(void); +static bool8 StartMenuSafariZoneRetireCallback(void); +static bool8 StartMenuLinkPlayerCallback(void); +static bool8 StartCB_Save1(void); +static bool8 StartCB_Save2(void); +static void StartMenu_PrepareForSave(void); +static u8 RunSaveDialogCB(void); +static void task50_save_game(u8 taskId); +static u8 SaveDialogCB_PrintAskSaveText(void); +static u8 SaveDialogCB_AskSavePrintYesNoMenu(void); +static u8 SaveDialogCB_AskSaveHandleInput(void); +static u8 SaveDialogCB_PrintAskOverwriteText(void); +static u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void); +static u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void); +static u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void); +static u8 SaveDialogCB_PrintSavingDontTurnOffPower(void); +static u8 SaveDialogCB_DoSave(void); +static u8 SaveDialogCB_PrintSaveResult(void); +static u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void); +static u8 SaveDialogCB_ReturnSuccess(void); +static u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void); +static u8 SaveDialogCB_ReturnError(void); +static void CB2_WhileSavingAfterLinkBattle(void); +static void task50_after_link_battle_save(u8 taskId); +static void PrintSaveStats(void); +static void CloseSaveStatsWindow(void); +static void CloseStartMenu(void); + +static const struct MenuAction sStartMenuActionTable[] = { + { gStartMenuText_Pokedex, {.u8_void = StartMenuPokedexCallback} }, + { gStartMenuText_Pokemon, {.u8_void = StartMenuPokemonCallback} }, + { gStartMenuText_Bag, {.u8_void = StartMenuBagCallback} }, + { gStartMenuText_Player, {.u8_void = StartMenuPlayerCallback} }, + { gStartMenuText_Save, {.u8_void = StartMenuSaveCallback} }, + { gStartMenuText_Option, {.u8_void = StartMenuOptionCallback} }, + { gStartMenuText_Exit, {.u8_void = StartMenuExitCallback} }, + { gStartMenuText_Retire, {.u8_void = StartMenuSafariZoneRetireCallback} }, + { gStartMenuText_Player, {.u8_void = StartMenuLinkPlayerCallback} } +}; + +static const struct WindowTemplate sSafariZoneStatsWindowTemplate = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 10, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x008 +}; + +static const u8 *const sStartMenuDescPointers[] = { + gStartMenuDesc_Pokedex, + gStartMenuDesc_Pokemon, + gStartMenuDesc_Bag, + gStartMenuDesc_Player, + gStartMenuDesc_Save, + gStartMenuDesc_Option, + gStartMenuDesc_Exit, + gStartMenuDesc_Retire, + gStartMenuDesc_Player +}; + +static const struct BgTemplate sBGTemplates_AfterLinkSaveMessage[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + } +}; + +static const struct WindowTemplate sWindowTemplates_AfterLinkSaveMessage[] = { + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 26, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x198 + }, DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sSaveStatsWindowTemplate = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 14, + .height = 9, + .paletteNum = 13, + .baseBlock = 0x008 +}; + +static ALIGNED(2) const u8 sTextColor_StatName[] = { 1, 2, 3 }; +static ALIGNED(2) const u8 sTextColor_StatValue[] = { 1, 4, 5 }; +static ALIGNED(2) const u8 sTextColor_LocationHeader[] = { 1, 6, 7 }; + +static void SetUpStartMenu(void) +{ + sNumStartMenuItems = 0; + if (IsUpdateLinkStateCBActive() == TRUE) + SetUpStartMenu_Link(); + else if (InUnionRoom() == TRUE) + SetUpStartMenu_UnionRoom(); + else if (GetSafariZoneFlag() == TRUE) + SetUpStartMenu_SafariZone(); + else + SetUpStartMenu_NormalField(); +} + +static void AppendToStartMenuItems(u8 newEntry) +{ + AppendToList(sStartMenuOrder, &sNumStartMenuItems, newEntry); +} + +static void SetUpStartMenu_NormalField(void) +{ + if (FlagGet(FLAG_0x829) == TRUE) + AppendToStartMenuItems(STARTMENU_POKEDEX); + if (FlagGet(FLAG_0x828) == TRUE) + AppendToStartMenuItems(STARTMENU_POKEMON); + AppendToStartMenuItems(STARTMENU_BAG); + AppendToStartMenuItems(STARTMENU_PLAYER); + AppendToStartMenuItems(STARTMENU_SAVE); + AppendToStartMenuItems(STARTMENU_OPTION); + AppendToStartMenuItems(STARTMENU_EXIT); +} + +static void SetUpStartMenu_SafariZone(void) +{ + AppendToStartMenuItems(STARTMENU_RETIRE); + AppendToStartMenuItems(STARTMENU_POKEDEX); + AppendToStartMenuItems(STARTMENU_POKEMON); + AppendToStartMenuItems(STARTMENU_BAG); + AppendToStartMenuItems(STARTMENU_PLAYER); + AppendToStartMenuItems(STARTMENU_OPTION); + AppendToStartMenuItems(STARTMENU_EXIT); +} + +static void SetUpStartMenu_Link(void) +{ + AppendToStartMenuItems(STARTMENU_POKEMON); + AppendToStartMenuItems(STARTMENU_BAG); + AppendToStartMenuItems(STARTMENU_PLAYER2); + AppendToStartMenuItems(STARTMENU_OPTION); + AppendToStartMenuItems(STARTMENU_EXIT); +} + +static void SetUpStartMenu_UnionRoom(void) +{ + AppendToStartMenuItems(STARTMENU_POKEMON); + AppendToStartMenuItems(STARTMENU_BAG); + AppendToStartMenuItems(STARTMENU_PLAYER); + AppendToStartMenuItems(STARTMENU_OPTION); + AppendToStartMenuItems(STARTMENU_EXIT); +} + +static void DrawSafariZoneStatsWindow(void) +{ + sSafariZoneStatsWindowId = AddWindow(&sSafariZoneStatsWindowTemplate); + PutWindowTilemap(sSafariZoneStatsWindowId); + DrawStdWindowFrame(sSafariZoneStatsWindowId, FALSE); + ConvertIntToDecimalStringN(gStringVar1, gSafariZoneStepCounter, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, 600, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar3, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2); + StringExpandPlaceholders(gStringVar4, gUnknown_84162A9); + AddTextPrinterParameterized(sSafariZoneStatsWindowId,2, gStringVar4, 4, 3, 0xFF, NULL); + CopyWindowToVram(sSafariZoneStatsWindowId, 2); +} + +static void DestroySafariZoneStatsWindow(void) +{ + if (GetSafariZoneFlag()) + { + ClearStdWindowAndFrameToTransparent(sSafariZoneStatsWindowId, FALSE); + CopyWindowToVram(sSafariZoneStatsWindowId, 2); + RemoveWindow(sSafariZoneStatsWindowId); + } +} + +static s8 PrintStartMenuItems(s8 *cursor_p, u8 nitems) +{ + s16 i = *cursor_p; + do + { + if (sStartMenuOrder[i] == STARTMENU_PLAYER || sStartMenuOrder[i] == STARTMENU_PLAYER2) + { + Menu_PrintFormatIntlPlayerName(GetStartMenuWindowId(), sStartMenuActionTable[sStartMenuOrder[i]].text, 8, i * 15); + } + else + { + StringExpandPlaceholders(gStringVar4, sStartMenuActionTable[sStartMenuOrder[i]].text); + AddTextPrinterParameterized(GetStartMenuWindowId(), 2, gStringVar4, 8, i * 15, 0xFF, NULL); + } + i++; + if (i >= sNumStartMenuItems) + { + *cursor_p = i; + return TRUE; + } + } while (--nitems); + *cursor_p = i; + return FALSE; +} + +static s8 DoDrawStartMenu(void) +{ + switch (sDrawStartMenuState[0]) + { + case 0: + sDrawStartMenuState[0]++; + break; + case 1: + SetUpStartMenu(); + sDrawStartMenuState[0]++; + break; + case 2: + LoadStdWindowFrameGfx(); + DrawStdWindowFrame(CreateStartMenuWindow(sNumStartMenuItems), FALSE); + sDrawStartMenuState[0]++; + break; + case 3: + if (GetSafariZoneFlag()) + DrawSafariZoneStatsWindow(); + sDrawStartMenuState[0]++; + break; + case 4: + if (PrintStartMenuItems(&sDrawStartMenuState[1], 2) == TRUE) + sDrawStartMenuState[0]++; + break; + case 5: + sStartMenuCursorPos = Menu_InitCursor(GetStartMenuWindowId(), 2, 0, 0, 15, sNumStartMenuItems, sStartMenuCursorPos); + if (!MenuHelpers_LinkSomething() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) + { + DrawHelpMessageWindowWithText(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]]); + } + CopyWindowToVram(GetStartMenuWindowId(), 1); + return TRUE; + } + return FALSE; +} + +void DrawStartMenuInOneGo(void) +{ + sDrawStartMenuState[0] = 0; + sDrawStartMenuState[1] = 0; + while (!DoDrawStartMenu()) + ; +} + +static void task50_startmenu(u8 taskId) +{ + if (DoDrawStartMenu() == TRUE) + SwitchTaskToFollowupFunc(taskId); +} + +static void OpenStartMenuWithFollowupFunc(TaskFunc func) +{ + u8 taskId; + sDrawStartMenuState[0] = 0; + sDrawStartMenuState[1] = 0; + taskId = CreateTask(task50_startmenu, 80); + SetTaskFuncWithFollowupFunc(taskId, task50_startmenu, func); +} + +static bool8 FieldCB2_DrawStartMenu(void) +{ + if (!DoDrawStartMenu()) + return FALSE; + FadeTransition_FadeInOnReturnToStartMenu(); + return TRUE; +} + +void SetUpReturnToStartMenu(void) +{ + sDrawStartMenuState[0] = 0; + sDrawStartMenuState[1] = 0; + gFieldCallback2 = FieldCB2_DrawStartMenu; +} + +void Task_StartMenuHandleInput(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + switch (data[0]) + { + case 0: + if (InUnionRoom() == TRUE) + var_800D_set_xB(); + sStartMenuCallback = StartCB_HandleInput; + data[0]++; + break; + case 1: + if (sStartMenuCallback() == TRUE) + DestroyTask(taskId); + break; + } +} + +void ShowStartMenu(void) +{ + if (!IsUpdateLinkStateCBActive()) + { + player_bitmagic(); + sub_805C270(); + sub_805C780(); + } + OpenStartMenuWithFollowupFunc(Task_StartMenuHandleInput); + ScriptContext2_Enable(); +} + +static bool8 StartCB_HandleInput(void) +{ + if (JOY_NEW(DPAD_UP)) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = Menu_MoveCursor(-1); + if (!MenuHelpers_LinkSomething() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) + { + PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2); + } + } + if (JOY_NEW(DPAD_DOWN)) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = Menu_MoveCursor(+1); + if (!MenuHelpers_LinkSomething() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP) + { + PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2); + } + } + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + if (!StartMenuPokedexSanityCheck()) + return FALSE; + sStartMenuCallback = sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void; + StartMenu_FadeScreenIfLeavingOverworld(); + return FALSE; + } + if (JOY_NEW(B_BUTTON | START_BUTTON)) + { + DestroySafariZoneStatsWindow(); + DestroyHelpMessageWindow_(); + CloseStartMenu(); + return TRUE; + } + return FALSE; +} + +static void StartMenu_FadeScreenIfLeavingOverworld(void) +{ + if (sStartMenuCallback != StartMenuSaveCallback + && sStartMenuCallback != StartMenuExitCallback + && sStartMenuCallback != StartMenuSafariZoneRetireCallback) + { + sub_80CCB68(); + fade_screen(1, 0); + } +} + +static bool8 StartMenuPokedexSanityCheck(void) +{ + if (sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void == StartMenuPokedexCallback && GetNationalPokedexCount(0) == 0) + return FALSE; + return TRUE; +} + +static bool8 StartMenuPokedexCallback(void) +{ + if (!gPaletteFade.active) + { + IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); + PlayRainStoppingSoundEffect(); + DestroySafariZoneStatsWindow(); + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_OpenPokedexFromStartMenu); + return TRUE; + } + return FALSE; +} + +static bool8 StartMenuPokemonCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainStoppingSoundEffect(); + DestroySafariZoneStatsWindow(); + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_PartyMenuFromStartMenu); + return TRUE; + } + return FALSE; +} + +static bool8 StartMenuBagCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainStoppingSoundEffect(); + DestroySafariZoneStatsWindow(); + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_BagMenuFromStartMenu); + return TRUE; + } + return FALSE; +} + +static bool8 StartMenuPlayerCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainStoppingSoundEffect(); + DestroySafariZoneStatsWindow(); + CleanupOverworldWindowsAndTilemaps(); + InitTrainerCard(CB2_ReturnToStartMenu); + return TRUE; + } + return FALSE; +} + +static bool8 StartMenuSaveCallback(void) +{ + sStartMenuCallback = StartCB_Save1; + return FALSE; +} + +static bool8 StartMenuOptionCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainStoppingSoundEffect(); + DestroySafariZoneStatsWindow(); + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_OptionsMenuFromStartMenu); + gMain.savedCallback = CB2_ReturnToStartMenu; + return TRUE; + } + return FALSE; +} + +static bool8 StartMenuExitCallback(void) +{ + DestroySafariZoneStatsWindow(); + DestroyHelpMessageWindow_(); + CloseStartMenu(); + return TRUE; +} + +static bool8 StartMenuSafariZoneRetireCallback(void) +{ + DestroySafariZoneStatsWindow(); + DestroyHelpMessageWindow_(); + CloseStartMenu(); + SafariZoneRetirePrompt(); + return TRUE; +} + + +static bool8 StartMenuLinkPlayerCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainStoppingSoundEffect(); + CleanupOverworldWindowsAndTilemaps(); + InitLinkPartnerTrainerCard(gUnknown_300502C, CB2_ReturnToStartMenu); + return TRUE; + } + return FALSE; +} + +static bool8 StartCB_Save1(void) +{ + HelpSystem_BackupSomeVariable(); + HelpSystem_SetSomeVariable2(12); + StartMenu_PrepareForSave(); + sStartMenuCallback = StartCB_Save2; + return FALSE; +} + +static bool8 StartCB_Save2(void) +{ + switch (RunSaveDialogCB()) + { + case SAVECB_RETURN_CONTINUE: + break; + case SAVECB_RETURN_OKAY: + ClearDialogWindowAndFrameToTransparent(0, TRUE); + sub_80696C0(); + ScriptContext2_Disable(); + HelpSystem_RestoreSomeVariable(); + return TRUE; + case SAVECB_RETURN_CANCEL: + ClearDialogWindowAndFrameToTransparent(0, FALSE); + DrawStartMenuInOneGo(); + HelpSystem_RestoreSomeVariable(); + sStartMenuCallback = StartCB_HandleInput; + break; + case SAVECB_RETURN_ERROR: + ClearDialogWindowAndFrameToTransparent(0, TRUE); + sub_80696C0(); + ScriptContext2_Disable(); + HelpSystem_RestoreSomeVariable(); + return TRUE; + } + return FALSE; +} + +static void StartMenu_PrepareForSave(void) +{ + save_serialize_map(); + sSaveDialogCB = SaveDialogCB_PrintAskSaveText; + sSaveDialogIsPrinting = 0; +} + +static u8 RunSaveDialogCB(void) +{ + if (RunTextPrinters_CheckPrinter0Active() == TRUE) + return 0; + sSaveDialogIsPrinting = 0; + return sSaveDialogCB(); +} + +void Field_AskSaveTheGame(void) +{ + HelpSystem_BackupSomeVariable(); + HelpSystem_SetSomeVariable2(12); + StartMenu_PrepareForSave(); + CreateTask(task50_save_game, 80); +} + +void PrintSaveTextWithFollowupFunc(const u8 *str, bool8 (*savecb)(void)) +{ + StringExpandPlaceholders(gStringVar4, str); + sub_80F7768(0, TRUE); + AddTextPrinterForMessage(TRUE); + sSaveDialogIsPrinting = 1; + sSaveDialogCB = savecb; +} + +void task50_save_game(u8 taskId) +{ + switch (RunSaveDialogCB()) + { + case 0: + return; + case 2: + case 3: + gSpecialVar_Result = FALSE; + break; + case 1: + gSpecialVar_Result = TRUE; + break; + } + DestroyTask(taskId); + EnableBothScriptContexts(); + HelpSystem_RestoreSomeVariable(); +} + +static void CloseSaveMessageWindow(void) +{ + ClearDialogWindowAndFrame(0, TRUE); +} + +static void CloseSaveStatsWindow_(void) +{ + CloseSaveStatsWindow(); +} + +static void SetSaveDialogDelayTo60Frames(void) +{ + sSaveDialogDelay = 60; +} + +static bool8 SaveDialog_Wait60FramesOrAButtonHeld(void) +{ + sSaveDialogDelay--; + if (JOY_HELD(A_BUTTON)) + { + PlaySE(SE_SELECT); + return TRUE; + } + else if (sSaveDialogDelay == 0) + { + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 SaveDialog_Wait60FramesThenCheckAButtonHeld(void) +{ + if (sSaveDialogDelay == 0) + { + if (JOY_HELD(A_BUTTON)) + { + return TRUE; + } + else + { + return FALSE; + } + } + else + { + sSaveDialogDelay--; + return FALSE; + } +} + +static u8 SaveDialogCB_PrintAskSaveText(void) +{ + ClearStdWindowAndFrame(GetStartMenuWindowId(), FALSE); + RemoveStartMenuWindow(); + DestroyHelpMessageWindow(0); + PrintSaveStats(); + PrintSaveTextWithFollowupFunc(gText_WouldYouLikeToSaveTheGame, SaveDialogCB_AskSavePrintYesNoMenu); + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_AskSavePrintYesNoMenu(void) +{ + DisplayYesNoMenuDefaultYes(); + sSaveDialogCB = SaveDialogCB_AskSaveHandleInput; + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_AskSaveHandleInput(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + if ((gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID) || !gDifferentSaveFile) + sSaveDialogCB = SaveDialogCB_PrintAskOverwriteText; + else + sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower; + break; + case 1: + case -1: + CloseSaveStatsWindow_(); + CloseSaveMessageWindow(); + return SAVECB_RETURN_CANCEL; + } + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_PrintAskOverwriteText(void) +{ + if (gDifferentSaveFile == TRUE) + PrintSaveTextWithFollowupFunc(gText_DifferentGameFile, SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu); + else + PrintSaveTextWithFollowupFunc(gText_AlreadySaveFile_WouldLikeToOverwrite, SaveDialogCB_AskOverwritePrintYesNoMenu); + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void) +{ + DisplayYesNoMenuDefaultYes(); + sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput; + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void) +{ + DisplayYesNoMenuDefaultNo(); + sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput; + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower; + break; + case 1: + case -1: + CloseSaveStatsWindow_(); + CloseSaveMessageWindow(); + return SAVECB_RETURN_CANCEL; + } + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_PrintSavingDontTurnOffPower(void) +{ + sub_8112450(); + PrintSaveTextWithFollowupFunc(gText_SavingDontTurnOffThePower, SaveDialogCB_DoSave); + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_DoSave(void) +{ + IncrementGameStat(GAME_STAT_SAVED_GAME); + if (gDifferentSaveFile == TRUE) + { + TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE); + gDifferentSaveFile = FALSE; + } + else + { + TrySavingData(SAVE_NORMAL); + } + sSaveDialogCB = SaveDialogCB_PrintSaveResult; + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_PrintSaveResult(void) +{ + if (gSaveSucceeded == TRUE) + PrintSaveTextWithFollowupFunc(gText_PlayerSavedTheGame, SaveDialogCB_WaitPrintSuccessAndPlaySE); + else + PrintSaveTextWithFollowupFunc(gText_SaveError_PleaseExchangeBackupMemory, SaveDialogCB_WaitPrintErrorAndPlaySE); + SetSaveDialogDelayTo60Frames(); + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void) +{ + if (!RunTextPrinters_CheckPrinter0Active()) + { + PlaySE(SE_SAVE); + sSaveDialogCB = SaveDialogCB_ReturnSuccess; + } + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_ReturnSuccess(void) +{ + if (!IsSEPlaying() && SaveDialog_Wait60FramesOrAButtonHeld()) + { + CloseSaveStatsWindow_(); + return SAVECB_RETURN_OKAY; + } + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void) +{ + if (!RunTextPrinters_CheckPrinter0Active()) + { + PlaySE(SE_BOO); + sSaveDialogCB = SaveDialogCB_ReturnError; + } + return SAVECB_RETURN_CONTINUE; +} + +static u8 SaveDialogCB_ReturnError(void) +{ + if (!SaveDialog_Wait60FramesThenCheckAButtonHeld()) + return SAVECB_RETURN_CONTINUE; + CloseSaveStatsWindow_(); + return SAVECB_RETURN_ERROR; +} + +static void VBlankCB_WhileSavingAfterLinkBattle(void) +{ + TransferPlttBuffer(); +} + +bool32 DoSetUpSaveAfterLinkBattle(u8 *state) +{ + switch (*state) + { + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); + DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); + break; + case 1: + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + ScanlineEffect_Clear(); + break; + case 2: + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, sBGTemplates_AfterLinkSaveMessage, NELEMS(sBGTemplates_AfterLinkSaveMessage)); + InitWindows(sWindowTemplates_AfterLinkSaveMessage); + TextWindow_SetStdFrame0_WithPal(0, 0x008, 0xF0); + break; + case 3: + ShowBg(0); + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + SetVBlankCallback(VBlankCB_WhileSavingAfterLinkBattle); + EnableInterrupts(INTR_FLAG_VBLANK); + break; + case 4: + return TRUE; + } + (*state)++; + return FALSE; +} + +void CB2_SetUpSaveAfterLinkBattle(void) +{ + if (DoSetUpSaveAfterLinkBattle(&gMain.state)) + { + CreateTask(task50_after_link_battle_save, 80); + SetMainCallback2(CB2_WhileSavingAfterLinkBattle); + } +} + +static void CB2_WhileSavingAfterLinkBattle(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void task50_after_link_battle_save(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (!gPaletteFade.active) + { + switch (data[0]) + { + case 0: + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0xFF, NULL, 2, 1, 3); + DrawTextBorderOuter(0, 0x008, 0x0F); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + if (gWirelessCommType != 0 && InUnionRoom()) + data[0] = 5; + else + data[0] = 1; + break; + case 1: + sub_804C1C0(); + sub_80DA45C(); + data[0] = 2; + break; + case 2: + if (sub_80DA4A0()) + { + sav2_gender2_inplace_and_xFE(); + data[0] = 3; + } + break; + case 3: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + data[0] = 4; + break; + case 4: + FreeAllWindowBuffers(); + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + break; + case 5: + CreateTask(sub_80DA634, 5); + data[0] = 6; + break; + case 6: + if (!FuncIsActiveTask(sub_80DA634)) + data[0] = 3; + break; + } + } +} + +static void PrintSaveStats(void) +{ + u8 y; + u8 x; + sSaveStatsWindowId = AddWindow(&sSaveStatsWindowTemplate); + TextWindow_SetStdFrame0_WithPal(sSaveStatsWindowId, 0x21D, 0xD0); + DrawStdFrameWithCustomTileAndPalette(sSaveStatsWindowId, FALSE, 0x21D, 0x0D); + SaveStatToString(SAVE_STAT_LOCATION, gStringVar4, 8); + x = (u32)(112 - GetStringWidth(2, gStringVar4, -1)) / 2; + AddTextPrinterParameterized3(sSaveStatsWindowId, 2, x, 0, sTextColor_LocationHeader, -1, gStringVar4); + x = (u32)(112 - GetStringWidth(2, gStringVar4, -1)) / 2; + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 2, 14, sTextColor_StatName, -1, gSaveStatName_Player); + SaveStatToString(SAVE_STAT_NAME, gStringVar4, 2); + Menu_PrintFormatIntlPlayerName(sSaveStatsWindowId, gStringVar4, 60, 14); + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 2, 28, sTextColor_StatName, -1, gSaveStatName_Badges); + SaveStatToString(SAVE_STAT_BADGES, gStringVar4, 2); + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 60, 28, sTextColor_StatValue, -1, gStringVar4); + y = 42; + if (FlagGet(FLAG_0x829) == TRUE) + { + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 2, 42, sTextColor_StatName, -1, gSaveStatName_Pokedex); + SaveStatToString(SAVE_STAT_POKEDEX, gStringVar4, 2); + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 60, 42, sTextColor_StatValue, -1, gStringVar4); + y = 56; + } + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 2, y, sTextColor_StatName, -1, gSaveStatName_Time); + SaveStatToString(SAVE_STAT_TIME, gStringVar4, 2); + AddTextPrinterParameterized3(sSaveStatsWindowId, 0, 60, y, sTextColor_StatValue, -1, gStringVar4); + CopyWindowToVram(sSaveStatsWindowId, 2); +} + +static void CloseSaveStatsWindow(void) +{ + ClearStdWindowAndFrame(sSaveStatsWindowId, FALSE); + RemoveWindow(sSaveStatsWindowId); +} + +static void CloseStartMenu(void) +{ + PlaySE(SE_SELECT); + ClearStdWindowAndFrame(GetStartMenuWindowId(), TRUE); + RemoveStartMenuWindow(); + sub_80696C0(); + ScriptContext2_Disable(); +} + +void AppendToList(u8 *list, u8 *cursor, u8 newEntry) +{ + list[*cursor] = newEntry; + (*cursor)++; +} |