diff options
Diffstat (limited to 'src/start_menu.c')
-rw-r--r-- | src/start_menu.c | 1152 |
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 |