Compare commits

..

5 Commits

Author SHA1 Message Date
fabske0
9eca275efb
Merge a97fcab678 into 0da37a0f0c 2025-08-13 18:47:16 +02:00
fabske0
a97fcab678 update menu-ui-handler locales use 2025-08-13 18:46:30 +02:00
Bertie690
0da37a0f0c
[Move] Added laser focus locales (#6202)
* Added Laser Focus locales

* Fixed key for locales text

* Added `MessageAttr`; cleaned up a lot of other jank move attrs
2025-08-13 08:16:08 -07:00
fabske0
81a4e98a11 change growth locales use 2025-08-13 14:58:17 +02:00
fabske0
b2454234f6 change dialogue locales use 2025-08-13 12:27:35 +02:00
8 changed files with 393 additions and 403 deletions

View File

@ -1,13 +1,24 @@
import type { Pokemon } from "#field/pokemon";
import type {
AttackMove,
ChargingAttackMove,
ChargingSelfStatusMove,
Move,
MoveAttr,
MoveAttrConstructorMap,
SelfStatusMove,
StatusMove,
} from "#moves/move";
/**
* A generic function producing a message during a Move's execution.
* @param user - The {@linkcode Pokemon} using the move
* @param target - The {@linkcode Pokemon} targeted by the move
* @param move - The {@linkcode Move} being used
* @returns a string
*/
export type MoveMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => string;
export type MoveAttrFilter = (attr: MoveAttr) => boolean;
export type * from "#moves/move";

View File

@ -1670,6 +1670,7 @@ export class MoveTypeChangeAbAttr extends PreAttackAbAttr {
constructor(
private newType: PokemonType,
private powerMultiplier: number,
// TODO: all moves with this attr solely check the move being used...
private condition?: PokemonAttackCondition,
) {
super(false);

View File

@ -85,20 +85,16 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
{
encounter: [
"dialogue:breeder_female.encounter.1",
"dialogue:breeder_female.encounter.2",
"dialogue:breeder_female.encounter.3",
"dialogue:breederFemale.encounter.1",
"dialogue:breederFemale.encounter.2",
"dialogue:breederFemale.encounter.3",
],
victory: [
"dialogue:breeder_female.victory.1",
"dialogue:breeder_female.victory.2",
"dialogue:breeder_female.victory.3",
],
defeat: [
"dialogue:breeder_female.defeat.1",
"dialogue:breeder_female.defeat.2",
"dialogue:breeder_female.defeat.3",
"dialogue:breederFemale.victory.1",
"dialogue:breederFemale.victory.2",
"dialogue:breederFemale.victory.3",
],
defeat: ["dialogue:breederFemale.defeat.1", "dialogue:breederFemale.defeat.2", "dialogue:breederFemale.defeat.3"],
},
],
[TrainerType.FISHERMAN]: [
@ -108,14 +104,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
{
encounter: [
"dialogue:fisherman_female.encounter.1",
"dialogue:fisherman_female.encounter.2",
"dialogue:fisherman_female.encounter.3",
"dialogue:fishermanFemale.encounter.1",
"dialogue:fishermanFemale.encounter.2",
"dialogue:fishermanFemale.encounter.3",
],
victory: [
"dialogue:fisherman_female.victory.1",
"dialogue:fisherman_female.victory.2",
"dialogue:fisherman_female.victory.3",
"dialogue:fishermanFemale.victory.1",
"dialogue:fishermanFemale.victory.2",
"dialogue:fishermanFemale.victory.3",
],
},
],
@ -144,29 +140,29 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.ACE_TRAINER]: [
{
encounter: [
"dialogue:ace_trainer.encounter.1",
"dialogue:ace_trainer.encounter.2",
"dialogue:ace_trainer.encounter.3",
"dialogue:ace_trainer.encounter.4",
"dialogue:aceTrainer.encounter.1",
"dialogue:aceTrainer.encounter.2",
"dialogue:aceTrainer.encounter.3",
"dialogue:aceTrainer.encounter.4",
],
victory: [
"dialogue:ace_trainer.victory.1",
"dialogue:ace_trainer.victory.2",
"dialogue:ace_trainer.victory.3",
"dialogue:ace_trainer.victory.4",
"dialogue:aceTrainer.victory.1",
"dialogue:aceTrainer.victory.2",
"dialogue:aceTrainer.victory.3",
"dialogue:aceTrainer.victory.4",
],
defeat: [
"dialogue:ace_trainer.defeat.1",
"dialogue:ace_trainer.defeat.2",
"dialogue:ace_trainer.defeat.3",
"dialogue:ace_trainer.defeat.4",
"dialogue:aceTrainer.defeat.1",
"dialogue:aceTrainer.defeat.2",
"dialogue:aceTrainer.defeat.3",
"dialogue:aceTrainer.defeat.4",
],
},
],
[TrainerType.PARASOL_LADY]: [
{
encounter: ["dialogue:parasol_lady.encounter.1"],
victory: ["dialogue:parasol_lady.victory.1"],
encounter: ["dialogue:parasolLady.encounter.1"],
victory: ["dialogue:parasolLady.victory.1"],
},
],
[TrainerType.TWINS]: [
@ -184,13 +180,13 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
],
[TrainerType.BLACK_BELT]: [
{
encounter: ["dialogue:black_belt.encounter.1", "dialogue:black_belt.encounter.2"],
victory: ["dialogue:black_belt.victory.1", "dialogue:black_belt.victory.2"],
encounter: ["dialogue:blackBelt.encounter.1", "dialogue:blackBelt.encounter.2"],
victory: ["dialogue:blackBelt.victory.1", "dialogue:blackBelt.victory.2"],
},
//BATTLE GIRL
{
encounter: ["dialogue:battle_girl.encounter.1"],
victory: ["dialogue:battle_girl.victory.1"],
encounter: ["dialogue:battleGirl.encounter.1"],
victory: ["dialogue:battleGirl.victory.1"],
},
],
[TrainerType.HIKER]: [
@ -214,8 +210,8 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
],
[TrainerType.SCHOOL_KID]: [
{
encounter: ["dialogue:school_kid.encounter.1", "dialogue:school_kid.encounter.2"],
victory: ["dialogue:school_kid.victory.1", "dialogue:school_kid.victory.2"],
encounter: ["dialogue:schoolKid.encounter.1", "dialogue:schoolKid.encounter.2"],
victory: ["dialogue:schoolKid.victory.1", "dialogue:schoolKid.victory.2"],
},
],
[TrainerType.ARTIST]: [
@ -236,31 +232,31 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
victory: ["dialogue:worker.victory.1"],
},
{
encounter: ["dialogue:worker_female.encounter.1"],
victory: ["dialogue:worker_female.victory.1"],
defeat: ["dialogue:worker_female.defeat.1"],
encounter: ["dialogue:workerFemale.encounter.1"],
victory: ["dialogue:workerFemale.victory.1"],
defeat: ["dialogue:workerFemale.defeat.1"],
},
{
encounter: ["dialogue:worker_double.encounter.1"],
victory: ["dialogue:worker_double.victory.1"],
encounter: ["dialogue:workerDouble.encounter.1"],
victory: ["dialogue:workerDouble.victory.1"],
},
],
// Defeat dialogue in the language .JSONS exist as translated or placeholders; (en, fr, it, es, de, ja, ko, zh_cn, zh_tw, pt_br)
[TrainerType.SNOW_WORKER]: [
{
encounter: ["dialogue:snow_worker.encounter.1"],
victory: ["dialogue:snow_worker.victory.1"],
encounter: ["dialogue:snowWorker.encounter.1"],
victory: ["dialogue:snowWorker.victory.1"],
},
{
encounter: ["dialogue:snow_worker_double.encounter.1"],
victory: ["dialogue:snow_worker_double.victory.1"],
encounter: ["dialogue:snowWorkerDouble.encounter.1"],
victory: ["dialogue:snowWorkerDouble.victory.1"],
},
],
[TrainerType.HEX_MANIAC]: [
{
encounter: ["dialogue:hex_maniac.encounter.1", "dialogue:hex_maniac.encounter.2"],
victory: ["dialogue:hex_maniac.victory.1", "dialogue:hex_maniac.victory.2"],
defeat: ["dialogue:hex_maniac.defeat.1", "dialogue:hex_maniac.defeat.2"],
encounter: ["dialogue:hexManiac.encounter.1", "dialogue:hexManiac.encounter.2"],
victory: ["dialogue:hexManiac.victory.1", "dialogue:hexManiac.victory.2"],
defeat: ["dialogue:hexManiac.defeat.1", "dialogue:hexManiac.defeat.2"],
},
],
[TrainerType.PSYCHIC]: [
@ -320,15 +316,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
{
encounter: [
"dialogue:clerk_female.encounter.1",
"dialogue:clerk_female.encounter.2",
"dialogue:clerk_female.encounter.3",
],
victory: [
"dialogue:clerk_female.victory.1",
"dialogue:clerk_female.victory.2",
"dialogue:clerk_female.victory.3",
"dialogue:clerkFemale.encounter.1",
"dialogue:clerkFemale.encounter.2",
"dialogue:clerkFemale.encounter.3",
],
victory: ["dialogue:clerkFemale.victory.1", "dialogue:clerkFemale.victory.2", "dialogue:clerkFemale.victory.3"],
},
],
[TrainerType.HOOLIGANS]: [
@ -371,14 +363,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
{
encounter: [
"dialogue:pokefan_female.encounter.1",
"dialogue:pokefan_female.encounter.2",
"dialogue:pokefan_female.encounter.3",
"dialogue:pokefanFemale.encounter.1",
"dialogue:pokefanFemale.encounter.2",
"dialogue:pokefanFemale.encounter.3",
],
victory: [
"dialogue:pokefan_female.victory.1",
"dialogue:pokefan_female.victory.2",
"dialogue:pokefan_female.victory.3",
"dialogue:pokefanFemale.victory.1",
"dialogue:pokefanFemale.victory.2",
"dialogue:pokefanFemale.victory.3",
],
},
],
@ -389,52 +381,52 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
{
encounter: [
"dialogue:rich_female.encounter.1",
"dialogue:rich_female.encounter.2",
"dialogue:rich_female.encounter.3",
"dialogue:richFemale.encounter.1",
"dialogue:richFemale.encounter.2",
"dialogue:richFemale.encounter.3",
],
victory: ["dialogue:rich_female.victory.1", "dialogue:rich_female.victory.2", "dialogue:rich_female.victory.3"],
victory: ["dialogue:richFemale.victory.1", "dialogue:richFemale.victory.2", "dialogue:richFemale.victory.3"],
},
],
[TrainerType.RICH_KID]: [
{
encounter: ["dialogue:rich_kid.encounter.1", "dialogue:rich_kid.encounter.2", "dialogue:rich_kid.encounter.3"],
encounter: ["dialogue:richKid.encounter.1", "dialogue:richKid.encounter.2", "dialogue:richKid.encounter.3"],
victory: [
"dialogue:rich_kid.victory.1",
"dialogue:rich_kid.victory.2",
"dialogue:rich_kid.victory.3",
"dialogue:rich_kid.victory.4",
"dialogue:richKid.victory.1",
"dialogue:richKid.victory.2",
"dialogue:richKid.victory.3",
"dialogue:richKid.victory.4",
],
},
{
encounter: [
"dialogue:rich_kid_female.encounter.1",
"dialogue:rich_kid_female.encounter.2",
"dialogue:rich_kid_female.encounter.3",
"dialogue:richKidFemale.encounter.1",
"dialogue:richKidFemale.encounter.2",
"dialogue:richKidFemale.encounter.3",
],
victory: [
"dialogue:rich_kid_female.victory.1",
"dialogue:rich_kid_female.victory.2",
"dialogue:rich_kid_female.victory.3",
"dialogue:rich_kid_female.victory.4",
"dialogue:richKidFemale.victory.1",
"dialogue:richKidFemale.victory.2",
"dialogue:richKidFemale.victory.3",
"dialogue:richKidFemale.victory.4",
],
},
],
[TrainerType.ROCKET_GRUNT]: [
{
encounter: [
"dialogue:rocket_grunt.encounter.1",
"dialogue:rocket_grunt.encounter.2",
"dialogue:rocket_grunt.encounter.3",
"dialogue:rocket_grunt.encounter.4",
"dialogue:rocket_grunt.encounter.5",
"dialogue:rocketGrunt.encounter.1",
"dialogue:rocketGrunt.encounter.2",
"dialogue:rocketGrunt.encounter.3",
"dialogue:rocketGrunt.encounter.4",
"dialogue:rocketGrunt.encounter.5",
],
victory: [
"dialogue:rocket_grunt.victory.1",
"dialogue:rocket_grunt.victory.2",
"dialogue:rocket_grunt.victory.3",
"dialogue:rocket_grunt.victory.4",
"dialogue:rocket_grunt.victory.5",
"dialogue:rocketGrunt.victory.1",
"dialogue:rocketGrunt.victory.2",
"dialogue:rocketGrunt.victory.3",
"dialogue:rocketGrunt.victory.4",
"dialogue:rocketGrunt.victory.5",
],
},
],
@ -465,18 +457,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.MAGMA_GRUNT]: [
{
encounter: [
"dialogue:magma_grunt.encounter.1",
"dialogue:magma_grunt.encounter.2",
"dialogue:magma_grunt.encounter.3",
"dialogue:magma_grunt.encounter.4",
"dialogue:magma_grunt.encounter.5",
"dialogue:magmaGrunt.encounter.1",
"dialogue:magmaGrunt.encounter.2",
"dialogue:magmaGrunt.encounter.3",
"dialogue:magmaGrunt.encounter.4",
"dialogue:magmaGrunt.encounter.5",
],
victory: [
"dialogue:magma_grunt.victory.1",
"dialogue:magma_grunt.victory.2",
"dialogue:magma_grunt.victory.3",
"dialogue:magma_grunt.victory.4",
"dialogue:magma_grunt.victory.5",
"dialogue:magmaGrunt.victory.1",
"dialogue:magmaGrunt.victory.2",
"dialogue:magmaGrunt.victory.3",
"dialogue:magmaGrunt.victory.4",
"dialogue:magmaGrunt.victory.5",
],
},
],
@ -495,18 +487,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.AQUA_GRUNT]: [
{
encounter: [
"dialogue:aqua_grunt.encounter.1",
"dialogue:aqua_grunt.encounter.2",
"dialogue:aqua_grunt.encounter.3",
"dialogue:aqua_grunt.encounter.4",
"dialogue:aqua_grunt.encounter.5",
"dialogue:aquaGrunt.encounter.1",
"dialogue:aquaGrunt.encounter.2",
"dialogue:aquaGrunt.encounter.3",
"dialogue:aquaGrunt.encounter.4",
"dialogue:aquaGrunt.encounter.5",
],
victory: [
"dialogue:aqua_grunt.victory.1",
"dialogue:aqua_grunt.victory.2",
"dialogue:aqua_grunt.victory.3",
"dialogue:aqua_grunt.victory.4",
"dialogue:aqua_grunt.victory.5",
"dialogue:aquaGrunt.victory.1",
"dialogue:aquaGrunt.victory.2",
"dialogue:aquaGrunt.victory.3",
"dialogue:aquaGrunt.victory.4",
"dialogue:aquaGrunt.victory.5",
],
},
],
@ -525,18 +517,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.GALACTIC_GRUNT]: [
{
encounter: [
"dialogue:galactic_grunt.encounter.1",
"dialogue:galactic_grunt.encounter.2",
"dialogue:galactic_grunt.encounter.3",
"dialogue:galactic_grunt.encounter.4",
"dialogue:galactic_grunt.encounter.5",
"dialogue:galacticGrunt.encounter.1",
"dialogue:galacticGrunt.encounter.2",
"dialogue:galacticGrunt.encounter.3",
"dialogue:galacticGrunt.encounter.4",
"dialogue:galacticGrunt.encounter.5",
],
victory: [
"dialogue:galactic_grunt.victory.1",
"dialogue:galactic_grunt.victory.2",
"dialogue:galactic_grunt.victory.3",
"dialogue:galactic_grunt.victory.4",
"dialogue:galactic_grunt.victory.5",
"dialogue:galacticGrunt.victory.1",
"dialogue:galacticGrunt.victory.2",
"dialogue:galacticGrunt.victory.3",
"dialogue:galacticGrunt.victory.4",
"dialogue:galacticGrunt.victory.5",
],
},
],
@ -561,18 +553,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.PLASMA_GRUNT]: [
{
encounter: [
"dialogue:plasma_grunt.encounter.1",
"dialogue:plasma_grunt.encounter.2",
"dialogue:plasma_grunt.encounter.3",
"dialogue:plasma_grunt.encounter.4",
"dialogue:plasma_grunt.encounter.5",
"dialogue:plasmaGrunt.encounter.1",
"dialogue:plasmaGrunt.encounter.2",
"dialogue:plasmaGrunt.encounter.3",
"dialogue:plasmaGrunt.encounter.4",
"dialogue:plasmaGrunt.encounter.5",
],
victory: [
"dialogue:plasma_grunt.victory.1",
"dialogue:plasma_grunt.victory.2",
"dialogue:plasma_grunt.victory.3",
"dialogue:plasma_grunt.victory.4",
"dialogue:plasma_grunt.victory.5",
"dialogue:plasmaGrunt.victory.1",
"dialogue:plasmaGrunt.victory.2",
"dialogue:plasmaGrunt.victory.3",
"dialogue:plasmaGrunt.victory.4",
"dialogue:plasmaGrunt.victory.5",
],
},
],
@ -591,18 +583,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.FLARE_GRUNT]: [
{
encounter: [
"dialogue:flare_grunt.encounter.1",
"dialogue:flare_grunt.encounter.2",
"dialogue:flare_grunt.encounter.3",
"dialogue:flare_grunt.encounter.4",
"dialogue:flare_grunt.encounter.5",
"dialogue:flareGrunt.encounter.1",
"dialogue:flareGrunt.encounter.2",
"dialogue:flareGrunt.encounter.3",
"dialogue:flareGrunt.encounter.4",
"dialogue:flareGrunt.encounter.5",
],
victory: [
"dialogue:flare_grunt.victory.1",
"dialogue:flare_grunt.victory.2",
"dialogue:flare_grunt.victory.3",
"dialogue:flare_grunt.victory.4",
"dialogue:flare_grunt.victory.5",
"dialogue:flareGrunt.victory.1",
"dialogue:flareGrunt.victory.2",
"dialogue:flareGrunt.victory.3",
"dialogue:flareGrunt.victory.4",
"dialogue:flareGrunt.victory.5",
],
},
],
@ -621,18 +613,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.AETHER_GRUNT]: [
{
encounter: [
"dialogue:aether_grunt.encounter.1",
"dialogue:aether_grunt.encounter.2",
"dialogue:aether_grunt.encounter.3",
"dialogue:aether_grunt.encounter.4",
"dialogue:aether_grunt.encounter.5",
"dialogue:aetherGrunt.encounter.1",
"dialogue:aetherGrunt.encounter.2",
"dialogue:aetherGrunt.encounter.3",
"dialogue:aetherGrunt.encounter.4",
"dialogue:aetherGrunt.encounter.5",
],
victory: [
"dialogue:aether_grunt.victory.1",
"dialogue:aether_grunt.victory.2",
"dialogue:aether_grunt.victory.3",
"dialogue:aether_grunt.victory.4",
"dialogue:aether_grunt.victory.5",
"dialogue:aetherGrunt.victory.1",
"dialogue:aetherGrunt.victory.2",
"dialogue:aetherGrunt.victory.3",
"dialogue:aetherGrunt.victory.4",
"dialogue:aetherGrunt.victory.5",
],
},
],
@ -645,18 +637,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.SKULL_GRUNT]: [
{
encounter: [
"dialogue:skull_grunt.encounter.1",
"dialogue:skull_grunt.encounter.2",
"dialogue:skull_grunt.encounter.3",
"dialogue:skull_grunt.encounter.4",
"dialogue:skull_grunt.encounter.5",
"dialogue:skullGrunt.encounter.1",
"dialogue:skullGrunt.encounter.2",
"dialogue:skullGrunt.encounter.3",
"dialogue:skullGrunt.encounter.4",
"dialogue:skullGrunt.encounter.5",
],
victory: [
"dialogue:skull_grunt.victory.1",
"dialogue:skull_grunt.victory.2",
"dialogue:skull_grunt.victory.3",
"dialogue:skull_grunt.victory.4",
"dialogue:skull_grunt.victory.5",
"dialogue:skullGrunt.victory.1",
"dialogue:skullGrunt.victory.2",
"dialogue:skullGrunt.victory.3",
"dialogue:skullGrunt.victory.4",
"dialogue:skullGrunt.victory.5",
],
},
],
@ -669,18 +661,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.MACRO_GRUNT]: [
{
encounter: [
"dialogue:macro_grunt.encounter.1",
"dialogue:macro_grunt.encounter.2",
"dialogue:macro_grunt.encounter.3",
"dialogue:macro_grunt.encounter.4",
"dialogue:macro_grunt.encounter.5",
"dialogue:macroGrunt.encounter.1",
"dialogue:macroGrunt.encounter.2",
"dialogue:macroGrunt.encounter.3",
"dialogue:macroGrunt.encounter.4",
"dialogue:macroGrunt.encounter.5",
],
victory: [
"dialogue:macro_grunt.victory.1",
"dialogue:macro_grunt.victory.2",
"dialogue:macro_grunt.victory.3",
"dialogue:macro_grunt.victory.4",
"dialogue:macro_grunt.victory.5",
"dialogue:macroGrunt.victory.1",
"dialogue:macroGrunt.victory.2",
"dialogue:macroGrunt.victory.3",
"dialogue:macroGrunt.victory.4",
"dialogue:macroGrunt.victory.5",
],
},
],
@ -693,18 +685,18 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
[TrainerType.STAR_GRUNT]: [
{
encounter: [
"dialogue:star_grunt.encounter.1",
"dialogue:star_grunt.encounter.2",
"dialogue:star_grunt.encounter.3",
"dialogue:star_grunt.encounter.4",
"dialogue:star_grunt.encounter.5",
"dialogue:starGrunt.encounter.1",
"dialogue:starGrunt.encounter.2",
"dialogue:starGrunt.encounter.3",
"dialogue:starGrunt.encounter.4",
"dialogue:starGrunt.encounter.5",
],
victory: [
"dialogue:star_grunt.victory.1",
"dialogue:star_grunt.victory.2",
"dialogue:star_grunt.victory.3",
"dialogue:star_grunt.victory.4",
"dialogue:star_grunt.victory.5",
"dialogue:starGrunt.victory.1",
"dialogue:starGrunt.victory.2",
"dialogue:starGrunt.victory.3",
"dialogue:starGrunt.victory.4",
"dialogue:starGrunt.victory.5",
],
},
],
@ -740,207 +732,207 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
],
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: [
{
encounter: ["dialogue:rocket_boss_giovanni_1.encounter.1"],
victory: ["dialogue:rocket_boss_giovanni_1.victory.1"],
defeat: ["dialogue:rocket_boss_giovanni_1.defeat.1"],
encounter: ["dialogue:rocketBossGiovanni1.encounter.1"],
victory: ["dialogue:rocketBossGiovanni1.victory.1"],
defeat: ["dialogue:rocketBossGiovanni1.defeat.1"],
},
],
[TrainerType.ROCKET_BOSS_GIOVANNI_2]: [
{
encounter: ["dialogue:rocket_boss_giovanni_2.encounter.1"],
victory: ["dialogue:rocket_boss_giovanni_2.victory.1"],
defeat: ["dialogue:rocket_boss_giovanni_2.defeat.1"],
encounter: ["dialogue:rocketBossGiovanni2.encounter.1"],
victory: ["dialogue:rocketBossGiovanni2.victory.1"],
defeat: ["dialogue:rocketBossGiovanni2.defeat.1"],
},
],
[TrainerType.MAXIE]: [
{
encounter: ["dialogue:magma_boss_maxie_1.encounter.1"],
victory: ["dialogue:magma_boss_maxie_1.victory.1"],
defeat: ["dialogue:magma_boss_maxie_1.defeat.1"],
encounter: ["dialogue:magmaBossMaxie1.encounter.1"],
victory: ["dialogue:magmaBossMaxie1.victory.1"],
defeat: ["dialogue:magmaBossMaxie1.defeat.1"],
},
],
[TrainerType.MAXIE_2]: [
{
encounter: ["dialogue:magma_boss_maxie_2.encounter.1"],
victory: ["dialogue:magma_boss_maxie_2.victory.1"],
defeat: ["dialogue:magma_boss_maxie_2.defeat.1"],
encounter: ["dialogue:magmaBossMaxie2.encounter.1"],
victory: ["dialogue:magmaBossMaxie2.victory.1"],
defeat: ["dialogue:magmaBossMaxie2.defeat.1"],
},
],
[TrainerType.ARCHIE]: [
{
encounter: ["dialogue:aqua_boss_archie_1.encounter.1"],
victory: ["dialogue:aqua_boss_archie_1.victory.1"],
defeat: ["dialogue:aqua_boss_archie_1.defeat.1"],
encounter: ["dialogue:aquaBossArchie1.encounter.1"],
victory: ["dialogue:aquaBossArchie1.victory.1"],
defeat: ["dialogue:aquaBossArchie1.defeat.1"],
},
],
[TrainerType.ARCHIE_2]: [
{
encounter: ["dialogue:aqua_boss_archie_2.encounter.1"],
victory: ["dialogue:aqua_boss_archie_2.victory.1"],
defeat: ["dialogue:aqua_boss_archie_2.defeat.1"],
encounter: ["dialogue:aquaBossArchie2.encounter.1"],
victory: ["dialogue:aquaBossArchie2.victory.1"],
defeat: ["dialogue:aquaBossArchie2.defeat.1"],
},
],
[TrainerType.CYRUS]: [
{
encounter: ["dialogue:galactic_boss_cyrus_1.encounter.1"],
victory: ["dialogue:galactic_boss_cyrus_1.victory.1"],
defeat: ["dialogue:galactic_boss_cyrus_1.defeat.1"],
encounter: ["dialogue:galacticBossCyrus1.encounter.1"],
victory: ["dialogue:galacticBossCyrus1.victory.1"],
defeat: ["dialogue:galacticBossCyrus1.defeat.1"],
},
],
[TrainerType.CYRUS_2]: [
{
encounter: ["dialogue:galactic_boss_cyrus_2.encounter.1"],
victory: ["dialogue:galactic_boss_cyrus_2.victory.1"],
defeat: ["dialogue:galactic_boss_cyrus_2.defeat.1"],
encounter: ["dialogue:galacticBossCyrus2.encounter.1"],
victory: ["dialogue:galacticBossCyrus2.victory.1"],
defeat: ["dialogue:galacticBossCyrus2.defeat.1"],
},
],
[TrainerType.GHETSIS]: [
{
encounter: ["dialogue:plasma_boss_ghetsis_1.encounter.1"],
victory: ["dialogue:plasma_boss_ghetsis_1.victory.1"],
defeat: ["dialogue:plasma_boss_ghetsis_1.defeat.1"],
encounter: ["dialogue:plasmaBossGhetsis1.encounter.1"],
victory: ["dialogue:plasmaBossGhetsis1.victory.1"],
defeat: ["dialogue:plasmaBossGhetsis1.defeat.1"],
},
],
[TrainerType.GHETSIS_2]: [
{
encounter: ["dialogue:plasma_boss_ghetsis_2.encounter.1"],
victory: ["dialogue:plasma_boss_ghetsis_2.victory.1"],
defeat: ["dialogue:plasma_boss_ghetsis_2.defeat.1"],
encounter: ["dialogue:plasmaBossGhetsis2.encounter.1"],
victory: ["dialogue:plasmaBossGhetsis2.victory.1"],
defeat: ["dialogue:plasmaBossGhetsis2.defeat.1"],
},
],
[TrainerType.LYSANDRE]: [
{
encounter: ["dialogue:flare_boss_lysandre_1.encounter.1"],
victory: ["dialogue:flare_boss_lysandre_1.victory.1"],
defeat: ["dialogue:flare_boss_lysandre_1.defeat.1"],
encounter: ["dialogue:flareBossLysandre1.encounter.1"],
victory: ["dialogue:flareBossLysandre1.victory.1"],
defeat: ["dialogue:flareBossLysandre1.defeat.1"],
},
],
[TrainerType.LYSANDRE_2]: [
{
encounter: ["dialogue:flare_boss_lysandre_2.encounter.1"],
victory: ["dialogue:flare_boss_lysandre_2.victory.1"],
defeat: ["dialogue:flare_boss_lysandre_2.defeat.1"],
encounter: ["dialogue:flareBossLysandre2.encounter.1"],
victory: ["dialogue:flareBossLysandre2.victory.1"],
defeat: ["dialogue:flareBossLysandre2.defeat.1"],
},
],
[TrainerType.LUSAMINE]: [
{
encounter: ["dialogue:aether_boss_lusamine_1.encounter.1"],
victory: ["dialogue:aether_boss_lusamine_1.victory.1"],
defeat: ["dialogue:aether_boss_lusamine_1.defeat.1"],
encounter: ["dialogue:aetherBossLusamine1.encounter.1"],
victory: ["dialogue:aetherBossLusamine1.victory.1"],
defeat: ["dialogue:aetherBossLusamine1.defeat.1"],
},
],
[TrainerType.LUSAMINE_2]: [
{
encounter: ["dialogue:aether_boss_lusamine_2.encounter.1"],
victory: ["dialogue:aether_boss_lusamine_2.victory.1"],
defeat: ["dialogue:aether_boss_lusamine_2.defeat.1"],
encounter: ["dialogue:aetherBossLusamine2.encounter.1"],
victory: ["dialogue:aetherBossLusamine2.victory.1"],
defeat: ["dialogue:aetherBossLusamine2.defeat.1"],
},
],
[TrainerType.GUZMA]: [
{
encounter: ["dialogue:skull_boss_guzma_1.encounter.1"],
victory: ["dialogue:skull_boss_guzma_1.victory.1"],
defeat: ["dialogue:skull_boss_guzma_1.defeat.1"],
encounter: ["dialogue:skullBossGuzma1.encounter.1"],
victory: ["dialogue:skullBossGuzma1.victory.1"],
defeat: ["dialogue:skullBossGuzma1.defeat.1"],
},
],
[TrainerType.GUZMA_2]: [
{
encounter: ["dialogue:skull_boss_guzma_2.encounter.1"],
victory: ["dialogue:skull_boss_guzma_2.victory.1"],
defeat: ["dialogue:skull_boss_guzma_2.defeat.1"],
encounter: ["dialogue:skullBossGuzma2.encounter.1"],
victory: ["dialogue:skullBossGuzma2.victory.1"],
defeat: ["dialogue:skullBossGuzma2.defeat.1"],
},
],
[TrainerType.ROSE]: [
{
encounter: ["dialogue:macro_boss_rose_1.encounter.1"],
victory: ["dialogue:macro_boss_rose_1.victory.1"],
defeat: ["dialogue:macro_boss_rose_1.defeat.1"],
encounter: ["dialogue:macroBossRose1.encounter.1"],
victory: ["dialogue:macroBossRose1.victory.1"],
defeat: ["dialogue:macroBossRose1.defeat.1"],
},
],
[TrainerType.ROSE_2]: [
{
encounter: ["dialogue:macro_boss_rose_2.encounter.1"],
victory: ["dialogue:macro_boss_rose_2.victory.1"],
defeat: ["dialogue:macro_boss_rose_2.defeat.1"],
encounter: ["dialogue:macroBossRose2.encounter.1"],
victory: ["dialogue:macroBossRose2.victory.1"],
defeat: ["dialogue:macroBossRose2.defeat.1"],
},
],
[TrainerType.PENNY]: [
{
encounter: ["dialogue:star_boss_penny_1.encounter.1"],
victory: ["dialogue:star_boss_penny_1.victory.1"],
defeat: ["dialogue:star_boss_penny_1.defeat.1"],
encounter: ["dialogue:starBossPenny1.encounter.1"],
victory: ["dialogue:starBossPenny1.victory.1"],
defeat: ["dialogue:starBossPenny1.defeat.1"],
},
],
[TrainerType.PENNY_2]: [
{
encounter: ["dialogue:star_boss_penny_2.encounter.1"],
victory: ["dialogue:star_boss_penny_2.victory.1"],
defeat: ["dialogue:star_boss_penny_2.defeat.1"],
encounter: ["dialogue:starBossPenny2.encounter.1"],
victory: ["dialogue:starBossPenny2.victory.1"],
defeat: ["dialogue:starBossPenny2.defeat.1"],
},
],
[TrainerType.BUCK]: [
{
encounter: ["dialogue:stat_trainer_buck.encounter.1", "dialogue:stat_trainer_buck.encounter.2"],
victory: ["dialogue:stat_trainer_buck.victory.1", "dialogue:stat_trainer_buck.victory.2"],
defeat: ["dialogue:stat_trainer_buck.defeat.1", "dialogue:stat_trainer_buck.defeat.2"],
encounter: ["dialogue:statTrainerBuck.encounter.1", "dialogue:statTrainerBuck.encounter.2"],
victory: ["dialogue:statTrainerBuck.victory.1", "dialogue:statTrainerBuck.victory.2"],
defeat: ["dialogue:statTrainerBuck.defeat.1", "dialogue:statTrainerBuck.defeat.2"],
},
],
[TrainerType.CHERYL]: [
{
encounter: ["dialogue:stat_trainer_cheryl.encounter.1", "dialogue:stat_trainer_cheryl.encounter.2"],
victory: ["dialogue:stat_trainer_cheryl.victory.1", "dialogue:stat_trainer_cheryl.victory.2"],
defeat: ["dialogue:stat_trainer_cheryl.defeat.1", "dialogue:stat_trainer_cheryl.defeat.2"],
encounter: ["dialogue:statTrainerCheryl.encounter.1", "dialogue:statTrainerCheryl.encounter.2"],
victory: ["dialogue:statTrainerCheryl.victory.1", "dialogue:statTrainerCheryl.victory.2"],
defeat: ["dialogue:statTrainerCheryl.defeat.1", "dialogue:statTrainerCheryl.defeat.2"],
},
],
[TrainerType.MARLEY]: [
{
encounter: ["dialogue:stat_trainer_marley.encounter.1", "dialogue:stat_trainer_marley.encounter.2"],
victory: ["dialogue:stat_trainer_marley.victory.1", "dialogue:stat_trainer_marley.victory.2"],
defeat: ["dialogue:stat_trainer_marley.defeat.1", "dialogue:stat_trainer_marley.defeat.2"],
encounter: ["dialogue:statTrainerMarley.encounter.1", "dialogue:statTrainerMarley.encounter.2"],
victory: ["dialogue:statTrainerMarley.victory.1", "dialogue:statTrainerMarley.victory.2"],
defeat: ["dialogue:statTrainerMarley.defeat.1", "dialogue:statTrainerMarley.defeat.2"],
},
],
[TrainerType.MIRA]: [
{
encounter: ["dialogue:stat_trainer_mira.encounter.1", "dialogue:stat_trainer_mira.encounter.2"],
victory: ["dialogue:stat_trainer_mira.victory.1", "dialogue:stat_trainer_mira.victory.2"],
defeat: ["dialogue:stat_trainer_mira.defeat.1", "dialogue:stat_trainer_mira.defeat.2"],
encounter: ["dialogue:statTrainerMira.encounter.1", "dialogue:statTrainerMira.encounter.2"],
victory: ["dialogue:statTrainerMira.victory.1", "dialogue:statTrainerMira.victory.2"],
defeat: ["dialogue:statTrainerMira.defeat.1", "dialogue:statTrainerMira.defeat.2"],
},
],
[TrainerType.RILEY]: [
{
encounter: ["dialogue:stat_trainer_riley.encounter.1", "dialogue:stat_trainer_riley.encounter.2"],
victory: ["dialogue:stat_trainer_riley.victory.1", "dialogue:stat_trainer_riley.victory.2"],
defeat: ["dialogue:stat_trainer_riley.defeat.1", "dialogue:stat_trainer_riley.defeat.2"],
encounter: ["dialogue:statTrainerRiley.encounter.1", "dialogue:statTrainerRiley.encounter.2"],
victory: ["dialogue:statTrainerRiley.victory.1", "dialogue:statTrainerRiley.victory.2"],
defeat: ["dialogue:statTrainerRiley.defeat.1", "dialogue:statTrainerRiley.defeat.2"],
},
],
[TrainerType.VICTOR]: [
{
encounter: ["dialogue:winstrates_victor.encounter.1"],
victory: ["dialogue:winstrates_victor.victory.1"],
encounter: ["dialogue:winstratesVictor.encounter.1"],
victory: ["dialogue:winstratesVictor.victory.1"],
},
],
[TrainerType.VICTORIA]: [
{
encounter: ["dialogue:winstrates_victoria.encounter.1"],
victory: ["dialogue:winstrates_victoria.victory.1"],
encounter: ["dialogue:winstratesVictoria.encounter.1"],
victory: ["dialogue:winstratesVictoria.victory.1"],
},
],
[TrainerType.VIVI]: [
{
encounter: ["dialogue:winstrates_vivi.encounter.1"],
victory: ["dialogue:winstrates_vivi.victory.1"],
encounter: ["dialogue:winstratesVivi.encounter.1"],
victory: ["dialogue:winstratesVivi.victory.1"],
},
],
[TrainerType.VICKY]: [
{
encounter: ["dialogue:winstrates_vicky.encounter.1"],
victory: ["dialogue:winstrates_vicky.victory.1"],
encounter: ["dialogue:winstratesVicky.encounter.1"],
victory: ["dialogue:winstratesVicky.victory.1"],
},
],
[TrainerType.VITO]: [
{
encounter: ["dialogue:winstrates_vito.encounter.1"],
victory: ["dialogue:winstrates_vito.victory.1"],
encounter: ["dialogue:winstratesVito.encounter.1"],
victory: ["dialogue:winstratesVito.victory.1"],
},
],
[TrainerType.BROCK]: {
@ -954,9 +946,9 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
defeat: ["dialogue:misty.defeat.1", "dialogue:misty.defeat.2", "dialogue:misty.defeat.3"],
},
[TrainerType.LT_SURGE]: {
encounter: ["dialogue:lt_surge.encounter.1", "dialogue:lt_surge.encounter.2", "dialogue:lt_surge.encounter.3"],
victory: ["dialogue:lt_surge.victory.1", "dialogue:lt_surge.victory.2", "dialogue:lt_surge.victory.3"],
defeat: ["dialogue:lt_surge.defeat.1", "dialogue:lt_surge.defeat.2", "dialogue:lt_surge.defeat.3"],
encounter: ["dialogue:ltSurge.encounter.1", "dialogue:ltSurge.encounter.2", "dialogue:ltSurge.encounter.3"],
victory: ["dialogue:ltSurge.victory.1", "dialogue:ltSurge.victory.2", "dialogue:ltSurge.victory.3"],
defeat: ["dialogue:ltSurge.defeat.1", "dialogue:ltSurge.defeat.2", "dialogue:ltSurge.defeat.3"],
},
[TrainerType.ERIKA]: {
encounter: [
@ -1055,12 +1047,12 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
},
[TrainerType.CRASHER_WAKE]: {
encounter: [
"dialogue:crasher_wake.encounter.1",
"dialogue:crasher_wake.encounter.2",
"dialogue:crasher_wake.encounter.3",
"dialogue:crasherWake.encounter.1",
"dialogue:crasherWake.encounter.2",
"dialogue:crasherWake.encounter.3",
],
victory: ["dialogue:crasher_wake.victory.1", "dialogue:crasher_wake.victory.2", "dialogue:crasher_wake.victory.3"],
defeat: ["dialogue:crasher_wake.defeat.1", "dialogue:crasher_wake.defeat.2", "dialogue:crasher_wake.defeat.3"],
victory: ["dialogue:crasherWake.victory.1", "dialogue:crasherWake.victory.2", "dialogue:crasherWake.victory.3"],
defeat: ["dialogue:crasherWake.defeat.1", "dialogue:crasherWake.defeat.2", "dialogue:crasherWake.defeat.3"],
},
[TrainerType.FALKNER]: {
encounter: ["dialogue:falkner.encounter.1", "dialogue:falkner.encounter.2", "dialogue:falkner.encounter.3"],
@ -1354,9 +1346,9 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
defeat: ["dialogue:acerola.defeat.1"],
},
[TrainerType.LARRY_ELITE]: {
encounter: ["dialogue:larry_elite.encounter.1"],
victory: ["dialogue:larry_elite.victory.1"],
defeat: ["dialogue:larry_elite.defeat.1"],
encounter: ["dialogue:larryElite.encounter.1"],
victory: ["dialogue:larryElite.victory.1"],
defeat: ["dialogue:larryElite.defeat.1"],
},
[TrainerType.LANCE]: {
encounter: ["dialogue:lance.encounter.1", "dialogue:lance.encounter.2"],
@ -1414,9 +1406,9 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
defeat: ["dialogue:jasmine.defeat.1"],
},
[TrainerType.LANCE_CHAMPION]: {
encounter: ["dialogue:lance_champion.encounter.1"],
victory: ["dialogue:lance_champion.victory.1"],
defeat: ["dialogue:lance_champion.defeat.1"],
encounter: ["dialogue:lanceChampion.encounter.1"],
victory: ["dialogue:lanceChampion.victory.1"],
defeat: ["dialogue:lanceChampion.defeat.1"],
},
[TrainerType.STEVEN]: {
encounter: ["dialogue:steven.encounter.1"],
@ -1624,29 +1616,29 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
defeat: ["dialogue:grusha.defeat.1"],
},
[TrainerType.MARNIE_ELITE]: {
encounter: ["dialogue:marnie_elite.encounter.1", "dialogue:marnie_elite.encounter.2"],
victory: ["dialogue:marnie_elite.victory.1", "dialogue:marnie_elite.victory.2"],
defeat: ["dialogue:marnie_elite.defeat.1", "dialogue:marnie_elite.defeat.2"],
encounter: ["dialogue:marnieElite.encounter.1", "dialogue:marnieElite.encounter.2"],
victory: ["dialogue:marnieElite.victory.1", "dialogue:marnieElite.victory.2"],
defeat: ["dialogue:marnieElite.defeat.1", "dialogue:marnieElite.defeat.2"],
},
[TrainerType.NESSA_ELITE]: {
encounter: ["dialogue:nessa_elite.encounter.1", "dialogue:nessa_elite.encounter.2"],
victory: ["dialogue:nessa_elite.victory.1", "dialogue:nessa_elite.victory.2"],
defeat: ["dialogue:nessa_elite.defeat.1", "dialogue:nessa_elite.defeat.2"],
encounter: ["dialogue:nessaElite.encounter.1", "dialogue:nessaElite.encounter.2"],
victory: ["dialogue:nessaElite.victory.1", "dialogue:nessaElite.victory.2"],
defeat: ["dialogue:nessaElite.defeat.1", "dialogue:nessaElite.defeat.2"],
},
[TrainerType.BEA_ELITE]: {
encounter: ["dialogue:bea_elite.encounter.1", "dialogue:bea_elite.encounter.2"],
victory: ["dialogue:bea_elite.victory.1", "dialogue:bea_elite.victory.2"],
defeat: ["dialogue:bea_elite.defeat.1", "dialogue:bea_elite.defeat.2"],
encounter: ["dialogue:beaElite.encounter.1", "dialogue:beaElite.encounter.2"],
victory: ["dialogue:beaElite.victory.1", "dialogue:beaElite.victory.2"],
defeat: ["dialogue:beaElite.defeat.1", "dialogue:beaElite.defeat.2"],
},
[TrainerType.ALLISTER_ELITE]: {
encounter: ["dialogue:allister_elite.encounter.1", "dialogue:allister_elite.encounter.2"],
victory: ["dialogue:allister_elite.victory.1", "dialogue:allister_elite.victory.2"],
defeat: ["dialogue:allister_elite.defeat.1", "dialogue:allister_elite.defeat.2"],
encounter: ["dialogue:allisterElite.encounter.1", "dialogue:allisterElite.encounter.2"],
victory: ["dialogue:allisterElite.victory.1", "dialogue:allisterElite.victory.2"],
defeat: ["dialogue:allisterElite.defeat.1", "dialogue:allisterElite.defeat.2"],
},
[TrainerType.RAIHAN_ELITE]: {
encounter: ["dialogue:raihan_elite.encounter.1", "dialogue:raihan_elite.encounter.2"],
victory: ["dialogue:raihan_elite.victory.1", "dialogue:raihan_elite.victory.2"],
defeat: ["dialogue:raihan_elite.defeat.1", "dialogue:raihan_elite.defeat.2"],
encounter: ["dialogue:raihanElite.encounter.1", "dialogue:raihanElite.encounter.2"],
victory: ["dialogue:raihanElite.victory.1", "dialogue:raihanElite.victory.2"],
defeat: ["dialogue:raihanElite.defeat.1", "dialogue:raihanElite.defeat.2"],
},
[TrainerType.ALDER]: {
encounter: ["dialogue:alder.encounter.1"],
@ -1670,56 +1662,56 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
],
[TrainerType.RIVAL_2]: [
{
encounter: ["dialogue:rival_2.encounter.1"],
victory: ["dialogue:rival_2.victory.1"],
encounter: ["dialogue:rival2.encounter.1"],
victory: ["dialogue:rival2.victory.1"],
},
{
encounter: ["dialogue:rival_2_female.encounter.1"],
victory: ["dialogue:rival_2_female.victory.1"],
defeat: ["dialogue:rival_2_female.defeat.1"],
encounter: ["dialogue:rival2Female.encounter.1"],
victory: ["dialogue:rival2Female.victory.1"],
defeat: ["dialogue:rival2Female.defeat.1"],
},
],
[TrainerType.RIVAL_3]: [
{
encounter: ["dialogue:rival_3.encounter.1"],
victory: ["dialogue:rival_3.victory.1"],
encounter: ["dialogue:rival3.encounter.1"],
victory: ["dialogue:rival3.victory.1"],
},
{
encounter: ["dialogue:rival_3_female.encounter.1"],
victory: ["dialogue:rival_3_female.victory.1"],
defeat: ["dialogue:rival_3_female.defeat.1"],
encounter: ["dialogue:rival3Female.encounter.1"],
victory: ["dialogue:rival3Female.victory.1"],
defeat: ["dialogue:rival3Female.defeat.1"],
},
],
[TrainerType.RIVAL_4]: [
{
encounter: ["dialogue:rival_4.encounter.1"],
victory: ["dialogue:rival_4.victory.1"],
encounter: ["dialogue:rival4.encounter.1"],
victory: ["dialogue:rival4.victory.1"],
},
{
encounter: ["dialogue:rival_4_female.encounter.1"],
victory: ["dialogue:rival_4_female.victory.1"],
defeat: ["dialogue:rival_4_female.defeat.1"],
encounter: ["dialogue:rival4Female.encounter.1"],
victory: ["dialogue:rival4Female.victory.1"],
defeat: ["dialogue:rival4Female.defeat.1"],
},
],
[TrainerType.RIVAL_5]: [
{
encounter: ["dialogue:rival_5.encounter.1"],
victory: ["dialogue:rival_5.victory.1"],
encounter: ["dialogue:rival5.encounter.1"],
victory: ["dialogue:rival5.victory.1"],
},
{
encounter: ["dialogue:rival_5_female.encounter.1"],
victory: ["dialogue:rival_5_female.victory.1"],
defeat: ["dialogue:rival_5_female.defeat.1"],
encounter: ["dialogue:rival5Female.encounter.1"],
victory: ["dialogue:rival5Female.victory.1"],
defeat: ["dialogue:rival5Female.defeat.1"],
},
],
[TrainerType.RIVAL_6]: [
{
encounter: ["dialogue:rival_6.encounter.1"],
victory: ["dialogue:rival_6.victory.1"],
encounter: ["dialogue:rival6.encounter.1"],
victory: ["dialogue:rival6.victory.1"],
},
{
encounter: ["dialogue:rival_6_female.encounter.1"],
victory: ["dialogue:rival_6_female.victory.1"],
encounter: ["dialogue:rival6Female.encounter.1"],
victory: ["dialogue:rival6Female.victory.1"],
},
],
};

View File

@ -86,7 +86,7 @@ import { PokemonHealPhase } from "#phases/pokemon-heal-phase";
import { SwitchSummonPhase } from "#phases/switch-summon-phase";
import type { AttackMoveResult } from "#types/attack-move-result";
import type { Localizable } from "#types/locales";
import type { ChargingMove, MoveAttrMap, MoveAttrString, MoveClassMap, MoveKindString } from "#types/move-types";
import type { ChargingMove, MoveAttrMap, MoveAttrString, MoveClassMap, MoveKindString, MoveMessageFunc } from "#types/move-types";
import type { TurnMove } from "#types/turn-move";
import { BooleanHolder, type Constructor, isNullOrUndefined, NumberHolder, randSeedFloat, randSeedInt, randSeedItem, toDmgValue } from "#utils/common";
import { getEnumValues } from "#utils/enums";
@ -1357,20 +1357,20 @@ export class MoveHeaderAttr extends MoveAttr {
/**
* Header attribute to queue a message at the beginning of a turn.
* @see {@link MoveHeaderAttr}
*/
export class MessageHeaderAttr extends MoveHeaderAttr {
private message: string | ((user: Pokemon, move: Move) => string);
/** The message to display, or a function producing one. */
private message: string | MoveMessageFunc;
constructor(message: string | ((user: Pokemon, move: Move) => string)) {
constructor(message: string | MoveMessageFunc) {
super();
this.message = message;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
apply(user: Pokemon, target: Pokemon, move: Move): boolean {
const message = typeof this.message === "string"
? this.message
: this.message(user, move);
: this.message(user, target, move);
if (message) {
globalScene.phaseManager.queueMessage(message);
@ -1418,21 +1418,21 @@ export class BeakBlastHeaderAttr extends AddBattlerTagHeaderAttr {
*/
export class PreMoveMessageAttr extends MoveAttr {
/** The message to display or a function returning one */
private message: string | ((user: Pokemon, target: Pokemon, move: Move) => string | undefined);
private message: string | MoveMessageFunc;
/**
* Create a new {@linkcode PreMoveMessageAttr} to display a message before move execution.
* @param message - The message to display before move use, either as a string or a function producing one.
* @param message - The message to display before move use, either` a literal string or a function producing one.
* @remarks
* If {@linkcode message} evaluates to an empty string (`''`), no message will be displayed
* If {@linkcode message} evaluates to an empty string (`""`), no message will be displayed
* (though the move will still succeed).
*/
constructor(message: string | ((user: Pokemon, target: Pokemon, move: Move) => string)) {
constructor(message: string | MoveMessageFunc) {
super();
this.message = message;
}
apply(user: Pokemon, target: Pokemon, move: Move, _args: any[]): boolean {
apply(user: Pokemon, target: Pokemon, move: Move): boolean {
const message = typeof this.message === "function"
? this.message(user, target, move)
: this.message;
@ -1453,18 +1453,17 @@ export class PreMoveMessageAttr extends MoveAttr {
* @extends MoveAttr
*/
export class PreUseInterruptAttr extends MoveAttr {
protected message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string);
protected overridesFailedMessage: boolean;
protected message: string | MoveMessageFunc;
protected conditionFunc: MoveConditionFunc;
/**
* Create a new MoveInterruptedMessageAttr.
* @param message The message to display when the move is interrupted, or a function that formats the message based on the user, target, and move.
*/
constructor(message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string), conditionFunc?: MoveConditionFunc) {
constructor(message: string | MoveMessageFunc, conditionFunc: MoveConditionFunc) {
super();
this.message = message;
this.conditionFunc = conditionFunc ?? (() => true);
this.conditionFunc = conditionFunc;
}
/**
@ -1485,11 +1484,9 @@ export class PreUseInterruptAttr extends MoveAttr {
*/
override getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined {
if (this.message && this.conditionFunc(user, target, move)) {
const message =
typeof this.message === "string"
? (this.message as string)
return typeof this.message === "string"
? this.message
: this.message(user, target, move);
return message;
}
}
}
@ -1694,17 +1691,30 @@ export class SurviveDamageAttr extends ModifiedDamageAttr {
}
}
export class SplashAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:splash"));
return true;
}
}
/**
* Move attribute to display arbitrary text during a move's execution.
*/
export class MessageAttr extends MoveEffectAttr {
/** The message to display, either as a string or a function returning one. */
private message: string | MoveMessageFunc;
export class CelebrateAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username }));
return true;
constructor(message: string | MoveMessageFunc, options?: MoveEffectAttrOptions) {
// TODO: Do we need to respect `selfTarget` if we're just displaying text?
super(false, options)
this.message = message;
}
override apply(user: Pokemon, target: Pokemon, move: Move): boolean {
const message = typeof this.message === "function"
? this.message(user, target, move)
: this.message;
// TODO: Consider changing if/when MoveAttr `apply` return values become significant
if (message) {
globalScene.phaseManager.queueMessage(message, 500);
return true;
}
return false;
}
}
@ -5931,38 +5941,6 @@ export class ProtectAttr extends AddBattlerTagAttr {
}
}
export class IgnoreAccuracyAttr extends AddBattlerTagAttr {
constructor() {
super(BattlerTagType.IGNORE_ACCURACY, true, false, 2);
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) {
return false;
}
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:tookAimAtTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) }));
return true;
}
}
export class FaintCountdownAttr extends AddBattlerTagAttr {
constructor() {
super(BattlerTagType.PERISH_SONG, false, true, 4);
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) {
return false;
}
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:faintCountdown", { pokemonName: getPokemonNameWithAffix(target), turnCount: this.turnCountMin - 1 }));
return true;
}
}
/**
* Attribute to remove all Substitutes from the field.
* @extends MoveEffectAttr
@ -6603,8 +6581,10 @@ export class ChillyReceptionAttr extends ForceSwitchOutAttr {
return (user, target, move) => globalScene.arena.weather?.weatherType !== WeatherType.SNOW || super.getSwitchOutCondition()(user, target, move);
}
}
export class RemoveTypeAttr extends MoveEffectAttr {
// TODO: Remove the message callback
private removedType: PokemonType;
private messageCallback: ((user: Pokemon) => void) | undefined;
@ -8299,8 +8279,6 @@ const MoveAttrs = Object.freeze({
RandomLevelDamageAttr,
ModifiedDamageAttr,
SurviveDamageAttr,
SplashAttr,
CelebrateAttr,
RecoilAttr,
SacrificialAttr,
SacrificialAttrOnHit,
@ -8443,8 +8421,7 @@ const MoveAttrs = Object.freeze({
RechargeAttr,
TrapAttr,
ProtectAttr,
IgnoreAccuracyAttr,
FaintCountdownAttr,
MessageAttr,
RemoveAllSubstitutesAttr,
HitsTagAttr,
HitsTagForDoubleDamageAttr,
@ -8938,7 +8915,7 @@ export function initMoves() {
new AttackMove(MoveId.PSYWAVE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1)
.attr(RandomLevelDamageAttr),
new SelfStatusMove(MoveId.SPLASH, PokemonType.NORMAL, -1, 40, -1, 0, 1)
.attr(SplashAttr)
.attr(MessageAttr, i18next.t("moveTriggers:splash"))
.condition(failOnGravityCondition),
new SelfStatusMove(MoveId.ACID_ARMOR, PokemonType.POISON, -1, 20, -1, 0, 1)
.attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
@ -9000,7 +8977,10 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1)
.reflectable(),
new StatusMove(MoveId.MIND_READER, PokemonType.NORMAL, -1, 5, -1, 0, 2)
.attr(IgnoreAccuracyAttr),
.attr(AddBattlerTagAttr, BattlerTagType.IGNORE_ACCURACY, true, false, 2)
.attr(MessageAttr, (user, target) =>
i18next.t("moveTriggers:tookAimAtTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })
),
new StatusMove(MoveId.NIGHTMARE, PokemonType.GHOST, 100, 15, -1, 0, 2)
.attr(AddBattlerTagAttr, BattlerTagType.NIGHTMARE)
.condition(targetSleptOrComatoseCondition),
@ -9088,7 +9068,9 @@ export function initMoves() {
return lastTurnMove.length === 0 || lastTurnMove[0].move !== move.id || lastTurnMove[0].result !== MoveResult.SUCCESS;
}),
new StatusMove(MoveId.PERISH_SONG, PokemonType.NORMAL, -1, 5, -1, 0, 2)
.attr(FaintCountdownAttr)
.attr(AddBattlerTagAttr, BattlerTagType.PERISH_SONG, false, true, 4)
.attr(MessageAttr, (_user, target) =>
i18next.t("moveTriggers:faintCountdown", { pokemonName: getPokemonNameWithAffix(target), turnCount: 3 }))
.ignoresProtect()
.soundBased()
.condition(failOnBossCondition)
@ -9104,7 +9086,10 @@ export function initMoves() {
.attr(MultiHitAttr)
.makesContact(false),
new StatusMove(MoveId.LOCK_ON, PokemonType.NORMAL, -1, 5, -1, 0, 2)
.attr(IgnoreAccuracyAttr),
.attr(AddBattlerTagAttr, BattlerTagType.IGNORE_ACCURACY, true, false, 2)
.attr(MessageAttr, (user, target) =>
i18next.t("moveTriggers:tookAimAtTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })
),
new AttackMove(MoveId.OUTRAGE, PokemonType.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2)
.attr(FrenzyAttr)
.attr(MissEffectAttr, frenzyMissFunc)
@ -9331,8 +9316,8 @@ export function initMoves() {
&& (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1)
.attr(BypassBurnDamageReductionAttr),
new AttackMove(MoveId.FOCUS_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3)
.attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) }))
.attr(PreUseInterruptAttr, (user, target, move) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => !!user.turnData.attacksReceived.find(r => r.damage))
.attr(MessageHeaderAttr, (user) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) }))
.attr(PreUseInterruptAttr, (user) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => user.turnData.attacksReceived.some(r => r.damage > 0))
.punchingMove(),
new AttackMove(MoveId.SMELLING_SALTS, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1)
@ -10433,7 +10418,8 @@ export function initMoves() {
new AttackMove(MoveId.DAZZLING_GLEAM, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new SelfStatusMove(MoveId.CELEBRATE, PokemonType.NORMAL, -1, 40, -1, 0, 6)
.attr(CelebrateAttr),
// NB: This needs a lambda function as the user will not be logged in by the time the moves are initialized
.attr(MessageAttr, () => i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username })),
new StatusMove(MoveId.HOLD_HANDS, PokemonType.NORMAL, -1, 40, -1, 0, 6)
.ignoresSubstitute()
.target(MoveTarget.NEAR_ALLY),
@ -10608,7 +10594,12 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.reflectable(),
new SelfStatusMove(MoveId.LASER_FOCUS, PokemonType.NORMAL, -1, 30, -1, 0, 7)
.attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false),
.attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false)
.attr(MessageAttr, (user) =>
i18next.t("battlerTags:laserFocusOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(user),
}),
),
new StatusMove(MoveId.GEAR_UP, PokemonType.STEEL, -1, 20, -1, 0, 7)
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => !![ AbilityId.PLUS, AbilityId.MINUS ].find(a => target.hasAbility(a, false)) })
.ignoresSubstitute()

View File

@ -17,6 +17,7 @@ import { addWindow, WindowVariant } from "#ui/ui-theme";
import { fixedInt, isLocal, sessionIdKey } from "#utils/common";
import { getCookie } from "#utils/cookies";
import { getEnumValues } from "#utils/enums";
import { toCamelCase } from "#utils/strings";
import { isBeta } from "#utils/utility-vars";
import i18next from "i18next";
@ -138,7 +139,7 @@ export class MenuUiHandler extends MessageUiHandler {
this.optionSelectText = addTextObject(
0,
0,
this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"),
this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${toCamelCase(MenuOptions[o])}`)}`).join("\n"),
TextStyle.WINDOW,
{ maxLines: this.menuOptions.length },
);

View File

@ -2612,7 +2612,7 @@ export class PokedexPageUiHandler extends MessageUiHandler {
// Setting growth rate text
if (isFormCaught) {
let growthReadable = toTitleCase(GrowthRate[species.growthRate]);
const growthAux = growthReadable.replace(" ", "_");
const growthAux = toCamelCase(growthReadable);
if (i18next.exists("growth:" + growthAux)) {
growthReadable = i18next.t(("growth:" + growthAux) as any);
}

View File

@ -72,7 +72,7 @@ import {
import type { StarterPreferences } from "#utils/data";
import { loadStarterPreferences, saveStarterPreferences } from "#utils/data";
import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils";
import { toTitleCase } from "#utils/strings";
import { toCamelCase, toTitleCase } from "#utils/strings";
import { argbFromRgba } from "@material/material-color-utilities";
import i18next from "i18next";
import type { GameObjects } from "phaser";
@ -2263,7 +2263,7 @@ export class StarterSelectUiHandler extends MessageUiHandler {
});
};
options.push({
label: i18next.t("menuUiHandler:POKEDEX"),
label: i18next.t("menuUiHandler:pokedex"),
handler: () => {
ui.setMode(UiMode.STARTER_SELECT).then(() => {
const attributes = {
@ -3464,7 +3464,7 @@ export class StarterSelectUiHandler extends MessageUiHandler {
//Growth translate
let growthReadable = toTitleCase(GrowthRate[species.growthRate]);
const growthAux = growthReadable.replace(" ", "_");
const growthAux = toCamelCase(growthReadable);
if (i18next.exists("growth:" + growthAux)) {
growthReadable = i18next.t(("growth:" + growthAux) as any);
}

View File

@ -1,4 +1,3 @@
import { globalScene } from "#app/global-scene";
import { Status } from "#data/status-effect";
import { AbilityId } from "#enums/ability-id";
import { BattleType } from "#enums/battle-type";
@ -179,18 +178,13 @@ describe("Moves - Whirlwind", () => {
const eligibleEnemy = enemyParty.filter(p => p.hp > 0 && p.isAllowedInBattle());
expect(eligibleEnemy.length).toBe(1);
// Spy on the queueMessage function
const queueSpy = vi.spyOn(globalScene.phaseManager, "queueMessage");
// Player uses Whirlwind; opponent uses Splash
game.move.select(MoveId.WHIRLWIND);
await game.move.selectEnemyMove(MoveId.SPLASH);
await game.toNextTurn();
// Verify that the failure message is displayed for Whirlwind
expect(queueSpy).toHaveBeenCalledWith(expect.stringContaining("But it failed"));
// Verify the opponent's Splash message
expect(queueSpy).toHaveBeenCalledWith(expect.stringContaining("But nothing happened!"));
const player = game.field.getPlayerPokemon();
expect(player).toHaveUsedMove({ move: MoveId.WHIRLWIND, result: MoveResult.FAIL });
});
it("should not pull in the other trainer's pokemon in a partner trainer battle", async () => {