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.c1152
1 files changed, 1118 insertions, 34 deletions
diff --git a/src/start_menu.c b/src/start_menu.c
index d076d307d..0df3f7b66 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -8,6 +8,29 @@
#include "text.h"
#include "strings.h"
#include "bg.h"
+#include "field_effect.h"
+#include "task.h"
+#include "overworld.h"
+#include "link.h"
+#include "battle_frontier_2.h"
+#include "rom_818CFC8.h"
+#include "field_specials.h"
+#include "field_map_obj_helpers.h"
+#include "script.h"
+#include "main.h"
+#include "sound.h"
+#include "pokedex.h"
+#include "field_weather.h"
+#include "palette.h"
+#include "item_menu.h"
+#include "option_menu.h"
+#include "event_scripts.h"
+#include "save.h"
+#include "gpu_regs.h"
+#include "scanline_effect.h"
+#include "text_window.h"
+#include "load_save.h"
+#include "international_string_util.h"
// Menu actions
enum
@@ -27,15 +50,71 @@ enum
MENU_ACTION_PYRAMID_BAG
};
-extern bool32 is_c1_link_related_active(void);
-extern bool32 InUnionRoom(void);
-extern bool8 InBattlePike(void);
-extern bool8 InBattlePyramid(void);
-extern bool8 InMultiBattleRoom(void);
-extern void NewMenuHelpers_DrawStdWindowFrame(u8 windowId, u8 a1);
-extern void sub_8198070(u8 windowId, u8 a1);
+// Save status
+enum
+{
+ SAVE_IN_PROGRESS,
+ SAVE_SUCCESS,
+ SAVE_CANCELED,
+ SAVE_ERROR
+};
+
+// Text
+extern u8 BattleFrontier_BattlePyramidEmptySquare_Text_252CA7[];
+extern u8 BattleFrontier_BattlePyramidEmptySquare_Text_252CFB[];
+extern u8 gUnknown_082C87B4[];
+extern u8 gUnknown_082C8845[]; // Different save file
+extern u8 gUnknown_082C87D5[]; // Already a save file
+extern u8 gUnknown_082C8810[]; // Saving… DON’T TURN OFF THE POWER.
+extern u8 gUnknown_082C8832[]; // {PLAYER} saved the game.
+extern u8 gUnknown_082C892A[]; // Save error.
+extern u8 gText_SavingDontTurnOffPower[];
+extern u8 gText_SavingPlayer[];
+extern u8 gText_SavingBadges[];
+extern u8 gText_SavingPokedex[];
+extern u8 gText_SavingTime[];
+
+// Extern variables
+extern u8 gDifferentSaveFile;
+extern u16 gSaveFileStatus;
+extern u8 gUnknown_03005DB4;
+
+extern void sub_80AF688(void);
+extern void var_800D_set_xB(void);
+extern void sub_808B864(void);
+extern void sub_808BCF4(void);
+extern void sub_80A0934(void);
+extern void sub_80BB534(void);
+extern void play_some_sound(void);
+extern void CB2_PartyMenuFromStartMenu(void);
+extern void CB2_PokeNav(void);
+extern void sub_80C4DDC(void (*)(void));
+extern void sub_80C51C4(void (*)(void));
+extern void sub_80C4E74(u8, void (*)(void));
+extern void sub_81C4EFC(void);
+extern void sub_80984F4(void);
+extern void sub_81A9EC8(void);
+extern void save_serialize_map(void);
+extern void sub_81A9E90(void);
+
+bool8 sub_809FE9C(void);
+void sub_80A0888(void);
+void sub_80A06B4(void);
// this file's functions
+static bool8 StartMenu_Pokedex(void);
+static bool8 StartMenu_Pokemon(void);
+static bool8 StartMenu_Bag(void);
+static bool8 StartMenu_PokeNav(void);
+static bool8 StartMenu_PlayerName(void);
+static bool8 StartMenu_Save(void);
+static bool8 StartMenu_Option(void);
+static bool8 StartMenu_Exit(void);
+static bool8 StartMenu_SafariZoneRetire(void);
+static bool8 StartMenu_LinkModePlayerName(void);
+static bool8 StartMenu_BattlePyramidRetire(void);
+static bool8 StartMenu_BattlePyramidBag(void);
+
static void BuildStartMenuActions_LinkMode(void);
static void BuildStartMenuActions_UnionRoom(void);
static void BuildStartMenuActions_SafariZone(void);
@@ -43,18 +122,42 @@ static void BuildStartMenuActions_BattlePike(void);
static void BuildStartMenuActions_BattlePyramid(void);
static void BuildStartMenuActions_MultiBattleRoom(void);
static void BuildStartMenuActions_Normal(void);
-bool8 StartMenu_Pokedex(void);
-bool8 StartMenu_Pokemon(void);
-bool8 StartMenu_Bag(void);
-bool8 StartMenu_PokeNav(void);
-bool8 StartMenu_PlayerName(void);
-bool8 StartMenu_Save(void);
-bool8 StartMenu_Option(void);
-bool8 StartMenu_Exit(void);
-bool8 StartMenu_SafariZoneRetire(void);
-bool8 StartMenu_LinkModePlayerName(void);
-bool8 StartMenu_BattlePyramidRetire(void);
-bool8 StartMenu_BattlePyramidBag(void);
+
+static void task50_save_game(u8 taskId);
+
+u8 sub_809FF4C(void);
+u8 sub_80A00EC(void);
+bool8 sub_80A00A0(void);
+bool8 sub_80A0108(void);
+bool8 sub_80A017C(void);
+u8 sub_80A01B4(void);
+u8 sub_80A01D0(void);
+u8 sub_80A01EC(void);
+u8 sub_80A0234(void);
+u8 sub_80A024C(void);
+u8 sub_80A02B0(void);
+u8 sub_80A02FC(void);
+u8 sub_80A02D8(void);
+u8 sub_80A0324(void);
+void sub_80A0340(void);
+u8 sub_80A035C(void);
+u8 sub_80A0388(void);
+u8 sub_80A03A4(void);
+
+bool8 HandleStartMenuInput(void);
+
+bool32 PrintStartMenuActions(s8*, u32);
+bool32 sub_809F894(void);
+void InitStartMenu(void);
+void sub_809FF28(void);
+
+void sub_80A0540(void);
+void sub_80A0550(u8 taskId);
+
+// gMenuCallbacks
+bool8 sub_809FE28(void);
+bool8 sub_809FE44(void);
+bool8 sub_809FED4(void);
// EWRAM vars
EWRAM_DATA u8 sSafariBallsWindowId = 0;
@@ -65,8 +168,8 @@ EWRAM_DATA u8 sCurrentStartMenuActions[9] = {0};
EWRAM_DATA u8 gUnknown_02037619[2] = {0};
EWRAM_DATA bool8 (*gUnknown_0203761C)(void) = NULL;
EWRAM_DATA u8 gUnknown_02037620 = 0;
-EWRAM_DATA u8 gUnknown_02037621 = 0;
-EWRAM_DATA u8 gUnknown_02037622 = 0;
+EWRAM_DATA bool8 gUnknown_02037621 = FALSE;
+EWRAM_DATA u8 gSaveInfoWindowId = 0;
// const rom data
static const struct WindowTemplate gSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8};
@@ -122,7 +225,7 @@ const struct WindowTemplate gUnknown_085105AC[] =
DUMMY_WIN_TEMPLATE
};
-const struct WindowTemplate gUnknown_085105BC = {0, 1, 1, 0xE, 0xA, 0xF, 8};
+const struct WindowTemplate gSaveInfoWindowTemplate = {0, 1, 1, 0xE, 0xA, 0xF, 8};
// code
void SetDexPokemonPokenavFlags(void) // unused
@@ -273,33 +376,1014 @@ void RemoveExtraStartMenuWindows(void)
}
}
-/*
-// Prints n menu items starting at *index
-static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n)
+bool32 PrintStartMenuActions(s8 *pIndex, u32 count)
{
- s8 _index = *index;
-
+ s8 index = *pIndex;
+
do
{
- if (sStartMenuItems[sCurrentStartMenuActions[_index]].func.u8_void == StartMenu_PlayerName)
+ if (sStartMenuItems[sCurrentStartMenuActions[index]].func.u8_void == StartMenu_PlayerName) {
+ PrintPlayerNameOnWindow(GetStartMenuWindowId(), sStartMenuItems[sCurrentStartMenuActions[index]].text, 8, (index << 4) + 9);
+ }
+ else {
+ StringExpandPlaceholders(gStringVar4, sStartMenuItems[sCurrentStartMenuActions[index]].text);
+ PrintTextOnWindow(GetStartMenuWindowId(), 1, gStringVar4, 8, (index << 4) + 9, 0xFF, 0);
+ }
+
+ index++;
+ if (index >= sNumStartMenuActions) {
+ *pIndex = index;
+ return TRUE;
+ }
+
+ count--;
+ }
+ while (count != 0);
+
+ *pIndex = index;
+ return FALSE;
+}
+
+bool32 sub_809F894(void)
+{
+ s8 value = gUnknown_02037619[0];
+ switch (value)
+ {
+ case 0:
+ gUnknown_02037619[0]++;
+ break;
+ case 1:
+ BuildStartMenuActions();
+ gUnknown_02037619[0]++;
+ break;
+ case 2:
+ sub_81973A4();
+ NewMenuHelpers_DrawStdWindowFrame(sub_81979C4(sNumStartMenuActions), FALSE);
+ gUnknown_02037619[1] = 0;
+ gUnknown_02037619[0]++;
+ break;
+ case 3:
+ if (GetSafariZoneFlag() != FALSE)
{
+ DisplaySafariBallsWindow();
+ }
+ if (InBattlePyramid() != FALSE)
+ {
+ DisplayPyramidFloorWindow();
+ }
+ gUnknown_02037619[0]++;
+ break;
+ case 4:
+ if (PrintStartMenuActions(&gUnknown_02037619[1], 2) == FALSE)
+ {
+ break;
+ }
+ gUnknown_02037619[0]++;
+ break;
+ case 5:
+ sStartMenuCursorPos = sub_81983AC(GetStartMenuWindowId(), 1, 0, 9, 16, sNumStartMenuActions, sStartMenuCursorPos);
+ CopyWindowToVram(GetStartMenuWindowId(), TRUE);
+ return TRUE;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+void InitStartMenu(void)
+{
+ gUnknown_02037619[0] = 0;
+ gUnknown_02037619[1] = 0;
+ while (!sub_809F894());
+}
+
+void task50_startmenu(u8 taskId)
+{
+ if (sub_809F894() == TRUE)
+ {
+ SwitchTaskToFollowupFunc(taskId);
+ }
+}
+
+void sub_809F9D0(TaskFunc followupFunc)
+{
+ gUnknown_02037619[0] = 0;
+ gUnknown_02037619[1] = 0;
+ SetTaskFuncWithFollowupFunc(CreateTask(&task50_startmenu, 0x50), &task50_startmenu, followupFunc);
+}
+
+bool8 sub_809FA00(void)
+{
+ if (sub_809F894() == FALSE)
+ {
+ return FALSE;
+ }
+
+ sub_80AF688();
+ return TRUE;
+}
+
+void sub_809FA18(void)
+{
+ gUnknown_02037619[0] = 0;
+ gUnknown_02037619[1] = 0;
+ gUnknown_03005DB0 = &sub_809FA00;
+}
+void sub_809FA34(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch(task->data[0])
+ {
+ case 0:
+ if (InUnionRoom() == TRUE)
+ {
+ var_800D_set_xB();
}
- else
+
+ gMenuCallback = HandleStartMenuInput;
+ task->data[0]++;
+ break;
+ case 1:
+ if (gMenuCallback() == TRUE)
{
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_809FA9C(void)
+{
+ if (!is_c1_link_related_active())
+ {
+ FreezeMapObjects();
+ sub_808B864();
+ sub_808BCF4();
+ }
+ sub_809F9D0(sub_809FA34);
+ ScriptContext2_Enable();
+}
+bool8 HandleStartMenuInput(void) // TODO callback
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(5);
+ sStartMenuCursorPos = MoveMenuCursor(-1);
+ }
+
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(5);
+ sStartMenuCursorPos = MoveMenuCursor(1);
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(5);
+ if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void == StartMenu_Pokedex)
+ {
+ if (GetNationalPokedexCount(0) == FALSE) {
+ return FALSE;
+ }
+ }
+
+ gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void;
+
+ if (gMenuCallback != StartMenu_Save
+ && gMenuCallback != StartMenu_Exit
+ && gMenuCallback != StartMenu_SafariZoneRetire
+ && gMenuCallback != StartMenu_BattlePyramidRetire)
+ {
+ FadeScreen(1, 0);
}
+
+ return FALSE;
+ }
+
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
+ {
+ RemoveExtraStartMenuWindows();
+ sub_80A0934();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_Pokedex(void)
+{
+ if (!gPaletteFade.active)
+ {
+ IncrementGameStat(GAME_STAT_CHECKED_POKEDEX);
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(sub_80BB534);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
- } while (++_index > sNumStartMenuActions);
+static bool8 StartMenu_Pokemon(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_PartyMenuFromStartMenu);
+
+ return TRUE;
+ }
- if (--n == 0)
+ return FALSE;
+}
+
+static bool8 StartMenu_Bag(void)
+{
+ if (!gPaletteFade.active)
{
- *index = _index;
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_BagMenuFromStartMenu);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_PokeNav(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_PokeNav);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_PlayerName(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+
+ if (is_c1_link_related_active() || InUnionRoom())
+ {
+ sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu);
+ }
+ else if (FlagGet(FLAG_SYS_FRONTIER_PASS))
+ {
+ sub_80C51C4(CB2_ReturnToFieldWithOpenMenu);
+ }
+ else
+ {
+ sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu);
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_Save(void)
+{
+ if (InBattlePyramid())
+ {
+ RemoveExtraStartMenuWindows();
+ }
+
+ gMenuCallback = sub_809FE28;
+
+ return FALSE;
+}
+
+static bool8 StartMenu_Option(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_InitOptionMenu);
+ gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_Exit(void)
+{
+ RemoveExtraStartMenuWindows();
+ sub_80A0934();
+
+ return TRUE;
+}
+
+static bool8 StartMenu_SafariZoneRetire(void)
+{
+ RemoveExtraStartMenuWindows();
+ sub_80A0934();
+ SafariZoneRetirePrompt();
+
+ return TRUE;
+}
+
+static bool8 StartMenu_LinkModePlayerName(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ overworld_free_bg_tilemaps();
+ sub_80C4E74(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenu_BattlePyramidRetire(void)
+{
+ gMenuCallback = sub_809FE9C;
+
+ return FALSE;
+}
+
+void sub_809FDD4(void)
+{
+ sub_8197DF8(0, 0);
+ sub_80984F4();
+ sub_809F9D0(sub_809FA34);
+ ScriptContext2_Enable();
+}
+
+static bool8 StartMenu_BattlePyramidBag(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(sub_81C4EFC);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_809FE28(void)
+{
+ sub_809FF28();
+ gMenuCallback = sub_809FE44;
+
+ return FALSE;
+}
+
+bool8 sub_809FE44(void)
+{
+ switch (sub_809FF4C())
+ {
+ case SAVE_IN_PROGRESS:
return FALSE;
+ case SAVE_CANCELED:
+ sub_8197DF8(0, 0);
+ InitStartMenu();
+ gMenuCallback = HandleStartMenuInput;
+ return FALSE;
+ case SAVE_SUCCESS:
+ case SAVE_ERROR:
+ sub_8197DF8(0, 1);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ sub_81A9EC8();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_809FE9C(void)
+{
+ sub_80A0340();
+ gMenuCallback = sub_809FED4;
+
+ return FALSE;
+}
+
+bool8 sub_809FEB8(void)
+{
+ InitStartMenu();
+ gMenuCallback = HandleStartMenuInput;
+
+ return FALSE;
+}
+
+bool8 sub_809FED4(void)
+{
+ switch (sub_809FF4C())
+ {
+ case SAVE_SUCCESS:
+ RemoveExtraStartMenuWindows();
+ gMenuCallback = sub_809FEB8;
+ return FALSE;
+ case SAVE_IN_PROGRESS:
+ return FALSE;
+ case SAVE_CANCELED:
+ sub_8197DF8(0, 1);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ ScriptContext1_SetupScript(BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_809FF28(void)
+{
+ save_serialize_map();
+ gUnknown_0203761C = sub_80A00A0;
+ gUnknown_02037621 = FALSE;
+}
+
+u8 sub_809FF4C(void)
+{
+ if (sub_8197224() == TRUE)
+ {
+ return FALSE;
+ }
+
+ gUnknown_02037621 = FALSE;
+ return gUnknown_0203761C();
+}
+
+void sub_809FF80(void)
+{
+ sub_809FF28();
+ CreateTask(task50_save_game, 0x50);
+}
+
+// DisplaySaveMessageWithCallback
+void sub_809FF98(const u8 *message, u8 (*func)(void))
+{
+ StringExpandPlaceholders(gStringVar4, message);
+ sub_819786C(0, TRUE);
+ AddTextPrinterForMessage_2(TRUE);
+ gUnknown_02037621 = TRUE;
+ gUnknown_0203761C = func;
+}
+
+static void task50_save_game(u8 taskId)
+{
+ u8 status = sub_809FF4C();
+
+ switch (status)
+ {
+ case SAVE_CANCELED:
+ case SAVE_ERROR:
+ gSpecialVar_Result = 0;
+ break;
+ case SAVE_SUCCESS:
+ gSpecialVar_Result = status;
+ break;
+ case SAVE_IN_PROGRESS:
+ return;
+ }
+
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void sub_80A0014(void)
+{
+ sub_8197434(0, TRUE);
+}
+
+void sub_80A0024(void)
+{
+ sub_80A0888();
+}
+
+void sub_80A0030(void)
+{
+ gUnknown_02037620 = 60;
+}
+
+bool8 sub_80A003C(void)
+{
+ gUnknown_02037620--;
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ PlaySE(5);
+ return TRUE;
+ }
+ else if (gUnknown_02037620 == 0)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_80A0070(void)
+{
+ if (gUnknown_02037620 != 0)
+ {
+ gUnknown_02037620--;
+ }
+ else if (gMain.heldKeys & A_BUTTON)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_80A00A0(void) // Return u8? Ruby
+{
+ sub_819746C(GetStartMenuWindowId(), FALSE);
+ remove_start_menu_window_maybe();
+ sub_80A06B4();
+
+ if (InBattlePyramid())
+ {
+ sub_809FF98(BattleFrontier_BattlePyramidEmptySquare_Text_252CA7, sub_80A00EC);
+ }
+ else
+ {
+ sub_809FF98(gUnknown_082C87B4, sub_80A00EC);
+ }
+
+ return FALSE; // SAVE_IN_PROGRESS ?
+}
+
+bool8 sub_80A00EC(void)
+{
+ sub_8197930();
+ gUnknown_0203761C = sub_80A0108;
+ return FALSE;
+}
+
+u8 sub_80A0108(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ switch (gSaveFileStatus)
+ {
+ case 0:
+ case 2:
+ if (gDifferentSaveFile == FALSE)
+ {
+ gUnknown_0203761C = sub_80A017C;
+ return SAVE_IN_PROGRESS;
+ }
+
+ gUnknown_0203761C = sub_80A0234;
+ return SAVE_IN_PROGRESS;
+ default:
+ gUnknown_0203761C = sub_80A017C;
+ return SAVE_IN_PROGRESS;
+ }
+ case -1: // B Button
+ case 1: // No
+ sub_80A0024();
+ sub_80A0014();
+ return SAVE_CANCELED;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+// A different save file exists
+u8 sub_80A017C(void)
+{
+ if (gDifferentSaveFile == TRUE)
+ {
+ sub_809FF98(gUnknown_082C8845, sub_80A01B4);
+ }
+ else
+ {
+ sub_809FF98(gUnknown_082C87D5, sub_80A01D0);
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A01B4(void)
+{
+ sub_8197948(1);
+ gUnknown_0203761C = sub_80A01EC;
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A01D0(void)
+{
+ sub_8197930();
+ gUnknown_0203761C = sub_80A01EC;
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A01EC(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ gUnknown_0203761C = sub_80A0234;
+ return SAVE_IN_PROGRESS;
+ case -1: // B Button
+ case 1: // No
+ sub_80A0024();
+ sub_80A0014();
+ return SAVE_CANCELED;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A0234(void)
+{
+ sub_809FF98(gUnknown_082C8810, sub_80A024C);
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A024C(void)
+{
+ u8 saveStatus;
+
+ IncrementGameStat(GAME_STAT_SAVED_GAME);
+ sub_81A9E90();
+
+ if (gDifferentSaveFile == TRUE)
+ {
+ saveStatus = TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE);
+ gDifferentSaveFile = FALSE;
+ }
+ else
+ {
+ saveStatus = TrySavingData(SAVE_NORMAL);
+ }
+
+ if (saveStatus == 1) // Save succeded
+ {
+ sub_809FF98(gUnknown_082C8832, sub_80A02B0);
+ }
+ else // Save error
+ {
+ sub_809FF98(gUnknown_082C892A, sub_80A02FC);
+ }
+
+ sub_80A0030();
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A02B0(void)
+{
+ if (!IsTextPrinterActive(0))
+ {
+ PlaySE(0x37); // 55
+ gUnknown_0203761C = sub_80A02D8;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A02D8(void)
+{
+ if (!IsSEPlaying() && sub_80A003C())
+ {
+ sub_80A0024();
+ return SAVE_SUCCESS;
+ }
+ else
+ {
+ return SAVE_IN_PROGRESS;
+ }
+}
+
+u8 sub_80A02FC(void)
+{
+ if (!IsTextPrinterActive(0))
+ {
+ PlaySE(0x16); // 22
+ gUnknown_0203761C = sub_80A0324;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A0324(void)
+{
+ if (!sub_80A0070())
+ {
+ return SAVE_IN_PROGRESS;
}
else
{
- *index = _index;
+ sub_80A0024();
+ return SAVE_ERROR;
+ }
+}
+
+void sub_80A0340(void)
+{
+ gUnknown_0203761C = sub_80A035C;
+ gUnknown_02037621 = FALSE;
+}
+
+u8 sub_80A035C(void)
+{
+ sub_819746C(GetStartMenuWindowId(), FALSE);
+ remove_start_menu_window_maybe();
+ sub_809FF98(BattleFrontier_BattlePyramidEmptySquare_Text_252CFB, sub_80A0388);
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A0388(void)
+{
+ sub_8197948(1);
+ gUnknown_0203761C = sub_80A03A4;
+
+ return SAVE_IN_PROGRESS;
+}
+
+u8 sub_80A03A4(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ return SAVE_CANCELED;
+ case -1: // B Button
+ case 1: // No
+ sub_80A0014();
+ return SAVE_SUCCESS;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+void sub_80A03D8(void)
+{
+ TransferPlttBuffer();
+}
+
+bool32 sub_80A03E4(u8 *par1)
+{
+ switch (*par1)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
+ SetVBlankCallback(NULL);
+ ScanlineEffect_Stop();
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
+ break;
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ ResetPaletteFade();
+ ScanlineEffect_Clear();
+ break;
+ case 2:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_085105A8, ARRAY_COUNT(gUnknown_085105A8));
+ InitWindows(gUnknown_085105AC);
+ box_border_load_tiles_and_pal(0, 8, 224);
+ sub_81978B0(240);
+ break;
+ case 3:
+ ShowBg(0);
+ BlendPalettes(-1, 16, 0);
+ SetVBlankCallback(sub_80A03D8);
+ EnableInterrupts(1);
+ break;
+ case 4:
return TRUE;
}
-}*/
+
+ (*par1)++;
+ return FALSE;
+}
+
+void sub_80A0514(void)
+{
+ if (sub_80A03E4(&gMain.state))
+ {
+ CreateTask(&sub_80A0550, 0x50);
+ SetMainCallback2(sub_80A0540);
+ }
+}
+
+void sub_80A0540(void)
+{
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+void sub_80A0550(u8 taskId)
+{
+ s16 *step = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ switch (*step)
+ {
+ case 0:
+ FillWindowPixelBuffer(0, 17);
+ AddTextPrinterParameterized(0,
+ 1,
+ gText_SavingDontTurnOffPower,
+ 255,
+ NULL,
+ 2,
+ 1,
+ 3);
+ sub_8098858(0, 8, 14);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+
+ if (gWirelessCommType != 0 && InUnionRoom())
+ {
+ if (sub_800A07C())
+ {
+ *step = 1;
+ }
+ else
+ {
+ *step = 5;
+ }
+ }
+ else
+ {
+ gSoftResetDisabled = 1;
+ *step = 1;
+ }
+ break;
+ case 1:
+ sub_8076D5C();
+ sub_8153430();
+ *step = 2;
+ break;
+ case 2:
+ if (sub_8153474())
+ {
+ sav2_gender2_inplace_and_xFE();
+ *step = 3;
+ gSoftResetDisabled = 0;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ *step = 4;
+ break;
+ case 4:
+ FreeAllWindowBuffers();
+ SetMainCallback2(gMain.savedCallback);
+ DestroyTask(taskId);
+ break;
+ case 5:
+ CreateTask(&sub_8153688, 0x5);
+ *step = 6;
+ break;
+ case 6:
+ if (!FuncIsActiveTask(&sub_8153688))
+ {
+ *step = 3;
+ }
+ break;
+ }
+ }
+}
+
+void sub_80A06B4(void)
+{
+ struct WindowTemplate saveInfoWindow = gSaveInfoWindowTemplate;
+ u8 gender;
+ u8 color;
+ u32 xOffset;
+ u32 yOffset;
+
+ if (!FlagGet(FLAG_SYS_POKEDEX_GET))
+ {
+ saveInfoWindow.height -= 2;
+ }
+
+ gSaveInfoWindowId = AddWindow(&saveInfoWindow);
+ NewMenuHelpers_DrawStdWindowFrame(gSaveInfoWindowId, 0);
+
+ gender = gSaveBlock2Ptr->playerGender;
+ color = TEXT_COLOR_RED; // Red when gender is female, blue when male.
+
+ if (gender == MALE)
+ {
+ color = TEXT_COLOR_BLUE;
+ }
+
+ // Print region name
+ yOffset = 1;
+ sub_819A344(3, gStringVar4, TEXT_COLOR_GREEN);
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gStringVar4, 0, yOffset, 0xFF, NULL);
+
+ // Print player name
+ yOffset = 0x11;
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gText_SavingPlayer, 0, yOffset, 0xFF, NULL);
+ sub_819A344(0, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintPlayerNameOnWindow(gSaveInfoWindowId, gStringVar4, xOffset, yOffset);
+
+ // Print badge count
+ yOffset = 0x21;
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gText_SavingBadges, 0, yOffset, 0xFF, NULL);
+ sub_819A344(4, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+
+ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
+ {
+
+ // Print pokedex count
+ yOffset = 0x31;
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gText_SavingPokedex, 0, yOffset, 0xFF, NULL);
+ sub_819A344(1, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+ }
+
+ // Print play time
+ yOffset += 0x10;
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gText_SavingTime, 0, yOffset, 0xFF, NULL);
+ sub_819A344(2, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(gSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+
+ CopyWindowToVram(gSaveInfoWindowId, 2);
+}
+
+void sub_80A0888(void)
+{
+ sub_819746C(gSaveInfoWindowId, FALSE);
+ RemoveWindow(gSaveInfoWindowId);
+}
+
+void sub_80A08A4(u8 taskId)
+{
+ if (!FuncIsActiveTask(sub_8153688))
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+void sub_80A08CC(void)
+{
+ u32 taskId1;
+ u32 taskId2;
+
+ taskId1 = CreateTask(&sub_8153688, 0x5);
+ gTasks[taskId1].data[2] = 1;
+
+ taskId2 = CreateTask(&sub_80A08A4, 0x6);
+ gTasks[taskId2].data[1] = taskId1;
+}
+
+void sub_80A0914(void)
+{
+ sub_819746C(GetStartMenuWindowId(), TRUE);
+ remove_start_menu_window_maybe();
+ sub_80984F4();
+ ScriptContext2_Disable();
+}
+
+void sub_80A0934(void)
+{
+ PlaySE(5);
+ sub_80A0914();
+}
+
+void AppendToList(u8 *list, u8 *pos, u8 newEntry)
+{
+ list[*pos] = newEntry;
+ (*pos)++;
+} \ No newline at end of file