diff options
Diffstat (limited to 'src/trainer_tower.c')
-rw-r--r-- | src/trainer_tower.c | 841 |
1 files changed, 429 insertions, 412 deletions
diff --git a/src/trainer_tower.c b/src/trainer_tower.c index 60c6fd93d..0c673b5aa 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -2,11 +2,9 @@ #include "main.h" #include "task.h" #include "malloc.h" -#include "save.h" #include "util.h" #include "string_util.h" #include "event_data.h" -#include "random.h" #include "cereader_tool.h" #include "easy_chat.h" #include "text.h" @@ -20,25 +18,26 @@ #include "menu.h" #include "new_menu_helpers.h" #include "sound.h" -#include "renewable_hidden_items.h" -#include "constants/flags.h" #include "constants/vars.h" #include "constants/items.h" #include "constants/species.h" -#include "constants/maps.h" #include "constants/songs.h" #include "constants/layouts.h" #include "constants/trainers.h" #include "constants/facility_trainer_classes.h" -#include "constants/object_events.h" +#include "constants/event_objects.h" +#include "constants/trainer_tower.h" + +#define CURR_FLOOR sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx] +#define TRAINER_TOWER gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId] struct UnkStruct_203F458 { /* 0x0000 */ u8 floorIdx; - /* 0x0004 */ struct EReaderTrainerHillSet unk_0004; + /* 0x0004 */ struct EReaderTrainerTowerSet unk_0004; }; -struct UnkStruct_203F45C +struct TrainerTowerOpponent { /* 0x00 */ u8 name[11]; /* 0x0C */ u16 speechWin[6]; @@ -52,15 +51,15 @@ struct UnkStruct_203F45C struct SinglesTrainerInfo { - u8 mapObjGfx; + u8 objGfx; u8 facilityClass; bool8 gender; }; struct DoublesTrainerInfo { - u8 mapObjGfx1; - u8 mapObjGfx2; + u8 objGfx1; + u8 objGfx2; u8 facilityClass; bool8 gender1; bool8 gender2; @@ -68,147 +67,147 @@ struct DoublesTrainerInfo struct TrainerEncounterMusicPairs { - u8 unk0; - u8 unk1; + u8 facilityClass; + u8 musicId; }; static EWRAM_DATA struct UnkStruct_203F458 * sTrainerTowerState = NULL; -static EWRAM_DATA struct UnkStruct_203F45C * sTrainerTowerOpponent = NULL; +static EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL; static EWRAM_DATA u8 sUnused_203F460 = 0; -static void sub_815DC8C(void); // setup -static void sub_815DD2C(void); // teardown -static void sub_815DD44(void); +static void SetUpTrainerTowerDataStruct(void); +static void FreeTrainerTowerDataStruct(void); +static void InitTrainerTowerFloor(void); static void SetTrainerTowerNPCGraphics(void); static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest); -static void sub_815DF54(void); +static void BufferTowerOpponentSpeech(void); static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass); -static void sub_815E160(void); -static void sub_815E1C0(void); -static void sub_815E1F0(void); -static void TTSpecial_HasReachedTheRoof(void); -static void sub_815E28C(void); -static void sub_815E394(void); -static void sub_815E408(void); -static void sub_815E4B0(void); -static void TTSpecial_StartTimer(void); -static void sub_815E5C4(void); -static void sub_815E5F0(void); -static void sub_815E658(void); -static void sub_815E720(void); -static void sub_815E88C(void); -static void sub_815E8B4(void); -static void sub_815E8CC(void); -static void sub_815E908(void); -static void sub_815E948(void); -static void sub_815E9C8(void); +static void DoTrainerTowerBattle(void); +static void TrainerTowerGetChallengeType(void); +static void TrainerTowerAddFloorCleared(void); +static void GetFloorAlreadyCleared(void); +static void StartTrainerTowerChallenge(void); +static void GetOwnerState(void); +static void GiveChallengePrize(void); +static void CheckFinalTime(void); +static void TrainerTowerResumeTimer(void); +static void TrainerTowerSetPlayerLost(void); +static void GetTrainerTowerChallengeStatus(void); +static void GetCurrentTime(void); +static void ShowResultsBoard(void); +static void CloseResultsBoard(void); +static void TrainerTowerGetDoublesEligiblity(void); +static void TrainerTowerGetNumFloors(void); +static void ShouldWarpToCounter(void); +static void PlayTrainerTowerEncounterMusic(void); +static void HasSpokenToOwner(void); static void BuildEnemyParty(void); static s32 GetPartyMaxLevel(void); static void ValidateOrResetCurTrainerTowerRecord(void); static u32 GetTrainerTowerRecordTime(u32 *); static void SetTrainerTowerRecordTime(u32 *, u32); -extern const u8 gUnknown_83FE982[]; -extern const u8 gUnknown_83FE998[]; -extern const u8 *const gUnknown_83FE9C4[]; +extern const u8 gText_TimeBoard[]; +extern const u8 gText_XMinYZSec[]; +extern const u8 *const gTrainerTowerChallengeTypeTexts[]; static const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = { - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY, FEMALE}, - {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC, MALE}, - {OBJECT_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE}, - {OBJECT_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_TUBER_2, MALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER, MALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_2, FEMALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE}, - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY, FEMALE}, - {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE}, - {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC, MALE}, - {OBJECT_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE, MALE}, - {OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE}, - {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE}, - {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC, MALE}, - {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_2, FEMALE}, - {OBJECT_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE}, - {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID, MALE}, - {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_2, FEMALE}, - {OBJECT_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN, MALE}, - {OBJECT_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_2, FEMALE}, - {OBJECT_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT, MALE}, - {OBJECT_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_2, FEMALE}, - {OBJECT_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE}, - {OBJECT_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER, MALE}, - {OBJECT_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE}, - {OBJECT_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE}, - {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE}, - {OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE, FEMALE}, - {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE}, - {OBJECT_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE}, - {OBJECT_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE}, - {OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_PKMN_BREEDER, MALE}, - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_2, FEMALE}, - {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER, MALE}, - {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_2, FEMALE}, - {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE}, - {OBJECT_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE}, - {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE}, - {OBJECT_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER_2, MALE}, - {OBJECT_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER_2, MALE}, - {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_LASS_2, FEMALE}, - {OBJECT_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR_2, MALE}, - {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER_2, MALE}, - {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER_2, FEMALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC_2, MALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE}, - {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER_2, MALE}, - {OBJECT_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE}, - {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BURGLAR, MALE}, - {OBJECT_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_ENGINEER, MALE}, - {OBJECT_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN_2, MALE}, - {OBJECT_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE_2, MALE}, - {OBJECT_EVENT_GFX_BIKER, FACILITY_CLASS_CUE_BALL, MALE}, - {OBJECT_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE}, - {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY_2, FEMALE}, - {OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE_2, FEMALE}, - {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC_3, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_ROCKER, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_JUGGLER, MALE}, - {OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_TAMER, MALE}, - {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER_2, MALE}, - {OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT_2, MALE}, - {OBJECT_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_3, MALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_4, FEMALE}, - {OBJECT_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN_2, MALE}, - {OBJECT_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE}, - {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_4, FEMALE}, - {OBJECT_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE}, - {OBJECT_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER_3, FEMALE}, - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_3, FEMALE}, - {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER_3, MALE}, - {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_4, FEMALE}, - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY_2, FEMALE}, - {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC_2, MALE}, - {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY_2, FEMALE}, - {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_PAINTER, FEMALE} + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY, FEMALE}, + {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC, MALE}, + {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE}, + {OBJ_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_TUBER_2, MALE}, + {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER, MALE}, + {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_2, FEMALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE}, + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY, FEMALE}, + {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE}, + {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC, MALE}, + {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE, MALE}, + {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE}, + {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE}, + {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC, MALE}, + {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_2, FEMALE}, + {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE}, + {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID, MALE}, + {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_2, FEMALE}, + {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN, MALE}, + {OBJ_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_2, FEMALE}, + {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT, MALE}, + {OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_2, FEMALE}, + {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE}, + {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE}, + {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER, MALE}, + {OBJ_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE}, + {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE}, + {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE}, + {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE, FEMALE}, + {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE}, + {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE}, + {OBJ_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE}, + {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_PKMN_BREEDER, MALE}, + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_2, FEMALE}, + {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER, MALE}, + {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_2, FEMALE}, + {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE}, + {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE}, + {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE}, + {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER_2, MALE}, + {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER_2, MALE}, + {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS_2, FEMALE}, + {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR_2, MALE}, + {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER_2, MALE}, + {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER_2, FEMALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC_2, MALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE}, + {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER_2, MALE}, + {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE}, + {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BURGLAR, MALE}, + {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_ENGINEER, MALE}, + {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN_2, MALE}, + {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE_2, MALE}, + {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_CUE_BALL, MALE}, + {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE}, + {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY_2, FEMALE}, + {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE_2, FEMALE}, + {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC_3, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_ROCKER, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_JUGGLER, MALE}, + {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_TAMER, MALE}, + {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER_2, MALE}, + {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT_2, MALE}, + {OBJ_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE}, + {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_3, MALE}, + {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_4, FEMALE}, + {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN_2, MALE}, + {OBJ_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE}, + {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_4, FEMALE}, + {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE}, + {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER_3, FEMALE}, + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_3, FEMALE}, + {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER_3, MALE}, + {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_4, FEMALE}, + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY_2, FEMALE}, + {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC_2, MALE}, + {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY_2, FEMALE}, + {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_PAINTER, FEMALE} }; static const struct DoublesTrainerInfo sDoubleBattleTrainerInfo[] = { - {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SR_AND_JR, FEMALE, FEMALE}, - {OBJECT_EVENT_GFX_LITTLE_GIRL, OBJECT_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS, FEMALE, FEMALE}, - {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE, FEMALE, MALE}, - {OBJECT_EVENT_GFX_OLD_MAN_1, OBJECT_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_OLD_COUPLE, MALE, FEMALE}, - {OBJECT_EVENT_GFX_TUBER_M_2, OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SIS_AND_BRO, MALE, FEMALE}, - {OBJECT_EVENT_GFX_LITTLE_GIRL, OBJECT_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS_2, FEMALE, FEMALE}, - {OBJECT_EVENT_GFX_COOLTRAINER_M, OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOL_COUPLE, MALE, FEMALE}, - {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE_2, FEMALE, MALE}, - {OBJECT_EVENT_GFX_BATTLE_GIRL, OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_CRUSH_KIN, FEMALE, MALE}, - {OBJECT_EVENT_GFX_SWIMMER_F_LAND, OBJECT_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_SIS_AND_BRO_2, FEMALE, MALE} + {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SR_AND_JR, FEMALE, FEMALE}, + {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS, FEMALE, FEMALE}, + {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE, FEMALE, MALE}, + {OBJ_EVENT_GFX_OLD_MAN_1, OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_OLD_COUPLE, MALE, FEMALE}, + {OBJ_EVENT_GFX_TUBER_M_2, OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SIS_AND_BRO, MALE, FEMALE}, + {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS_2, FEMALE, FEMALE}, + {OBJ_EVENT_GFX_COOLTRAINER_M, OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOL_COUPLE, MALE, FEMALE}, + {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE_2, FEMALE, MALE}, + {OBJ_EVENT_GFX_BATTLE_GIRL, OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_CRUSH_KIN, FEMALE, MALE}, + {OBJ_EVENT_GFX_SWIMMER_F_LAND, OBJ_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_SIS_AND_BRO_2, FEMALE, MALE} }; static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = { @@ -319,51 +318,52 @@ static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = {FACILITY_CLASS_ELITE_FOUR_2, TRAINER_ENCOUNTER_MUSIC_MALE} }; -static const struct WindowTemplate gUnknown_847A218[] = { +static const struct WindowTemplate sTimeBoardWindowTemplate[] = { {0, 3, 1, 27, 18, 15, 0x001}, DUMMY_WIN_TEMPLATE }; -static const u32 gUnknown_847A228 = 0x70; // unused - -static const u8 gUnknown_847A22C[3] = {0, 2, 3}; - -static void (*const gUnknown_847A230[])(void) = { - sub_815DD44, - sub_815DF54, - sub_815E160, - sub_815E1C0, - sub_815E1F0, - TTSpecial_HasReachedTheRoof, - sub_815E28C, - sub_815E394, - sub_815E408, - sub_815E4B0, - TTSpecial_StartTimer, - sub_815E5C4, - sub_815E5F0, - sub_815E658, - sub_815E720, - sub_815E88C, - sub_815E8B4, - sub_815E8CC, - sub_815E908, - sub_815E948, - sub_815E9C8 +static const u32 sUnused_847A228 = 0x70; + +static const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; + +static void (*const sTrainerTowerFunctions[])(void) = { + [TRAINER_TOWER_FUNC_INIT_FLOOR] = InitTrainerTowerFloor, + [TRAINER_TOWER_FUNC_GET_SPEECH] = BufferTowerOpponentSpeech, + [TRAINER_TOWER_FUNC_DO_BATTLE] = DoTrainerTowerBattle, + [TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE] = TrainerTowerGetChallengeType, + [TRAINER_TOWER_FUNC_CLEARED_FLOOR] = TrainerTowerAddFloorCleared, + [TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED] = GetFloorAlreadyCleared, + [TRAINER_TOWER_FUNC_START_CHALLENGE] = StartTrainerTowerChallenge, + [TRAINER_TOWER_FUNC_GET_OWNER_STATE] = GetOwnerState, + [TRAINER_TOWER_FUNC_GIVE_PRIZE] = GiveChallengePrize, + [TRAINER_TOWER_FUNC_CHECK_FINAL_TIME] = CheckFinalTime, + [TRAINER_TOWER_FUNC_RESUME_TIMER] = TrainerTowerResumeTimer, + [TRAINER_TOWER_FUNC_SET_LOST] = TrainerTowerSetPlayerLost, + [TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS] = GetTrainerTowerChallengeStatus, + [TRAINER_TOWER_FUNC_GET_TIME] = GetCurrentTime, + [TRAINER_TOWER_FUNC_SHOW_RESULTS] = ShowResultsBoard, + [TRAINER_TOWER_FUNC_CLOSE_RESULTS] = CloseResultsBoard, + [TRAINER_TOWER_FUNC_CHECK_DOUBLES] = TrainerTowerGetDoublesEligiblity, + [TRAINER_TOWER_FUNC_GET_NUM_FLOORS] = TrainerTowerGetNumFloors, + [TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER] = ShouldWarpToCounter, + [TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC] = PlayTrainerTowerEncounterMusic, + [TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE] = HasSpokenToOwner }; -static const u16 sFloorLayouts[8][3] = { - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F, LAYOUT_UNUSED_LAYOUT_834BC2C, LAYOUT_UNUSED_LAYOUT_834D06C}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_2F, LAYOUT_UNUSED_LAYOUT_834BEB4, LAYOUT_UNUSED_LAYOUT_834D2F4}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_3F, LAYOUT_UNUSED_LAYOUT_834C13C, LAYOUT_UNUSED_LAYOUT_834D57C}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_4F, LAYOUT_UNUSED_LAYOUT_834C3C4, LAYOUT_UNUSED_LAYOUT_834D804}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_5F, LAYOUT_UNUSED_LAYOUT_834C64C, LAYOUT_UNUSED_LAYOUT_834DA8C}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_6F, LAYOUT_UNUSED_LAYOUT_834C8D4, LAYOUT_UNUSED_LAYOUT_834DD14}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_7F, LAYOUT_UNUSED_LAYOUT_834CB5C, LAYOUT_UNUSED_LAYOUT_834DF9C}, - {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_8F, LAYOUT_UNUSED_LAYOUT_834CDE4, LAYOUT_UNUSED_LAYOUT_834E224} +// - 1 excludes Mixed challenge, which just uses one of the 3 other types +static const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYPES - 1] = { + {LAYOUT_TRAINER_TOWER_1F, LAYOUT_TRAINER_TOWER_1F_DOUBLES, LAYOUT_TRAINER_TOWER_1F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_2F, LAYOUT_TRAINER_TOWER_2F_DOUBLES, LAYOUT_TRAINER_TOWER_2F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_3F, LAYOUT_TRAINER_TOWER_3F_DOUBLES, LAYOUT_TRAINER_TOWER_3F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_4F, LAYOUT_TRAINER_TOWER_4F_DOUBLES, LAYOUT_TRAINER_TOWER_4F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_5F, LAYOUT_TRAINER_TOWER_5F_DOUBLES, LAYOUT_TRAINER_TOWER_5F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_6F, LAYOUT_TRAINER_TOWER_6F_DOUBLES, LAYOUT_TRAINER_TOWER_6F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_7F, LAYOUT_TRAINER_TOWER_7F_DOUBLES, LAYOUT_TRAINER_TOWER_7F_KNOCKOUT}, + {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT} }; -static const u16 gUnknown_847A2B4[] = { +static const u16 sPrizeList[] = { ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, @@ -381,21 +381,21 @@ static const u16 gUnknown_847A2B4[] = { ITEM_UP_GRADE }; -static const u16 gUnknown_847A2D2[] = { - MUS_SHOUNEN, - MUS_SHOUJO, - MUS_SHOUJO, - MUS_ROCKET, - MUS_SHOUNEN, - MUS_SHOUNEN, - MUS_ROCKET, - MUS_ROCKET, - MUS_SHOUNEN, - MUS_SHOUJO, - MUS_SHOUNEN, - MUS_SHOUNEN, - MUS_SHOUNEN, - MUS_SHOUNEN +static const u16 sTrainerTowerEncounterMusic[] = { + [TRAINER_ENCOUNTER_MUSIC_MALE] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_FEMALE] = MUS_SHOUJO, + [TRAINER_ENCOUNTER_MUSIC_GIRL] = MUS_SHOUJO, + [TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS] = MUS_ROCKET, + [TRAINER_ENCOUNTER_MUSIC_INTENSE] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_COOL] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_AQUA] = MUS_ROCKET, + [TRAINER_ENCOUNTER_MUSIC_MAGMA] = MUS_ROCKET, + [TRAINER_ENCOUNTER_MUSIC_SWIMMER] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_TWINS] = MUS_SHOUJO, + [TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_HIKER] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_INTERVIEWER] = MUS_SHOUNEN, + [TRAINER_ENCOUNTER_MUSIC_RICH] = MUS_SHOUNEN }; static const u8 sSingleBattleChallengeMonIdxs[][2] = { @@ -431,22 +431,22 @@ static const u8 sKnockoutChallengeMonIdxs[][3] = { {0x01, 0x04, 0x05} }; -extern const struct EReaderTrainerHillSetSubstruct gUnknown_84827AC; -extern const struct TrainerTowerFloor *const gUnknown_84827B4[][8]; +extern const struct EReaderTrainerTowerSetSubstruct gUnknown_84827AC; +extern const struct TrainerTowerFloor *const gUnknown_84827B4[][MAX_TRAINER_TOWER_FLOORS]; -void sub_815D9E8(void) +void CallTrainerTowerFunc(void) { - sub_815DC8C(); - gUnknown_847A230[gSpecialVar_0x8004](); - sub_815DD2C(); + SetUpTrainerTowerDataStruct(); + sTrainerTowerFunctions[gSpecialVar_0x8004](); + FreeTrainerTowerDataStruct(); } -u8 sub_815DA10(void) +u8 GetTrainerTowerOpponentClass(void) { return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass]; } -void sub_815DA28(u8 *dest) +void GetTrainerTowerOpponentName(u8 *dest) { StringCopyN(dest, sTrainerTowerOpponent->name, 11); } @@ -458,41 +458,39 @@ u8 GetTrainerTowerTrainerFrontSpriteId(void) void InitTrainerTowerBattleStruct(void) { - u16 r10; - s32 r9; + u16 trainerId; + int i; - sub_815DC8C(); + SetUpTrainerTowerDataStruct(); sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent)); - r10 = VarGet(VAR_TEMP_1); - StringCopyN(sTrainerTowerOpponent->name, sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].name, 11); + trainerId = VarGet(VAR_TEMP_1); + StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11); - for (r9 = 0; r9 < 6; r9++) + for (i = 0; i < 6; i++) { - sTrainerTowerOpponent->speechWin[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechWin[r9]; - sTrainerTowerOpponent->speechLose[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechLose[r9]; + sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i]; + sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i]; - if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1) + if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE) { - sTrainerTowerOpponent->speechWin2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechWin[r9]; - sTrainerTowerOpponent->speechLose2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechLose[r9]; + sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i]; + sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i]; } } - sTrainerTowerOpponent->battleType = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType; - sTrainerTowerOpponent->facilityClass = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].facilityClass; - sTrainerTowerOpponent->gender = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].gender; - SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0); - sub_815DD2C(); + sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType; + sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; + sTrainerTowerOpponent->gender = CURR_FLOOR.trainers[trainerId].gender; + SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); + FreeTrainerTowerDataStruct(); } void FreeTrainerTowerBattleStruct(void) { - Free(sTrainerTowerOpponent); - sTrainerTowerOpponent = NULL; + FREE_AND_SET_NULL(sTrainerTowerOpponent); } -void sub_815DBF4(u8 *dest, u8 opponentIdx) -// TTower_GetBeforeBattleMessage? +void GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx) { VarSet(VAR_TEMP_3, opponentIdx); TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass); @@ -502,8 +500,7 @@ void sub_815DBF4(u8 *dest, u8 opponentIdx) TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin2, dest); } -void sub_815DC40(u8 *dest, u8 opponentIdx) -// TTower_GetAfterBattleMessage? +void GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx) { VarSet(VAR_TEMP_3, opponentIdx); TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass); @@ -513,23 +510,23 @@ void sub_815DC40(u8 *dest, u8 opponentIdx) TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose2, dest); } -static void sub_815DC8C(void) // fakematching +static void SetUpTrainerTowerDataStruct(void) // fakematching { - u32 whichTimer = gSaveBlock1Ptr->unkArrayIdx; + u32 challengeType = gSaveBlock1Ptr->towerChallengeId; s32 r4; const struct TrainerTowerFloor *const * r7; sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState)); sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - 42; - if (sub_815D834() == TRUE) + if (ReadTrainerTowerAndValidate() == TRUE) CEReaderTool_LoadTrainerTower(&sTrainerTowerState->unk_0004); else { struct UnkStruct_203F458 * r0_ = sTrainerTowerState; - const struct EReaderTrainerHillSetSubstruct * r1 = &gUnknown_84827AC; - memcpy(&r0_->unk_0004, r1, sizeof(struct EReaderTrainerHillSetSubstruct)); - r7 = gUnknown_84827B4[whichTimer]; - for (r4 = 0; r4 < 8; r4++) + const struct EReaderTrainerTowerSetSubstruct * r1 = &gUnknown_84827AC; + memcpy(&r0_->unk_0004, r1, sizeof(struct EReaderTrainerTowerSetSubstruct)); + r7 = gUnknown_84827B4[challengeType]; + for (r4 = 0; r4 < MAX_TRAINER_TOWER_FLOORS; r4++) { #ifndef NONMATCHING void * r5; @@ -547,22 +544,21 @@ static void sub_815DC8C(void) // fakematching } } -static void sub_815DD2C(void) +static void FreeTrainerTowerDataStruct(void) { - Free(sTrainerTowerState); - sTrainerTowerState = NULL; + FREE_AND_SET_NULL(sTrainerTowerState); } -static void sub_815DD44(void) +static void InitTrainerTowerFloor(void) { - if (gMapHeader.mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.count) + if (gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.numFloors) { - gSpecialVar_Result = 3; - SetCurrentMapLayout(LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_ROOF); + gSpecialVar_Result = 3; // Skip past usable challenge types + SetCurrentMapLayout(LAYOUT_TRAINER_TOWER_ROOF); } else { - gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType; + gSpecialVar_Result = CURR_FLOOR.challengeType; SetCurrentMapLayout(sFloorLayouts[sTrainerTowerState->floorIdx][gSpecialVar_Result]); SetTrainerTowerNPCGraphics(); } @@ -570,66 +566,70 @@ static void sub_815DD44(void) static void SetTrainerTowerNPCGraphics(void) { - s32 r3, r4; - u8 r1, r2, r4_; - switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType) + s32 i, j; + u8 trainerGfx1, trainerGfx2, facilityClass; + switch (CURR_FLOOR.challengeType) { - case 0: - r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass; - for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++) + case CHALLENGE_TYPE_SINGLE: + facilityClass = CURR_FLOOR.trainers[0].facilityClass; + for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { - if (sSingleBattleTrainerInfo[r3].facilityClass == r2) + if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } - if (r3 != NELEMS(sSingleBattleTrainerInfo)) - r1 = sSingleBattleTrainerInfo[r3].mapObjGfx; + + if (i != NELEMS(sSingleBattleTrainerInfo)) + trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx; else - r1 = 18; - VarSet(VAR_OBJ_GFX_ID_1, r1); + trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; + + VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1); break; - case 1: - r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass; - for (r3 = 0; r3 < NELEMS(sDoubleBattleTrainerInfo); r3++) + case CHALLENGE_TYPE_DOUBLE: + facilityClass = CURR_FLOOR.trainers[0].facilityClass; + for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++) { - if (sDoubleBattleTrainerInfo[r3].facilityClass == r2) + if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass) break; } - if (r3 != NELEMS(sDoubleBattleTrainerInfo)) + if (i != NELEMS(sDoubleBattleTrainerInfo)) { - r1 = sDoubleBattleTrainerInfo[r3].mapObjGfx1; - r4_ = sDoubleBattleTrainerInfo[r3].mapObjGfx2; + trainerGfx1 = sDoubleBattleTrainerInfo[i].objGfx1; + trainerGfx2 = sDoubleBattleTrainerInfo[i].objGfx2; } else { - r1 = OBJECT_EVENT_GFX_YOUNGSTER; - r4_ = OBJECT_EVENT_GFX_YOUNGSTER; + trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; + trainerGfx2 = OBJ_EVENT_GFX_YOUNGSTER; } - VarSet(VAR_OBJ_GFX_ID_0, r1); - VarSet(VAR_OBJ_GFX_ID_3, r4_); + VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1); + VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2); break; - case 2: - for (r4 = 0; r4 < 3; r4++) + case CHALLENGE_TYPE_KNOCKOUT: + for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++) { - r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass; - for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++) + facilityClass = CURR_FLOOR.trainers[j].facilityClass; + for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { - if (sSingleBattleTrainerInfo[r3].facilityClass == r2) + if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } - if (r3 != NELEMS(sSingleBattleTrainerInfo)) - r1 = sSingleBattleTrainerInfo[r3].mapObjGfx; + + if (i != NELEMS(sSingleBattleTrainerInfo)) + trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx; else - r1 = OBJECT_EVENT_GFX_YOUNGSTER; - switch (r4) + trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER; + + switch (j) { case 0: - VarSet(VAR_OBJ_GFX_ID_2, r1); + VarSet(VAR_OBJ_GFX_ID_2, trainerGfx1); break; case 1: - VarSet(VAR_OBJ_GFX_ID_0, r1); + VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1); break; case 2: - VarSet(VAR_OBJ_GFX_ID_1, r1); + VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1); break; } } @@ -652,207 +652,224 @@ static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest) } } -static void sub_815DF54(void) +static void BufferTowerOpponentSpeech(void) { - u16 r4 = gSpecialVar_0x8006; - u8 r1; - u8 r5 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType; + u16 trainerId = gSpecialVar_0x8006; + u8 facilityClass; + u8 challengeType = CURR_FLOOR.challengeType; - if (r5 != 1) - r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass; + if (challengeType != CHALLENGE_TYPE_DOUBLE) + facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; else - r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass; + facilityClass = CURR_FLOOR.trainers[0].facilityClass; + switch (gSpecialVar_0x8005) { - case 2: - TrainerTowerGetOpponentTextColor(r5, r1); - TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechBefore, gStringVar4); + case TRAINER_TOWER_TEXT_INTRO: + TrainerTowerGetOpponentTextColor(challengeType, facilityClass); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4); break; - case 3: - TrainerTowerGetOpponentTextColor(r5, r1); - TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechWin, gStringVar4); + case TRAINER_TOWER_TEXT_PLAYER_LOST: + TrainerTowerGetOpponentTextColor(challengeType, facilityClass); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4); break; - case 4: - TrainerTowerGetOpponentTextColor(r5, r1); - TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechLose, gStringVar4); + case TRAINER_TOWER_TEXT_PLAYER_WON: + TrainerTowerGetOpponentTextColor(challengeType, facilityClass); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4); break; - case 5: - TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechAfter, gStringVar4); + case TRAINER_TOWER_TEXT_AFTER: + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4); break; } } -static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass) +static void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass) { - u16 r5 = FALSE; - s32 r4; - switch (battleType) + u16 gender = MALE; + int i; + switch (challengeType) { - case 0: - case 2: - for (r4 = 0; r4 < NELEMS(sSingleBattleTrainerInfo); r4++) + case CHALLENGE_TYPE_SINGLE: + case CHALLENGE_TYPE_KNOCKOUT: + for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++) { - if (sSingleBattleTrainerInfo[r4].facilityClass == facilityClass) + if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass) break; } - if (r4 != NELEMS(sSingleBattleTrainerInfo)) - r5 = sSingleBattleTrainerInfo[r4].gender; + if (i != NELEMS(sSingleBattleTrainerInfo)) + gender = sSingleBattleTrainerInfo[i].gender; break; - case 1: - for (r4 = 0; r4 < NELEMS(sDoubleBattleTrainerInfo); r4++) + case CHALLENGE_TYPE_DOUBLE: + for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++) { - if (sDoubleBattleTrainerInfo[r4].facilityClass == facilityClass) + if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass) break; } - if (r4 != NELEMS(sDoubleBattleTrainerInfo)) + if (i != NELEMS(sDoubleBattleTrainerInfo)) { if (VarGet(VAR_TEMP_3)) - r5 = sDoubleBattleTrainerInfo[r4].gender2; + gender = sDoubleBattleTrainerInfo[i].gender2; else - r5 = sDoubleBattleTrainerInfo[r4].gender1; + gender = sDoubleBattleTrainerInfo[i].gender1; } break; } gSpecialVar_PrevTextColor = gSpecialVar_TextColor; - gSpecialVar_TextColor = r5; + gSpecialVar_TextColor = gender; } -static void sub_815E114(void) +static void CB2_EndTrainerTowerBattle(void) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } -static void sub_815E124(u8 taskId) +static void Task_DoTrainerTowerBattle(u8 taskId) { if (BT_IsDone() == TRUE) { - gMain.savedCallback = sub_815E114; + gMain.savedCallback = CB2_EndTrainerTowerBattle; CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitBattle); DestroyTask(taskId); } } -static void sub_815E160(void) +static void DoTrainerTowerBattle(void) { gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER; - if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1) + + if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; + gTrainerBattleOpponent_A = 0; BuildEnemyParty(); - CreateTask(sub_815E124, 1); + CreateTask(Task_DoTrainerTowerBattle, 1); PlayMapChosenOrBattleBGM(0); BT_StartOnField(BattleSetup_GetBattleTowerBattleTransition()); } -static void sub_815E1C0(void) +static void TrainerTowerGetChallengeType(void) { if (!gSpecialVar_0x8005) - gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType; + gSpecialVar_Result = CURR_FLOOR.challengeType; } -static void sub_815E1F0(void) +static void TrainerTowerAddFloorCleared(void) { - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8++; + TRAINER_TOWER.floorsCleared++; } -static void TTSpecial_HasReachedTheRoof(void) +// So the player can safely go back through defeated floors to use the Poke Center (or exit challenge) +static void GetFloorAlreadyCleared(void) { u16 mapLayoutId = gMapHeader.mapLayoutId; - if (mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY <= sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].floorIdx) + if (mapLayoutId - LAYOUT_TRAINER_TOWER_1F == TRAINER_TOWER.floorsCleared + && mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY <= CURR_FLOOR.floorIdx) gSpecialVar_Result = FALSE; else gSpecialVar_Result = TRUE; } -static void sub_815E28C(void) +static void StartTrainerTowerChallenge(void) { - gSaveBlock1Ptr->unkArrayIdx = gSpecialVar_0x8005; - if (gSaveBlock1Ptr->unkArrayIdx >= NELEMS(gSaveBlock1Ptr->unkArray)) - gSaveBlock1Ptr->unkArrayIdx = 0; + gSaveBlock1Ptr->towerChallengeId = gSpecialVar_0x8005; + if (gSaveBlock1Ptr->towerChallengeId >= NUM_TOWER_CHALLENGE_TYPES) + gSaveBlock1Ptr->towerChallengeId = 0; ValidateOrResetCurTrainerTowerRecord(); - if (!sub_815D834()) - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = TRUE; + if (!ReadTrainerTowerAndValidate()) + TRAINER_TOWER.validated = TRUE; else - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = FALSE; - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 = 0; - SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0); - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 0; - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = FALSE; - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = FALSE; + TRAINER_TOWER.validated = FALSE; + TRAINER_TOWER.floorsCleared = 0; + SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); + TRAINER_TOWER.timer = 0; + TRAINER_TOWER.spokeToOwner = FALSE; + TRAINER_TOWER.checkedFinalTime = FALSE; } -static void sub_815E394(void) +static void GetOwnerState(void) { DisableVBlankCounter1(); gSpecialVar_Result = 0; - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2) + + if (TRAINER_TOWER.spokeToOwner) gSpecialVar_Result++; - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 && gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1) + if (TRAINER_TOWER.receivedPrize && TRAINER_TOWER.checkedFinalTime) gSpecialVar_Result++; - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = TRUE; + + TRAINER_TOWER.spokeToOwner = TRUE; } -static void sub_815E408(void) +static void GiveChallengePrize(void) { - u16 itemId = gUnknown_847A2B4[sTrainerTowerState->unk_0004.floors->prize]; - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0) + u16 itemId = sPrizeList[sTrainerTowerState->unk_0004.floors->prize]; + + if (TRAINER_TOWER.receivedPrize) + { gSpecialVar_Result = 2; - else if (AddBagItem(itemId, 1) == 1) + } + else if (AddBagItem(itemId, 1) == TRUE) { CopyItemName(itemId, gStringVar2); - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = TRUE; + TRAINER_TOWER.receivedPrize = TRUE; gSpecialVar_Result = 0; } else + { gSpecialVar_Result = 1; + } } -static void sub_815E4B0(void) +static void CheckFinalTime(void) { - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1) + if (TRAINER_TOWER.checkedFinalTime) + { gSpecialVar_Result = 2; - else if (GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4) > gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0) + } + else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer) { - SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0); + SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer); gSpecialVar_Result = 0; } else + { gSpecialVar_Result = 1; - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = TRUE; + } + + TRAINER_TOWER.checkedFinalTime = TRUE; } -static void TTSpecial_StartTimer(void) +static void TrainerTowerResumeTimer(void) { - if (!gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2) + if (!TRAINER_TOWER.spokeToOwner) { - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999) - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999; + if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) + TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; else - SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0); + SetVBlankCounter1Ptr(&TRAINER_TOWER.timer); } } -static void sub_815E5C4(void) +static void TrainerTowerSetPlayerLost(void) { - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = 1; + TRAINER_TOWER.hasLost = TRUE; } -static void sub_815E5F0(void) +static void GetTrainerTowerChallengeStatus(void) { - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3) + if (TRAINER_TOWER.hasLost) { - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = FALSE; - gSpecialVar_Result = 0; + TRAINER_TOWER.hasLost = FALSE; + gSpecialVar_Result = CHALLENGE_STATUS_LOST; } - else if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4) + else if (TRAINER_TOWER.unkA_4) { - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4 = FALSE; - gSpecialVar_Result = 1; + TRAINER_TOWER.unkA_4 = FALSE; + gSpecialVar_Result = CHALLENGE_STATUS_UNK; } else { - gSpecialVar_Result = 2; + gSpecialVar_Result = CHALLENGE_STATUS_NORMAL; } } @@ -861,8 +878,8 @@ static void sub_815E5F0(void) \ frames = (src); \ \ - minutes = frames / 3600; \ - frames %= 3600; \ + minutes = frames / (60 * 60); \ + frames %= (60 * 60); \ seconds = frames / 60; \ frames %= 60; \ centiseconds = frames * 168 / 100; \ @@ -872,34 +889,34 @@ static void sub_815E5F0(void) ConvertIntToDecimalStringN(gStringVar3, centiseconds, STR_CONV_MODE_LEADING_ZEROS, 2); \ }) -static void sub_815E658(void) +static void GetCurrentTime(void) { - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999) + if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) { DisableVBlankCounter1(); - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999; + TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; } - PRINT_TOWER_TIME(gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0); + PRINT_TOWER_TIME(TRAINER_TOWER.timer); } -static void sub_815E720(void) +static void ShowResultsBoard(void) { u8 windowId; s32 i; ValidateOrResetCurTrainerTowerRecord(); - windowId = AddWindow(gUnknown_847A218); + windowId = AddWindow(sTimeBoardWindowTemplate); LoadStdWindowFrameGfx(); DrawStdWindowFrame(windowId, FALSE); - AddTextPrinterParameterized(windowId, 2, gUnknown_83FE982, 0x4A, 0, 0xFF, NULL); + AddTextPrinterParameterized(windowId, 2, gText_TimeBoard, 0x4A, 0, 0xFF, NULL); - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { - PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4)); + PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime)); - StringExpandPlaceholders(gStringVar4, gUnknown_83FE998); - AddTextPrinterParameterized(windowId, 2, gUnknown_83FE9C4[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL); + StringExpandPlaceholders(gStringVar4, gText_XMinYZSec); + AddTextPrinterParameterized(windowId, 2, gTrainerTowerChallengeTypeTexts[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL); AddTextPrinterParameterized(windowId, 2, gStringVar4, 0x60, 0x2E + 0x14 * i, 0xFF, NULL); } @@ -908,23 +925,24 @@ static void sub_815E720(void) VarSet(VAR_TEMP_1, windowId); } -static void sub_815E88C(void) +static void CloseResultsBoard(void) { u8 windowId = VarGet(VAR_TEMP_1); ClearStdWindowAndFrameToTransparent(windowId, TRUE); RemoveWindow(windowId); } -static void sub_815E8B4(void) +static void TrainerTowerGetDoublesEligiblity(void) { gSpecialVar_Result = GetMonsStateToDoubles(); } -static void sub_815E8CC(void) + +static void TrainerTowerGetNumFloors(void) { - if (sTrainerTowerState->unk_0004.count != sTrainerTowerState->unk_0004.floors[0].floorIdx) + if (sTrainerTowerState->unk_0004.numFloors != sTrainerTowerState->unk_0004.floors[0].floorIdx) { - ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.count, STR_CONV_MODE_LEFT_ALIGN, 1); + ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.numFloors, STR_CONV_MODE_LEFT_ALIGN, 1); gSpecialVar_Result = TRUE; } else @@ -933,79 +951,78 @@ static void sub_815E8CC(void) } } -static void sub_815E908(void) +// Dummied? equivalent to gSpecialVar_Result = FALSE +// If it were to return TRUE the player would be warped back to the lobby +static void ShouldWarpToCounter(void) { - if (gMapHeader.mapLayoutId == LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0) - { + if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0) gSpecialVar_Result = FALSE; - } else - { gSpecialVar_Result = FALSE; - } } -static void sub_815E948(void) +static void PlayTrainerTowerEncounterMusic(void) { s32 i; - u16 var_4001 = VarGet(VAR_TEMP_1); - u8 r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[var_4001].facilityClass; + u16 idx = VarGet(VAR_TEMP_1); + u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass; for (i = 0; i < NELEMS(sTrainerEncounterMusicLUT); i++) { - if (sTrainerEncounterMusicLUT[i].unk0 == gFacilityClassToTrainerClass[r1]) + if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass]) break; } + if (i != NELEMS(sTrainerEncounterMusicLUT)) { - var_4001 = sTrainerEncounterMusicLUT[i].unk1; + idx = sTrainerEncounterMusicLUT[i].musicId; } else { - var_4001 = 0; + idx = 0; } - PlayNewMapMusic(gUnknown_847A2D2[var_4001]); + PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]); } -static void sub_815E9C8(void) +static void HasSpokenToOwner(void) { - gSpecialVar_Result = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2; + gSpecialVar_Result = TRAINER_TOWER.spokeToOwner; } static void BuildEnemyParty(void) { u16 trainerIdx = VarGet(VAR_TEMP_1); s32 level = GetPartyMaxLevel(); - u8 floorIdx = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8; + u8 floorIdx = TRAINER_TOWER.floorsCleared; s32 i; u8 monIdx; ZeroEnemyPartyMons(); - switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType) + switch (CURR_FLOOR.challengeType) { - case 0: + case CHALLENGE_TYPE_SINGLE: default: for (i = 0; i < 2; i++) { monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i]; - sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[i], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]); + CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); } break; - case 1: + case CHALLENGE_TYPE_DOUBLE: monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][0]; - sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx]); + CURR_FLOOR.trainers[0].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[0].mons[monIdx]); monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][1]; - sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[1], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx]); + CURR_FLOOR.trainers[1].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]); break; - case 2: + case CHALLENGE_TYPE_KNOCKOUT: monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx]; - sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]); + CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); break; } } @@ -1030,11 +1047,11 @@ static s32 GetPartyMaxLevel(void) static void ValidateOrResetCurTrainerTowerRecord(void) { - if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != sTrainerTowerState->unk_0004.id) + if (TRAINER_TOWER.unk9 != sTrainerTowerState->unk_0004.id) { - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = sTrainerTowerState->unk_0004.id; - SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, 215999); - gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = FALSE; + TRAINER_TOWER.unk9 = sTrainerTowerState->unk_0004.id; + SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER_MAX_TIME); + TRAINER_TOWER.receivedPrize = FALSE; } } @@ -1043,22 +1060,22 @@ void PrintTrainerTowerRecords(void) s32 i; u8 windowId = 0; - sub_815DC8C(); + SetUpTrainerTowerDataStruct(); FillWindowPixelRect(0, 0, 0, 0, 0xd8, 0x90); ValidateOrResetCurTrainerTowerRecord(); - AddTextPrinterParameterized3(0, 2, 0x4a, 0, gUnknown_847A22C, 0, gUnknown_83FE982); + AddTextPrinterParameterized3(0, 2, 0x4a, 0, sTextColors, 0, gText_TimeBoard); - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { - PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4)); - StringExpandPlaceholders(gStringVar4, gUnknown_83FE998); - AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gUnknown_83FE9C4[i]); - AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gStringVar4); + PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime)); + StringExpandPlaceholders(gStringVar4, gText_XMinYZSec); + AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]); + AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4); } PutWindowTilemap(windowId); CopyWindowToVram(windowId, 3); - sub_815DD2C(); + FreeTrainerTowerDataStruct(); } static u32 GetTrainerTowerRecordTime(u32 *counter) @@ -1075,8 +1092,8 @@ void ResetTrainerTowerResults(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { - SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4, 215999); + SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME); } } |