Feat/trainer enum usage (#140)

This commit is contained in:
cawtds 2026-04-01 22:44:05 +02:00 committed by GitHub
parent 1d5a65e16c
commit 36d16c71f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 758 additions and 781 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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];

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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];
};

View File

@ -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);

View File

@ -1 +1 @@
b66f3fefe4ee7da9c095d84a1ce9f0b594f189c9 pokefirered.gba
1eaa3d4161c67339d2e28c40246fda57fbe26161 pokefirered.gba

View File

@ -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++)
;

View File

@ -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)

View File

@ -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;

View File

@ -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);
}

View File

@ -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
}

View File

@ -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);

View File

@ -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,

View File

@ -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();

View File

@ -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;

View File

@ -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];
}

View File

@ -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;

View File

@ -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);

View File

@ -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] =
{

View File

@ -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
}

View File

@ -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},

View File

@ -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
}