mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-09 04:23:14 -05:00
Feat/trainer enum usage (#140)
This commit is contained in:
parent
1d5a65e16c
commit
36d16c71f0
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
2
rom.sha1
2
rom.sha1
|
|
@ -1 +1 @@
|
|||
b66f3fefe4ee7da9c095d84a1ce9f0b594f189c9 pokefirered.gba
|
||||
1eaa3d4161c67339d2e28c40246fda57fbe26161 pokefirered.gba
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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] =
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
222
src/vs_seeker.c
222
src/vs_seeker.c
|
|
@ -61,7 +61,7 @@ typedef enum
|
|||
struct VsSeekerTrainerInfo
|
||||
{
|
||||
const u8 *script;
|
||||
u16 trainerIdx;
|
||||
enum TrainerID trainerId;
|
||||
u8 localId;
|
||||
u8 objectEventId;
|
||||
s16 xCoord;
|
||||
|
|
@ -72,7 +72,7 @@ struct VsSeekerTrainerInfo
|
|||
struct VsSeekerStruct
|
||||
{
|
||||
struct VsSeekerTrainerInfo trainerInfo[OBJECT_EVENTS_COUNT];
|
||||
u16 trainerIdxArray[OBJECT_EVENTS_COUNT];
|
||||
enum TrainerID trainerIds[OBJECT_EVENTS_COUNT];
|
||||
u8 runningBehaviourEtcArray[OBJECT_EVENTS_COUNT];
|
||||
u8 numRematchableTrainers;
|
||||
u8 trainerHasNotYetBeenFought:1;
|
||||
|
|
@ -84,40 +84,36 @@ struct VsSeekerStruct
|
|||
// static declarations
|
||||
static EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL;
|
||||
|
||||
static void VsSeekerResetInBagStepCounter(void);
|
||||
static void VsSeekerResetChargingStepCounter(void);
|
||||
static void Task_ResetObjectsRematchWantedState(u8 taskId);
|
||||
static bool32 IsThisTrainerRematchable(u32 localId);
|
||||
static bool8 CanUseVsSeeker(void);
|
||||
static bool8 IsTrainerReadyForRematchInternal(const struct RematchData *array, enum TrainerID trainerId);
|
||||
static bool8 ObjectEventIdIsSane(u8 objectEventId);
|
||||
static enum TrainerID GetTrainerFlagFromScript(const u8 *script);
|
||||
static int GetRematchIdx(const struct RematchData *vsSeekerData, enum TrainerID trainerId);
|
||||
static int LookupVsSeekerOpponentInArray(const struct RematchData *array, enum TrainerID trainerId);
|
||||
static u8 GetRandomFaceDirectionMovementType();
|
||||
static u8 GetVsSeekerResponseInArea(const struct RematchData *vsSeekerData);
|
||||
static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, enum TrainerID trainerId);
|
||||
static u8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, enum TrainerID trainerId);
|
||||
static void ClearAllTrainerRematchStates(void);
|
||||
static void GatherNearbyTrainerInfo(void);
|
||||
static void ResetMovementOfRematchableTrainers(void);
|
||||
static void StartAllRespondantIdleMovements(void);
|
||||
static void Task_ResetObjectsRematchWantedState(u8 taskId);
|
||||
static void Task_VsSeeker_1(u8 taskId);
|
||||
static void Task_VsSeeker_2(u8 taskId);
|
||||
static void GatherNearbyTrainerInfo(void);
|
||||
static void Task_VsSeeker_3(u8 taskId);
|
||||
static bool8 CanUseVsSeeker(void);
|
||||
static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData);
|
||||
static void VsSeekerResetChargingStepCounter(void);
|
||||
static void VsSeekerResetInBagStepCounter(void);
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx);
|
||||
#endif //FREE_MATCH_CALL
|
||||
static u8 ShouldTryRematchBattleInternal(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);
|
||||
static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);
|
||||
static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId);
|
||||
static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerIdx);
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId);
|
||||
#endif //FREE_MATCH_CALL
|
||||
static u16 GetTrainerFlagFromScript(const u8 * script);
|
||||
static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx);
|
||||
static bool32 IsThisTrainerRematchable(u32 localId);
|
||||
static void ClearAllTrainerRematchStates(void);
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo);
|
||||
static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr);
|
||||
static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo *trainerInfo);
|
||||
static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, enum TrainerID trainerId);
|
||||
static u8 GetNextAvailableRematchTrainer(const struct RematchData *vsSeekerData, enum TrainerID trainerId, u8 *idxPtr);
|
||||
static u8 GetRematchableTrainerLocalId(void);
|
||||
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script);
|
||||
static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx);
|
||||
static u8 BackwardsSearchRematchTrainerIndex(const enum TrainerID *trainerIds, u8 rematchIndex);
|
||||
static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId);
|
||||
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo *trainerInfo, const u8 *script);
|
||||
#endif //FREE_MATCH_CALL
|
||||
static void StartAllRespondantIdleMovements(void);
|
||||
static bool8 ObjectEventIdIsSane(u8 objectEventId);
|
||||
static u8 GetRandomFaceDirectionMovementType();
|
||||
|
||||
#include "data/trainer_rematches.h"
|
||||
|
||||
|
|
@ -194,11 +190,11 @@ static void Task_ResetObjectsRematchWantedState(u8 taskId)
|
|||
|
||||
void VsSeekerResetObjectMovementAfterChargeComplete(void)
|
||||
{
|
||||
struct ObjectEventTemplate * templates = gSaveBlock1Ptr->objectEventTemplates;
|
||||
struct ObjectEventTemplate *templates = gSaveBlock1Ptr->objectEventTemplates;
|
||||
u8 i;
|
||||
u8 movementType;
|
||||
u8 objEventId;
|
||||
struct ObjectEvent * objectEvent;
|
||||
struct ObjectEvent *objectEvent;
|
||||
|
||||
for (i = 0; i < gMapHeader.events->objectEventCount; i++)
|
||||
{
|
||||
|
|
@ -265,7 +261,7 @@ static void ResetMovementOfRematchableTrainers(void)
|
|||
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
struct ObjectEvent * objectEvent = &gObjectEvents[i];
|
||||
struct ObjectEvent *objectEvent = &gObjectEvents[i];
|
||||
if (objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP
|
||||
|| objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP
|
||||
|| objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM)
|
||||
|
|
@ -336,7 +332,7 @@ static void Task_VsSeeker_1(u8 taskId)
|
|||
|
||||
static void Task_VsSeeker_2(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
s16 *data = gTasks[taskId].data;
|
||||
|
||||
if (data[2] != 2 && --data[1] == 0)
|
||||
{
|
||||
|
|
@ -368,7 +364,7 @@ static void GatherNearbyTrainerInfo(void)
|
|||
if (templates[objectEventIdx].trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].trainerType == TRAINER_TYPE_BURIED)
|
||||
{
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script;
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script);
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerId = GetTrainerFlagFromScript(templates[objectEventIdx].script);
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId;
|
||||
TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId;
|
||||
|
|
@ -423,10 +419,10 @@ static u8 CanUseVsSeeker(void)
|
|||
#endif //FREE_MATCH_CALL
|
||||
}
|
||||
|
||||
static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)
|
||||
static u8 GetVsSeekerResponseInArea(const struct RematchData *vsSeekerData)
|
||||
{
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
u16 trainerIdx = 0;
|
||||
enum TrainerID trainerId = TRAINER_NONE;
|
||||
u16 rval = 0;
|
||||
u8 rematchTrainerIdx;
|
||||
u8 unusedIdx = 0;
|
||||
|
|
@ -437,15 +433,15 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)
|
|||
{
|
||||
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == TRUE)
|
||||
{
|
||||
trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx;
|
||||
if (!HasTrainerBeenFought(trainerIdx))
|
||||
trainerId = sVsSeeker->trainerInfo[vsSeekerIdx].trainerId;
|
||||
if (!HasTrainerBeenFought(trainerId))
|
||||
{
|
||||
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought);
|
||||
sVsSeeker->trainerHasNotYetBeenFought = 1;
|
||||
vsSeekerIdx++;
|
||||
continue;
|
||||
}
|
||||
rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerIdx, &unusedIdx);
|
||||
rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerId, &unusedIdx);
|
||||
if (rematchTrainerIdx == 0)
|
||||
{
|
||||
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
|
||||
|
|
@ -454,7 +450,7 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)
|
|||
else
|
||||
{
|
||||
rval = Random() % 100; // Even if it's overwritten below, it progresses the RNG.
|
||||
response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx);
|
||||
response = GetCurVsSeekerResponse(vsSeekerIdx, trainerId);
|
||||
if (response == VSSEEKER_SINGLE_RESP_YES)
|
||||
rval = 100; // Definitely yes
|
||||
else if (response == VSSEEKER_SINGLE_RESP_NO)
|
||||
|
|
@ -470,7 +466,7 @@ static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)
|
|||
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = rematchTrainerIdx;
|
||||
ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
|
||||
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
|
||||
sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx;
|
||||
sVsSeeker->trainerIds[sVsSeeker->numRematchableTrainers] = trainerId;
|
||||
sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
|
||||
sVsSeeker->numRematchableTrainers++;
|
||||
sVsSeeker->trainerWantsRematch = 1;
|
||||
|
|
@ -530,43 +526,43 @@ void ClearRematchStateByTrainerId(void)
|
|||
}
|
||||
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
static void TryGetRematchTrainerIdGivenGameState(const u16 * trainerIdxs, u8 * rematchIdx_p)
|
||||
static u8 TryGetRematchTrainerIdGivenGameState(const enum TrainerID *trainerIds, u8 rematchIndex)
|
||||
{
|
||||
switch (*rematchIdx_p)
|
||||
bool32 isFlagSet = TRUE;
|
||||
|
||||
switch (rematchIndex)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
if (!FlagGet(FLAG_GOT_VS_SEEKER))
|
||||
*rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);
|
||||
isFlagSet = FlagGet(FLAG_GOT_VS_SEEKER);
|
||||
break;
|
||||
case 2:
|
||||
if (!FlagGet(FLAG_WORLD_MAP_CELADON_CITY))
|
||||
*rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);
|
||||
isFlagSet = FlagGet(FLAG_WORLD_MAP_CELADON_CITY);
|
||||
break;
|
||||
case 3:
|
||||
if (!FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY))
|
||||
*rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);
|
||||
isFlagSet = FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY);
|
||||
break;
|
||||
case 4:
|
||||
if (!FlagGet(FLAG_SYS_GAME_CLEAR))
|
||||
*rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);
|
||||
isFlagSet = FlagGet(FLAG_SYS_GAME_CLEAR);
|
||||
break;
|
||||
case 5:
|
||||
if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))
|
||||
*rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);
|
||||
isFlagSet = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);
|
||||
break;
|
||||
}
|
||||
|
||||
if (isFlagSet)
|
||||
return rematchIndex;
|
||||
|
||||
return BackwardsSearchRematchTrainerIndex(trainerIds, rematchIndex);
|
||||
}
|
||||
|
||||
static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx)
|
||||
static u8 BackwardsSearchRematchTrainerIndex(const enum TrainerID *trainerIds, u8 rematchIndex)
|
||||
{
|
||||
while (--rematchIdx != 0)
|
||||
while (--rematchIndex != 0)
|
||||
{
|
||||
const u16 *rematch_p = trainerIdxs + rematchIdx;
|
||||
if (*rematch_p != SKIP)
|
||||
return rematchIdx;
|
||||
if (trainerIds[rematchIndex] != SKIP)
|
||||
return rematchIndex;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif //FREE_MATCH_CALL
|
||||
|
|
@ -576,7 +572,7 @@ bool8 ShouldTryRematchBattle(void)
|
|||
return ShouldTryRematchBattleForTrainerId(TRAINER_BATTLE_PARAM.opponentA);
|
||||
}
|
||||
|
||||
bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId)
|
||||
bool8 ShouldTryRematchBattleForTrainerId(enum TrainerID trainerId)
|
||||
{
|
||||
if (ShouldTryRematchBattleInternal(sRematches, trainerId))
|
||||
{
|
||||
|
|
@ -585,9 +581,9 @@ bool8 ShouldTryRematchBattleForTrainerId(u16 trainerId)
|
|||
return HasRematchTrainerAlreadyBeenFought(sRematches, trainerId);
|
||||
}
|
||||
|
||||
static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)
|
||||
static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, enum TrainerID trainerId)
|
||||
{
|
||||
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);
|
||||
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerId);
|
||||
|
||||
if (rematchIdx == -1)
|
||||
return FALSE;
|
||||
|
|
@ -599,9 +595,9 @@ static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerDa
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)
|
||||
static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, enum TrainerID trainerId)
|
||||
{
|
||||
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);
|
||||
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerId);
|
||||
|
||||
if (rematchIdx == -1)
|
||||
return FALSE;
|
||||
|
|
@ -618,7 +614,7 @@ void ClearRematchStateOfLastTalked(void)
|
|||
SetBattledTrainerFlag();
|
||||
}
|
||||
|
||||
static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId)
|
||||
static int LookupVsSeekerOpponentInArray(const struct RematchData *array, enum TrainerID trainerId)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
|
|
@ -626,7 +622,7 @@ static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 t
|
|||
{
|
||||
for (j = 0; j < MAX_REMATCH_PARTIES; j++)
|
||||
{
|
||||
u16 testTrainerId;
|
||||
enum TrainerID testTrainerId;
|
||||
if (array[i].trainerIDs[j] == TRAINER_NONE)
|
||||
break;
|
||||
testTrainerId = array[i].trainerIDs[j];
|
||||
|
|
@ -641,14 +637,15 @@ static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 t
|
|||
}
|
||||
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
int GetRematchTrainerId(u16 trainerId)
|
||||
enum TrainerID GetRematchTrainerId(enum TrainerID trainerId)
|
||||
{
|
||||
u8 i;
|
||||
u8 j;
|
||||
j = GetNextAvailableRematchTrainer(sRematches, trainerId, &i);
|
||||
if (!j)
|
||||
return 0;
|
||||
TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIDs, &j);
|
||||
return TRAINER_NONE;
|
||||
|
||||
j = TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIDs, j);
|
||||
return sRematches[i].trainerIDs[j];
|
||||
}
|
||||
#endif //FREE_MATCH_CALL
|
||||
|
|
@ -658,7 +655,7 @@ u8 IsTrainerReadyForRematch(void)
|
|||
return IsTrainerReadyForRematchInternal(sRematches, TRAINER_BATTLE_PARAM.opponentA);
|
||||
}
|
||||
|
||||
static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerId)
|
||||
static bool8 IsTrainerReadyForRematchInternal(const struct RematchData *array, enum TrainerID trainerId)
|
||||
{
|
||||
int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId);
|
||||
|
||||
|
|
@ -739,16 +736,16 @@ static u8 GetRunningBehaviorFromGraphicsId(u16 graphicsId)
|
|||
|
||||
void NativeVsSeekerRematchId(struct ScriptContext *ctx)
|
||||
{
|
||||
u16 trainerId = ScriptReadHalfword(ctx);
|
||||
enum TrainerID trainerId = ScriptReadHalfword(ctx);
|
||||
if (ctx->breakOnTrainerBattle && HasTrainerBeenFought(trainerId) && !ShouldTryRematchBattleForTrainerId(trainerId))
|
||||
StopScript(ctx);
|
||||
}
|
||||
|
||||
static u16 GetTrainerFlagFromScript(const u8 *script)
|
||||
static enum TrainerID GetTrainerFlagFromScript(const u8 *script)
|
||||
{
|
||||
// The trainer flag is located 3 bytes (command + flags + localIdA) from the script pointer, assuming the trainerbattle command is first in the script.
|
||||
// Because scripts are unaligned, and because the ARM processor requires shorts to be 16-bit aligned, this function needs to perform explicit bitwise operations to get the correct flag.
|
||||
u16 trainerFlag;
|
||||
enum TrainerID trainerFlag;
|
||||
switch (script[0])
|
||||
{
|
||||
case SCR_OP_TRAINERBATTLE:
|
||||
|
|
@ -778,13 +775,13 @@ static u16 GetTrainerFlagFromScript(const u8 *script)
|
|||
return trainerFlag;
|
||||
}
|
||||
|
||||
static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx)
|
||||
static int GetRematchIdx(const struct RematchData *vsSeekerData, enum TrainerID trainerId)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sRematches); i++)
|
||||
{
|
||||
if (vsSeekerData[i].trainerIDs[0] == trainerFlagIdx)
|
||||
if (vsSeekerData[i].trainerIDs[0] == trainerId)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
|
@ -803,15 +800,13 @@ static bool32 IsThisTrainerRematchable(u32 localId)
|
|||
static void ClearAllTrainerRematchStates(void)
|
||||
{
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->trainerRematches); i++)
|
||||
for (u32 i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->trainerRematches); i++)
|
||||
gSaveBlock1Ptr->trainerRematches[i] = 0;
|
||||
#endif //FREE_MATCH_CALL
|
||||
}
|
||||
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo)
|
||||
static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo *trainerInfo)
|
||||
{
|
||||
s16 x;
|
||||
s16 y;
|
||||
|
|
@ -824,19 +819,19 @@ static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo)
|
|||
&& x + 7 >= trainerInfo->xCoord
|
||||
&& y - 5 <= trainerInfo->yCoord
|
||||
&& y + 5 >= trainerInfo->yCoord
|
||||
&& ObjectEventIdIsSane(trainerInfo->objectEventId) == 1)
|
||||
&& ObjectEventIdIsSane(trainerInfo->objectEventId))
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr)
|
||||
static u8 GetNextAvailableRematchTrainer(const struct RematchData *vsSeekerData, enum TrainerID trainerId, u8 *idxPtr)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sRematches); i++)
|
||||
for (u32 i = 0; i < ARRAY_COUNT(sRematches); i++)
|
||||
{
|
||||
if (vsSeekerData[i].trainerIDs[0] == trainerFlagNo)
|
||||
if (vsSeekerData[i].trainerIDs[0] == trainerId)
|
||||
{
|
||||
u32 j;
|
||||
|
||||
*idxPtr = i;
|
||||
for (j = 1; j < MAX_REMATCH_PARTIES; j++)
|
||||
{
|
||||
|
|
@ -859,13 +854,12 @@ static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData
|
|||
static u8 GetRematchableTrainerLocalId(void)
|
||||
{
|
||||
u8 idx;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; sVsSeeker->trainerInfo[i].localId != NO_REMATCH_LOCALID; i++)
|
||||
for (u32 i = 0; sVsSeeker->trainerInfo[i].localId != NO_REMATCH_LOCALID; i++)
|
||||
{
|
||||
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1)
|
||||
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]))
|
||||
{
|
||||
if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerIdx, &idx))
|
||||
if (!HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerId) || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerId, &idx))
|
||||
return sVsSeeker->trainerInfo[i].localId;
|
||||
}
|
||||
}
|
||||
|
|
@ -873,24 +867,21 @@ static u8 GetRematchableTrainerLocalId(void)
|
|||
return NO_REMATCH_LOCALID;
|
||||
}
|
||||
|
||||
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script)
|
||||
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo *trainerInfo, const u8 *script)
|
||||
{
|
||||
UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]);
|
||||
ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script);
|
||||
}
|
||||
|
||||
static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx)
|
||||
static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, enum TrainerID trainerId)
|
||||
{
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
for (i = 0; i < vsSeekerIdx; i++)
|
||||
for (u32 i = 0; i < vsSeekerIdx; i++)
|
||||
{
|
||||
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == trainerIdx)
|
||||
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) && sVsSeeker->trainerInfo[i].trainerId == trainerId)
|
||||
{
|
||||
for (j = 0; j < sVsSeeker->numRematchableTrainers; j++)
|
||||
for (u32 j = 0; j < sVsSeeker->numRematchableTrainers; j++)
|
||||
{
|
||||
if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx)
|
||||
if (sVsSeeker->trainerIds[j] == sVsSeeker->trainerInfo[i].trainerId)
|
||||
return VSSEEKER_SINGLE_RESP_YES;
|
||||
}
|
||||
return VSSEEKER_SINGLE_RESP_NO;
|
||||
|
|
@ -903,24 +894,23 @@ static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx)
|
|||
static void StartAllRespondantIdleMovements(void)
|
||||
{
|
||||
#if FREE_MATCH_CALL == FALSE
|
||||
u8 dummy = 0;
|
||||
s32 i;
|
||||
s32 j;
|
||||
u8 dummy = 0;
|
||||
|
||||
for (i = 0; i < sVsSeeker->numRematchableTrainers; i++)
|
||||
{
|
||||
for (j = 0; sVsSeeker->trainerInfo[j].localId != NO_REMATCH_LOCALID; j++)
|
||||
{
|
||||
if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i])
|
||||
{
|
||||
struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId];
|
||||
for (u32 i = 0; i < sVsSeeker->numRematchableTrainers; i++)
|
||||
{
|
||||
for (u32 j = 0; sVsSeeker->trainerInfo[j].localId != NO_REMATCH_LOCALID; j++)
|
||||
{
|
||||
if (sVsSeeker->trainerInfo[j].trainerId == sVsSeeker->trainerIds[i])
|
||||
{
|
||||
struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId];
|
||||
|
||||
if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1)
|
||||
SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
|
||||
OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
|
||||
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerIdx, &dummy);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId))
|
||||
SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
|
||||
|
||||
OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
|
||||
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerId, &dummy);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif //FREE_MATCH_CALL
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user