From 36d16c71f0fa695d05fdcb06dcbacbaa17ef675a Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:44:05 +0200 Subject: [PATCH] Feat/trainer enum usage (#140) --- data/scripts/trainer_tower.inc | 6 +- include/battle_pyramid.h | 2 +- include/battle_setup.h | 8 +- include/battle_special.h | 2 +- include/battle_tower.h | 4 +- include/cereader_tool.h | 2 +- include/constants/battle_partner.h | 9 +- include/constants/event_objects.h | 393 ++++++++++---------- include/constants/opponents.h | 11 + include/constants/pokemon.h | 55 +-- include/constants/trainer_tower.h | 7 + include/constants/trainers.h | 10 +- include/data.h | 38 +- include/difficulty.h | 2 +- include/frontier_util.h | 4 +- include/pokemon.h | 8 +- include/trainer_card.h | 2 +- include/vs_seeker.h | 4 +- rom.sha1 | 2 +- src/apprentice.c | 4 +- src/battle_bg.c | 2 +- src/battle_pyramid.c | 6 +- src/battle_setup.c | 6 +- src/battle_special.c | 6 +- src/battle_tower.c | 9 +- src/data/pokemon/trainer_class_lookups.h | 2 +- src/difficulty.c | 2 +- src/frontier_util.c | 108 +++--- src/pokemon.c | 44 ++- src/quest_log_battle.c | 3 +- src/quest_log_events.c | 39 +- src/trainer_card.c | 4 +- src/trainer_tower.c | 443 +++++++++++------------ src/trainer_tower_sets.c | 70 ++-- src/vs_seeker.c | 222 ++++++------ 35 files changed, 758 insertions(+), 781 deletions(-) diff --git a/data/scripts/trainer_tower.inc b/data/scripts/trainer_tower.inc index 6a526e9fc..c4f8bc815 100644 --- a/data/scripts/trainer_tower.inc +++ b/data/scripts/trainer_tower.inc @@ -300,9 +300,9 @@ TrainerTower_Roof_EventScript_NoRoomForPrize:: TrainerTower_Roof_EventScript_CheckFinalTime:: ttower_checkfinaltime switch VAR_RESULT - case 0, TrainerTower_Roof_EventScript_NewRecord - case 1, TrainerTower_Roof_EventScript_NoNewRecord - case 2, TrainerTower_Roof_EventScript_OwnerEnd + case TT_RESULT_NEW_RECORD, TrainerTower_Roof_EventScript_NewRecord + case TT_RESULT_NO_RECORD, TrainerTower_Roof_EventScript_NoNewRecord + case TT_RESULT_ALREADY_CHECKED, TrainerTower_Roof_EventScript_OwnerEnd TrainerTower_Roof_EventScript_NewRecord: msgbox TrainerTower_Roof_Text_DoneItInRecordTime diff --git a/include/battle_pyramid.h b/include/battle_pyramid.h index d55d8d2e9..bc70c4f93 100644 --- a/include/battle_pyramid.h +++ b/include/battle_pyramid.h @@ -16,7 +16,7 @@ void SoftResetInBattlePyramid(void); void CopyPyramidTrainerSpeechBefore(u16 trainerId); void CopyPyramidTrainerWinSpeech(u16 trainerId); void CopyPyramidTrainerLoseSpeech(u16 trainerId); -u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId); +enum TrainerEncounterMusic GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId); void GenerateBattlePyramidFloorLayout(u16 *backupMapData, bool8 setPlayerPosition); void LoadBattlePyramidObjectEventTemplates(void); void LoadBattlePyramidFloorObjectEventScripts(void); diff --git a/include/battle_setup.h b/include/battle_setup.h index 8a6a7ffea..f064f5118 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -67,9 +67,9 @@ bool32 GetTrainerFlagFromScriptPointer(const u8 *data); void SetTrainerFacingDirection(void); u8 GetTrainerBattleMode(void); bool8 GetTrainerFlag(void); -bool8 HasTrainerBeenFought(u16 trainerId); -void SetTrainerFlag(u16 trainerId); -void ClearTrainerFlag(u16 trainerId); +bool8 HasTrainerBeenFought(enum TrainerID trainerId); +void SetTrainerFlag(enum TrainerID trainerId); +void ClearTrainerFlag(enum TrainerID trainerId); void BattleSetup_StartTrainerBattle(void); void BattleSetup_StartRematchBattle(void); void ShowTrainerIntroSpeech(void); @@ -87,7 +87,7 @@ bool32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum); bool32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum); u16 GetLastBeatenRematchTrainerId(u16 trainerId); bool8 ShouldTryRematchBattle(void); -bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId); +bool8 ShouldTryRematchBattleForTrainerId(enum TrainerID trainerId); bool8 IsTrainerReadyForRematch(void); void ShouldTryGetTrainerScript(void); u16 CountMaxPossibleRematch(u16 trainerId); diff --git a/include/battle_special.h b/include/battle_special.h index 9721dfa36..405095cce 100644 --- a/include/battle_special.h +++ b/include/battle_special.h @@ -3,7 +3,7 @@ void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); void ValidateEReaderTrainer(void); -u8 GetEreaderTrainerFrontSpriteId(void); +enum TrainerPicID GetEreaderTrainerFrontSpriteId(void); void GetEreaderTrainerName(u8 *dest); enum TrainerClassID GetEreaderTrainerClassId(void); diff --git a/include/battle_tower.h b/include/battle_tower.h index eaf2da777..fe1bab225 100644 --- a/include/battle_tower.h +++ b/include/battle_tower.h @@ -4,9 +4,9 @@ #include "data.h" #include "battle_frontier.h" -extern const u8 gTowerMaleFacilityClasses[30]; +extern const enum FacilityClass gTowerMaleFacilityClasses[30]; extern const u16 gTowerMaleTrainerGfxIds[30]; -extern const u8 gTowerFemaleFacilityClasses[20]; +extern const enum FacilityClass gTowerFemaleFacilityClasses[20]; extern const u16 gTowerFemaleTrainerGfxIds[20]; void CallBattleTowerFunc(void); diff --git a/include/cereader_tool.h b/include/cereader_tool.h index 5cb5a9ebc..3f709ff92 100644 --- a/include/cereader_tool.h +++ b/include/cereader_tool.h @@ -6,7 +6,7 @@ struct TrainerTowerTrainer { - /* 0x000 */ u8 name[11]; + /* 0x000 */ u8 name[TRAINER_NAME_LENGTH + 1]; /* 0x00B */ u8 facilityClass; /* 0x00C */ u8 textColor; /* 0x00E */ u16 speechBefore[6]; diff --git a/include/constants/battle_partner.h b/include/constants/battle_partner.h index 8bea131f5..dbf12aafb 100644 --- a/include/constants/battle_partner.h +++ b/include/constants/battle_partner.h @@ -2,8 +2,11 @@ #ifndef GUARD_CONSTANTS_BATTLE_PARTNERS_H #define GUARD_CONSTANTS_BATTLE_PARTNERS_H -#define PARTNER_NONE 0 -#define PARTNER_STEVEN 1 -#define PARTNER_COUNT 2 +enum PartnerId +{ + PARTNER_NONE, + PARTNER_STEVEN, + PARTNER_COUNT, +}; #endif // GUARD_CONSTANTS_BATTLE_PARTNERS_H diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 4b7917e9c..665f15e0f 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -3,202 +3,205 @@ #include "constants/map_event_ids.h" -#define OBJ_EVENT_GFX_RED_NORMAL 0 -#define OBJ_EVENT_GFX_RED_BIKE 1 -#define OBJ_EVENT_GFX_RED_SURF 2 -#define OBJ_EVENT_GFX_RED_FIELD_MOVE 3 -#define OBJ_EVENT_GFX_RED_FISH 4 -#define OBJ_EVENT_GFX_RED_VS_SEEKER 5 -#define OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE 6 -#define OBJ_EVENT_GFX_GREEN_NORMAL 7 -#define OBJ_EVENT_GFX_GREEN_BIKE 8 -#define OBJ_EVENT_GFX_GREEN_SURF 9 -#define OBJ_EVENT_GFX_GREEN_FIELD_MOVE 10 -#define OBJ_EVENT_GFX_GREEN_FISH 11 -#define OBJ_EVENT_GFX_GREEN_VS_SEEKER 12 -#define OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE 13 -#define OBJ_EVENT_GFX_RS_BRENDAN 14 -#define OBJ_EVENT_GFX_RS_MAY 15 -#define OBJ_EVENT_GFX_LITTLE_BOY 16 -#define OBJ_EVENT_GFX_LITTLE_GIRL 17 -#define OBJ_EVENT_GFX_YOUNGSTER 18 -#define OBJ_EVENT_GFX_BOY 19 -#define OBJ_EVENT_GFX_BUG_CATCHER 20 -#define OBJ_EVENT_GFX_SITTING_BOY 21 -#define OBJ_EVENT_GFX_LASS 22 -#define OBJ_EVENT_GFX_WOMAN_1 23 -#define OBJ_EVENT_GFX_CRUSH_GIRL 24 -#define OBJ_EVENT_GFX_MAN 25 -#define OBJ_EVENT_GFX_ROCKER 26 -#define OBJ_EVENT_GFX_FAT_MAN 27 -#define OBJ_EVENT_GFX_WOMAN_2 28 -#define OBJ_EVENT_GFX_BEAUTY 29 -#define OBJ_EVENT_GFX_BALDING_MAN 30 -#define OBJ_EVENT_GFX_WOMAN_3 31 -#define OBJ_EVENT_GFX_OLD_MAN_1 32 -#define OBJ_EVENT_GFX_OLD_MAN_2 33 -#define OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN 34 -#define OBJ_EVENT_GFX_OLD_WOMAN 35 -#define OBJ_EVENT_GFX_TUBER_M_WATER 36 -#define OBJ_EVENT_GFX_TUBER_F 37 -#define OBJ_EVENT_GFX_TUBER_M_LAND 38 -#define OBJ_EVENT_GFX_CAMPER 39 -#define OBJ_EVENT_GFX_PICNICKER 40 -#define OBJ_EVENT_GFX_COOLTRAINER_M 41 -#define OBJ_EVENT_GFX_COOLTRAINER_F 42 -#define OBJ_EVENT_GFX_SWIMMER_M_WATER 43 -#define OBJ_EVENT_GFX_SWIMMER_F_WATER 44 -#define OBJ_EVENT_GFX_SWIMMER_M_LAND 45 -#define OBJ_EVENT_GFX_SWIMMER_F_LAND 46 -#define OBJ_EVENT_GFX_WORKER_M 47 -#define OBJ_EVENT_GFX_WORKER_F 48 -#define OBJ_EVENT_GFX_ROCKET_M 49 -#define OBJ_EVENT_GFX_ROCKET_F 50 -#define OBJ_EVENT_GFX_GBA_KID 51 -#define OBJ_EVENT_GFX_POKE_MANIAC 52 -#define OBJ_EVENT_GFX_BIKER 53 -#define OBJ_EVENT_GFX_BLACK_BELT 54 -#define OBJ_EVENT_GFX_SCIENTIST 55 -#define OBJ_EVENT_GFX_HIKER 56 -#define OBJ_EVENT_GFX_FISHER 57 -#define OBJ_EVENT_GFX_CHANNELER 58 -#define OBJ_EVENT_GFX_CHEF 59 -#define OBJ_EVENT_GFX_POLICEMAN 60 -#define OBJ_EVENT_GFX_GENTLEMAN 61 -#define OBJ_EVENT_GFX_SAILOR 62 -#define OBJ_EVENT_GFX_CAPTAIN 63 -#define OBJ_EVENT_GFX_NURSE 64 -#define OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST 65 -#define OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST 66 -#define OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST 67 -#define OBJ_EVENT_GFX_CLERK 68 -#define OBJ_EVENT_GFX_MG_DELIVERYMAN 69 -#define OBJ_EVENT_GFX_TRAINER_TOWER_DUDE 70 -#define OBJ_EVENT_GFX_PROF_OAK 71 -#define OBJ_EVENT_GFX_BLUE 72 -#define OBJ_EVENT_GFX_BILL 73 -#define OBJ_EVENT_GFX_LANCE 74 -#define OBJ_EVENT_GFX_AGATHA 75 -#define OBJ_EVENT_GFX_DAISY 76 -#define OBJ_EVENT_GFX_LORELEI 77 -#define OBJ_EVENT_GFX_MR_FUJI 78 -#define OBJ_EVENT_GFX_BRUNO 79 -#define OBJ_EVENT_GFX_BROCK 80 -#define OBJ_EVENT_GFX_MISTY 81 -#define OBJ_EVENT_GFX_LT_SURGE 82 -#define OBJ_EVENT_GFX_ERIKA 83 -#define OBJ_EVENT_GFX_KOGA 84 -#define OBJ_EVENT_GFX_SABRINA 85 -#define OBJ_EVENT_GFX_BLAINE 86 -#define OBJ_EVENT_GFX_GIOVANNI 87 -#define OBJ_EVENT_GFX_MOM 88 -#define OBJ_EVENT_GFX_CELIO 89 -#define OBJ_EVENT_GFX_TEACHY_TV_HOST 90 -#define OBJ_EVENT_GFX_GYM_GUY 91 -#define OBJ_EVENT_GFX_ITEM_BALL 92 -#define OBJ_EVENT_GFX_TOWN_MAP 93 -#define OBJ_EVENT_GFX_POKEDEX 94 -#define OBJ_EVENT_GFX_CUT_TREE 95 -#define OBJ_EVENT_GFX_ROCK_SMASH_ROCK 96 -#define OBJ_EVENT_GFX_PUSHABLE_BOULDER 97 -#define OBJ_EVENT_GFX_FOSSIL 98 -#define OBJ_EVENT_GFX_RUBY 99 -#define OBJ_EVENT_GFX_SAPPHIRE 100 -#define OBJ_EVENT_GFX_OLD_AMBER 101 -#define OBJ_EVENT_GFX_GYM_SIGN 102 -#define OBJ_EVENT_GFX_SIGN 103 -#define OBJ_EVENT_GFX_TRAINER_TIPS 104 -#define OBJ_EVENT_GFX_CLIPBOARD 105 -#define OBJ_EVENT_GFX_METEORITE 106 -#define OBJ_EVENT_GFX_LAPRAS_DOLL 107 -#define OBJ_EVENT_GFX_SEAGALLOP 108 -#define OBJ_EVENT_GFX_SNORLAX 109 -#define OBJ_EVENT_GFX_SPEAROW 110 -#define OBJ_EVENT_GFX_CUBONE 111 -#define OBJ_EVENT_GFX_POLIWRATH 112 -#define OBJ_EVENT_GFX_CLEFAIRY 113 -#define OBJ_EVENT_GFX_PIDGEOT 114 -#define OBJ_EVENT_GFX_JIGGLYPUFF 115 -#define OBJ_EVENT_GFX_PIDGEY 116 -#define OBJ_EVENT_GFX_CHANSEY 117 -#define OBJ_EVENT_GFX_OMANYTE 118 -#define OBJ_EVENT_GFX_KANGASKHAN 119 -#define OBJ_EVENT_GFX_PIKACHU 120 -#define OBJ_EVENT_GFX_PSYDUCK 121 -#define OBJ_EVENT_GFX_NIDORAN_F 122 -#define OBJ_EVENT_GFX_NIDORAN_M 123 -#define OBJ_EVENT_GFX_NIDORINO 124 -#define OBJ_EVENT_GFX_MEOWTH 125 -#define OBJ_EVENT_GFX_SEEL 126 -#define OBJ_EVENT_GFX_VOLTORB 127 -#define OBJ_EVENT_GFX_SLOWPOKE 128 -#define OBJ_EVENT_GFX_SLOWBRO 129 -#define OBJ_EVENT_GFX_MACHOP 130 -#define OBJ_EVENT_GFX_WIGGLYTUFF 131 -#define OBJ_EVENT_GFX_DODUO 132 -#define OBJ_EVENT_GFX_FEAROW 133 -#define OBJ_EVENT_GFX_MACHOKE 134 -#define OBJ_EVENT_GFX_LAPRAS 135 -#define OBJ_EVENT_GFX_ZAPDOS 136 -#define OBJ_EVENT_GFX_MOLTRES 137 -#define OBJ_EVENT_GFX_ARTICUNO 138 -#define OBJ_EVENT_GFX_MEWTWO 139 -#define OBJ_EVENT_GFX_MEW 140 -#define OBJ_EVENT_GFX_ENTEI 141 -#define OBJ_EVENT_GFX_SUICUNE 142 -#define OBJ_EVENT_GFX_RAIKOU 143 -#define OBJ_EVENT_GFX_LUGIA 144 -#define OBJ_EVENT_GFX_HO_OH 145 -#define OBJ_EVENT_GFX_CELEBI 146 -#define OBJ_EVENT_GFX_KABUTO 147 -#define OBJ_EVENT_GFX_DEOXYS_D 148 -#define OBJ_EVENT_GFX_DEOXYS_A 149 -#define OBJ_EVENT_GFX_DEOXYS_N 150 -#define OBJ_EVENT_GFX_SS_ANNE 151 -#define OBJ_EVENT_GFX_POKE_BALL 152 -#define OBJ_EVENT_GFX_BERRY_TREE 153 -#define OBJ_EVENT_GFX_BERRY_TREE_EARLY_STAGES 154 -#define OBJ_EVENT_GFX_BERRY_TREE_LATE_STAGES 155 -#define OBJ_EVENT_GFX_OW_MON 156 -#define OBJ_EVENT_GFX_AZUMARILL 157 -#define OBJ_EVENT_GFX_AZURILL 158 -#define OBJ_EVENT_GFX_DUSCLOPS 159 -#define OBJ_EVENT_GFX_KIRLIA 160 -#define OBJ_EVENT_GFX_SKITTY 161 -#define OBJ_EVENT_GFX_SUDOWOODO 162 -#define OBJ_EVENT_GFX_WINGULL 163 -#define OBJ_EVENT_GFX_ZIGZAGOON_2 164 -#define OBJ_EVENT_GFX_RICH_BOY 165 -#define OBJ_EVENT_GFX_COOK 166 -#define OBJ_EVENT_GFX_CYCLING_TRIATHLETE_F 167 -#define OBJ_EVENT_GFX_CYCLING_TRIATHLETE_M 168 -#define OBJ_EVENT_GFX_EXPERT_F 169 -#define OBJ_EVENT_GFX_EXPERT_M 170 -#define OBJ_EVENT_GFX_GIRL_1 171 -#define OBJ_EVENT_GFX_GIRL_2 172 -#define OBJ_EVENT_GFX_GIRL_3 173 -#define OBJ_EVENT_GFX_HEX_MANIAC 174 -#define OBJ_EVENT_GFX_MANIAC 175 -#define OBJ_EVENT_GFX_NINJA_BOY 176 -#define OBJ_EVENT_GFX_POKEFAN_F 177 -#define OBJ_EVENT_GFX_POKEFAN_M 178 -#define OBJ_EVENT_GFX_PSYCHIC_M 179 -#define OBJ_EVENT_GFX_REPORTER_F 180 -#define OBJ_EVENT_GFX_REPORTER_M 181 -#define OBJ_EVENT_GFX_RUNNING_TRIATHLETE_F 182 -#define OBJ_EVENT_GFX_RUNNING_TRIATHLETE_M 183 -#define OBJ_EVENT_GFX_SCHOOL_KID_M 184 -#define OBJ_EVENT_GFX_STEVEN 185 -#define OBJ_EVENT_GFX_SCOTT 186 -#define OBJ_EVENT_GFX_ANABEL 187 -#define OBJ_EVENT_GFX_BRANDON 188 -#define OBJ_EVENT_GFX_GRETA 189 -#define OBJ_EVENT_GFX_LUCY 190 -#define OBJ_EVENT_GFX_NOLAND 191 -#define OBJ_EVENT_GFX_SPENSER 192 -#define OBJ_EVENT_GFX_TUCKER 193 +enum ObjectEventGfx +{ + OBJ_EVENT_GFX_RED_NORMAL, + OBJ_EVENT_GFX_RED_BIKE, + OBJ_EVENT_GFX_RED_SURF, + OBJ_EVENT_GFX_RED_FIELD_MOVE, + OBJ_EVENT_GFX_RED_FISH, + OBJ_EVENT_GFX_RED_VS_SEEKER, + OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE, + OBJ_EVENT_GFX_GREEN_NORMAL, + OBJ_EVENT_GFX_GREEN_BIKE, + OBJ_EVENT_GFX_GREEN_SURF, + OBJ_EVENT_GFX_GREEN_FIELD_MOVE, + OBJ_EVENT_GFX_GREEN_FISH, + OBJ_EVENT_GFX_GREEN_VS_SEEKER, + OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE, + OBJ_EVENT_GFX_RS_BRENDAN, + OBJ_EVENT_GFX_RS_MAY, + OBJ_EVENT_GFX_LITTLE_BOY, + OBJ_EVENT_GFX_LITTLE_GIRL, + OBJ_EVENT_GFX_YOUNGSTER, + OBJ_EVENT_GFX_BOY, + OBJ_EVENT_GFX_BUG_CATCHER, + OBJ_EVENT_GFX_SITTING_BOY, + OBJ_EVENT_GFX_LASS, + OBJ_EVENT_GFX_WOMAN_1, + OBJ_EVENT_GFX_CRUSH_GIRL, + OBJ_EVENT_GFX_MAN, + OBJ_EVENT_GFX_ROCKER, + OBJ_EVENT_GFX_FAT_MAN, + OBJ_EVENT_GFX_WOMAN_2, + OBJ_EVENT_GFX_BEAUTY, + OBJ_EVENT_GFX_BALDING_MAN, + OBJ_EVENT_GFX_WOMAN_3, + OBJ_EVENT_GFX_OLD_MAN_1, + OBJ_EVENT_GFX_OLD_MAN_2, + OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN, + OBJ_EVENT_GFX_OLD_WOMAN, + OBJ_EVENT_GFX_TUBER_M_WATER, + OBJ_EVENT_GFX_TUBER_F, + OBJ_EVENT_GFX_TUBER_M_LAND, + OBJ_EVENT_GFX_CAMPER, + OBJ_EVENT_GFX_PICNICKER, + OBJ_EVENT_GFX_COOLTRAINER_M, + OBJ_EVENT_GFX_COOLTRAINER_F, + OBJ_EVENT_GFX_SWIMMER_M_WATER, + OBJ_EVENT_GFX_SWIMMER_F_WATER, + OBJ_EVENT_GFX_SWIMMER_M_LAND, + OBJ_EVENT_GFX_SWIMMER_F_LAND, + OBJ_EVENT_GFX_WORKER_M, + OBJ_EVENT_GFX_WORKER_F, + OBJ_EVENT_GFX_ROCKET_M, + OBJ_EVENT_GFX_ROCKET_F, + OBJ_EVENT_GFX_GBA_KID, + OBJ_EVENT_GFX_POKE_MANIAC, + OBJ_EVENT_GFX_BIKER, + OBJ_EVENT_GFX_BLACK_BELT, + OBJ_EVENT_GFX_SCIENTIST, + OBJ_EVENT_GFX_HIKER, + OBJ_EVENT_GFX_FISHER, + OBJ_EVENT_GFX_CHANNELER, + OBJ_EVENT_GFX_CHEF, + OBJ_EVENT_GFX_POLICEMAN, + OBJ_EVENT_GFX_GENTLEMAN, + OBJ_EVENT_GFX_SAILOR, + OBJ_EVENT_GFX_CAPTAIN, + OBJ_EVENT_GFX_NURSE, + OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST, + OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST, + OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST, + OBJ_EVENT_GFX_CLERK, + OBJ_EVENT_GFX_MG_DELIVERYMAN, + OBJ_EVENT_GFX_TRAINER_TOWER_DUDE, + OBJ_EVENT_GFX_PROF_OAK, + OBJ_EVENT_GFX_BLUE, + OBJ_EVENT_GFX_BILL, + OBJ_EVENT_GFX_LANCE, + OBJ_EVENT_GFX_AGATHA, + OBJ_EVENT_GFX_DAISY, + OBJ_EVENT_GFX_LORELEI, + OBJ_EVENT_GFX_MR_FUJI, + OBJ_EVENT_GFX_BRUNO, + OBJ_EVENT_GFX_BROCK, + OBJ_EVENT_GFX_MISTY, + OBJ_EVENT_GFX_LT_SURGE, + OBJ_EVENT_GFX_ERIKA, + OBJ_EVENT_GFX_KOGA, + OBJ_EVENT_GFX_SABRINA, + OBJ_EVENT_GFX_BLAINE, + OBJ_EVENT_GFX_GIOVANNI, + OBJ_EVENT_GFX_MOM, + OBJ_EVENT_GFX_CELIO, + OBJ_EVENT_GFX_TEACHY_TV_HOST, + OBJ_EVENT_GFX_GYM_GUY, + OBJ_EVENT_GFX_ITEM_BALL, + OBJ_EVENT_GFX_TOWN_MAP, + OBJ_EVENT_GFX_POKEDEX, + OBJ_EVENT_GFX_CUT_TREE, + OBJ_EVENT_GFX_ROCK_SMASH_ROCK, + OBJ_EVENT_GFX_PUSHABLE_BOULDER, + OBJ_EVENT_GFX_FOSSIL, + OBJ_EVENT_GFX_RUBY, + OBJ_EVENT_GFX_SAPPHIRE, + OBJ_EVENT_GFX_OLD_AMBER, + OBJ_EVENT_GFX_GYM_SIGN, + OBJ_EVENT_GFX_SIGN, + OBJ_EVENT_GFX_TRAINER_TIPS, + OBJ_EVENT_GFX_CLIPBOARD, + OBJ_EVENT_GFX_METEORITE, + OBJ_EVENT_GFX_LAPRAS_DOLL, + OBJ_EVENT_GFX_SEAGALLOP, + OBJ_EVENT_GFX_SNORLAX, + OBJ_EVENT_GFX_SPEAROW, + OBJ_EVENT_GFX_CUBONE, + OBJ_EVENT_GFX_POLIWRATH, + OBJ_EVENT_GFX_CLEFAIRY, + OBJ_EVENT_GFX_PIDGEOT, + OBJ_EVENT_GFX_JIGGLYPUFF, + OBJ_EVENT_GFX_PIDGEY, + OBJ_EVENT_GFX_CHANSEY, + OBJ_EVENT_GFX_OMANYTE, + OBJ_EVENT_GFX_KANGASKHAN, + OBJ_EVENT_GFX_PIKACHU, + OBJ_EVENT_GFX_PSYDUCK, + OBJ_EVENT_GFX_NIDORAN_F, + OBJ_EVENT_GFX_NIDORAN_M, + OBJ_EVENT_GFX_NIDORINO, + OBJ_EVENT_GFX_MEOWTH, + OBJ_EVENT_GFX_SEEL, + OBJ_EVENT_GFX_VOLTORB, + OBJ_EVENT_GFX_SLOWPOKE, + OBJ_EVENT_GFX_SLOWBRO, + OBJ_EVENT_GFX_MACHOP, + OBJ_EVENT_GFX_WIGGLYTUFF, + OBJ_EVENT_GFX_DODUO, + OBJ_EVENT_GFX_FEAROW, + OBJ_EVENT_GFX_MACHOKE, + OBJ_EVENT_GFX_LAPRAS, + OBJ_EVENT_GFX_ZAPDOS, + OBJ_EVENT_GFX_MOLTRES, + OBJ_EVENT_GFX_ARTICUNO, + OBJ_EVENT_GFX_MEWTWO, + OBJ_EVENT_GFX_MEW, + OBJ_EVENT_GFX_ENTEI, + OBJ_EVENT_GFX_SUICUNE, + OBJ_EVENT_GFX_RAIKOU, + OBJ_EVENT_GFX_LUGIA, + OBJ_EVENT_GFX_HO_OH, + OBJ_EVENT_GFX_CELEBI, + OBJ_EVENT_GFX_KABUTO, + OBJ_EVENT_GFX_DEOXYS_D, + OBJ_EVENT_GFX_DEOXYS_A, + OBJ_EVENT_GFX_DEOXYS_N, + OBJ_EVENT_GFX_SS_ANNE, + OBJ_EVENT_GFX_POKE_BALL, + OBJ_EVENT_GFX_BERRY_TREE, + OBJ_EVENT_GFX_BERRY_TREE_EARLY_STAGES, + OBJ_EVENT_GFX_BERRY_TREE_LATE_STAGES, + OBJ_EVENT_GFX_OW_MON, + OBJ_EVENT_GFX_AZUMARILL, + OBJ_EVENT_GFX_AZURILL, + OBJ_EVENT_GFX_DUSCLOPS, + OBJ_EVENT_GFX_KIRLIA, + OBJ_EVENT_GFX_SKITTY, + OBJ_EVENT_GFX_SUDOWOODO, + OBJ_EVENT_GFX_WINGULL, + OBJ_EVENT_GFX_ZIGZAGOON_2, + OBJ_EVENT_GFX_RICH_BOY, + OBJ_EVENT_GFX_COOK, + OBJ_EVENT_GFX_CYCLING_TRIATHLETE_F, + OBJ_EVENT_GFX_CYCLING_TRIATHLETE_M, + OBJ_EVENT_GFX_EXPERT_F, + OBJ_EVENT_GFX_EXPERT_M, + OBJ_EVENT_GFX_GIRL_1, + OBJ_EVENT_GFX_GIRL_2, + OBJ_EVENT_GFX_GIRL_3, + OBJ_EVENT_GFX_HEX_MANIAC, + OBJ_EVENT_GFX_MANIAC, + OBJ_EVENT_GFX_NINJA_BOY, + OBJ_EVENT_GFX_POKEFAN_F, + OBJ_EVENT_GFX_POKEFAN_M, + OBJ_EVENT_GFX_PSYCHIC_M, + OBJ_EVENT_GFX_REPORTER_F, + OBJ_EVENT_GFX_REPORTER_M, + OBJ_EVENT_GFX_RUNNING_TRIATHLETE_F, + OBJ_EVENT_GFX_RUNNING_TRIATHLETE_M, + OBJ_EVENT_GFX_SCHOOL_KID_M, + OBJ_EVENT_GFX_STEVEN, + OBJ_EVENT_GFX_SCOTT, + OBJ_EVENT_GFX_ANABEL, + OBJ_EVENT_GFX_BRANDON, + OBJ_EVENT_GFX_GRETA, + OBJ_EVENT_GFX_LUCY, + OBJ_EVENT_GFX_NOLAND, + OBJ_EVENT_GFX_SPENSER, + OBJ_EVENT_GFX_TUCKER, -#define NUM_OBJ_EVENT_GFX 194 + NUM_OBJ_EVENT_GFX, +}; // FRLG equivalents: #define OBJ_EVENT_GFX_TWIN OBJ_EVENT_GFX_LITTLE_GIRL diff --git a/include/constants/opponents.h b/include/constants/opponents.h index a96c32ab2..27e66ed41 100644 --- a/include/constants/opponents.h +++ b/include/constants/opponents.h @@ -2,6 +2,7 @@ #define GUARD_CONSTANTS_OPPONENTS_H #include "constants/battle_partner.h" +#include "constants/battle_frontier_trainers.h" enum TrainerID { @@ -758,6 +759,16 @@ enum TrainerID TRAINER_LUCY, TRAINER_BRANDON, TRAINERS_COUNT, + + // Special Trainer Ids. + TRAINER_RECORD_MIXING_FRIEND = FRONTIER_TRAINERS_COUNT, + TRAINER_RECORD_MIXING_APPRENTICE = 1020, + TRAINER_EREADER = 1021, + TRAINER_FRONTIER_BRAIN = 1022, + TRAINER_PLAYER = 1023, + TRAINER_UNION_ROOM = 0xC00, + TRAINER_LINK_OPPONENT = 0x800, + TRAINER_SECRET_BASE = 0x400, }; // NOTE: Because each Trainer uses a flag to determine when they are defeated, there is diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 335659886..c5e7ebbeb 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -49,32 +49,35 @@ enum __attribute__((packed)) Type #define EGG_GROUPS_PER_MON 2 // Pokémon natures -#define NATURE_HARDY 0 // Neutral -#define NATURE_LONELY 1 // +Atk -Def -#define NATURE_BRAVE 2 // +Atk -Speed -#define NATURE_ADAMANT 3 // +Atk -SpAtk -#define NATURE_NAUGHTY 4 // +Atk -SpDef -#define NATURE_BOLD 5 // +Def -Atk -#define NATURE_DOCILE 6 // Neutral -#define NATURE_RELAXED 7 // +Def -Speed -#define NATURE_IMPISH 8 // +Def -SpAtk -#define NATURE_LAX 9 // +Def -SpDef -#define NATURE_TIMID 10 // +Speed -Atk -#define NATURE_HASTY 11 // +Speed -Def -#define NATURE_SERIOUS 12 // Neutral -#define NATURE_JOLLY 13 // +Speed -SpAtk -#define NATURE_NAIVE 14 // +Speed - SpDef -#define NATURE_MODEST 15 // +SpAtk -Atk -#define NATURE_MILD 16 // +SpAtk -Def -#define NATURE_QUIET 17 // +SpAtk -Speed -#define NATURE_BASHFUL 18 // Neutral -#define NATURE_RASH 19 // +SpAtk -SpDef -#define NATURE_CALM 20 // +SpDef -Atk -#define NATURE_GENTLE 21 // +SpDef -Def -#define NATURE_SASSY 22 // +SpDef -Speed -#define NATURE_CAREFUL 23 // +SpDef -SpAtk -#define NATURE_QUIRKY 24 // Neutral -#define NUM_NATURES 25 +enum Nature +{ + NATURE_HARDY, // Neutral + NATURE_LONELY, // +Atk -Def + NATURE_BRAVE, // +Atk -Speed + NATURE_ADAMANT, // +Atk -SpAtk + NATURE_NAUGHTY, // +Atk -SpDef + NATURE_BOLD, // +Def -Atk + NATURE_DOCILE, // Neutral + NATURE_RELAXED, // +Def -Speed + NATURE_IMPISH, // +Def -SpAtk + NATURE_LAX, // +Def -SpDef + NATURE_TIMID, // +Speed -Atk + NATURE_HASTY, // +Speed -Def + NATURE_SERIOUS, // Neutral + NATURE_JOLLY, // +Speed -SpAtk + NATURE_NAIVE, // +Speed - SpDef + NATURE_MODEST, // +SpAtk -Atk + NATURE_MILD, // +SpAtk -Def + NATURE_QUIET, // +SpAtk -Speed + NATURE_BASHFUL, // Neutral + NATURE_RASH, // +SpAtk -SpDef + NATURE_CALM, // +SpDef -Atk + NATURE_GENTLE, // +SpDef -Def + NATURE_SASSY, // +SpDef -Speed + NATURE_CAREFUL, // +SpDef -SpAtk + NATURE_QUIRKY, // Neutral + NUM_NATURES, +}; #define NATURE_RANDOM NUM_NATURES #define NATURE_MAY_SYNCHRONIZE NUM_NATURES + 1 diff --git a/include/constants/trainer_tower.h b/include/constants/trainer_tower.h index b8a1a053e..f98f0a732 100644 --- a/include/constants/trainer_tower.h +++ b/include/constants/trainer_tower.h @@ -60,4 +60,11 @@ #define TRAINER_TOWER_MAX_TIME 215999 // 60 * 60 * 60 - 1 +enum TrainerTowerResultCheck +{ + TT_RESULT_NEW_RECORD, + TT_RESULT_NO_RECORD, + TT_RESULT_ALREADY_CHECKED, +}; + #endif //GUARD_CONSTANTS_TRAINER_TOWER_H diff --git a/include/constants/trainers.h b/include/constants/trainers.h index 11eb8355e..6e5ffc5ce 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -185,15 +185,6 @@ enum __attribute__((packed)) TrainerPicID TRAINER_PIC_COUNT, }; -// Special Trainer Ids. -#define TRAINER_RECORD_MIXING_FRIEND FRONTIER_TRAINERS_COUNT -#define TRAINER_RECORD_MIXING_APPRENTICE 1020 -#define TRAINER_EREADER 1021 -#define TRAINER_FRONTIER_BRAIN 1022 -#define TRAINER_PLAYER 1023 -#define TRAINER_UNION_ROOM 0xC00 -#define TRAINER_LINK_OPPONENT 0x800 -#define TRAINER_SECRET_BASE 0x400 enum TrainerClassID { @@ -470,6 +461,7 @@ enum FacilityClass FACILITY_CLASS_ELITE_FOUR_AGATHA, FACILITY_CLASS_ELITE_FOUR_LANCE, FACILITY_CLASS_CHAMPION_RIVAL_2, + FACILITY_CLASS_COUNT, }; enum TrainerGender diff --git a/include/data.h b/include/data.h index 53caa8e48..48da2a3f6 100644 --- a/include/data.h +++ b/include/data.h @@ -121,9 +121,9 @@ struct Trainer const struct TrainerMon *party; enum Item items[MAX_TRAINER_ITEMS]; struct StartingStatuses startingStatus; // this trainer starts a battle with a given status. see include/constants/battle.h for values - u8 trainerClass; - u8 encounterMusic:7; - u8 gender:1; + enum TrainerClassID trainerClass:8; + enum TrainerEncounterMusic encounterMusic:7; + enum TrainerGender gender:1; enum TrainerPicID trainerPic; u8 trainerName[TRAINER_NAME_LENGTH + 1]; u8 battleType:2; @@ -221,14 +221,14 @@ extern const struct FollowerMsgInfo gFollowerCuriousMessages[]; extern const struct FollowerMsgInfo gFollowerMusicMessages[]; extern const struct FollowerMsgInfo gFollowerPoisonedMessages[]; -static inline bool8 IsPartnerTrainerId(u16 trainerId) +static inline bool32 IsPartnerTrainerId(enum TrainerID trainerId) { if (trainerId >= TRAINER_PARTNER(PARTNER_NONE) && trainerId < TRAINER_PARTNER(PARTNER_COUNT)) return TRUE; return FALSE; } -static inline u16 SanitizeTrainerId(u16 trainerId) +static inline enum TrainerID SanitizeTrainerId(enum TrainerID trainerId) { switch (trainerId) { @@ -241,6 +241,8 @@ static inline u16 SanitizeTrainerId(u16 trainerId) case TRAINER_LINK_OPPONENT: case TRAINER_UNION_ROOM: return TRAINER_NONE; + default: + break; } assertf(trainerId < TRAINERS_COUNT || IsPartnerTrainerId(trainerId), "invalid trainer: %d", trainerId) @@ -251,7 +253,7 @@ static inline u16 SanitizeTrainerId(u16 trainerId) return trainerId; } -static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) +static inline const struct Trainer *GetTrainerStructFromId(enum TrainerID trainerId) { u32 sanitizedTrainerId = 0; if (gIsDebugBattle) return GetDebugAiTrainer(); @@ -264,14 +266,14 @@ static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) return &gTrainers[difficulty][sanitizedTrainerId]; } -static inline const enum TrainerClassID GetTrainerClassFromId(u16 trainerId) +static inline const enum TrainerClassID GetTrainerClassFromId(enum TrainerID trainerId) { const struct Trainer *trainer = GetTrainerStructFromId(trainerId); return trainer->trainerClass; } -static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) +static inline const u8 *GetTrainerClassNameFromId(enum TrainerID trainerId) { enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); @@ -280,7 +282,7 @@ static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) return gTrainerClasses[GetTrainerClassFromId(trainerId)].name; } -static inline const u8 *GetTrainerNameFromId(u16 trainerId) +static inline const u8 *GetTrainerNameFromId(enum TrainerID trainerId) { if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) { @@ -290,7 +292,7 @@ static inline const u8 *GetTrainerNameFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerName; } -static inline const enum TrainerPicID GetTrainerPicFromId(u16 trainerId) +static inline const enum TrainerPicID GetTrainerPicFromId(enum TrainerID trainerId) { enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); @@ -300,42 +302,42 @@ static inline const enum TrainerPicID GetTrainerPicFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerPic; } -static inline const struct StartingStatuses GetTrainerStartingStatusFromId(u16 trainerId) +static inline const struct StartingStatuses GetTrainerStartingStatusFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->startingStatus; } -static inline const enum TrainerBattleType GetTrainerBattleType(u16 trainerId) +static inline const enum TrainerBattleType GetTrainerBattleType(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->battleType; } -static inline const u8 GetTrainerPartySizeFromId(u16 trainerId) +static inline const u8 GetTrainerPartySizeFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->partySize; } -static inline const bool32 DoesTrainerHaveMugshot(u16 trainerId) +static inline const bool32 DoesTrainerHaveMugshot(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->mugshotColor; } -static inline const u8 GetTrainerMugshotColorFromId(u16 trainerId) +static inline const u8 GetTrainerMugshotColorFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->mugshotColor; } -static inline const u16 *GetTrainerItemsFromId(u16 trainerId) +static inline const enum Item *GetTrainerItemsFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->items; } -static inline const struct TrainerMon *GetTrainerPartyFromId(u16 trainerId) +static inline const struct TrainerMon *GetTrainerPartyFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->party; } -static inline const u64 GetTrainerAIFlagsFromId(u16 trainerId) +static inline const u64 GetTrainerAIFlagsFromId(enum TrainerID trainerId) { return GetTrainerStructFromId(trainerId)->aiFlags; } diff --git a/include/difficulty.h b/include/difficulty.h index c8443367c..40f78c2b6 100644 --- a/include/difficulty.h +++ b/include/difficulty.h @@ -8,7 +8,7 @@ enum DifficultyLevel GetCurrentDifficultyLevel(void); void SetCurrentDifficultyLevel(enum DifficultyLevel); enum DifficultyLevel GetBattlePartnerDifficultyLevel(u16); -enum DifficultyLevel GetTrainerDifficultyLevel(u16); +enum DifficultyLevel GetTrainerDifficultyLevel(enum TrainerID trainerId); void Script_IncreaseDifficulty(void); void Script_DecreaseDifficulty(void); void Script_GetDifficulty(void); diff --git a/include/frontier_util.h b/include/frontier_util.h index b7f93932c..b40910c07 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -32,14 +32,14 @@ void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId); u16 GetBattleFacilityTrainerGfxId(u16 trainerId); u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); enum TrainerClassID GetFrontierOpponentClass(u16 trainerId); -u8 GetFrontierTrainerFacilityClass(u16 trainerId); +enum FacilityClass GetFrontierTrainerFacilityClass(u16 trainerId); void GetFrontierTrainerName(u8 *dst, u16 trainerId); u16 GetRandomFrontierMonFromSet(u16 trainerId); void FrontierSpeechToString(const u16 *words); u8 SetFacilityPtrsGetLevel(void); u8 GetFrontierEnemyMonLevel(enum FrontierLevelMode lvlMode); s32 GetHighestLevelInPlayerParty(void); -u16 FacilityClassToGraphicsId(u8 facilityClass); +u16 FacilityClassToGraphicsId(enum FacilityClass facilityClass); void ShowBattleFrontierCaughtBannedSpecies(void); #endif // GUARD_FRONTIER_UTIL_H diff --git a/include/pokemon.h b/include/pokemon.h index 8afe26ea1..034108420 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -711,7 +711,7 @@ extern bool32 consumeItem; extern u32 removeBagItem; extern u32 removeBagItemCount; -extern const u16 gFacilityClassToPicIndex[]; +extern const enum TrainerPicID gFacilityClassToPicIndex[]; extern const enum TrainerClassID gFacilityClassToTrainerClass[]; extern const struct SpeciesInfo gSpeciesInfo[]; extern const u32 gExperienceTables[][MAX_LEVEL + 1]; @@ -719,7 +719,7 @@ extern const u8 gPPUpGetMask[]; extern const u8 gPPUpClearMask[]; extern const u8 gPPUpAddValues[]; extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2]; -extern const u16 gUnionRoomFacilityClasses[]; +extern const enum FacilityClass gUnionRoomFacilityClasses[]; extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; extern const struct AbilityInfo gAbilitiesInfo[]; @@ -860,7 +860,7 @@ void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); u8 GetPlayerFlankId(void); u16 GetLinkTrainerFlankId(u8 linkPlayerId); s32 GetBattlerMultiplayerId(u16 id); -u8 GetTrainerEncounterMusicId(u16 trainerOpponentId); +enum TrainerEncounterMusic GetTrainerEncounterMusicId(enum TrainerID trainerId); u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex); void AdjustFriendship(struct Pokemon *mon, u8 event); u8 CalculateFriendshipBonuses(struct Pokemon *mon, u32 modifier, enum HoldEffect itemHoldEffect); @@ -899,7 +899,7 @@ void PokemonSummaryDoMonAnimation(struct Sprite *sprite, enum Species species, b void StopPokemonAnimationDelayTask(void); void BattleAnimateBackSprite(struct Sprite *sprite, enum Species species); u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId); -enum TrainerPicID FacilityClassToPicIndex(u16 facilityClass); +enum TrainerPicID FacilityClassToPicIndex(enum FacilityClass facilityClass); enum TrainerPicID PlayerGenderToFrontTrainerPicId(enum Gender playerGender); void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality); void HandleSetPokedexFlagFromMon(struct Pokemon *mon, u32 caseId); diff --git a/include/trainer_card.h b/include/trainer_card.h index 2b91df508..597d8dd4e 100644 --- a/include/trainer_card.h +++ b/include/trainer_card.h @@ -41,7 +41,7 @@ struct TrainerCard /*0x4C*/ bool8 shouldDrawStickers; /*0x4D*/ bool8 hasAllMons; /*0x4E*/ u8 monIconTint; - /*0x4F*/ u8 facilityClass; + /*0x4F*/ enum FacilityClass facilityClass; /*0x50*/ u8 stickers[TRAINER_CARD_STICKER_TYPES]; /*0x54*/ u16 monSpecies[PARTY_SIZE]; }; diff --git a/include/vs_seeker.h b/include/vs_seeker.h index cc1a1ede8..678feda39 100644 --- a/include/vs_seeker.h +++ b/include/vs_seeker.h @@ -10,7 +10,7 @@ struct RematchData { - u16 trainerIDs[MAX_REMATCH_PARTIES]; + enum TrainerID trainerIDs[MAX_REMATCH_PARTIES]; u16 mapGroup; // unused u16 mapNum; // unused }; @@ -18,7 +18,7 @@ struct RematchData void Task_VsSeeker_0(u8 taskId); void ClearRematchStateByTrainerId(void); void ClearRematchStateOfLastTalked(void); -int GetRematchTrainerId(u16 trainerId); +enum TrainerID GetRematchTrainerId(enum TrainerID trainerId); bool8 UpdateVsSeekerStepCounter(void); void MapResetTrainerRematches(u16 mapGroup, u16 mapNum); void NativeVsSeekerRematchId(struct ScriptContext *ctx); diff --git a/rom.sha1 b/rom.sha1 index 61c81d243..3d4db6061 100644 --- a/rom.sha1 +++ b/rom.sha1 @@ -1 +1 @@ -b66f3fefe4ee7da9c095d84a1ce9f0b594f189c9 pokefirered.gba +1eaa3d4161c67339d2e28c40246fda57fbe26161 pokefirered.gba diff --git a/src/apprentice.c b/src/apprentice.c index 3822f44ea..c8ca05bf6 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -1181,7 +1181,7 @@ static void SetSavedApprenticeTrainerGfxId(void) { u8 i; u8 objectEventGfxId; - u8 class = gApprentices[gSaveBlock1Ptr->apprentices[0].id].facilityClass; + enum FacilityClass class = gApprentices[gSaveBlock1Ptr->apprentices[0].id].facilityClass; for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses) && gTowerMaleFacilityClasses[i] != class; i++) ; @@ -1205,7 +1205,7 @@ static void SetPlayerApprenticeTrainerGfxId(void) { u8 i; u8 objectEventGfxId; - u8 class = gApprentices[PLAYER_APPRENTICE.id].facilityClass; + enum FacilityClass class = gApprentices[PLAYER_APPRENTICE.id].facilityClass; for (i = 0; i < ARRAY_COUNT(gTowerMaleFacilityClasses) && gTowerMaleFacilityClasses[i] != class; i++) ; diff --git a/src/battle_bg.c b/src/battle_bg.c index 9d1fca371..58e3c80e5 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -942,7 +942,7 @@ static u8 GetBattleEnvironmentOverride(void) } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) return BATTLE_ENVIRONMENT_LEADER; else if (trainerClass == TRAINER_CLASS_CHAMPION) diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 81462a9c3..09b8d7bb2 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -64,8 +64,8 @@ struct PyramidFloorTemplate struct PyramidTrainerEncounterMusic { - u8 trainerClass; - u8 trainerEncounterMusic; + enum TrainerClassID trainerClass; + enum TrainerEncounterMusic trainerEncounterMusic; }; // This file's functions. @@ -1691,7 +1691,7 @@ void CopyPyramidTrainerLoseSpeech(u16 trainerId) FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose); } -u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId) +enum TrainerEncounterMusic GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId) { int i; diff --git a/src/battle_setup.c b/src/battle_setup.c index 3225d5eea..42b2e28a6 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1069,17 +1069,17 @@ void SetBattledTrainerFlag(void) FlagSet(GetTrainerAFlag()); } -bool8 HasTrainerBeenFought(u16 trainerId) +bool8 HasTrainerBeenFought(enum TrainerID trainerId) { return FlagGet(TRAINER_FLAGS_START + trainerId); } -void SetTrainerFlag(u16 trainerId) +void SetTrainerFlag(enum TrainerID trainerId) { FlagSet(TRAINER_FLAGS_START + trainerId); } -void ClearTrainerFlag(u16 trainerId) +void ClearTrainerFlag(enum TrainerID trainerId) { FlagClear(TRAINER_FLAGS_START + trainerId); } diff --git a/src/battle_special.c b/src/battle_special.c index cd6fc313a..0f1681fd2 100644 --- a/src/battle_special.c +++ b/src/battle_special.c @@ -169,12 +169,12 @@ static void UNUSED FillEReaderTrainerWithPlayerData(void) #endif //FREE_BATTLE_TOWER_E_READER } -u8 GetEreaderTrainerFrontSpriteId(void) +enum TrainerPicID GetEreaderTrainerFrontSpriteId(void) { #if FREE_BATTLE_TOWER_E_READER == FALSE return gFacilityClassToPicIndex[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; #else - return 0; + return TRAINER_PIC_NONE; #endif //FREE_BATTLE_TOWER_E_READER } @@ -183,7 +183,7 @@ enum TrainerClassID GetEreaderTrainerClassId(void) #if FREE_BATTLE_TOWER_E_READER == FALSE return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; #else - return 0; + return TRAINER_CLASS_PKMN_TRAINER_1; #endif //FREE_BATTLE_TOWER_E_READER } diff --git a/src/battle_tower.c b/src/battle_tower.c index b5b957f72..3a016b18a 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -67,7 +67,7 @@ static void ClearBattleTowerRecord(struct EmeraldBattleTowerRecord *record); #include "data/battle_frontier/battle_frontier_trainers.h" #include "data/battle_frontier/battle_frontier_mons.h" -const u8 gTowerMaleFacilityClasses[30] = +const enum FacilityClass gTowerMaleFacilityClasses[30] = { FACILITY_CLASS_RUIN_MANIAC, FACILITY_CLASS_TUBER_M, @@ -101,7 +101,7 @@ const u8 gTowerMaleFacilityClasses[30] = FACILITY_CLASS_HIKER }; -const u8 gTowerFemaleFacilityClasses[20] = +const enum FacilityClass gTowerFemaleFacilityClasses[20] = { FACILITY_CLASS_AROMA_LADY, FACILITY_CLASS_TUBER_F, @@ -522,7 +522,7 @@ static const u8 *const sPartnerTextsSwimmerM[] = struct { - u32 facilityClass; + enum FacilityClass facilityClass; const u8 *const *strings; } static const sPartnerTrainerTextTables[] = { @@ -1001,7 +1001,8 @@ static void SaveBattleTowerRecord(void) { s32 i; enum FrontierLevelMode lvlMode; - u8 battleMode, class; + u8 battleMode; + enum FacilityClass class; struct EmeraldBattleTowerRecord *playerRecord = &gSaveBlock2Ptr->frontier.towerPlayer; ClearBattleTowerRecord(playerRecord); diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index 23429e53d..57c7f67e5 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -1,4 +1,4 @@ -const u16 gFacilityClassToPicIndex[] = +const enum TrainerPicID gFacilityClassToPicIndex[] = { [FACILITY_CLASS_AQUA_LEADER_ARCHIE] = TRAINER_PIC_AQUA_LEADER_ARCHIE, [FACILITY_CLASS_AQUA_GRUNT_M] = TRAINER_PIC_AQUA_GRUNT_M, diff --git a/src/difficulty.c b/src/difficulty.c index 470c7fb3f..bf8bb0169 100644 --- a/src/difficulty.c +++ b/src/difficulty.c @@ -39,7 +39,7 @@ enum DifficultyLevel GetBattlePartnerDifficultyLevel(u16 partnerId) return difficulty; } -enum DifficultyLevel GetTrainerDifficultyLevel(u16 trainerId) +enum DifficultyLevel GetTrainerDifficultyLevel(enum TrainerID trainerId) { enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); diff --git a/src/frontier_util.c b/src/frontier_util.c index 849106016..3a7071e06 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -46,19 +46,19 @@ struct FrontierBrainMon { - u16 species; - u16 heldItem; + enum Species species; + enum Item heldItem; u8 fixedIV; - u8 nature; + enum Nature nature; u8 evs[NUM_STATS]; - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; }; struct FrontierBrain { - u16 trainerId; - u8 objEventGfx; - u8 isFemale; + enum TrainerID trainerId; + enum ObjectEventGfx objEventGfx; + bool8 isFemale:1; const u8 *lostTexts[2]; const u8 *wonTexts[2]; u16 battledBit[2]; @@ -2581,7 +2581,7 @@ void ClearEnemyPartyAfterChallenge() bool8 IsFrontierTrainerFemale(u16 trainerId) { u32 i; - u8 facilityClass; + enum FacilityClass facilityClass; SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_EREADER) @@ -2708,7 +2708,7 @@ static void UNUSED GetRandomScaledFrontierTrainerIdRange(u8 challengeNum, u8 bat void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId) { u32 i; - u8 facilityClass; + enum FacilityClass facilityClass; u8 trainerObjectGfxId; SetFacilityPtrsGetLevel(); @@ -2804,7 +2804,7 @@ void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId) u16 GetBattleFacilityTrainerGfxId(u16 trainerId) { u32 i; - u8 facilityClass; + enum FacilityClass facilityClass; u16 trainerObjectGfxId; SetFacilityPtrsGetLevel(); @@ -2896,89 +2896,65 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId) enum TrainerClassID GetFrontierOpponentClass(u16 trainerId) { - u8 trainerClass = 0; enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); #if FREE_BATTLE_TOWER_E_READER == FALSE if (trainerId == TRAINER_EREADER) - { - trainerClass = gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; - } - else if (trainerId == TRAINER_FRONTIER_BRAIN) -#else - if (trainerId == TRAINER_FRONTIER_BRAIN) + return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; #endif //FREE_BATTLE_TOWER_E_READER - { + + if (trainerId == TRAINER_FRONTIER_BRAIN) return GetFrontierBrainTrainerClass(); - } - else if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) - { - trainerClass = gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass; - } - else if (trainerId < FRONTIER_TRAINERS_COUNT) - { - trainerClass = gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass]; - } - else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + return gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass; + + if (trainerId < FRONTIER_TRAINERS_COUNT) + return gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass]; + + if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - trainerClass = gFacilityClassToTrainerClass[GetRecordedBattleRecordMixFriendClass()]; - } + return gFacilityClassToTrainerClass[GetRecordedBattleRecordMixFriendClass()]; else - { - trainerClass = gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass]; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - trainerClass = gFacilityClassToTrainerClass[gApprentices[GetRecordedBattleApprenticeId()].facilityClass]; - } - else - { - trainerClass = gFacilityClassToTrainerClass[gApprentices[gSaveBlock1Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass]; - } + return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass]; } - return trainerClass; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + return gFacilityClassToTrainerClass[gApprentices[GetRecordedBattleApprenticeId()].facilityClass]; + + return gFacilityClassToTrainerClass[gApprentices[gSaveBlock1Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass]; } -u8 GetFrontierTrainerFacilityClass(u16 trainerId) +enum FacilityClass GetFrontierTrainerFacilityClass(u16 trainerId) { - u8 facilityClass; SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_EREADER) { #if FREE_BATTLE_TOWER_E_READER == FALSE - facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass; + return gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass; #else - facilityClass = 0; + return FACILITY_CLASS_RED; #endif //FREE_BATTLE_TOWER_E_READER } - else if (trainerId < FRONTIER_TRAINERS_COUNT) - { - facilityClass = gFacilityTrainers[trainerId].facilityClass; - } - else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + + if (trainerId < FRONTIER_TRAINERS_COUNT) + return gFacilityTrainers[trainerId].facilityClass; + + if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - facilityClass = GetRecordedBattleRecordMixFriendClass(); + return GetRecordedBattleRecordMixFriendClass(); else - facilityClass = gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass; - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - facilityClass = gApprentices[GetRecordedBattleApprenticeId()].facilityClass; - else - facilityClass = gApprentices[gSaveBlock1Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass; + return gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass; } - return facilityClass; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + return gApprentices[GetRecordedBattleApprenticeId()].facilityClass; + + return gApprentices[gSaveBlock1Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass; } void GetFrontierTrainerName(u8 *dst, u16 trainerId) @@ -3140,7 +3116,7 @@ s32 GetHighestLevelInPlayerParty(void) return highestLevel; } -u16 FacilityClassToGraphicsId(u8 facilityClass) +u16 FacilityClassToGraphicsId(enum FacilityClass facilityClass) { u16 trainerObjectGfxId; u8 i; diff --git a/src/pokemon.c b/src/pokemon.c index d8d2844b8..65b4a0bf1 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1018,7 +1018,7 @@ const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2] = // The classes used by other players in the Union Room. // These should correspond with the overworld graphics in sUnionRoomObjGfxIds -const u16 gUnionRoomFacilityClasses[NUM_UNION_ROOM_CLASSES * GENDER_COUNT] = +const enum FacilityClass gUnionRoomFacilityClasses[NUM_UNION_ROOM_CLASSES * GENDER_COUNT] = { // Male classes FACILITY_CLASS_COOLTRAINER_M, @@ -1091,7 +1091,7 @@ static const struct SpriteTemplate sTrainerBackSpriteTemplate = }; #define NUM_SECRET_BASE_CLASSES 5 -static const u8 sSecretBaseFacilityClasses[GENDER_COUNT][NUM_SECRET_BASE_CLASSES] = +static const enum FacilityClass sSecretBaseFacilityClasses[GENDER_COUNT][NUM_SECRET_BASE_CLASSES] = { [MALE] = { FACILITY_CLASS_YOUNGSTER, @@ -1710,7 +1710,7 @@ static void CreateEventMon(struct Pokemon *mon, enum Species species, u8 level, SetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); } -enum TrainerPicID GetUnionRoomTrainerPic(void) +static enum FacilityClass GetUnionRoomTrainerFacilityClass(void) { u8 linkId; u32 arrId; @@ -1722,22 +1722,22 @@ enum TrainerPicID GetUnionRoomTrainerPic(void) arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES; arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES; - return FacilityClassToPicIndex(gUnionRoomFacilityClasses[arrId]); + + return gUnionRoomFacilityClasses[arrId]; +} + +enum TrainerPicID GetUnionRoomTrainerPic(void) +{ + enum FacilityClass facilityClass = GetUnionRoomTrainerFacilityClass(); + + return FacilityClassToPicIndex(facilityClass); } enum TrainerClassID GetUnionRoomTrainerClass(void) { - u8 linkId; - u32 arrId; + enum FacilityClass facilityClass = GetUnionRoomTrainerFacilityClass(); - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - linkId = gRecordedBattleMultiplayerId ^ 1; - else - linkId = GetMultiplayerId() ^ 1; - - arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES; - arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES; - return gFacilityClassToTrainerClass[gUnionRoomFacilityClasses[arrId]]; + return gFacilityClassToTrainerClass[facilityClass]; } void CreateEnemyEventMon(void) @@ -3620,21 +3620,19 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord) enum TrainerPicID GetSecretBaseTrainerPicIndex(void) { - u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; + enum FacilityClass facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; return gFacilityClassToPicIndex[facilityClass]; } enum TrainerClassID GetSecretBaseTrainerClass(void) { - u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; + enum FacilityClass facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; return gFacilityClassToTrainerClass[facilityClass]; } bool8 IsPlayerPartyAndPokemonStorageFull(void) { - s32 i; - - for (i = 0; i < PARTY_SIZE; i++) + for (u32 i = 0; i < PARTY_SIZE; i++) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) return FALSE; @@ -5433,13 +5431,13 @@ s32 GetBattlerMultiplayerId(u16 id) return multiplayerId; } -u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) +enum TrainerEncounterMusic GetTrainerEncounterMusicId(enum TrainerID trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerOpponentId); + enum TrainerID sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE) - return GetTrainerEncounterMusicIdInBattlePyramid(trainerOpponentId); + return GetTrainerEncounterMusicIdInBattlePyramid(trainerId); else return gTrainers[difficulty][sanitizedTrainerId].encounterMusic; } @@ -6297,7 +6295,7 @@ u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId) return i; } -enum TrainerPicID FacilityClassToPicIndex(u16 facilityClass) +enum TrainerPicID FacilityClassToPicIndex(enum FacilityClass facilityClass) { return gFacilityClassToPicIndex[facilityClass]; } diff --git a/src/quest_log_battle.c b/src/quest_log_battle.c index f0090afcb..c895dad03 100644 --- a/src/quest_log_battle.c +++ b/src/quest_log_battle.c @@ -23,8 +23,7 @@ void TrySetQuestLogBattleEvent(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - switch (trainerClass) + switch (GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA)) { case TRAINER_CLASS_LEADER: eventId = QL_EVENT_DEFEATED_GYM_LEADER; diff --git a/src/quest_log_events.c b/src/quest_log_events.c index 79b0411ed..ac15cd4a5 100644 --- a/src/quest_log_events.c +++ b/src/quest_log_events.c @@ -620,18 +620,23 @@ static bool8 ShouldRegisterEvent_HandlePartyActions(u16 eventId, const u16 * dat static bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16 eventId, const u16 * genericData) { - if (eventId == QL_EVENT_DEFEATED_TRAINER) + const struct QuestLogEvent_TrainerBattle *data; + + if (eventId != QL_EVENT_DEFEATED_TRAINER) + return FALSE; + + data = (struct QuestLogEvent_TrainerBattle *)genericData; + + switch (GetTrainerClassFromId(data->trainerId)) { - const struct QuestLogEvent_TrainerBattle * data = (struct QuestLogEvent_TrainerBattle *)genericData; - u32 trainerClass = GetTrainerClassFromId(data->trainerId); - if (trainerClass == TRAINER_CLASS_RIVAL_EARLY - || trainerClass == TRAINER_CLASS_RIVAL_LATE - || trainerClass == TRAINER_CLASS_CHAMPION - || trainerClass == TRAINER_CLASS_BOSS) - return FALSE; + case TRAINER_CLASS_RIVAL_EARLY: + case TRAINER_CLASS_RIVAL_LATE: + case TRAINER_CLASS_CHAMPION: + case TRAINER_CLASS_BOSS: + return FALSE; + default: return TRUE; } - return FALSE; } void QL_EnableRecordingSteps(void) @@ -1916,17 +1921,23 @@ static const u16 *LoadEvent_DefeatedTrainer(const u16 *eventData) { const u16 *r5 = LoadEvent(QL_EVENT_DEFEATED_TRAINER, eventData); const u8 *r6 = (const u8 *)r5 + 6; - u32 trainerClass = GetTrainerClassFromId(r5[2]); + enum TrainerClassID trainerClass = GetTrainerClassFromId(r5[2]); + DynamicPlaceholderTextUtil_Reset(); GetMapNameGeneric(gStringVar1, r6[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - if (trainerClass == TRAINER_CLASS_RIVAL_EARLY - || trainerClass == TRAINER_CLASS_RIVAL_LATE - || trainerClass == TRAINER_CLASS_CHAMPION) + switch (trainerClass) + { + case TRAINER_CLASS_RIVAL_EARLY: + case TRAINER_CLASS_RIVAL_LATE: + case TRAINER_CLASS_CHAMPION: DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL)); - else + break; + default: DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetTrainerNameFromId(r5[2])); + break; + } QuestLog_GetSpeciesName(r5[0], NULL, 2); QuestLog_GetSpeciesName(r5[1], NULL, 3); diff --git a/src/trainer_card.c b/src/trainer_card.c index b58343154..ea8f53224 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -315,7 +315,7 @@ static const struct UCoords8 sTrainerPicOffsets[2][GENDER_COUNT] = }, }; -static const u8 sTrainerPicFacilityClasses[][2] = +static const enum FacilityClass sTrainerPicFacilityClasses[][2] = { [CARD_TYPE_FRLG] = { @@ -329,7 +329,7 @@ static const u8 sTrainerPicFacilityClasses[][2] = }, }; -static const u8 sLinkTrainerPicFacilityClasses[GENDER_COUNT][NUM_LINK_TRAINER_CARD_CLASSES] = +static const enum FacilityClass sLinkTrainerPicFacilityClasses[GENDER_COUNT][NUM_LINK_TRAINER_CARD_CLASSES] = { [MALE] = { diff --git a/src/trainer_tower.c b/src/trainer_tower.c index 88a286c39..47ac7c951 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -31,40 +31,34 @@ struct TrainerTowerState struct TrainerTowerOpponent { - /* 0x00 */ u8 name[11]; - /* 0x0C */ u16 speechWin[6]; - /* 0x18 */ u16 speechLose[6]; - /* 0x24 */ u16 speechWin2[6]; - /* 0x30 */ u16 speechLose2[6]; + /* 0x00 */ u8 name[TRAINER_NAME_LENGTH + 1]; + /* 0x0C */ u16 speechWin[EASY_CHAT_BATTLE_WORDS_COUNT]; + /* 0x18 */ u16 speechLose[EASY_CHAT_BATTLE_WORDS_COUNT]; + /* 0x24 */ u16 speechWin2[EASY_CHAT_BATTLE_WORDS_COUNT]; + /* 0x30 */ u16 speechLose2[EASY_CHAT_BATTLE_WORDS_COUNT]; /* 0x3C */ u8 battleType; - /* 0x3D */ u8 facilityClass; + /* 0x3D */ enum FacilityClass facilityClass; /* 0x3E */ u8 textColor; }; struct SinglesTrainerInfo { - u8 objGfx; - u8 facilityClass; - bool8 gender; + enum ObjectEventGfx objGfx; + enum FacilityClass facilityClass; + enum Gender gender; }; struct DoublesTrainerInfo { - u8 objGfx1; - u8 objGfx2; - u8 facilityClass; - bool8 gender1; - bool8 gender2; + enum ObjectEventGfx objGfx1; + enum ObjectEventGfx objGfx2; + enum FacilityClass facilityClass; + enum Gender gender1; + enum Gender gender2; }; -struct TrainerEncounterMusicPairs -{ - u8 facilityClass; - u8 musicId; -}; - -static EWRAM_DATA struct TrainerTowerState * sTrainerTowerState = NULL; -static EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL; +static EWRAM_DATA struct TrainerTowerState *sTrainerTowerState = NULL; +static EWRAM_DATA struct TrainerTowerOpponent *sTrainerTowerOpponent = NULL; EWRAM_DATA u32 *gTrainerTowerVBlankCounter = NULL; static void SetUpTrainerTowerDataStruct(void); @@ -73,7 +67,7 @@ static void InitTrainerTowerFloor(void); static void SetTrainerTowerNPCGraphics(void); static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest); static void BufferTowerOpponentSpeech(void); -static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass); +static void TrainerTowerGetOpponentTextColor(u8 battleType, enum FacilityClass facilityClass); static void DoTrainerTowerBattle(void); static void TrainerTowerGetChallengeType(void); static void TrainerTowerAddFloorCleared(void); @@ -206,115 +200,116 @@ static const struct DoublesTrainerInfo sDoubleBattleTrainerInfo[] = { {OBJ_EVENT_GFX_SWIMMER_F_LAND, OBJ_EVENT_GFX_TUBER_M_LAND, FACILITY_CLASS_SIS_AND_BRO, FEMALE, MALE} }; -static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = { - {FACILITY_CLASS_RS_AROMA_LADY, TRAINER_ENCOUNTER_MUSIC_AQUA}, - {FACILITY_CLASS_BOARDER_F, TRAINER_ENCOUNTER_MUSIC_AQUA}, - {FACILITY_CLASS_AQUA_GRUNT_F, TRAINER_ENCOUNTER_MUSIC_AQUA}, - {FACILITY_CLASS_GAMER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_RUIN_MANIAC, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_YOUNGSTER, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_RS_YOUNG_COUPLE, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_FISHERMAN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RUNNING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RS_PKMN_RANGER_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_LEADER_BRAWLY, TRAINER_ENCOUNTER_MUSIC_TWINS}, - {FACILITY_CLASS_RS_SIS_AND_BRO, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_MAGMA_LEADER_MAXIE, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_POKEFAN_F, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_RS_PKMN_RANGER_F, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_PSYCHIC_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_PICNICKER, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_ELITE_FOUR_GLACIA, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_RS_COOLTRAINER_F, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_GUITARIST, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_RS_BUG_CATCHER, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RUNNING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_CAMPER, TRAINER_ENCOUNTER_MUSIC_TWINS}, - {FACILITY_CLASS_CYCLING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_TWINS}, - {FACILITY_CLASS_RS_TUBER_F, TRAINER_ENCOUNTER_MUSIC_INTERVIEWER}, - {FACILITY_CLASS_BEAUTY, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_INTERVIEWER, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_YOUNGSTER, TRAINER_ENCOUNTER_MUSIC_RICH}, - {FACILITY_CLASS_RS_PSYCHIC_F, TRAINER_ENCOUNTER_MUSIC_RICH}, - {FACILITY_CLASS_MAGMA_GRUNT_F, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, - {FACILITY_CLASS_RS_SWIMMER_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_PKMN_TRAINER_MAY_3, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_RS_POKEMANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_SUPER_NERD, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_ENGINEER, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_MAGMA_ADMIN_F, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_RS_BLACK_BELT, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_LEADER_FLANNERY, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_RS_SAILOR, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_SAILOR, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_BUG_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_PKMN_TRAINER_MAY, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RS_CAMPER, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_KINDLER, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_BATTLE_GIRL, TRAINER_ENCOUNTER_MUSIC_MAGMA}, - {FACILITY_CLASS_COLLECTOR, TRAINER_ENCOUNTER_MUSIC_MAGMA}, - {FACILITY_CLASS_NINJA_BOY, TRAINER_ENCOUNTER_MUSIC_MAGMA}, - {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_PARASOL_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_AQUA_ADMIN_F, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_PKMN_TRAINER_BRENDAN, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RS_SWIMMER_F, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_EXPERT_F, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_RICH_BOY, TRAINER_ENCOUNTER_MUSIC_RICH}, - {FACILITY_CLASS_HEX_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_RS_HIKER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_BEAUTY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_SWIMMER_F, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_CHAMPION_STEVEN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_PKMN_TRAINER_MAY_2, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_CYCLING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_SWIMMER_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_DRAGON_TAMER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_BIKER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_CUE_BALL, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_RS_BIRD_KEEPER, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_POKEMANIAC, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_RS_TWINS, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_LEADER_WATTSON, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_BUG_CATCHER, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RS_PKMN_BREEDER_M, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_LEADER_WALLACE, TRAINER_ENCOUNTER_MUSIC_AQUA}, - {FACILITY_CLASS_LEADER_NORMAN, TRAINER_ENCOUNTER_MUSIC_AQUA}, - {FACILITY_CLASS_OLD_COUPLE, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_RS_PSYCHIC_M, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_LEADER_ROXANNE, TRAINER_ENCOUNTER_MUSIC_TWINS}, - {FACILITY_CLASS_ELITE_FOUR_DRAKE, TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR}, - {FACILITY_CLASS_RS_GENTLEMAN, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_RS_LASS, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, - {FACILITY_CLASS_BURGLAR, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_PKMN_TRAINER_WALLY, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_SCHOOL_KID_M, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_LEADER_TATE_AND_LIZA, TRAINER_ENCOUNTER_MUSIC_INTENSE}, - {FACILITY_CLASS_POKEFAN_M, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_MAGMA_ADMIN_M, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_EXPERT_M, TRAINER_ENCOUNTER_MUSIC_COOL}, - {FACILITY_CLASS_MAGMA_GRUNT_M, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_SR_AND_JR, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_LASS, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_SCHOOL_KID_F, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_RS_COOLTRAINER_M, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_FISHERMAN, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_RS_TUBER_M, TRAINER_ENCOUNTER_MUSIC_GIRL}, - {FACILITY_CLASS_HIKER, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, - {FACILITY_CLASS_BOARDER_M, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, - {FACILITY_CLASS_RS_PKMN_BREEDER_F, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_RS_PICNICKER, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_LEADER_WINONA, TRAINER_ENCOUNTER_MUSIC_MALE}, - {FACILITY_CLASS_ELITE_FOUR_SIDNEY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, - {FACILITY_CLASS_AQUA_ADMIN_M, TRAINER_ENCOUNTER_MUSIC_HIKER}, - {FACILITY_CLASS_ELITE_FOUR_PHOEBE, TRAINER_ENCOUNTER_MUSIC_MALE} +static const enum TrainerEncounterMusic sFacilityClassToEncounterMusic[FACILITY_CLASS_COUNT] = { + [FACILITY_CLASS_RS_AROMA_LADY] = TRAINER_ENCOUNTER_MUSIC_AQUA, + [FACILITY_CLASS_BOARDER_F] = TRAINER_ENCOUNTER_MUSIC_AQUA, + [FACILITY_CLASS_AQUA_GRUNT_F] = TRAINER_ENCOUNTER_MUSIC_AQUA, + [FACILITY_CLASS_GAMER] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_RUIN_MANIAC] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_YOUNGSTER] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_RS_YOUNG_COUPLE] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_FISHERMAN] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RUNNING_TRIATHLETE_F] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RS_PKMN_RANGER_M] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_LEADER_BRAWLY] = TRAINER_ENCOUNTER_MUSIC_TWINS, + [FACILITY_CLASS_RS_SIS_AND_BRO] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_MAGMA_LEADER_MAXIE] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_POKEFAN_F] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_RS_PKMN_RANGER_F] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_PSYCHIC_M] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_PICNICKER] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_ELITE_FOUR_GLACIA] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_RS_COOLTRAINER_F] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_GUITARIST] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_RS_BUG_CATCHER] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RUNNING_TRIATHLETE_M] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_CAMPER] = TRAINER_ENCOUNTER_MUSIC_TWINS, + [FACILITY_CLASS_CYCLING_TRIATHLETE_F] = TRAINER_ENCOUNTER_MUSIC_TWINS, + [FACILITY_CLASS_RS_TUBER_F] = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + [FACILITY_CLASS_BEAUTY] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_INTERVIEWER] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_YOUNGSTER] = TRAINER_ENCOUNTER_MUSIC_RICH, + [FACILITY_CLASS_RS_PSYCHIC_F] = TRAINER_ENCOUNTER_MUSIC_RICH, + [FACILITY_CLASS_MAGMA_GRUNT_F] = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [FACILITY_CLASS_RS_SWIMMER_M] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_PKMN_TRAINER_MAY_3] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_RS_POKEMANIAC] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_SUPER_NERD] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_ENGINEER] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_MAGMA_ADMIN_F] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_RS_BLACK_BELT] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_LEADER_FLANNERY] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_RS_SAILOR] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_SAILOR] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_BUG_MANIAC] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_PKMN_TRAINER_MAY] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RS_CAMPER] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_KINDLER] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_BATTLE_GIRL] = TRAINER_ENCOUNTER_MUSIC_MAGMA, + [FACILITY_CLASS_COLLECTOR] = TRAINER_ENCOUNTER_MUSIC_MAGMA, + [FACILITY_CLASS_NINJA_BOY] = TRAINER_ENCOUNTER_MUSIC_MAGMA, + [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_PARASOL_LADY] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_AQUA_ADMIN_F] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_PKMN_TRAINER_BRENDAN] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RS_SWIMMER_F] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_EXPERT_F] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_RICH_BOY] = TRAINER_ENCOUNTER_MUSIC_RICH, + [FACILITY_CLASS_HEX_MANIAC] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_RS_HIKER] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_BEAUTY] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_SWIMMER_F] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_LADY] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_CHAMPION_STEVEN] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_PKMN_TRAINER_MAY_2] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_CYCLING_TRIATHLETE_M] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_SWIMMER_M] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_DRAGON_TAMER] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_BIKER] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_SWIMMING_TRIATHLETE_M] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_CUE_BALL] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_RS_BIRD_KEEPER] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_SWIMMING_TRIATHLETE_F] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_POKEMANIAC] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_RS_TWINS] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_LEADER_WATTSON] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_BUG_CATCHER] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RS_PKMN_BREEDER_M] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_LEADER_WALLACE] = TRAINER_ENCOUNTER_MUSIC_AQUA, + [FACILITY_CLASS_LEADER_NORMAN] = TRAINER_ENCOUNTER_MUSIC_AQUA, + [FACILITY_CLASS_OLD_COUPLE] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_RS_PSYCHIC_M] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_LEADER_ROXANNE] = TRAINER_ENCOUNTER_MUSIC_TWINS, + [FACILITY_CLASS_ELITE_FOUR_DRAKE] = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, + [FACILITY_CLASS_RS_GENTLEMAN] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_RS_LASS] = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + [FACILITY_CLASS_BURGLAR] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_PKMN_TRAINER_WALLY] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_SCHOOL_KID_M] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_LEADER_TATE_AND_LIZA] = TRAINER_ENCOUNTER_MUSIC_INTENSE, + [FACILITY_CLASS_POKEFAN_M] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_MAGMA_ADMIN_M] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_EXPERT_M] = TRAINER_ENCOUNTER_MUSIC_COOL, + [FACILITY_CLASS_MAGMA_GRUNT_M] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_SR_AND_JR] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_LASS] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_SCHOOL_KID_F] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_RS_COOLTRAINER_M] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_FISHERMAN] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_RS_TUBER_M] = TRAINER_ENCOUNTER_MUSIC_GIRL, + [FACILITY_CLASS_HIKER] = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [FACILITY_CLASS_BOARDER_M] = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [FACILITY_CLASS_RS_PKMN_BREEDER_F] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_RS_PICNICKER] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_LEADER_WINONA] = TRAINER_ENCOUNTER_MUSIC_MALE, + [FACILITY_CLASS_ELITE_FOUR_SIDNEY] = TRAINER_ENCOUNTER_MUSIC_FEMALE, + [FACILITY_CLASS_AQUA_ADMIN_M] = TRAINER_ENCOUNTER_MUSIC_HIKER, + [FACILITY_CLASS_ELITE_FOUR_PHOEBE] = TRAINER_ENCOUNTER_MUSIC_MALE, }; -static const struct WindowTemplate sTimeBoardWindowTemplate[] = { +static const struct WindowTemplate sTimeBoardWindowTemplate[] = +{ { .bg = 0, .tilemapLeft = 3, @@ -326,8 +321,6 @@ static const struct WindowTemplate sTimeBoardWindowTemplate[] = { }, DUMMY_WIN_TEMPLATE }; -static const u32 sUnusedValue = 112; - static const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static void (*const sTrainerTowerFunctions[])(void) = { @@ -355,7 +348,8 @@ static void (*const sTrainerTowerFunctions[])(void) = { }; // - 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] = { +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}, @@ -366,22 +360,23 @@ static const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYP {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT} }; -static const enum Item sPrizeList[] = { - ITEM_HP_UP, - ITEM_PROTEIN, - ITEM_IRON, - ITEM_CARBOS, - ITEM_CALCIUM, - ITEM_ZINC, - ITEM_BRIGHT_POWDER, - ITEM_WHITE_HERB, - ITEM_MENTAL_HERB, - ITEM_CHOICE_BAND, - ITEM_KINGS_ROCK, - ITEM_SCOPE_LENS, - ITEM_METAL_COAT, - ITEM_DRAGON_SCALE, - ITEM_UP_GRADE +static const enum Item sPrizeList[] = +{ + [TTPRIZE_HP_UP] = ITEM_HP_UP, + [TTPRIZE_PROTEIN] = ITEM_PROTEIN, + [TTPRIZE_IRON] = ITEM_IRON, + [TTPRIZE_CARBOS] = ITEM_CARBOS, + [TTPRIZE_CALCIUM] = ITEM_CALCIUM, + [TTPRIZE_ZINC] = ITEM_ZINC, + [TTPRIZE_BRIGHT_POWDER] = ITEM_BRIGHT_POWDER, + [TTPRIZE_WHITE_HERB] = ITEM_WHITE_HERB, + [TTPRIZE_MENTAL_HERB] = ITEM_MENTAL_HERB, + [TTPRIZE_CHOICE_BAND] = ITEM_CHOICE_BAND, + [TTPRIZE_KINGS_ROCK] = ITEM_KINGS_ROCK, + [TTPRIZE_SCOPE_LENS] = ITEM_SCOPE_LENS, + [TTPRIZE_METAL_COAT] = ITEM_METAL_COAT, + [TTPRIZE_DRAGON_SCALE] = ITEM_DRAGON_SCALE, + [TTPRIZE_UP_GRADE] = ITEM_UP_GRADE, }; static const u16 sTrainerTowerEncounterMusic[] = { @@ -447,7 +442,7 @@ void CallTrainerTowerFunc(void) FreeTrainerTowerDataStruct(); } -u8 GetTrainerTowerOpponentClass(void) +enum TrainerClassID GetTrainerTowerOpponentClass(void) { return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass]; } @@ -464,29 +459,28 @@ u8 GetTrainerTowerTrainerFrontSpriteId(void) void InitTrainerTowerBattleStruct(void) { - u16 trainerId; - int i; + u16 trainerIndex; SetUpTrainerTowerDataStruct(); sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent)); - trainerId = VarGet(VAR_TEMP_1); - StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11); + trainerIndex = VarGet(VAR_TEMP_1); + StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerIndex].name, TRAINER_NAME_LENGTH + 1); - for (i = 0; i < 6; i++) + for (u32 i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) { - sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i]; - sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i]; + sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerIndex].speechWin[i]; + sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerIndex].speechLose[i]; if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE) { - sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i]; - sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i]; + sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerIndex + 1].speechWin[i]; + sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerIndex + 1].speechLose[i]; } } sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType; - sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; - sTrainerTowerOpponent->textColor = CURR_FLOOR.trainers[trainerId].textColor; + sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerIndex].facilityClass; + sTrainerTowerOpponent->textColor = CURR_FLOOR.trainers[trainerIndex].textColor; #if FREE_TRAINER_HILL == FALSE SetTrainerTowerVBlankCounter(&TRAINER_TOWER.timer); #endif //FREE_TRAINER_HILL @@ -525,22 +519,24 @@ static void SetUpTrainerTowerDataStruct(void) #else u32 challengeType = CHALLENGE_TYPE_SINGLE; #endif // FREE_TRAINER_HILL - s32 i; - const struct TrainerTowerFloor *const * floors_p; + const struct TrainerTowerFloor *const *floors_p; sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState)); sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_1F; if (ReadTrainerTowerAndValidate() == TRUE) + { CEReaderTool_LoadTrainerTower(&sTrainerTowerState->data); + } else { struct TrainerTowerState * ttstate_p = sTrainerTowerState; - const struct EReaderTrainerTowerSetSubstruct * header_p = &gTrainerTowerLocalHeader; + const struct EReaderTrainerTowerSetSubstruct *header_p = &gTrainerTowerLocalHeader; + memcpy(&ttstate_p->data, header_p, sizeof(struct EReaderTrainerTowerSetSubstruct)); floors_p = gTrainerTowerFloors[challengeType]; - for (i = 0; i < MAX_TRAINER_TOWER_FLOORS; i++) + for (u32 i = 0; i < MAX_TRAINER_TOWER_FLOORS; i++) { - *(sTrainerTowerState->data.floors + i) = *(floors_p[i]); // manual pointer arithmetic needed to match + sTrainerTowerState->data.floors[i] = *(floors_p[i]); } sTrainerTowerState->data.checksum = CalcByteArraySum((void *)sTrainerTowerState->data.floors, sizeof(sTrainerTowerState->data.floors)); ValidateOrResetCurTrainerTowerRecord(); @@ -569,8 +565,10 @@ static void InitTrainerTowerFloor(void) static void SetTrainerTowerNPCGraphics(void) { - s32 i, j; - u8 trainerGfx1, trainerGfx2, facilityClass; + u32 i; + enum ObjectEventGfx trainerGfx1, trainerGfx2; + enum FacilityClass facilityClass; + switch (CURR_FLOOR.challengeType) { case CHALLENGE_TYPE_SINGLE: @@ -609,7 +607,7 @@ static void SetTrainerTowerNPCGraphics(void) VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2); break; case CHALLENGE_TYPE_KNOCKOUT: - for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++) + for (u32 j = 0; j < MAX_TRAINERS_PER_FLOOR; j++) { facilityClass = CURR_FLOOR.trainers[j].facilityClass; for (i = 0; i < ARRAY_COUNT(sSingleBattleTrainerInfo); i++) @@ -643,7 +641,7 @@ static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest) { s32 i; ConvertEasyChatWordsToString(dest, ecWords, 3, 2); - if ((unsigned)GetStringWidth(FONT_NORMAL, dest, -1) > 196) + if (GetStringWidth(FONT_NORMAL, dest, -1) > 196) { // Has to be printed 2x3 ConvertEasyChatWordsToString(dest, ecWords, 2, 3); @@ -661,12 +659,12 @@ static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest) static void BufferTowerOpponentSpeech(void) { - u16 trainerId = gSpecialVar_0x8006; - u8 facilityClass; + u16 trainerIndex = gSpecialVar_0x8006; + enum FacilityClass facilityClass; u8 challengeType = CURR_FLOOR.challengeType; if (challengeType != CHALLENGE_TYPE_DOUBLE) - facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass; + facilityClass = CURR_FLOOR.trainers[trainerIndex].facilityClass; else facilityClass = CURR_FLOOR.trainers[0].facilityClass; @@ -674,23 +672,23 @@ static void BufferTowerOpponentSpeech(void) { case TRAINER_TOWER_TEXT_INTRO: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); - TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerIndex].speechBefore, gStringVar4); break; case TRAINER_TOWER_TEXT_PLAYER_LOST: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); - TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerIndex].speechWin, gStringVar4); break; case TRAINER_TOWER_TEXT_PLAYER_WON: TrainerTowerGetOpponentTextColor(challengeType, facilityClass); - TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerIndex].speechLose, gStringVar4); break; case TRAINER_TOWER_TEXT_AFTER: - TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4); + TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerIndex].speechAfter, gStringVar4); break; } } -static void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass) +static void TrainerTowerGetOpponentTextColor(u8 challengeType, enum FacilityClass facilityClass) { u16 gender = MALE; int i; @@ -732,13 +730,13 @@ static void CB2_EndTrainerTowerBattle(void) static void Task_DoTrainerTowerBattle(u8 taskId) { - if (IsBattleTransitionDone() == TRUE) - { - gMain.savedCallback = CB2_EndTrainerTowerBattle; - CleanupOverworldWindowsAndTilemaps(); - SetMainCallback2(CB2_InitBattle); - DestroyTask(taskId); - } + if (!IsBattleTransitionDone()) + return; + + gMain.savedCallback = CB2_EndTrainerTowerBattle; + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_InitBattle); + DestroyTask(taskId); } static void DoTrainerTowerBattle(void) @@ -848,34 +846,35 @@ static void CheckFinalTime(void) #if FREE_TRAINER_HILL == FALSE if (TRAINER_TOWER.checkedFinalTime) { - gSpecialVar_Result = 2; + gSpecialVar_Result = TT_RESULT_ALREADY_CHECKED; } else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer) { SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer); - gSpecialVar_Result = 0; + gSpecialVar_Result = TT_RESULT_NEW_RECORD; } else { - gSpecialVar_Result = 1; + gSpecialVar_Result = TT_RESULT_NO_RECORD; } TRAINER_TOWER.checkedFinalTime = TRUE; #else - gSpecialVar_Result = 0; + gSpecialVar_Result = TT_RESULT_ALREADY_CHECKED; #endif //FREE_TRAINER_HILL } static void TrainerTowerResumeTimer(void) { #if FREE_TRAINER_HILL == FALSE - if (!TRAINER_TOWER.spokeToOwner) - { - if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) - TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; - else - SetTrainerTowerVBlankCounter(&TRAINER_TOWER.timer); - } + if (TRAINER_TOWER.spokeToOwner) + return; + + if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME) + TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME; + else + SetTrainerTowerVBlankCounter(&TRAINER_TOWER.timer); + #endif //FREE_TRAINER_HILL } @@ -1008,25 +1007,11 @@ static void ShouldWarpToCounter(void) static void PlayTrainerTowerEncounterMusic(void) { - s32 i; - u16 idx = VarGet(VAR_TEMP_1); - u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass; + u16 trainerIndex = VarGet(VAR_TEMP_1); + enum FacilityClass facilityClass = CURR_FLOOR.trainers[trainerIndex].facilityClass; + enum TrainerEncounterMusic musicId = sFacilityClassToEncounterMusic[facilityClass]; - for (i = 0; i < ARRAY_COUNT(sTrainerEncounterMusicLUT); i++) - { - if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass]) - break; - } - - if (i != ARRAY_COUNT(sTrainerEncounterMusicLUT)) - { - idx = sTrainerEncounterMusicLUT[i].musicId; - } - else - { - idx = 0; - } - PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]); + PlayNewMapMusic(sTrainerTowerEncounterMusic[musicId]); } static void HasSpokenToOwner(void) @@ -1038,14 +1023,13 @@ static void HasSpokenToOwner(void) static void BuildEnemyParty(void) { - u16 trainerIdx = VarGet(VAR_TEMP_1); + u16 trainerIndex = VarGet(VAR_TEMP_1); s32 level = GetPartyMaxLevel(); #if FREE_TRAINER_HILL == FALSE u8 floorIdx = TRAINER_TOWER.floorsCleared; #else u8 floorIdx = gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_1F; #endif //FREE_TRAINER_HILL - s32 i; u8 monIdx; ZeroEnemyPartyMons(); @@ -1054,11 +1038,11 @@ static void BuildEnemyParty(void) { case CHALLENGE_TYPE_SINGLE: default: - for (i = 0; i < 2; i++) + for (u32 i = 0; i < 2; i++) { monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i]; - CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); + CURR_FLOOR.trainers[trainerIndex].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIndex].mons[monIdx]); } break; case CHALLENGE_TYPE_DOUBLE: @@ -1071,9 +1055,9 @@ static void BuildEnemyParty(void) CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]); break; case CHALLENGE_TYPE_KNOCKOUT: - monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx]; - CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level; - CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]); + monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIndex]; + CURR_FLOOR.trainers[trainerIndex].mons[monIdx].level = level; + CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIndex].mons[monIdx]); break; } } @@ -1081,9 +1065,8 @@ static void BuildEnemyParty(void) static s32 GetPartyMaxLevel(void) { s32 topLevel = 0; - s32 i; - for (i = 0; i < PARTY_SIZE; i++) + for (u32 i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG) { @@ -1117,14 +1100,14 @@ void PrintTrainerTowerRecords(void) SetUpTrainerTowerDataStruct(); FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 216, 144); ValidateOrResetCurTrainerTowerRecord(); - AddTextPrinterParameterized3(0, FONT_NORMAL, 0x4a, 0, sTextColors, 0, gText_TimeBoard); + AddTextPrinterParameterized3(0, FONT_NORMAL, 74, 0, sTextColors, 0, gText_TimeBoard); for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) { PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime)); StringExpandPlaceholders(gStringVar4, gText_XMinYZSec); - AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]); - AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4); + AddTextPrinterParameterized3(windowId, FONT_NORMAL, 24, 36 + 20 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]); + AddTextPrinterParameterized3(windowId, FONT_NORMAL, 96, 36 + 20 * i, sTextColors, 0, gStringVar4); } PutWindowTilemap(windowId); @@ -1148,11 +1131,9 @@ static void SetTrainerTowerRecordTime(u32 *counter, u32 value) void ResetTrainerTowerResults(void) { #if FREE_TRAINER_HILL == FALSE - s32 i; - for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) - { + for (u32 i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++) SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME); - } + #endif //FREE_TRAINER_HILL } diff --git a/src/trainer_tower_sets.c b/src/trainer_tower_sets.c index 78082bfd2..ba394a3ec 100644 --- a/src/trainer_tower_sets.c +++ b/src/trainer_tower_sets.c @@ -10,7 +10,7 @@ // Dummy strings must be declared explicitly for the sake of modern gcc #define DUMMY_TOWER_MON(iv) {.hpIV = iv, .attackIV = iv, .defenseIV = iv, .speedIV = iv, .spAttackIV = iv, .spDefenseIV = iv, .nickname = _("$$$$$$$$$$")} -#define DUMMY_TOWER_TEAM(iv) {.name = _(""), .textColor = 1, .speechBefore = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechWin = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .mons = {DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv)}} +#define DUMMY_TOWER_TEAM(iv) {.name = _(""), .textColor = 1, .speechBefore = {EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = {DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv)}} static const struct TrainerTowerFloor sTrainerTowerFloor_Single_4 = { .id = 1, @@ -23,9 +23,9 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Single_4 = { .facilityClass = FACILITY_CLASS_YOUNGSTER, .textColor = 1, .speechBefore = {EC_WORD_AHAHA, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_ANYWHERE, EC_WORD_EXCL}, - .speechWin = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_WORD_BYE_BYE, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_WORD_BYE_BYE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HIYAH, EC_WORD_EXCL_EXCL, EC_WORD_DONE, EC_WORD_IN, EC_WORD_TOTALLY, EC_WORD_EXCL_EXCL}, - .speechAfter = {EC_WORD_TCH, EC_WORD_TCH, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF}, + .speechAfter = {EC_WORD_TCH, EC_WORD_TCH, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_RATICATE, @@ -489,7 +489,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_5 = { .textColor = 7, .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_TO, EC_WORD_YOU, EC_WORD_HERE}, .speechWin = {EC_WORD_VERY, EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_WORD_GOOD, EC_WORD_BATTLE}, - .speechLose = {EC_WORD_UNBELIEVABLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_UNBELIEVABLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_BUT, EC_WORD_YOU, EC_WORD_WIN, EC_WORD_ELLIPSIS}, .mons = { { @@ -787,7 +787,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_6 = { .speechBefore = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_LOST, EC_WORD_IN, EC_WORD_LOVEY_DOVEY, EC_WORD_HAPPINESS}, .speechWin = {EC_WORD_OH, EC_WORD_OH, EC_WORD_HE, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_SERIOUS, EC_WORD_QUES}, - .speechAfter = {EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF, 0xFFFF}, + .speechAfter = {EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_TAUROS, @@ -1522,7 +1522,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_1 = { .facilityClass = FACILITY_CLASS_BIKER, .textColor = 1, .speechBefore = {EC_WORD_IT_S, EC_WORD_SLEEP, EC_WORD_TIME, EC_WORD_FOR, EC_WORD_CHILDREN, EC_WORD_EXCL}, - .speechWin = {EC_WORD_NOT, EC_WORD_GUTSY, EC_WORD_ENOUGH, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_NOT, EC_WORD_GUTSY, EC_WORD_ENOUGH, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHY, EC_WORD_DID, EC_WORD_YOU, EC_WORD_CRUSH, EC_WORD_ME, EC_WORD_QUES}, .speechAfter = {EC_WORD_I_AM, EC_WORD_BEAT, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_NAP}, .mons = { @@ -1666,7 +1666,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_1 = { .textColor = 1, .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_WORD_HERE_I_COME, EC_WORD_TO, EC_WORD_SWARM, EC_WORD_YOU}, .speechWin = {EC_WORD_I_AM, EC_WORD_INVINCIBLE, EC_WORD_YOU, EC_WORD_GOT, EC_WORD_THAT, EC_WORD_QUES}, - .speechLose = {EC_WORD_WHAT, EC_WORD_WAS, EC_WORD_THAT, EC_WORD_QUES, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_WHAT, EC_WORD_WAS, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_NEXT, EC_WORD_TIME}, .mons = { { @@ -1960,9 +1960,9 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_2 = { .name = _("REBECCA"), .facilityClass = FACILITY_CLASS_CRUSH_GIRL, .textColor = 5, - .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_OVERWHELMING}, - .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_YOU, EC_WORD_ANGER, EC_WORD_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_TOUGH}, .mons = { { @@ -2724,7 +2724,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_3 = { .speechBefore = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME}, .speechWin = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_TOO, EC_WORD_AWESOME}, .speechLose = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_ISN_T, EC_WORD_AWESOME, EC_WORD_QUES}, - .speechAfter = {EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, + .speechAfter = {EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_HITMONLEE, @@ -2864,9 +2864,9 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_3 = { .name = _("RIC & RENE"), .facilityClass = FACILITY_CLASS_CRUSH_KIN, .textColor = 5, - .speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_HUH_QUES, 0xFFFF, EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_AWESOME, EC_WORD_QUES}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_AWESOME, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_AWESOME, EC_WORD_QUES}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_DO, EC_WORD_MY, EC_WORD_BEST, EC_WORD_EXCL}, .mons = { { @@ -3019,8 +3019,8 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_1 = { .facilityClass = FACILITY_CLASS_TWINS, .textColor = 5, .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL}, - .speechWin = {EC_WORD_EHEHE, EC_WORD_YAY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_EHEHE, EC_WORD_YAY, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TRY, EC_WORD_TO, EC_WORD_GET, EC_WORD_BETTER}, .mons = { { @@ -3161,10 +3161,10 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_1 = { .name = _("JEN & KIRA"), .facilityClass = FACILITY_CLASS_TWINS, .textColor = 3, - .speechBefore = {EC_WORD_LET_S, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechAfter = {EC_WORD_WE, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_BETTER, 0xFFFF}, + .speechBefore = {EC_WORD_LET_S, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechAfter = {EC_WORD_WE, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_BETTER, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_JOLTEON, @@ -3316,8 +3316,8 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_4 = { .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 1, .speechBefore = {EC_WORD_OUR, EC_MOVE(EARTHQUAKE), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SHAKY}, - .speechWin = {EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_HUH_QUES, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_I_AM, EC_WORD_ALL, EC_WORD_SHAKY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_I_AM, EC_WORD_ALL, EC_WORD_SHAKY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_ISN_T, EC_WORD_SHAKY, EC_WORD_SHE_IS, EC_WORD_LOVEY_DOVEY}, .mons = { { @@ -3613,7 +3613,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_8 = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, .textColor = 7, .speechBefore = {EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, EC_WORD_IS, EC_WORD_IMPORTANT, EC_WORD_ISN_T_IT_QUES}, - .speechWin = {EC_WORD_YOU, EC_WORD_TAKE, EC_WORD_THE, EC_WORD_LOSS, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_YOU, EC_WORD_TAKE, EC_WORD_THE, EC_WORD_LOSS, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BE, EC_WORD_KIND, EC_WORD_TO, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .speechAfter = {EC_WORD_DON_T, EC_WORD_EVER, EC_WORD_POISON, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .mons = { @@ -3757,7 +3757,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_8 = { .textColor = 7, .speechBefore = {EC_WORD_I, EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREAT, EC_WORD_GREEN, EC_WORD_WORLD}, .speechWin = {EC_WORD_TAKE_THAT, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_LOSS, EC_WORD_IS, EC_WORD_YOURS}, - .speechLose = {EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, 0xFFFF, 0xFFFF}, + .speechLose = {EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_MOVE2(PROTECT), EC_WORD_AND, EC_WORD_RESUSCITATE, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD}, .mons = { { @@ -4054,7 +4054,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_3 = { .speechBefore = {EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_I, EC_WORD_WON_T, EC_WORD_LOSE, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_I, EC_WORD_WOULD, EC_WORD_WIN}, .speechLose = {EC_WORD_OH_QUES, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_DID, EC_WORD_I, EC_WORD_LOSE, EC_WORD_QUES}, - .speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_MURKROW, @@ -4195,8 +4195,8 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_3 = { .facilityClass = FACILITY_CLASS_AROMA_LADY, .textColor = 1, .speechBefore = {EC_WORD_THIS, EC_MOVE(SWEET_SCENT), EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_IT, EC_WORD_QUES}, - .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_NICE, EC_WORD_QUES, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_THAT, EC_WORD_WASN_T, EC_WORD_GOOD, EC_WORD_QUES, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_NICE, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_THAT, EC_WORD_WASN_T, EC_WORD_GOOD, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I, EC_MOVE2(REFRESH), EC_WORD_THINGS, EC_WORD_WITH, EC_WORD_REFRESHING, EC_MOVE(AROMATHERAPY)}, .mons = { { @@ -4338,7 +4338,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_3 = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, .textColor = 7, .speechBefore = {EC_WORD_TOO, EC_WORD_BAD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_FOR, EC_WORD_YOU}, - .speechWin = {EC_WORD_SORRY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_HARD, EC_WORD_TO, EC_WORD_BELIEVE, EC_WORD_ELLIPSIS}, .speechAfter = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_PURE_POWER, EC_WORD_THAT, EC_WORD_IS, EC_WORD_NATURAL}, .mons = { @@ -4491,7 +4491,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Single_6 = { .facilityClass = FACILITY_CLASS_SWIMMER_M, .textColor = 1, .speechBefore = {EC_WORD_I_AM, EC_WORD_PRETTY, EC_WORD_HAPPY, EC_WORD_WITH, EC_WORD_MY, EC_WORD_TOUGHNESS}, - .speechWin = {EC_WORD_WROOOAAR_EXCL, 0xFFFF, EC_WORD_SERIOUSLY, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES}, + .speechWin = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_WORD_SERIOUSLY, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_SHOCKED, EC_WORD_ME, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HAPPINESS}, .speechAfter = {EC_WORD_NICE, EC_WORD_WORK, EC_WORD_YOU, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_FABULOUS}, .mons = { @@ -5396,7 +5396,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_8 = { .facilityClass = FACILITY_CLASS_COOL_COUPLE, .textColor = 7, .speechBefore = {EC_WORD_YOU_RE, EC_WORD_OUR, EC_WORD_FOE, EC_WORD_QUES, EC_WORD_GIGGLE, EC_WORD_ELLIPSIS}, - .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, 0xFFFF}, + .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_JUST, EC_WORD_INCREDIBLE}, .speechAfter = {EC_WORD_WE, EC_WORD_NEED, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_SOME, EC_WORD_MORE}, .mons = { @@ -5550,9 +5550,9 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused1 = { .facilityClass = FACILITY_CLASS_TWINS, .textColor = 1, .speechBefore = {EC_WORD_ABSOLUTELY, EC_WORD_WE_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, - .speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, - .speechAfter = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_ALL, EC_WORD_TOO_STRONG, 0xFFFF}, + .speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechAfter = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_ALL, EC_WORD_TOO_STRONG, EC_EMPTY_WORD}, .mons = { { .species = SPECIES_POLIWAG, @@ -5694,7 +5694,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused1 = { .textColor = 1, .speechBefore = {EC_WORD_CAN, EC_WORD_WE, EC_WORD_WIN, EC_WORD_QUES, EC_WORD_IT_S, EC_WORD_EXCITING}, .speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_HAPPY}, - .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_CHILDREN}, .mons = { { @@ -6882,7 +6882,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_3 = { .speechBefore = {EC_WORD_HERE_IT_IS, EC_MOVE2(THUNDER_WAVE), EC_WORD_DON_T, EC_MOVE2(WRAP), EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_ACCEPT, EC_WORD_MY, EC_MOVE2(PRESENT), EC_WORD_OF, EC_MOVE2(THUNDER_WAVE), EC_WORD_EXCL}, .speechLose = {EC_MOVE2(WRAP), EC_MOVE(BIND), EC_WORD_ELECTRIC, EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, EC_WORD_AROUND}, - .speechAfter = {EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, 0xFFFF, 0xFFFF, EC_WORD_SPIRALING, EC_MOVE2(WHIRLWIND)}, + .speechAfter = {EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_SPIRALING, EC_MOVE2(WHIRLWIND)}, .mons = { { .species = SPECIES_MAGNETON, @@ -8519,7 +8519,7 @@ static const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_5 = { .name = _("MAURA"), .facilityClass = FACILITY_CLASS_BEAUTY, .textColor = 2, - .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_GROUP, EC_WORD_LEADER, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_GROUP, EC_WORD_LEADER, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_AM, EC_WORD_I, EC_WORD_LEADER, EC_WORD_OF, EC_WORD_QUES}, .speechLose = {EC_WORD_I_AM, EC_WORD_NO, EC_WORD_LEADER, EC_WORD_IT_S, EC_WORD_A_LITTLE, EC_WORD_LIE}, .speechAfter = {EC_WORD_HEY, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_GROUND, EC_WORD_IS, EC_WORD_SLIMY}, diff --git a/src/vs_seeker.c b/src/vs_seeker.c index a131283f8..d7a50e959 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -61,7 +61,7 @@ typedef enum struct VsSeekerTrainerInfo { const u8 *script; - u16 trainerIdx; + enum TrainerID trainerId; u8 localId; u8 objectEventId; s16 xCoord; @@ -72,7 +72,7 @@ struct VsSeekerTrainerInfo struct VsSeekerStruct { struct VsSeekerTrainerInfo trainerInfo[OBJECT_EVENTS_COUNT]; - u16 trainerIdxArray[OBJECT_EVENTS_COUNT]; + enum TrainerID trainerIds[OBJECT_EVENTS_COUNT]; u8 runningBehaviourEtcArray[OBJECT_EVENTS_COUNT]; u8 numRematchableTrainers; u8 trainerHasNotYetBeenFought:1; @@ -84,40 +84,36 @@ struct VsSeekerStruct // static declarations static EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL; -static void VsSeekerResetInBagStepCounter(void); -static void VsSeekerResetChargingStepCounter(void); -static void Task_ResetObjectsRematchWantedState(u8 taskId); +static bool32 IsThisTrainerRematchable(u32 localId); +static bool8 CanUseVsSeeker(void); +static bool8 IsTrainerReadyForRematchInternal(const struct RematchData *array, enum TrainerID trainerId); +static bool8 ObjectEventIdIsSane(u8 objectEventId); +static enum TrainerID GetTrainerFlagFromScript(const u8 *script); +static int GetRematchIdx(const struct RematchData *vsSeekerData, enum TrainerID trainerId); +static int LookupVsSeekerOpponentInArray(const struct RematchData *array, enum TrainerID trainerId); +static u8 GetRandomFaceDirectionMovementType(); +static u8 GetVsSeekerResponseInArea(const struct RematchData *vsSeekerData); +static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, enum TrainerID trainerId); +static u8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, enum TrainerID trainerId); +static void ClearAllTrainerRematchStates(void); +static void GatherNearbyTrainerInfo(void); static void ResetMovementOfRematchableTrainers(void); +static void StartAllRespondantIdleMovements(void); +static void Task_ResetObjectsRematchWantedState(u8 taskId); static void Task_VsSeeker_1(u8 taskId); static void Task_VsSeeker_2(u8 taskId); -static void GatherNearbyTrainerInfo(void); static void Task_VsSeeker_3(u8 taskId); -static bool8 CanUseVsSeeker(void); -static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData); +static void VsSeekerResetChargingStepCounter(void); +static void VsSeekerResetInBagStepCounter(void); #if FREE_MATCH_CALL == FALSE -static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx); -#endif //FREE_MATCH_CALL -static u8 ShouldTryRematchBattleInternal(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent); -static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent); -static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId); -static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerIdx); -#if FREE_MATCH_CALL == FALSE -static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId); -#endif //FREE_MATCH_CALL -static u16 GetTrainerFlagFromScript(const u8 * script); -static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx); -static bool32 IsThisTrainerRematchable(u32 localId); -static void ClearAllTrainerRematchStates(void); -#if FREE_MATCH_CALL == FALSE -static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo); -static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr); +static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo *trainerInfo); +static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, enum TrainerID trainerId); +static u8 GetNextAvailableRematchTrainer(const struct RematchData *vsSeekerData, enum TrainerID trainerId, u8 *idxPtr); static u8 GetRematchableTrainerLocalId(void); -static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script); -static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx); +static u8 BackwardsSearchRematchTrainerIndex(const enum TrainerID *trainerIds, u8 rematchIndex); +static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId); +static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo *trainerInfo, const u8 *script); #endif //FREE_MATCH_CALL -static void StartAllRespondantIdleMovements(void); -static bool8 ObjectEventIdIsSane(u8 objectEventId); -static u8 GetRandomFaceDirectionMovementType(); #include "data/trainer_rematches.h" @@ -194,11 +190,11 @@ static void Task_ResetObjectsRematchWantedState(u8 taskId) void VsSeekerResetObjectMovementAfterChargeComplete(void) { - struct ObjectEventTemplate * templates = gSaveBlock1Ptr->objectEventTemplates; + struct ObjectEventTemplate *templates = gSaveBlock1Ptr->objectEventTemplates; u8 i; u8 movementType; u8 objEventId; - struct ObjectEvent * objectEvent; + struct ObjectEvent *objectEvent; for (i = 0; i < gMapHeader.events->objectEventCount; i++) { @@ -265,7 +261,7 @@ static void ResetMovementOfRematchableTrainers(void) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { - struct ObjectEvent * objectEvent = &gObjectEvents[i]; + struct ObjectEvent *objectEvent = &gObjectEvents[i]; if (objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM) @@ -336,7 +332,7 @@ static void Task_VsSeeker_1(u8 taskId) static void Task_VsSeeker_2(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (data[2] != 2 && --data[1] == 0) { @@ -368,7 +364,7 @@ static void GatherNearbyTrainerInfo(void) if (templates[objectEventIdx].trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].trainerType == TRAINER_TYPE_BURIED) { sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); + sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerId = GetTrainerFlagFromScript(templates[objectEventIdx].script); sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId; TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId; @@ -423,10 +419,10 @@ static u8 CanUseVsSeeker(void) #endif //FREE_MATCH_CALL } -static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData) +static u8 GetVsSeekerResponseInArea(const struct RematchData *vsSeekerData) { #if FREE_MATCH_CALL == FALSE - u16 trainerIdx = 0; + enum TrainerID trainerId = TRAINER_NONE; u16 rval = 0; u8 rematchTrainerIdx; u8 unusedIdx = 0; @@ -437,15 +433,15 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData) { if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == TRUE) { - trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx; - if (!HasTrainerBeenFought(trainerIdx)) + trainerId = sVsSeeker->trainerInfo[vsSeekerIdx].trainerId; + if (!HasTrainerBeenFought(trainerId)) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought); sVsSeeker->trainerHasNotYetBeenFought = 1; vsSeekerIdx++; continue; } - rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerIdx, &unusedIdx); + rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerId, &unusedIdx); if (rematchTrainerIdx == 0) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); @@ -454,7 +450,7 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData) else { rval = Random() % 100; // Even if it's overwritten below, it progresses the RNG. - response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx); + response = GetCurVsSeekerResponse(vsSeekerIdx, trainerId); if (response == VSSEEKER_SINGLE_RESP_YES) rval = 100; // Definitely yes else if (response == VSSEEKER_SINGLE_RESP_NO) @@ -470,7 +466,7 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData) gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = rematchTrainerIdx; ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]); StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch); - sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx; + sVsSeeker->trainerIds[sVsSeeker->numRematchableTrainers] = trainerId; sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId); sVsSeeker->numRematchableTrainers++; sVsSeeker->trainerWantsRematch = 1; @@ -530,43 +526,43 @@ void ClearRematchStateByTrainerId(void) } #if FREE_MATCH_CALL == FALSE -static void TryGetRematchTrainerIdGivenGameState(const u16 * trainerIdxs, u8 * rematchIdx_p) +static u8 TryGetRematchTrainerIdGivenGameState(const enum TrainerID *trainerIds, u8 rematchIndex) { - switch (*rematchIdx_p) + bool32 isFlagSet = TRUE; + + switch (rematchIndex) { - case 0: - break; case 1: - if (!FlagGet(FLAG_GOT_VS_SEEKER)) - *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); + isFlagSet = FlagGet(FLAG_GOT_VS_SEEKER); break; case 2: - if (!FlagGet(FLAG_WORLD_MAP_CELADON_CITY)) - *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); + isFlagSet = FlagGet(FLAG_WORLD_MAP_CELADON_CITY); break; case 3: - if (!FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY)) - *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); + isFlagSet = FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY); break; case 4: - if (!FlagGet(FLAG_SYS_GAME_CLEAR)) - *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); + isFlagSet = FlagGet(FLAG_SYS_GAME_CLEAR); break; case 5: - if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) - *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p); + isFlagSet = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS); break; } + + if (isFlagSet) + return rematchIndex; + + return BackwardsSearchRematchTrainerIndex(trainerIds, rematchIndex); } -static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx) +static u8 BackwardsSearchRematchTrainerIndex(const enum TrainerID *trainerIds, u8 rematchIndex) { - while (--rematchIdx != 0) + while (--rematchIndex != 0) { - const u16 *rematch_p = trainerIdxs + rematchIdx; - if (*rematch_p != SKIP) - return rematchIdx; + if (trainerIds[rematchIndex] != SKIP) + return rematchIndex; } + return 0; } #endif //FREE_MATCH_CALL @@ -576,7 +572,7 @@ bool8 ShouldTryRematchBattle(void) return ShouldTryRematchBattleForTrainerId(TRAINER_BATTLE_PARAM.opponentA); } -bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId) +bool8 ShouldTryRematchBattleForTrainerId(enum TrainerID trainerId) { if (ShouldTryRematchBattleInternal(sRematches, trainerId)) { @@ -585,9 +581,9 @@ bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId) return HasRematchTrainerAlreadyBeenFought(sRematches, trainerId); } -static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent) +static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, enum TrainerID trainerId) { - s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); + s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerId); if (rematchIdx == -1) return FALSE; @@ -599,9 +595,9 @@ static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerDa return FALSE; } -static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent) +static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, enum TrainerID trainerId) { - s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); + s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerId); if (rematchIdx == -1) return FALSE; @@ -618,7 +614,7 @@ void ClearRematchStateOfLastTalked(void) SetBattledTrainerFlag(); } -static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId) +static int LookupVsSeekerOpponentInArray(const struct RematchData *array, enum TrainerID trainerId) { int i, j; @@ -626,7 +622,7 @@ static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 t { for (j = 0; j < MAX_REMATCH_PARTIES; j++) { - u16 testTrainerId; + enum TrainerID testTrainerId; if (array[i].trainerIDs[j] == TRAINER_NONE) break; testTrainerId = array[i].trainerIDs[j]; @@ -641,14 +637,15 @@ static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 t } #if FREE_MATCH_CALL == FALSE -int GetRematchTrainerId(u16 trainerId) +enum TrainerID GetRematchTrainerId(enum TrainerID trainerId) { u8 i; u8 j; j = GetNextAvailableRematchTrainer(sRematches, trainerId, &i); if (!j) - return 0; - TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIDs, &j); + return TRAINER_NONE; + + j = TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIDs, j); return sRematches[i].trainerIDs[j]; } #endif //FREE_MATCH_CALL @@ -658,7 +655,7 @@ u8 IsTrainerReadyForRematch(void) return IsTrainerReadyForRematchInternal(sRematches, TRAINER_BATTLE_PARAM.opponentA); } -static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerId) +static bool8 IsTrainerReadyForRematchInternal(const struct RematchData *array, enum TrainerID trainerId) { int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId); @@ -739,16 +736,16 @@ static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId) void NativeVsSeekerRematchId(struct ScriptContext *ctx) { - u16 trainerId = ScriptReadHalfword(ctx); + enum TrainerID trainerId = ScriptReadHalfword(ctx); if (ctx->breakOnTrainerBattle && HasTrainerBeenFought(trainerId) && !ShouldTryRematchBattleForTrainerId(trainerId)) StopScript(ctx); } -static u16 GetTrainerFlagFromScript(const u8 *script) +static enum TrainerID GetTrainerFlagFromScript(const u8 *script) { // The trainer flag is located 3 bytes (command + flags + localIdA) from the script pointer, assuming the trainerbattle command is first in the script. // Because scripts are unaligned, and because the ARM processor requires shorts to be 16-bit aligned, this function needs to perform explicit bitwise operations to get the correct flag. - u16 trainerFlag; + enum TrainerID trainerFlag; switch (script[0]) { case SCR_OP_TRAINERBATTLE: @@ -778,13 +775,13 @@ static u16 GetTrainerFlagFromScript(const u8 *script) return trainerFlag; } -static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx) +static int GetRematchIdx(const struct RematchData *vsSeekerData, enum TrainerID trainerId) { int i; for (i = 0; i < ARRAY_COUNT(sRematches); i++) { - if (vsSeekerData[i].trainerIDs[0] == trainerFlagIdx) + if (vsSeekerData[i].trainerIDs[0] == trainerId) return i; } @@ -803,15 +800,13 @@ static bool32 IsThisTrainerRematchable(u32 localId) static void ClearAllTrainerRematchStates(void) { #if FREE_MATCH_CALL == FALSE - u8 i; - - for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->trainerRematches); i++) + for (u32 i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->trainerRematches); i++) gSaveBlock1Ptr->trainerRematches[i] = 0; #endif //FREE_MATCH_CALL } #if FREE_MATCH_CALL == FALSE -static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo) +static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo *trainerInfo) { s16 x; s16 y; @@ -824,19 +819,19 @@ static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo) && x + 7 >= trainerInfo->xCoord && y - 5 <= trainerInfo->yCoord && y + 5 >= trainerInfo->yCoord - && ObjectEventIdIsSane(trainerInfo->objectEventId) == 1) + && ObjectEventIdIsSane(trainerInfo->objectEventId)) return TRUE; return FALSE; } -static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr) +static u8 GetNextAvailableRematchTrainer(const struct RematchData *vsSeekerData, enum TrainerID trainerId, u8 *idxPtr) { - int i, j; - - for (i = 0; i < ARRAY_COUNT(sRematches); i++) + for (u32 i = 0; i < ARRAY_COUNT(sRematches); i++) { - if (vsSeekerData[i].trainerIDs[0] == trainerFlagNo) + if (vsSeekerData[i].trainerIDs[0] == trainerId) { + u32 j; + *idxPtr = i; for (j = 1; j < MAX_REMATCH_PARTIES; j++) { @@ -859,13 +854,12 @@ static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData static u8 GetRematchableTrainerLocalId(void) { u8 idx; - u8 i; - for (i = 0; sVsSeeker->trainerInfo[i].localId != NO_REMATCH_LOCALID; i++) + for (u32 i = 0; sVsSeeker->trainerInfo[i].localId != NO_REMATCH_LOCALID; i++) { - if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1) + if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i])) { - if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerIdx, &idx)) + if (!HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerId) || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerId, &idx)) return sVsSeeker->trainerInfo[i].localId; } } @@ -873,24 +867,21 @@ static u8 GetRematchableTrainerLocalId(void) return NO_REMATCH_LOCALID; } -static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script) +static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo *trainerInfo, const u8 *script) { UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]); ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script); } -static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx) +static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, enum TrainerID trainerId) { - s32 i; - s32 j; - - for (i = 0; i < vsSeekerIdx; i++) + for (u32 i = 0; i < vsSeekerIdx; i++) { - if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == trainerIdx) + if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) && sVsSeeker->trainerInfo[i].trainerId == trainerId) { - for (j = 0; j < sVsSeeker->numRematchableTrainers; j++) + for (u32 j = 0; j < sVsSeeker->numRematchableTrainers; j++) { - if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx) + if (sVsSeeker->trainerIds[j] == sVsSeeker->trainerInfo[i].trainerId) return VSSEEKER_SINGLE_RESP_YES; } return VSSEEKER_SINGLE_RESP_NO; @@ -903,24 +894,23 @@ static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx) static void StartAllRespondantIdleMovements(void) { #if FREE_MATCH_CALL == FALSE - u8 dummy = 0; - s32 i; - s32 j; + u8 dummy = 0; - for (i = 0; i < sVsSeeker->numRematchableTrainers; i++) - { - for (j = 0; sVsSeeker->trainerInfo[j].localId != NO_REMATCH_LOCALID; j++) - { - if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i]) - { - struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId]; + for (u32 i = 0; i < sVsSeeker->numRematchableTrainers; i++) + { + for (u32 j = 0; sVsSeeker->trainerInfo[j].localId != NO_REMATCH_LOCALID; j++) + { + if (sVsSeeker->trainerInfo[j].trainerId == sVsSeeker->trainerIds[i]) + { + struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId]; - if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1) - SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); - OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); - gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerIdx, &dummy); - } - } - } + if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId)) + SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); + + OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); + gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerId, &dummy); + } + } + } #endif //FREE_MATCH_CALL }