diff --git a/include/applications/bag/application.h b/include/applications/bag/application.h index 61089907ad..cd299100fd 100644 --- a/include/applications/bag/application.h +++ b/include/applications/bag/application.h @@ -14,7 +14,7 @@ enum BagApplicationMode { enum BagApplicationExitCode { BAG_EXIT_CODE_USE_ITEM = 0, - BAG_EXIT_CODE_SHOW_BERRY_DATA, + BAG_EXIT_CODE_CHECK_BERRY_TAG, BAG_EXIT_CODE_GIVE_ITEM, BAG_EXIT_CODE_POFFIN_BERRY_CHOSEN, BAG_EXIT_CODE_GIVE_FROM_MON_MENU, diff --git a/include/applications/party_menu/defs.h b/include/applications/party_menu/defs.h index f820139364..0b6c941b04 100644 --- a/include/applications/party_menu/defs.h +++ b/include/applications/party_menu/defs.h @@ -75,8 +75,8 @@ enum PartyMenuExitCodes { PARTY_MENU_EXIT_CODE_SUMMARY, PARTY_MENU_EXIT_CODE_2, PARTY_MENU_EXIT_CODE_GIVE_ITEM, - PARTY_MENU_EXIT_CODE_LEARNED_MOVE, - PARTY_MENU_EXIT_CODE_FORGET_MOVE, + PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_TM_HM, + PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_LEVEL_UP, PARTY_MENU_EXIT_CODE_MAIL, PARTY_MENU_EXIT_CODE_READ_MAIL, PARTY_MENU_EXIT_CODE_EVOLVE_BY_ITEM, @@ -225,7 +225,7 @@ typedef struct PartyMenu { u8 minSelectionSlots : 4; u8 maxSelectionSlots : 4; u8 reqLevel; - int unk_34; + int levelUpMoveIndex; u16 evoTargetSpecies; u8 padding_3A[2]; int evoType; diff --git a/include/constants/heap.h b/include/constants/heap.h index 573e6e16b5..3d7b57c30f 100644 --- a/include/constants/heap.h +++ b/include/constants/heap.h @@ -75,7 +75,7 @@ enum HeapID { HEAP_ID_70, HEAP_ID_71, HEAP_ID_BOAT_CUTSCENE, - HEAP_ID_73, + HEAP_ID_EVOLUTION, HEAP_ID_74, HEAP_ID_75, HEAP_ID_76, @@ -157,6 +157,7 @@ enum HeapSize { HEAP_SIZE_DISTORTION_WORLD_WARP = 0x50000, HEAP_SIZE_UNDERGROUND = 0xE800, HEAP_SIZE_BOAT_CUTSCENE = 0x20000, + HEAP_SIZE_EVOLUTION = 0x30000, HEAP_SIZE_GAME_START = 0x20000, HEAP_SIZE_MAIN_MENU = 0x40000, HEAP_SIZE_MIGRATE_FROM_GBA = 0x38000, diff --git a/include/constants/items.h b/include/constants/items.h index b37633e443..16c611738d 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -15,6 +15,7 @@ #define POCKET_BATTLE_ITEMS 6 #define POCKET_KEY_ITEMS 7 #define POCKET_MAX 8 +#define POCKET_LIST_END 0xFF #define BATTLE_POCKET_SHIFT_POKE_BALLS 0 #define BATTLE_POCKET_SHIFT_BATTLE_ITEMS 1 diff --git a/include/constants/start_menu.h b/include/constants/start_menu.h new file mode 100644 index 0000000000..0b6088d2a8 --- /dev/null +++ b/include/constants/start_menu.h @@ -0,0 +1,17 @@ +#ifndef POKEPLATINUM_CONSTANTS_START_MENU_H +#define POKEPLATINUM_CONSTANTS_START_MENU_H + +#define ICON_ANIM_NONE 0 +#define ICON_ANIM_SWELL 1 +#define ICON_ANIM_WIGGLE 2 +#define ICON_ANIM_COUNT 3 + +#define PALETTE_GRAYSCALE 0 +#define PALETTE_COLORED 1 + +#define CURSOR_TEMPLATE 0 +#define ICON_TEMPLATE 1 + +#define CURSOR_SPRITE_INDEX 0 + +#endif // POKEPLATINUM_CONSTANTS_START_MENU_H diff --git a/include/constdata/const_020EA02C.h b/include/constdata/const_020EA02C.h deleted file mode 100644 index 343199d1d5..0000000000 --- a/include/constdata/const_020EA02C.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_CONST_020EA02C_H -#define POKEPLATINUM_CONST_020EA02C_H - -extern const u8 Unk_020EA02C[]; - -#endif // POKEPLATINUM_CONST_020EA02C_H diff --git a/include/field_move_tasks.h b/include/field_move_tasks.h index 209daff6d3..8266893590 100644 --- a/include/field_move_tasks.h +++ b/include/field_move_tasks.h @@ -6,6 +6,7 @@ #include "field/field_system_decl.h" #include "field_task.h" +#include "pokemon.h" typedef struct FieldMoveContext { u32 mapId; @@ -45,9 +46,21 @@ enum TaskOrError { FIELD_MOVE_ERROR, }; -typedef void (*FieldMoveTaskContext)(FieldMovePokemon *, const FieldMoveContext *); +typedef struct FlyContext { + FieldSystem *fieldSystem; + int state; + u16 mapID; + s16 x; + s16 z; + Pokemon *mon; + SysTask *cutInTask; +} FlyContext; + +typedef void (*FieldMoveTask)(FieldMovePokemon *, const FieldMoveContext *); typedef enum FieldMoveError (*FieldMoveErrContext)(const FieldMoveContext *); +FlyContext *FlyContext_New(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *mon, u16 mapID, s16 x, s16 z); +BOOL FieldMoves_FlyTask(FieldTask *fieldTask); void *FieldMove_GetTaskOrError(u16 taskOrError, u16 fieldMove); void FieldMoves_SetUsableMoves(FieldSystem *fieldSystem, FieldMoveContext *fieldMoveContext); diff --git a/include/item.h b/include/item.h index e12253a419..4af295b52c 100644 --- a/include/item.h +++ b/include/item.h @@ -312,7 +312,7 @@ u8 Item_BerryNumber(u16 item); * @param berry * @return The item for the berry number, or ITEM_RETURN_ID if none exists. */ -u16 Item_ForBerryNumber(u8 item); +u16 Item_ForBerryNumber(u8 berry); /** * @brief Check if a given item is herbal medicine. diff --git a/include/item_use_functions.h b/include/item_use_functions.h index 536536ac0e..716ea4193f 100644 --- a/include/item_use_functions.h +++ b/include/item_use_functions.h @@ -9,9 +9,9 @@ #include "field_task.h" #include "string_gf.h" -#define USE_ITEM_TASK_MENU 0 -#define USE_ITEM_TASK_FIELD 1 -#define USE_ITEM_TASK_CHECK 2 +#define ITEM_FUNC_USE_FROM_MENU 0 +#define ITEM_FUNC_USE_IN_FIELD 1 +#define ITEM_FUNC_CHECK_CAN_USE 2 enum ItemUseCheckResult { ITEM_USE_CANNOT_USE_GENERIC = -1, @@ -70,8 +70,8 @@ typedef struct UnkStruct_02068EFC { u16 unk_16; } UnkStruct_02068EFC; -u32 GetItemUseFunction(u16 param0, u16 param1); -void sub_0206842C(FieldSystem *fieldSystem, ItemUseContext *param1); +u32 ItemUseFunction_Get(u16 funcType, u16 functionIdx); +void ItemUseContext_Init(FieldSystem *fieldSystem, ItemUseContext *param1); BOOL BerryPatch_IsEmpty(const ItemUseContext *usageContext); BOOL sub_02069238(FieldSystem *fieldSystem); diff --git a/include/overlay006/hm_cut_in.h b/include/overlay006/hm_cut_in.h index f3b48d7eb8..15ad5f4383 100644 --- a/include/overlay006/hm_cut_in.h +++ b/include/overlay006/hm_cut_in.h @@ -6,9 +6,9 @@ #include "pokemon.h" #include "sys_task_manager.h" -SysTask *SysTask_HMCutIn_New(FieldSystem *fieldSystem, BOOL isNotFly, Pokemon *shownPokemon, int playerGender); -int CheckHMCutInFinished(SysTask *cutInTask); -void SysTask_HMCutIn_SetTaskDone(SysTask *cutInTask); +SysTask *HMCutIn_StartTask(FieldSystem *fieldSystem, BOOL isNotFly, Pokemon *shownPokemon, int playerGender); +int HMCutIn_IsFinished(SysTask *cutInTask); +void HMCutIn_EndTask(SysTask *cutInTask); SysTask *FieldTask_FlyLanding_InitTask(FieldSystem *fieldSystem, int playerGender); int FlyLanding_IsAnimFinished(SysTask *sysTask); void FlyLanding_SetTaskDone(SysTask *sysTask); diff --git a/include/start_menu.h b/include/start_menu.h index 3d9afe06c4..159b3bd76a 100644 --- a/include/start_menu.h +++ b/include/start_menu.h @@ -1,26 +1,74 @@ #ifndef POKEPLATINUM_UNK_0203A9C8_H #define POKEPLATINUM_UNK_0203A9C8_H -#include "struct_defs/struct_020708E0.h" - #include "field/field_system_decl.h" +#include "overlay005/sprite_resource_manager.h" +#include "bg_window.h" +#include "field_move_tasks.h" #include "field_task.h" +#include "item_use_functions.h" +#include "menu.h" +#include "string_list.h" -BOOL sub_0203A9C8(FieldSystem *fieldSystem); -void StartMenu_Init(struct FieldSystem_t *fieldSystem); -void sub_0203AA78(struct FieldSystem_t *fieldSystem); -void sub_0203AABC(FieldSystem *fieldSystem); +#define MAX_START_MENU_OPTIONS 7 + +typedef struct StartMenu { + Window primaryWindow; + Window secondaryWindow; + Menu *menu; + StringList *menuOptions; + u16 cursorPos; + u16 state; + u32 input; + u8 options[MAX_START_MENU_OPTIONS]; + SpriteResourceManager spriteManager; + ManagedSprite *sprites[MAX_START_MENU_OPTIONS + 1]; + u32 spriteCount; + u32 hideOptionFlags; + BOOL inUnionRoom; + FieldTaskFunc callback; + ItemUseContext itemUseCtx; + FieldMoveContext fieldMoveContext; + void *taskData; + void *additionalTaskContext; +} StartMenu; + +enum StartMenuState { + START_MENU_STATE_INIT = 0, + START_MENU_STATE_SELECT, + START_MENU_STATE_APP_START, + START_MENU_STATE_APP_RUN, + START_MENU_STATE_SAVE, + START_MENU_STATE_SAVE_WAIT, + START_MENU_STATE_EVOLVE_INIT, + START_MENU_STATE_EVOLVE, + START_MENU_STATE_8, + START_MENU_STATE_9, + START_MENU_STATE_NEW_TASK, + START_MENU_STATE_EXIT_WITH_NEW_TASK, + START_MENU_STATE_REINIT, + START_MENU_STATE_END, + START_MENU_STATE_REINIT_WAIT_FOR_FADE, + START_MENU_STATE_SAVED, +}; + +extern const u8 gAllSummaryScreenPages[]; + +BOOL FieldSystem_IsInValidLocation(FieldSystem *fieldSystem); void StartMenu_Open(FieldSystem *fieldSystem); +void StartMenu_OpenUnionRoom(FieldSystem *fieldSystem); +void StartMenu_OpenColosseum(FieldSystem *fieldSystem); +void StartMenu_OpenFromScript(FieldSystem *fieldSystem); void StartMenu_SetCallback(StartMenu *menu, void *callback); -BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan); -BOOL sub_0203C3F4(FieldTask *param0); -BOOL sub_0203C434(FieldTask *param0); -BOOL sub_0203C50C(FieldTask *param0); +BOOL StartMenu_ExitPartyMenu(FieldTask *fieldTask); +BOOL StartMenu_ExitTownMap(FieldTask *fieldTask); +BOOL StartMenu_FlyDestinationSelected(FieldTask *fieldTask); +BOOL StartMenu_ExitJournal(FieldTask *fieldTask); void *sub_0203C540(u16 param0, u8 param1, u8 param2); -BOOL StartMenu_ExitMail(FieldTask *taskMan); -BOOL sub_0203C710(FieldTask *param0); -BOOL sub_0203C750(FieldTask *param0); -BOOL sub_0203C784(FieldTask *param0); +BOOL StartMenu_ExitMail(FieldTask *fieldTask); +BOOL StartMenu_ExitPoffinCase(FieldTask *fieldTask); +BOOL StartMenu_ExitPalPad(FieldTask *fieldTask); +BOOL StartMenu_ExitVsRecorder(FieldTask *fieldTask); #endif // POKEPLATINUM_UNK_0203A9C8_H diff --git a/include/struct_defs/struct_020708E0.h b/include/struct_defs/struct_020708E0.h deleted file mode 100644 index fd5561cf4c..0000000000 --- a/include/struct_defs/struct_020708E0.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_020708E0_H -#define POKEPLATINUM_STRUCT_020708E0_H - -#include "overlay005/sprite_resource_manager.h" - -#include "bg_window.h" -#include "field_move_tasks.h" -#include "field_task.h" -#include "item_use_functions.h" -#include "menu.h" -#include "string_list.h" - -typedef struct { - Window unk_00; - Window unk_10; - Menu *unk_20; - StringList *unk_24; - u16 unk_28; - u16 state; - u32 unk_2C; - u8 options[7]; - SpriteResourceManager spriteManager; - ManagedSprite *unk_200[8]; - u32 unk_220; - u32 hideOptionFlags; - u32 unk_228; - FieldTaskFunc callback; - ItemUseContext unk_230; - FieldMoveContext fieldMoveContext; - void *taskData; - void *unk_260; -} StartMenu; - -enum StartMenuState { - START_MENU_STATE_INIT, - START_MENU_STATE_SELECT, - START_MENU_STATE_APP_START, - START_MENU_STATE_APP_RUN, - START_MENU_STATE_SAVE, - START_MENU_STATE_SAVE_WAIT, - START_MENU_STATE_EVOLVE_INIT, - START_MENU_STATE_EVOLVE, - START_MENU_STATE_8, - START_MENU_STATE_9, - START_MENU_STATE_10, - START_MENU_STATE_11, - START_MENU_STATE_12, - START_MENU_STATE_END, - START_MENU_STATE_14, - START_MENU_STATE_15 -}; - -#endif // POKEPLATINUM_STRUCT_020708E0_H diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 0050b371ea..d1e45db4dd 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -16,11 +16,13 @@ #include "applications/party_menu/defs.h" #include "applications/pc_boxes/pokemon_storage_session.h" #include "applications/poffin_case/main.h" +#include "applications/pokedex/pokedex_main.h" #include "applications/pokemon_summary_screen/main.h" #include "applications/town_map/main.h" #include "field/field_system_decl.h" #include "overlay090/struct_ov90_021D0D80.h" +#include "bag_context.h" #include "field_battle_data_transfer.h" #include "field_move_tasks.h" #include "field_task.h" @@ -31,8 +33,8 @@ #include "trainer_card.h" void FieldSystem_StartBattleProcess(FieldSystem *fieldSystem, FieldBattleDTO *dto); -void sub_0203D1E4(FieldSystem *fieldSystem, void *param1); -void *sub_0203D20C(FieldSystem *fieldSystem, ItemUseContext *param1); +void sub_0203D1E4(FieldSystem *fieldSystem, BagContext *param1); +BagContext *FieldSystem_OpenBag(FieldSystem *fieldSystem, ItemUseContext *param1); void *FieldSystem_CreateBagContext(FieldSystem *fieldSystem, int pocketType); u16 BagContext_GetSelectedItem(void *bagContext); void sub_0203D2E4(FieldSystem *fieldSystem, void *param1); @@ -85,7 +87,7 @@ void sub_0203DFE8( u16 *param6); void sub_0203E09C(FieldSystem *fieldSystem, TrainerCard *param1); void FieldSystem_OpenTrainerCardScreen(FieldSystem *fieldSystem, TrainerCard *trainerCard); -BOOL sub_0203E0AC(FieldSystem *fieldSystem, void *param1); +BOOL FieldSystem_OpenPokedex(FieldSystem *fieldSystem, PokedexOverlayArgs *args); void FieldSystem_LaunchChooseStarterApp(FieldSystem *fieldSystem, ChooseStarterData *param1); void sub_0203E0D0(FieldSystem *fieldSystem); void FieldSystem_LaunchGTSApp(FieldSystem *fieldSystem, BOOL connectToWiFi); diff --git a/include/unk_0205F180.h b/include/unk_0205F180.h index 86e7e197e9..24c4cb50b8 100644 --- a/include/unk_0205F180.h +++ b/include/unk_0205F180.h @@ -15,7 +15,7 @@ int PlayerAvatar_CheckStartMove(PlayerAvatar *playerAvatar, int param1); void sub_0205F490(PlayerAvatar *playerAvatar); void sub_0205F56C(PlayerAvatar *playerAvatar); int sub_0205F588(PlayerAvatar *playerAvatar); -void sub_0205F5E4(PlayerAvatar *playerAvatar, int param1); +void sub_0205F5E4(PlayerAvatar *playerAvatar, int dir); u32 sub_02060B7C(PlayerAvatar *playerAvatar, MapObject *param1, int param2); u32 sub_020611FC(PlayerAvatar *playerAvatar, MapObject *param1, int param2); enum FaceDirection PlayerAvatar_CalcFaceDirection(PlayerAvatar *playerAvatar, u16 pressedKeys, u16 heldKeys); @@ -30,7 +30,7 @@ u32 sub_0206156C(PlayerAvatar *playerAvatar, int param1); void PlayerAvatar_MoveCoordsInDirection(PlayerAvatar *playerAvatar, int direction, int *x, int *z); void PlayerAvatar_GetFacingTileCoords(PlayerAvatar *playerAvatar, int *x, int *z); void sub_02061674(PlayerAvatar *playerAvatar, int param1, int *param2, int *param3, int *param4); -u32 PlayerAvatar_GetDistortionTileBehaviour(PlayerAvatar *playerAvatar, int param1); +u32 PlayerAvatar_GetDistortionFacingTileBehaviour(PlayerAvatar *playerAvatar, int distortionDir); u32 PlayerAvatar_GetDistortionCurrTileBehaviour(PlayerAvatar *playerAvatar); void sub_020617BC(PlayerAvatar *const playerAvatar, int *param1, int *param2, int *param3); diff --git a/include/unk_0207064C.h b/include/unk_0207064C.h deleted file mode 100644 index 02cf2e5302..0000000000 --- a/include/unk_0207064C.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_UNK_0207064C_H -#define POKEPLATINUM_UNK_0207064C_H - -#include "field/field_system_decl.h" - -#include "field_task.h" -#include "pokemon.h" - -void *sub_0207064C(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *mon, u16 mapID, s16 param4, s16 param5); -BOOL sub_02070680(FieldTask *param0); - -#endif // POKEPLATINUM_UNK_0207064C_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 9943b4b459..258f66296e 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -275,7 +275,6 @@ Static main Object main.nef.p/src_tv_episode_segment.c.o Object main.nef.p/src_unk_0206F314.c.o Object main.nef.p/src_unk_02070428.c.o - Object main.nef.p/src_unk_0207064C.c.o Object main.nef.p/src_field_move_tasks.c.o Object main.nef.p/src_unk_020711C8.c.o Object main.nef.p/src_overworld_anim_manager.c.o diff --git a/res/text/start_menu.json b/res/text/start_menu.json index 88c2efa51b..3e7cdbe154 100644 --- a/res/text/start_menu.json +++ b/res/text/start_menu.json @@ -14,7 +14,7 @@ "en_US": "BAG" }, { - "id": "StartMenu_Text_Player", + "id": "StartMenu_Text_PlayerTemplate", "en_US": "{STRVAR_1 3, 0, 0}" }, { diff --git a/res/text/underground_common.json b/res/text/underground_common.json index e6e8434746..2a6cb34c2c 100644 --- a/res/text/underground_common.json +++ b/res/text/underground_common.json @@ -724,7 +724,7 @@ "en_US": "TREASURES" }, { - "id": "UndergroundCommon_Text_TrainerNameTemplate", + "id": "UndergroundCommon_Text_PlayerTemplate", "en_US": "{STRVAR_1 1, 1, 0}" }, { diff --git a/src/applications/bag/main.c b/src/applications/bag/main.c index 46e5a73093..03c6adcfa7 100644 --- a/src/applications/bag/main.c +++ b/src/applications/bag/main.c @@ -2072,7 +2072,7 @@ static int ItemActionFunc_Use(BagController *controller) BagUI_CloseItemActionsMenu(controller); s32 itemUseFuncIdx = Item_LoadParam(controller->bagCtx->selectedItem, ITEM_PARAM_FIELD_USE_FUNC, HEAP_ID_BAG); - ItemCheckUseFunc checkFunc = (ItemCheckUseFunc)GetItemUseFunction(USE_ITEM_TASK_CHECK, itemUseFuncIdx); + ItemCheckUseFunc checkFunc = (ItemCheckUseFunc)ItemUseFunction_Get(ITEM_FUNC_CHECK_CAN_USE, itemUseFuncIdx); if (checkFunc != NULL) { enum ItemUseCheckResult checkResult = checkFunc(controller->bagCtx->itemUseCtx); @@ -2319,7 +2319,7 @@ static int ItemActionFunc_CheckTag(BagController *controller) { BagUI_CloseItemActionsMenu(controller); App_StartScreenFade(TRUE, HEAP_ID_BAG); - controller->bagCtx->exitCode = BAG_EXIT_CODE_SHOW_BERRY_DATA; + controller->bagCtx->exitCode = BAG_EXIT_CODE_CHECK_BERRY_TAG; return BAG_APP_STATE_EXIT; } diff --git a/src/applications/party_menu/unk_02084B70.c b/src/applications/party_menu/unk_02084B70.c index 770cc5e261..c27185bc8b 100644 --- a/src/applications/party_menu/unk_02084B70.c +++ b/src/applications/party_menu/unk_02084B70.c @@ -743,13 +743,13 @@ static int sub_02085C50(void *applicationPtr) Sound_PlayEffect(SEQ_SE_CONFIRM); PartyMenu_RemoveContextWindow(application); application->unk_B13 = 3; - application->partyMenu->unk_34 = 0; + application->partyMenu->levelUpMoveIndex = 0; } break; case 3: mon = Party_GetPokemonBySlotIndex(application->partyMenu->party, application->currPartySlot); - switch (Pokemon_LevelUpMove(mon, &application->partyMenu->unk_34, &application->partyMenu->learnedMove)) { + switch (Pokemon_LevelUpMove(mon, &application->partyMenu->levelUpMoveIndex, &application->partyMenu->learnedMove)) { case 0x0: application->unk_B13 = 6; break; @@ -864,7 +864,7 @@ static int sub_02085FB4(void *applicationPtr) String_Free(string); PartyMenu_PrintLongMessage(application, PRINT_MESSAGE_PRELOADED, FALSE); - application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_FORGET_MOVE; + application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_LEVEL_UP; application->unk_B0E = 25; return 24; @@ -1057,7 +1057,7 @@ static int sub_02086438(void *applicationPtr) String_Free(string); PartyMenu_PrintLongMessage(application, PRINT_MESSAGE_PRELOADED, FALSE); - application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_LEARNED_MOVE; + application->partyMenu->menuSelectionResult = PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_TM_HM; application->unk_B0E = 25; return 24; diff --git a/src/applications/pc_boxes/box_app_manager.c b/src/applications/pc_boxes/box_app_manager.c index 5f6a4c8074..405904fadb 100644 --- a/src/applications/pc_boxes/box_app_manager.c +++ b/src/applications/pc_boxes/box_app_manager.c @@ -2570,7 +2570,7 @@ static void BoxAppMan_GiveItemFromBagAction(BoxApplicationManager *boxAppMan, u3 POCKET_BERRIES, POCKET_BATTLE_ITEMS, POCKET_KEY_ITEMS, - -1 + POCKET_LIST_END, }; static u32 item; diff --git a/src/bag.c b/src/bag.c index c88d705263..ffdfe9e9f1 100644 --- a/src/bag.c +++ b/src/bag.c @@ -326,7 +326,7 @@ void *BagContext_CreateWithPockets(Bag *bag, const u8 *pockets, enum HeapID heap bagContext = BagContext_New(heapID); - for (i = 0; pockets[i] != 0xff; i++) { + for (i = 0; pockets[i] != POCKET_LIST_END; i++) { switch (pockets[i]) { case POCKET_KEY_ITEMS: BagContext_InitPocket(bagContext, bag->keyItems, POCKET_KEY_ITEMS, i); diff --git a/src/battle/ov16_0223B140.c b/src/battle/ov16_0223B140.c index 729eab22b0..ba99ff01ba 100644 --- a/src/battle/ov16_0223B140.c +++ b/src/battle/ov16_0223B140.c @@ -255,9 +255,9 @@ BOOL Battle_Main(ApplicationManager *appMan, int *param1) v2 = Battle_FindEvolvingPartyMember(v0, &v1, &v3); if (v2) { - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_73, 0x30000); + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_EVOLUTION, HEAP_SIZE_EVOLUTION); v4 = Party_GetPokemonBySlotIndex(v0->parties[0], v1); - v0->unk_170 = Evolution_Begin(v0->parties[0], v4, v2, v0->options, v0->visitedContestHall, v0->pokedex, v0->bag, v0->records, v0->poketch, v3, 0x1 | 0x2, HEAP_ID_73); + v0->unk_170 = Evolution_Begin(v0->parties[0], v4, v2, v0->options, v0->visitedContestHall, v0->pokedex, v0->bag, v0->records, v0->poketch, v3, 0x1 | 0x2, HEAP_ID_EVOLUTION); *param1 = 14; } else { *param1 = 15; @@ -268,7 +268,7 @@ BOOL Battle_Main(ApplicationManager *appMan, int *param1) if (Evolution_IsDone(v5) == 1) { Evolution_Free(v5); - Heap_Destroy(HEAP_ID_73); + Heap_Destroy(HEAP_ID_EVOLUTION); *param1 = 13; } } break; diff --git a/src/field_move_tasks.c b/src/field_move_tasks.c index b2120c3362..cc01cbe902 100644 --- a/src/field_move_tasks.c +++ b/src/field_move_tasks.c @@ -10,7 +10,6 @@ #include "generated/object_events_gfx.h" #include "struct_decls/struct_02061AB4_decl.h" -#include "struct_defs/struct_020708E0.h" #include "struct_defs/struct_020711C8.h" #include "applications/town_map/main.h" @@ -43,8 +42,13 @@ #define FIELD_MOVE_FLAG(move) (1 << (move)) +enum FlyState { + FLY_STATE_START_CUT_IN = 0, + FLY_STATE_MAIN, +}; + typedef struct { - FieldMoveTaskContext task; + FieldMoveTask task; FieldMoveErrContext error; } FieldMoveTaskOrError; @@ -57,7 +61,7 @@ typedef struct { static void FieldMoves_CanUseSurfDistortionWorld(FieldSystem *fieldSystem, FieldMoveContext *param1); static enum FieldMoveError FieldMoves_CheckFly(const FieldMoveContext *fieldMoveContext); -static void FieldMoves_SetFlyTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext); +static void FieldMoves_SetSelectFlyDestinationTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext); static enum FieldMoveError FieldMoves_CheckTeleport(const FieldMoveContext *fieldMoveContext); static void FieldMoves_SetTeleportTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext); @@ -108,7 +112,7 @@ static BOOL FieldMoves_CutTask(FieldTask *taskMan); static const FieldMoveTaskOrError fieldMoveTaskOrError[] = { { FieldMoves_SetCutTask, FieldMoves_CheckCut }, - { FieldMoves_SetFlyTask, FieldMoves_CheckFly }, + { FieldMoves_SetSelectFlyDestinationTask, FieldMoves_CheckFly }, { FieldMoves_SetSurfTask, FieldMoves_CheckSurf }, { FieldMoves_SetStrengthTask, FieldMoves_CheckStrength }, { FieldMoves_SetDefogTask, FieldMoves_CheckDefog }, @@ -169,6 +173,51 @@ static inline BOOL PlayerOutsideLinkRoom(const FieldMoveContext *fieldMoveContex return TRUE; } +FlyContext *FlyContext_New(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *mon, u16 mapID, s16 x, s16 z) +{ + FlyContext *ctx = Heap_AllocAtEnd(heapID, sizeof(FlyContext)); + + memset(ctx, 0, sizeof(FlyContext)); + + ctx->fieldSystem = fieldSystem; + ctx->mon = mon; + ctx->mapID = mapID; + ctx->x = x; + ctx->z = z; + + return ctx; +} + +BOOL FieldMoves_FlyTask(FieldTask *task) +{ + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + FlyContext *ctx = FieldTask_GetEnv(task); + + switch (ctx->state) { + case FLY_STATE_START_CUT_IN: + ctx->cutInTask = HMCutIn_StartTask(ctx->fieldSystem, TRUE, ctx->mon, PlayerAvatar_Gender(ctx->fieldSystem->playerAvatar)); + ctx->state++; + break; + case FLY_STATE_MAIN: + if (!HMCutIn_IsFinished(ctx->cutInTask)) { + break; + } + + HMCutIn_EndTask(ctx->cutInTask); + + u16 destination = GetSpawnIdByMapAndCoords(ctx->mapID, ctx->x, ctx->z); + GF_ASSERT(destination != MAP_HEADER_EVERYWHERE); + + Location location; + Location_InitFly(destination, &location); + FieldTask_ChangeMapChangeFly(task, location.mapId, WARP_ID_NONE, location.x, location.z, DIR_SOUTH); + + Heap_Free(ctx); + } + + return FALSE; +} + void *FieldMove_GetTaskOrError(u16 taskOrError, u16 fieldMove) { if (taskOrError == FIELD_MOVE_TASK) { @@ -246,7 +295,7 @@ static void FieldMoves_CanUseSurfDistortionWorld(FieldSystem *fieldSystem, Field u32 currTileBehavior, nextTileBehavior; distortionDir = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar); - nextTileBehavior = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, distortionDir); + nextTileBehavior = PlayerAvatar_GetDistortionFacingTileBehaviour(fieldSystem->playerAvatar, distortionDir); currTileBehavior = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar); if (PlayerAvatar_CanUseSurf(fieldSystem->playerAvatar, currTileBehavior, nextTileBehavior) == TRUE) { @@ -297,7 +346,7 @@ static void FieldMoves_SetCutTask(FieldMovePokemon *fieldMoveMon, const FieldMov menu->callback = FieldMoves_CutTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_CutTask(FieldTask *taskMan) @@ -337,20 +386,20 @@ static enum FieldMoveError FieldMoves_CheckFly(const FieldMoveContext *fieldMove return FIELD_MOVE_ERROR_NONE; } -static void FieldMoves_SetFlyTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext) +static void FieldMoves_SetSelectFlyDestinationTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask); StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask); u32 *fieldMonID = Heap_Alloc(HEAP_ID_FIELD2, sizeof(u32)); *fieldMonID = fieldMoveMon->fieldMonId; - menu->unk_260 = fieldMonID; + menu->additionalTaskContext = fieldMonID; menu->taskData = Heap_Alloc(HEAP_ID_FIELD2, sizeof(TownMapContext)); TownMapContext_Init(fieldSystem, menu->taskData, TOWN_MAP_MODE_FLY); FieldSystem_OpenTownMap(fieldSystem, menu->taskData); - StartMenu_SetCallback(menu, sub_0203C434); + StartMenu_SetCallback(menu, StartMenu_FlyDestinationSelected); } static enum FieldMoveError FieldMoves_CheckSurf(const FieldMoveContext *fieldMoveContext) @@ -387,7 +436,7 @@ static void FieldMoves_SetSurfTask(FieldMovePokemon *fieldMoveMon, const FieldMo menu->callback = FieldMoves_SurfTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_SurfTask(FieldTask *taskMan) @@ -428,7 +477,7 @@ static void FieldMoves_SetStrengthTask(FieldMovePokemon *fieldMoveMon, const Fie menu->callback = FieldMoves_StrengthTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_StrengthTask(FieldTask *param0) @@ -469,7 +518,7 @@ static void FieldMoves_SetDefogTask(FieldMovePokemon *fieldMoveMon, const FieldM menu->callback = FieldMoves_DefogTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_DefogTask(FieldTask *taskMan) @@ -514,7 +563,7 @@ static void FieldMoves_SetRockSmashTask(FieldMovePokemon *fieldMoveMon, const Fi menu->callback = FieldMoves_RockSmashTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_RockSmashTask(FieldTask *taskMan) @@ -555,7 +604,7 @@ static void FieldMoves_SetWaterfallTask(FieldMovePokemon *fieldMoveMon, const Fi menu->callback = FieldMoves_WaterfallTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_WaterfallTask(FieldTask *param0) @@ -600,7 +649,7 @@ static void FieldMoves_SetRockClimbTask(FieldMovePokemon *fieldMoveMon, const Fi menu->callback = FieldMoves_RockClimbTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_RockClimbTask(FieldTask *taskMan) @@ -637,7 +686,7 @@ static void FieldMoves_SetFlashTask(FieldMovePokemon *fieldMoveMon, const FieldM menu->callback = FieldMoves_FlashTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_FlashTask(FieldTask *taskMan) @@ -684,7 +733,7 @@ static void FieldMoves_SetTeleportTask(FieldMovePokemon *fieldMoveMon, const Fie menu->callback = FieldMoves_TeleportTask; menu->taskData = v2; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_TeleportTask(FieldTask *task) @@ -727,7 +776,7 @@ static void FieldMoves_SetDigTask(FieldMovePokemon *fieldMoveMon, const FieldMov v1->callback = FieldMoves_DigTask; v1->taskData = v2; - v1->state = START_MENU_STATE_10; + v1->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_DigTask(FieldTask *task) @@ -770,7 +819,7 @@ static void FieldMoves_SetSweetScentTask(FieldMovePokemon *fieldMoveMon, const F startMenu->callback = ov5_021F101C; startMenu->taskData = v2; - startMenu->state = START_MENU_STATE_10; + startMenu->state = START_MENU_STATE_NEW_TASK; v4 = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_LURED_POKEMON - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELD2); JournalEntry_SaveData(fieldSystem->journalEntry, v4, JOURNAL_LOCATION); @@ -795,7 +844,7 @@ static void FieldMoves_SetChatterTask(FieldMovePokemon *fieldMoveMon, const Fiel menu->callback = FieldMoves_ChatterTask; menu->taskData = taskData; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL FieldMoves_ChatterTask(FieldTask *taskMan) diff --git a/src/item_use_functions.c b/src/item_use_functions.c index 39b2162d4e..84abb8485b 100644 --- a/src/item_use_functions.c +++ b/src/item_use_functions.c @@ -7,7 +7,6 @@ #include "constants/savedata/vars_flags.h" #include "struct_decls/struct_02061AB4_decl.h" -#include "struct_defs/struct_020708E0.h" #include "struct_defs/struct_02097728.h" #include "applications/party_menu/defs.h" @@ -72,7 +71,7 @@ typedef struct ItemUseFuncDat { } ItemUseFuncDat; void *FieldSystem_OpenTownMapItem(FieldSystem *fieldSystem); -static void sub_020684D0(FieldSystem *fieldSystem, ItemUseContext *usageContext); +static void ItemUseContext_InitForDistortionWorld(FieldSystem *fieldSystem, ItemUseContext *usageContext); static void UseHealingItemFromMenu(ItemMenuUseContext *usageContext, const ItemUseContext *additionalContext); static void UseTownMapFromMenu(ItemMenuUseContext *usageContext, const ItemUseContext *additionalContext); static void UseExplorerKitFromMenu(ItemMenuUseContext *usageContext, const ItemUseContext *additionalContext); @@ -166,76 +165,72 @@ static const ItemUseFuncDat sItemUseFuncs[] = { }; // clang-format on -u32 GetItemUseFunction(u16 discriminator, u16 functionIdx) +u32 ItemUseFunction_Get(u16 funcType, u16 functionIdx) { - if (discriminator == USE_ITEM_TASK_MENU) { + if (funcType == ITEM_FUNC_USE_FROM_MENU) { return (u32)sItemUseFuncs[functionIdx].useItemFromMenuFunc; - } else if (discriminator == USE_ITEM_TASK_FIELD) { + } else if (funcType == ITEM_FUNC_USE_IN_FIELD) { return (u32)sItemUseFuncs[functionIdx].useItemInFieldFunc; } return (u32)sItemUseFuncs[functionIdx].canUseItemFunc; } -void sub_0206842C(FieldSystem *fieldSystem, ItemUseContext *usageContext) +void ItemUseContext_Init(FieldSystem *fieldSystem, ItemUseContext *ctxOut) { - int playerXCoordinate, playerZCoordinate, playerDirection; - MapObject *v3; - if (PlayerAvatar_DistortionGravityChanged(fieldSystem->playerAvatar) == TRUE) { - sub_020684D0(fieldSystem, usageContext); + ItemUseContext_InitForDistortionWorld(fieldSystem, ctxOut); return; } - usageContext->fieldSystem = fieldSystem; - usageContext->mapHeaderID = fieldSystem->location->mapId; - usageContext->hasPartner = SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldSystem->saveData)); - usageContext->playerState = PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar); + ctxOut->fieldSystem = fieldSystem; + ctxOut->mapHeaderID = fieldSystem->location->mapId; + ctxOut->hasPartner = SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldSystem->saveData)); + ctxOut->playerState = PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar); - playerXCoordinate = Player_GetXPos(fieldSystem->playerAvatar); - playerZCoordinate = Player_GetZPos(fieldSystem->playerAvatar); + int x = Player_GetXPos(fieldSystem->playerAvatar); + int z = Player_GetZPos(fieldSystem->playerAvatar); - usageContext->currTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, playerXCoordinate, playerZCoordinate); + ctxOut->currTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, x, z); - playerDirection = PlayerAvatar_GetDir(fieldSystem->playerAvatar); + int playerDirection = PlayerAvatar_GetDir(fieldSystem->playerAvatar); switch (playerDirection) { - case 0: - playerZCoordinate--; + case DIR_NORTH: + z--; break; - case 1: - playerZCoordinate++; + case DIR_SOUTH: + z++; break; - case 3: - playerXCoordinate++; + case DIR_EAST: + x++; break; - case 2: - playerXCoordinate--; + case DIR_WEST: + x--; break; } - usageContext->facingTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, playerXCoordinate, playerZCoordinate); - sub_0203C9D4(fieldSystem, &v3); + ctxOut->facingTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, x, z); + MapObject *mapObj; + sub_0203C9D4(fieldSystem, &mapObj); - usageContext->berryPatchFlags = BerryPatches_GetPatchFlags(fieldSystem, v3); - usageContext->playerAvatar = fieldSystem->playerAvatar; + ctxOut->berryPatchFlags = BerryPatches_GetPatchFlags(fieldSystem, mapObj); + ctxOut->playerAvatar = fieldSystem->playerAvatar; } -static void sub_020684D0(FieldSystem *fieldSystem, ItemUseContext *usageContext) +static void ItemUseContext_InitForDistortionWorld(FieldSystem *fieldSystem, ItemUseContext *ctxOut) { - usageContext->fieldSystem = fieldSystem; - usageContext->mapHeaderID = fieldSystem->location->mapId; - usageContext->hasPartner = SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldSystem->saveData)); - usageContext->playerState = PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar); - usageContext->currTileBehavior = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar); + ctxOut->fieldSystem = fieldSystem; + ctxOut->mapHeaderID = fieldSystem->location->mapId; + ctxOut->hasPartner = SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldSystem->saveData)); + ctxOut->playerState = PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar); + ctxOut->currTileBehavior = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar); - { - int v0 = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar); - usageContext->facingTileBehavior = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, v0); - } + int distortionDir = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar); + ctxOut->facingTileBehavior = PlayerAvatar_GetDistortionFacingTileBehaviour(fieldSystem->playerAvatar, distortionDir); - usageContext->berryPatchFlags = BerryPatches_GetPatchFlags(fieldSystem, NULL); - usageContext->playerAvatar = fieldSystem->playerAvatar; + ctxOut->berryPatchFlags = BerryPatches_GetPatchFlags(fieldSystem, NULL); + ctxOut->playerAvatar = fieldSystem->playerAvatar; } static UnkStruct_0206851C *sub_0206851C(u32 param0, u16 param1, u16 param2, u16 param3, u16 param4) @@ -260,7 +255,7 @@ static void sub_02068540(ItemMenuUseContext *usageContext, const ItemUseContext menu->callback = sub_020685AC; menu->taskData = sub_0206851C(param2, usageContext->item, 0, 0, 0); - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static void sub_02068584(ItemFieldUseContext *usageContext, u32 param1) @@ -327,7 +322,7 @@ static void UseTownMapFromMenu(ItemMenuUseContext *usageContext, const ItemUseCo StartMenu *menu = FieldTask_GetEnv(usageContext->fieldTask); menu->taskData = FieldSystem_OpenTownMapItem(fieldSystem); - StartMenu_SetCallback(menu, sub_0203C3F4); + StartMenu_SetCallback(menu, StartMenu_ExitTownMap); } static BOOL UseTownMapInField(ItemFieldUseContext *usageContext) @@ -350,7 +345,7 @@ static void UseExplorerKitFromMenu(ItemMenuUseContext *usageContext, const ItemU menu->callback = FieldTask_MapChangeToUnderground; menu->taskData = sub_02053FAC(fieldSystem); - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; fieldSystem->menuCursorPos = 0; } @@ -420,7 +415,7 @@ static void UseBicycleFromMenu(ItemMenuUseContext *usageContext, const ItemUseCo menu->callback = MountOrUnmountBicycle; menu->taskData = NULL; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL UseBicycleInField(ItemFieldUseContext *usageContext) @@ -515,7 +510,7 @@ static void UseJournalFromMenu(ItemMenuUseContext *usageContext, const ItemUseCo StartMenu *v1 = FieldTask_GetEnv(usageContext->fieldTask); sub_0203D30C(fieldSystem, NULL); - StartMenu_SetCallback(v1, sub_0203C50C); + StartMenu_SetCallback(v1, StartMenu_ExitJournal); } static BOOL UseJournalInField(ItemFieldUseContext *usageContext) @@ -561,7 +556,7 @@ static void UseMailFromMenu(ItemMenuUseContext *usageContext, const ItemUseConte StartMenu *menu = FieldTask_GetEnv(usageContext->fieldTask); UnkStruct_02097728 *v2 = sub_0203D94C(fieldSystem, 3, Item_MailNumber(usageContext->item), HEAP_ID_FIELD2); - menu->unk_260 = sub_0203C540(usageContext->item, 3, 0); + menu->additionalTaskContext = sub_0203C540(usageContext->item, 3, 0); menu->taskData = v2; StartMenu_SetCallback(menu, StartMenu_ExitMail); @@ -604,7 +599,7 @@ static void UsePoffinCaseFromMenu(ItemMenuUseContext *usageContext, const ItemUs PoffinCaseAppData *poffinCase = FieldSystem_LaunchPoffinCaseApp(fieldSystem, HEAP_ID_FIELD2); menu->taskData = poffinCase; - StartMenu_SetCallback(menu, sub_0203C710); + StartMenu_SetCallback(menu, StartMenu_ExitPoffinCase); } static BOOL UsePoffinCaseInField(ItemFieldUseContext *usageContext) @@ -625,7 +620,7 @@ static void UsePalPadFromMenu(ItemMenuUseContext *usageContext, const ItemUseCon sub_0203DE78(fieldSystem, fieldSystem->saveData); menu->taskData = NULL; - StartMenu_SetCallback(menu, sub_0203C750); + StartMenu_SetCallback(menu, StartMenu_ExitPalPad); } static BOOL UsePalPadInField(ItemFieldUseContext *usageContext) @@ -651,7 +646,7 @@ static void UsePokeRadarFromMenu(ItemMenuUseContext *usageContext, const ItemUse menu->callback = RefreshRadarChain; menu->taskData = v2; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL UsePokeRadarInField(ItemFieldUseContext *usageContext) @@ -738,7 +733,7 @@ static void UseHoneyFromMenu(ItemMenuUseContext *usageContext, const ItemUseCont menu->callback = ov5_021F0488; menu->taskData = v2; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; Bag_TryRemoveItem(SaveData_GetBag(fieldSystem->saveData), usageContext->item, 1, HEAP_ID_FIELD2); } @@ -772,7 +767,7 @@ static void UseOldRodFromMenu(ItemMenuUseContext *usageContext, const ItemUseCon menu->callback = FieldTask_Fishing; menu->taskData = FishingContext_Init(fieldSystem, HEAP_ID_FIELD2, FISHING_TYPE_OLD_ROD); - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL UseOldRodInField(ItemFieldUseContext *usageContext) @@ -792,7 +787,7 @@ static void UseGoodRodFromMenu(ItemMenuUseContext *usageContext, const ItemUseCo menu->callback = FieldTask_Fishing; menu->taskData = FishingContext_Init(fieldSystem, HEAP_ID_FIELD2, FISHING_TYPE_GOOD_ROD); - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL UseGoodRodInField(ItemFieldUseContext *usageContext) @@ -812,7 +807,7 @@ static void UseSuperRodFromMenu(ItemMenuUseContext *usageContext, const ItemUseC menu->callback = FieldTask_Fishing; menu->taskData = FishingContext_Init(fieldSystem, HEAP_ID_FIELD2, FISHING_TYPE_SUPER_ROD); - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; } static BOOL UseSuperRodInField(ItemFieldUseContext *usageContext) @@ -940,7 +935,7 @@ static void UseEscapeRopeFromMenu(ItemMenuUseContext *usageContext, const ItemUs menu->callback = WarpWithEscapeRope; menu->taskData = NULL; - menu->state = START_MENU_STATE_10; + menu->state = START_MENU_STATE_NEW_TASK; Bag_TryRemoveItem(SaveData_GetBag(fieldSystem->saveData), usageContext->item, 1, HEAP_ID_FIELD2); } @@ -1008,7 +1003,7 @@ static void UseVsRecorderFromMenu(ItemMenuUseContext *usageContext, const ItemUs sub_0203DE88(fieldSystem, fieldSystem->saveData); menu->taskData = NULL; - StartMenu_SetCallback(menu, sub_0203C784); + StartMenu_SetCallback(menu, StartMenu_ExitVsRecorder); } static BOOL UseVsRecorderInField(ItemFieldUseContext *usageContext) @@ -1064,8 +1059,8 @@ BOOL sub_02069238(FieldSystem *fieldSystem) item = (u16)Bag_GetRegisteredItem(SaveData_GetBag(fieldSystem->saveData)); itemUseFuncIdx = (u16)Item_LoadParam(item, ITEM_PARAM_FIELD_USE_FUNC, HEAP_ID_FIELD2); - checkUse = (ItemCheckUseFunc)GetItemUseFunction(USE_ITEM_TASK_CHECK, itemUseFuncIdx); - useInField = (ItemFieldUseFunc)GetItemUseFunction(USE_ITEM_TASK_FIELD, itemUseFuncIdx); + checkUse = (ItemCheckUseFunc)ItemUseFunction_Get(ITEM_FUNC_CHECK_CAN_USE, itemUseFuncIdx); + useInField = (ItemFieldUseFunc)ItemUseFunction_Get(ITEM_FUNC_USE_IN_FIELD, itemUseFuncIdx); if (useInField == NULL) { return FALSE; @@ -1077,7 +1072,7 @@ BOOL sub_02069238(FieldSystem *fieldSystem) usageContext->fieldSystem = fieldSystem; usageContext->unk_28 = item; - sub_0206842C(fieldSystem, &usageContext->unk_04); + ItemUseContext_Init(fieldSystem, &usageContext->unk_04); usageResult = 0; diff --git a/src/meson.build b/src/meson.build index 2a23cbd989..6803c7ae61 100644 --- a/src/meson.build +++ b/src/meson.build @@ -261,7 +261,6 @@ pokeplatinum_c = files( 'tv_episode_segment.c', 'unk_0206F314.c', 'unk_02070428.c', - 'unk_0207064C.c', 'field_move_tasks.c', 'unk_020711C8.c', 'overworld_anim_manager.c', diff --git a/src/overlay005/field_control.c b/src/overlay005/field_control.c index 2757ba8d20..3d45994052 100644 --- a/src/overlay005/field_control.c +++ b/src/overlay005/field_control.c @@ -298,7 +298,7 @@ BOOL FieldInput_Process(const FieldInput *input, FieldSystem *fieldSystem) } int distortionDir = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar); - u32 distortionBehavior = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, distortionDir); + u32 distortionBehavior = PlayerAvatar_GetDistortionFacingTileBehaviour(fieldSystem->playerAvatar, distortionDir); int distortionScript = Field_TileBehaviorToScript(fieldSystem, distortionBehavior); if (distortionScript != 0xffff) { @@ -329,9 +329,9 @@ BOOL FieldInput_Process(const FieldInput *input, FieldSystem *fieldSystem) return TRUE; } - if (input->menu && sub_0203A9C8(fieldSystem) == TRUE) { + if (input->menu && FieldSystem_IsInValidLocation(fieldSystem) == TRUE) { Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); - StartMenu_Init(fieldSystem); + StartMenu_Open(fieldSystem); return TRUE; } @@ -420,7 +420,7 @@ BOOL FieldInput_Process_Colosseum(FieldInput *input, FieldSystem *fieldSystem) if (input->menu) { Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); - sub_0203AABC(fieldSystem); + StartMenu_OpenColosseum(fieldSystem); return TRUE; } @@ -477,7 +477,7 @@ BOOL FieldInput_Process_UnionRoom(const FieldInput *input, FieldSystem *fieldSys if (input->menu && CommSys_ConnectedCount() <= 1) { Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); - sub_0203AA78(fieldSystem); + StartMenu_OpenUnionRoom(fieldSystem); sub_0205BEA8(4); sub_02036BA0(); return TRUE; @@ -534,7 +534,7 @@ int FieldInput_Process_BattleTower(const FieldInput *input, FieldSystem *fieldSy if (input->menu) { Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); - StartMenu_Init(fieldSystem); + StartMenu_Open(fieldSystem); return TRUE; } diff --git a/src/overlay005/ov5_021DFB54.c b/src/overlay005/ov5_021DFB54.c index a762a7800a..f236cd3149 100644 --- a/src/overlay005/ov5_021DFB54.c +++ b/src/overlay005/ov5_021DFB54.c @@ -1715,13 +1715,13 @@ static void MonRideTask_Init(FieldSystem *fieldSystem, Pokemon *partyMon, MonRid static void NewMonRideCutIn(FieldSystem *fieldSystem, MonRideTask *monRideTask) { - monRideTask->HMCutInTask = SysTask_HMCutIn_New(fieldSystem, 0, monRideTask->partyMon, monRideTask->playerGender); + monRideTask->HMCutInTask = HMCutIn_StartTask(fieldSystem, 0, monRideTask->partyMon, monRideTask->playerGender); } static BOOL CheckMonRideCutInFinished(MonRideTask *monRideTask) { - if (CheckHMCutInFinished(monRideTask->HMCutInTask) == TRUE) { - SysTask_HMCutIn_SetTaskDone(monRideTask->HMCutInTask); + if (HMCutIn_IsFinished(monRideTask->HMCutInTask) == TRUE) { + HMCutIn_EndTask(monRideTask->HMCutInTask); return TRUE; } diff --git a/src/overlay005/ov5_021F101C.c b/src/overlay005/ov5_021F101C.c index 1e11e68173..19fa102860 100644 --- a/src/overlay005/ov5_021F101C.c +++ b/src/overlay005/ov5_021F101C.c @@ -42,13 +42,13 @@ BOOL ov5_021F101C(FieldTask *param0) break; case 2: { int v5 = PlayerAvatar_Gender(fieldSystem->playerAvatar); - v3->unk_00 = SysTask_HMCutIn_New(fieldSystem, 0, v1->unk_00, v5); + v3->unk_00 = HMCutIn_StartTask(fieldSystem, 0, v1->unk_00, v5); } (*v2)++; break; case 3: - if (CheckHMCutInFinished(v3->unk_00)) { - SysTask_HMCutIn_SetTaskDone(v3->unk_00); + if (HMCutIn_IsFinished(v3->unk_00)) { + HMCutIn_EndTask(v3->unk_00); (*v2)++; } break; diff --git a/src/overlay006/field_warp.c b/src/overlay006/field_warp.c index 08b6184a38..ad7ad88296 100644 --- a/src/overlay006/field_warp.c +++ b/src/overlay006/field_warp.c @@ -387,7 +387,7 @@ static enum FieldWarpStateResult StartFieldMoveCutIn(FieldTask *task, FieldSyste { int gender = PlayerAvatar_Gender(fieldSystem->playerAvatar); - fieldWarp->cutInTask = SysTask_HMCutIn_New(fieldSystem, 0, fieldWarp->mon, gender); + fieldWarp->cutInTask = HMCutIn_StartTask(fieldSystem, 0, fieldWarp->mon, gender); fieldWarp->state++; return STATE_RESULT_NEXT_STATE; @@ -395,11 +395,11 @@ static enum FieldWarpStateResult StartFieldMoveCutIn(FieldTask *task, FieldSyste static enum FieldWarpStateResult FinishFieldMoveCutIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) { - if (CheckHMCutInFinished(fieldWarp->cutInTask) == FALSE) { + if (HMCutIn_IsFinished(fieldWarp->cutInTask) == FALSE) { return STATE_RESULT_NEXT_STATE; } - SysTask_HMCutIn_SetTaskDone(fieldWarp->cutInTask); + HMCutIn_EndTask(fieldWarp->cutInTask); fieldWarp->state++; return STATE_RESULT_REPEAT_STATE; } diff --git a/src/overlay006/hm_cut_in.c b/src/overlay006/hm_cut_in.c index 132747d930..d79fdb954d 100644 --- a/src/overlay006/hm_cut_in.c +++ b/src/overlay006/hm_cut_in.c @@ -1035,16 +1035,16 @@ static void HidePlayerMapObj(FieldSystem *fieldSystem, BOOL hidden) MapObject_SetHidden(playerMapObject, hidden); } -SysTask *SysTask_HMCutIn_New(FieldSystem *fieldSystem, BOOL isNotFly, Pokemon *shownPokemon, int playerGender) +SysTask *HMCutIn_StartTask(FieldSystem *fieldSystem, BOOL isFly, Pokemon *shownPokemon, int playerGender) { SysTask *task; HMCutIn *cutIn = CreateHMCutIn(fieldSystem); cutIn->mon = shownPokemon; cutIn->playerGender = playerGender; - cutIn->_1 = isNotFly; + cutIn->_1 = isFly; - if (isNotFly == FALSE) { + if (isFly == FALSE) { task = SysTask_Start(SysTask_CutIn, cutIn, 133); } else { task = SysTask_Start(SysTask_CutInFly, cutIn, 133); @@ -1053,13 +1053,13 @@ SysTask *SysTask_HMCutIn_New(FieldSystem *fieldSystem, BOOL isNotFly, Pokemon *s return task; } -int CheckHMCutInFinished(SysTask *cutInTask) +int HMCutIn_IsFinished(SysTask *cutInTask) { HMCutIn *cutIn = SysTask_GetParam(cutInTask); return cutIn->isFinished; } -void SysTask_HMCutIn_SetTaskDone(SysTask *cutInTask) +void HMCutIn_EndTask(SysTask *cutInTask) { HMCutIn *cutIn = SysTask_GetParam(cutInTask); diff --git a/src/overlay007/shop_menu.c b/src/overlay007/shop_menu.c index 6945f9e849..ececd4f952 100644 --- a/src/overlay007/shop_menu.c +++ b/src/overlay007/shop_menu.c @@ -197,7 +197,7 @@ static const u8 sShop_BagPockets[] = { POCKET_MAIL, POCKET_BATTLE_ITEMS, POCKET_KEY_ITEMS, - -1 + POCKET_LIST_END, }; static const WindowTemplate sShop_FrontierCurrMoneyWindowTemplate = { diff --git a/src/scrcmd.c b/src/scrcmd.c index 1b3588c90d..9e86533a0d 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -4524,7 +4524,7 @@ static BOOL ScrCmd_0C5(ScriptContext *ctx) u16 v2 = ScriptContext_GetVar(ctx); Pokemon *v0 = Party_GetPokemonBySlotIndex(SaveData_GetParty(ctx->fieldSystem->saveData), v2); - *v1 = SysTask_HMCutIn_New(ctx->fieldSystem, 0, v0, PlayerAvatar_Gender(ctx->fieldSystem->playerAvatar)); + *v1 = HMCutIn_StartTask(ctx->fieldSystem, 0, v0, PlayerAvatar_Gender(ctx->fieldSystem->playerAvatar)); ScriptContext_Pause(ctx, sub_02042C80); return TRUE; @@ -4534,8 +4534,8 @@ static BOOL sub_02042C80(ScriptContext *ctx) { void **v0 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_DATA_PTR); - if (CheckHMCutInFinished(*v0) == TRUE) { - SysTask_HMCutIn_SetTaskDone(*v0); + if (HMCutIn_IsFinished(*v0) == TRUE) { + HMCutIn_EndTask(*v0); return TRUE; } diff --git a/src/script_manager.c b/src/script_manager.c index ca950a0155..11127ce117 100644 --- a/src/script_manager.c +++ b/src/script_manager.c @@ -404,8 +404,8 @@ void FieldSystem_ShowStartMenu(FieldSystem *fieldSystem) { ScriptManager *scriptManager = FieldTask_GetEnv(fieldSystem->task); - if (sub_0203A9C8(fieldSystem) == TRUE) { - scriptManager->function = StartMenu_Open; + if (FieldSystem_IsInValidLocation(fieldSystem) == TRUE) { + scriptManager->function = StartMenu_OpenFromScript; } } diff --git a/src/start_menu.c b/src/start_menu.c index 58c26eee41..390d4add5c 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -1,10 +1,11 @@ #include "start_menu.h" #include -#include #include "constants/field/map_load.h" +#include "constants/field_base_tiles.h" #include "constants/heap.h" +#include "constants/start_menu.h" #include "generated/genders.h" #include "generated/journal_location_events.h" #include "generated/pokemon_data_params.h" @@ -13,7 +14,6 @@ #include "struct_decls/struct_0209747C_decl.h" #include "struct_defs/sentence.h" -#include "struct_defs/struct_020708E0.h" #include "struct_defs/struct_02097728.h" #include "applications/bag/application.h" @@ -84,192 +84,185 @@ #include "unk_0205C22C.h" #include "unk_0205F180.h" #include "unk_0206B9D8.h" -#include "unk_0207064C.h" #include "unk_020972FC.h" #include "unk_0209747C.h" #include "unk_02097624.h" #include "vars_flags.h" -#include "constdata/const_020EA02C.h" #include "res/graphics/start_menu/start_menu.naix" +#include "res/text/bank/location_names.h" #include "res/text/bank/start_menu.h" -typedef enum StartMenuPos { - MENU_POS_POKEDEX, - MENU_POS_POKEMON, - MENU_POS_BAG, - MENU_POS_TRAINER_CARD, - MENU_POS_SAVE, - MENU_POS_OPTIONS, - MENU_POS_EXIT, - MENU_POS_CHAT, - MENU_POS_RETIRE -} StartMenuPos; +enum StartMenuOption { + START_MENU_OPTION_POKEDEX = 0, + START_MENU_OPTION_POKEMON, + START_MENU_OPTION_BAG, + START_MENU_OPTION_TRAINER_CARD, + START_MENU_OPTION_SAVE, + START_MENU_OPTION_OPTIONS, + START_MENU_OPTION_EXIT, + START_MENU_OPTION_CHAT, + START_MENU_OPTION_RETIRE, +}; typedef struct { - u16 unk_00; - u8 unk_02; + u16 itemID; + u8 slot; u8 unk_03; } UnkStruct_0203C540; -typedef struct { - u8 unk_00; - u8 unk_01; - u16 unk_02; - u16 unk_04; - int unk_08; -} UnkStruct_0203C7B8; +typedef struct MenuEvolutionData { + u8 slot; + u8 class; + u16 dummy; + u16 targetSpecies; + int method; +} MenuEvolutionData; -typedef struct { - u16 unk_00; - u16 unk_02; -} UnkStruct_0203C1C8; +typedef struct MenuOverwriteMoveData { + u16 usedItemID; + u16 levelUpMoveIndex; +} MenuOverwriteMoveData; -typedef struct { - void *unk_00; - u16 unk_04; +typedef struct SaveMenu { + u8 padding[4]; + u16 result; + u8 padding2[2]; } SaveMenu; -static StartMenu *StartMenu_Alloc(void); -static u32 GetHiddenOptionFlags_Main(FieldSystem *fieldSystem); -static u32 GetHiddenOptionFlags_Safari(FieldSystem *fieldSystem); -static u32 GetHiddenOptionFlags_PalPark(FieldSystem *fieldSystem); -static u32 GetHiddenOptionFlags_BattleTowerSalon(FieldSystem *fieldSystem); -static u32 GetHiddenOptionFlags_UnionRoom(FieldSystem *fieldSystem); -static u32 GetHiddenOptionFlags_Colosseum(FieldSystem *fieldSystem); -static void sub_0203B318(StartMenu *menu, u8 *options, u32 optionCount, u8 gender); -static void sub_0203B4E8(StartMenu *menu); -static void sub_0203B520(StartMenu *menu); -static void sub_0203B558(Sprite *graphicElement, u32 param1); -static void sub_0203B588(Sprite *graphicElement, u16 param1, u16 param2); -static void sub_0203B5B4(StartMenu *menu, u16 param1, u16 param2); -static void sub_0203B5E8(Sprite *graphicElement); -static BOOL sub_0203AC44(FieldTask *taskMan); -static void sub_0203ADFC(FieldTask *taskMan); -static BOOL StartMenu_Select(FieldTask *taskMan); -static u32 StartMenu_MakeList(StartMenu *menu, u8 *param1); +static StartMenu *StartMenu_New(void); +static u32 StartMenu_GetNormalHiddenOptions(FieldSystem *fieldSystem); +static u32 StartMenu_GetSafariHiddenOptions(FieldSystem *fieldSystem); +static u32 StartMenu_GetPalParkHiddenOptions(FieldSystem *fieldSystem); +static u32 StartMenu_GetBattleTowerSalonHiddenOptions(FieldSystem *fieldSystem); +static u32 StartMenu_GetUnionRoomHiddenOptions(FieldSystem *fieldSystem); +static u32 StartMenu_GetColosseumHiddenOptions(FieldSystem *fieldSystem); +static void StartMenu_InitSprites(StartMenu *menu, u8 *options, u32 optionCount, u8 gender); +static void StartMenu_FreeSprites(StartMenu *menu); +static void StartMenu_AnimateSprites(StartMenu *menu); +static void StartMenu_SetCursorPos(Sprite *sprite, u32 pos); +static void StartMenu_SetIconAnimationAndPalette(Sprite *sprite, u16 anim, u16 palette); +static void StartMenu_ChangeActiveMenuIcon(StartMenu *menu, u16 oldIndex, u16 index); +static void StartMenu_TryTransitionIconAnimationToWiggle(Sprite *sprite); +static BOOL StartMenu_Main(FieldTask *fieldTask); +static void StartMenu_InitMenu(FieldTask *fieldTask); +static BOOL StartMenu_Select(FieldTask *fieldTask); +static u32 StartMenu_MakeOptionList(StartMenu *menu, u8 *listOut); static void StartMenu_Close(StartMenu *menu); -static void sub_0203B2EC(StartMenu *menu, FieldSystem *param1); -static void sub_0203B094(FieldTask *taskMan); -static void sub_0203B200(FieldTask *taskMan); -static void StartMenu_ApplicationStart(FieldTask *taskMan); -static void StartMenu_ApplicationRun(FieldTask *taskMan); -static BOOL StartMenu_SelectPokedex(FieldTask *taskMan); -static BOOL StartMenu_OpenPokedex(FieldTask *taskMan); -static BOOL StartMenu_ExitPokedex(FieldTask *taskMan); -static BOOL StartMenu_SelectTrainerCard(FieldTask *taskMan); -static BOOL StartMenu_TrainerCard(FieldTask *taskMan); -static BOOL sub_0203BF00(FieldTask *taskMan); -static BOOL StartMenu_SelectOptions(FieldTask *taskMan); -static BOOL StartMenu_Options(FieldTask *taskMan); -static BOOL sub_0203C050(FieldTask *taskMan); -static BOOL StartMenu_SelectChat(FieldTask *taskMan); -static BOOL sub_0203C0A0(FieldTask *taskMan); -static BOOL sub_0203C0F8(FieldTask *taskMan); -static BOOL StartMenu_SelectPokemon(FieldTask *taskMan); -static BOOL StartMenu_OpenPartyMenu(FieldTask *taskMan); -static BOOL StartMenu_SelectBag(FieldTask *taskMan); -static BOOL StartMenu_Bag(FieldTask *taskMan); -static BOOL StartMenu_ExitBag(FieldTask *taskMan); -static BOOL StartMenu_SelectSave(FieldTask *taskMan); -static void StartMenu_SaveWait(FieldTask *taskMan); -static void StartMenu_Save(FieldTask *taskMan); -static BOOL StartMenu_ExitSummary(FieldTask *taskMan); -static void sub_0203C2D8(FieldTask *taskMan, u16 param1); -static BOOL sub_0203C390(FieldTask *taskMan); -BOOL sub_0203C434(FieldTask *taskMan); -static void StartMenu_EvolveInit(FieldTask *taskMan); -static void StartMenu_Evolve(FieldTask *taskMan); -static BOOL StartMenu_SelectRetire(FieldTask *taskMan); - -#define START_MENU_NO_ACTION 0xFFFFFFFF -#define START_MENU_EXIT_ACTION 0xFFFFFFFE +static void sub_0203B2EC(StartMenu *menu, FieldSystem *fieldSystem); +static void StartMenu_PrintBallCount(FieldTask *fieldTask); +static void StartMenu_EraseBallCount(FieldTask *fieldTask); +static void StartMenu_ApplicationStart(FieldTask *fieldTask); +static void StartMenu_ApplicationRun(FieldTask *fieldTask); +static BOOL StartMenu_SelectPokedex(FieldTask *fieldTask); +static BOOL StartMenu_OpenPokedex(FieldTask *fieldTask); +static BOOL StartMenu_ExitPokedex(FieldTask *fieldTask); +static BOOL StartMenu_SelectTrainerCard(FieldTask *fieldTask); +static BOOL StartMenu_TrainerCard(FieldTask *fieldTask); +static BOOL StartMenu_ExitTrainerCard(FieldTask *fieldTask); +static BOOL StartMenu_SelectOptions(FieldTask *fieldTask); +static BOOL StartMenu_Options(FieldTask *fieldTask); +static BOOL StartMenu_ExitOptions(FieldTask *fieldTask); +static BOOL StartMenu_SelectChat(FieldTask *fieldTask); +static BOOL StartMenu_Chat(FieldTask *fieldTask); +static BOOL StartMenu_ExitChat(FieldTask *fieldTask); +static BOOL StartMenu_SelectPokemon(FieldTask *fieldTask); +static BOOL StartMenu_OpenPartyMenu(FieldTask *fieldTask); +static BOOL StartMenu_SelectBag(FieldTask *fieldTask); +static BOOL StartMenu_Bag(FieldTask *fieldTask); +static BOOL StartMenu_ExitBag(FieldTask *fieldTask); +static BOOL StartMenu_SelectSave(FieldTask *fieldTask); +static void StartMenu_SaveWait(FieldTask *fieldTask); +static void StartMenu_Save(FieldTask *fieldTask); +static BOOL StartMenu_ExitSummary(FieldTask *fieldTask); +static void StartMenu_ShowBerryTag(FieldTask *fieldTask, u16 berryItemID); +static BOOL StartMenu_ExitBerryTag(FieldTask *fieldTask); +static void StartMenu_EvolveInit(FieldTask *fieldTask); +static void StartMenu_Evolve(FieldTask *fieldTask); +static BOOL StartMenu_SelectRetire(FieldTask *fieldTask); +static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode); typedef struct StartMenuAction { - u32 text; - void *task; + u32 bankEntry; + void *callback; } StartMenuAction; // clang-format off // `void *` is used for the `task` here to clean up the semantics of providing task functions for // the table. As a bonus, it makes the exit action's special task-sentinel more visually prominent. static const StartMenuAction sStartMenuActions[] = { - [MENU_POS_POKEDEX] = { StartMenu_Text_Pokedex, StartMenu_SelectPokedex }, - [MENU_POS_POKEMON] = { StartMenu_Text_Pokemon, StartMenu_SelectPokemon }, - [MENU_POS_BAG] = { StartMenu_Text_Bag, StartMenu_SelectBag }, - [MENU_POS_TRAINER_CARD] = { StartMenu_Text_Player, StartMenu_SelectTrainerCard }, - [MENU_POS_SAVE] = { StartMenu_Text_Save, StartMenu_SelectSave }, - [MENU_POS_OPTIONS] = { StartMenu_Text_Options, StartMenu_SelectOptions }, - [MENU_POS_EXIT] = { StartMenu_Text_Exit, (void *)START_MENU_EXIT_ACTION }, - [MENU_POS_CHAT] = { StartMenu_Text_Chat, StartMenu_SelectChat }, - [MENU_POS_RETIRE] = { StartMenu_Text_Retire, StartMenu_SelectRetire }, + [START_MENU_OPTION_POKEDEX] = { .bankEntry = StartMenu_Text_Pokedex, .callback = StartMenu_SelectPokedex }, + [START_MENU_OPTION_POKEMON] = { .bankEntry = StartMenu_Text_Pokemon, .callback = StartMenu_SelectPokemon }, + [START_MENU_OPTION_BAG] = { .bankEntry = StartMenu_Text_Bag, .callback = StartMenu_SelectBag }, + [START_MENU_OPTION_TRAINER_CARD] = { .bankEntry = StartMenu_Text_PlayerTemplate, .callback = StartMenu_SelectTrainerCard }, + [START_MENU_OPTION_SAVE] = { .bankEntry = StartMenu_Text_Save, .callback = StartMenu_SelectSave }, + [START_MENU_OPTION_OPTIONS] = { .bankEntry = StartMenu_Text_Options, .callback = StartMenu_SelectOptions }, + [START_MENU_OPTION_EXIT] = { .bankEntry = StartMenu_Text_Exit, .callback = (void *)MENU_CANCEL }, + [START_MENU_OPTION_CHAT] = { .bankEntry = StartMenu_Text_Chat, .callback = StartMenu_SelectChat }, + [START_MENU_OPTION_RETIRE] = { .bankEntry = StartMenu_Text_Retire, .callback = StartMenu_SelectRetire }, }; // clang-format on -static const SpriteTemplate Unk_020EA0A4[] = { - { - 0xCC, - 0x14, - 0x0, - 0x0, - 0x1, - 0x1, - NNS_G2D_VRAM_TYPE_2DMAIN, - { 0x34D8, 0x34D8, 0x34D8, 0x34D8, 0x0, 0x0 }, - 0x0, - 0x0, +static const SpriteTemplate sSpriteTemplates[] = { + [CURSOR_TEMPLATE] = { + .x = 204, + .y = 20, + .z = 0, + .animIdx = ICON_ANIM_NONE, + .priority = 1, + .plttIdx = PALETTE_COLORED, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { 0x34D8, 0x34D8, 0x34D8, 0x34D8, 0x0, 0x0 }, + .bgPriority = 0, + .vramTransfer = FALSE, }, - { - 0xAE, - 0x14, - 0x0, - 0x0, - 0x0, - 0x0, - NNS_G2D_VRAM_TYPE_2DMAIN, - { 0x34D9, 0x34D8, 0x34D9, 0x34D9, 0x0, 0x0 }, - 0x0, - 0x0, + [ICON_TEMPLATE] = { + .x = 174, + .y = 20, + .z = 0, + .animIdx = ICON_ANIM_NONE, + .priority = 0, + .plttIdx = PALETTE_GRAYSCALE, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { 0x34D9, 0x34D8, 0x34D9, 0x34D9, 0x0, 0x0 }, + .bgPriority = 0, + .vramTransfer = FALSE, }, }; -static const u8 Unk_020EA020[] = { - 0x0, - 0x1, - 0x2, - 0x3, - 0x4, - 0x5, - 0x6, - 0x7, - 0xff, +static const u8 sAllPockets[] = { + POCKET_ITEMS, + POCKET_MEDICINE, + POCKET_BALLS, + POCKET_TMHMS, + POCKET_BERRIES, + POCKET_MAIL, + POCKET_BATTLE_ITEMS, + POCKET_KEY_ITEMS, + POCKET_LIST_END, }; -const u8 Unk_020EA02C[] = { - 0x0, - 0x1, - 0x2, - 0x4, - 0x3, - 0x5, - 0x6, - 0x7, - 0x8, +const u8 gAllSummaryScreenPages[] = { + SUMMARY_PAGE_INFO, + SUMMARY_PAGE_MEMO, + SUMMARY_PAGE_SKILLS, + SUMMARY_PAGE_CONDITION, + SUMMARY_PAGE_BATTLE_MOVES, + SUMMARY_PAGE_CONTEST_MOVES, + SUMMARY_PAGE_RIBBONS, + SUMMARY_PAGE_EXIT, + SUMMARY_PAGE_MAX, }; -static const u8 Unk_020EA01C[] = { - 0x3, - 0x5, - 0x8, +static const u8 sOnlyMovePages[] = { + SUMMARY_PAGE_BATTLE_MOVES, + SUMMARY_PAGE_CONTEST_MOVES, + SUMMARY_PAGE_MAX, }; -BOOL sub_0203A9C8(FieldSystem *fieldSystem) +BOOL FieldSystem_IsInValidLocation(FieldSystem *fieldSystem) { - if (MapHeader_GetMapLabelTextID(fieldSystem->location->mapId) == 0) { - return FALSE; - } - - return TRUE; + return MapHeader_GetMapLabelTextID(fieldSystem->location->mapId) != LocationNames_Text_MysteryZone; } #define HIDE_OPTION_POKEDEX (1 << 0) @@ -282,100 +275,98 @@ BOOL sub_0203A9C8(FieldSystem *fieldSystem) #define HIDE_OPTION_CHAT (1 << 7) #define HIDE_OPTION_RETIRE (1 << 8) -void StartMenu_Init(FieldSystem *fieldSystem) -{ - StartMenu *menu = StartMenu_Alloc(); - - if (SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_Safari(fieldSystem); - } else if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_PalPark(fieldSystem); - } else if (FieldSystem_IsInBattleTowerSalon(fieldSystem) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_BattleTowerSalon(fieldSystem); - } else { - menu->hideOptionFlags = GetHiddenOptionFlags_Main(fieldSystem); - } - - menu->unk_228 = 0; - - if (sub_0205F588(fieldSystem->playerAvatar) == 1) { - sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); - } - - FieldSystem_CreateTask(fieldSystem, sub_0203AC44, menu); -} - -void sub_0203AA78(FieldSystem *fieldSystem) -{ - StartMenu *menu = StartMenu_Alloc(); - - menu->hideOptionFlags = GetHiddenOptionFlags_UnionRoom(fieldSystem); - menu->unk_228 = 1; - - if (sub_0205F588(fieldSystem->playerAvatar) == 1) { - sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); - } - - FieldSystem_CreateTask(fieldSystem, sub_0203AC44, menu); -} - -void sub_0203AABC(FieldSystem *fieldSystem) -{ - StartMenu *menu = StartMenu_Alloc(); - - menu->hideOptionFlags = GetHiddenOptionFlags_Colosseum(fieldSystem); - menu->unk_228 = 0; - - if (sub_0205F588(fieldSystem->playerAvatar) == 1) { - sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); - } - - FieldSystem_CreateTask(fieldSystem, sub_0203AC44, menu); -} - void StartMenu_Open(FieldSystem *fieldSystem) { - StartMenu *menu; - - Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); - menu = StartMenu_Alloc(); - - menu->unk_228 = 0; + StartMenu *menu = StartMenu_New(); if (SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_Safari(fieldSystem); + menu->hideOptionFlags = StartMenu_GetSafariHiddenOptions(fieldSystem); } else if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_PalPark(fieldSystem); + menu->hideOptionFlags = StartMenu_GetPalParkHiddenOptions(fieldSystem); } else if (FieldSystem_IsInBattleTowerSalon(fieldSystem) == TRUE) { - menu->hideOptionFlags = GetHiddenOptionFlags_BattleTowerSalon(fieldSystem); - } else if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_COLOSSEUM) { - menu->hideOptionFlags = GetHiddenOptionFlags_Colosseum(fieldSystem); - } else if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION) { - menu->hideOptionFlags = GetHiddenOptionFlags_UnionRoom(fieldSystem); - menu->unk_228 = 1; + menu->hideOptionFlags = StartMenu_GetBattleTowerSalonHiddenOptions(fieldSystem); } else { - menu->hideOptionFlags = GetHiddenOptionFlags_Main(fieldSystem); + menu->hideOptionFlags = StartMenu_GetNormalHiddenOptions(fieldSystem); } - FieldTask_InitJump(fieldSystem->task, sub_0203AC44, menu); + menu->inUnionRoom = FALSE; + + if (sub_0205F588(fieldSystem->playerAvatar) == 1) { + sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); + } + + FieldSystem_CreateTask(fieldSystem, StartMenu_Main, menu); } -static StartMenu *StartMenu_Alloc(void) +void StartMenu_OpenUnionRoom(FieldSystem *fieldSystem) +{ + StartMenu *menu = StartMenu_New(); + + menu->hideOptionFlags = StartMenu_GetUnionRoomHiddenOptions(fieldSystem); + menu->inUnionRoom = TRUE; + + if (sub_0205F588(fieldSystem->playerAvatar) == 1) { + sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); + } + + FieldSystem_CreateTask(fieldSystem, StartMenu_Main, menu); +} + +void StartMenu_OpenColosseum(FieldSystem *fieldSystem) +{ + StartMenu *menu = StartMenu_New(); + + menu->hideOptionFlags = StartMenu_GetColosseumHiddenOptions(fieldSystem); + menu->inUnionRoom = FALSE; + + if (sub_0205F588(fieldSystem->playerAvatar) == 1) { + sub_0205F5E4(fieldSystem->playerAvatar, PlayerAvatar_GetDir(fieldSystem->playerAvatar)); + } + + FieldSystem_CreateTask(fieldSystem, StartMenu_Main, menu); +} + +void StartMenu_OpenFromScript(FieldSystem *fieldSystem) +{ + Sound_PlayEffect(SEQ_SE_DP_WIN_OPEN); + StartMenu *menu = StartMenu_New(); + + menu->inUnionRoom = FALSE; + + if (SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { + menu->hideOptionFlags = StartMenu_GetSafariHiddenOptions(fieldSystem); + } else if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { + menu->hideOptionFlags = StartMenu_GetPalParkHiddenOptions(fieldSystem); + } else if (FieldSystem_IsInBattleTowerSalon(fieldSystem) == TRUE) { + menu->hideOptionFlags = StartMenu_GetBattleTowerSalonHiddenOptions(fieldSystem); + } else if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_COLOSSEUM) { + menu->hideOptionFlags = StartMenu_GetColosseumHiddenOptions(fieldSystem); + } else if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION) { + menu->hideOptionFlags = StartMenu_GetUnionRoomHiddenOptions(fieldSystem); + menu->inUnionRoom = TRUE; + } else { + menu->hideOptionFlags = StartMenu_GetNormalHiddenOptions(fieldSystem); + } + + FieldTask_InitJump(fieldSystem->task, StartMenu_Main, menu); +} + +static StartMenu *StartMenu_New(void) { StartMenu *menu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(StartMenu)); menu->state = START_MENU_STATE_INIT; - menu->unk_28 = 0; + menu->cursorPos = 0; menu->taskData = NULL; return menu; } -static u32 GetHiddenOptionFlags_Main(FieldSystem *fieldSystem) +static u32 StartMenu_GetNormalHiddenOptions(FieldSystem *fieldSystem) { u32 hideFlags = 0; - if (Pokedex_IsObtained(SaveData_GetPokedex(fieldSystem->saveData)) == FALSE) { + if (!Pokedex_IsObtained(SaveData_GetPokedex(fieldSystem->saveData))) { hideFlags |= HIDE_OPTION_POKEDEX; } @@ -383,7 +374,7 @@ static u32 GetHiddenOptionFlags_Main(FieldSystem *fieldSystem) hideFlags |= HIDE_OPTION_POKEMON; } - if (SystemFlag_CheckBagAcquired(SaveData_GetVarsFlags(fieldSystem->saveData)) == FALSE) { + if (!SystemFlag_CheckBagAcquired(SaveData_GetVarsFlags(fieldSystem->saveData))) { hideFlags |= HIDE_OPTION_BAG; } @@ -398,75 +389,75 @@ static u32 GetHiddenOptionFlags_Main(FieldSystem *fieldSystem) return hideFlags; } -static u32 GetHiddenOptionFlags_Safari(FieldSystem *fieldSystem) +static u32 StartMenu_GetSafariHiddenOptions(FieldSystem *fieldSystem) { return HIDE_OPTION_SAVE | HIDE_OPTION_CHAT; } -static u32 GetHiddenOptionFlags_PalPark(FieldSystem *fieldSystem) +static u32 StartMenu_GetPalParkHiddenOptions(FieldSystem *fieldSystem) { return HIDE_OPTION_SAVE | HIDE_OPTION_CHAT | HIDE_OPTION_BAG; } -static u32 GetHiddenOptionFlags_BattleTowerSalon(FieldSystem *fieldSystem) +static u32 StartMenu_GetBattleTowerSalonHiddenOptions(FieldSystem *fieldSystem) { return HIDE_OPTION_POKEDEX | HIDE_OPTION_BAG | HIDE_OPTION_SAVE | HIDE_OPTION_CHAT | HIDE_OPTION_RETIRE; } -static u32 GetHiddenOptionFlags_UnionRoom(FieldSystem *fieldSystem) +static u32 StartMenu_GetUnionRoomHiddenOptions(FieldSystem *fieldSystem) { return HIDE_OPTION_SAVE | HIDE_OPTION_RETIRE; } -static u32 GetHiddenOptionFlags_Colosseum(FieldSystem *fieldSystem) +static u32 StartMenu_GetColosseumHiddenOptions(FieldSystem *fieldSystem) { return HIDE_OPTION_SAVE | HIDE_OPTION_POKEDEX | HIDE_OPTION_CHAT | HIDE_OPTION_RETIRE; } -static BOOL sub_0203AC44(FieldTask *taskMan) +static BOOL StartMenu_Main(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); switch (menu->state) { case START_MENU_STATE_INIT: MapObjectMan_PauseAllMovement(fieldSystem->mapObjMan); - sub_0206842C(fieldSystem, &menu->unk_230); + ItemUseContext_Init(fieldSystem, &menu->itemUseCtx); FieldMoves_SetUsableMoves(fieldSystem, &menu->fieldMoveContext); - sub_0203ADFC(taskMan); - sub_0203B094(taskMan); + StartMenu_InitMenu(fieldTask); + StartMenu_PrintBallCount(fieldTask); menu->state = START_MENU_STATE_SELECT; break; case START_MENU_STATE_SELECT: - if (StartMenu_Select(taskMan) == FALSE) { + if (StartMenu_Select(fieldTask) == FALSE) { return FALSE; } break; case START_MENU_STATE_APP_START: - StartMenu_ApplicationStart(taskMan); + StartMenu_ApplicationStart(fieldTask); break; case START_MENU_STATE_APP_RUN: - StartMenu_ApplicationRun(taskMan); + StartMenu_ApplicationRun(fieldTask); break; case START_MENU_STATE_SAVE: - StartMenu_Save(taskMan); + StartMenu_Save(fieldTask); break; case START_MENU_STATE_SAVE_WAIT: - StartMenu_SaveWait(taskMan); + StartMenu_SaveWait(fieldTask); break; case START_MENU_STATE_EVOLVE_INIT: - StartMenu_EvolveInit(taskMan); + StartMenu_EvolveInit(fieldTask); break; case START_MENU_STATE_EVOLVE: - StartMenu_Evolve(taskMan); + StartMenu_Evolve(fieldTask); break; - case START_MENU_STATE_12: + case START_MENU_STATE_REINIT: if (FieldSystem_IsRunningFieldMap(fieldSystem)) { MapObjectMan_PauseAllMovement(fieldSystem->mapObjMan); - sub_0203ADFC(taskMan); - sub_0203B094(taskMan); + StartMenu_InitMenu(fieldTask); + StartMenu_PrintBallCount(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_IN); - menu->state = START_MENU_STATE_14; + menu->state = START_MENU_STATE_REINIT_WAIT_FOR_FADE; } break; case START_MENU_STATE_8: @@ -483,288 +474,244 @@ static BOOL sub_0203AC44(FieldTask *taskMan) return TRUE; } break; - case START_MENU_STATE_10: + case START_MENU_STATE_NEW_TASK: if (FieldSystem_IsRunningFieldMap(fieldSystem)) { MapObjectMan_PauseAllMovement(fieldSystem->mapObjMan); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_IN); - menu->state = START_MENU_STATE_11; + menu->state = START_MENU_STATE_EXIT_WITH_NEW_TASK; } break; - case START_MENU_STATE_11: + case START_MENU_STATE_EXIT_WITH_NEW_TASK: if (IsScreenFadeDone()) { - FieldTask_InitJump(taskMan, menu->callback, menu->taskData); + FieldTask_InitJump(fieldTask, menu->callback, menu->taskData); Heap_Free(menu); } break; - case START_MENU_STATE_15: + case START_MENU_STATE_SAVED: Heap_Free(menu); MapObjectMan_UnpauseAllMovement(fieldSystem->mapObjMan); return TRUE; case START_MENU_STATE_END: sub_0203B2EC(menu, fieldSystem); StartMenu_Close(menu); - Window_EraseStandardFrame(&menu->unk_00, 1); - Window_Remove(&menu->unk_00); - sub_0203B200(taskMan); - Bg_ScheduleTilemapTransfer(fieldSystem->bgConfig, 3); + Window_EraseStandardFrame(&menu->primaryWindow, TRUE); + Window_Remove(&menu->primaryWindow); + StartMenu_EraseBallCount(fieldTask); + Bg_ScheduleTilemapTransfer(fieldSystem->bgConfig, BG_LAYER_MAIN_3); Heap_Free(menu); MapObjectMan_UnpauseAllMovement(fieldSystem->mapObjMan); return TRUE; - case START_MENU_STATE_14: + case START_MENU_STATE_REINIT_WAIT_FOR_FADE: if (IsScreenFadeDone()) { menu->state = START_MENU_STATE_SELECT; } break; } - if (menu->unk_20 != NULL) { - sub_0203B520(menu); + if (menu->menu != NULL) { + StartMenu_AnimateSprites(menu); SpriteList_Update(menu->spriteManager.spriteList); } return FALSE; } -static void sub_0203ADFC(FieldTask *taskMan) +static void StartMenu_InitMenu(FieldTask *fieldTask) { + // need to be declared here to match FieldSystem *fieldSystem; - StartMenu *menu; - MessageLoader *v2; - MenuTemplate v3; - u32 i, optionCount; + MessageLoader *loader; - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); - optionCount = StartMenu_MakeList(menu, menu->options); + fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + u32 optionCount = StartMenu_MakeOptionList(menu, menu->options); - Window_Add(fieldSystem->bgConfig, &menu->unk_00, 3, 20, 1, 11, optionCount * 3, 12, (((1024 - (18 + 12) - 9 - (32 * 8)) - (18 + 12 + 24)) - (27 * 4)) - (11 * 22)); - LoadStandardWindowGraphics(fieldSystem->bgConfig, BG_LAYER_MAIN_3, 1024 - (18 + 12) - 9, 11, 1, HEAP_ID_FIELD2); - Window_DrawStandardFrame(&menu->unk_00, 1, 1024 - (18 + 12) - 9, 11); + Window_Add(fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 20, 1, 11, optionCount * 3, 12, BASE_TILE_MESSAGE_WINDOW - 11 * 22); + LoadStandardWindowGraphics(fieldSystem->bgConfig, BG_LAYER_MAIN_3, BASE_TILE_STANDARD_WINDOW_FRAME, 11, STANDARD_WINDOW_FIELD, HEAP_ID_FIELD2); + Window_DrawStandardFrame(&menu->primaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); - v2 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_START_MENU, HEAP_ID_FIELD2); + loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_START_MENU, HEAP_ID_FIELD2); - menu->unk_24 = StringList_New(optionCount, HEAP_ID_FIELD2); - menu->unk_28 = 0; + menu->menuOptions = StringList_New(optionCount, HEAP_ID_FIELD2); + menu->cursorPos = 0; - for (i = 0; i < optionCount; i++) { - if (menu->options[i] == MENU_POS_TRAINER_CARD) { - StringTemplate *v6; - String *v7; - String *v8; + for (u32 i = 0; i < optionCount; i++) { + if (menu->options[i] == START_MENU_OPTION_TRAINER_CARD) { + StringTemplate *template = StringTemplate_Default(HEAP_ID_FIELD2); + String *string = String_Init(8, HEAP_ID_FIELD2); + String *fmtString = MessageLoader_GetNewString(loader, sStartMenuActions[menu->options[i]].bankEntry); - v6 = StringTemplate_Default(HEAP_ID_FIELD2); - v7 = String_Init(8, HEAP_ID_FIELD2); - v8 = MessageLoader_GetNewString(v2, sStartMenuActions[menu->options[i]].text); + StringTemplate_SetPlayerName(template, 0, SaveData_GetTrainerInfo(fieldSystem->saveData)); + StringTemplate_Format(template, string, fmtString); + StringList_AddFromString(menu->menuOptions, string, menu->options[i]); - StringTemplate_SetPlayerName(v6, 0, SaveData_GetTrainerInfo(fieldSystem->saveData)); - StringTemplate_Format(v6, v7, v8); - StringList_AddFromString(menu->unk_24, v7, menu->options[i]); - - String_Free(v8); - String_Free(v7); - StringTemplate_Free(v6); + String_Free(fmtString); + String_Free(string); + StringTemplate_Free(template); } else { - StringList_AddFromMessageBank( - menu->unk_24, v2, sStartMenuActions[menu->options[i]].text, menu->options[i]); + StringList_AddFromMessageBank(menu->menuOptions, loader, sStartMenuActions[menu->options[i]].bankEntry, menu->options[i]); } if (fieldSystem->menuCursorPos == menu->options[i]) { - menu->unk_28 = i; + menu->cursorPos = i; } } - fieldSystem->menuCursorPos = menu->options[menu->unk_28]; - MessageLoader_Free(v2); + fieldSystem->menuCursorPos = menu->options[menu->cursorPos]; + MessageLoader_Free(loader); - v3.choices = menu->unk_24; - v3.window = &menu->unk_00; - v3.fontID = FONT_MESSAGE; - v3.xSize = 1; - v3.ySize = optionCount; - v3.lineSpacing = 8; - v3.suppressCursor = TRUE; + MenuTemplate template; + template.choices = menu->menuOptions; + template.window = &menu->primaryWindow; + template.fontID = FONT_MESSAGE; + template.xSize = 1; + template.ySize = optionCount; + template.lineSpacing = 8; + template.suppressCursor = TRUE; if (optionCount >= 4) { - v3.loopAround = TRUE; + template.loopAround = TRUE; } else { - v3.loopAround = FALSE; + template.loopAround = FALSE; } - menu->unk_20 = Menu_New(&v3, 28, 4, menu->unk_28, HEAP_ID_FIELD2, PAD_BUTTON_B | PAD_BUTTON_X); + menu->menu = Menu_New(&template, 28, 4, menu->cursorPos, HEAP_ID_FIELD2, PAD_BUTTON_B | PAD_BUTTON_X); - Window_ScheduleCopyToVRAM(&menu->unk_00); - sub_0203B318(menu, menu->options, optionCount, TrainerInfo_Gender(SaveData_GetTrainerInfo(fieldSystem->saveData))); + Window_ScheduleCopyToVRAM(&menu->primaryWindow); + StartMenu_InitSprites(menu, menu->options, optionCount, TrainerInfo_Gender(SaveData_GetTrainerInfo(fieldSystem->saveData))); } -static u32 StartMenu_MakeList(StartMenu *menu, u8 *ret) +#define ADD_OPTION_IF_NOT_HIDDEN(__menuOption, __hideFlag) \ + do { \ + if (!(menu->hideOptionFlags & __hideFlag)) { \ + listOut[optionCount] = __menuOption; \ + optionCount++; \ + } \ + } while (0) + +static u32 StartMenu_MakeOptionList(StartMenu *menu, u8 *listOut) { u32 optionCount = 0; - - if ((menu->hideOptionFlags & HIDE_OPTION_RETIRE) == FALSE) { - ret[optionCount] = MENU_POS_RETIRE; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_CHAT) == FALSE) { - ret[optionCount] = MENU_POS_CHAT; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_POKEDEX) == FALSE) { - ret[optionCount] = MENU_POS_POKEDEX; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_POKEMON) == FALSE) { - ret[optionCount] = MENU_POS_POKEMON; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_BAG) == FALSE) { - ret[optionCount] = MENU_POS_BAG; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_TRAINER_CARD) == FALSE) { - ret[optionCount] = MENU_POS_TRAINER_CARD; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_SAVE) == FALSE) { - ret[optionCount] = MENU_POS_SAVE; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_OPTIONS) == FALSE) { - ret[optionCount] = MENU_POS_OPTIONS; - optionCount++; - } - - if ((menu->hideOptionFlags & HIDE_OPTION_EXIT) == FALSE) { - ret[optionCount] = MENU_POS_EXIT; - optionCount++; - } - + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_RETIRE, HIDE_OPTION_RETIRE); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_CHAT, HIDE_OPTION_CHAT); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_POKEDEX, HIDE_OPTION_POKEDEX); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_POKEMON, HIDE_OPTION_POKEMON); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_BAG, HIDE_OPTION_BAG); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_TRAINER_CARD, HIDE_OPTION_TRAINER_CARD); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_SAVE, HIDE_OPTION_SAVE); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_OPTIONS, HIDE_OPTION_OPTIONS); + ADD_OPTION_IF_NOT_HIDDEN(START_MENU_OPTION_EXIT, HIDE_OPTION_EXIT); return optionCount; } static void StartMenu_Close(StartMenu *menu) { - sub_0203B4E8(menu); - Menu_Free(menu->unk_20, NULL); - StringList_Free(menu->unk_24); + StartMenu_FreeSprites(menu); + Menu_Free(menu->menu, NULL); + StringList_Free(menu->menuOptions); - menu->unk_20 = NULL; + menu->menu = NULL; } -static void sub_0203B094(FieldTask *taskMan) +static void StartMenu_PrintBallCount(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - MessageLoader *v2; - StringTemplate *v3; - String *v4; - String *v5; - u8 v6; - - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + BOOL inPalPark; if (SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - v6 = 0; + inPalPark = FALSE; } else if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - v6 = 1; + inPalPark = TRUE; } else { return; } - Window_Add(fieldSystem->bgConfig, &menu->unk_10, 3, 1, 1, 12, 4, 13, ((1024 - (18 + 12) - 9 - (32 * 8)) - (18 + 12 + 24)) - (27 * 4)); - LoadStandardWindowGraphics(fieldSystem->bgConfig, BG_LAYER_MAIN_3, 1024 - (18 + 12) - 9, 11, 1, HEAP_ID_FIELD2); - Window_DrawStandardFrame(&menu->unk_10, 1, 1024 - (18 + 12) - 9, 11); - Window_FillTilemap(&menu->unk_10, 15); + Window_Add(fieldSystem->bgConfig, &menu->secondaryWindow, BG_LAYER_MAIN_3, 1, 1, 12, 4, 13, BASE_TILE_MESSAGE_WINDOW); + LoadStandardWindowGraphics(fieldSystem->bgConfig, BG_LAYER_MAIN_3, BASE_TILE_STANDARD_WINDOW_FRAME, 11, STANDARD_WINDOW_FIELD, HEAP_ID_FIELD2); + Window_DrawStandardFrame(&menu->secondaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + Window_FillTilemap(&menu->secondaryWindow, 15); - v2 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_START_MENU, HEAP_ID_FIELD2); + MessageLoader *loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_START_MENU, HEAP_ID_FIELD2); - if (v6 == 0) { - v5 = MessageLoader_GetNewString(v2, 9); + String *string; + // doesn't match as !inPalPark + if (inPalPark == FALSE) { + string = MessageLoader_GetNewString(loader, StartMenu_Text_SafariBalls); } else { - v5 = MessageLoader_GetNewString(v2, 10); + string = MessageLoader_GetNewString(loader, StartMenu_Text_ParkBalls); } - Text_AddPrinterWithParams(&menu->unk_10, FONT_SYSTEM, v5, 0, 0, TEXT_SPEED_NO_TRANSFER, NULL); - String_Free(v5); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, string, 0, 0, TEXT_SPEED_NO_TRANSFER, NULL); + String_Free(string); - v3 = StringTemplate_Default(HEAP_ID_FIELD2); - v4 = String_Init(32, HEAP_ID_FIELD2); - v5 = MessageLoader_GetNewString(v2, 11); + StringTemplate *template = StringTemplate_Default(HEAP_ID_FIELD2); + String *countString = String_Init(32, HEAP_ID_FIELD2); + String *fmtString = MessageLoader_GetNewString(loader, StartMenu_Text_BallStock); - if (v6 == 0) { - u16 *v7 = FieldOverworldState_GetSafariBallCount(SaveData_GetFieldOverworldState(fieldSystem->saveData)); + if (!inPalPark) { + u16 *safariBallCount = FieldOverworldState_GetSafariBallCount(SaveData_GetFieldOverworldState(fieldSystem->saveData)); - StringTemplate_SetNumber(v3, 0, *v7, 2, 0, 1); + StringTemplate_SetNumber(template, 0, *safariBallCount, 2, PADDING_MODE_NONE, CHARSET_MODE_EN); } else { int parkBallCount = FieldSystem_GetParkBallCount(fieldSystem); - StringTemplate_SetNumber(v3, 0, parkBallCount, 2, 0, 1); + StringTemplate_SetNumber(template, 0, parkBallCount, 2, PADDING_MODE_NONE, CHARSET_MODE_EN); } - StringTemplate_Format(v3, v4, v5); - Text_AddPrinterWithParams(&menu->unk_10, FONT_SYSTEM, v4, 0, 16, TEXT_SPEED_NO_TRANSFER, NULL); + StringTemplate_Format(template, countString, fmtString); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, countString, 0, 16, TEXT_SPEED_NO_TRANSFER, NULL); - String_Free(v4); - String_Free(v5); - StringTemplate_Free(v3); - MessageLoader_Free(v2); - Window_ScheduleCopyToVRAM(&menu->unk_10); + String_Free(countString); + String_Free(fmtString); + StringTemplate_Free(template); + MessageLoader_Free(loader); + Window_ScheduleCopyToVRAM(&menu->secondaryWindow); } -static void sub_0203B200(FieldTask *taskMan) +static void StartMenu_EraseBallCount(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - if ((SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == FALSE) - && (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData)) == FALSE)) { + if (!SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) + && !SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldSystem->saveData))) { return; } - Window_EraseStandardFrame(&menu->unk_10, 1); - Window_Remove(&menu->unk_10); + Window_EraseStandardFrame(&menu->secondaryWindow, TRUE); + Window_Remove(&menu->secondaryWindow); } -static BOOL StartMenu_Select(FieldTask *taskMan) +static BOOL StartMenu_Select(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - u16 v2; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + u16 prevPos = Menu_GetCursorPos(menu->menu); - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); - v2 = Menu_GetCursorPos(menu->unk_20); + menu->input = Menu_ProcessInputWithSound(menu->menu, SEQ_SE_DP_SELECT78); + menu->cursorPos = Menu_GetCursorPos(menu->menu); - menu->unk_2C = Menu_ProcessInputWithSound(menu->unk_20, 1504); - menu->unk_28 = Menu_GetCursorPos(menu->unk_20); - - if (v2 != menu->unk_28) { - sub_0203B558(menu->unk_200[0]->sprite, menu->unk_28); - sub_0203B5B4(menu, v2, menu->unk_28); - fieldSystem->menuCursorPos = menu->options[menu->unk_28]; + if (prevPos != menu->cursorPos) { + StartMenu_SetCursorPos(menu->sprites[CURSOR_SPRITE_INDEX]->sprite, menu->cursorPos); + StartMenu_ChangeActiveMenuIcon(menu, prevPos, menu->cursorPos); + fieldSystem->menuCursorPos = menu->options[menu->cursorPos]; } - sub_0203B5E8(menu->unk_200[1 + menu->unk_28]->sprite); + StartMenu_TryTransitionIconAnimationToWiggle(menu->sprites[menu->cursorPos + 1]->sprite); - switch (menu->unk_2C) { - case START_MENU_NO_ACTION: + switch (menu->input) { + case MENU_NOTHING_CHOSEN: break; - case START_MENU_EXIT_ACTION: + case MENU_CANCEL: menu->state = START_MENU_STATE_END; break; default: - if ((u32)sStartMenuActions[menu->unk_2C].task == START_MENU_EXIT_ACTION) { + if ((u32)sStartMenuActions[menu->input].callback == MENU_CANCEL) { menu->state = START_MENU_STATE_END; - } else if ((u32)sStartMenuActions[menu->unk_2C].task != START_MENU_NO_ACTION) { - FieldTaskFunc actionTask = sStartMenuActions[menu->unk_2C].task; - return actionTask(taskMan); + } else if ((u32)sStartMenuActions[menu->input].callback != MENU_NOTHING_CHOSEN) { + FieldTaskFunc actionTask = sStartMenuActions[menu->input].callback; + return actionTask(fieldTask); } } @@ -774,7 +721,7 @@ static BOOL StartMenu_Select(FieldTask *taskMan) static void sub_0203B2EC(StartMenu *menu, FieldSystem *fieldSystem) { if (CommServerClient_IsInitialized()) { - if (menu->unk_228) { + if (menu->inUnionRoom) { sub_0205C2B0(fieldSystem->unk_80); sub_02036AC4(); @@ -783,143 +730,137 @@ static void sub_0203B2EC(StartMenu *menu, FieldSystem *fieldSystem) } } -static void sub_0203B318(StartMenu *menu, u8 *options, u32 optionCount, u8 gender) +static void StartMenu_InitSprites(StartMenu *menu, u8 *options, u32 optionCount, u8 gender) { - SpriteResourceCapacities v0 = { - 8, 1, 2, 2, 0, 0 + SpriteResourceCapacities capacities = { + .asStruct = { + .charCapacity = 8, + .plttCapacity = 1, + .cellCapacity = 2, + .animCapacity = 2, + .mcellCapacity = 0, + .manimCapacity = 0, + } }; - u32 i; - SpriteResourceManager_SetCapacities(&menu->spriteManager, &v0, 7 + 1, HEAP_ID_FIELD2); + SpriteResourceManager_SetCapacities(&menu->spriteManager, &capacities, MAX_START_MENU_OPTIONS + 1, HEAP_ID_FIELD2); NARC *narc = NARC_ctor(NARC_INDEX_GRAPHIC__MENU_GRA, HEAP_ID_FIELD2); - SpriteResourceManager_LoadPalette(&menu->spriteManager, narc, menu_NCLR, 0, 2, NNS_G2D_VRAM_TYPE_2DMAIN, 13528); - SpriteResourceManager_LoadCell(&menu->spriteManager, narc, cursor_cell_NCER, 0, 13528); - SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, cursor_anim_NANR, 0, 13528); - SpriteResourceManager_LoadTiles(&menu->spriteManager, narc, cursor_NCGR, 0, NNS_G2D_VRAM_TYPE_2DMAIN, 13528); + SpriteResourceManager_LoadPalette(&menu->spriteManager, narc, menu_NCLR, FALSE, 2, NNS_G2D_VRAM_TYPE_2DMAIN, 13528); + SpriteResourceManager_LoadCell(&menu->spriteManager, narc, cursor_cell_NCER, FALSE, 13528); + SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, cursor_anim_NANR, FALSE, 13528); + SpriteResourceManager_LoadTiles(&menu->spriteManager, narc, cursor_NCGR, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 13528); - menu->unk_200[0] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &Unk_020EA0A4[0]); + menu->sprites[CURSOR_SPRITE_INDEX] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &sSpriteTemplates[CURSOR_TEMPLATE]); - sub_0203B558(menu->unk_200[0]->sprite, menu->unk_28); + StartMenu_SetCursorPos(menu->sprites[CURSOR_SPRITE_INDEX]->sprite, menu->cursorPos); - SpriteResourceManager_LoadCell(&menu->spriteManager, narc, icons_cell_NCER, 0, 13529); - SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, icons_anim_NANR, 0, 13529); - SpriteResourceManager_LoadTiles(&menu->spriteManager, narc, icons_NCGR, 0, NNS_G2D_VRAM_TYPE_2DMAIN, 13529); + SpriteResourceManager_LoadCell(&menu->spriteManager, narc, icons_cell_NCER, FALSE, 13529); + SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, icons_anim_NANR, FALSE, 13529); + SpriteResourceManager_LoadTiles(&menu->spriteManager, narc, icons_NCGR, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 13529); - for (i = 0; i < optionCount; i++) { - SpriteTemplate v3; + for (u32 i = 0; i < optionCount; i++) { + SpriteTemplate template; - v3 = Unk_020EA0A4[1]; - v3.y += 24 * i; + template = sSpriteTemplates[ICON_TEMPLATE]; + template.y += 24 * i; - if ((options[i] == MENU_POS_BAG) && (gender == GENDER_FEMALE)) { - v3.animIdx = 9 * 3; + if (options[i] == START_MENU_OPTION_BAG && gender == GENDER_FEMALE) { + template.animIdx = 9 * ICON_ANIM_COUNT; } else { - v3.animIdx = options[i] * 3; + template.animIdx = options[i] * ICON_ANIM_COUNT; } - menu->unk_200[1 + i] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &v3); + menu->sprites[i + 1] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &template); - { - VecFx32 v4 = { FX32_ONE, FX32_ONE, FX32_ONE }; - Sprite_SetAffineScaleEx(menu->unk_200[1 + i]->sprite, &v4, 1); - } + VecFx32 scale = { FX32_ONE, FX32_ONE, FX32_ONE }; + Sprite_SetAffineScaleEx(menu->sprites[i + 1]->sprite, &scale, AFFINE_OVERWRITE_MODE_NORMAL); } - sub_0203B588(menu->unk_200[1 + menu->unk_28]->sprite, 2, 1); + StartMenu_SetIconAnimationAndPalette(menu->sprites[menu->cursorPos + 1]->sprite, ICON_ANIM_WIGGLE, PALETTE_COLORED); + menu->spriteCount = optionCount + 1; + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); - menu->unk_220 = optionCount + 1; - - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); NARC_dtor(narc); } -static void sub_0203B4E8(StartMenu *menu) +static void StartMenu_FreeSprites(StartMenu *menu) { - u16 i; - - for (i = 0; i < menu->unk_220; i++) { - Sprite_DeleteAndFreeResources(menu->unk_200[i]); + for (u16 i = 0; i < menu->spriteCount; i++) { + Sprite_DeleteAndFreeResources(menu->sprites[i]); } SpriteResourceManager_Cleanup(&menu->spriteManager); } -static void sub_0203B520(StartMenu *menu) +static void StartMenu_AnimateSprites(StartMenu *menu) { - u16 i; - - for (i = 0; i < menu->unk_220; i++) { - Sprite_UpdateAnim(menu->unk_200[i]->sprite, FX32_ONE); + for (u16 i = 0; i < menu->spriteCount; i++) { + Sprite_UpdateAnim(menu->sprites[i]->sprite, FX32_ONE); } } -static void sub_0203B558(Sprite *graphicElement, u32 param1) +static void StartMenu_SetCursorPos(Sprite *sprite, u32 pos) { - VecFx32 vec; + VecFx32 position = *(Sprite_GetPosition(sprite)); + position.y = (20 + 24 * pos) * FX32_ONE; - vec = *(Sprite_GetPosition(graphicElement)); - vec.y = (20 + 24 * param1) * FX32_ONE; - - Sprite_SetPosition(graphicElement, &vec); + Sprite_SetPosition(sprite, &position); } -static void sub_0203B588(Sprite *graphicElement, u16 param1, u16 param2) +static void StartMenu_SetIconAnimationAndPalette(Sprite *sprite, u16 anim, u16 palette) { - u32 v0 = Sprite_GetActiveAnim(graphicElement); + u32 activeAnimID = Sprite_GetActiveAnim(sprite); - Sprite_SetAnim(graphicElement, (v0 / 3) * 3 + param1); - Sprite_SetExplicitPaletteWithOffset(graphicElement, param2); + Sprite_SetAnim(sprite, (activeAnimID / 3) * 3 + anim); + Sprite_SetExplicitPaletteWithOffset(sprite, palette); } -static void sub_0203B5B4(StartMenu *menu, u16 param1, u16 param2) +static void StartMenu_ChangeActiveMenuIcon(StartMenu *menu, u16 oldIndex, u16 index) { - sub_0203B588(menu->unk_200[1 + param1]->sprite, 0, 0); - sub_0203B588(menu->unk_200[1 + param2]->sprite, 1, 1); + StartMenu_SetIconAnimationAndPalette(menu->sprites[oldIndex + 1]->sprite, ICON_ANIM_NONE, PALETTE_GRAYSCALE); + StartMenu_SetIconAnimationAndPalette(menu->sprites[index + 1]->sprite, ICON_ANIM_SWELL, PALETTE_COLORED); } -static void sub_0203B5E8(Sprite *graphicElement) +static void StartMenu_TryTransitionIconAnimationToWiggle(Sprite *sprite) { - if ((Sprite_GetActiveAnim(graphicElement) % 3) != 1) { + if ((Sprite_GetActiveAnim(sprite) % ICON_ANIM_COUNT) != ICON_ANIM_SWELL) { return; } - if (Sprite_IsAnimated(graphicElement) == 0) { - sub_0203B588(graphicElement, 2, 1); + if (!Sprite_IsAnimated(sprite)) { + StartMenu_SetIconAnimationAndPalette(sprite, ICON_ANIM_WIGGLE, PALETTE_COLORED); } } -static void StartMenu_ApplicationStart(FieldTask *taskMan) +static void StartMenu_ApplicationStart(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - - if (IsScreenFadeDone() == FALSE) { + if (!IsScreenFadeDone()) { return; } - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); StartMenu_Close(menu); - Window_Remove(&menu->unk_00); - sub_0203B200(taskMan); + Window_Remove(&menu->primaryWindow); + StartMenu_EraseBallCount(fieldTask); - menu->callback(taskMan); + menu->callback(fieldTask); menu->state = START_MENU_STATE_APP_RUN; } -static void StartMenu_ApplicationRun(FieldTask *taskMan) +static void StartMenu_ApplicationRun(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); if (FieldSystem_IsRunningApplication(fieldSystem)) { return; } - menu->callback(taskMan); + menu->callback(fieldTask); } void StartMenu_SetCallback(StartMenu *menu, void *callback) @@ -928,9 +869,9 @@ void StartMenu_SetCallback(StartMenu *menu, void *callback) menu->state = START_MENU_STATE_APP_RUN; } -static BOOL StartMenu_SelectPokedex(FieldTask *taskMan) +static BOOL StartMenu_SelectPokedex(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); @@ -940,10 +881,10 @@ static BOOL StartMenu_SelectPokedex(FieldTask *taskMan) return TRUE; } -static BOOL StartMenu_OpenPokedex(FieldTask *taskMan) +static BOOL StartMenu_OpenPokedex(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); PokedexOverlayArgs *pokedexArgs = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokedexOverlayArgs)); Pokedex *pokedex = SaveData_GetPokedex(fieldSystem->saveData); TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(fieldSystem->saveData); @@ -958,7 +899,7 @@ static BOOL StartMenu_OpenPokedex(FieldTask *taskMan) pokedexArgs->seabreakPathVisible = SystemVars_CheckHiddenLocation(varsFlags, HIDDEN_LOCATION_SEABREAK_PATH); pokedexArgs->pokedexMemory = fieldSystem->pokedexMemory; - sub_0203E0AC(fieldSystem, pokedexArgs); + FieldSystem_OpenPokedex(fieldSystem, pokedexArgs); menu->taskData = pokedexArgs; menu->callback = StartMenu_ExitPokedex; @@ -966,10 +907,10 @@ static BOOL StartMenu_OpenPokedex(FieldTask *taskMan) return FALSE; } -static BOOL StartMenu_ExitPokedex(FieldTask *taskMan) +static BOOL StartMenu_ExitPokedex(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldSystem_StartFieldMap(fieldSystem); @@ -977,14 +918,14 @@ static BOOL StartMenu_ExitPokedex(FieldTask *taskMan) Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); } - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; - return 0; + return FALSE; } -static BOOL StartMenu_SelectPokemon(FieldTask *taskMan) +static BOOL StartMenu_SelectPokemon(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); @@ -994,29 +935,31 @@ static BOOL StartMenu_SelectPokemon(FieldTask *taskMan) return TRUE; } -static BOOL StartMenu_OpenPartyMenu(FieldTask *taskMan) +static BOOL StartMenu_OpenPartyMenu(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, 0); menu->callback = StartMenu_ExitPartyMenu; - return 0; + return FALSE; } -BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan) +BOOL StartMenu_ExitPartyMenu(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); PartyMenu *partyMenu = (PartyMenu *)Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); memcpy(partyMenu, menu->taskData, sizeof(PartyMenu)); Heap_Free(menu->taskData); + PokemonSummary *summary; + MenuEvolutionData *evoData; switch (partyMenu->menuSelectionResult) { - case PARTY_MENU_EXIT_CODE_SUMMARY: { - PokemonSummary *summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); + case PARTY_MENU_EXIT_CODE_SUMMARY: + summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); summary->monData = SaveData_GetParty(fieldSystem->saveData); summary->options = SaveData_GetOptions(fieldSystem->saveData); @@ -1030,15 +973,15 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan) summary->showContest = PokemonSummaryScreen_ShowContestData(fieldSystem->saveData); summary->chatotCry = NULL; - PokemonSummaryScreen_FlagVisiblePages(summary, Unk_020EA02C); + PokemonSummaryScreen_FlagVisiblePages(summary, gAllSummaryScreenPages); PokemonSummaryScreen_SetPlayerProfile(summary, SaveData_GetTrainerInfo(fieldSystem->saveData)); FieldSystem_OpenSummaryScreen(fieldSystem, summary); menu->taskData = summary; StartMenu_SetCallback(menu, StartMenu_ExitSummary); - } break; - case PARTY_MENU_EXIT_CODE_LEARNED_MOVE: { - PokemonSummary *summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); + break; + case PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_TM_HM: + summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); summary->monData = SaveData_GetParty(fieldSystem->saveData); summary->options = SaveData_GetOptions(fieldSystem->saveData); @@ -1051,21 +994,21 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan) summary->showContest = PokemonSummaryScreen_ShowContestData(fieldSystem->saveData); summary->chatotCry = NULL; - PokemonSummaryScreen_FlagVisiblePages(summary, Unk_020EA01C); + PokemonSummaryScreen_FlagVisiblePages(summary, sOnlyMovePages); PokemonSummaryScreen_SetPlayerProfile(summary, SaveData_GetTrainerInfo(fieldSystem->saveData)); FieldSystem_OpenSummaryScreen(fieldSystem, summary); - UnkStruct_0203C1C8 *v5 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C1C8)); + MenuOverwriteMoveData *tmhmOverwriteData = Heap_Alloc(HEAP_ID_FIELD2, sizeof(MenuOverwriteMoveData)); - v5->unk_00 = partyMenu->usedItemID; - v5->unk_02 = 0; - menu->unk_260 = v5; + tmhmOverwriteData->usedItemID = partyMenu->usedItemID; + tmhmOverwriteData->levelUpMoveIndex = 0; + menu->additionalTaskContext = tmhmOverwriteData; menu->taskData = summary; StartMenu_SetCallback(menu, StartMenu_ExitSummary); - } break; - case PARTY_MENU_EXIT_CODE_FORGET_MOVE: { - PokemonSummary *summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); + break; + case PARTY_MENU_EXIT_CODE_OVERWRITE_MOVE_LEVEL_UP: + summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); summary->monData = SaveData_GetParty(fieldSystem->saveData); summary->options = SaveData_GetOptions(fieldSystem->saveData); @@ -1078,116 +1021,110 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan) summary->showContest = PokemonSummaryScreen_ShowContestData(fieldSystem->saveData); summary->chatotCry = NULL; - PokemonSummaryScreen_FlagVisiblePages(summary, Unk_020EA01C); + PokemonSummaryScreen_FlagVisiblePages(summary, sOnlyMovePages); PokemonSummaryScreen_SetPlayerProfile(summary, SaveData_GetTrainerInfo(fieldSystem->saveData)); FieldSystem_OpenSummaryScreen(fieldSystem, summary); - UnkStruct_0203C1C8 *v7 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C1C8)); + MenuOverwriteMoveData *levelUpOverwriteData = Heap_Alloc(HEAP_ID_FIELD2, sizeof(MenuOverwriteMoveData)); - v7->unk_00 = 0; - v7->unk_02 = (u16)partyMenu->unk_34; - menu->unk_260 = v7; + levelUpOverwriteData->usedItemID = ITEM_NONE; + levelUpOverwriteData->levelUpMoveIndex = (u16)partyMenu->levelUpMoveIndex; + menu->additionalTaskContext = levelUpOverwriteData; menu->taskData = summary; StartMenu_SetCallback(menu, StartMenu_ExitSummary); - } break; - case PARTY_MENU_EXIT_CODE_MAIL: { - UnkStruct_02097728 *v8; - - v8 = sub_0203D920(fieldSystem, 2, partyMenu->selectedMonSlot, Item_MailNumber(partyMenu->usedItemID), HEAP_ID_FIELD2); + break; + case PARTY_MENU_EXIT_CODE_MAIL: + UnkStruct_02097728 *v8 = sub_0203D920(fieldSystem, 2, partyMenu->selectedMonSlot, Item_MailNumber(partyMenu->usedItemID), HEAP_ID_FIELD2); menu->taskData = v8; if (partyMenu->mode == PARTY_MENU_MODE_GIVE_ITEM_DONE) { - menu->unk_260 = sub_0203C540( - partyMenu->usedItemID, 0, partyMenu->selectedMonSlot); + menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 0, partyMenu->selectedMonSlot); } else { - menu->unk_260 = sub_0203C540( - partyMenu->usedItemID, 1, partyMenu->selectedMonSlot); + menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 1, partyMenu->selectedMonSlot); } StartMenu_SetCallback(menu, StartMenu_ExitMail); - } break; - case PARTY_MENU_EXIT_CODE_READ_MAIL: { - UnkStruct_02097728 *v9; - Pokemon *v10; - - v10 = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), partyMenu->selectedMonSlot); - v9 = sub_0203D984(fieldSystem, v10, HEAP_ID_FIELD2); + break; + case PARTY_MENU_EXIT_CODE_READ_MAIL: + Pokemon *mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), partyMenu->selectedMonSlot); + UnkStruct_02097728 *v9 = sub_0203D984(fieldSystem, mon, HEAP_ID_FIELD2); menu->taskData = v9; - menu->unk_260 = sub_0203C540(partyMenu->usedItemID, 2, partyMenu->selectedMonSlot); + menu->additionalTaskContext = sub_0203C540(partyMenu->usedItemID, 2, partyMenu->selectedMonSlot); StartMenu_SetCallback(menu, StartMenu_ExitMail); - } break; - case PARTY_MENU_EXIT_CODE_GIVE_ITEM: { - u32 *v13 = (u32 *)Heap_Alloc(HEAP_ID_FIELD2, 4); - *v13 = partyMenu->selectedMonSlot; - menu->unk_260 = (void *)v13; + break; + case PARTY_MENU_EXIT_CODE_GIVE_ITEM: + u32 *slot = (u32 *)Heap_Alloc(HEAP_ID_FIELD2, sizeof(u32)); + *slot = partyMenu->selectedMonSlot; + menu->additionalTaskContext = (void *)slot; Bag *bag = SaveData_GetBag(fieldSystem->saveData); - TrainerInfo *v12 = SaveData_GetTrainerInfo(fieldSystem->saveData); - menu->taskData = BagContext_CreateWithPockets(bag, Unk_020EA020, HEAP_ID_FIELD2); + TrainerInfo *unused = SaveData_GetTrainerInfo(fieldSystem->saveData); - BagContext_Init(menu->taskData, fieldSystem->saveData, 1, fieldSystem->bagCursor); + menu->taskData = BagContext_CreateWithPockets(bag, sAllPockets, HEAP_ID_FIELD2); + + BagContext_Init(menu->taskData, fieldSystem->saveData, BAG_MODE_GIVE_TO_MON, fieldSystem->bagCursor); sub_0203D1E4(fieldSystem, menu->taskData); StartMenu_SetCallback(menu, StartMenu_ExitBag); - } break; - case PARTY_MENU_EXIT_CODE_EVOLVE_BY_ITEM: { - UnkStruct_0203C7B8 *v14 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C7B8)); + break; + case PARTY_MENU_EXIT_CODE_EVOLVE_BY_ITEM: + evoData = Heap_Alloc(HEAP_ID_FIELD2, sizeof(MenuEvolutionData)); - v14->unk_02 = partyMenu->usedItemID; - v14->unk_01 = 3; - v14->unk_00 = partyMenu->selectedMonSlot; - v14->unk_04 = partyMenu->evoTargetSpecies; - v14->unk_08 = partyMenu->evoType; + evoData->dummy = partyMenu->usedItemID; + evoData->class = EVO_CLASS_BY_ITEM; + evoData->slot = partyMenu->selectedMonSlot; + evoData->targetSpecies = partyMenu->evoTargetSpecies; + evoData->method = partyMenu->evoType; - menu->taskData = v14; + menu->taskData = evoData; menu->state = START_MENU_STATE_EVOLVE_INIT; - } break; - case PARTY_MENU_EXIT_CODE_EVOLVE_BY_LEVEL: { - UnkStruct_0203C7B8 *v15 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C7B8)); + break; + case PARTY_MENU_EXIT_CODE_EVOLVE_BY_LEVEL: + evoData = Heap_Alloc(HEAP_ID_FIELD2, sizeof(MenuEvolutionData)); - v15->unk_02 = MapHeader_GetMapEvolutionMethod(fieldSystem->location->mapId); - v15->unk_01 = 0; - v15->unk_00 = partyMenu->selectedMonSlot; - v15->unk_04 = partyMenu->evoTargetSpecies; - v15->unk_08 = partyMenu->evoType; - menu->taskData = v15; + evoData->dummy = MapHeader_GetMapEvolutionMethod(fieldSystem->location->mapId); + evoData->class = EVO_CLASS_BY_LEVEL; + evoData->slot = partyMenu->selectedMonSlot; + evoData->targetSpecies = partyMenu->evoTargetSpecies; + evoData->method = partyMenu->evoType; + menu->taskData = evoData; menu->state = START_MENU_STATE_EVOLVE_INIT; - } break; - case PARTY_MENU_EXIT_CODE_ROCK_SMASH: + break; + case PARTY_MENU_EXIT_CODE_CUT: case PARTY_MENU_EXIT_CODE_FLY: - case PARTY_MENU_EXIT_CODE_DEFOG: - case PARTY_MENU_EXIT_CODE_STRENGTH: case PARTY_MENU_EXIT_CODE_SURF: - case PARTY_MENU_EXIT_CODE_ROCK_CLIMB: + case PARTY_MENU_EXIT_CODE_STRENGTH: + case PARTY_MENU_EXIT_CODE_DEFOG: + case PARTY_MENU_EXIT_CODE_ROCK_SMASH: case PARTY_MENU_EXIT_CODE_WATERFALL: + case PARTY_MENU_EXIT_CODE_ROCK_CLIMB: case PARTY_MENU_EXIT_CODE_FLASH: case PARTY_MENU_EXIT_CODE_TELEPORT: case PARTY_MENU_EXIT_CODE_DIG: case PARTY_MENU_EXIT_CODE_SWEET_SCENT: case PARTY_MENU_EXIT_CODE_CHATTER: - FieldMoveTaskContext v16; FieldMovePokemon fieldMoveMon; - fieldMoveMon.fieldMove = partyMenu->menuSelectionResult - 11; + fieldMoveMon.fieldMove = partyMenu->menuSelectionResult - PARTY_MENU_EXIT_CODE_CUT; fieldMoveMon.fieldMonId = partyMenu->selectedMonSlot; - fieldMoveMon.fieldTask = taskMan; + fieldMoveMon.fieldTask = fieldTask; - v16 = (FieldMoveTaskContext)FieldMove_GetTaskOrError(FIELD_MOVE_TASK, fieldMoveMon.fieldMove); - v16(&fieldMoveMon, &menu->fieldMoveContext); + FieldMoveTask task = (FieldMoveTask)FieldMove_GetTaskOrError(FIELD_MOVE_TASK, fieldMoveMon.fieldMove); + task(&fieldMoveMon, &menu->fieldMoveContext); break; case PARTY_MENU_EXIT_CODE_RETURN_TO_BAG: - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); break; default: - if ((partyMenu->mode == PARTY_MENU_MODE_USE_ITEM) || (partyMenu->mode == PARTY_MENU_MODE_TEACH_MOVE) || (partyMenu->mode == PARTY_MENU_MODE_TEACH_MOVE_DONE) || (partyMenu->mode == PARTY_MENU_MODE_USE_EVO_ITEM) || (partyMenu->mode == PARTY_MENU_MODE_LEVEL_MOVE_DONE)) { - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + if (partyMenu->mode == PARTY_MENU_MODE_USE_ITEM || partyMenu->mode == PARTY_MENU_MODE_TEACH_MOVE || partyMenu->mode == PARTY_MENU_MODE_TEACH_MOVE_DONE || partyMenu->mode == PARTY_MENU_MODE_USE_EVO_ITEM || partyMenu->mode == PARTY_MENU_MODE_LEVEL_MOVE_DONE) { + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); - if (partyMenu->selectedMonSlot >= 6) { + if (partyMenu->selectedMonSlot >= MAX_PARTY_SIZE) { BagContext_SetSelectedMonSlot(menu->taskData, 0); } else { BagContext_SetSelectedMonSlot(menu->taskData, partyMenu->selectedMonSlot); @@ -1195,22 +1132,22 @@ BOOL StartMenu_ExitPartyMenu(FieldTask *taskMan) StartMenu_SetCallback(menu, StartMenu_ExitBag); } else if (partyMenu->mode == PARTY_MENU_MODE_GIVE_ITEM) { - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); } else { FieldSystem_StartFieldMap(fieldSystem); - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; } } Heap_Free(partyMenu); - return 0; + return FALSE; } -static BOOL StartMenu_SelectBag(FieldTask *taskMan) +static BOOL StartMenu_SelectBag(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); @@ -1220,12 +1157,12 @@ static BOOL StartMenu_SelectBag(FieldTask *taskMan) return TRUE; } -static BOOL StartMenu_Bag(FieldTask *taskMan) +static BOOL StartMenu_Bag(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); BagContext_SetSelectedMonSlot(menu->taskData, 0); menu->callback = StartMenu_ExitBag; @@ -1234,32 +1171,30 @@ static BOOL StartMenu_Bag(FieldTask *taskMan) return FALSE; } -static BOOL StartMenu_ExitBag(FieldTask *taskMan) +static BOOL StartMenu_ExitBag(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); BagContext *bagCtx = BagContext_New(HEAP_ID_FIELD2); memcpy(bagCtx, menu->taskData, BagContext_GetSize()); Heap_Free(menu->taskData); switch (BagContext_GetExitCode(bagCtx)) { - case BAG_EXIT_CODE_USE_ITEM: { - ItemMenuUseFunc v3; - ItemMenuUseContext v4; - s32 v5; + case BAG_EXIT_CODE_USE_ITEM: + ItemMenuUseContext usageContext; - v4.item = BagContext_GetItem(bagCtx); - v4.selectedMonSlot = BagContext_GetSelectedMonSlot(bagCtx); - v4.fieldTask = taskMan; - v5 = Item_LoadParam(v4.item, ITEM_PARAM_FIELD_USE_FUNC, HEAP_ID_FIELD2); - v3 = (ItemMenuUseFunc)GetItemUseFunction(USE_ITEM_TASK_MENU, v5); - v3(&v4, &menu->unk_230); - } break; - case BAG_EXIT_CODE_SHOW_BERRY_DATA: - sub_0203C2D8(taskMan, BagContext_GetItem(bagCtx)); + usageContext.item = BagContext_GetItem(bagCtx); + usageContext.selectedMonSlot = BagContext_GetSelectedMonSlot(bagCtx); + usageContext.fieldTask = fieldTask; + s32 itemFuncIndex = Item_LoadParam(usageContext.item, ITEM_PARAM_FIELD_USE_FUNC, HEAP_ID_FIELD2); + ItemMenuUseFunc useItem = (ItemMenuUseFunc)ItemUseFunction_Get(ITEM_FUNC_USE_FROM_MENU, itemFuncIndex); + useItem(&usageContext, &menu->itemUseCtx); break; - case BAG_EXIT_CODE_GIVE_ITEM: { + case BAG_EXIT_CODE_CHECK_BERRY_TAG: + StartMenu_ShowBerryTag(fieldTask, BagContext_GetItem(bagCtx)); + break; + case BAG_EXIT_CODE_GIVE_ITEM: PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); memset(partyMenu, 0, sizeof(PartyMenu)); @@ -1276,22 +1211,19 @@ static BOOL StartMenu_ExitBag(FieldTask *taskMan) FieldSystem_StartChildProcess(fieldSystem, &gPokemonPartyAppTemplate, partyMenu); menu->taskData = partyMenu; StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); - } break; - case BAG_EXIT_CODE_GIVE_FROM_MON_MENU: { + break; + case BAG_EXIT_CODE_GIVE_FROM_MON_MENU: Party *party = SaveData_GetParty(fieldSystem->saveData); - u32 v9 = *(u32 *)menu->unk_260; + u32 slot = *(u32 *)menu->additionalTaskContext; u16 item = BagContext_GetItem(bagCtx); - Pokemon *v8 = Party_GetPokemonBySlotIndex(party, v9); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, slot); - Heap_Free(menu->unk_260); + Heap_Free(menu->additionalTaskContext); - if ((Item_IsMail(item) == TRUE) && (Pokemon_GetValue(v8, MON_DATA_HELD_ITEM, NULL) == 0)) { - UnkStruct_02097728 *v11; - UnkStruct_0203C540 *v12; - - v11 = sub_0203D920(fieldSystem, 2, v9, Item_MailNumber(item), HEAP_ID_FIELD2); + if (Item_IsMail(item) == TRUE && Pokemon_GetValue(mon, MON_DATA_HELD_ITEM, NULL) == ITEM_NONE) { + UnkStruct_02097728 *v11 = sub_0203D920(fieldSystem, 2, slot, Item_MailNumber(item), HEAP_ID_FIELD2); menu->taskData = v11; - menu->unk_260 = sub_0203C540(item, 0, (u8)v9); + menu->additionalTaskContext = sub_0203C540(item, 0, slot); StartMenu_SetCallback(menu, StartMenu_ExitMail); } else { PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); @@ -1304,7 +1236,7 @@ static BOOL StartMenu_ExitBag(FieldTask *taskMan) partyMenu->fieldMoveContext = &menu->fieldMoveContext; partyMenu->type = PARTY_MENU_TYPE_BASIC; partyMenu->usedItemID = BagContext_GetItem(bagCtx); - partyMenu->selectedMonSlot = v9; // Maybe selected slot? + partyMenu->selectedMonSlot = slot; partyMenu->fieldSystem = fieldSystem; if (partyMenu->usedItemID == ITEM_NONE) { @@ -1317,21 +1249,21 @@ static BOOL StartMenu_ExitBag(FieldTask *taskMan) menu->taskData = partyMenu; StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } - } break; + break; case BAG_EXIT_CODE_DONE: default: FieldSystem_StartFieldMap(fieldSystem); - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; } Heap_Free(bagCtx); - return 0; + return FALSE; } -static BOOL StartMenu_SelectTrainerCard(FieldTask *taskMan) +static BOOL StartMenu_SelectTrainerCard(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); @@ -1341,90 +1273,90 @@ static BOOL StartMenu_SelectTrainerCard(FieldTask *taskMan) return TRUE; } -static BOOL StartMenu_TrainerCard(FieldTask *taskMan) +static BOOL StartMenu_TrainerCard(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); menu->taskData = TrainerCard_New(HEAP_ID_FIELD2); TrainerCard_Init(TRUE, TRUE, 0, 0xFF, fieldSystem, (TrainerCard *)menu->taskData); FieldSystem_OpenTrainerCardScreen(fieldSystem, (TrainerCard *)menu->taskData); - menu->callback = sub_0203BF00; + menu->callback = StartMenu_ExitTrainerCard; return FALSE; } -static BOOL sub_0203BF00(FieldTask *taskMan) +static BOOL StartMenu_ExitTrainerCard(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); TrainerCard_SaveBadgePolish(fieldSystem, (TrainerCard *)menu->taskData); TrainerCard_Free((TrainerCard *)menu->taskData); FieldSystem_StartFieldMap(fieldSystem); - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; return FALSE; } -static BOOL StartMenu_SelectSave(FieldTask *taskMan) +static BOOL StartMenu_SelectSave(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); StartMenu_Close(menu); - Window_EraseStandardFrame(&menu->unk_00, 1); - Bg_ScheduleTilemapTransfer(menu->unk_00.bgConfig, menu->unk_00.bgLayer); - Window_Remove(&menu->unk_00); - sub_0203B200(taskMan); + Window_EraseStandardFrame(&menu->primaryWindow, TRUE); + Bg_ScheduleTilemapTransfer(menu->primaryWindow.bgConfig, menu->primaryWindow.bgLayer); + Window_Remove(&menu->primaryWindow); + StartMenu_EraseBallCount(fieldTask); menu->state = START_MENU_STATE_SAVE; return TRUE; } -static void StartMenu_Save(FieldTask *taskMan) +static void StartMenu_Save(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); SaveMenu *saveMenu; if (SaveData_OverwriteCheck(fieldSystem->saveData)) { - ScriptManager_Start(taskMan, SCRIPT_ID(COMMON_SCRIPTS, 34), NULL, NULL); + ScriptManager_Start(fieldTask, SCRIPT_ID(COMMON_SCRIPTS, 34), NULL, NULL); } else { menu->taskData = Heap_Alloc(HEAP_ID_FIELD3, sizeof(SaveMenu)); saveMenu = menu->taskData; - saveMenu->unk_04 = 0; + saveMenu->result = 0; - ScriptManager_Start(taskMan, SCRIPT_ID(COMMON_SCRIPTS, 5), NULL, &saveMenu->unk_04); + ScriptManager_Start(fieldTask, SCRIPT_ID(COMMON_SCRIPTS, 5), NULL, &saveMenu->result); } menu->state = START_MENU_STATE_SAVE_WAIT; } -static void StartMenu_SaveWait(FieldTask *taskMan) +static void StartMenu_SaveWait(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); SaveMenu *saveMenu = menu->taskData; if (SaveData_OverwriteCheck(fieldSystem->saveData)) { menu->state = START_MENU_STATE_INIT; } else { - if (saveMenu->unk_04 == 0) { + if (saveMenu->result == 0) { menu->state = START_MENU_STATE_INIT; } else { - menu->state = START_MENU_STATE_15; + menu->state = START_MENU_STATE_SAVED; } Heap_Free(saveMenu); } } -static BOOL StartMenu_SelectOptions(FieldTask *taskMan) +static BOOL StartMenu_SelectOptions(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); @@ -1434,69 +1366,66 @@ static BOOL StartMenu_SelectOptions(FieldTask *taskMan) return TRUE; } -static BOOL StartMenu_Options(FieldTask *taskMan) +static BOOL StartMenu_Options(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); menu->taskData = FieldSystem_OpenOptionsMenu(fieldSystem); - menu->callback = sub_0203C050; + menu->callback = StartMenu_ExitOptions; return FALSE; } -static BOOL sub_0203C050(FieldTask *taskMan) +static BOOL StartMenu_ExitOptions(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); Heap_Free(menu->taskData); FieldSystem_StartFieldMap(fieldSystem); - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; - return 0; + return FALSE; } -static BOOL StartMenu_SelectChat(FieldTask *taskMan) +static BOOL StartMenu_SelectChat(FieldTask *fieldTask) { - StartMenu *menu = FieldTask_GetEnv(taskMan); + StartMenu *menu = FieldTask_GetEnv(fieldTask); FieldMap_FadeScreen(FADE_TYPE_BRIGHTNESS_OUT); - menu->callback = sub_0203C0A0; + menu->callback = StartMenu_Chat; menu->state = START_MENU_STATE_APP_START; - return 1; + return TRUE; } -static BOOL sub_0203C0A0(FieldTask *taskMan) +static BOOL StartMenu_Chat(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - Sentence v2; - - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); menu->taskData = sub_0209747C(2, 0, fieldSystem->saveData, HEAP_ID_FIELD2); - sub_02014A9C(&v2, 4); - sub_02097500(menu->taskData, &v2); + Sentence sentence; + sub_02014A9C(&sentence, 4); + sub_02097500(menu->taskData, &sentence); sub_0203D874(fieldSystem, (UnkStruct_0209747C *)menu->taskData); - menu->callback = sub_0203C0F8; + menu->callback = StartMenu_ExitChat; - return 0; + return FALSE; } -static BOOL sub_0203C0F8(FieldTask *taskMan) +static BOOL StartMenu_ExitChat(FieldTask *fieldTask) { - Sentence sentence; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); if (sub_02097528(menu->taskData) == 0) { + Sentence sentence; sub_02097540(menu->taskData, &sentence); if (CommServerClient_IsInitialized()) { @@ -1506,50 +1435,50 @@ static BOOL sub_0203C0F8(FieldTask *taskMan) menu->state = START_MENU_STATE_8; } else { - menu->state = START_MENU_STATE_12; + menu->state = START_MENU_STATE_REINIT; } sub_020974EC((UnkStruct_0209747C *)menu->taskData); FieldSystem_StartFieldMap(fieldSystem); sub_0205C2B0(fieldSystem->unk_80); - return 0; + return FALSE; } -static BOOL StartMenu_SelectRetire(FieldTask *taskMan) +static BOOL StartMenu_SelectRetire(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); StartMenu_Close(menu); - Window_EraseStandardFrame(&menu->unk_00, 1); - Bg_ScheduleTilemapTransfer(menu->unk_00.bgConfig, menu->unk_00.bgLayer); - Window_Remove(&menu->unk_00); - sub_0203B200(taskMan); + Window_EraseStandardFrame(&menu->primaryWindow, TRUE); + Bg_ScheduleTilemapTransfer(menu->primaryWindow.bgConfig, menu->primaryWindow.bgLayer); + Window_Remove(&menu->primaryWindow); + StartMenu_EraseBallCount(fieldTask); if (SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldSystem->saveData)) == TRUE) { - ScriptManager_Change(taskMan, SCRIPT_ID(SAFARI_GAME, 21), NULL); + ScriptManager_Change(fieldTask, SCRIPT_ID(SAFARI_GAME, 21), NULL); } else { - ScriptManager_Change(taskMan, 4, NULL); + ScriptManager_Change(fieldTask, 4, NULL); } Heap_Free(menu); - return 0; + return FALSE; } -static BOOL StartMenu_ExitSummary(FieldTask *taskMan) +static BOOL StartMenu_ExitSummary(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); - PokemonSummary *v2 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + PokemonSummary *summary = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PokemonSummary)); - memcpy(v2, menu->taskData, sizeof(PokemonSummary)); + memcpy(summary, menu->taskData, sizeof(PokemonSummary)); Heap_Free(menu->taskData); - switch (v2->mode) { + switch (summary->mode) { case SUMMARY_MODE_SELECT_MOVE: { PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); - UnkStruct_0203C1C8 *v4 = menu->unk_260; + MenuOverwriteMoveData *overwriteData = menu->additionalTaskContext; memset(partyMenu, 0, sizeof(PartyMenu)); @@ -1561,173 +1490,158 @@ static BOOL StartMenu_ExitSummary(FieldTask *taskMan) partyMenu->type = PARTY_MENU_TYPE_BASIC; partyMenu->fieldSystem = fieldSystem; - if (v4->unk_00 != 0) { + if (overwriteData->usedItemID != ITEM_NONE) { partyMenu->mode = PARTY_MENU_MODE_TEACH_MOVE_DONE; - partyMenu->unk_34 = 0; + partyMenu->levelUpMoveIndex = 0; } else { partyMenu->mode = PARTY_MENU_MODE_LEVEL_MOVE_DONE; - partyMenu->unk_34 = v4->unk_02; + partyMenu->levelUpMoveIndex = overwriteData->levelUpMoveIndex; } - partyMenu->usedItemID = v4->unk_00; - partyMenu->selectedMonSlot = v2->monIndex; - partyMenu->learnedMove = v2->move; - partyMenu->selectedMoveSlot = v2->selectedMoveSlot; + partyMenu->usedItemID = overwriteData->usedItemID; + partyMenu->selectedMonSlot = summary->monIndex; + partyMenu->learnedMove = summary->move; + partyMenu->selectedMoveSlot = summary->selectedMoveSlot; FieldSystem_StartChildProcess(fieldSystem, &gPokemonPartyAppTemplate, partyMenu); - Heap_Free(menu->unk_260); + Heap_Free(menu->additionalTaskContext); menu->taskData = partyMenu; StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } break; default: - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->monIndex); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, summary->monIndex); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } - Heap_Free(v2); + Heap_Free(summary); - return 0; + return FALSE; } -static void sub_0203C2D8(FieldTask *taskMan, u16 item) +static void StartMenu_ShowBerryTag(FieldTask *fieldTask, u16 berryItemID) { - u8 i; - u8 v4, v5, v6; - - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + u8 berry; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); menu->taskData = sub_020972FC(HEAP_ID_FIELD2); Bag *bag = SaveData_GetBag(fieldSystem->saveData); - sub_02097320(menu->taskData, item, 1); - v6 = 0; + sub_02097320(menu->taskData, berryItemID, 1); + u8 berryTypeCount = 0; - for (i = 0; i < NUM_BERRIES; i++) { - item = Item_ForBerryNumber(i); + for (berry = 0; berry < NUM_BERRIES; berry++) { + berryItemID = Item_ForBerryNumber(berry); - if (Bag_CanRemoveItem(bag, item, 1, HEAP_ID_FIELD2) == TRUE) { - sub_02097320(menu->taskData, item, 0); - v6++; + if (Bag_CanRemoveItem(bag, berryItemID, 1, HEAP_ID_FIELD2) == TRUE) { + sub_02097320(menu->taskData, berryItemID, 0); + berryTypeCount++; } } - BagCursor_GetFieldPocketPosition(fieldSystem->bagCursor, 4, &v5, &v4); - sub_0209733C(menu->taskData, v4, v5, v6 + 3); + u8 scroll, index; + BagCursor_GetFieldPocketPosition(fieldSystem->bagCursor, POCKET_BERRIES, &index, &scroll); + sub_0209733C(menu->taskData, scroll, index, berryTypeCount + 3); sub_0203D2E4(fieldSystem, menu->taskData); - StartMenu_SetCallback(menu, sub_0203C390); + StartMenu_SetCallback(menu, StartMenu_ExitBerryTag); } -static BOOL sub_0203C390(FieldTask *taskMan) +static BOOL StartMenu_ExitBerryTag(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - u8 v2, v3; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); - - sub_02097390(menu->taskData, &v2, &v3); - BagCursor_SetFieldPocketPosition(fieldSystem->bagCursor, 4, v3, v2); + u8 scroll, index; + sub_02097390(menu->taskData, &scroll, &index); + BagCursor_SetFieldPocketPosition(fieldSystem->bagCursor, POCKET_BERRIES, index, scroll); Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); + StartMenu_SetCallback(menu, StartMenu_ExitBag); + + return FALSE; +} + +BOOL StartMenu_ExitTownMap(FieldTask *fieldTask) +{ + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + + Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); return 0; } -BOOL sub_0203C3F4(FieldTask *taskMan) +BOOL StartMenu_FlyDestinationSelected(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + u32 slot = *((u32 *)menu->additionalTaskContext); - Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); - StartMenu_SetCallback(menu, StartMenu_ExitBag); + Heap_FreeExplicit(HEAP_ID_FIELD2, menu->additionalTaskContext); - return 0; -} + TownMapContext *mapCtx = (TownMapContext *)menu->taskData; -BOOL sub_0203C434(FieldTask *taskMan) -{ - FieldSystem *fieldSystem; - StartMenu *menu; - TownMapContext *v2; - u32 v3; - - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); - v3 = *((u32 *)menu->unk_260); - - Heap_FreeExplicit(HEAP_ID_FIELD2, menu->unk_260); - - v2 = (TownMapContext *)menu->taskData; - - if (!(v2->flyLocationSelected)) { + if (!mapCtx->flyLocationSelected) { Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v3); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, slot); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } else { - Pokemon *mon; - void *v5; - void *journalEntryLocationEvent; - - mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), v3); - v5 = sub_0207064C(HEAP_ID_FIELD2, fieldSystem, mon, v2->flyLocationMapHeader, v2->flyLocationX * 32 + 16, v2->flyLocationZ * 32 + 16); - journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_FLEW_TO_LOCATION - LOCATION_EVENT_USED_CUT, v2->flyLocationMapHeader, HEAP_ID_FIELD2); + Pokemon *mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), slot); + FlyContext *flyCtx = FlyContext_New(HEAP_ID_FIELD2, fieldSystem, mon, mapCtx->flyLocationMapHeader, mapCtx->flyLocationX * MAP_TILES_COUNT_X + MAP_TILES_COUNT_X / 2, mapCtx->flyLocationZ * MAP_TILES_COUNT_Z + MAP_TILES_COUNT_Z / 2); + void *journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_FLEW_TO_LOCATION - LOCATION_EVENT_USED_CUT, mapCtx->flyLocationMapHeader, HEAP_ID_FIELD2); JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION); Heap_FreeExplicit(HEAP_ID_FIELD2, menu->taskData); FieldSystem_StartFieldMap(fieldSystem); - menu->callback = sub_02070680; - menu->taskData = v5; - menu->state = START_MENU_STATE_10; + menu->callback = FieldMoves_FlyTask; + menu->taskData = flyCtx; + menu->state = START_MENU_STATE_NEW_TASK; } return FALSE; } -BOOL sub_0203C50C(FieldTask *taskMan) +BOOL StartMenu_ExitJournal(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); - return 0; + return FALSE; } -static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode); - -void *sub_0203C540(u16 fieldSystem, u8 param1, u8 param2) +void *sub_0203C540(u16 itemID, u8 param1, u8 slot) { UnkStruct_0203C540 *v0 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_0203C540)); - v0->unk_00 = fieldSystem; - v0->unk_02 = param2; + v0->itemID = itemID; + v0->slot = slot; v0->unk_03 = param1; return (void *)v0; } -BOOL StartMenu_ExitMail(FieldTask *taskMan) +BOOL StartMenu_ExitMail(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); - UnkStruct_0203C540 *v2 = menu->unk_260; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + UnkStruct_0203C540 *v2 = menu->additionalTaskContext; switch (v2->unk_03) { case 3: sub_02097770(menu->taskData); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); break; case 2: sub_02097770(menu->taskData); - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->unk_02); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->slot); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); break; case 0: @@ -1735,7 +1649,7 @@ BOOL StartMenu_ExitMail(FieldTask *taskMan) sub_0203C668(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL_DONE); } else { sub_02097770(menu->taskData); - menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->unk_02); + menu->taskData = FieldSystem_OpenPartyMenu(fieldSystem, &menu->fieldMoveContext, v2->slot); StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } break; @@ -1744,19 +1658,19 @@ BOOL StartMenu_ExitMail(FieldTask *taskMan) sub_0203C668(fieldSystem, menu, PARTY_MENU_MODE_GIVE_MAIL); } else { sub_02097770(menu->taskData); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); } break; } - Heap_Free(menu->unk_260); + Heap_Free(menu->additionalTaskContext); return 0; } static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) // TODO: { - UnkStruct_0203C540 *v0 = menu->unk_260; + UnkStruct_0203C540 *v0 = menu->additionalTaskContext; PartyMenu *partyMenu = Heap_Alloc(HEAP_ID_FIELD2, sizeof(PartyMenu)); memset(partyMenu, 0, sizeof(PartyMenu)); @@ -1766,12 +1680,12 @@ static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) // partyMenu->options = SaveData_GetOptions(fieldSystem->saveData); partyMenu->fieldMoveContext = &menu->fieldMoveContext; partyMenu->type = PARTY_MENU_TYPE_BASIC; - partyMenu->usedItemID = v0->unk_00; - partyMenu->selectedMonSlot = v0->unk_02; + partyMenu->usedItemID = v0->itemID; + partyMenu->selectedMonSlot = v0->slot; partyMenu->mode = mode; partyMenu->fieldSystem = fieldSystem; - sub_02097750(menu->taskData, Party_GetPokemonBySlotIndex(partyMenu->party, v0->unk_02)); + sub_02097750(menu->taskData, Party_GetPokemonBySlotIndex(partyMenu->party, v0->slot)); sub_02097770(menu->taskData); FieldSystem_StartChildProcess(fieldSystem, &gPokemonPartyAppTemplate, partyMenu); @@ -1779,99 +1693,89 @@ static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 mode) // StartMenu_SetCallback(menu, StartMenu_ExitPartyMenu); } -BOOL sub_0203C710(FieldTask *taskMan) +BOOL StartMenu_ExitPoffinCase(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); PoffinCaseAppData_Free(menu->taskData); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); - return 0; + return FALSE; } -BOOL sub_0203C750(FieldTask *taskMan) +BOOL StartMenu_ExitPalPad(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); - return 0; + return FALSE; } -BOOL sub_0203C784(FieldTask *taskMan) +BOOL StartMenu_ExitVsRecorder(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); StartMenu_SetCallback(menu, StartMenu_ExitBag); - return 0; + return FALSE; } -static void StartMenu_EvolveInit(FieldTask *taskMan) +static void StartMenu_EvolveInit(FieldTask *fieldTask) { - FieldSystem *fieldSystem; - StartMenu *menu; - UnkStruct_0203C7B8 *v2; - Party *v3; - Pokemon *v4; - EvolutionData *v5; - - fieldSystem = FieldTask_GetFieldSystem(taskMan); - menu = FieldTask_GetEnv(taskMan); - v2 = menu->taskData; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); + MenuEvolutionData *taskData = menu->taskData; Sound_StopWaveOutAndSequences(); - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_73, 0x30000); + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_EVOLUTION, HEAP_SIZE_EVOLUTION); - v3 = SaveData_GetParty(fieldSystem->saveData); - v4 = Party_GetPokemonBySlotIndex(v3, v2->unk_00); + Party *party = SaveData_GetParty(fieldSystem->saveData); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, taskData->slot); - if (v2->unk_01 == 0) { - v5 = Evolution_Begin(v3, v4, v2->unk_04, SaveData_GetOptions(fieldSystem->saveData), PokemonSummaryScreen_ShowContestData(fieldSystem->saveData), SaveData_GetPokedex(fieldSystem->saveData), SaveData_GetBag(fieldSystem->saveData), SaveData_GetGameRecords(fieldSystem->saveData), SaveData_GetPoketch(fieldSystem->saveData), v2->unk_08, 0x1, HEAP_ID_73); + EvolutionData *evoData; + if (taskData->class == EVO_CLASS_BY_LEVEL) { + evoData = Evolution_Begin(party, mon, taskData->targetSpecies, SaveData_GetOptions(fieldSystem->saveData), PokemonSummaryScreen_ShowContestData(fieldSystem->saveData), SaveData_GetPokedex(fieldSystem->saveData), SaveData_GetBag(fieldSystem->saveData), SaveData_GetGameRecords(fieldSystem->saveData), SaveData_GetPoketch(fieldSystem->saveData), taskData->method, 0x1, HEAP_ID_EVOLUTION); } else { - v5 = Evolution_Begin(v3, v4, v2->unk_04, SaveData_GetOptions(fieldSystem->saveData), PokemonSummaryScreen_ShowContestData(fieldSystem->saveData), SaveData_GetPokedex(fieldSystem->saveData), SaveData_GetBag(fieldSystem->saveData), SaveData_GetGameRecords(fieldSystem->saveData), SaveData_GetPoketch(fieldSystem->saveData), v2->unk_08, NULL, HEAP_ID_73); + evoData = Evolution_Begin(party, mon, taskData->targetSpecies, SaveData_GetOptions(fieldSystem->saveData), PokemonSummaryScreen_ShowContestData(fieldSystem->saveData), SaveData_GetPokedex(fieldSystem->saveData), SaveData_GetBag(fieldSystem->saveData), SaveData_GetGameRecords(fieldSystem->saveData), SaveData_GetPoketch(fieldSystem->saveData), taskData->method, NULL, HEAP_ID_EVOLUTION); } - { - u32 *v6 = Heap_Alloc(HEAP_ID_FIELD2, 4); + u32 *slot = Heap_Alloc(HEAP_ID_FIELD2, sizeof(u32)); - *v6 = v2->unk_00; - menu->unk_260 = v6; - } + *slot = taskData->slot; + menu->additionalTaskContext = slot; Heap_Free(menu->taskData); - menu->taskData = v5; + menu->taskData = evoData; menu->state = START_MENU_STATE_EVOLVE; } -static void StartMenu_Evolve(FieldTask *taskMan) +static void StartMenu_Evolve(FieldTask *fieldTask) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); - StartMenu *menu = FieldTask_GetEnv(taskMan); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldTask); + StartMenu *menu = FieldTask_GetEnv(fieldTask); - if (Evolution_IsDone(menu->taskData) == 1) { + if (Evolution_IsDone(menu->taskData) == TRUE) { Evolution_Free(menu->taskData); - Heap_Destroy(HEAP_ID_73); + Heap_Destroy(HEAP_ID_EVOLUTION); Sound_StopBGM(SEQ_SHINKA, 0); Sound_SetScene(SOUND_SCENE_NONE); sub_020556A0(fieldSystem, fieldSystem->location->mapId); - menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230); + menu->taskData = FieldSystem_OpenBag(fieldSystem, &menu->itemUseCtx); - { - u32 v2 = *((u32 *)menu->unk_260); + u32 slot = *((u32 *)menu->additionalTaskContext); - BagContext_SetSelectedMonSlot(menu->taskData, (u8)v2); - Heap_Free(menu->unk_260); - } + BagContext_SetSelectedMonSlot(menu->taskData, slot); + Heap_Free(menu->additionalTaskContext); StartMenu_SetCallback(menu, StartMenu_ExitBag); } diff --git a/src/underground/menus.c b/src/underground/menus.c index 8f78a8df29..7f33dca3b6 100644 --- a/src/underground/menus.c +++ b/src/underground/menus.c @@ -4,6 +4,7 @@ #include #include "constants/heap.h" +#include "constants/start_menu.h" #include "generated/traps.h" #include "field/field_system.h" @@ -91,31 +92,12 @@ enum UndergroundMenuState { UNDERGROUND_MENU_STATE_GOOD_SELECTED, }; -enum MenuIconAnimState { - ICON_ANIM_NONE = 0, - ICON_ANIM_SWELL, - ICON_ANIM_WIGGLE, - ICON_ANIM_COUNT, -}; - -enum MenuIconPalette { - ICON_GRAYSCALE = 0, - ICON_COLORED, -}; - -enum UndergroundMenuSpriteTemplate { - UNDERGROUND_MENU_CURSOR_TEMPLATE = 0, - UNDERGROUND_MENU_ICON_TEMPLATE, -}; - #define UNDERGROUND_MENU_MAX_DISPLAY 6 #define UNDERGROUND_TRAP_DESCRIPTIONS_START UndergroundTraps_Text_MoveTrapUpDescription #define UNDERGROUND_ITEM_DESCRIPTIONS_START UndergroundItems_Text_PrismSphereDescription #define UNDERGROUND_GOOD_DESCRIPTIONS_START UndergroundGoods_Text_CloseDescription -#define ICON_CURSOR_INDEX 0 - typedef void (*SelectedOptionCallback)(UndergroundMenu *); typedef void (*OpenMenuFn)(UndergroundMenu *); @@ -172,18 +154,20 @@ static const WindowTemplate sYesNoWindowTemplate = { .baseTile = BASE_TILE_YES_NO_MENU }; +// clang-format off static const struct { u32 bankEntry; u32 callback; } sUndergroundMenuOptions[] = { - [UNDERGROUND_START_MENU_OPTION_TRAPS] = { .bankEntry = UndergroundCommon_Text_Traps, .callback = (u32)UndergroundMenu_OpenTrapsMenu }, - [UNDERGROUND_START_MENU_OPTION_SPHERES] = { .bankEntry = UndergroundCommon_Text_Spheres, .callback = (u32)UndergroundMenu_OpenSpheresMenu }, - [UNDERGROUND_START_MENU_OPTION_GOODS] = { .bankEntry = UndergroundCommon_Text_Goods, .callback = (u32)UndergroundMenu_OpenGoodsMenu }, - [UNDERGROUND_START_MENU_OPTION_TREASURES] = { .bankEntry = UndergroundCommon_Text_Treasures, .callback = (u32)UndergroundMenu_OpenTreasuresMenu }, - [UNDERGROUND_START_MENU_OPTION_TRAINER] = { .bankEntry = UndergroundCommon_Text_TrainerNameTemplate, .callback = (u32)UndergroundMenu_OpenTrainerRecords }, - [UNDERGROUND_START_MENU_OPTION_GO_UP] = { .bankEntry = UndergroundCommon_Text_GoUp, .callback = (u32)UndergroundMenu_GoUpCallback }, - [UNDERGROUND_START_MENU_OPTION_CLOSE] = { .bankEntry = UndergroundCommon_Text_Close, .callback = (u32)UndergroundMenu_CloseCallback } + [UNDERGROUND_START_MENU_OPTION_TRAPS] = { .bankEntry = UndergroundCommon_Text_Traps, .callback = (u32)UndergroundMenu_OpenTrapsMenu }, + [UNDERGROUND_START_MENU_OPTION_SPHERES] = { .bankEntry = UndergroundCommon_Text_Spheres, .callback = (u32)UndergroundMenu_OpenSpheresMenu }, + [UNDERGROUND_START_MENU_OPTION_GOODS] = { .bankEntry = UndergroundCommon_Text_Goods, .callback = (u32)UndergroundMenu_OpenGoodsMenu }, + [UNDERGROUND_START_MENU_OPTION_TREASURES] = { .bankEntry = UndergroundCommon_Text_Treasures, .callback = (u32)UndergroundMenu_OpenTreasuresMenu }, + [UNDERGROUND_START_MENU_OPTION_TRAINER] = { .bankEntry = UndergroundCommon_Text_PlayerTemplate, .callback = (u32)UndergroundMenu_OpenTrainerRecords }, + [UNDERGROUND_START_MENU_OPTION_GO_UP] = { .bankEntry = UndergroundCommon_Text_GoUp, .callback = (u32)UndergroundMenu_GoUpCallback }, + [UNDERGROUND_START_MENU_OPTION_CLOSE] = { .bankEntry = UndergroundCommon_Text_Close, .callback = (u32)UndergroundMenu_CloseCallback } }; +// clang-format on static const ListMenuTemplate sListMenuTemplate = { .choices = NULL, @@ -208,25 +192,25 @@ static const ListMenuTemplate sListMenuTemplate = { }; static const SpriteTemplate sSpriteTemplates[] = { - [UNDERGROUND_MENU_CURSOR_TEMPLATE] = { + [CURSOR_TEMPLATE] = { .x = 204, .y = 20, .z = 0, - .animIdx = 0, + .animIdx = ICON_ANIM_NONE, .priority = 1, - .plttIdx = 1, + .plttIdx = PALETTE_COLORED, .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, .resources = { 0x38C0, 0x38C0, 0x38C0, 0x38C0, 0x0, 0x0 }, .bgPriority = 0, .vramTransfer = FALSE, }, - [UNDERGROUND_MENU_ICON_TEMPLATE] = { + [ICON_TEMPLATE] = { .x = 174, .y = 20, .z = 0, - .animIdx = 0, + .animIdx = ICON_ANIM_NONE, .priority = 0, - .plttIdx = 0, + .plttIdx = PALETTE_GRAYSCALE, .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, .resources = { 0x38C1, 0x38C0, 0x38C1, 0x38C1, 0x0, 0x0 }, .bgPriority = 0, @@ -255,9 +239,9 @@ static void UndergroundMenu_InitStartMenuSprites(UndergroundMenu *menu, u8 *opti SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, cursor_anim_NANR, FALSE, 14528); SpriteResourceManager_LoadTiles(&menu->spriteManager, narc, cursor_NCGR, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 14528); - menu->sprites[ICON_CURSOR_INDEX] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &sSpriteTemplates[UNDERGROUND_MENU_CURSOR_TEMPLATE]); + menu->sprites[CURSOR_SPRITE_INDEX] = SpriteResourceManager_CreateManagedSprite(&menu->spriteManager, &sSpriteTemplates[CURSOR_TEMPLATE]); - UndergroundMenu_SetStartMenuCursorPos(menu->sprites[ICON_CURSOR_INDEX]->sprite, menu->menuCursorPos); + UndergroundMenu_SetStartMenuCursorPos(menu->sprites[CURSOR_SPRITE_INDEX]->sprite, menu->menuCursorPos); SpriteResourceManager_LoadCell(&menu->spriteManager, narc, underground_icons_cell_NCER, FALSE, 14529); SpriteResourceManager_LoadAnimation(&menu->spriteManager, narc, underground_icons_anim_NANR, FALSE, 14529); @@ -266,7 +250,7 @@ static void UndergroundMenu_InitStartMenuSprites(UndergroundMenu *menu, u8 *opti NARC_dtor(narc); for (u32 i = 0; i < menuOptionCount; i++) { - SpriteTemplate template = sSpriteTemplates[UNDERGROUND_MENU_ICON_TEMPLATE]; + SpriteTemplate template = sSpriteTemplates[ICON_TEMPLATE]; template.y += 24 * i; template.animIdx = optionList[i] * ICON_ANIM_COUNT; @@ -276,7 +260,7 @@ static void UndergroundMenu_InitStartMenuSprites(UndergroundMenu *menu, u8 *opti Sprite_SetAffineScaleEx(menu->sprites[i + 1]->sprite, &scale, AFFINE_OVERWRITE_MODE_NORMAL); } - UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[menu->menuCursorPos + 1]->sprite, ICON_ANIM_WIGGLE, ICON_COLORED); + UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[menu->menuCursorPos + 1]->sprite, ICON_ANIM_WIGGLE, PALETTE_COLORED); menu->spriteCount = menuOptionCount + 1; GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); } @@ -315,8 +299,8 @@ static void UndergroundMenu_SetIconAnimationAndPalette(Sprite *sprite, u16 anim, static void UndergroundMenu_ChangeActiveMenuIcon(UndergroundMenu *menu, u16 oldIndex, u16 index) { - UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[oldIndex + 1]->sprite, ICON_ANIM_NONE, ICON_GRAYSCALE); - UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[index + 1]->sprite, ICON_ANIM_SWELL, ICON_COLORED); + UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[oldIndex + 1]->sprite, ICON_ANIM_NONE, PALETTE_GRAYSCALE); + UndergroundMenu_SetIconAnimationAndPalette(menu->sprites[index + 1]->sprite, ICON_ANIM_SWELL, PALETTE_COLORED); } static void UndergroundMenu_TryTransitionIconAnimationToWiggle(Sprite *sprite) @@ -326,7 +310,7 @@ static void UndergroundMenu_TryTransitionIconAnimationToWiggle(Sprite *sprite) } if (!Sprite_IsAnimated(sprite)) { - UndergroundMenu_SetIconAnimationAndPalette(sprite, ICON_ANIM_WIGGLE, ICON_COLORED); + UndergroundMenu_SetIconAnimationAndPalette(sprite, ICON_ANIM_WIGGLE, PALETTE_COLORED); } } @@ -489,13 +473,13 @@ void UndergroundMenu_Start(ExitCallback exitCallback, FieldSystem *fieldSystem) UndergroundMan_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); } -#define ADD_OPTION(__menuOption) \ - do { \ - list[optionCount] = __menuOption; \ - optionCount++; \ +#define ADD_OPTION(__menuOption) \ + do { \ + listOut[optionCount] = __menuOption; \ + optionCount++; \ } while (0) -static u32 UndergroundMenu_MakeList(u8 *list) +static u32 UndergroundMenu_MakeStartMenuOptionList(u8 *listOut) { u32 optionCount = 0; ADD_OPTION(UNDERGROUND_START_MENU_OPTION_TRAPS); @@ -513,7 +497,7 @@ static void UndergroundMenu_InitStartMenu(UndergroundMenu *menu) MenuTemplate template; const int trainerOptionIndex = UNDERGROUND_START_MENU_OPTION_TRAINER; u8 optionList[UNDERGROUND_START_MENU_OPTION_COUNT]; - UndergroundMenu_MakeList(optionList); + UndergroundMenu_MakeStartMenuOptionList(optionList); menu->menuOptions = StringList_New(NELEMS(sUndergroundMenuOptions), HEAP_ID_FIELD1); Window_Add(menu->fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 20, 1, 11, NELEMS(sUndergroundMenuOptions) * 3, 13, BASE_TILE_STANDARD_WINDOW_FRAME - 11 * 22); @@ -646,7 +630,7 @@ static BOOL UndergroundMenu_HandleStartMenu(SysTask *sysTask, void *data) menu->menuCursorPos = Menu_GetCursorPos(menu->menu); if (prevPos != menu->menuCursorPos) { - UndergroundMenu_SetStartMenuCursorPos(menu->sprites[ICON_CURSOR_INDEX]->sprite, menu->menuCursorPos); + UndergroundMenu_SetStartMenuCursorPos(menu->sprites[CURSOR_SPRITE_INDEX]->sprite, menu->menuCursorPos); UndergroundMenu_ChangeActiveMenuIcon(menu, prevPos, menu->menuCursorPos); menu->fieldSystem->menuCursorPos = menu->menuCursorPos; } diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index 30b5563b22..8e9b491373 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -106,6 +106,7 @@ #include "save_player.h" #include "savedata.h" #include "savedata_misc.h" +#include "start_menu.h" #include "string_gf.h" #include "system_data.h" #include "system_flags.h" @@ -129,7 +130,6 @@ #include "unk_02098218.h" #include "vars_flags.h" -#include "constdata/const_020EA02C.h" #include "constdata/const_020EA328.h" #include "constdata/const_020EA358.h" #include "constdata/const_020F2FCC.h" @@ -258,7 +258,7 @@ static const u8 Unk_020EA164[] = { 0xff }; -void sub_0203D1E4(FieldSystem *fieldSystem, void *param1) +void sub_0203D1E4(FieldSystem *fieldSystem, BagContext *param1) { FS_EXTERN_OVERLAY(bag); @@ -272,30 +272,30 @@ void sub_0203D1E4(FieldSystem *fieldSystem, void *param1) FieldSystem_StartChildProcess(fieldSystem, &Unk_ov84_02241130, param1); } -void *sub_0203D20C(FieldSystem *fieldSystem, ItemUseContext *param1) +BagContext *FieldSystem_OpenBag(FieldSystem *fieldSystem, ItemUseContext *itemUseCtx) { - Bag *v0 = SaveData_GetBag(fieldSystem->saveData); - void *v1 = BagContext_CreateWithPockets(v0, Unk_020EA164, HEAP_ID_FIELD2); + Bag *bag = SaveData_GetBag(fieldSystem->saveData); + BagContext *bagCtx = BagContext_CreateWithPockets(bag, Unk_020EA164, HEAP_ID_FIELD2); - BagContext_Init(v1, fieldSystem->saveData, 0, fieldSystem->bagCursor); - BagContext_SetMapLoadType(v1, fieldSystem->mapLoadType); + BagContext_Init(bagCtx, fieldSystem->saveData, 0, fieldSystem->bagCursor); + BagContext_SetMapLoadType(bagCtx, fieldSystem->mapLoadType); - if (PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar) == 0x1) { - BagContext_SetIsCycling(v1); + if (PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar) == PLAYER_STATE_CYCLING) { + BagContext_SetIsCycling(bagCtx); } - BagContext_SetItemUseContext(v1, param1); - sub_0203D1E4(fieldSystem, v1); + BagContext_SetItemUseContext(bagCtx, itemUseCtx); + sub_0203D1E4(fieldSystem, bagCtx); - return v1; + return bagCtx; } void *FieldSystem_CreateBagContext(FieldSystem *fieldSystem, int pocketType) { void *bagContext; static const u8 *pocketList; - static const u8 berriesPockets[] = { POCKET_BERRIES, 255 }; - static const u8 itemsPockets[] = { POCKET_ITEMS, 255 }; + static const u8 berriesPockets[] = { POCKET_BERRIES, POCKET_LIST_END }; + static const u8 itemsPockets[] = { POCKET_ITEMS, POCKET_LIST_END }; Bag *bag = SaveData_GetBag(fieldSystem->saveData); switch (pocketType) { @@ -530,7 +530,7 @@ void *sub_0203D5C8(int param0, FieldSystem *fieldSystem, int param2) v0->showContest = PokemonSummaryScreen_ShowContestData(fieldSystem->saveData); v0->chatotCry = NULL; - PokemonSummaryScreen_FlagVisiblePages(v0, Unk_020EA02C); + PokemonSummaryScreen_FlagVisiblePages(v0, gAllSummaryScreenPages); PokemonSummaryScreen_SetPlayerProfile(v0, SaveData_GetTrainerInfo(fieldSystem->saveData)); FieldSystem_StartChildProcess(fieldSystem, &gPokemonSummaryScreenApp, v0); @@ -1271,7 +1271,7 @@ void FieldSystem_OpenTrainerCardScreen(FieldSystem *fieldSystem, TrainerCard *tr FieldSystem_StartChildProcess(fieldSystem, &template, trainerCard); } -BOOL sub_0203E0AC(FieldSystem *fieldSystem, void *param1) +BOOL FieldSystem_OpenPokedex(FieldSystem *fieldSystem, PokedexOverlayArgs *args) { FS_EXTERN_OVERLAY(pokedex); @@ -1282,8 +1282,8 @@ BOOL sub_0203E0AC(FieldSystem *fieldSystem, void *param1) FS_OVERLAY_ID(pokedex) }; - FieldSystem_StartChildProcess(fieldSystem, &template, param1); - return 1; + FieldSystem_StartChildProcess(fieldSystem, &template, args); + return TRUE; } void FieldSystem_LaunchChooseStarterApp(FieldSystem *fieldSystem, ChooseStarterData *chooseStarterData) diff --git a/src/unk_0205F180.c b/src/unk_0205F180.c index 8e9b75a1ff..851ac07331 100644 --- a/src/unk_0205F180.c +++ b/src/unk_0205F180.c @@ -424,7 +424,7 @@ int sub_0205F588(PlayerAvatar *playerAvatar) return 0; } -void sub_0205F5E4(PlayerAvatar *playerAvatar, int param1) +void sub_0205F5E4(PlayerAvatar *playerAvatar, int dir) { MapObject *mapObj; @@ -433,11 +433,11 @@ void sub_0205F5E4(PlayerAvatar *playerAvatar, int param1) mapObj = Player_MapObject(playerAvatar); - MapObject_TryFace(mapObj, param1); + MapObject_TryFace(mapObj, dir); sub_02062A0C(mapObj, 0x0); MapObject_UpdateCoords(mapObj); sub_020656DC(mapObj); - LocalMapObj_SetAnimationCode(mapObj, MovementAction_TurnActionTowardsDir(param1, MOVEMENT_ACTION_FACE_NORTH)); + LocalMapObj_SetAnimationCode(mapObj, MovementAction_TurnActionTowardsDir(dir, MOVEMENT_ACTION_FACE_NORTH)); } static int sub_0205F62C(PlayerAvatar *playerAvatar, int param1) @@ -2426,12 +2426,12 @@ void sub_02061674(PlayerAvatar *playerAvatar, int param1, int *param2, int *para (*param4) += v0->unk_04; } -u32 PlayerAvatar_GetDistortionTileBehaviour(PlayerAvatar *playerAvatar, int param1) +u32 PlayerAvatar_GetDistortionFacingTileBehaviour(PlayerAvatar *playerAvatar, int distortionDir) { u32 v0; if (PlayerAvatar_DistortionGravityChanged(playerAvatar) == FALSE) { - v0 = sub_0206156C(playerAvatar, param1); + v0 = sub_0206156C(playerAvatar, distortionDir); } else { MapObject *mapObj = Player_MapObject(playerAvatar); FieldSystem *fieldSystem = MapObject_FieldSystem(mapObj); @@ -2439,7 +2439,7 @@ u32 PlayerAvatar_GetDistortionTileBehaviour(PlayerAvatar *playerAvatar, int para int y = MapObject_GetY(mapObj) / 2; int z = MapObject_GetZ(mapObj); - sub_02061674(playerAvatar, param1, &x, &y, &z); + sub_02061674(playerAvatar, distortionDir, &x, &y, &z); DistWorld_GetTileBehaviorOnCurrentFloatingPlatform(fieldSystem, x, y, z, &v0); } diff --git a/src/unk_0207064C.c b/src/unk_0207064C.c deleted file mode 100644 index f58a8bcae4..0000000000 --- a/src/unk_0207064C.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "unk_0207064C.h" - -#include -#include - -#include "field/field_system.h" -#include "overlay006/hm_cut_in.h" - -#include "field_map_change.h" -#include "field_task.h" -#include "heap.h" -#include "location.h" -#include "player_avatar.h" -#include "pokemon.h" -#include "spawn_locations.h" -#include "sys_task_manager.h" - -typedef struct { - FieldSystem *fieldSystem; - int state; - u16 mapID; - s16 unk_0A; - s16 unk_0C; - Pokemon *partyPokemon; - SysTask *cutInTask; -} FlyTaskEnv; - -void *sub_0207064C(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *mon, u16 mapID, s16 param4, s16 param5) -{ - FlyTaskEnv *v0 = Heap_AllocAtEnd(heapID, sizeof(FlyTaskEnv)); - - memset(v0, 0, sizeof(FlyTaskEnv)); - - v0->fieldSystem = fieldSystem; - v0->partyPokemon = mon; - v0->mapID = mapID; - v0->unk_0A = param4; - v0->unk_0C = param5; - - return v0; -} - -BOOL sub_02070680(FieldTask *task) -{ - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - FlyTaskEnv *taskEnv = FieldTask_GetEnv(task); - - switch (taskEnv->state) { - case 0: - taskEnv->cutInTask = SysTask_HMCutIn_New(taskEnv->fieldSystem, 1, taskEnv->partyPokemon, PlayerAvatar_Gender(taskEnv->fieldSystem->playerAvatar)); - taskEnv->state++; - break; - case 1: - if (CheckHMCutInFinished(taskEnv->cutInTask) == FALSE) { - break; - } - - SysTask_HMCutIn_SetTaskDone(taskEnv->cutInTask); - - u16 destination; - Location location; - - destination = GetSpawnIdByMapAndCoords(taskEnv->mapID, taskEnv->unk_0A, taskEnv->unk_0C); - GF_ASSERT(destination != 0); - - Location_InitFly(destination, &location); - FieldTask_ChangeMapChangeFly(task, location.mapId, -1, location.x, location.z, FACE_DOWN); - - Heap_Free(taskEnv); - } - - return 0; -}