Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines (#7425)

This commit is contained in:
grintoul 2025-08-13 10:02:41 +01:00 committed by GitHub
parent 7b5844762d
commit 916f083852
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 43 additions and 21 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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