[Bug][Hotfix] Fix crash when pulling trainer names for (certain) non-English languages (#5608)

* Fix key usage for trainer locales

* Update gts

* Fix partner name generation

---------

Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com>
This commit is contained in:
Dean 2025-04-01 18:31:52 -07:00 committed by GitHub
parent 4a4e766135
commit 5416c76ecb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 27 deletions

View File

@ -985,12 +985,11 @@ function doTradeReceivedSequence(
function generateRandomTraderName() { function generateRandomTraderName() {
const length = TrainerType.YOUNGSTER - TrainerType.ACE_TRAINER + 1; const length = TrainerType.YOUNGSTER - TrainerType.ACE_TRAINER + 1;
// +1 avoids TrainerType.UNKNOWN // +1 avoids TrainerType.UNKNOWN
const trainerTypePool = i18next.t("trainersCommon:" + TrainerType[randInt(length) + 1], { returnObjects: true }); const classKey = `trainersCommon:${TrainerType[randInt(length) + 1]}`;
// Some trainers have 2 gendered pools, some do not // Some trainers have 2 gendered pools, some do not
const gender = randInt(2) === 0 ? "MALE" : "FEMALE"; const genderKey = i18next.exists(`${classKey}.MALE`) ? (randInt(2) === 0 ? ".MALE" : ".FEMALE") : "";
const trainerNameString = randSeedItem( const trainerNameKey = randSeedItem(Object.keys(i18next.t(`${classKey}${genderKey}`, { returnObjects: true })));
Object.values(trainerTypePool.hasOwnProperty(gender) ? trainerTypePool[gender] : trainerTypePool), const trainerNameString = i18next.t(`${classKey}${genderKey}.${trainerNameKey}`);
) as string;
// Some names have an '&' symbol and need to be trimmed to a single name instead of a double name // Some names have an '&' symbol and need to be trimmed to a single name instead of a double name
const trainerNames = trainerNameString.split(" & "); const trainerNames = trainerNameString.split(" & ");
return trainerNames[randInt(trainerNames.length)]; return trainerNames[randInt(trainerNames.length)];

View File

@ -33,14 +33,16 @@ export default class Trainer extends Phaser.GameObjects.Container {
public partyTemplateIndex: number; public partyTemplateIndex: number;
public name: string; public name: string;
public partnerName: string; public partnerName: string;
public nameKey: string;
public partnerNameKey: string | undefined;
public originalIndexes: { [key: number]: number } = {}; public originalIndexes: { [key: number]: number } = {};
constructor( constructor(
trainerType: TrainerType, trainerType: TrainerType,
variant: TrainerVariant, variant: TrainerVariant,
partyTemplateIndex?: number, partyTemplateIndex?: number,
name?: string, nameKey?: string,
partnerName?: string, partnerNameKey?: string,
trainerConfigOverride?: TrainerConfig, trainerConfigOverride?: TrainerConfig,
) { ) {
super(globalScene, -72, 80); super(globalScene, -72, 80);
@ -59,28 +61,41 @@ export default class Trainer extends Phaser.GameObjects.Container {
: Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)),
this.config.partyTemplates.length - 1, this.config.partyTemplates.length - 1,
); );
if (i18next.exists("trainersCommon:" + TrainerType[trainerType], { returnObjects: true })) { const classKey = `trainersCommon:${TrainerType[trainerType]}`;
const namePool = i18next.t("trainersCommon:" + TrainerType[trainerType], { returnObjects: true }); if (i18next.exists(classKey, { returnObjects: true })) {
this.name = if (nameKey) {
name || this.nameKey = nameKey;
Utils.randSeedItem( } else {
Object.values( const genderKey = i18next.exists(`${classKey}.MALE`)
namePool.hasOwnProperty("MALE") ? variant === TrainerVariant.FEMALE
? namePool[variant === TrainerVariant.FEMALE ? "FEMALE" : "MALE"] ? ".FEMALE"
: namePool, : ".MALE"
), : "";
const trainerKey = Utils.randSeedItem(
Object.keys(i18next.t(`${classKey}${genderKey}`, { returnObjects: true })),
); );
this.nameKey = `${classKey}${genderKey}.${trainerKey}`;
}
this.name = i18next.t(this.nameKey);
if (variant === TrainerVariant.DOUBLE) { if (variant === TrainerVariant.DOUBLE) {
if (this.config.doubleOnly) { if (this.config.doubleOnly) {
if (partnerName) { if (partnerNameKey) {
this.partnerName = partnerName; this.partnerNameKey = partnerNameKey;
this.partnerName = i18next.t(this.partnerNameKey);
} else { } else {
[this.name, this.partnerName] = this.name.split(" & "); [this.name, this.partnerName] = this.name.split(" & ");
} }
} else { } else {
this.partnerName = const partnerGenderKey = i18next.exists(`${classKey}.FEMALE`) ? ".FEMALE" : "";
partnerName || const partnerTrainerKey = Utils.randSeedItem(
Utils.randSeedItem(Object.values(namePool.hasOwnProperty("FEMALE") ? namePool["FEMALE"] : namePool)); Object.keys(
i18next.t(`${classKey}${partnerGenderKey}`, {
returnObjects: true,
}),
),
);
this.partnerNameKey = `${classKey}${partnerGenderKey}.${partnerTrainerKey}`;
this.partnerName = i18next.t(this.partnerNameKey);
} }
} }
} }

View File

@ -5,8 +5,8 @@ export default class TrainerData {
public trainerType: TrainerType; public trainerType: TrainerType;
public variant: TrainerVariant; public variant: TrainerVariant;
public partyTemplateIndex: number; public partyTemplateIndex: number;
public name: string; public nameKey: string;
public partnerName: string; public partnerNameKey: string | undefined;
constructor(source: Trainer | any) { constructor(source: Trainer | any) {
const sourceTrainer = source instanceof Trainer ? (source as Trainer) : null; const sourceTrainer = source instanceof Trainer ? (source as Trainer) : null;
@ -17,11 +17,11 @@ export default class TrainerData {
? TrainerVariant.FEMALE ? TrainerVariant.FEMALE
: TrainerVariant.DEFAULT; : TrainerVariant.DEFAULT;
this.partyTemplateIndex = source.partyMemberTemplateIndex; this.partyTemplateIndex = source.partyMemberTemplateIndex;
this.name = source.name; this.nameKey = source.nameKey;
this.partnerName = source.partnerName; this.partnerNameKey = source.partnerNameKey;
} }
toTrainer(): Trainer { toTrainer(): Trainer {
return new Trainer(this.trainerType, this.variant, this.partyTemplateIndex, this.name, this.partnerName); return new Trainer(this.trainerType, this.variant, this.partyTemplateIndex, this.nameKey, this.partnerNameKey);
} }
} }