diff --git a/include/battle/ov16_0223DF00.h b/include/battle/ov16_0223DF00.h index ad4c3060a3..6249b8cdf0 100644 --- a/include/battle/ov16_0223DF00.h +++ b/include/battle/ov16_0223DF00.h @@ -13,7 +13,7 @@ #include "struct_decls/struct_0200C704_decl.h" #include "struct_decls/struct_020797DC_decl.h" #include "struct_defs/chatot_cry.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_context.h" #include "battle/battle_message.h" diff --git a/include/field_battle_data_transfer.h b/include/field_battle_data_transfer.h index 332d0ba11a..2a35879ab4 100644 --- a/include/field_battle_data_transfer.h +++ b/include/field_battle_data_transfer.h @@ -10,7 +10,7 @@ #include "struct_decls/struct_0206D140_decl.h" #include "struct_decls/struct_020797DC_decl.h" #include "struct_defs/chatot_cry.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "field/field_system_decl.h" diff --git a/include/string_template.h b/include/string_template.h index 55a5697728..fa31bf868e 100644 --- a/include/string_template.h +++ b/include/string_template.h @@ -6,7 +6,7 @@ #include "struct_decls/struct_020797DC_decl.h" #include "struct_defs/pokemon.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "enums.h" #include "savedata.h" diff --git a/include/struct_defs/battle_system.h b/include/struct_defs/battle_system.h index 671e8fb024..81f1d25b0d 100644 --- a/include/struct_defs/battle_system.h +++ b/include/struct_defs/battle_system.h @@ -17,7 +17,7 @@ #include "struct_decls/struct_020797DC_decl.h" #include "struct_defs/chatot_cry.h" #include "struct_defs/struct_0207C690.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_context.h" #include "battle/struct_ov16_0223E0C8.h" diff --git a/include/struct_defs/struct_0202FAA8.h b/include/struct_defs/struct_0202FAA8.h index 1af308b10e..f8004856fd 100644 --- a/include/struct_defs/struct_0202FAA8.h +++ b/include/struct_defs/struct_0202FAA8.h @@ -1,7 +1,7 @@ #ifndef POKEPLATINUM_STRUCT_0202FAA8_H #define POKEPLATINUM_STRUCT_0202FAA8_H -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" typedef struct { u32 unk_00; diff --git a/include/struct_defs/trainer.h b/include/struct_defs/trainer.h new file mode 100644 index 0000000000..e4de20d13a --- /dev/null +++ b/include/struct_defs/trainer.h @@ -0,0 +1,19 @@ +#ifndef POKEPLATINUM_STRUCT_TRAINER_H +#define POKEPLATINUM_STRUCT_TRAINER_H + +#include "constants/string.h" + +#include "struct_defs/sentence.h" +#include "struct_defs/trainer_data.h" + +#include "charcode.h" + +typedef struct Trainer { + TrainerHeader header; + + charcode_t name[TRAINER_NAME_LEN + 1]; + Sentence winMsg; + Sentence loseMsg; +} Trainer; + +#endif // POKEPLATINUM_STRUCT_TRAINER_H diff --git a/include/struct_defs/trainer_data.h b/include/struct_defs/trainer_data.h index bc2a7a0e07..e776babe77 100644 --- a/include/struct_defs/trainer_data.h +++ b/include/struct_defs/trainer_data.h @@ -1,11 +1,16 @@ #ifndef POKEPLATINUM_STRUCT_TRAINER_DATA_H #define POKEPLATINUM_STRUCT_TRAINER_DATA_H -#include "constants/string.h" +/* + * Note: *most* source files should not include this header directly, and should + * instead including `struct_defs/trainer.h`. This header is held separately for + * use by data-packing routines. + */ -#include "struct_defs/sentence.h" +#include "constants/moves.h" -#include "strbuf.h" +#define MAX_TRAINER_ITEMS 4 +#define MAX_DV 255 enum TrainerDataType { TRDATATYPE_BASE = 0, @@ -14,71 +19,46 @@ enum TrainerDataType { TRDATATYPE_WITH_MOVES_AND_ITEM, }; -/** - * @brief Trainer data encapsulation. Contains all trainer-level data needed to instantiate a trainer battle. - */ -typedef struct Trainer { - u8 type; //< The data type of the trainer; controls which TrainerMon struct is used for the party. - u8 class; //< The trainer's class, e.g. "Youngster" or "Gym Leader." - u8 sprite; //< Which sprite ID the trainer uses. - u8 partySize; //< How many Pokemon the trainer has in their party. +typedef struct TrainerHeader { + u8 monDataType; + u8 trainerType; + u8 sprite; + u8 partySize; + u16 items[MAX_TRAINER_ITEMS]; + u32 aiMask; + u32 battleType; +} TrainerHeader; - u16 items[4]; //< Items that the trainer has in their bag. - - u32 aiMask; //< Mask of AI flags to use for this trainer in battle. - - u32 battleType; //< The type of battle to be instantiated. - - charcode_t name[TRAINER_NAME_LEN + 1]; //< The trainer's name. - - Sentence winMsg; //< The message to display if the trainer wins. - Sentence loseMsg; //< The message to display if the trainer loses. -} Trainer; - -#define MAX_DV 255 - -/** - * @brief The most basic Trainer Pokemon structure. No item is held, and moves are populated from the learnset. - */ typedef struct TrainerMonBase { - u16 dv; //< Difficulty value; determines how many IVs the Pokemon will have in each stat. - u16 level; //< The Pokemon's level. - u16 species; //< Composite mask of the Pokemon's level (least-significant 10 bits) and form (most-significant 6 bits). - u16 cbSeal; //< Ball seal applied to the Pokemon. + u16 dv; + u16 level; + u16 species; + u16 cbSeal; } TrainerMonBase; -/** - * @brief Trainer Pokemon that knows a certain set of moves. - */ typedef struct TrainerMonWithMoves { - u16 dv; //< Difficulty value; determines how many IVs the Pokemon will have in each stat. - u16 level; //< The Pokemon's level. - u16 species; //< Composite mask of the Pokemon's level (least-significant 10 bits) and form (most-significant 6 bits). - u16 moves[4]; //< The Pokemon's known moves. - u16 cbSeal; //< Ball seal applied to the Pokemon. + u16 dv; + u16 level; + u16 species; + u16 moves[LEARNED_MOVES_MAX]; + u16 cbSeal; } TrainerMonWithMoves; -/** - * @brief Trainer Pokemon that has a specific held item. - */ typedef struct TrainerMonWithItem { - u16 dv; //< Difficulty value; determines how many IVs the Pokemon will have in each stat. - u16 level; //< The Pokemon's level. - u16 species; //< Composite mask of the Pokemon's level (least-significant 10 bits) and form (most-significant 6 bits). - u16 item; //< The Pokemon's held item. - u16 cbSeal; //< Ball seal applied to the Pokemon. + u16 dv; + u16 level; + u16 species; + u16 item; + u16 cbSeal; } TrainerMonWithItem; -/** - * @brief Trainer Pokemon that has a specific held item and knows a certain set of moves. - */ typedef struct TrainerMonWithMovesAndItem { - u16 dv; //< Difficulty value; determines how many IVs the Pokemon will have in each stat. - u16 level; //< The Pokemon's level. - u16 species; //< Composite mask of the Pokemon's level (least-significant 10 bits) and form (most-significant 6 bits). - u16 item; //< The Pokemon's held item. - u16 moves[4]; //< The Pokemon's known moves. - u16 cbSeal; //< Ball seal applied to the Pokemon. + u16 dv; + u16 level; + u16 species; + u16 item; + u16 moves[LEARNED_MOVES_MAX]; + u16 cbSeal; } TrainerMonWithMovesAndItem; #endif // POKEPLATINUM_STRUCT_TRAINER_DATA_H diff --git a/include/trainer_data.h b/include/trainer_data.h index 4e4a38813d..81dafbbc01 100644 --- a/include/trainer_data.h +++ b/include/trainer_data.h @@ -3,7 +3,7 @@ #include "constants/trainer.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "field_battle_data_transfer.h" #include "savedata.h" @@ -78,7 +78,7 @@ void Trainer_Load(int trainerID, Trainer *trdata); * * The struct pointer passed to this function will determine exactly how much * data is loaded; see the definitions of the various TrainerMon... structs in - * struct_defs/trainer_data.h for exact specifications. + * struct_defs/trainer.h for exact specifications. * * @param trainerID ID of the trainer whose party is to be loaded. * @param[out] trparty Struct which will contain the loaded trainer party data. diff --git a/src/battle/battle_controller.c b/src/battle/battle_controller.c index 2c94b843b0..fa57aff72a 100644 --- a/src/battle/battle_controller.c +++ b/src/battle/battle_controller.c @@ -17,7 +17,7 @@ #include "generated/sdat.h" #include "struct_decls/battle_system.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/ai_context.h" #include "battle/battle_context.h" @@ -4268,7 +4268,7 @@ static BOOL BattleController_CheckBattleOver(BattleSystem *battleSys, BattleCont || (battleResult == BATTLE_RESULT_WIN && (battleType & BATTLE_TYPE_FRONTIER) && (battleType & BATTLE_TYPE_LINK) == FALSE)) { Trainer *trainer = BattleSystem_GetTrainer(battleSys, BATTLER_ENEMY_1); - switch (trainer->class) { + switch (trainer->header.trainerType) { case TRAINER_CLASS_LEADER_ROARK: case TRAINER_CLASS_LEADER_GARDENIA: case TRAINER_CLASS_LEADER_WAKE: diff --git a/src/battle/battle_display.c b/src/battle/battle_display.c index 91487f581e..eb10b18a24 100644 --- a/src/battle/battle_display.c +++ b/src/battle/battle_display.c @@ -15,7 +15,7 @@ #include "struct_defs/battle_io.h" #include "struct_defs/sprite_animation_frame.h" #include "struct_defs/struct_0200D0F4.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_context.h" #include "battle/battle_io.h" @@ -554,7 +554,7 @@ void ov16_0225D360(BattleSystem *param0, BattlerData *param1, UnkStruct_ov16_022 { Trainer *trainer = BattleSystem_GetTrainer(param0, param1->battler); v0->unk_0B = 0; - v0->unk_0C = sub_020788D0(ov16_02264768(param0, param1->battler, trainer->class)); + v0->unk_0C = sub_020788D0(ov16_02264768(param0, param1->battler, trainer->header.trainerType)); } } diff --git a/src/battle/battle_io.c b/src/battle/battle_io.c index 0f8e9721c2..aba95aad46 100644 --- a/src/battle/battle_io.c +++ b/src/battle/battle_io.c @@ -419,7 +419,7 @@ void BattleIO_SetTrainerEncounter(BattleSystem *param0, int param1) UnkStruct_ov16_02265124 v0; v0.unk_00 = 8; - v0.unk_02 = param0->trainers[param1].class; + v0.unk_02 = param0->trainers[param1].header.trainerType; v0.unk_01 = param0->unk_A8[param1]; SendMessage(param0, 1, param1, &v0, sizeof(UnkStruct_ov16_02265124)); @@ -448,7 +448,7 @@ void BattleIO_SlideTrainerIn(BattleSystem *param0, int param1, int param2) UnkStruct_ov16_022651A8 v0; v0.unk_00 = 11; - v0.unk_02 = param0->trainers[param1].class; + v0.unk_02 = param0->trainers[param1].header.trainerType; v0.unk_01 = param0->unk_A8[param1]; v0.unk_04 = param2; diff --git a/src/battle/battle_script.c b/src/battle/battle_script.c index eb032b5a7a..c6d35b97da 100644 --- a/src/battle/battle_script.c +++ b/src/battle/battle_script.c @@ -26,7 +26,7 @@ #include "struct_defs/struct_0200D0F4.h" #include "struct_defs/struct_020127E8.h" #include "struct_defs/struct_0208737C.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_context.h" #include "battle/battle_controller.h" @@ -3879,40 +3879,40 @@ static u32 BattleScript_CalcPrizeMoney(BattleSystem *battleSys, BattleContext *b Trainer_Load(battleSys->trainerIDs[battler], &trainer); Trainer_LoadParty(battleSys->trainerIDs[battler], rawParty); - switch (trainer.type) { + switch (trainer.header.monDataType) { default: case TRDATATYPE_BASE: { TrainerMonBase *party = (TrainerMonBase *)rawParty; - lastLevel = party[trainer.partySize - 1].level; + lastLevel = party[trainer.header.partySize - 1].level; break; } case TRDATATYPE_WITH_MOVES: { TrainerMonWithMoves *party = (TrainerMonWithMoves *)rawParty; - lastLevel = party[trainer.partySize - 1].level; + lastLevel = party[trainer.header.partySize - 1].level; break; } case TRDATATYPE_WITH_ITEM: { TrainerMonWithItem *party = (TrainerMonWithItem *)rawParty; - lastLevel = party[trainer.partySize - 1].level; + lastLevel = party[trainer.header.partySize - 1].level; break; } case TRDATATYPE_WITH_MOVES_AND_ITEM: { TrainerMonWithMovesAndItem *party = (TrainerMonWithMovesAndItem *)rawParty; - lastLevel = party[trainer.partySize - 1].level; + lastLevel = party[trainer.header.partySize - 1].level; break; } } u32 prize; if ((battleSys->battleType & BATTLE_TYPE_TAG) || battleSys->battleType == BATTLE_TYPE_TRAINER_WITH_AI_PARTNER) { - prize = lastLevel * 4 * battleCtx->prizeMoneyMul * sTrainerClassPrizeMul[trainer.class]; + prize = lastLevel * 4 * battleCtx->prizeMoneyMul * sTrainerClassPrizeMul[trainer.header.trainerType]; } else if (battleSys->battleType & 0x2) { - prize = lastLevel * 4 * battleCtx->prizeMoneyMul * 2 * sTrainerClassPrizeMul[trainer.class]; + prize = lastLevel * 4 * battleCtx->prizeMoneyMul * 2 * sTrainerClassPrizeMul[trainer.header.trainerType]; } else { - prize = lastLevel * 4 * battleCtx->prizeMoneyMul * sTrainerClassPrizeMul[trainer.class]; + prize = lastLevel * 4 * battleCtx->prizeMoneyMul * sTrainerClassPrizeMul[trainer.header.trainerType]; } Heap_FreeToHeap(rawParty); diff --git a/src/battle/ov16_0223B140.c b/src/battle/ov16_0223B140.c index f3b0dc180c..9005c32993 100644 --- a/src/battle/ov16_0223B140.c +++ b/src/battle/ov16_0223B140.c @@ -1386,7 +1386,7 @@ static void ov16_0223C2C0(BattleSystem *param0, FieldBattleDTO *param1) } if (param0->battleType & 0x1) { - if ((ov16_0223CD3C(param0->trainers[1].class) == 1) || (ov16_0223CD3C(param0->trainers[3].class) == 1)) { + if ((ov16_0223CD3C(param0->trainers[1].header.trainerType) == 1) || (ov16_0223CD3C(param0->trainers[3].header.trainerType) == 1)) { for (v0 = 0; v0 < Party_GetCurrentCount(param0->parties[0]); v0++) { v3 = Party_GetPokemonBySlotIndex(param0->parties[0], v0); Pokemon_UpdateFriendship(v3, 3, param0->unk_2404); diff --git a/src/battle/ov16_0223DF00.c b/src/battle/ov16_0223DF00.c index 08a0a05e19..4492d7c436 100644 --- a/src/battle/ov16_0223DF00.c +++ b/src/battle/ov16_0223DF00.c @@ -22,7 +22,7 @@ #include "struct_defs/battle_system.h" #include "struct_defs/chatot_cry.h" #include "struct_defs/struct_0200D0F4.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_context.h" #include "battle/battle_display.h" @@ -1550,7 +1550,7 @@ int ov16_0223F6F0(BattleSystem *battleSystem, u16 param1) u16 BattleSystem_TrainerItems(BattleSystem *battleSystem, int param1, int param2) { - return battleSystem->trainers[param1].items[param2]; + return battleSystem->trainers[param1].header.items[param2]; } u32 BattleSystem_RecordingStopped(BattleSystem *battleSystem) diff --git a/src/battle/trainer_ai/trainer_ai.c b/src/battle/trainer_ai/trainer_ai.c index 33ed3f1763..e60463bb6a 100644 --- a/src/battle/trainer_ai/trainer_ai.c +++ b/src/battle/trainer_ai/trainer_ai.c @@ -353,7 +353,7 @@ void TrainerAI_Init(BattleSystem *battleSys, BattleContext *battleCtx, u8 battle if (battleSys->battleType & BATTLE_TYPE_ROAMER) { AI_CONTEXT.thinkingMask = AI_FLAG_ROAMING_POKEMON; } else { - AI_CONTEXT.thinkingMask = battleSys->trainers[battler].aiMask; + AI_CONTEXT.thinkingMask = battleSys->trainers[battler].header.aiMask; } // force double-battle strategies, if applicable diff --git a/src/enc_effects.c b/src/enc_effects.c index 22b4931a0f..73544689ae 100644 --- a/src/enc_effects.c +++ b/src/enc_effects.c @@ -126,7 +126,7 @@ static u32 EncEffects_GetEffectPair(const FieldBattleDTO *dto) u32 battleType = dto->battleType; if (battleType & BATTLE_TYPE_TRAINER) { - u32 trainerEffect = EncEffects_TrainerClassEffect(dto->trainer[1].class); + u32 trainerEffect = EncEffects_TrainerClassEffect(dto->trainer[1].header.trainerType); if (battleType & BATTLE_TYPE_FRONTIER) { if (trainerEffect == ENCEFF_FRONTIER_BRAIN) { diff --git a/src/field_battle_data_transfer.c b/src/field_battle_data_transfer.c index c9f36bf295..30fa530e81 100644 --- a/src/field_battle_data_transfer.c +++ b/src/field_battle_data_transfer.c @@ -18,7 +18,7 @@ #include "struct_defs/chatot_cry.h" #include "struct_defs/struct_0202610C.h" #include "struct_defs/struct_0205EC34.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "applications/pokemon_summary_screen/main.h" #include "field/field_system.h" @@ -404,7 +404,7 @@ void FieldBattleDTO_InitWithPartyOrder(FieldBattleDTO *dto, const FieldSystem *f int unionAppearance = TrainerInfo_Appearance(trainerInfo); int unionGender = TrainerInfo_Gender(trainerInfo); - dto->trainer[BATTLER_PLAYER_1].class = sub_0205CA14(unionGender, unionAppearance, 1); + dto->trainer[BATTLER_PLAYER_1].header.trainerType = sub_0205CA14(unionGender, unionAppearance, 1); CharCode_Copy(dto->trainer[BATTLER_PLAYER_1].name, TrainerInfo_Name(dto->trainerInfo[BATTLER_PLAYER_1])); dto->trainer[BATTLER_PLAYER_2] = dto->trainer[BATTLER_PLAYER_1]; } else { @@ -548,7 +548,7 @@ BOOL CheckPlayerDidNotCaptureWildMon(u32 battleResult) void FieldBattleDTO_CopyPlayerInfoToTrainerData(FieldBattleDTO *dto) { - dto->trainer[BATTLER_PLAYER_1].class = TrainerInfo_Gender(dto->trainerInfo[BATTLER_PLAYER_1]); + dto->trainer[BATTLER_PLAYER_1].header.trainerType = TrainerInfo_Gender(dto->trainerInfo[BATTLER_PLAYER_1]); CharCode_Copy(dto->trainer[BATTLER_PLAYER_1].name, TrainerInfo_Name(dto->trainerInfo[BATTLER_PLAYER_1])); dto->trainer[BATTLER_PLAYER_2] = dto->trainer[BATTLER_PLAYER_1]; } diff --git a/src/overlay010/ov10_0221F800.c b/src/overlay010/ov10_0221F800.c index f45b2a416c..bf01ba5c97 100644 --- a/src/overlay010/ov10_0221F800.c +++ b/src/overlay010/ov10_0221F800.c @@ -2406,7 +2406,7 @@ static void ov10_022227A4(UnkStruct_ov10_0221F800 *param0) battleResult = param0->unk_2A - 1; if (MapHeader_IsUnionRoom(param0->unk_00->mapHeaderID) == 1) { - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].header.trainerType); opponentName1 = Heap_AllocFromHeap(param0->unk_24, sizeof(u16) * (TRAINER_NAME_LEN + 1)); Strbuf_ToChars(param0->unk_14[sub_020362F4(v6 ^ 1)], opponentName1, TRAINER_NAME_LEN + 1); @@ -2415,7 +2415,7 @@ static void ov10_022227A4(UnkStruct_ov10_0221F800 *param0) } else { switch (sub_0203895C()) { case 1: - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].header.trainerType); opponentName1 = Heap_AllocFromHeap(param0->unk_24, sizeof(u16) * (TRAINER_NAME_LEN + 1)); Strbuf_ToChars(param0->unk_14[sub_020362F4(v6 ^ 1)], opponentName1, TRAINER_NAME_LEN + 1); @@ -2424,7 +2424,7 @@ static void ov10_022227A4(UnkStruct_ov10_0221F800 *param0) Heap_FreeToHeap(opponentName1); break; case 2: - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].header.trainerType); opponentName1 = Heap_AllocFromHeap(param0->unk_24, sizeof(u16) * (TRAINER_NAME_LEN + 1)); Strbuf_ToChars(param0->unk_14[sub_020362F4(v6 ^ 1)], opponentName1, TRAINER_NAME_LEN + 1); @@ -2433,7 +2433,7 @@ static void ov10_022227A4(UnkStruct_ov10_0221F800 *param0) Heap_FreeToHeap(opponentName1); break; case 3: - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[v6 ^ 1].header.trainerType); opponentName1 = Heap_AllocFromHeap(param0->unk_24, sizeof(u16) * (TRAINER_NAME_LEN + 1)); Strbuf_ToChars(param0->unk_14[sub_020362F4(v6 ^ 1)], opponentName1, TRAINER_NAME_LEN + 1); @@ -2446,14 +2446,14 @@ static void ov10_022227A4(UnkStruct_ov10_0221F800 *param0) opponentName2 = Heap_AllocFromHeap(param0->unk_24, sizeof(u16) * (TRAINER_NAME_LEN + 1)); if (ov10_02220AD0() == 1) { - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[1].class); - opponentGender2 = TrainerClass_Gender(param0->unk_00->trainer[3].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[1].header.trainerType); + opponentGender2 = TrainerClass_Gender(param0->unk_00->trainer[3].header.trainerType); Strbuf_ToChars(param0->unk_14[1], opponentName1, TRAINER_NAME_LEN + 1); Strbuf_ToChars(param0->unk_14[3], opponentName2, TRAINER_NAME_LEN + 1); } else { - opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[0].class); - opponentGender2 = TrainerClass_Gender(param0->unk_00->trainer[2].class); + opponentGender1 = TrainerClass_Gender(param0->unk_00->trainer[0].header.trainerType); + opponentGender2 = TrainerClass_Gender(param0->unk_00->trainer[2].header.trainerType); Strbuf_ToChars(param0->unk_14[0], opponentName1, TRAINER_NAME_LEN + 1); Strbuf_ToChars(param0->unk_14[2], opponentName2, TRAINER_NAME_LEN + 1); diff --git a/src/overlay104/ov104_0222DCE0.c b/src/overlay104/ov104_0222DCE0.c index 439cd72b66..0cfe1ab0f6 100644 --- a/src/overlay104/ov104_0222DCE0.c +++ b/src/overlay104/ov104_0222DCE0.c @@ -445,7 +445,7 @@ void ov104_0222E284(FieldBattleDTO *param0, UnkStruct_ov104_0223A348_sub1 *param Pokemon *v1; param0->trainerIDs[param3] = param1->unk_00; - param0->trainer[param3].class = param1->unk_04; + param0->trainer[param3].header.trainerType = param1->unk_04; CharCode_Copy(¶m0->trainer[param3].name[0], ¶m1->unk_08[0]); diff --git a/src/overlay104/ov104_0223A0C4.c b/src/overlay104/ov104_0223A0C4.c index f0c8e8c39a..3fe6bb696f 100644 --- a/src/overlay104/ov104_0223A0C4.c +++ b/src/overlay104/ov104_0223A0C4.c @@ -944,7 +944,7 @@ FieldBattleDTO *ov104_0223A580(UnkStruct_0204AFC4 *param0, UnkStruct_ov104_02230 ov104_0223A6AC(v3, &(param0->unk_78[0]), param0->unk_0E, 1, param0->unk_04); for (v0 = 0; v0 < 4; v0++) { - v3->trainer[v0].aiMask = (0x1 | 0x2 | 0x4); + v3->trainer[v0].header.aiMask = (0x1 | 0x2 | 0x4); } switch (param0->unk_0F) { diff --git a/src/overlay104/ov104_0223A7F4.c b/src/overlay104/ov104_0223A7F4.c index 090b08dc61..74113849f1 100644 --- a/src/overlay104/ov104_0223A7F4.c +++ b/src/overlay104/ov104_0223A7F4.c @@ -381,7 +381,7 @@ FieldBattleDTO *ov104_0223ABA0(UnkStruct_ov104_0223ADA0 *param0, UnkStruct_ov104 Party_InitWithCapacity(v4->parties[1], ov104_0223AA74(param0->unk_04, 0)); for (v0 = 0; v0 < 4; v0++) { - v4->trainer[v0].aiMask = ov104_0223AEE4(param0); + v4->trainer[v0].header.aiMask = ov104_0223AEE4(param0); } v5 = Pokemon_New(11); diff --git a/src/overlay104/ov104_0223AF58.c b/src/overlay104/ov104_0223AF58.c index e48534399d..8456f8f39b 100644 --- a/src/overlay104/ov104_0223AF58.c +++ b/src/overlay104/ov104_0223AF58.c @@ -1619,7 +1619,7 @@ FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104 v2 = ov104_0223B604(param0, v6, v7); for (v1 = 0; v1 < 4; v1++) { - v8->trainer[v1].aiMask = v2; + v8->trainer[v1].header.aiMask = v2; } ov104_0223B518(¶m0->unk_290[v6], v7, param0->unk_18[v6], ¶m0->unk_268[v6], v5, 11, 180); diff --git a/src/overlay104/ov104_0223B6F4.c b/src/overlay104/ov104_0223B6F4.c index 4e877946e0..5c2f09c695 100644 --- a/src/overlay104/ov104_0223B6F4.c +++ b/src/overlay104/ov104_0223B6F4.c @@ -203,7 +203,7 @@ FieldBattleDTO *ov104_0223B810(UnkStruct_ov104_0223BA10 *param0, UnkStruct_ov104 Party_InitWithCapacity(v5->parties[1], ov104_0223B7DC(param0->unk_10, 0)); for (v0 = 0; v0 < 4; v0++) { - v5->trainer[v0].aiMask = ov104_0223BB10(param0); + v5->trainer[v0].header.aiMask = ov104_0223BB10(param0); } v6 = Pokemon_New(11); diff --git a/src/overlay104/ov104_0223BCBC.c b/src/overlay104/ov104_0223BCBC.c index 7315b09d66..e1226e0cd4 100644 --- a/src/overlay104/ov104_0223BCBC.c +++ b/src/overlay104/ov104_0223BCBC.c @@ -216,7 +216,7 @@ FieldBattleDTO *ov104_0223BDD8(UnkStruct_ov104_0223BFFC *param0, UnkStruct_ov104 Party_InitWithCapacity(v5->parties[1], ov104_0223BDA4(param0->unk_10, 0)); for (v0 = 0; v0 < 4; v0++) { - v5->trainer[v0].aiMask = ov104_0223C0D0(param0); + v5->trainer[v0].header.aiMask = ov104_0223C0D0(param0); } v6 = Pokemon_New(11); diff --git a/src/string_template.c b/src/string_template.c index 28a462ca1a..748a8f8ea8 100644 --- a/src/string_template.c +++ b/src/string_template.c @@ -13,7 +13,7 @@ #include "generated/text_banks.h" #include "struct_decls/struct_020797DC_decl.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "charcode.h" #include "enums.h" @@ -323,7 +323,7 @@ void StringTemplate_SetTrainerClassNameBattle(StringTemplate *template, u32 idx, MessageLoader *loader = InitMessageLoader(TEXT_BANK_TRAINER_CLASS_NAMES, template->heapID); if (loader) { - MessageLoader_GetStrbuf(loader, trainer->class, template->templateBuf); + MessageLoader_GetStrbuf(loader, trainer->header.trainerType, template->templateBuf); SetStringTemplateArg(template, idx, template->templateBuf, NULL); MessageLoader_Free(loader); } diff --git a/src/trainer_data.c b/src/trainer_data.c index 1f3f8bda3b..60542ce83b 100644 --- a/src/trainer_data.c +++ b/src/trainer_data.c @@ -1,12 +1,11 @@ -#include "struct_defs/trainer_data.h" - -#include -#include +#include "trainer_data.h" #include "constants/battle.h" #include "constants/pokemon.h" #include "constants/trainer.h" +#include "struct_defs/trainer.h" + #include "data/trainer_class_genders.h" #include "charcode_util.h" @@ -20,7 +19,6 @@ #include "savedata.h" #include "savedata_misc.h" #include "strbuf.h" -#include "trainer_data.h" static void TrainerData_BuildParty(FieldBattleDTO *dto, int battler, int heapID); @@ -38,7 +36,7 @@ void Trainer_Encounter(FieldBattleDTO *dto, const SaveData *save, int heapID) Trainer_Load(dto->trainerIDs[i], &trdata); dto->trainer[i] = trdata; - if (trdata.class == TRAINER_CLASS_RIVAL) { + if (trdata.header.trainerType == TRAINER_CLASS_RIVAL) { CharCode_Copy(dto->trainer[i].name, rivalName); } else { Strbuf *trainerName = MessageLoader_GetNewStrbuf(msgLoader, dto->trainerIDs[i]); @@ -49,12 +47,13 @@ void Trainer_Encounter(FieldBattleDTO *dto, const SaveData *save, int heapID) TrainerData_BuildParty(dto, i, heapID); } - dto->battleType |= trdata.battleType; + dto->battleType |= trdata.header.battleType; MessageLoader_Free(msgLoader); } u32 Trainer_LoadParam(int trainerID, enum TrainerDataParam paramID) { + // TODO: can this be trainerheader? u32 result; Trainer trdata; @@ -62,34 +61,34 @@ u32 Trainer_LoadParam(int trainerID, enum TrainerDataParam paramID) switch (paramID) { case TRDATA_TYPE: - result = trdata.type; + result = trdata.header.monDataType; break; case TRDATA_CLASS: - result = trdata.class; + result = trdata.header.trainerType; break; case TRDATA_SPRITE: - result = trdata.sprite; + result = trdata.header.sprite; break; case TRDATA_PARTY_SIZE: - result = trdata.partySize; + result = trdata.header.partySize; break; case TRDATA_ITEM_1: case TRDATA_ITEM_2: case TRDATA_ITEM_3: case TRDATA_ITEM_4: - result = trdata.items[paramID - TRDATA_ITEM_1]; + result = trdata.header.items[paramID - TRDATA_ITEM_1]; break; case TRDATA_AI_MASK: - result = trdata.aiMask; + result = trdata.header.aiMask; break; case TRDATA_BATTLE_TYPE: - result = trdata.battleType; + result = trdata.header.battleType; break; } @@ -193,21 +192,21 @@ static void TrainerData_BuildParty(FieldBattleDTO *dto, int battler, int heapID) Trainer_LoadParty(dto->trainerIDs[battler], buf); // determine which magic gender-specific modifier to use for the RNG function - genderMod = TrainerClass_Gender(dto->trainer[battler].class) == GENDER_FEMALE + genderMod = TrainerClass_Gender(dto->trainer[battler].header.trainerType) == GENDER_FEMALE ? 120 : 136; - switch (dto->trainer[battler].type) { + switch (dto->trainer[battler].header.monDataType) { case TRDATATYPE_BASE: { TrainerMonBase *trmon = (TrainerMonBase *)buf; - for (i = 0; i < dto->trainer[battler].partySize; i++) { + for (i = 0; i < dto->trainer[battler].header.partySize; i++) { u16 species = trmon[i].species & 0x3FF; u8 form = (trmon[i].species & 0xFC00) >> 10; rnd = trmon[i].dv + trmon[i].level + species + dto->trainerIDs[battler]; LCRNG_SetSeed(rnd); - for (j = 0; j < dto->trainer[battler].class; j++) { + for (j = 0; j < dto->trainer[battler].header.trainerType; j++) { rnd = LCRNG_Next(); } @@ -225,14 +224,14 @@ static void TrainerData_BuildParty(FieldBattleDTO *dto, int battler, int heapID) case TRDATATYPE_WITH_MOVES: { TrainerMonWithMoves *trmon = (TrainerMonWithMoves *)buf; - for (i = 0; i < dto->trainer[battler].partySize; i++) { + for (i = 0; i < dto->trainer[battler].header.partySize; i++) { u16 species = trmon[i].species & 0x3FF; u8 form = (trmon[i].species & 0xFC00) >> 10; rnd = trmon[i].dv + trmon[i].level + species + dto->trainerIDs[battler]; LCRNG_SetSeed(rnd); - for (j = 0; j < dto->trainer[battler].class; j++) { + for (j = 0; j < dto->trainer[battler].header.trainerType; j++) { rnd = LCRNG_Next(); } @@ -255,14 +254,14 @@ static void TrainerData_BuildParty(FieldBattleDTO *dto, int battler, int heapID) case TRDATATYPE_WITH_ITEM: { TrainerMonWithItem *trmon = (TrainerMonWithItem *)buf; - for (i = 0; i < dto->trainer[battler].partySize; i++) { + for (i = 0; i < dto->trainer[battler].header.partySize; i++) { u16 species = trmon[i].species & 0x3FF; u8 form = (trmon[i].species & 0xFC00) >> 10; rnd = trmon[i].dv + trmon[i].level + species + dto->trainerIDs[battler]; LCRNG_SetSeed(rnd); - for (j = 0; j < dto->trainer[battler].class; j++) { + for (j = 0; j < dto->trainer[battler].header.trainerType; j++) { rnd = LCRNG_Next(); } @@ -281,14 +280,14 @@ static void TrainerData_BuildParty(FieldBattleDTO *dto, int battler, int heapID) case TRDATATYPE_WITH_MOVES_AND_ITEM: { TrainerMonWithMovesAndItem *trmon = (TrainerMonWithMovesAndItem *)buf; - for (i = 0; i < dto->trainer[battler].partySize; i++) { + for (i = 0; i < dto->trainer[battler].header.partySize; i++) { u16 species = trmon[i].species & 0x3FF; u8 form = (trmon[i].species & 0xFC00) >> 10; rnd = trmon[i].dv + trmon[i].level + species + dto->trainerIDs[battler]; LCRNG_SetSeed(rnd); - for (j = 0; j < dto->trainer[battler].class; j++) { + for (j = 0; j < dto->trainer[battler].header.trainerType; j++) { rnd = LCRNG_Next(); } diff --git a/src/unk_0207A6DC.c b/src/unk_0207A6DC.c index e17a2dd9bd..3f51753738 100644 --- a/src/unk_0207A6DC.c +++ b/src/unk_0207A6DC.c @@ -13,7 +13,7 @@ #include "struct_defs/struct_0207A81C.h" #include "struct_defs/struct_0207ACB4.h" #include "struct_defs/struct_0207AD40.h" -#include "struct_defs/trainer_data.h" +#include "struct_defs/trainer.h" #include "battle/battle_io.h" #include "battle/ov16_0223DF00.h" diff --git a/src/unk_0208BA78.c b/src/unk_0208BA78.c index 4992b2f4d7..df20d26db1 100644 --- a/src/unk_0208BA78.c +++ b/src/unk_0208BA78.c @@ -288,7 +288,7 @@ static BOOL sub_0208BC8C(UnkStruct_0208BC3C *param0, int param1) sub_0200544C(1, 127); sub_02005464(1); - if (sub_0208BE80(param0->unk_10->trainer[1].class) == 1) { + if (sub_0208BE80(param0->unk_10->trainer[1].header.trainerType) == 1) { sub_02004550(5, 1202, 1); } else { sub_02004550(5, 1119, 1);