diff options
Diffstat (limited to 'src/field/start_menu.c')
-rw-r--r-- | src/field/start_menu.c | 833 |
1 files changed, 0 insertions, 833 deletions
diff --git a/src/field/start_menu.c b/src/field/start_menu.c deleted file mode 100644 index 381c19bb7..000000000 --- a/src/field/start_menu.c +++ /dev/null @@ -1,833 +0,0 @@ -#include "global.h" -#include "start_menu.h" -#include "event_data.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item_menu.h" -#include "load_save.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "option_menu.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon_menu.h" -#include "pokenav.h" -#include "overworld.h" -#include "safari_zone.h" -#include "save.h" -#include "save_menu_util.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "trainer_card.h" -#include "scanline_effect.h" - -//Menu actions -enum { - MENU_ACTION_POKEDEX, - MENU_ACTION_POKEMON, - MENU_ACTION_BAG, - MENU_ACTION_POKENAV, - MENU_ACTION_PLAYER, - MENU_ACTION_SAVE, - MENU_ACTION_OPTION, - MENU_ACTION_EXIT, - MENU_ACTION_RETIRE, - MENU_ACTION_PLAYER_LINK -}; - -static u8 (*saveDialogCallback)(void); -static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed -static bool8 savingComplete; - -extern bool8 gDifferentSaveFile; -extern u16 gSaveFileStatus; -extern u16 gSpecialVar_Result; - -extern u8 gUnknown_03004860; - -u8 (*gMenuCallback)(void); - -EWRAM_DATA static u8 sStartMenuCursorPos = 0; -EWRAM_DATA static u8 sNumStartMenuActions = 0; -EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0}; - -//Text strings -extern u8 gSaveText_PlayerSavedTheGame[]; -extern u8 gSaveText_DontTurnOff[]; -extern u8 gSaveText_ThereIsAlreadyAFile[]; -extern u8 gSaveText_ThereIsADifferentFile[]; -extern u8 gSaveText_WouldYouLikeToSave[]; - -static u8 StartMenu_PokedexCallback(void); -static u8 StartMenu_PokemonCallback(void); -static u8 StartMenu_BagCallback(void); -static u8 StartMenu_PokenavCallback(void); -static u8 StartMenu_PlayerCallback(void); -static u8 StartMenu_SaveCallback(void); -static u8 StartMenu_OptionCallback(void); -static u8 StartMenu_ExitCallback(void); -static u8 StartMenu_RetireCallback(void); -static u8 StartMenu_PlayerLinkCallback(void); - -static const struct MenuAction sStartMenuItems[] = -{ - { SystemText_Pokedex, StartMenu_PokedexCallback }, - { SystemText_Pokemon, StartMenu_PokemonCallback }, - { SystemText_BAG, StartMenu_BagCallback }, - { SystemText_Pokenav, StartMenu_PokenavCallback }, - { SystemText_Player, StartMenu_PlayerCallback }, - { SystemText_Save, StartMenu_SaveCallback }, - { SystemText_Option, StartMenu_OptionCallback }, - { SystemText_Exit, StartMenu_ExitCallback }, - { SystemText_Retire, StartMenu_RetireCallback }, - { SystemText_Player, StartMenu_PlayerLinkCallback }, -}; - -//Private functions -static void BuildStartMenuActions(void); -static void AddStartMenuAction(u8 action); -static void BuildStartMenuActions_Normal(void); -static void BuildStartMenuActions_SafariZone(void); -static void BuildStartMenuActions_Link(void); -static void DisplaySafariBallsWindow(void); -static bool32 PrintStartMenuItemsMultistep(s16 *a, u32 b); -static bool32 InitStartMenuMultistep(s16 *a, s16 *b); -static void Task_StartMenu(u8 taskId); -static u8 StartMenu_InputProcessCallback(void); -static u8 SaveCallback1(void); -static u8 SaveCallback2(void); -static void sub_807160C(void); -static u8 RunSaveDialogCallback(void); -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)); -static void Task_SaveDialog(u8 taskId); -static void sub_8071700(void); -static void HideSaveDialog(void); -static void SaveDialogStartTimeout(void); -static u8 SaveDialogCheckForTimeoutOrKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCB_DisplayConfirmMessage(void); -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void); -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void); -static u8 SaveDialogCB_SaveFileExists(void); -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void); -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void); -static u8 SaveDialogCB_DisplaySavingMessage(void); -static u8 SaveDialogCB_DoSave(void); -static u8 SaveDialogCB_SaveSuccess(void); -static u8 SaveDialogCB_ReturnSuccess(void); -static u8 SaveDialogCB_SaveError(void); -static u8 SaveDialogCB_ReturnError(void); -static void sub_80719F0(void); -static bool32 sub_80719FC(u8 *ptr); -static void sub_8071B54(void); -static void Task_8071B64(u8 taskId); - - -static void BuildStartMenuActions(void) -{ - sNumStartMenuActions = 0; - if (is_c1_link_related_active() == TRUE) - BuildStartMenuActions_Link(); - else - { - if (GetSafariZoneFlag() == TRUE) - BuildStartMenuActions_SafariZone(); - else - BuildStartMenuActions_Normal(); - } -} - -static void AddStartMenuAction(u8 action) -{ - AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); -} - -static void BuildStartMenuActions_Normal(void) -{ - if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEDEX); - if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_SAVE); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_SafariZone(void) -{ - AddStartMenuAction(MENU_ACTION_RETIRE); - AddStartMenuAction(MENU_ACTION_POKEDEX); - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_Link(void) -{ - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER_LINK); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -//Show number of safari balls left -static void DisplaySafariBallsWindow(void) -{ - sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); - Menu_DrawStdWindowFrame(0, 0, 10, 5); - Menu_PrintText(gOtherText_SafariStock, 1, 1); -} - -//Prints n menu items starting at *index -static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) -{ - int _index = *index; - - do - { - Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); - _index++; - if (_index >= sNumStartMenuActions) - { - *index = _index; - return TRUE; - } - } - while (--n != 0); - *index = _index; - return FALSE; -} - -static bool32 InitStartMenuMultistep(s16 *step, s16 *index) -{ - switch (*step) - { - case 1: - BuildStartMenuActions(); - (*step)++; - break; - case 2: - Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3); - *index = 0; - (*step)++; - break; - case 3: - if (GetSafariZoneFlag()) - DisplaySafariBallsWindow(); - (*step)++; - break; - case 4: - if (PrintStartMenuItemsMultistep(index, 2)) - (*step)++; - break; - case 0: - (*step)++; - break; - case 5: - sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6); - return TRUE; - } - return FALSE; -} - -static void InitStartMenu(void) -{ - s16 step = 0; - s16 index = 0; - - while (InitStartMenuMultistep(&step, &index) == FALSE) - ; -} - -static void Task_StartMenu(u8 taskId) -{ - if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE) - { - *gTasks[taskId].data = 0; - SwitchTaskToFollowupFunc(taskId); - } -} - -void CreateStartMenuTask(void (*func)(u8)) -{ - u8 taskId; - - InitMenuWindow(&gWindowTemplate_81E6CE4); - taskId = CreateTask(Task_StartMenu, 0x50); - SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); -} - -void sub_80712B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - gMenuCallback = StartMenu_InputProcessCallback; - task->data[0]++; - break; - case 1: - if (gMenuCallback() == 1) - DestroyTask(taskId); - break; - } -} - -void sub_8071310(void) -{ - if (!is_c1_link_related_active()) - { - FreezeMapObjects(); - sub_80594C0(); - sub_80597F4(); - } - CreateStartMenuTask(sub_80712B4); - ScriptContext2_Enable(); -} - -static u8 StartMenu_InputProcessCallback(void) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = Menu_MoveCursor(-1); - } - if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = Menu_MoveCursor(1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback) - { - if (GetNationalPokedexCount(0) == 0) - return 0; - } - gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; - if (gMenuCallback != StartMenu_SaveCallback && - gMenuCallback != StartMenu_ExitCallback && - gMenuCallback != StartMenu_RetireCallback) - FadeScreen(1, 0); - return 0; - } - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - CloseMenu(); - return 1; - } - return 0; -} - -//When player selects POKEDEX -static u8 StartMenu_PokedexCallback(void) -{ - if (!gPaletteFade.active) - { - IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitPokedex); - return 1; - } - return 0; -} - -//When player selects POKEMON -static u8 StartMenu_PokemonCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_8089A70); - return 1; - } - return 0; -} - -//When player selects BAG -static u8 StartMenu_BagCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80A53F8); - return 1; - } - return 0; -} - -//When player selects POKENAV -static u8 StartMenu_PokenavCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80EBA5C); - return 1; - } - return 0; -} - -//When player selects his/her name -static u8 StartMenu_PlayerCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - TrainerCard_ShowPlayerCard(sub_805469C); - return 1; - } - return 0; -} - -//When player selects SAVE -static u8 StartMenu_SaveCallback(void) -{ - Menu_DestroyCursor(); - gMenuCallback = SaveCallback1; - return 0; -} - -//When player selects OPTION -static u8 StartMenu_OptionCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitOptionMenu); - gMain.savedCallback = sub_805469C; - return 1; - } - return 0; -} - -//When player selects EXIT -static u8 StartMenu_ExitCallback(void) -{ - CloseMenu(); - return 1; -} - -//When player selects RETIRE -static u8 StartMenu_RetireCallback(void) -{ - CloseMenu(); - SafariZoneRetirePrompt(); - return 1; -} - -//When player selects their name in multiplayer mode -static u8 StartMenu_PlayerLinkCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C); - return 1; - } - return 0; -} - -//Save dialog status -enum -{ - SAVE_IN_PROGRESS, - SAVE_SUCCESS, - SAVE_CANCELED, - SAVE_ERROR, -}; - -static u8 SaveCallback1(void) -{ - sub_807160C(); - gMenuCallback = SaveCallback2; - return FALSE; -} - -static u8 SaveCallback2(void) -{ - switch (RunSaveDialogCallback()) - { - case SAVE_IN_PROGRESS: - return FALSE; - case SAVE_CANCELED: - //Go back to start menu - Menu_EraseScreen(); - InitStartMenu(); - gMenuCallback = StartMenu_InputProcessCallback; - return FALSE; - case SAVE_SUCCESS: - case SAVE_ERROR: - Menu_EraseScreen(); - sub_8064E2C(); - ScriptContext2_Disable(); - return TRUE; - } - return FALSE; -} - -static void sub_807160C(void) -{ - save_serialize_map(); - saveDialogCallback = SaveDialogCB_DisplayConfirmMessage; - savingComplete = FALSE; -} - -static u8 RunSaveDialogCallback(void) -{ - if (savingComplete) - { - if (!Menu_UpdateWindowText()) - return 0; - } - savingComplete = FALSE; - return saveDialogCallback(); -} - -void ScrSpecial_DoSaveDialog(void) -{ - sub_807160C(); - CreateTask(Task_SaveDialog, 0x50); -} - -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) -{ - StringExpandPlaceholders(gStringVar4, ptr); - Menu_DisplayDialogueFrame(); - MenuPrintMessageDefaultCoords(gStringVar4); - savingComplete = TRUE; - saveDialogCallback = func; -} - -static void Task_SaveDialog(u8 taskId) -{ - u8 status = RunSaveDialogCallback(); - - 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(); -} - -static void sub_8071700(void) -{ - HandleCloseSaveWindow(0, 0); -} - -static void HideSaveDialog(void) -{ - Menu_EraseWindowRect(20, 8, 26, 13); -} - -static void SaveDialogStartTimeout(void) -{ - saveDialogTimer = 60; -} - -static bool8 SaveDialogCheckForTimeoutOrKeypress(void) -{ - saveDialogTimer--; - if (gMain.heldKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - return TRUE; - } - else if (saveDialogTimer == 0) - return TRUE; - return FALSE; -} - -static bool8 SaveDialogCheckForTimeoutAndKeypress(void) -{ - if (saveDialogTimer != 0) - saveDialogTimer--; - else if (gMain.heldKeys & A_BUTTON) - return TRUE; - return FALSE; -} - -static u8 SaveDialogCB_DisplayConfirmMessage(void) -{ - Menu_EraseScreen(); - HandleDrawSaveWindowInfo(0, 0); - DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessConfirmYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - switch (gSaveFileStatus) - { - case 0: - case 2: - if (gDifferentSaveFile == FALSE) - { - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - return SAVE_IN_PROGRESS; - default: - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveFileExists(void) -{ - DisplaySaveMessageWithCallback( - gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile, - SaveDialogCB_DisplayOverwriteYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessOverwriteYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplaySavingMessage(void) -{ - //"SAVING... DON'T TURN OFF THE POWER." - DisplaySaveMessageWithCallback(gSaveText_DontTurnOff, SaveDialogCB_DoSave); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DoSave(void) -{ - u8 saveStatus; - - IncrementGameStat(GAME_STAT_SAVED_GAME); - if (gDifferentSaveFile == TRUE) - { - saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE); - gDifferentSaveFile = FALSE; - } - else - { - saveStatus = Save_WriteData(SAVE_NORMAL); - } - - if (saveStatus == SAVE_STATUS_OK) - { - //"(Player) saved the game." - DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); - } - else - { - //"Save error. Please exchange the backup memory." - DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError); - } - - SaveDialogStartTimeout(); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveSuccess(void) -{ - if (Menu_UpdateWindowText()) - { - PlaySE(SE_SAVE); - saveDialogCallback = SaveDialogCB_ReturnSuccess; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnSuccess(void) -{ - if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress()) - { - sub_8071700(); - return SAVE_SUCCESS; - } - else - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveError(void) -{ - if (Menu_UpdateWindowText()) - { - PlaySE(SE_BOO); - saveDialogCallback = SaveDialogCB_ReturnError; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnError(void) -{ - if (!SaveDialogCheckForTimeoutAndKeypress()) - return SAVE_IN_PROGRESS; - else - { - sub_8071700(); - return SAVE_ERROR; - } -} - -static void sub_80719F0(void) -{ - TransferPlttBuffer(); -} - -static bool32 sub_80719FC(u8 *step) -{ - switch (*step) - { - case 0: - REG_DISPCNT = 0; - SetVBlankCallback(NULL); - ScanlineEffect_Stop(); - DmaClear16(3, PLTT, PLTT_SIZE); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); - break; - case 1: - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - ScanlineEffect_Clear(); - break; - case 2: - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; - break; - case 3: - { - u32 savedIme; - - BlendPalettes(-1, 0x10, 0); - SetVBlankCallback(sub_80719F0); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - break; - } - case 4: - return TRUE; - } - (*step)++; - return FALSE; -} - -void sub_8071B28(void) -{ - if (sub_80719FC(&gMain.state)) - { - CreateTask(Task_8071B64, 0x50); - SetMainCallback2(sub_8071B54); - } -} - -static void sub_8071B54(void) -{ - RunTasks(); - UpdatePaletteFade(); -} - -static void Task_8071B64(u8 taskId) -{ - s16 *step = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - switch (*step) - { - case 0: - Menu_DisplayDialogueFrame(); - Menu_PrintText(gSystemText_Saving, 2, 15); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - (*step)++; - break; - case 1: - SetSecretBase2Field_9_AndHideBG(); - sub_8125E2C(); - (*step)++; - break; - case 2: - if (!sub_8125E6C()) - break; - ClearSecretBase2Field_9_2(); - (*step)++; - break; - case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - (*step)++; - break; - case 4: - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskId); - break; - } - } -} |