summaryrefslogtreecommitdiff
path: root/src/start_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/start_menu.c')
-rw-r--r--src/start_menu.c1008
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)++;
+}