pokefirered/src/start_menu.c
2019-12-17 18:49:34 -05:00

1009 lines
28 KiB
C

#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 "event_object_80688E4.h"
#include "event_object_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 bool8 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_SYS_POKEDEX_GET) == TRUE)
AppendToStartMenuItems(STARTMENU_POKEDEX);
if (FlagGet(FLAG_SYS_POKEMON_GET) == 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;
}
static 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())
{
FreezeObjectEvents();
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)
{
StopPokemonLeagueLightingEffectTask();
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();
ShowPlayerTrainerCard(CB2_ReturnToFieldWithOpenMenu);
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_ReturnToFieldWithOpenMenu;
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();
ShowTrainerCardInLink(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu);
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 = FALSE;
}
static u8 RunSaveDialogCB(void)
{
if (RunTextPrinters_CheckPrinter0Active() == TRUE)
return 0;
sSaveDialogIsPrinting = FALSE;
return sSaveDialogCB();
}
void Field_AskSaveTheGame(void)
{
HelpSystem_BackupSomeVariable();
HelpSystem_SetSomeVariable2(12);
StartMenu_PrepareForSave();
CreateTask(task50_save_game, 80);
}
static void PrintSaveTextWithFollowupFunc(const u8 *str, bool8 (*saveDialogCB)(void))
{
StringExpandPlaceholders(gStringVar4, str);
sub_80F7768(0, TRUE);
AddTextPrinterForMessage(TRUE);
sSaveDialogIsPrinting = TRUE;
sSaveDialogCB = saveDialogCB;
}
static 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;
}
}
static 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:
SetContinueGameWarpStatusToDynamicWarp();
sub_80DA45C();
data[0] = 2;
break;
case 2:
if (sub_80DA4A0())
{
ClearContinueGameWarpStatus2();
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_SYS_POKEDEX_GET) == 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)++;
}