diff --git a/include/data.h b/include/data.h index 4663bae33c..2128685e19 100644 --- a/include/data.h +++ b/include/data.h @@ -106,6 +106,7 @@ struct Trainer /*0x23*/ u8 poolPickIndex; /*0x24*/ u8 poolPruneIndex; /*0x25*/ u16 overrideTrainer; + /*0x26*/ u8 trainerBackPic; }; struct TrainerClass @@ -178,7 +179,6 @@ extern const union AnimCmd *const gAnims_MonPic[]; extern const union AnimCmd *const gAnims_Trainer[]; extern const struct TrainerSprite gTrainerSprites[]; extern const struct TrainerBacksprite gTrainerBacksprites[]; -extern const u16 gTrainerPicToTrainerBackPic[]; extern const struct Trainer gTrainers[DIFFICULTY_COUNT][TRAINERS_COUNT]; extern const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT]; @@ -261,6 +261,16 @@ static inline const u8 GetTrainerPicFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerPic; } +static inline const u8 GetTrainerBackPicFromId(u16 trainerId) +{ + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); + + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; + + return GetTrainerStructFromId(trainerId)->trainerBackPic; +} + static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) { return GetTrainerStructFromId(trainerId)->startingStatus; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 513e286d12..5426f0239f 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -206,7 +206,7 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; xPos = 90; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } @@ -320,9 +320,9 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) - trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic].palette.data; else if (IsAiVsAiBattle()) - trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; + trainerPal = gTrainerSprites[GetTrainerBackPicFromId(gPartnerTrainerId)].palette.data; else trainerPal = gTrainerSprites[GetFrontierTrainerFrontSpriteId(gPartnerTrainerId)].palette.data; // 2 vs 2 multi battle in Battle Frontier, load front sprite and pal. diff --git a/src/battle_transition.c b/src/battle_transition.c index 4b350dd706..114248b93d 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2587,7 +2587,7 @@ static void Mugshots_CreateTrainerPics(struct Task *task) u8 trainerAPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); u8 trainerBPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentB); - u8 partnerPicId = gTrainerPicToTrainerBackPic[GetTrainerPicFromId(gPartnerTrainerId)]; + u8 partnerPicId = GetTrainerPicFromId(gPartnerTrainerId); s16 opponentARotationScales = 0; s16 opponentBRotationScales = 0; diff --git a/src/data/battle_partners.party b/src/data/battle_partners.party index e1ecfe35fa..4b93292c6a 100644 --- a/src/data/battle_partners.party +++ b/src/data/battle_partners.party @@ -4,6 +4,7 @@ Class: Pkmn Trainer 1 Pic: Brendan Gender: Male Music: Male +Back Pic: Brendan === PARTNER_STEVEN === Name: STEVEN @@ -11,6 +12,7 @@ Class: Rival Pic: Steven Gender: Male Music: Male +Back Pic: Steven Metang Brave Nature diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index b3f9282a43..9ce0b629e3 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -84,18 +84,6 @@ const u16 gFacilityClassToPicIndex[] = [FACILITY_CLASS_RS_MAY] = TRAINER_PIC_RS_MAY, }; -const u16 gTrainerPicToTrainerBackPic[] = -{ - [TRAINER_BACK_PIC_BRENDAN] = TRAINER_PIC_BRENDAN, - [TRAINER_BACK_PIC_MAY] = TRAINER_PIC_MAY, - [TRAINER_BACK_PIC_RED] = TRAINER_PIC_RED, - [TRAINER_BACK_PIC_LEAF] = TRAINER_PIC_LEAF, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = TRAINER_PIC_RS_BRENDAN, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = TRAINER_PIC_RS_MAY, - [TRAINER_BACK_PIC_WALLY] = TRAINER_PIC_WALLY, - [TRAINER_BACK_PIC_STEVEN] = TRAINER_PIC_STEVEN, -}; - const enum TrainerClassID gFacilityClassToTrainerClass[] = { [FACILITY_CLASS_HIKER] = TRAINER_CLASS_HIKER, diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 5330c9fe3d..8547735789 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -155,6 +155,9 @@ struct Trainer struct String macro; int macro_line; + + struct String back_pic; + int back_pic_line; }; static bool is_empty_string(struct String s) @@ -1300,6 +1303,13 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->macro_line = value.location.line; trainer->macro = token_string(&value); } + else if (is_literal_token(&key, "Back Pic")) + { + if (trainer->back_pic_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Back Pic'"); + trainer->back_pic_line = value.location.line; + trainer->back_pic = token_string(&value); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Battle Type', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); @@ -1776,10 +1786,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par { fprintf(f, "#line %d\n", trainer->pic_line); fprintf(f, " .trainerPic = "); - if (starts_with(trainer->id, "PARTNER_")) - fprint_constant(f, "TRAINER_BACK_PIC", trainer->pic); - else - fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprint_constant(f, "TRAINER_PIC", trainer->pic); fprintf(f, ",\n"); } @@ -1884,6 +1891,21 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprint_string(f, trainer->copy_pool); fprintf(f, ",\n"); } + if (!is_empty_string(trainer->back_pic)) + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_BACK_PIC", trainer->back_pic); + fprintf(f, ",\n"); + } + else // defaults to front pic in absence of defined back pic + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprintf(f, ",\n"); + } + if (trainer->macro_line) { fprintf(f, "#line %d\n", trainer->macro_line);