[BUG] Fix a couple of bugs regarding MEs and their localization (#4261)
* Fixed SURF and FLY not beeing localized in "lost at sea" Fixed Mysterious Challenger Title not beeing correct Fixed Winstrate Names not beeing localized * Revert the winstrate fix. It breaks other trainer battles for some reason... * A new way of giving the winstrates localized names (and for the future all named trainers that dont use a "initFor" method) * Updated test (with ok from ImperialSympathizer) * Made the expected value simpler * FLY and SURF can be localized much simpler
This commit is contained in:
parent
9f8e9de967
commit
aecdcd34f5
|
@ -10,6 +10,7 @@ import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encount
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import {PokemonMove} from "#app/field/pokemon";
|
||||||
|
|
||||||
const OPTION_1_REQUIRED_MOVE = Moves.SURF;
|
const OPTION_1_REQUIRED_MOVE = Moves.SURF;
|
||||||
const OPTION_2_REQUIRED_MOVE = Moves.FLY;
|
const OPTION_2_REQUIRED_MOVE = Moves.FLY;
|
||||||
|
@ -44,8 +45,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
||||||
const encounter = scene.currentBattle.mysteryEncounter!;
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
encounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE));
|
encounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE));
|
||||||
encounter.setDialogueToken("option1RequiredMove", Moves[OPTION_1_REQUIRED_MOVE]);
|
encounter.setDialogueToken("option1RequiredMove", new PokemonMove(OPTION_1_REQUIRED_MOVE).getName());
|
||||||
encounter.setDialogueToken("option2RequiredMove", Moves[OPTION_2_REQUIRED_MOVE]);
|
encounter.setDialogueToken("option2RequiredMove", new PokemonMove(OPTION_2_REQUIRED_MOVE).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
|
|
|
@ -87,6 +87,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter =
|
||||||
);
|
);
|
||||||
const e4Template = trainerPartyTemplates.ELITE_FOUR;
|
const e4Template = trainerPartyTemplates.ELITE_FOUR;
|
||||||
const brutalConfig = trainerConfigs[brutalTrainerType].clone();
|
const brutalConfig = trainerConfigs[brutalTrainerType].clone();
|
||||||
|
brutalConfig.title = trainerConfigs[brutalTrainerType].title;
|
||||||
brutalConfig.setPartyTemplates(e4Template);
|
brutalConfig.setPartyTemplates(e4Template);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func
|
brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func
|
||||||
|
|
|
@ -255,7 +255,9 @@ export class TrainerConfig {
|
||||||
name = i18next.t("trainerNames:rival");
|
name = i18next.t("trainerNames:rival");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,6 +901,20 @@ export class TrainerConfig {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a localized name for the trainer. This should only be used for trainers that dont use a "initFor" function and are considered "named" trainers
|
||||||
|
* @param name - The name of the trainer.
|
||||||
|
* @returns {TrainerConfig} The updated TrainerConfig instance.
|
||||||
|
*/
|
||||||
|
setLocalizedName(name: string): TrainerConfig {
|
||||||
|
// Check if the internationalization (i18n) system is initialized.
|
||||||
|
if (!getIsInitialized()) {
|
||||||
|
initI18n();
|
||||||
|
}
|
||||||
|
this.name = i18next.t(`trainerNames:${name.toLowerCase()}`);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the title for the trainer based on the provided trainer slot and variant.
|
* Retrieves the title for the trainer based on the provided trainer slot and variant.
|
||||||
* @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
|
* @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
|
||||||
|
@ -2270,21 +2286,22 @@ export const trainerConfigs: TrainerConfigs = {
|
||||||
}
|
}
|
||||||
p.pokeball = PokeballType.MASTER_BALL;
|
p.pokeball = PokeballType.MASTER_BALL;
|
||||||
})),
|
})),
|
||||||
[TrainerType.VICTOR]: new TrainerConfig(++t).setName("Victor").setTitle("The Winstrates")
|
[TrainerType.VICTOR]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victor")
|
||||||
.setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6
|
.setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6
|
||||||
.setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG),
|
.setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG),
|
||||||
[TrainerType.VICTORIA]: new TrainerConfig(++t).setName("Victoria").setTitle("The Winstrates")
|
[TrainerType.VICTORIA]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victoria")
|
||||||
.setMoneyMultiplier(1)
|
.setMoneyMultiplier(1)
|
||||||
.setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG),
|
.setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG),
|
||||||
[TrainerType.VIVI]: new TrainerConfig(++t).setName("Vivi").setTitle("The Winstrates")
|
[TrainerType.VIVI]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vivi")
|
||||||
.setMoneyMultiplier(1)
|
.setMoneyMultiplier(1)
|
||||||
.setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG),
|
.setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG),
|
||||||
[TrainerType.VICKY]: new TrainerConfig(++t).setName("Vicky").setTitle("The Winstrates")
|
[TrainerType.VICKY]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vicky")
|
||||||
.setMoneyMultiplier(1)
|
.setMoneyMultiplier(1)
|
||||||
.setPartyTemplates(trainerPartyTemplates.ONE_AVG),
|
.setPartyTemplates(trainerPartyTemplates.ONE_AVG),
|
||||||
[TrainerType.VITO]: new TrainerConfig(++t).setName("Vito").setTitle("The Winstrates")
|
[TrainerType.VITO]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vito")
|
||||||
.setMoneyMultiplier(2)
|
.setMoneyMultiplier(2)
|
||||||
.setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))),
|
.setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))),
|
||||||
[TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER)
|
[TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER)
|
||||||
.setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount
|
||||||
import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Biome } from "#app/enums/biome";
|
import { Biome } from "#app/enums/biome";
|
||||||
import { Moves } from "#app/enums/moves";
|
|
||||||
import { MysteryEncounterType } from "#app/enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#app/enums/mystery-encounter-type";
|
||||||
import { Species } from "#app/enums/species";
|
import { Species } from "#app/enums/species";
|
||||||
import GameManager from "#app/test/utils/gameManager";
|
import GameManager from "#app/test/utils/gameManager";
|
||||||
|
@ -16,6 +15,7 @@ import BattleScene from "#app/battle-scene";
|
||||||
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
|
||||||
import { PartyExpPhase } from "#app/phases/party-exp-phase";
|
import { PartyExpPhase } from "#app/phases/party-exp-phase";
|
||||||
|
|
||||||
|
|
||||||
const namespace = "mysteryEncounter:lostAtSea";
|
const namespace = "mysteryEncounter:lostAtSea";
|
||||||
/** Blastoise for surf. Pidgeot for fly. Abra for none. */
|
/** Blastoise for surf. Pidgeot for fly. Abra for none. */
|
||||||
const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA];
|
const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA];
|
||||||
|
@ -102,8 +102,8 @@ describe("Lost at Sea - Mystery Encounter", () => {
|
||||||
const onInitResult = onInit!(scene);
|
const onInitResult = onInit!(scene);
|
||||||
|
|
||||||
expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25");
|
expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25");
|
||||||
expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]);
|
expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe("Surf");
|
||||||
expect(LostAtSeaEncounter.dialogueTokens?.option2RequiredMove).toBe(Moves[Moves.FLY]);
|
expect(LostAtSeaEncounter.dialogueTokens?.option2RequiredMove).toBe("Fly");
|
||||||
expect(onInitResult).toBe(true);
|
expect(onInitResult).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue