Merge branch 'beta' into egg-move-scripts

This commit is contained in:
Bertie690 2025-08-17 22:46:07 -04:00 committed by GitHub
commit b55c2433bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
93 changed files with 1161 additions and 887 deletions

View File

@ -0,0 +1,61 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
{
"name": "Node.js & TypeScript",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {
"installDirectlyFromGitHubRelease": true,
"version": "latest"
},
"ghcr.io/devcontainers-extra/features/pnpm:2": {
"version": "latest"
}
},
"customizations": {
"vscode": {
"settings": {
// # Formatter configs
"editor.defaultFormatter": "biomejs.biome",
"editor.tabSize": 2,
"editor.insertSpaces": true,
"editor.codeActionsOnSave": {
"source.addMissingImports.ts": "always",
"source.removeUnusedImports": "always",
"source.fixAll.biome": "always",
"source.organizeImports.biome": "always"
},
"biome.suggestInstallingGlobally": false,
// # JS/TS setting overrides
"javascript.preferences.importModuleSpecifier": "non-relative",
"javascript.preferences.importModuleSpecifierEnding": "index",
"javascript.preferGoToSourceDefinition": true,
"javascript.updateImportsOnFileMove.enabled": "always",
"typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.preferences.importModuleSpecifierEnding": "index",
"typescript.preferGoToSourceDefinition": true,
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
// # Miscellaneous
"npm.packageManager": "pnpm",
"npm.scriptRunner": "pnpm",
"vitest.cliArguments": "--no-isolate"
},
"extensions": [
"biomejs.biome",
"YoavBls.pretty-ts-errors",
"vitest.explorer",
"adpyke.codesnap", // Bind to a hotkey (ctrl+\, etc) for best results
"aaron-bond.better-comments",
"MuTsunTsai.jsdoc-link"
]
}
},
"postCreateCommand": "pnpm install",
"forwardPorts": [8000]
}

5
.gitignore vendored
View File

@ -12,9 +12,10 @@ dist
dist-ssr dist-ssr
*.local *.local
# Editor directories and files # Editor directories and files (excluding `extensions.json` for devcontainer)
.vscode
*.code-workspace *.code-workspace
.vscode/*
!.vscode/extensions.json
.idea .idea
.DS_Store .DS_Store
*.suo *.suo

View File

@ -26,3 +26,4 @@ ignore:
- .git - .git
- public - public
- dist - dist
- .devcontainer

13
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"recommendations": [
"biomejs.biome",
"YoavBls.pretty-ts-errors",
"vitest.explorer",
// This stuff isn't mandatory - it's just nice to have :)
"adpyke.codesnap", // Bind to a hotkey (ctrl+\, etc) for best results
"aaron-bond.better-comments",
"MuTsunTsai.jsdoc-link"
]
}

View File

@ -18,17 +18,34 @@ We are here to help and the better you understand what you're working on, the ea
PokéRogue is built with [Typescript](https://www.typescriptlang.org/docs/handbook/intro.html), using the [Phaser](https://github.com/phaserjs/phaser) game framework. PokéRogue is built with [Typescript](https://www.typescriptlang.org/docs/handbook/intro.html), using the [Phaser](https://github.com/phaserjs/phaser) game framework.
If you have the motivation and experience with Typescript/Javascript (or are willing to learn) you can contribute by forking the repository and making pull requests with contributions. If you have the motivation and experience with Typescript/Javascript (or are willing to learn), you can contribute by forking the repository and making pull requests with contributions.
## 💻 Environment Setup ## 💻 Environment Setup
### Prerequisites ### Codespaces/Devcontainer Environment
- node: >=22.14.0 - [manage with pnpm](https://pnpm.io/cli/env) | [manage with fnm](https://github.com/Schniz/fnm) | [manage with nvm](https://github.com/nvm-sh/nvm) Arguably the easiest way to get started is by using the prepared development environment.
We have a `.devcontainer/devcontainer.json` file, meaning we are compatible with:
- [![Open in GitHub Codespaces][codespaces-badge]][codespaces-link], or
- the [Visual Studio Code Remote - Containers][devcontainer-ext] extension.
This Linux environment comes with all required dependencies needed to start working on the project.
[codespaces-badge]: <https://github.com/codespaces/badge.svg>
[codespaces-link]: <https://github.com/codespaces/new?hide_repo_select=true&repo=620476224&ref=beta>
[devcontainer-ext]: <https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers>
### Local Development
#### Prerequisites
- node: >=22.14.0 - [manage with pnpm](https://pnpm.io/cli/env) | [manage with fnm](https://github.com/Schniz/fnm) | [manage with nvm](https://github.com/nvm-sh/nvm) | [manage with volta.sh](https://volta.sh/)
- pnpm: 10.x - [how to install](https://pnpm.io/installation) (not recommended to install via `npm` on Windows native) | [alternate method - volta.sh](https://volta.sh/) - pnpm: 10.x - [how to install](https://pnpm.io/installation) (not recommended to install via `npm` on Windows native) | [alternate method - volta.sh](https://volta.sh/)
- The repository [forked](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) and [cloned](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) locally on your device - The repository [forked](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) and [cloned](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) locally on your device
### Running Locally #### Running Locally
1. Run `pnpm install` from the repository root 1. Run `pnpm install` from the repository root
- *if you run into any errors, reach out in the **#dev-corner** channel on Discord* - *if you run into any errors, reach out in the **#dev-corner** channel on Discord*
@ -50,7 +67,7 @@ Most issues are bugs and are labeled with their area, such as `Move`, `Ability`,
- `P2`: Minor - Incorrect (but non-crashing) move/ability/interaction - `P2`: Minor - Incorrect (but non-crashing) move/ability/interaction
- `P3`: No gameplay impact - typo, minor graphical error, etc. - `P3`: No gameplay impact - typo, minor graphical error, etc.
Also under issues, you can take a look at the [List of Partial / Unimplemented Moves and Abilities](https://github.com/pagefaultgames/pokerogue/issues/3503) and the [Bug Board](https://github.com/orgs/pagefaultgames/projects/3) (the latter is essentially the same as the issues page but easier to work with). Also under issues, you can take a look at the [List of Partial / Unimplemented Moves and Abilities](https://github.com/pagefaultgames/pokerogue/issues/3503) and the [Bug Board](https://github.com/orgs/pagefaultgames/projects/3). The latter is essentially the same as the issues page, so take your pick.
You are free to comment on any issue so that you may be assigned to it and we can avoid multiple people working on the same thing. You are free to comment on any issue so that you may be assigned to it and we can avoid multiple people working on the same thing.
@ -58,7 +75,7 @@ You are free to comment on any issue so that you may be assigned to it and we ca
You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html). You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html).
Additionally, the [docs folder](./docs) contains a variety of in-depth documents and guides useful for aspiring contributors. Additionally, the [docs folder](./docs) contains a variety of in-depth documents and guides useful for aspiring contributors. \
Notable topics include: Notable topics include:
- [Commenting your code](./docs/comments.md) - [Commenting your code](./docs/comments.md)
- [Linting & Formatting](./docs/linting.md) - [Linting & Formatting](./docs/linting.md)

View File

@ -37,7 +37,6 @@
"!**/src/data/balance/tms.ts" "!**/src/data/balance/tms.ts"
] ]
}, },
"assist": { "assist": {
"actions": { "actions": {
"source": { "source": {

View File

@ -17,8 +17,6 @@
"eggMoves:parse": "node scripts/parse-egg-moves/main.js", "eggMoves:parse": "node scripts/parse-egg-moves/main.js",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"typecheck:scripts": "tsc -p scripts/jsconfig.json", "typecheck:scripts": "tsc -p scripts/jsconfig.json",
"eslint": "eslint --fix .",
"eslint-ci": "eslint .",
"biome": "biome check --write --changed --no-errors-on-unmatched --diagnostic-level=error", "biome": "biome check --write --changed --no-errors-on-unmatched --diagnostic-level=error",
"biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched", "biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched",
"docs": "typedoc", "docs": "typedoc",

View File

@ -0,0 +1,146 @@
{
"textures": [
{
"image": "party_slot_main_short.png",
"format": "RGBA8888",
"size": {
"w": 110,
"h": 294
},
"scale": 1,
"frames": [
{
"filename": "party_slot_main_short",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
}
},
{
"filename": "party_slot_main_short_sel",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 41,
"w": 110,
"h": 41
}
},
{
"filename": "party_slot_main_short_fnt",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 82,
"w": 110,
"h": 41
}
},
{
"filename": "party_slot_main_short_fnt_sel",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 123,
"w": 110,
"h": 41
}
},
{
"filename": "party_slot_main_short_swap",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 164,
"w": 110,
"h": 41
}
},
{
"filename": "party_slot_main_short_swap_sel",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 110,
"h": 41
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 110,
"h": 41
},
"frame": {
"x": 0,
"y": 205,
"w": 110,
"h": 41
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:29685f2f538901cf5bf7f0ed2ea867c3:a080ea6c8cccd1e03244214053e79796:565f7afc5ca419b6ba8dbce51ea30818$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 B

@ -1 +1 @@
Subproject commit 1ea8f865e30d1940caa0fceeabf37ae2e4689471 Subproject commit 17b353bd5752b7ce5c9e7051a17ec310e0b99c1e

View File

@ -1184,7 +1184,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr {
return i18next.t("abilityTriggers:postDefendTypeChange", { return i18next.t("abilityTriggers:postDefendTypeChange", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
abilityName, abilityName,
typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`), typeName: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.type])}`),
}); });
} }
} }
@ -1749,7 +1749,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr {
getTriggerMessage({ pokemon }: AugmentMoveInteractionAbAttrParams, _abilityName: string): string { getTriggerMessage({ pokemon }: AugmentMoveInteractionAbAttrParams, _abilityName: string): string {
return i18next.t("abilityTriggers:pokemonTypeChange", { return i18next.t("abilityTriggers:pokemonTypeChange", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), moveType: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.moveType])}`),
}); });
} }
} }
@ -6222,7 +6222,9 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr {
if (currentTerrain === TerrainType.NONE) { if (currentTerrain === TerrainType.NONE) {
return i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix }); return i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix });
} }
const moveType = i18next.t(`pokemonInfo:Type.${PokemonType[this.determineTypeChange(pokemon, currentTerrain)[0]]}`); const moveType = i18next.t(
`pokemonInfo:type.${toCamelCase(PokemonType[this.determineTypeChange(pokemon, currentTerrain)[0]])}`,
);
return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix, moveType }); return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix, moveType });
} }
} }

View File

@ -7,6 +7,7 @@ import { TimeOfDay } from "#enums/time-of-day";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import { randSeedInt } from "#utils/common"; import { randSeedInt } from "#utils/common";
import { getEnumValues } from "#utils/enums"; import { getEnumValues } from "#utils/enums";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
export function getBiomeName(biome: BiomeId | -1) { export function getBiomeName(biome: BiomeId | -1) {
@ -15,13 +16,13 @@ export function getBiomeName(biome: BiomeId | -1) {
} }
switch (biome) { switch (biome) {
case BiomeId.GRASS: case BiomeId.GRASS:
return i18next.t("biome:GRASS"); return i18next.t("biome:grass");
case BiomeId.RUINS: case BiomeId.RUINS:
return i18next.t("biome:RUINS"); return i18next.t("biome:ruins");
case BiomeId.END: case BiomeId.END:
return i18next.t("biome:END"); return i18next.t("biome:end");
default: default:
return i18next.t(`biome:${BiomeId[biome].toUpperCase()}`); return i18next.t(`biome:${toCamelCase(BiomeId[biome])}`);
} }
} }

View File

@ -15,6 +15,7 @@ import type { Pokemon } from "#field/pokemon";
import type { SpeciesStatBoosterItem, SpeciesStatBoosterModifierType } from "#modifiers/modifier-type"; import type { SpeciesStatBoosterItem, SpeciesStatBoosterModifierType } from "#modifiers/modifier-type";
import { coerceArray, isNullOrUndefined, randSeedInt } from "#utils/common"; import { coerceArray, isNullOrUndefined, randSeedInt } from "#utils/common";
import { getPokemonSpecies } from "#utils/pokemon-utils"; import { getPokemonSpecies } from "#utils/pokemon-utils";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
export enum SpeciesWildEvolutionDelay { export enum SpeciesWildEvolutionDelay {
@ -133,11 +134,11 @@ export class SpeciesEvolutionCondition {
case EvoCondKey.FRIENDSHIP: case EvoCondKey.FRIENDSHIP:
return i18next.t("pokemonEvolutions:friendship"); return i18next.t("pokemonEvolutions:friendship");
case EvoCondKey.TIME: case EvoCondKey.TIME:
return i18next.t(`pokemonEvolutions:timeOfDay.${TimeOfDay[cond.time[cond.time.length - 1]]}`); // For Day and Night evos, the key we want goes last return i18next.t(`pokemonEvolutions:timeOfDay.${toCamelCase(TimeOfDay[cond.time[cond.time.length - 1]])}`); // For Day and Night evos, the key we want goes last
case EvoCondKey.MOVE_TYPE: case EvoCondKey.MOVE_TYPE:
return i18next.t("pokemonEvolutions:moveType", {type: i18next.t(`pokemonInfo:Type.${PokemonType[cond.pkmnType]}`)}); return i18next.t("pokemonEvolutions:moveType", {type: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[cond.pkmnType])}`)});
case EvoCondKey.PARTY_TYPE: case EvoCondKey.PARTY_TYPE:
return i18next.t("pokemonEvolutions:partyType", {type: i18next.t(`pokemonInfo:Type.${PokemonType[cond.pkmnType]}`)}); return i18next.t("pokemonEvolutions:partyType", {type: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[cond.pkmnType])}`)});
case EvoCondKey.GENDER: case EvoCondKey.GENDER:
return i18next.t("pokemonEvolutions:gender", {gender: getGenderSymbol(cond.gender)}); return i18next.t("pokemonEvolutions:gender", {gender: getGenderSymbol(cond.gender)});
case EvoCondKey.MOVE: case EvoCondKey.MOVE:
@ -156,7 +157,7 @@ export class SpeciesEvolutionCondition {
case EvoCondKey.SPECIES_CAUGHT: case EvoCondKey.SPECIES_CAUGHT:
return i18next.t("pokemonEvolutions:caught", {species: getPokemonSpecies(cond.speciesCaught).name}); return i18next.t("pokemonEvolutions:caught", {species: getPokemonSpecies(cond.speciesCaught).name});
case EvoCondKey.HELD_ITEM: case EvoCondKey.HELD_ITEM:
return i18next.t(`pokemonEvolutions:heldItem.${cond.itemKey}`); return i18next.t(`pokemonEvolutions:heldItem.${toCamelCase(cond.itemKey)}`);
} }
}).filter(s => !isNullOrUndefined(s)); // Filter out stringless conditions }).filter(s => !isNullOrUndefined(s)); // Filter out stringless conditions
return this.desc; return this.desc;
@ -245,7 +246,7 @@ export class SpeciesFormEvolution {
} }
if (this.item) { if (this.item) {
const itemDescription = i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.item].toUpperCase()}`); const itemDescription = i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.item].toUpperCase()}`);
const rarity = this.item > 50 ? i18next.t("pokemonEvolutions:ULTRA") : i18next.t("pokemonEvolutions:GREAT"); const rarity = this.item > 50 ? i18next.t("pokemonEvolutions:ultra") : i18next.t("pokemonEvolutions:great");
strings.push(i18next.t("pokemonEvolutions:using", {item: itemDescription, tier: rarity})); strings.push(i18next.t("pokemonEvolutions:using", {item: itemDescription, tier: rarity}));
} }
if (this.condition) { if (this.condition) {

View File

@ -1505,9 +1505,9 @@ export function initSpecies() {
new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true),
new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360) new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360)
), ),
new PokemonSpecies(SpeciesId.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, new PokemonSpecies(SpeciesId.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 45, 0, 345, GrowthRate.SLOW, null, false, true,
new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 45, 0, 345, false, null, true),
new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345) new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 1125, 255, 115, 250, 125, 250, 130, 45, 0, 345)
), ),
new PokemonSpecies(SpeciesId.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), new PokemonSpecies(SpeciesId.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false),
new PokemonSpecies(SpeciesId.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, new PokemonSpecies(SpeciesId.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true,

View File

@ -50,6 +50,7 @@ import type {
} from "#types/battler-tags"; } from "#types/battler-tags";
import type { Mutable } from "#types/type-helpers"; import type { Mutable } from "#types/type-helpers";
import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common";
import { toCamelCase } from "#utils/strings";
/** /**
* @module * @module
@ -2305,7 +2306,7 @@ export class TypeBoostTag extends SerializableBattlerTag {
globalScene.phaseManager.queueMessage( globalScene.phaseManager.queueMessage(
i18next.t("abilityTriggers:typeImmunityPowerBoost", { i18next.t("abilityTriggers:typeImmunityPowerBoost", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.boostedType]}`), typeName: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.boostedType])}`),
}), }),
); );
} }

View File

@ -11,11 +11,11 @@ import { NumberHolder, randSeedInt, toDmgValue } from "#utils/common";
import i18next from "i18next"; import i18next from "i18next";
export function getBerryName(berryType: BerryType): string { export function getBerryName(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.name`); return i18next.t(`berry:${BerryType[berryType].toLowerCase()}.name`);
} }
export function getBerryEffectDescription(berryType: BerryType): string { export function getBerryEffectDescription(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.effect`); return i18next.t(`berry:${BerryType[berryType].toLowerCase()}.effect`);
} }
export type BerryPredicate = (pokemon: Pokemon) => boolean; export type BerryPredicate = (pokemon: Pokemon) => boolean;

View File

@ -756,7 +756,7 @@ export class SingleTypeChallenge extends Challenge {
} }
getDescription(overrideValue: number = this.value): string { getDescription(overrideValue: number = this.value): string {
const type = i18next.t(`pokemonInfo:Type.${PokemonType[overrideValue - 1]}`); const type = i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[overrideValue - 1])}`);
const typeColor = `[color=${TypeColor[PokemonType[overrideValue - 1]]}][shadow=${TypeShadow[PokemonType[this.value - 1]]}]${type}[/shadow][/color]`; const typeColor = `[color=${TypeColor[PokemonType[overrideValue - 1]]}][shadow=${TypeShadow[PokemonType[this.value - 1]]}]${type}[/shadow][/color]`;
const defaultDesc = i18next.t("challenges:singleType.desc_default"); const defaultDesc = i18next.t("challenges:singleType.desc_default");
const typeDesc = i18next.t("challenges:singleType.desc", { const typeDesc = i18next.t("challenges:singleType.desc", {

File diff suppressed because it is too large Load Diff

View File

@ -2,43 +2,43 @@
// that caused this to be moved out in the first place // that caused this to be moved out in the first place
export const doubleBattleDialogue = { export const doubleBattleDialogue = {
blue_red_double: { blue_red_double: {
encounter: ["doubleBattleDialogue:blue_red_double.encounter.1"], encounter: ["doubleBattleDialogue:blueRedDouble.encounter.1"],
victory: ["doubleBattleDialogue:blue_red_double.victory.1"], victory: ["doubleBattleDialogue:blueRedDouble.victory.1"],
}, },
red_blue_double: { red_blue_double: {
encounter: ["doubleBattleDialogue:red_blue_double.encounter.1"], encounter: ["doubleBattleDialogue:redBlueDouble.encounter.1"],
victory: ["doubleBattleDialogue:red_blue_double.victory.1"], victory: ["doubleBattleDialogue:redBlueDouble.victory.1"],
}, },
tate_liza_double: { tate_liza_double: {
encounter: ["doubleBattleDialogue:tate_liza_double.encounter.1"], encounter: ["doubleBattleDialogue:tateLizaDouble.encounter.1"],
victory: ["doubleBattleDialogue:tate_liza_double.victory.1"], victory: ["doubleBattleDialogue:tateLizaDouble.victory.1"],
}, },
liza_tate_double: { liza_tate_double: {
encounter: ["doubleBattleDialogue:liza_tate_double.encounter.1"], encounter: ["doubleBattleDialogue:lizaTateDouble.encounter.1"],
victory: ["doubleBattleDialogue:liza_tate_double.victory.1"], victory: ["doubleBattleDialogue:lizaTateDouble.victory.1"],
}, },
wallace_steven_double: { wallace_steven_double: {
encounter: ["doubleBattleDialogue:wallace_steven_double.encounter.1"], encounter: ["doubleBattleDialogue:wallaceStevenDouble.encounter.1"],
victory: ["doubleBattleDialogue:wallace_steven_double.victory.1"], victory: ["doubleBattleDialogue:wallaceStevenDouble.victory.1"],
}, },
steven_wallace_double: { steven_wallace_double: {
encounter: ["doubleBattleDialogue:steven_wallace_double.encounter.1"], encounter: ["doubleBattleDialogue:stevenWallaceDouble.encounter.1"],
victory: ["doubleBattleDialogue:steven_wallace_double.victory.1"], victory: ["doubleBattleDialogue:stevenWallaceDouble.victory.1"],
}, },
alder_iris_double: { alder_iris_double: {
encounter: ["doubleBattleDialogue:alder_iris_double.encounter.1"], encounter: ["doubleBattleDialogue:alderIrisDouble.encounter.1"],
victory: ["doubleBattleDialogue:alder_iris_double.victory.1"], victory: ["doubleBattleDialogue:alderIrisDouble.victory.1"],
}, },
iris_alder_double: { iris_alder_double: {
encounter: ["doubleBattleDialogue:iris_alder_double.encounter.1"], encounter: ["doubleBattleDialogue:irisAlderDouble.encounter.1"],
victory: ["doubleBattleDialogue:iris_alder_double.victory.1"], victory: ["doubleBattleDialogue:irisAlderDouble.victory.1"],
}, },
marnie_piers_double: { marnie_piers_double: {
encounter: ["doubleBattleDialogue:marnie_piers_double.encounter.1"], encounter: ["doubleBattleDialogue:marniePiersDouble.encounter.1"],
victory: ["doubleBattleDialogue:marnie_piers_double.victory.1"], victory: ["doubleBattleDialogue:marniePiersDouble.victory.1"],
}, },
piers_marnie_double: { piers_marnie_double: {
encounter: ["doubleBattleDialogue:piers_marnie_double.encounter.1"], encounter: ["doubleBattleDialogue:piersMarnieDouble.encounter.1"],
victory: ["doubleBattleDialogue:piers_marnie_double.victory.1"], victory: ["doubleBattleDialogue:piersMarnieDouble.victory.1"],
}, },
}; };

View File

@ -6675,7 +6675,7 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr {
user.summonData.types = [ typeChange ]; user.summonData.types = [ typeChange ];
user.updateInfo(); user.updateInfo();
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[typeChange]}`) })); globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[typeChange])}`) }));
return true; return true;
} }
@ -6803,7 +6803,7 @@ export class AddTypeAttr extends MoveEffectAttr {
target.summonData.addedType = this.type; target.summonData.addedType = this.type;
target.updateInfo(); target.updateInfo();
globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.type])}`), pokemonName: getPokemonNameWithAffix(target) }));
return true; return true;
} }
@ -6825,7 +6825,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr {
const firstMoveType = target.getMoveset()[0].getMove().type; const firstMoveType = target.getMoveset()[0].getMove().type;
user.summonData.types = [ firstMoveType ]; user.summonData.types = [ firstMoveType ];
globalScene.phaseManager.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${PokemonType[firstMoveType]}`) })); globalScene.phaseManager.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[firstMoveType])}`) }));
return true; return true;
} }
@ -8512,7 +8512,7 @@ export function initMoves() {
.punchingMove(), .punchingMove(),
new AttackMove(MoveId.SCRATCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(MoveId.SCRATCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
new AttackMove(MoveId.VISE_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1), new AttackMove(MoveId.VISE_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1),
new AttackMove(MoveId.GUILLOTINE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) new AttackMove(MoveId.GUILLOTINE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 250, 30, 5, -1, 0, 1)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(OneHitKOAccuracyAttr), .attr(OneHitKOAccuracyAttr),
new ChargingAttackMove(MoveId.RAZOR_WIND, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) new ChargingAttackMove(MoveId.RAZOR_WIND, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1)
@ -8565,7 +8565,7 @@ export function initMoves() {
new AttackMove(MoveId.HORN_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), new AttackMove(MoveId.HORN_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1),
new AttackMove(MoveId.FURY_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) new AttackMove(MoveId.FURY_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1)
.attr(MultiHitAttr), .attr(MultiHitAttr),
new AttackMove(MoveId.HORN_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) new AttackMove(MoveId.HORN_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 250, 30, 5, -1, 0, 1)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(OneHitKOAccuracyAttr), .attr(OneHitKOAccuracyAttr),
new AttackMove(MoveId.TACKLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), new AttackMove(MoveId.TACKLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
@ -8746,7 +8746,7 @@ export function initMoves() {
.attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1)
.makesContact(false) .makesContact(false)
.target(MoveTarget.ALL_NEAR_OTHERS), .target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(MoveId.FISSURE, PokemonType.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) new AttackMove(MoveId.FISSURE, PokemonType.GROUND, MoveCategory.PHYSICAL, 250, 30, 5, -1, 0, 1)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(OneHitKOAccuracyAttr) .attr(OneHitKOAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.UNDERGROUND) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND)
@ -9528,7 +9528,7 @@ export function initMoves() {
new AttackMove(MoveId.SAND_TOMB, PokemonType.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) new AttackMove(MoveId.SAND_TOMB, PokemonType.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3)
.attr(TrapAttr, BattlerTagType.SAND_TOMB) .attr(TrapAttr, BattlerTagType.SAND_TOMB)
.makesContact(false), .makesContact(false),
new AttackMove(MoveId.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 200, 30, 5, -1, 0, 3) new AttackMove(MoveId.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 250, 30, 5, -1, 0, 3)
.attr(IceNoEffectTypeAttr) .attr(IceNoEffectTypeAttr)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(SheerColdAccuracyAttr), .attr(SheerColdAccuracyAttr),

View File

@ -82,7 +82,7 @@ export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder.
encounter.dialogue.intro = [ encounter.dialogue.intro = [
{ {
speaker: `trainerNames:${trainerNameKey}`, speaker: `trainerNames:${trainerNameKey}`,
text: `${namespace}:${trainerNameKey}.intro_dialogue`, text: `${namespace}:${trainerNameKey}.introDialogue`,
}, },
]; ];
encounter.options[0].dialogue!.selected = [ encounter.options[0].dialogue!.selected = [

View File

@ -237,7 +237,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
modifierConfigs: bossModifierConfigs, modifierConfigs: bossModifierConfigs,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:option.1.boss_enraged`); queueEncounterMessage(`${namespace}:option.1.bossEnraged`);
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
"StatStageChangePhase", "StatStageChangePhase",
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
@ -300,7 +300,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
globalScene.addModifier(seedModifier, false, false, false, true); globalScene.addModifier(seedModifier, false, false, false, true);
} }
}); });
queueEncounterMessage(`${namespace}:option.1.food_stash`); queueEncounterMessage(`${namespace}:option.1.foodStash`);
}; };
setEncounterRewards({ fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); setEncounterRewards({ fillRemaining: true }, undefined, givePartyPokemonReviverSeeds);

View File

@ -71,7 +71,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterB
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])
@ -152,7 +152,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterB
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.2.tooltipDisabled`,
selected: [ selected: [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,

View File

@ -254,7 +254,7 @@ export const BerriesAboundEncounter: MysteryEncounter = MysteryEncounterBuilder.
undefined, undefined,
doBerryRewards, doBerryRewards,
); );
await showEncounterText(`${namespace}:option.2.selected_bad`); await showEncounterText(`${namespace}:option.2.selectedBad`);
await initBattleWithEnemyConfig(config); await initBattleWithEnemyConfig(config);
return; return;
} }

View File

@ -198,7 +198,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.withOnInit(() => { .withOnInit(() => {
@ -312,7 +312,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
}) })
.withPreOptionPhase(async () => { .withPreOptionPhase(async () => {
// Player shows off their bug types // Player shows off their bug types
@ -333,7 +333,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
encounter.selectedOption!.dialogue!.selected = [ encounter.selectedOption!.dialogue!.selected = [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.2.selected_0_to_1`, text: `${namespace}:option.2.selected0To1`,
}, },
]; ];
} else if (numBugTypes < 4) { } else if (numBugTypes < 4) {
@ -344,7 +344,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
encounter.selectedOption!.dialogue!.selected = [ encounter.selectedOption!.dialogue!.selected = [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.2.selected_2_to_3`, text: `${namespace}:option.2.selected2To3`,
}, },
]; ];
} else if (numBugTypes < 6) { } else if (numBugTypes < 6) {
@ -355,7 +355,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
encounter.selectedOption!.dialogue!.selected = [ encounter.selectedOption!.dialogue!.selected = [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.2.selected_4_to_5`, text: `${namespace}:option.2.selected4To5`,
}, },
]; ];
} else { } else {
@ -398,7 +398,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
encounter.selectedOption!.dialogue!.selected = [ encounter.selectedOption!.dialogue!.selected = [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.2.selected_6`, text: `${namespace}:option.2.selected6`,
}, },
]; ];
} }
@ -421,17 +421,17 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.3.selected_dialogue`, text: `${namespace}:option.3.selectedDialogue`,
}, },
], ],
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -476,7 +476,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
); );
}); });
if (!hasValidItem) { if (!hasValidItem) {
return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; return getEncounterText(`${namespace}:option.3.invalidSelection`) ?? null;
} }
return null; return null;
@ -713,7 +713,7 @@ function doBugTypeMoveTutor(): Promise<void> {
// biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO explain // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO explain
return new Promise<void>(async resolve => { return new Promise<void>(async resolve => {
const moveOptions = globalScene.currentBattle.mysteryEncounter!.misc.moveTutorOptions; const moveOptions = globalScene.currentBattle.mysteryEncounter!.misc.moveTutorOptions;
await showEncounterDialogue(`${namespace}:battle_won`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:battleWon`, `${namespace}:speaker`);
const moveInfoOverlay = new MoveInfoOverlay({ const moveInfoOverlay = new MoveInfoOverlay({
delayVisibility: false, delayVisibility: false,
@ -748,7 +748,7 @@ function doBugTypeMoveTutor(): Promise<void> {
const result = await selectOptionThenPokemon( const result = await selectOptionThenPokemon(
optionSelectItems, optionSelectItems,
`${namespace}:teach_move_prompt`, `${namespace}:teachMovePrompt`,
undefined, undefined,
onHoverOverCancel, onHoverOverCancel,
); );

View File

@ -119,7 +119,7 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])
@ -233,7 +233,7 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
// After the battle, offer the player the opportunity to permanently swap ability // After the battle, offer the player the opportunity to permanently swap ability
const abilityWasSwapped = await handleSwapAbility(); const abilityWasSwapped = await handleSwapAbility();
if (abilityWasSwapped) { if (abilityWasSwapped) {
await showEncounterText(`${namespace}:option.1.ability_gained`); await showEncounterText(`${namespace}:option.1.abilityGained`);
} }
// Play animations once ability swap is complete // Play animations once ability swap is complete
@ -267,10 +267,10 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
{ {
text: `${namespace}:option.2.selected_2`, text: `${namespace}:option.2.selected2`,
}, },
{ {
text: `${namespace}:option.2.selected_3`, text: `${namespace}:option.2.selected3`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
], ],
@ -359,10 +359,10 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
{ {
text: `${namespace}:option.3.selected_2`, text: `${namespace}:option.3.selected2`,
}, },
{ {
text: `${namespace}:option.3.selected_3`, text: `${namespace}:option.3.selected3`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
], ],
@ -432,8 +432,8 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
async function handleSwapAbility() { async function handleSwapAbility() {
// biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor
return new Promise<boolean>(async resolve => { return new Promise<boolean>(async resolve => {
await showEncounterDialogue(`${namespace}:option.1.apply_ability_dialogue`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:option.1.applyAbilityDialogue`, `${namespace}:speaker`);
await showEncounterText(`${namespace}:option.1.apply_ability_message`); await showEncounterText(`${namespace}:option.1.applyAbilityMessage`);
globalScene.ui.setMode(UiMode.MESSAGE).then(() => { globalScene.ui.setMode(UiMode.MESSAGE).then(() => {
displayYesNoOptions(resolve); displayYesNoOptions(resolve);
@ -442,7 +442,7 @@ async function handleSwapAbility() {
} }
function displayYesNoOptions(resolve) { function displayYesNoOptions(resolve) {
showEncounterText(`${namespace}:option.1.ability_prompt`, null, 500, false); showEncounterText(`${namespace}:option.1.abilityPrompt`, null, 500, false);
const fullOptions = [ const fullOptions = [
{ {
label: i18next.t("menu:yes"), label: i18next.t("menu:yes"),

View File

@ -174,7 +174,7 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
// Gets +1 to all stats except SPD on battle start // Gets +1 to all stats except SPD on battle start
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:option.1.boss_enraged`); queueEncounterMessage(`${namespace}:option.1.bossEnraged`);
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
"StatStageChangePhase", "StatStageChangePhase",
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
@ -273,8 +273,8 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
@ -316,7 +316,7 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
} }
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon);
if (!meetsReqs) { if (!meetsReqs) {
return getEncounterText(`${namespace}:invalid_selection`) ?? null; return getEncounterText(`${namespace}:invalidSelection`) ?? null;
} }
return null; return null;

View File

@ -119,7 +119,7 @@ export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder.withE
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) .withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1])
@ -137,10 +137,10 @@ export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder.withE
selected: [ selected: [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.1.selected_dialogue`, text: `${namespace}:option.1.selectedDialogue`,
}, },
{ {
text: `${namespace}:option.1.selected_message`, text: `${namespace}:option.1.selectedMessage`,
}, },
], ],
}) })

View File

@ -193,7 +193,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
secondOptionPrompt: `${namespace}:option.2.select_prompt`, secondOptionPrompt: `${namespace}:option.2.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
@ -229,7 +229,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// If pokemon has valid item, it can be selected // If pokemon has valid item, it can be selected
const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(pokemon); const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(pokemon);
if (!meetsReqs) { if (!meetsReqs) {
return getEncounterText(`${namespace}:invalid_selection`) ?? null; return getEncounterText(`${namespace}:invalidSelection`) ?? null;
} }
return null; return null;
@ -303,7 +303,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
@ -341,7 +341,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// If pokemon has valid item, it can be selected // If pokemon has valid item, it can be selected
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon);
if (!meetsReqs) { if (!meetsReqs) {
return getEncounterText(`${namespace}:invalid_selection`) ?? null; return getEncounterText(`${namespace}:invalidSelection`) ?? null;
} }
return null; return null;

View File

@ -43,7 +43,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])

View File

@ -56,7 +56,7 @@ export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.with
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])
@ -70,7 +70,7 @@ export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -118,7 +118,7 @@ export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -166,7 +166,7 @@ export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -226,7 +226,7 @@ function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correct
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
{ {
text: `${namespace}:incorrect_exp`, text: `${namespace}:incorrectExp`,
}, },
]; ];
setEncounterExp( setEncounterExp(
@ -243,7 +243,7 @@ function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correct
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
{ {
text: `${namespace}:correct_exp`, text: `${namespace}:correctExp`,
}, },
]; ];
setEncounterExp([pokemon.id], 100); setEncounterExp([pokemon.id], 100);

View File

@ -247,7 +247,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
// Burn applied // Burn applied
encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender());
encounter.setDialogueToken("abilityName", allAbilities[AbilityId.HEATPROOF].name); encounter.setDialogueToken("abilityName", allAbilities[AbilityId.HEATPROOF].name);
queueEncounterMessage(`${namespace}:option.2.target_burned`); queueEncounterMessage(`${namespace}:option.2.targetBurned`);
// Also permanently change the burned Pokemon's ability to Heatproof // Also permanently change the burned Pokemon's ability to Heatproof
applyAbilityOverrideToPokemon(chosenPokemon, AbilityId.HEATPROOF); applyAbilityOverrideToPokemon(chosenPokemon, AbilityId.HEATPROOF);
@ -269,7 +269,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
@ -313,6 +313,6 @@ function giveLeadPokemonAttackTypeBoostItem() {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
encounter.setDialogueToken("itemName", boosterModifierType.name); encounter.setDialogueToken("itemName", boosterModifierType.name);
encounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); encounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender());
queueEncounterMessage(`${namespace}:found_item`); queueEncounterMessage(`${namespace}:foundItem`);
} }
} }

View File

@ -69,7 +69,7 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder.
isBoss: true, isBoss: true,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:option.1.stat_boost`); queueEncounterMessage(`${namespace}:option.1.statBoost`);
// Randomly boost 1 stat 2 stages // Randomly boost 1 stat 2 stages
// Cannot boost Spd, Acc, or Evasion // Cannot boost Spd, Acc, or Evasion
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
@ -165,7 +165,7 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder.
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,

View File

@ -78,7 +78,7 @@ export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.wi
.withIntroDialogue([ .withIntroDialogue([
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.setLocalizationKey(`${namespace}`) .setLocalizationKey(`${namespace}`)
@ -118,7 +118,7 @@ export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.wi
// Only Pokemon that are not KOed/legal can be selected // Only Pokemon that are not KOed/legal can be selected
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -132,7 +132,7 @@ export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.wi
const moneyCost = (encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney; const moneyCost = (encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney;
updatePlayerMoney(-moneyCost, true, false); updatePlayerMoney(-moneyCost, true, false);
await showEncounterText( await showEncounterText(
i18next.t("mysteryEncounterMessages:paid_money", { i18next.t("mysteryEncounterMessages:paidMoney", {
amount: moneyCost, amount: moneyCost,
}), }),
); );
@ -284,25 +284,25 @@ function handleNextTurn() {
guaranteedModifierTypeFuncs: [modifierTypes.MULTI_LENS], guaranteedModifierTypeFuncs: [modifierTypes.MULTI_LENS],
fillRemaining: false, fillRemaining: false,
}); });
resultMessageKey = `${namespace}:best_result`; resultMessageKey = `${namespace}:bestResult`;
} else if (healthRatio < 0.15) { } else if (healthRatio < 0.15) {
// 2nd prize // 2nd prize
setEncounterRewards({ setEncounterRewards({
guaranteedModifierTypeFuncs: [modifierTypes.SCOPE_LENS], guaranteedModifierTypeFuncs: [modifierTypes.SCOPE_LENS],
fillRemaining: false, fillRemaining: false,
}); });
resultMessageKey = `${namespace}:great_result`; resultMessageKey = `${namespace}:greatResult`;
} else if (healthRatio < 0.33) { } else if (healthRatio < 0.33) {
// 3rd prize // 3rd prize
setEncounterRewards({ setEncounterRewards({
guaranteedModifierTypeFuncs: [modifierTypes.WIDE_LENS], guaranteedModifierTypeFuncs: [modifierTypes.WIDE_LENS],
fillRemaining: false, fillRemaining: false,
}); });
resultMessageKey = `${namespace}:good_result`; resultMessageKey = `${namespace}:goodResult`;
} else { } else {
// No prize // No prize
isHealPhase = true; isHealPhase = true;
resultMessageKey = `${namespace}:bad_result`; resultMessageKey = `${namespace}:badResult`;
} }
// End the battle // End the battle
@ -312,7 +312,7 @@ function handleNextTurn() {
globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined; globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined;
leaveEncounterWithoutBattle(isHealPhase); leaveEncounterWithoutBattle(isHealPhase);
// Must end the TurnInit phase prematurely so battle phases aren't added to queue // Must end the TurnInit phase prematurely so battle phases aren't added to queue
queueEncounterMessage(`${namespace}:end_game`); queueEncounterMessage(`${namespace}:endGame`);
queueEncounterMessage(resultMessageKey); queueEncounterMessage(resultMessageKey);
// Skip remainder of TurnInitPhase // Skip remainder of TurnInitPhase
@ -320,9 +320,9 @@ function handleNextTurn() {
} }
if (encounter.misc.turnsRemaining < 3) { if (encounter.misc.turnsRemaining < 3) {
// Display charging messages on turns that aren't the initial turn // Display charging messages on turns that aren't the initial turn
queueEncounterMessage(`${namespace}:charging_continue`); queueEncounterMessage(`${namespace}:chargingContinue`);
} }
queueEncounterMessage(`${namespace}:turn_remaining_${encounter.misc.turnsRemaining}`); queueEncounterMessage(`${namespace}:turnRemaining${encounter.misc.turnsRemaining}`);
encounter.misc.turnsRemaining--; encounter.misc.turnsRemaining--;
// Don't skip remainder of TurnInitPhase // Don't skip remainder of TurnInitPhase

View File

@ -158,7 +158,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, secondOptionPrompt: `${namespace}:option.1.tradeOptionsPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -248,7 +248,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
// Show the trade animation // Show the trade animation
await showTradeBackground(); await showTradeBackground();
await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon);
await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); await showEncounterText(`${namespace}:tradeReceived`, null, 0, true, 4000);
globalScene.playBgm(encounter.misc.bgmKey); globalScene.playBgm(encounter.misc.bgmKey);
await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon);
await hideTradeBackground(); await hideTradeBackground();
@ -369,7 +369,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
// Show the trade animation // Show the trade animation
await showTradeBackground(); await showTradeBackground();
await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon);
await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); await showEncounterText(`${namespace}:tradeReceived`, null, 0, true, 4000);
globalScene.playBgm(encounter.misc.bgmKey); globalScene.playBgm(encounter.misc.bgmKey);
await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon);
await hideTradeBackground(); await hideTradeBackground();
@ -384,7 +384,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, secondOptionPrompt: `${namespace}:option.3.tradeOptionsPrompt`,
}) })
.withPreOptionPhase(async (): Promise<boolean> => { .withPreOptionPhase(async (): Promise<boolean> => {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
@ -416,7 +416,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
return it.isTransferable; return it.isTransferable;
}).length > 0; }).length > 0;
if (!meetsReqs) { if (!meetsReqs) {
return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; return getEncounterText(`${namespace}:option.3.invalidSelection`) ?? null;
} }
return null; return null;
@ -468,7 +468,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil
// Generate a trainer name // Generate a trainer name
const traderName = generateRandomTraderName(); const traderName = generateRandomTraderName();
encounter.setDialogueToken("tradeTrainerName", traderName.trim()); encounter.setDialogueToken("tradeTrainerName", traderName.trim());
await showEncounterText(`${namespace}:item_trade_selected`); await showEncounterText(`${namespace}:itemTradeSelected`);
leaveEncounterWithoutBattle(); leaveEncounterWithoutBattle();
}) })
.build(), .build(),
@ -740,10 +740,10 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P
duration: 500, duration: 500,
onComplete: async () => { onComplete: async () => {
globalScene.fadeOutBgm(1000, false); globalScene.fadeOutBgm(1000, false);
await showEncounterText(`${namespace}:pokemon_trade_selected`); await showEncounterText(`${namespace}:pokemonTradeSelected`);
tradedPokemon.cry(); tradedPokemon.cry();
globalScene.playBgm("evolution"); globalScene.playBgm("evolution");
await showEncounterText(`${namespace}:pokemon_trade_goodbye`); await showEncounterText(`${namespace}:pokemonTradeGoodbye`);
tradedPokeball.setAlpha(0); tradedPokeball.setAlpha(0);
tradedPokeball.setVisible(true); tradedPokeball.setVisible(true);

View File

@ -63,9 +63,9 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE)
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
disabledButtonLabel: `${namespace}:option.1.label_disabled`, disabledButtonLabel: `${namespace}:option.1.labelDisabled`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
disabledButtonTooltip: `${namespace}:option.1.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.1.tooltipDisabled`,
selected: [ selected: [
{ {
text: `${namespace}:option.1.selected`, text: `${namespace}:option.1.selected`,
@ -81,9 +81,9 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE)
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
disabledButtonLabel: `${namespace}:option.2.label_disabled`, disabledButtonLabel: `${namespace}:option.2.labelDisabled`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.2.tooltipDisabled`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,

View File

@ -58,7 +58,7 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.withOnInit(() => { .withOnInit(() => {
@ -128,7 +128,7 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// Only Pokemon non-KOd pokemon can be selected // Only Pokemon non-KOd pokemon can be selected
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -142,18 +142,18 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// Give money and do dialogue // Give money and do dialogue
if (moneyMultiplier > 2.5) { if (moneyMultiplier > 2.5) {
await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:jobCompleteGood`, `${namespace}:speaker`);
} else { } else {
await showEncounterDialogue(`${namespace}:job_complete_bad`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:jobCompleteBad`, `${namespace}:speaker`);
} }
const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier);
updatePlayerMoney(moneyChange, true, false); updatePlayerMoney(moneyChange, true, false);
await showEncounterText( await showEncounterText(
i18next.t("mysteryEncounterMessages:receive_money", { i18next.t("mysteryEncounterMessages:receiveMoney", {
amount: moneyChange, amount: moneyChange,
}), }),
); );
await showEncounterText(`${namespace}:pokemon_tired`); await showEncounterText(`${namespace}:pokemonTired`);
setEncounterRewards({ fillRemaining: true }); setEncounterRewards({ fillRemaining: true });
leaveEncounterWithoutBattle(); leaveEncounterWithoutBattle();
@ -210,7 +210,7 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// Only Pokemon non-KOd pokemon can be selected // Only Pokemon non-KOd pokemon can be selected
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -224,18 +224,18 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
// Give money and do dialogue // Give money and do dialogue
if (moneyMultiplier > 2.5) { if (moneyMultiplier > 2.5) {
await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:jobCompleteGood`, `${namespace}:speaker`);
} else { } else {
await showEncounterDialogue(`${namespace}:job_complete_bad`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:jobCompleteBad`, `${namespace}:speaker`);
} }
const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier);
updatePlayerMoney(moneyChange, true, false); updatePlayerMoney(moneyChange, true, false);
await showEncounterText( await showEncounterText(
i18next.t("mysteryEncounterMessages:receive_money", { i18next.t("mysteryEncounterMessages:receiveMoney", {
amount: moneyChange, amount: moneyChange,
}), }),
); );
await showEncounterText(`${namespace}:pokemon_tired`); await showEncounterText(`${namespace}:pokemonTired`);
setEncounterRewards({ fillRemaining: true }); setEncounterRewards({ fillRemaining: true });
leaveEncounterWithoutBattle(); leaveEncounterWithoutBattle();
@ -248,7 +248,7 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
@ -282,15 +282,15 @@ export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.with
await transitionMysteryEncounterIntroVisuals(false, false); await transitionMysteryEncounterIntroVisuals(false, false);
// Give money and do dialogue // Give money and do dialogue
await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:jobCompleteGood`, `${namespace}:speaker`);
const moneyChange = globalScene.getWaveMoneyAmount(2.5); const moneyChange = globalScene.getWaveMoneyAmount(2.5);
updatePlayerMoney(moneyChange, true, false); updatePlayerMoney(moneyChange, true, false);
await showEncounterText( await showEncounterText(
i18next.t("mysteryEncounterMessages:receive_money", { i18next.t("mysteryEncounterMessages:receiveMoney", {
amount: moneyChange, amount: moneyChange,
}), }),
); );
await showEncounterText(`${namespace}:pokemon_tired`); await showEncounterText(`${namespace}:pokemonTired`);
setEncounterRewards({ fillRemaining: true }); setEncounterRewards({ fillRemaining: true });
leaveEncounterWithoutBattle(); leaveEncounterWithoutBattle();

View File

@ -205,7 +205,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [
// 80% chance to increase flee stage +1 // 80% chance to increase flee stage +1
const fleeChangeResult = tryChangeFleeStage(1, 8); const fleeChangeResult = tryChangeFleeStage(1, 8);
if (!fleeChangeResult) { if (!fleeChangeResult) {
await showEncounterText(getEncounterText(`${namespace}:safari.busy_eating`) ?? "", null, 1000, false); await showEncounterText(getEncounterText(`${namespace}:safari.busyEating`) ?? "", null, 1000, false);
} else { } else {
await showEncounterText(getEncounterText(`${namespace}:safari.eating`) ?? "", null, 1000, false); await showEncounterText(getEncounterText(`${namespace}:safari.eating`) ?? "", null, 1000, false);
} }
@ -233,7 +233,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [
// 80% chance to decrease catch stage -1 // 80% chance to decrease catch stage -1
const catchChangeResult = tryChangeCatchStage(-1, 8); const catchChangeResult = tryChangeCatchStage(-1, 8);
if (!catchChangeResult) { if (!catchChangeResult) {
await showEncounterText(getEncounterText(`${namespace}:safari.beside_itself_angry`) ?? "", null, 1000, false); await showEncounterText(getEncounterText(`${namespace}:safari.besideItselfAngry`) ?? "", null, 1000, false);
} else { } else {
await showEncounterText(getEncounterText(`${namespace}:safari.angry`) ?? "", null, 1000, false); await showEncounterText(getEncounterText(`${namespace}:safari.angry`) ?? "", null, 1000, false);
} }
@ -274,7 +274,7 @@ async function summonSafariPokemon() {
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
// Message pokemon remaining // Message pokemon remaining
encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining); encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining);
globalScene.phaseManager.queueMessage(getEncounterText(`${namespace}:safari.remaining_count`) ?? "", null, true); globalScene.phaseManager.queueMessage(getEncounterText(`${namespace}:safari.remainingCount`) ?? "", null, true);
// Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken
// Safari pokemon roll twice on shiny and HA chances, but are otherwise normal // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal

View File

@ -70,7 +70,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])
@ -119,7 +119,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
); );
} }
if (!encounter.pokemonMeetsPrimaryRequirements(pokemon)) { if (!encounter.pokemonMeetsPrimaryRequirements(pokemon)) {
return getEncounterText(`${namespace}:invalid_selection`) ?? null; return getEncounterText(`${namespace}:invalidSelection`) ?? null;
} }
return null; return null;
@ -155,7 +155,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
chosenPokemon.setCustomNature(newNature); chosenPokemon.setCustomNature(newNature);
encounter.setDialogueToken("newNature", getNatureName(newNature)); encounter.setDialogueToken("newNature", getNatureName(newNature));
queueEncounterMessage(`${namespace}:cheap_side_effects`); queueEncounterMessage(`${namespace}:cheapSideEffects`);
setEncounterExp([chosenPokemon.id], 100); setEncounterExp([chosenPokemon.id], 100);
await chosenPokemon.updateInfo(); await chosenPokemon.updateInfo();
}) })
@ -193,7 +193,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
// Only Pokemon that can gain benefits are unfainted // Only Pokemon that can gain benefits are unfainted
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -215,7 +215,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;
const chosenPokemon = encounter.misc.chosenPokemon; const chosenPokemon = encounter.misc.chosenPokemon;
queueEncounterMessage(`${namespace}:no_bad_effects`); queueEncounterMessage(`${namespace}:noBadEffects`);
setEncounterExp([chosenPokemon.id], 100); setEncounterExp([chosenPokemon.id], 100);
await chosenPokemon.updateInfo(); await chosenPokemon.updateInfo();

View File

@ -157,7 +157,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
// Fall asleep waiting for Snorlax // Fall asleep waiting for Snorlax
// Full heal party // Full heal party
globalScene.phaseManager.unshiftNew("PartyHealPhase", true); globalScene.phaseManager.unshiftNew("PartyHealPhase", true);
queueEncounterMessage(`${namespace}:option.2.rest_result`); queueEncounterMessage(`${namespace}:option.2.restResult`);
leaveEncounterWithoutBattle(); leaveEncounterWithoutBattle();
}, },
) )
@ -167,7 +167,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -122,7 +122,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter = MysteryEncounterBui
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
@ -227,7 +227,7 @@ async function doBiomeTransitionDialogueAndBattleInit() {
isBoss: true, isBoss: true,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:boss_enraged`); queueEncounterMessage(`${namespace}:bossEnraged`);
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
"StatStageChangePhase", "StatStageChangePhase",
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),

View File

@ -139,7 +139,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
}, },
{ {
speaker: trainerNameKey, speaker: trainerNameKey,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.withOnInit(() => { .withOnInit(() => {
@ -189,13 +189,13 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
// Dialogue and egg calcs for Pokemon 1 // Dialogue and egg calcs for Pokemon 1
const [pokemon1CommonEggs, pokemon1RareEggs] = calculateEggRewardsForPokemon(pokemon1); const [pokemon1CommonEggs, pokemon1RareEggs] = calculateEggRewardsForPokemon(pokemon1);
let pokemon1Tooltip = getEncounterText(`${namespace}:option.1.tooltip_base`)!; let pokemon1Tooltip = getEncounterText(`${namespace}:option.1.tooltipBase`)!;
if (pokemon1RareEggs > 0) { if (pokemon1RareEggs > 0) {
const eggsText = i18next.t(`${namespace}:numEggs`, { const eggsText = i18next.t(`${namespace}:numEggs`, {
count: pokemon1RareEggs, count: pokemon1RareEggs,
rarity: i18next.t("egg:greatTier"), rarity: i18next.t("egg:greatTier"),
}); });
pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon1Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon1RareEggs", eggsText); encounter.setDialogueToken("pokemon1RareEggs", eggsText);
@ -205,7 +205,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
count: pokemon1CommonEggs, count: pokemon1CommonEggs,
rarity: i18next.t("egg:defaultTier"), rarity: i18next.t("egg:defaultTier"),
}); });
pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon1Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon1CommonEggs", eggsText); encounter.setDialogueToken("pokemon1CommonEggs", eggsText);
@ -214,13 +214,13 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
// Dialogue and egg calcs for Pokemon 2 // Dialogue and egg calcs for Pokemon 2
const [pokemon2CommonEggs, pokemon2RareEggs] = calculateEggRewardsForPokemon(pokemon2); const [pokemon2CommonEggs, pokemon2RareEggs] = calculateEggRewardsForPokemon(pokemon2);
let pokemon2Tooltip = getEncounterText(`${namespace}:option.2.tooltip_base`)!; let pokemon2Tooltip = getEncounterText(`${namespace}:option.2.tooltipBase`)!;
if (pokemon2RareEggs > 0) { if (pokemon2RareEggs > 0) {
const eggsText = i18next.t(`${namespace}:numEggs`, { const eggsText = i18next.t(`${namespace}:numEggs`, {
count: pokemon2RareEggs, count: pokemon2RareEggs,
rarity: i18next.t("egg:greatTier"), rarity: i18next.t("egg:greatTier"),
}); });
pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon2Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon2RareEggs", eggsText); encounter.setDialogueToken("pokemon2RareEggs", eggsText);
@ -230,7 +230,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
count: pokemon2CommonEggs, count: pokemon2CommonEggs,
rarity: i18next.t("egg:defaultTier"), rarity: i18next.t("egg:defaultTier"),
}); });
pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon2Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon2CommonEggs", eggsText); encounter.setDialogueToken("pokemon2CommonEggs", eggsText);
@ -239,13 +239,13 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
// Dialogue and egg calcs for Pokemon 3 // Dialogue and egg calcs for Pokemon 3
const [pokemon3CommonEggs, pokemon3RareEggs] = calculateEggRewardsForPokemon(pokemon3); const [pokemon3CommonEggs, pokemon3RareEggs] = calculateEggRewardsForPokemon(pokemon3);
let pokemon3Tooltip = getEncounterText(`${namespace}:option.3.tooltip_base`)!; let pokemon3Tooltip = getEncounterText(`${namespace}:option.3.tooltipBase`)!;
if (pokemon3RareEggs > 0) { if (pokemon3RareEggs > 0) {
const eggsText = i18next.t(`${namespace}:numEggs`, { const eggsText = i18next.t(`${namespace}:numEggs`, {
count: pokemon3RareEggs, count: pokemon3RareEggs,
rarity: i18next.t("egg:greatTier"), rarity: i18next.t("egg:greatTier"),
}); });
pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon3Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon3RareEggs", eggsText); encounter.setDialogueToken("pokemon3RareEggs", eggsText);
@ -255,7 +255,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
count: pokemon3CommonEggs, count: pokemon3CommonEggs,
rarity: i18next.t("egg:defaultTier"), rarity: i18next.t("egg:defaultTier"),
}); });
pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { pokemon3Tooltip += i18next.t(`${namespace}:eggsTooltip`, {
eggs: eggsText, eggs: eggsText,
}); });
encounter.setDialogueToken("pokemon3CommonEggs", eggsText); encounter.setDialogueToken("pokemon3CommonEggs", eggsText);
@ -321,14 +321,14 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
]; ];
if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon1CommonEggs"], numEggs: encounter.dialogueTokens["pokemon1CommonEggs"],
}), }),
}); });
} }
if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon1RareEggs"], numEggs: encounter.dialogueTokens["pokemon1RareEggs"],
}), }),
}); });
@ -380,14 +380,14 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
]; ];
if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon2CommonEggs"], numEggs: encounter.dialogueTokens["pokemon2CommonEggs"],
}), }),
}); });
} }
if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon2RareEggs"], numEggs: encounter.dialogueTokens["pokemon2RareEggs"],
}), }),
}); });
@ -439,14 +439,14 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
]; ];
if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon3CommonEggs"], numEggs: encounter.dialogueTokens["pokemon3CommonEggs"],
}), }),
}); });
} }
if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) { if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) {
encounter.dialogue.outro.push({ encounter.dialogue.outro.push({
text: i18next.t(`${namespace}:gained_eggs`, { text: i18next.t(`${namespace}:gainedEggs`, {
numEggs: encounter.dialogueTokens["pokemon3RareEggs"], numEggs: encounter.dialogueTokens["pokemon3RareEggs"],
}), }),
}); });
@ -482,7 +482,7 @@ function getPartyConfig(): EnemyPartyConfig {
trainerType: TrainerType.EXPERT_POKEMON_BREEDER, trainerType: TrainerType.EXPERT_POKEMON_BREEDER,
pokemonConfigs: [ pokemonConfigs: [
{ {
nickname: i18next.t(`${namespace}:cleffa_1_nickname`, { nickname: i18next.t(`${namespace}:cleffa1Nickname`, {
speciesName: getPokemonSpecies(cleffaSpecies).getName(), speciesName: getPokemonSpecies(cleffaSpecies).getName(),
}), }),
species: getPokemonSpecies(cleffaSpecies), species: getPokemonSpecies(cleffaSpecies),
@ -501,7 +501,7 @@ function getPartyConfig(): EnemyPartyConfig {
// All 3 members always Cleffa line, but different configs // All 3 members always Cleffa line, but different configs
baseConfig.pokemonConfigs!.push( baseConfig.pokemonConfigs!.push(
{ {
nickname: i18next.t(`${namespace}:cleffa_2_nickname`, { nickname: i18next.t(`${namespace}:cleffa2Nickname`, {
speciesName: getPokemonSpecies(cleffaSpecies).getName(), speciesName: getPokemonSpecies(cleffaSpecies).getName(),
}), }),
species: getPokemonSpecies(cleffaSpecies), species: getPokemonSpecies(cleffaSpecies),
@ -514,7 +514,7 @@ function getPartyConfig(): EnemyPartyConfig {
ivs: [31, 31, 31, 31, 31, 31], ivs: [31, 31, 31, 31, 31, 31],
}, },
{ {
nickname: i18next.t(`${namespace}:cleffa_3_nickname`, { nickname: i18next.t(`${namespace}:cleffa3Nickname`, {
speciesName: getPokemonSpecies(cleffaSpecies).getName(), speciesName: getPokemonSpecies(cleffaSpecies).getName(),
}), }),
species: getPokemonSpecies(cleffaSpecies), species: getPokemonSpecies(cleffaSpecies),
@ -647,7 +647,7 @@ function onGameOver() {
encounter.dialogue.outro = [ encounter.dialogue.outro = [
{ {
speaker: trainerNameKey, speaker: trainerNameKey,
text: `${namespace}:outro_failed`, text: `${namespace}:outroFailed`,
}, },
]; ];

View File

@ -66,7 +66,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
text: `${namespace}:intro`, text: `${namespace}:intro`,
}, },
{ {
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
}, },
]) ])
@ -178,8 +178,8 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
// Always max price for shiny (flip HA back to normal), and add special messaging // Always max price for shiny (flip HA back to normal), and add special messaging
priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER;
pokemon.abilityIndex = 0; pokemon.abilityIndex = 0;
encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:description_shiny`; encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:descriptionShiny`;
encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltip_shiny`; encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltipShiny`;
} }
const price = globalScene.getWaveMoneyAmount(priceMultiplier); const price = globalScene.getWaveMoneyAmount(priceMultiplier);
encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender());
@ -202,7 +202,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.1.selected_message`, text: `${namespace}:option.1.selectedMessage`,
}, },
], ],
}) })
@ -215,7 +215,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
updatePlayerMoney(-price, true, false); updatePlayerMoney(-price, true, false);
// Show dialogue // Show dialogue
await showEncounterDialogue(`${namespace}:option.1.selected_dialogue`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:option.1.selectedDialogue`, `${namespace}:speaker`);
await transitionMysteryEncounterIntroVisuals(); await transitionMysteryEncounterIntroVisuals();
// "Catch" purchased pokemon // "Catch" purchased pokemon

View File

@ -115,7 +115,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
], ],
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:option.2.stat_boost`); queueEncounterMessage(`${namespace}:option.2.statBoost`);
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
"StatStageChangePhase", "StatStageChangePhase",
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
@ -181,7 +181,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString()); encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString());
encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString()); encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString());
await showEncounterText(`${namespace}:option.1.selected_2`, null, undefined, true); await showEncounterText(`${namespace}:option.1.selected2`, null, undefined, true);
encounter.dialogue.outro = [ encounter.dialogue.outro = [
{ {

View File

@ -87,7 +87,7 @@ export const TheWinstrateChallengeEncounter: MysteryEncounter = MysteryEncounter
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.withAutoHideIntroVisuals(false) .withAutoHideIntroVisuals(false)
@ -163,7 +163,7 @@ async function spawnNextTrainerOrEndEncounter() {
globalScene.playSound("item_fanfare"); globalScene.playSound("item_fanfare");
await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }));
await showEncounterDialogue(`${namespace}:victory_2`, `${namespace}:speaker`); await showEncounterDialogue(`${namespace}:victory2`, `${namespace}:speaker`);
globalScene.ui.clearText(); // Clears "Winstrate" title from screen as rewards get animated in globalScene.ui.clearText(); // Clears "Winstrate" title from screen as rewards get animated in
const machoBrace = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE)!; const machoBrace = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE)!;
machoBrace.type.tier = ModifierTier.MASTER; machoBrace.type.tier = ModifierTier.MASTER;

View File

@ -90,7 +90,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde
// Only Pokemon that are not KOed/legal can be trained // Only Pokemon that are not KOed/legal can be trained
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -174,7 +174,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
secondOptionPrompt: `${namespace}:option.2.select_prompt`, secondOptionPrompt: `${namespace}:option.2.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.selected`, text: `${namespace}:option.selected`,
@ -205,7 +205,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde
// Only Pokemon that are not KOed/legal can be trained // Only Pokemon that are not KOed/legal can be trained
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);
@ -248,7 +248,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.selected`, text: `${namespace}:option.selected`,
@ -295,7 +295,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde
// Only Pokemon that are not KOed/legal can be trained // Only Pokemon that are not KOed/legal can be trained
const selectableFilter = (pokemon: Pokemon) => { const selectableFilter = (pokemon: Pokemon) => {
return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalidSelection`);
}; };
return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter);

View File

@ -194,7 +194,7 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde
.withOptionPhase(async () => { .withOptionPhase(async () => {
// Investigate garbage, battle Gmax Garbodor // Investigate garbage, battle Gmax Garbodor
globalScene.setFieldScale(0.75); globalScene.setFieldScale(0.75);
await showEncounterText(`${namespace}:option.2.selected_2`); await showEncounterText(`${namespace}:option.2.selected2`);
await transitionMysteryEncounterIntroVisuals(); await transitionMysteryEncounterIntroVisuals();
const encounter = globalScene.currentBattle.mysteryEncounter!; const encounter = globalScene.currentBattle.mysteryEncounter!;

View File

@ -97,7 +97,7 @@ export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.
isBoss: false, isBoss: false,
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
mysteryEncounterBattleEffects: (pokemon: Pokemon) => { mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
queueEncounterMessage(`${namespace}:option.1.stat_boost`); queueEncounterMessage(`${namespace}:option.1.statBoost`);
globalScene.phaseManager.unshiftNew( globalScene.phaseManager.unshiftNew(
"StatStageChangePhase", "StatStageChangePhase",
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
@ -191,7 +191,7 @@ export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
@ -236,7 +236,7 @@ export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -143,7 +143,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]) ])
.setLocalizationKey(`${namespace}`) .setLocalizationKey(`${namespace}`)
@ -216,7 +216,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit
await cutsceneDialoguePromise; await cutsceneDialoguePromise;
doHideDreamBackground(); doHideDreamBackground();
await showEncounterText(`${namespace}:option.1.dream_complete`); await showEncounterText(`${namespace}:option.1.dreamComplete`);
await doNewTeamPostProcess(transformations); await doNewTeamPostProcess(transformations);
setEncounterRewards({ setEncounterRewards({
@ -329,7 +329,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit
onBeforeRewards, onBeforeRewards,
); );
await showEncounterText(`${namespace}:option.2.selected_2`, null, undefined, true); await showEncounterText(`${namespace}:option.2.selected2`, null, undefined, true);
await initBattleWithEnemyConfig(enemyPartyConfig); await initBattleWithEnemyConfig(enemyPartyConfig);
}, },
) )

View File

@ -467,7 +467,7 @@ export function updatePlayerMoney(changeValue: number, playSound = true, showMes
if (showMessage) { if (showMessage) {
if (changeValue < 0) { if (changeValue < 0) {
globalScene.phaseManager.queueMessage( globalScene.phaseManager.queueMessage(
i18next.t("mysteryEncounterMessages:paid_money", { i18next.t("mysteryEncounterMessages:paidMoney", {
amount: -changeValue, amount: -changeValue,
}), }),
null, null,
@ -475,7 +475,7 @@ export function updatePlayerMoney(changeValue: number, playSound = true, showMes
); );
} else { } else {
globalScene.phaseManager.queueMessage( globalScene.phaseManager.queueMessage(
i18next.t("mysteryEncounterMessages:receive_money", { i18next.t("mysteryEncounterMessages:receiveMoney", {
amount: changeValue, amount: changeValue,
}), }),
null, null,
@ -587,7 +587,7 @@ export function selectPokemonForOption(
return true; return true;
}, },
onHover: () => { onHover: () => {
showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); showEncounterText(i18next.t("mysteryEncounterMessages:cancelOption"), 0, 0, false);
}, },
}); });
@ -720,7 +720,7 @@ export function selectOptionThenPokemon(
if (onHoverOverCancelOption) { if (onHoverOverCancelOption) {
onHoverOverCancelOption(); onHoverOverCancelOption();
} }
showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); showEncounterText(i18next.t("mysteryEncounterMessages:cancelOption"), 0, 0, false);
}, },
}); });

View File

@ -3,7 +3,7 @@ import { EFFECTIVE_STATS, getShortenedStatKey, Stat } from "#enums/stat";
import { TextStyle } from "#enums/text-style"; import { TextStyle } from "#enums/text-style";
import { UiTheme } from "#enums/ui-theme"; import { UiTheme } from "#enums/ui-theme";
import { getBBCodeFrag } from "#ui/text"; import { getBBCodeFrag } from "#ui/text";
import { toTitleCase } from "#utils/strings"; import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
export function getNatureName( export function getNatureName(
@ -13,7 +13,7 @@ export function getNatureName(
ignoreBBCode = false, ignoreBBCode = false,
uiTheme: UiTheme = UiTheme.DEFAULT, uiTheme: UiTheme = UiTheme.DEFAULT,
): string { ): string {
let ret = toTitleCase(Nature[nature]); let ret = toCamelCase(Nature[nature]);
//Translating nature //Translating nature
if (i18next.exists(`nature:${ret}`)) { if (i18next.exists(`nature:${ret}`)) {
ret = i18next.t(`nature:${ret}` as any); ret = i18next.t(`nature:${ret}` as any);

View File

@ -30,7 +30,7 @@ export abstract class SpeciesFormChangeTrigger {
export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger {} export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger {}
export class SpeciesFormChangeAbilityTrigger extends SpeciesFormChangeTrigger { export class SpeciesFormChangeAbilityTrigger extends SpeciesFormChangeTrigger {
public description: string = i18next.t("pokemonEvolutions:Forms.ability"); public description: string = i18next.t("pokemonEvolutions:forms.ability");
} }
export class SpeciesFormChangeCompoundTrigger { export class SpeciesFormChangeCompoundTrigger {
@ -69,10 +69,10 @@ export class SpeciesFormChangeItemTrigger extends SpeciesFormChangeTrigger {
this.item = item; this.item = item;
this.active = active; this.active = active;
this.description = this.active this.description = this.active
? i18next.t("pokemonEvolutions:Forms.item", { ? i18next.t("pokemonEvolutions:forms.item", {
item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`),
}) })
: i18next.t("pokemonEvolutions:Forms.deactivateItem", { : i18next.t("pokemonEvolutions:forms.deactivateItem", {
item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`),
}); });
} }
@ -97,7 +97,7 @@ export class SpeciesFormChangeTimeOfDayTrigger extends SpeciesFormChangeTrigger
constructor(...timesOfDay: TimeOfDay[]) { constructor(...timesOfDay: TimeOfDay[]) {
super(); super();
this.timesOfDay = timesOfDay; this.timesOfDay = timesOfDay;
this.description = i18next.t("pokemonEvolutions:Forms.timeOfDay"); this.description = i18next.t("pokemonEvolutions:orms.timeOfDay");
} }
canChange(_pokemon: Pokemon): boolean { canChange(_pokemon: Pokemon): boolean {
@ -111,8 +111,8 @@ export class SpeciesFormChangeActiveTrigger extends SpeciesFormChangeTrigger {
super(); super();
this.active = active; this.active = active;
this.description = this.active this.description = this.active
? i18next.t("pokemonEvolutions:Forms.enter") ? i18next.t("pokemonEvolutions:forms.enter")
: i18next.t("pokemonEvolutions:Forms.leave"); : i18next.t("pokemonEvolutions:forms.leave");
} }
canChange(pokemon: Pokemon): boolean { canChange(pokemon: Pokemon): boolean {
@ -128,7 +128,7 @@ export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigg
super(); super();
this.statusEffects = coerceArray(statusEffects); this.statusEffects = coerceArray(statusEffects);
this.invert = invert; this.invert = invert;
// this.description = i18next.t("pokemonEvolutions:Forms.statusEffect"); // this.description = i18next.t("pokemonEvolutions:forms.statusEffect");
} }
canChange(pokemon: Pokemon): boolean { canChange(pokemon: Pokemon): boolean {
@ -146,10 +146,10 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge
this.known = known; this.known = known;
const moveKey = toCamelCase(MoveId[this.move]); const moveKey = toCamelCase(MoveId[this.move]);
this.description = known this.description = known
? i18next.t("pokemonEvolutions:Forms.moveLearned", { ? i18next.t("pokemonEvolutions:forms.moveLearned", {
move: i18next.t(`move:${moveKey}.name`), move: i18next.t(`move:${moveKey}.name`),
}) })
: i18next.t("pokemonEvolutions:Forms.moveForgotten", { : i18next.t("pokemonEvolutions:forms.moveForgotten", {
move: i18next.t(`move:${moveKey}.name`), move: i18next.t(`move:${moveKey}.name`),
}); });
} }
@ -171,7 +171,7 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig
} }
export class SpeciesFormChangePreMoveTrigger extends SpeciesFormChangeMoveTrigger { export class SpeciesFormChangePreMoveTrigger extends SpeciesFormChangeMoveTrigger {
description = i18next.t("pokemonEvolutions:Forms.preMove"); description = i18next.t("pokemonEvolutions:forms.preMove");
canChange(pokemon: Pokemon): boolean { canChange(pokemon: Pokemon): boolean {
const command = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; const command = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()];
return !!command?.move && this.movePredicate(command.move.move) === this.used; return !!command?.move && this.movePredicate(command.move.move) === this.used;
@ -179,7 +179,7 @@ export class SpeciesFormChangePreMoveTrigger extends SpeciesFormChangeMoveTrigge
} }
export class SpeciesFormChangePostMoveTrigger extends SpeciesFormChangeMoveTrigger { export class SpeciesFormChangePostMoveTrigger extends SpeciesFormChangeMoveTrigger {
description = i18next.t("pokemonEvolutions:Forms.postMove"); description = i18next.t("pokemonEvolutions:forms.postMove");
canChange(pokemon: Pokemon): boolean { canChange(pokemon: Pokemon): boolean {
return ( return (
pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used
@ -244,7 +244,7 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
super(); super();
this.ability = ability; this.ability = ability;
this.weathers = weathers; this.weathers = weathers;
this.description = i18next.t("pokemonEvolutions:Forms.weather"); this.description = i18next.t("pokemonEvolutions:forms.weather");
} }
/** /**
@ -282,7 +282,7 @@ export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChange
super(); super();
this.ability = ability; this.ability = ability;
this.weathers = weathers; this.weathers = weathers;
this.description = i18next.t("pokemonEvolutions:Forms.weatherRevert"); this.description = i18next.t("pokemonEvolutions:forms.weatherRevert");
} }
/** /**

View File

@ -778,7 +778,7 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
} }
if (key) { if (key) {
return i18next.t(`battlePokemonForm:${key}`, { return i18next.t(`battlePokemonForm:${toCamelCase(key)}`, {
pokemonName: this.name, pokemonName: this.name,
}); });
} }
@ -810,7 +810,9 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
return this.name; // Other special cases could be put here too return this.name; // Other special cases could be put here too
} }
// Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES
return i18next.t(`pokemonForm:appendForm.${SpeciesId[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); return i18next.t(`pokemonForm:appendForm.${toCamelCase(SpeciesId[this.speciesId].split("_")[0])}`, {
pokemonName: this.name,
});
} }
/** /**
@ -827,7 +829,7 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
const region = this.getRegion(); const region = this.getRegion();
if (this.speciesId === SpeciesId.ARCEUS) { if (this.speciesId === SpeciesId.ARCEUS) {
ret = i18next.t(`pokemonInfo:Type.${formText.toUpperCase()}`); ret = i18next.t(`pokemonInfo:type.${toCamelCase(formText)}`);
} else if ( } else if (
[ [
SpeciesFormKey.MEGA, SpeciesFormKey.MEGA,
@ -841,8 +843,8 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
].includes(formKey as SpeciesFormKey) ].includes(formKey as SpeciesFormKey)
) { ) {
return append return append
? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) ? i18next.t(`battlePokemonForm:${toCamelCase(formKey)}`, { pokemonName: this.name })
: i18next.t(`pokemonForm:battleForm.${formKey}`); : i18next.t(`pokemonForm:battleForm.${toCamelCase(formKey)}`);
} else if ( } else if (
region === Region.NORMAL || region === Region.NORMAL ||
(this.speciesId === SpeciesId.GALAR_DARMANITAN && formIndex > 0) || (this.speciesId === SpeciesId.GALAR_DARMANITAN && formIndex > 0) ||
@ -868,10 +870,10 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
return i18next.t("pokemonForm:ursalunaBloodmoon"); return i18next.t("pokemonForm:ursalunaBloodmoon");
} else { } else {
// Only regional forms should be left at this point // Only regional forms should be left at this point
return i18next.t(`pokemonForm:regionalForm.${Region[region]}`); return i18next.t(`pokemonForm:regionalForm.${toCamelCase(Region[region])}`);
} }
return append return append
? i18next.t("pokemonForm:appendForm.GENERIC", { ? i18next.t("pokemonForm:appendForm.generic", {
pokemonName: this.name, pokemonName: this.name,
formName: ret, formName: ret,
}) })
@ -879,8 +881,8 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable {
} }
localize(): void { localize(): void {
this.name = i18next.t(`pokemon:${SpeciesId[this.speciesId].toLowerCase()}`); this.name = i18next.t(`pokemon:${toCamelCase(SpeciesId[this.speciesId])}`);
this.category = i18next.t(`pokemonCategory:${SpeciesId[this.speciesId].toLowerCase()}_category`); this.category = i18next.t(`pokemonCategory:${toCamelCase(SpeciesId[this.speciesId])}Category`);
} }
getWildSpeciesForLevel(level: number, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): SpeciesId { getWildSpeciesForLevel(level: number, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): SpeciesId {

View File

@ -64,7 +64,7 @@ export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boo
* @returns the translation key corresponding to the given {@linkcode Stat} * @returns the translation key corresponding to the given {@linkcode Stat}
*/ */
export function getStatKey(stat: Stat) { export function getStatKey(stat: Stat) {
return `pokemonInfo:Stat.${Stat[stat]}`; return `pokemonInfo:stat.${Stat[stat].toLowerCase()}`;
} }
/** /**
@ -73,5 +73,5 @@ export function getStatKey(stat: Stat) {
* @returns the translation key corresponding to the given {@linkcode Stat} * @returns the translation key corresponding to the given {@linkcode Stat}
*/ */
export function getShortenedStatKey(stat: PermanentStat) { export function getShortenedStatKey(stat: PermanentStat) {
return `pokemonInfo:Stat.${Stat[stat]}shortened`; return `pokemonInfo:stat.${Stat[stat].toLowerCase()}Shortened`;
} }

View File

@ -130,6 +130,7 @@ import {
} from "#utils/common"; } from "#utils/common";
import { getEnumKeys, getEnumValues } from "#utils/enums"; import { getEnumKeys, getEnumValues } from "#utils/enums";
import { getModifierPoolForType, getModifierType } from "#utils/modifier-utils"; import { getModifierPoolForType, getModifierType } from "#utils/modifier-utils";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
const outputModifierData = false; const outputModifierData = false;
@ -451,13 +452,13 @@ export class TerastallizeModifierType extends PokemonModifierType {
get name(): string { get name(): string {
return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", {
teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), teraType: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.teraType])}`),
}); });
} }
getDescription(): string { getDescription(): string {
return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", {
teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), teraType: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.teraType])}`),
}); });
} }
@ -861,7 +862,7 @@ export class AttackTypeBoosterModifierType
getDescription(): string { getDescription(): string {
// TODO: Need getTypeName? // TODO: Need getTypeName?
return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", {
moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), moveType: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.moveType])}`),
}); });
} }

View File

@ -65,8 +65,8 @@ export class GameOverPhase extends BattlePhase {
const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET;
const genderStr = PlayerGender[genderIndex].toLowerCase(); const genderStr = PlayerGender[genderIndex].toLowerCase();
globalScene.ui.showDialogue( globalScene.ui.showDialogue(
i18next.t("miscDialogue:ending_endless", { context: genderStr }), i18next.t("miscDialogue:endingEndless", { context: genderStr }),
i18next.t("miscDialogue:ending_name"), i18next.t("miscDialogue:endingName"),
0, 0,
() => this.handleGameOver(), () => this.handleGameOver(),
); );

View File

@ -7,6 +7,7 @@ import { PokemonType } from "#enums/pokemon-type";
import type { Pokemon } from "#field/pokemon"; import type { Pokemon } from "#field/pokemon";
import { BattlePhase } from "#phases/battle-phase"; import { BattlePhase } from "#phases/battle-phase";
import { achvs } from "#system/achv"; import { achvs } from "#system/achv";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
export class TeraPhase extends BattlePhase { export class TeraPhase extends BattlePhase {
@ -25,7 +26,7 @@ export class TeraPhase extends BattlePhase {
globalScene.phaseManager.queueMessage( globalScene.phaseManager.queueMessage(
i18next.t("battle:pokemonTerastallized", { i18next.t("battle:pokemonTerastallized", {
pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon),
type: i18next.t(`pokemonInfo:Type.${PokemonType[this.pokemon.getTeraType()]}`), type: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.pokemon.getTeraType()])}`),
}), }),
); );
new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => {

View File

@ -15,6 +15,7 @@ import { TurnHeldItemTransferModifier } from "#modifiers/modifier";
import type { ConditionFn } from "#types/common"; import type { ConditionFn } from "#types/common";
import { isNuzlockeChallenge } from "#utils/challenge-utils"; import { isNuzlockeChallenge } from "#utils/challenge-utils";
import { NumberHolder } from "#utils/common"; import { NumberHolder } from "#utils/common";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
import type { Modifier } from "typescript"; import type { Modifier } from "typescript";
@ -214,244 +215,244 @@ export function getAchievementDescription(localizationKey: string): string {
const genderStr = PlayerGender[genderIndex].toLowerCase(); const genderStr = PlayerGender[genderIndex].toLowerCase();
switch (localizationKey) { switch (localizationKey) {
case "10K_MONEY": case "10KMoney":
return i18next.t("achv:MoneyAchv.description", { return i18next.t("achv:moneyAchv.description", {
context: genderStr, context: genderStr,
moneyAmount: achvs._10K_MONEY.moneyAmount.toLocaleString("en-US"), moneyAmount: achvs._10K_MONEY.moneyAmount.toLocaleString("en-US"),
}); });
case "100K_MONEY": case "100KMoney":
return i18next.t("achv:MoneyAchv.description", { return i18next.t("achv:moneyAchv.description", {
context: genderStr, context: genderStr,
moneyAmount: achvs._100K_MONEY.moneyAmount.toLocaleString("en-US"), moneyAmount: achvs._100K_MONEY.moneyAmount.toLocaleString("en-US"),
}); });
case "1M_MONEY": case "1MMoney":
return i18next.t("achv:MoneyAchv.description", { return i18next.t("achv:moneyAchv.description", {
context: genderStr, context: genderStr,
moneyAmount: achvs._1M_MONEY.moneyAmount.toLocaleString("en-US"), moneyAmount: achvs._1M_MONEY.moneyAmount.toLocaleString("en-US"),
}); });
case "10M_MONEY": case "10MMoney":
return i18next.t("achv:MoneyAchv.description", { return i18next.t("achv:moneyAchv.description", {
context: genderStr, context: genderStr,
moneyAmount: achvs._10M_MONEY.moneyAmount.toLocaleString("en-US"), moneyAmount: achvs._10M_MONEY.moneyAmount.toLocaleString("en-US"),
}); });
case "250_DMG": case "250Dmg":
return i18next.t("achv:DamageAchv.description", { return i18next.t("achv:damageAchv.description", {
context: genderStr, context: genderStr,
damageAmount: achvs._250_DMG.damageAmount.toLocaleString("en-US"), damageAmount: achvs._250_DMG.damageAmount.toLocaleString("en-US"),
}); });
case "1000_DMG": case "1000Dmg":
return i18next.t("achv:DamageAchv.description", { return i18next.t("achv:damageAchv.description", {
context: genderStr, context: genderStr,
damageAmount: achvs._1000_DMG.damageAmount.toLocaleString("en-US"), damageAmount: achvs._1000_DMG.damageAmount.toLocaleString("en-US"),
}); });
case "2500_DMG": case "2500Dmg":
return i18next.t("achv:DamageAchv.description", { return i18next.t("achv:damageAchv.description", {
context: genderStr, context: genderStr,
damageAmount: achvs._2500_DMG.damageAmount.toLocaleString("en-US"), damageAmount: achvs._2500_DMG.damageAmount.toLocaleString("en-US"),
}); });
case "10000_DMG": case "10000Dmg":
return i18next.t("achv:DamageAchv.description", { return i18next.t("achv:damageAchv.description", {
context: genderStr, context: genderStr,
damageAmount: achvs._10000_DMG.damageAmount.toLocaleString("en-US"), damageAmount: achvs._10000_DMG.damageAmount.toLocaleString("en-US"),
}); });
case "250_HEAL": case "250Heal":
return i18next.t("achv:HealAchv.description", { return i18next.t("achv:healAchv.description", {
context: genderStr, context: genderStr,
healAmount: achvs._250_HEAL.healAmount.toLocaleString("en-US"), healAmount: achvs._250_HEAL.healAmount.toLocaleString("en-US"),
HP: i18next.t(getShortenedStatKey(Stat.HP)), HP: i18next.t(getShortenedStatKey(Stat.HP)),
}); });
case "1000_HEAL": case "1000Heal":
return i18next.t("achv:HealAchv.description", { return i18next.t("achv:healAchv.description", {
context: genderStr, context: genderStr,
healAmount: achvs._1000_HEAL.healAmount.toLocaleString("en-US"), healAmount: achvs._1000_HEAL.healAmount.toLocaleString("en-US"),
HP: i18next.t(getShortenedStatKey(Stat.HP)), HP: i18next.t(getShortenedStatKey(Stat.HP)),
}); });
case "2500_HEAL": case "2500Heal":
return i18next.t("achv:HealAchv.description", { return i18next.t("achv:healAchv.description", {
context: genderStr, context: genderStr,
healAmount: achvs._2500_HEAL.healAmount.toLocaleString("en-US"), healAmount: achvs._2500_HEAL.healAmount.toLocaleString("en-US"),
HP: i18next.t(getShortenedStatKey(Stat.HP)), HP: i18next.t(getShortenedStatKey(Stat.HP)),
}); });
case "10000_HEAL": case "10000Heal":
return i18next.t("achv:HealAchv.description", { return i18next.t("achv:healAchv.description", {
context: genderStr, context: genderStr,
healAmount: achvs._10000_HEAL.healAmount.toLocaleString("en-US"), healAmount: achvs._10000_HEAL.healAmount.toLocaleString("en-US"),
HP: i18next.t(getShortenedStatKey(Stat.HP)), HP: i18next.t(getShortenedStatKey(Stat.HP)),
}); });
case "LV_100": case "lv100":
return i18next.t("achv:LevelAchv.description", { return i18next.t("achv:levelAchv.description", {
context: genderStr, context: genderStr,
level: achvs.LV_100.level, level: achvs.LV_100.level,
}); });
case "LV_250": case "lv250":
return i18next.t("achv:LevelAchv.description", { return i18next.t("achv:levelAchv.description", {
context: genderStr, context: genderStr,
level: achvs.LV_250.level, level: achvs.LV_250.level,
}); });
case "LV_1000": case "lv1000":
return i18next.t("achv:LevelAchv.description", { return i18next.t("achv:levelAchv.description", {
context: genderStr, context: genderStr,
level: achvs.LV_1000.level, level: achvs.LV_1000.level,
}); });
case "10_RIBBONS": case "10Ribbons":
return i18next.t("achv:RibbonAchv.description", { return i18next.t("achv:ribbonAchv.description", {
context: genderStr, context: genderStr,
ribbonAmount: achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US"), ribbonAmount: achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US"),
}); });
case "25_RIBBONS": case "25Ribbons":
return i18next.t("achv:RibbonAchv.description", { return i18next.t("achv:ribbonAchv.description", {
context: genderStr, context: genderStr,
ribbonAmount: achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US"), ribbonAmount: achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US"),
}); });
case "50_RIBBONS": case "50Ribbons":
return i18next.t("achv:RibbonAchv.description", { return i18next.t("achv:ribbonAchv.description", {
context: genderStr, context: genderStr,
ribbonAmount: achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US"), ribbonAmount: achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US"),
}); });
case "75_RIBBONS": case "75Ribbons":
return i18next.t("achv:RibbonAchv.description", { return i18next.t("achv:ribbonAchv.description", {
context: genderStr, context: genderStr,
ribbonAmount: achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US"), ribbonAmount: achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US"),
}); });
case "100_RIBBONS": case "100Ribbons":
return i18next.t("achv:RibbonAchv.description", { return i18next.t("achv:ribbonAchv.description", {
context: genderStr, context: genderStr,
ribbonAmount: achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US"), ribbonAmount: achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US"),
}); });
case "TRANSFER_MAX_STAT_STAGE": case "transferMaxStatStage":
return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { return i18next.t("achv:transferMaxStatStage.description", {
context: genderStr, context: genderStr,
}); });
case "MAX_FRIENDSHIP": case "maxFriendship":
return i18next.t("achv:MAX_FRIENDSHIP.description", { return i18next.t("achv:maxFriendship.description", {
context: genderStr, context: genderStr,
}); });
case "MEGA_EVOLVE": case "megaEvolve":
return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); return i18next.t("achv:megaEvolve.description", { context: genderStr });
case "GIGANTAMAX": case "gigantamax":
return i18next.t("achv:GIGANTAMAX.description", { context: genderStr }); return i18next.t("achv:gigantamax.description", { context: genderStr });
case "TERASTALLIZE": case "terastallize":
return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); return i18next.t("achv:terastallize.description", { context: genderStr });
case "STELLAR_TERASTALLIZE": case "stellarTerastallize":
return i18next.t("achv:STELLAR_TERASTALLIZE.description", { return i18next.t("achv:stellarTerastallize.description", {
context: genderStr, context: genderStr,
}); });
case "SPLICE": case "splice":
return i18next.t("achv:SPLICE.description", { context: genderStr }); return i18next.t("achv:splice.description", { context: genderStr });
case "MINI_BLACK_HOLE": case "miniBlackHole":
return i18next.t("achv:MINI_BLACK_HOLE.description", { return i18next.t("achv:miniBlackHole.description", {
context: genderStr, context: genderStr,
}); });
case "CATCH_MYTHICAL": case "catchMythical":
return i18next.t("achv:CATCH_MYTHICAL.description", { return i18next.t("achv:catchMythical.description", {
context: genderStr, context: genderStr,
}); });
case "CATCH_SUB_LEGENDARY": case "catchSubLegendary":
return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { return i18next.t("achv:catchSubLegendary.description", {
context: genderStr, context: genderStr,
}); });
case "CATCH_LEGENDARY": case "catchLegendary":
return i18next.t("achv:CATCH_LEGENDARY.description", { return i18next.t("achv:catchLegendary.description", {
context: genderStr, context: genderStr,
}); });
case "SEE_SHINY": case "seeShiny":
return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); return i18next.t("achv:seeShiny.description", { context: genderStr });
case "SHINY_PARTY": case "shinyParty":
return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); return i18next.t("achv:shinyParty.description", { context: genderStr });
case "HATCH_MYTHICAL": case "hatchMythical":
return i18next.t("achv:HATCH_MYTHICAL.description", { return i18next.t("achv:hatchMythical.description", {
context: genderStr, context: genderStr,
}); });
case "HATCH_SUB_LEGENDARY": case "hatchSubLegendary":
return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { return i18next.t("achv:hatchSubLegendary.description", {
context: genderStr, context: genderStr,
}); });
case "HATCH_LEGENDARY": case "hatchLegendary":
return i18next.t("achv:HATCH_LEGENDARY.description", { return i18next.t("achv:hatchLegendary.description", {
context: genderStr, context: genderStr,
}); });
case "HATCH_SHINY": case "hatchShiny":
return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); return i18next.t("achv:hatchShiny.description", { context: genderStr });
case "HIDDEN_ABILITY": case "hiddenAbility":
return i18next.t("achv:HIDDEN_ABILITY.description", { return i18next.t("achv:hiddenAbility.description", {
context: genderStr, context: genderStr,
}); });
case "PERFECT_IVS": case "perfectIvs":
return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); return i18next.t("achv:perfectIvs.description", { context: genderStr });
case "CLASSIC_VICTORY": case "classicVictory":
return i18next.t("achv:CLASSIC_VICTORY.description", { return i18next.t("achv:classicVictory.description", {
context: genderStr, context: genderStr,
}); });
case "UNEVOLVED_CLASSIC_VICTORY": case "unevolvedClassicVictory":
return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { return i18next.t("achv:unevolvedClassicVictory.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_ONE": case "monoGenOne":
return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); return i18next.t("achv:monoGenOne.description", { context: genderStr });
case "MONO_GEN_TWO": case "monoGenTwo":
return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); return i18next.t("achv:monoGenTwo.description", { context: genderStr });
case "MONO_GEN_THREE": case "monoGenThree":
return i18next.t("achv:MONO_GEN_THREE.description", { return i18next.t("achv:monoGenThree.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_FOUR": case "monoGenFour":
return i18next.t("achv:MONO_GEN_FOUR.description", { return i18next.t("achv:monoGenFour.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_FIVE": case "monoGenFive":
return i18next.t("achv:MONO_GEN_FIVE.description", { return i18next.t("achv:monoGenFive.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_SIX": case "monoGenSix":
return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); return i18next.t("achv:monoGenSix.description", { context: genderStr });
case "MONO_GEN_SEVEN": case "monoGenSeven":
return i18next.t("achv:MONO_GEN_SEVEN.description", { return i18next.t("achv:monoGenSeven.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_EIGHT": case "monoGenEight":
return i18next.t("achv:MONO_GEN_EIGHT.description", { return i18next.t("achv:monoGenEight.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_GEN_NINE": case "monoGenNine":
return i18next.t("achv:MONO_GEN_NINE.description", { return i18next.t("achv:monoGenNine.description", {
context: genderStr, context: genderStr,
}); });
case "MONO_NORMAL": case "monoNormal":
case "MONO_FIGHTING": case "monoFighting":
case "MONO_FLYING": case "monoFlying":
case "MONO_POISON": case "monoPoison":
case "MONO_GROUND": case "monoGround":
case "MONO_ROCK": case "monoRock":
case "MONO_BUG": case "monoBug":
case "MONO_GHOST": case "monoGhost":
case "MONO_STEEL": case "monoSteel":
case "MONO_FIRE": case "monoFire":
case "MONO_WATER": case "monoWater":
case "MONO_GRASS": case "monoGrass":
case "MONO_ELECTRIC": case "monoElectric":
case "MONO_PSYCHIC": case "monoPsychic":
case "MONO_ICE": case "monoIce":
case "MONO_DRAGON": case "monoDragon":
case "MONO_DARK": case "monoDark":
case "MONO_FAIRY": case "monoFairy":
return i18next.t("achv:MonoType.description", { return i18next.t("achv:monoType.description", {
context: genderStr, context: genderStr,
type: i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`), type: i18next.t(`pokemonInfo:type.${toCamelCase(localizationKey.slice(4))}`),
}); });
case "FRESH_START": case "freshStart":
return i18next.t("achv:FRESH_START.description", { context: genderStr }); return i18next.t("achv:freshStart.description", { context: genderStr });
case "INVERSE_BATTLE": case "inverseBattle":
return i18next.t("achv:INVERSE_BATTLE.description", { return i18next.t("achv:inverseBattle.description", {
context: genderStr, context: genderStr,
}); });
case "FLIP_STATS": case "flipStats":
return i18next.t("achv:FLIP_STATS.description", { context: genderStr }); return i18next.t("achv:flipStats.description", { context: genderStr });
case "FLIP_INVERSE": case "flipInverse":
return i18next.t("achv:FLIP_INVERSE.description", { context: genderStr }); return i18next.t("achv:flipInverse.description", { context: genderStr });
case "NUZLOCKE": case "nuzlocke":
return i18next.t("achv:NUZLOCKE.description", { context: genderStr }); return i18next.t("achv:nuzlocke.description", { context: genderStr });
case "BREEDERS_IN_SPACE": case "breedersInSpace":
return i18next.t("achv:BREEDERS_IN_SPACE.description", { return i18next.t("achv:breedersInSpace.description", {
context: genderStr, context: genderStr,
}); });
default: default:
@ -460,84 +461,84 @@ export function getAchievementDescription(localizationKey: string): string {
} }
export const achvs = { export const achvs = {
_10K_MONEY: new MoneyAchv("10K_MONEY", "", 10000, "nugget", 10), _10K_MONEY: new MoneyAchv("10KMoney", "", 10000, "nugget", 10),
_100K_MONEY: new MoneyAchv("100K_MONEY", "", 100000, "big_nugget", 25).setSecret(true), _100K_MONEY: new MoneyAchv("100KMoney", "", 100000, "big_nugget", 25).setSecret(true),
_1M_MONEY: new MoneyAchv("1M_MONEY", "", 1000000, "relic_gold", 50).setSecret(true), _1M_MONEY: new MoneyAchv("1MMoney", "", 1000000, "relic_gold", 50).setSecret(true),
_10M_MONEY: new MoneyAchv("10M_MONEY", "", 10000000, "coin_case", 100).setSecret(true), _10M_MONEY: new MoneyAchv("10MMoney", "", 10000000, "coin_case", 100).setSecret(true),
_250_DMG: new DamageAchv("250_DMG", "", 250, "lucky_punch", 10), _250_DMG: new DamageAchv("250Dmg", "", 250, "lucky_punch", 10),
_1000_DMG: new DamageAchv("1000_DMG", "", 1000, "lucky_punch_great", 25).setSecret(true), _1000_DMG: new DamageAchv("1000Dmg", "", 1000, "lucky_punch_great", 25).setSecret(true),
_2500_DMG: new DamageAchv("2500_DMG", "", 2500, "lucky_punch_ultra", 50).setSecret(true), _2500_DMG: new DamageAchv("2500Dmg", "", 2500, "lucky_punch_ultra", 50).setSecret(true),
_10000_DMG: new DamageAchv("10000_DMG", "", 10000, "lucky_punch_master", 100).setSecret(true), _10000_DMG: new DamageAchv("10000Dmg", "", 10000, "lucky_punch_master", 100).setSecret(true),
_250_HEAL: new HealAchv("250_HEAL", "", 250, "potion", 10), _250_HEAL: new HealAchv("250Heal", "", 250, "potion", 10),
_1000_HEAL: new HealAchv("1000_HEAL", "", 1000, "super_potion", 25).setSecret(true), _1000_HEAL: new HealAchv("1000Heal", "", 1000, "super_potion", 25).setSecret(true),
_2500_HEAL: new HealAchv("2500_HEAL", "", 2500, "hyper_potion", 50).setSecret(true), _2500_HEAL: new HealAchv("2500Heal", "", 2500, "hyper_potion", 50).setSecret(true),
_10000_HEAL: new HealAchv("10000_HEAL", "", 10000, "max_potion", 100).setSecret(true), _10000_HEAL: new HealAchv("10000Heal", "", 10000, "max_potion", 100).setSecret(true),
LV_100: new LevelAchv("LV_100", "", 100, "rare_candy", 25).setSecret(), LV_100: new LevelAchv("lv100", "", 100, "rare_candy", 25).setSecret(),
LV_250: new LevelAchv("LV_250", "", 250, "rarer_candy", 50).setSecret(true), LV_250: new LevelAchv("lv250", "", 250, "rarer_candy", 50).setSecret(true),
LV_1000: new LevelAchv("LV_1000", "", 1000, "candy_jar", 100).setSecret(true), LV_1000: new LevelAchv("lv1000", "", 1000, "candy_jar", 100).setSecret(true),
_10_RIBBONS: new RibbonAchv("10_RIBBONS", "", 10, "bronze_ribbon", 10), _10_RIBBONS: new RibbonAchv("10Ribbons", "", 10, "bronze_ribbon", 10),
_25_RIBBONS: new RibbonAchv("25_RIBBONS", "", 25, "great_ribbon", 25).setSecret(true), _25_RIBBONS: new RibbonAchv("25Ribbons", "", 25, "great_ribbon", 25).setSecret(true),
_50_RIBBONS: new RibbonAchv("50_RIBBONS", "", 50, "ultra_ribbon", 50).setSecret(true), _50_RIBBONS: new RibbonAchv("50Ribbons", "", 50, "ultra_ribbon", 50).setSecret(true),
_75_RIBBONS: new RibbonAchv("75_RIBBONS", "", 75, "rogue_ribbon", 75).setSecret(true), _75_RIBBONS: new RibbonAchv("75Ribbons", "", 75, "rogue_ribbon", 75).setSecret(true),
_100_RIBBONS: new RibbonAchv("100_RIBBONS", "", 100, "master_ribbon", 100).setSecret(true), _100_RIBBONS: new RibbonAchv("100Ribbons", "", 100, "master_ribbon", 100).setSecret(true),
TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20), TRANSFER_MAX_STAT_STAGE: new Achv("transferMaxStatStage", "", "transferMaxStatStage.description", "baton", 20),
MAX_FRIENDSHIP: new Achv("MAX_FRIENDSHIP", "", "MAX_FRIENDSHIP.description", "soothe_bell", 25), MAX_FRIENDSHIP: new Achv("maxFriendship", "", "maxFriendship.description", "soothe_bell", 25),
MEGA_EVOLVE: new Achv("MEGA_EVOLVE", "", "MEGA_EVOLVE.description", "mega_bracelet", 50), MEGA_EVOLVE: new Achv("megaEvolve", "", "megaEvolve.description", "mega_bracelet", 50),
GIGANTAMAX: new Achv("GIGANTAMAX", "", "GIGANTAMAX.description", "dynamax_band", 50), GIGANTAMAX: new Achv("gigantamax", "", "gigantamax.description", "dynamax_band", 50),
TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), TERASTALLIZE: new Achv("terastallize", "", "terastallize.description", "tera_orb", 25),
STELLAR_TERASTALLIZE: new Achv( STELLAR_TERASTALLIZE: new Achv(
"STELLAR_TERASTALLIZE", "stellarTerastallize",
"", "",
"STELLAR_TERASTALLIZE.description", "stellarTerastallize.description",
"stellar_tera_shard", "stellar_tera_shard",
25, 25,
).setSecret(true), ).setSecret(true),
SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), SPLICE: new Achv("splice", "", "splice.description", "dna_splicers", 10),
MINI_BLACK_HOLE: new ModifierAchv( MINI_BLACK_HOLE: new ModifierAchv(
"MINI_BLACK_HOLE", "miniBlackHole",
"", "",
"MINI_BLACK_HOLE.description", "miniBlackHole.description",
"mini_black_hole", "mini_black_hole",
25, 25,
modifier => modifier instanceof TurnHeldItemTransferModifier, modifier => modifier instanceof TurnHeldItemTransferModifier,
).setSecret(), ).setSecret(),
CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), CATCH_MYTHICAL: new Achv("catchMythical", "", "catchMythical.description", "strange_ball", 50).setSecret(),
CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), CATCH_SUB_LEGENDARY: new Achv("catchSubLegendary", "", "catchSubLegendary.description", "rb", 75).setSecret(),
CATCH_LEGENDARY: new Achv("CATCH_LEGENDARY", "", "CATCH_LEGENDARY.description", "mb", 100).setSecret(), CATCH_LEGENDARY: new Achv("catchLegendary", "", "catchLegendary.description", "mb", 100).setSecret(),
SEE_SHINY: new Achv("SEE_SHINY", "", "SEE_SHINY.description", "pb_gold", 75), SEE_SHINY: new Achv("seeShiny", "", "seeShiny.description", "pb_gold", 75),
SHINY_PARTY: new Achv("SHINY_PARTY", "", "SHINY_PARTY.description", "shiny_charm", 100).setSecret(true), SHINY_PARTY: new Achv("shinyParty", "", "shinyParty.description", "shiny_charm", 100).setSecret(true),
HATCH_MYTHICAL: new Achv("HATCH_MYTHICAL", "", "HATCH_MYTHICAL.description", "mystery_egg", 75).setSecret(), HATCH_MYTHICAL: new Achv("hatchMythical", "", "hatchMythical.description", "mystery_egg", 75).setSecret(),
HATCH_SUB_LEGENDARY: new Achv( HATCH_SUB_LEGENDARY: new Achv(
"HATCH_SUB_LEGENDARY", "hatchSubLegendary",
"", "",
"HATCH_SUB_LEGENDARY.description", "hatchSubLegendary.description",
"oval_stone", "oval_stone",
100, 100,
).setSecret(), ).setSecret(),
HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), HATCH_LEGENDARY: new Achv("hatchLegendary", "", "hatchLegendary.description", "lucky_egg", 125).setSecret(),
HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(), HATCH_SHINY: new Achv("hatchShiny", "", "hatchShiny.description", "golden_egg", 100).setSecret(),
HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75), HIDDEN_ABILITY: new Achv("hiddenAbility", "", "hiddenAbility.description", "ability_charm", 75),
PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100), PERFECT_IVS: new Achv("perfectIvs", "", "perfectIvs.description", "blunder_policy", 100),
CLASSIC_VICTORY: new Achv( CLASSIC_VICTORY: new Achv(
"CLASSIC_VICTORY", "classicVictory",
"", "",
"CLASSIC_VICTORY.description", "classicVictory.description",
"relic_crown", "relic_crown",
150, 150,
_ => globalScene.gameData.gameStats.sessionsWon === 0, _ => globalScene.gameData.gameStats.sessionsWon === 0,
), ),
UNEVOLVED_CLASSIC_VICTORY: new Achv( UNEVOLVED_CLASSIC_VICTORY: new Achv(
"UNEVOLVED_CLASSIC_VICTORY", "unevolvedClassicVictory",
"", "",
"UNEVOLVED_CLASSIC_VICTORY.description", "unevolvedClassicVictory.description",
"eviolite", "eviolite",
175, 175,
_ => globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions), _ => globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions),
), ),
MONO_GEN_ONE_VICTORY: new ChallengeAchv( MONO_GEN_ONE_VICTORY: new ChallengeAchv(
"MONO_GEN_ONE", "monoGenOne",
"", "",
"MONO_GEN_ONE.description", "monoGenOne.description",
"ribbon_gen1", "ribbon_gen1",
100, 100,
c => c =>
@ -548,9 +549,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_TWO_VICTORY: new ChallengeAchv( MONO_GEN_TWO_VICTORY: new ChallengeAchv(
"MONO_GEN_TWO", "monoGenTwo",
"", "",
"MONO_GEN_TWO.description", "monoGenTwo.description",
"ribbon_gen2", "ribbon_gen2",
100, 100,
c => c =>
@ -561,9 +562,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_THREE_VICTORY: new ChallengeAchv( MONO_GEN_THREE_VICTORY: new ChallengeAchv(
"MONO_GEN_THREE", "monoGenThree",
"", "",
"MONO_GEN_THREE.description", "monoGenThree.description",
"ribbon_gen3", "ribbon_gen3",
100, 100,
c => c =>
@ -574,9 +575,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_FOUR_VICTORY: new ChallengeAchv( MONO_GEN_FOUR_VICTORY: new ChallengeAchv(
"MONO_GEN_FOUR", "monoGenFour",
"", "",
"MONO_GEN_FOUR.description", "monoGenFour.description",
"ribbon_gen4", "ribbon_gen4",
100, 100,
c => c =>
@ -587,9 +588,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_FIVE_VICTORY: new ChallengeAchv( MONO_GEN_FIVE_VICTORY: new ChallengeAchv(
"MONO_GEN_FIVE", "monoGenFive",
"", "",
"MONO_GEN_FIVE.description", "monoGenFive.description",
"ribbon_gen5", "ribbon_gen5",
100, 100,
c => c =>
@ -600,9 +601,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_SIX_VICTORY: new ChallengeAchv( MONO_GEN_SIX_VICTORY: new ChallengeAchv(
"MONO_GEN_SIX", "monoGenSix",
"", "",
"MONO_GEN_SIX.description", "monoGenSix.description",
"ribbon_gen6", "ribbon_gen6",
100, 100,
c => c =>
@ -613,9 +614,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_SEVEN_VICTORY: new ChallengeAchv( MONO_GEN_SEVEN_VICTORY: new ChallengeAchv(
"MONO_GEN_SEVEN", "monoGenSeven",
"", "",
"MONO_GEN_SEVEN.description", "monoGenSeven.description",
"ribbon_gen7", "ribbon_gen7",
100, 100,
c => c =>
@ -626,9 +627,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_EIGHT_VICTORY: new ChallengeAchv( MONO_GEN_EIGHT_VICTORY: new ChallengeAchv(
"MONO_GEN_EIGHT", "monoGenEight",
"", "",
"MONO_GEN_EIGHT.description", "monoGenEight.description",
"ribbon_gen8", "ribbon_gen8",
100, 100,
c => c =>
@ -639,9 +640,9 @@ export const achvs = {
), ),
), ),
MONO_GEN_NINE_VICTORY: new ChallengeAchv( MONO_GEN_NINE_VICTORY: new ChallengeAchv(
"MONO_GEN_NINE", "monoGenNine",
"", "",
"MONO_GEN_NINE.description", "monoGenNine.description",
"ribbon_gen9", "ribbon_gen9",
100, 100,
c => c =>
@ -652,9 +653,9 @@ export const achvs = {
), ),
), ),
MONO_NORMAL: new ChallengeAchv( MONO_NORMAL: new ChallengeAchv(
"MONO_NORMAL", "monoNormal",
"", "",
"MONO_NORMAL.description", "monoNormal.description",
"silk_scarf", "silk_scarf",
100, 100,
c => c =>
@ -665,9 +666,9 @@ export const achvs = {
), ),
), ),
MONO_FIGHTING: new ChallengeAchv( MONO_FIGHTING: new ChallengeAchv(
"MONO_FIGHTING", "monoFighting",
"", "",
"MONO_FIGHTING.description", "monoFighting.description",
"black_belt", "black_belt",
100, 100,
c => c =>
@ -678,9 +679,9 @@ export const achvs = {
), ),
), ),
MONO_FLYING: new ChallengeAchv( MONO_FLYING: new ChallengeAchv(
"MONO_FLYING", "monoFlying",
"", "",
"MONO_FLYING.description", "monoFlying.description",
"sharp_beak", "sharp_beak",
100, 100,
c => c =>
@ -691,9 +692,9 @@ export const achvs = {
), ),
), ),
MONO_POISON: new ChallengeAchv( MONO_POISON: new ChallengeAchv(
"MONO_POISON", "monoPoison",
"", "",
"MONO_POISON.description", "monoPoison.description",
"poison_barb", "poison_barb",
100, 100,
c => c =>
@ -704,9 +705,9 @@ export const achvs = {
), ),
), ),
MONO_GROUND: new ChallengeAchv( MONO_GROUND: new ChallengeAchv(
"MONO_GROUND", "monoGround",
"", "",
"MONO_GROUND.description", "monoGround.description",
"soft_sand", "soft_sand",
100, 100,
c => c =>
@ -717,9 +718,9 @@ export const achvs = {
), ),
), ),
MONO_ROCK: new ChallengeAchv( MONO_ROCK: new ChallengeAchv(
"MONO_ROCK", "monoRock",
"", "",
"MONO_ROCK.description", "monoRock.description",
"hard_stone", "hard_stone",
100, 100,
c => c =>
@ -730,9 +731,9 @@ export const achvs = {
), ),
), ),
MONO_BUG: new ChallengeAchv( MONO_BUG: new ChallengeAchv(
"MONO_BUG", "monoBug",
"", "",
"MONO_BUG.description", "monoBug.description",
"silver_powder", "silver_powder",
100, 100,
c => c =>
@ -743,9 +744,9 @@ export const achvs = {
), ),
), ),
MONO_GHOST: new ChallengeAchv( MONO_GHOST: new ChallengeAchv(
"MONO_GHOST", "monoGhost",
"", "",
"MONO_GHOST.description", "monoGhost.description",
"spell_tag", "spell_tag",
100, 100,
c => c =>
@ -756,9 +757,9 @@ export const achvs = {
), ),
), ),
MONO_STEEL: new ChallengeAchv( MONO_STEEL: new ChallengeAchv(
"MONO_STEEL", "monoSteel",
"", "",
"MONO_STEEL.description", "monoSteel.description",
"metal_coat", "metal_coat",
100, 100,
c => c =>
@ -769,9 +770,9 @@ export const achvs = {
), ),
), ),
MONO_FIRE: new ChallengeAchv( MONO_FIRE: new ChallengeAchv(
"MONO_FIRE", "monoFire",
"", "",
"MONO_FIRE.description", "monoFire.description",
"charcoal", "charcoal",
100, 100,
c => c =>
@ -782,9 +783,9 @@ export const achvs = {
), ),
), ),
MONO_WATER: new ChallengeAchv( MONO_WATER: new ChallengeAchv(
"MONO_WATER", "monoWater",
"", "",
"MONO_WATER.description", "monoWater.description",
"mystic_water", "mystic_water",
100, 100,
c => c =>
@ -795,9 +796,9 @@ export const achvs = {
), ),
), ),
MONO_GRASS: new ChallengeAchv( MONO_GRASS: new ChallengeAchv(
"MONO_GRASS", "monoGrass",
"", "",
"MONO_GRASS.description", "monoGrass.description",
"miracle_seed", "miracle_seed",
100, 100,
c => c =>
@ -808,9 +809,9 @@ export const achvs = {
), ),
), ),
MONO_ELECTRIC: new ChallengeAchv( MONO_ELECTRIC: new ChallengeAchv(
"MONO_ELECTRIC", "monoElectric",
"", "",
"MONO_ELECTRIC.description", "monoElectric.description",
"magnet", "magnet",
100, 100,
c => c =>
@ -821,9 +822,9 @@ export const achvs = {
), ),
), ),
MONO_PSYCHIC: new ChallengeAchv( MONO_PSYCHIC: new ChallengeAchv(
"MONO_PSYCHIC", "monoPsychic",
"", "",
"MONO_PSYCHIC.description", "monoPsychic.description",
"twisted_spoon", "twisted_spoon",
100, 100,
c => c =>
@ -834,9 +835,9 @@ export const achvs = {
), ),
), ),
MONO_ICE: new ChallengeAchv( MONO_ICE: new ChallengeAchv(
"MONO_ICE", "monoIce",
"", "",
"MONO_ICE.description", "monoIce.description",
"never_melt_ice", "never_melt_ice",
100, 100,
c => c =>
@ -847,9 +848,9 @@ export const achvs = {
), ),
), ),
MONO_DRAGON: new ChallengeAchv( MONO_DRAGON: new ChallengeAchv(
"MONO_DRAGON", "monoDragon",
"", "",
"MONO_DRAGON.description", "monoDragon.description",
"dragon_fang", "dragon_fang",
100, 100,
c => c =>
@ -860,9 +861,9 @@ export const achvs = {
), ),
), ),
MONO_DARK: new ChallengeAchv( MONO_DARK: new ChallengeAchv(
"MONO_DARK", "monoDark",
"", "",
"MONO_DARK.description", "monoDark.description",
"black_glasses", "black_glasses",
100, 100,
c => c =>
@ -873,9 +874,9 @@ export const achvs = {
), ),
), ),
MONO_FAIRY: new ChallengeAchv( MONO_FAIRY: new ChallengeAchv(
"MONO_FAIRY", "monoFairy",
"", "",
"MONO_FAIRY.description", "monoFairy.description",
"fairy_feather", "fairy_feather",
100, 100,
c => c =>
@ -886,9 +887,9 @@ export const achvs = {
), ),
), ),
FRESH_START: new ChallengeAchv( FRESH_START: new ChallengeAchv(
"FRESH_START", "freshStart",
"", "",
"FRESH_START.description", "freshStart.description",
"reviver_seed", "reviver_seed",
100, 100,
c => c =>
@ -899,25 +900,25 @@ export const achvs = {
), ),
), ),
INVERSE_BATTLE: new ChallengeAchv( INVERSE_BATTLE: new ChallengeAchv(
"INVERSE_BATTLE", "inverseBattle",
"", "",
"INVERSE_BATTLE.description", "inverseBattle.description",
"inverse", "inverse",
100, 100,
c => c instanceof InverseBattleChallenge && c.value > 0, c => c instanceof InverseBattleChallenge && c.value > 0,
), ),
FLIP_STATS: new ChallengeAchv( FLIP_STATS: new ChallengeAchv(
"FLIP_STATS", "flipStats",
"", "",
"FLIP_STATS.description", "flipStats.description",
"dubious_disc", "dubious_disc",
100, 100,
c => c instanceof FlipStatChallenge && c.value > 0, c => c instanceof FlipStatChallenge && c.value > 0,
), ),
FLIP_INVERSE: new ChallengeAchv( FLIP_INVERSE: new ChallengeAchv(
"FLIP_INVERSE", "flipInverse",
"", "",
"FLIP_INVERSE.description", "flipInverse.description",
"cracked_pot", "cracked_pot",
100, 100,
c => c =>
@ -926,8 +927,8 @@ export const achvs = {
globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0), globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0),
).setSecret(), ).setSecret(),
// TODO: Decide on icon // TODO: Decide on icon
NUZLOCKE: new ChallengeAchv("NUZLOCKE", "", "NUZLOCKE.description", "leaf_stone", 100, isNuzlockeChallenge), NUZLOCKE: new ChallengeAchv("nuzlocke", "", "nuzlocke.description", "leaf_stone", 100, isNuzlockeChallenge),
BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(), BREEDERS_IN_SPACE: new Achv("breedersInSpace", "", "breedersInSpace.description", "moon_stone", 50).setSecret(),
}; };
export function initAchievements() { export function initAchievements() {

View File

@ -15,6 +15,6 @@ export function awardRibbonsToSpeciesLine(id: SpeciesId, ribbons: RibbonFlag): v
dexData[id].ribbons.award(ribbons); dexData[id].ribbons.award(ribbons);
// Mark all pre-evolutions of the Pokémon with the same ribbon flags. // Mark all pre-evolutions of the Pokémon with the same ribbon flags.
for (let prevoId = pokemonPrevolutions[id]; !isNullOrUndefined(prevoId); prevoId = pokemonPrevolutions[prevoId]) { for (let prevoId = pokemonPrevolutions[id]; !isNullOrUndefined(prevoId); prevoId = pokemonPrevolutions[prevoId]) {
dexData[id].ribbons.award(ribbons); dexData[prevoId].ribbons.award(ribbons);
} }
} }

View File

@ -96,7 +96,7 @@ export class AchvsUiHandler extends MessageUiHandler {
const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE; const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE;
const genderStr = PlayerGender[genderIndex].toLowerCase(); const genderStr = PlayerGender[genderIndex].toLowerCase();
this.achvsName = i18next.t("achv:Achievements.name", { context: genderStr }); this.achvsName = i18next.t("achv:achievements.name", { context: genderStr });
this.vouchersName = i18next.t("voucher:vouchers"); this.vouchersName = i18next.t("voucher:vouchers");
this.iconsBg = addWindow(0, this.headerBg.height, WIDTH - 2, HEIGHT - this.headerBg.height - 68).setOrigin(0); this.iconsBg = addWindow(0, this.headerBg.height, WIDTH - 2, HEIGHT - this.headerBg.height - 68).setOrigin(0);
@ -214,7 +214,7 @@ export class AchvsUiHandler extends MessageUiHandler {
this.showText(!hidden ? achv.description : ""); this.showText(!hidden ? achv.description : "");
this.scoreText.setText(`${achv.score}pt`); this.scoreText.setText(`${achv.score}pt`);
this.unlockText.setText( this.unlockText.setText(
unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name"), unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:locked.name"),
); );
} }

View File

@ -4,6 +4,7 @@ import { TextStyle } from "#enums/text-style";
import { addTextObject } from "#ui/text"; import { addTextObject } from "#ui/text";
import { addWindow } from "#ui/ui-theme"; import { addWindow } from "#ui/ui-theme";
import { fixedInt } from "#utils/common"; import { fixedInt } from "#utils/common";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
interface BaseStatsOverlaySettings { interface BaseStatsOverlaySettings {
@ -68,7 +69,9 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In
// show this component with infos for the specific move // show this component with infos for the specific move
show(values: number[], total: number): boolean { show(values: number[], total: number): boolean {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
this.statsLabels[i].setText(i18next.t(`pokemonInfo:Stat.${shortStats[i]}shortened`) + ": " + `${values[i]}`); this.statsLabels[i].setText(
i18next.t(`pokemonInfo:stat.${toCamelCase(shortStats[i])}Shortened`) + ": " + `${values[i]}`,
);
// This accounts for base stats up to 200, might not be enough. // This accounts for base stats up to 200, might not be enough.
// TODO: change color based on value. // TODO: change color based on value.
this.statsShadows[i].setSize(values[i] / 2, 5); this.statsShadows[i].setSize(values[i] / 2, 5);

View File

@ -9,6 +9,7 @@ import type { Pokemon } from "#field/pokemon";
import { getVariantTint } from "#sprites/variant"; import { getVariantTint } from "#sprites/variant";
import { addTextObject } from "#ui/text"; import { addTextObject } from "#ui/text";
import { fixedInt, getLocalizedSpriteKey, getShinyDescriptor } from "#utils/common"; import { fixedInt, getLocalizedSpriteKey, getShinyDescriptor } from "#utils/common";
import { toCamelCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
/** /**
@ -361,7 +362,7 @@ export abstract class BattleInfo extends Phaser.GameObjects.Container {
globalScene.ui.showTooltip( globalScene.ui.showTooltip(
"", "",
i18next.t("fightUiHandler:teraHover", { i18next.t("fightUiHandler:teraHover", {
type: i18next.t(`pokemonInfo:Type.${PokemonType[this.lastTeraType]}`), type: i18next.t(`pokemonInfo:type.${toCamelCase(PokemonType[this.lastTeraType])}`),
}), }),
); );
} }

View File

@ -1,7 +1,7 @@
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { TextStyle } from "#enums/text-style"; import { TextStyle } from "#enums/text-style";
import { addTextObject } from "#ui/text"; import { addTextObject } from "#ui/text";
import { toTitleCase } from "#utils/strings"; import { toCamelCase, toTitleCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
const hiddenX = -150; const hiddenX = -150;
@ -100,7 +100,7 @@ export class BgmBar extends Phaser.GameObjects.Container {
} }
getRealBgmName(bgmName: string): string { getRealBgmName(bgmName: string): string {
return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], { return i18next.t([`bgmName:${toCamelCase(bgmName)}`, "bgmName:missingEntries"], {
name: toTitleCase(bgmName), name: toTitleCase(bgmName),
}); });
} }

View File

@ -31,14 +31,14 @@ export class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
const config: OptionSelectConfig = { const config: OptionSelectConfig = {
options: [ options: [
{ {
label: i18next.t("partyUiHandler:SUMMARY"), label: i18next.t("partyUiHandler:summary"),
handler: () => { handler: () => {
args[0](); args[0]();
return true; return true;
}, },
}, },
{ {
label: i18next.t("partyUiHandler:POKEDEX"), label: i18next.t("partyUiHandler:pokedex"),
handler: () => { handler: () => {
args[1](); args[1]();
return true; return true;

View File

@ -1,7 +1,9 @@
import { loggedInUser } from "#app/account";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { speciesStarterCosts } from "#balance/starters"; import { speciesStarterCosts } from "#balance/starters";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import { DexAttr } from "#enums/dex-attr"; import { DexAttr } from "#enums/dex-attr";
import { PlayerGender } from "#enums/player-gender";
import { TextStyle } from "#enums/text-style"; import { TextStyle } from "#enums/text-style";
import { UiTheme } from "#enums/ui-theme"; import { UiTheme } from "#enums/ui-theme";
import type { GameData } from "#system/game-data"; import type { GameData } from "#system/game-data";
@ -227,6 +229,9 @@ export class GameStatsUiHandler extends UiHandler {
private arrowUp: Phaser.GameObjects.Sprite; private arrowUp: Phaser.GameObjects.Sprite;
private arrowDown: Phaser.GameObjects.Sprite; private arrowDown: Phaser.GameObjects.Sprite;
/** Logged in username */
private headerText: Phaser.GameObjects.Text;
/** Whether the UI is single column mode */ /** Whether the UI is single column mode */
private get singleCol(): boolean { private get singleCol(): boolean {
const resolvedLang = i18next.resolvedLanguage ?? "en"; const resolvedLang = i18next.resolvedLanguage ?? "en";
@ -296,6 +301,23 @@ export class GameStatsUiHandler extends UiHandler {
return GameStatsUiHandler.ROWS_PER_PAGE * this.columnCount; return GameStatsUiHandler.ROWS_PER_PAGE * this.columnCount;
} }
/**
* Returns the username of logged in user. If the username is hidden, the trainer name based on gender will be displayed.
* @returns The username of logged in user
*/
private getUsername(): string {
const usernameReplacement =
globalScene.gameData.gender === PlayerGender.FEMALE
? i18next.t("trainerNames:player_f")
: i18next.t("trainerNames:player_m");
const displayName = !globalScene.hideUsername
? (loggedInUser?.username ?? i18next.t("common:guest"))
: usernameReplacement;
return i18next.t("gameStatsUiHandler:stats", { username: displayName });
}
// #endregion Columnar-specific properties // #endregion Columnar-specific properties
setup() { setup() {
@ -316,11 +338,11 @@ export class GameStatsUiHandler extends UiHandler {
const headerBg = addWindow(0, 0, sWidth - 2, 24).setOrigin(0); const headerBg = addWindow(0, 0, sWidth - 2, 24).setOrigin(0);
const headerText = addTextObject(0, 0, i18next.t("gameStatsUiHandler:stats"), TextStyle.HEADER_LABEL) this.headerText = addTextObject(0, 0, this.getUsername(), TextStyle.HEADER_LABEL)
.setOrigin(0) .setOrigin(0)
.setPositionRelative(headerBg, 8, 4); .setPositionRelative(headerBg, 8, 4);
this.gameStatsContainer.add([headerBg, headerText]); this.gameStatsContainer.add([headerBg, this.headerText]);
const colWidth = this.colWidth; const colWidth = this.colWidth;
@ -368,6 +390,10 @@ export class GameStatsUiHandler extends UiHandler {
show(args: any[]): boolean { show(args: any[]): boolean {
super.show(args); super.show(args);
// show updated username on every render
this.headerText.setText(this.getUsername());
this.gameStatsContainer.setActive(true).setVisible(true); this.gameStatsContainer.setActive(true).setVisible(true);
this.arrowUp.setActive(true).play("prompt").setVisible(false); this.arrowUp.setActive(true).play("prompt").setVisible(false);

View File

@ -17,6 +17,7 @@ import { addWindow, WindowVariant } from "#ui/ui-theme";
import { fixedInt, isLocal, sessionIdKey } from "#utils/common"; import { fixedInt, isLocal, sessionIdKey } from "#utils/common";
import { getCookie } from "#utils/cookies"; import { getCookie } from "#utils/cookies";
import { getEnumValues } from "#utils/enums"; import { getEnumValues } from "#utils/enums";
import { toCamelCase } from "#utils/strings";
import { isBeta } from "#utils/utility-vars"; import { isBeta } from "#utils/utility-vars";
import i18next from "i18next"; import i18next from "i18next";
@ -138,7 +139,7 @@ export class MenuUiHandler extends MessageUiHandler {
this.optionSelectText = addTextObject( this.optionSelectText = addTextObject(
0, 0,
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, TextStyle.WINDOW,
{ maxLines: this.menuOptions.length }, { maxLines: this.menuOptions.length },
); );

View File

@ -473,7 +473,7 @@ export class MysteryEncounterUiHandler extends UiHandler {
const viewPartyText = addBBCodeTextObject( const viewPartyText = addBBCodeTextObject(
globalScene.scaledCanvas.width, globalScene.scaledCanvas.width,
-24, -24,
getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), getBBCodeFrag(i18next.t("mysteryEncounterMessages:viewPartyButton"), TextStyle.PARTY),
TextStyle.PARTY, TextStyle.PARTY,
); );
this.optionsContainer.add(viewPartyText); this.optionsContainer.add(viewPartyText);
@ -694,7 +694,7 @@ export class MysteryEncounterUiHandler extends UiHandler {
duration: 750, duration: 750,
onComplete: () => { onComplete: () => {
this.dexProgressContainer.on("pointerover", () => { this.dexProgressContainer.on("pointerover", () => {
globalScene.ui.showTooltip("", i18next.t("mysteryEncounterMessages:affects_pokedex"), true); globalScene.ui.showTooltip("", i18next.t("mysteryEncounterMessages:affectsPokedex"), true);
}); });
this.dexProgressContainer.on("pointerout", () => { this.dexProgressContainer.on("pointerout", () => {
globalScene.ui.hideTooltip(); globalScene.ui.hideTooltip();

View File

@ -27,7 +27,7 @@ import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text";
import { addWindow } from "#ui/ui-theme"; import { addWindow } from "#ui/ui-theme";
import { applyChallenges } from "#utils/challenge-utils"; import { applyChallenges } from "#utils/challenge-utils";
import { BooleanHolder, getLocalizedSpriteKey, randInt } from "#utils/common"; import { BooleanHolder, getLocalizedSpriteKey, randInt } from "#utils/common";
import { toTitleCase } from "#utils/strings"; import { toCamelCase, toTitleCase } from "#utils/strings";
import i18next from "i18next"; import i18next from "i18next";
import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
@ -1573,12 +1573,12 @@ export class PartyUiHandler extends MessageUiHandler {
const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon);
if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) {
const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM];
optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; optionName = `${modifier.active ? i18next.t("partyUiHandler:deactivate") : i18next.t("partyUiHandler:activate")} ${modifier.type.name}`;
} else if (option === PartyOption.UNPAUSE_EVOLUTION) { } else if (option === PartyOption.UNPAUSE_EVOLUTION) {
optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:UNPAUSE_EVOLUTION") : i18next.t("partyUiHandler:PAUSE_EVOLUTION")}`; optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:unpausedEvolution") : i18next.t("partyUiHandler:pauseEvolution")}`;
} else { } else {
if (this.localizedOptions.includes(option)) { if (this.localizedOptions.includes(option)) {
optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); optionName = i18next.t(`partyUiHandler:${toCamelCase(PartyOption[option])}`);
} else { } else {
optionName = toTitleCase(PartyOption[option]); optionName = toTitleCase(PartyOption[option]);
} }
@ -1595,7 +1595,7 @@ export class PartyUiHandler extends MessageUiHandler {
.getLevelMoves() .getLevelMoves()
.find(plm => plm[1] === move); .find(plm => plm[1] === move);
} else if (option === PartyOption.ALL) { } else if (option === PartyOption.ALL) {
optionName = i18next.t("partyUiHandler:ALL"); optionName = i18next.t("partyUiHandler:all");
} else { } else {
const itemModifiers = this.getItemModifiers(pokemon); const itemModifiers = this.getItemModifiers(pokemon);
const itemModifier = itemModifiers[option]; const itemModifier = itemModifiers[option];
@ -2190,7 +2190,7 @@ class PartyDiscardModeButton extends Phaser.GameObjects.Container {
setup(party: PartyUiHandler) { setup(party: PartyUiHandler) {
this.transferIcon = globalScene.add.sprite(0, 0, "party_transfer"); this.transferIcon = globalScene.add.sprite(0, 0, "party_transfer");
this.discardIcon = globalScene.add.sprite(0, 0, "party_discard"); this.discardIcon = globalScene.add.sprite(0, 0, "party_discard");
this.textBox = addTextObject(-8, -7, i18next.t("partyUiHandler:TRANSFER"), TextStyle.PARTY); this.textBox = addTextObject(-8, -7, i18next.t("partyUiHandler:transfer"), TextStyle.PARTY);
this.party = party; this.party = party;
this.add(this.transferIcon); this.add(this.transferIcon);
@ -2238,14 +2238,14 @@ class PartyDiscardModeButton extends Phaser.GameObjects.Container {
this.transferIcon.setVisible(true); this.transferIcon.setVisible(true);
this.discardIcon.setVisible(false); this.discardIcon.setVisible(false);
this.textBox.setVisible(true); this.textBox.setVisible(true);
this.textBox.setText(i18next.t("partyUiHandler:TRANSFER")); this.textBox.setText(i18next.t("partyUiHandler:transfer"));
this.transferIcon.displayWidth = this.textBox.text.length * 9 + 3; this.transferIcon.displayWidth = this.textBox.text.length * 9 + 3;
break; break;
case PartyUiMode.DISCARD: case PartyUiMode.DISCARD:
this.transferIcon.setVisible(false); this.transferIcon.setVisible(false);
this.discardIcon.setVisible(true); this.discardIcon.setVisible(true);
this.textBox.setVisible(true); this.textBox.setVisible(true);
this.textBox.setText(i18next.t("partyUiHandler:DISCARD")); this.textBox.setText(i18next.t("partyUiHandler:discard"));
this.discardIcon.displayWidth = this.textBox.text.length * 9 + 3; this.discardIcon.displayWidth = this.textBox.text.length * 9 + 3;
break; break;
} }

View File

@ -57,7 +57,7 @@ import { addWindow } from "#ui/ui-theme";
import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, padInt, rgbHexToRgba } from "#utils/common"; import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, padInt, rgbHexToRgba } from "#utils/common";
import { getEnumValues } from "#utils/enums"; import { getEnumValues } from "#utils/enums";
import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils";
import { toTitleCase } from "#utils/strings"; import { toCamelCase, toTitleCase } from "#utils/strings";
import { argbFromRgba } from "@material/material-color-utilities"; import { argbFromRgba } from "@material/material-color-utilities";
import i18next from "i18next"; import i18next from "i18next";
import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText";
@ -1517,13 +1517,13 @@ export class PokedexPageUiHandler extends MessageUiHandler {
this.biomes.map(b => { this.biomes.map(b => {
options.push({ options.push({
label: label:
i18next.t(`biome:${BiomeId[b.biome].toUpperCase()}`) + i18next.t(`biome:${toCamelCase(BiomeId[b.biome])}`) +
" - " + " - " +
i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + i18next.t(`biome:${toCamelCase(BiomePoolTier[b.tier])}`) +
(b.tod.length === 1 && b.tod[0] === -1 (b.tod.length === 1 && b.tod[0] === -1
? "" ? ""
: " (" + : " (" +
b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + b.tod.map(tod => i18next.t(`biome:${toCamelCase(TimeOfDay[tod])}`)).join(", ") +
")"), ")"),
handler: () => false, handler: () => false,
}); });
@ -1538,13 +1538,13 @@ export class PokedexPageUiHandler extends MessageUiHandler {
this.preBiomes.map(b => { this.preBiomes.map(b => {
options.push({ options.push({
label: label:
i18next.t(`biome:${BiomeId[b.biome].toUpperCase()}`) + i18next.t(`biome:${toCamelCase(BiomeId[b.biome])}`) +
" - " + " - " +
i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + i18next.t(`biome:${toCamelCase(BiomePoolTier[b.tier])}`) +
(b.tod.length === 1 && b.tod[0] === -1 (b.tod.length === 1 && b.tod[0] === -1
? "" ? ""
: " (" + : " (" +
b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + b.tod.map(tod => i18next.t(`biome:${toCamelCase(TimeOfDay[tod])}`)).join(", ") +
")"), ")"),
handler: () => false, handler: () => false,
}); });
@ -2612,7 +2612,7 @@ export class PokedexPageUiHandler extends MessageUiHandler {
// Setting growth rate text // Setting growth rate text
if (isFormCaught) { if (isFormCaught) {
let growthReadable = toTitleCase(GrowthRate[species.growthRate]); let growthReadable = toTitleCase(GrowthRate[species.growthRate]);
const growthAux = growthReadable.replace(" ", "_"); const growthAux = toCamelCase(growthReadable);
if (i18next.exists("growth:" + growthAux)) { if (i18next.exists("growth:" + growthAux)) {
growthReadable = i18next.t(("growth:" + growthAux) as any); growthReadable = i18next.t(("growth:" + growthAux) as any);
} }

View File

@ -47,6 +47,7 @@ import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, r
import type { StarterPreferences } from "#utils/data"; import type { StarterPreferences } from "#utils/data";
import { loadStarterPreferences } from "#utils/data"; import { loadStarterPreferences } from "#utils/data";
import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils"; import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils";
import { toCamelCase } from "#utils/strings";
import { argbFromRgba } from "@material/material-color-utilities"; import { argbFromRgba } from "@material/material-color-utilities";
import i18next from "i18next"; import i18next from "i18next";
@ -324,7 +325,7 @@ export class PokedexUiHandler extends MessageUiHandler {
.filter(value => typeof value === "number") // Filter numeric values from the enum .filter(value => typeof value === "number") // Filter numeric values from the enum
.map( .map(
(biomeValue, index) => (biomeValue, index) =>
new DropDownOption(index, new DropDownLabel(i18next.t(`biome:${BiomeId[biomeValue].toUpperCase()}`))), new DropDownOption(index, new DropDownLabel(i18next.t(`biome:${toCamelCase(BiomeId[biomeValue])}`))),
); );
biomeOptions.push(new DropDownOption(biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable")))); biomeOptions.push(new DropDownOption(biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable"))));
const biomeDropDown: DropDown = new DropDown(0, 0, biomeOptions, this.updateStarters, DropDownType.HYBRID); const biomeDropDown: DropDown = new DropDown(0, 0, biomeOptions, this.updateStarters, DropDownType.HYBRID);

View File

@ -700,7 +700,11 @@ export class RunInfoUiHandler extends UiHandler {
const typeTextColor = `[color=${TypeColor[typeRule]}]`; const typeTextColor = `[color=${TypeColor[typeRule]}]`;
const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`;
const typeText = const typeText =
typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; typeTextColor +
typeShadowColor +
i18next.t(`pokemonInfo:type.${toCamelCase(typeRule)}`)! +
"[/color]" +
"[/shadow]";
rules.push(typeText); rules.push(typeText);
break; break;
} }
@ -794,15 +798,15 @@ export class RunInfoUiHandler extends UiHandler {
pStats[i] = isMult < 1 ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; pStats[i] = isMult < 1 ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i];
pStats[i] = isMult > 1 ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; pStats[i] = isMult > 1 ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i];
} }
const hp = i18next.t("pokemonInfo:Stat.HPshortened") + ": " + pStats[0]; const hp = i18next.t("pokemonInfo:stat.hpShortened") + ": " + pStats[0];
const atk = i18next.t("pokemonInfo:Stat.ATKshortened") + ": " + pStats[1]; const atk = i18next.t("pokemonInfo:stat.atkShortened") + ": " + pStats[1];
const def = i18next.t("pokemonInfo:Stat.DEFshortened") + ": " + pStats[2]; const def = i18next.t("pokemonInfo:stat.defShortened") + ": " + pStats[2];
const spatk = i18next.t("pokemonInfo:Stat.SPATKshortened") + ": " + pStats[3]; const spatk = i18next.t("pokemonInfo:stat.spatkShortened") + ": " + pStats[3];
const spdef = i18next.t("pokemonInfo:Stat.SPDEFshortened") + ": " + pStats[4]; const spdef = i18next.t("pokemonInfo:stat.spdefShortened") + ": " + pStats[4];
const speedLabel = const speedLabel =
currentLanguage === "es-ES" || currentLanguage === "pt_BR" currentLanguage === "es-ES" || currentLanguage === "pt_BR"
? i18next.t("runHistory:SPDshortened") ? i18next.t("runHistory:SPDshortened")
: i18next.t("pokemonInfo:Stat.SPDshortened"); : i18next.t("pokemonInfo:stat.spdShortened");
const speed = speedLabel + ": " + pStats[5]; const speed = speedLabel + ": " + pStats[5];
// Column 1: HP Atk Def // Column 1: HP Atk Def
const pokeStatText1 = addBBCodeTextObject(-5, 0, hp, TextStyle.SUMMARY, { const pokeStatText1 = addBBCodeTextObject(-5, 0, hp, TextStyle.SUMMARY, {

View File

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

View File

@ -37,7 +37,7 @@ import {
rgbHexToRgba, rgbHexToRgba,
} from "#utils/common"; } from "#utils/common";
import { getEnumValues } from "#utils/enums"; import { getEnumValues } from "#utils/enums";
import { toTitleCase } from "#utils/strings"; import { toCamelCase, toTitleCase } from "#utils/strings";
import { argbFromRgba } from "@material/material-color-utilities"; import { argbFromRgba } from "@material/material-color-utilities";
import i18next from "i18next"; import i18next from "i18next";
@ -962,7 +962,7 @@ export class SummaryUiHandler extends UiHandler {
this.passiveContainer?.descriptionText?.setVisible(false); this.passiveContainer?.descriptionText?.setVisible(false);
const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT);
const rawNature = toTitleCase(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? const rawNature = toCamelCase(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct?
const nature = `${getBBCodeFrag(toTitleCase(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? const nature = `${getBBCodeFrag(toTitleCase(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct?
const memoString = i18next.t("pokemonSummary:memoString", { const memoString = i18next.t("pokemonSummary:memoString", {

View File

@ -66,7 +66,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => {
expect(AnOfferYouCantRefuseEncounter.dialogue).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogue).toBeDefined();
expect(AnOfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ expect(AnOfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, { speaker: `${namespace}:speaker`, text: `${namespace}:introDialogue` },
]); ]);
expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);
expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe( expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe(
@ -180,7 +180,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.2.tooltipDisabled`,
selected: [ selected: [
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,

View File

@ -194,7 +194,7 @@ describe("Berries Abound - Mystery Encounter", () => {
// Should be enraged // Should be enraged
expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]);
expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selectedBad`);
}); });
it("should start battle if fastest pokemon is slower than boss above wave 50", async () => { it("should start battle if fastest pokemon is slower than boss above wave 50", async () => {
@ -218,7 +218,7 @@ describe("Berries Abound - Mystery Encounter", () => {
// Should be enraged // Should be enraged
expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]);
expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selectedBad`);
}); });
it("Should skip battle when fastest pokemon is faster than boss", async () => { it("Should skip battle when fastest pokemon is faster than boss", async () => {

View File

@ -181,7 +181,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(BugTypeSuperfanEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(BugTypeSuperfanEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);
@ -389,7 +389,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
}); });
}); });
@ -513,17 +513,17 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.3.selected_dialogue`, text: `${namespace}:option.3.selectedDialogue`,
}, },
], ],
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
}); });
}); });

View File

@ -80,7 +80,7 @@ describe("Clowning Around - Mystery Encounter", () => {
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);
@ -249,11 +249,11 @@ describe("Clowning Around - Mystery Encounter", () => {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
}, },
{ {
text: `${namespace}:option.2.selected_2`, text: `${namespace}:option.2.selected2`,
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.2.selected_3`, text: `${namespace}:option.2.selected3`,
}, },
], ],
}); });
@ -334,11 +334,11 @@ describe("Clowning Around - Mystery Encounter", () => {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,
}, },
{ {
text: `${namespace}:option.3.selected_2`, text: `${namespace}:option.3.selected2`,
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:option.3.selected_3`, text: `${namespace}:option.3.selected3`,
}, },
], ],
}); });

View File

@ -186,8 +186,8 @@ describe("Dancing Lessons - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -186,7 +186,7 @@ describe("Delibird-y - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
secondOptionPrompt: `${namespace}:option.2.select_prompt`, secondOptionPrompt: `${namespace}:option.2.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
@ -348,7 +348,7 @@ describe("Delibird-y - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:option.3.select_prompt`, secondOptionPrompt: `${namespace}:option.3.selectPrompt`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -61,7 +61,7 @@ describe("Department Store Sale - Mystery Encounter", () => {
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);

View File

@ -61,7 +61,7 @@ describe("Field Trip - Mystery Encounter", () => {
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);
@ -78,7 +78,7 @@ describe("Field Trip - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}); });
}); });
@ -139,7 +139,7 @@ describe("Field Trip - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}); });
}); });
@ -200,7 +200,7 @@ describe("Field Trip - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:second_option_prompt`, secondOptionPrompt: `${namespace}:secondOptionPrompt`,
}); });
}); });

View File

@ -253,7 +253,7 @@ describe("Fiery Fallout - Mystery Encounter", () => {
expect(option1.dialogue).toStrictEqual({ expect(option1.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -143,7 +143,7 @@ describe("Fight or Flight - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,

View File

@ -71,7 +71,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
expect(FunAndGamesEncounter.dialogue.intro).toStrictEqual([ expect(FunAndGamesEncounter.dialogue.intro).toStrictEqual([
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);

View File

@ -98,7 +98,7 @@ describe("Global Trade System - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, secondOptionPrompt: `${namespace}:option.1.tradeOptionsPrompt`,
}); });
}); });
@ -210,7 +210,7 @@ describe("Global Trade System - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, secondOptionPrompt: `${namespace}:option.3.tradeOptionsPrompt`,
}); });
}); });

View File

@ -99,9 +99,9 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toBeDefined();
expect(option1.dialogue).toStrictEqual({ expect(option1.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.1.label`, buttonLabel: `${namespace}:option.1.label`,
disabledButtonLabel: `${namespace}:option.1.label_disabled`, disabledButtonLabel: `${namespace}:option.1.labelDisabled`,
buttonTooltip: `${namespace}:option.1.tooltip`, buttonTooltip: `${namespace}:option.1.tooltip`,
disabledButtonTooltip: `${namespace}:option.1.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.1.tooltipDisabled`,
selected: [ selected: [
{ {
text: `${namespace}:option.1.selected`, text: `${namespace}:option.1.selected`,
@ -162,9 +162,9 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(option2.dialogue).toBeDefined(); expect(option2.dialogue).toBeDefined();
expect(option2.dialogue).toStrictEqual({ expect(option2.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
disabledButtonLabel: `${namespace}:option.2.label_disabled`, disabledButtonLabel: `${namespace}:option.2.labelDisabled`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, disabledButtonTooltip: `${namespace}:option.2.tooltipDisabled`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,

View File

@ -65,7 +65,7 @@ describe("Part-Timer - Mystery Encounter", () => {
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);
@ -219,7 +219,7 @@ describe("Part-Timer - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -207,7 +207,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,

View File

@ -71,7 +71,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
}, },
{ {
speaker: "trainerNames:expert_pokemon_breeder", speaker: "trainerNames:expert_pokemon_breeder",
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);

View File

@ -67,7 +67,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => {
expect(dialogue).toBeDefined(); expect(dialogue).toBeDefined();
expect(dialogue.intro).toStrictEqual([ expect(dialogue.intro).toStrictEqual([
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, { speaker: `${namespace}:speaker`, text: `${namespace}:introDialogue` },
]); ]);
const { title, description, query } = dialogue.encounterOptionsDialogue!; const { title, description, query } = dialogue.encounterOptionsDialogue!;
expect(title).toBe(`${namespace}:title`); expect(title).toBe(`${namespace}:title`);
@ -120,7 +120,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => {
buttonTooltip: expect.stringMatching(new RegExp(`^${namespace}\\:option\\.1\\.tooltip(_shiny)?$`)), buttonTooltip: expect.stringMatching(new RegExp(`^${namespace}\\:option\\.1\\.tooltip(_shiny)?$`)),
selected: [ selected: [
{ {
text: `${namespace}:option.1.selected_message`, text: `${namespace}:option.1.selectedMessage`,
}, },
], ],
}); });

View File

@ -73,7 +73,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => {
{ text: `${namespace}:intro` }, { text: `${namespace}:intro` },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);

View File

@ -172,7 +172,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.2.label`, buttonLabel: `${namespace}:option.2.label`,
buttonTooltip: `${namespace}:option.2.tooltip`, buttonTooltip: `${namespace}:option.2.tooltip`,
disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.2.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.2.selected`, text: `${namespace}:option.2.selected`,
@ -237,7 +237,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
expect(option.dialogue).toStrictEqual({ expect(option.dialogue).toStrictEqual({
buttonLabel: `${namespace}:option.3.label`, buttonLabel: `${namespace}:option.3.label`,
buttonTooltip: `${namespace}:option.3.tooltip`, buttonTooltip: `${namespace}:option.3.tooltip`,
disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, disabledButtonTooltip: `${namespace}:option.3.disabledTooltip`,
selected: [ selected: [
{ {
text: `${namespace}:option.3.selected`, text: `${namespace}:option.3.selected`,

View File

@ -68,7 +68,7 @@ describe("Weird Dream - Mystery Encounter", () => {
}, },
{ {
speaker: `${namespace}:speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}:intro_dialogue`, text: `${namespace}:introDialogue`,
}, },
]); ]);
expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`);