Merge branch 'main' into fix/damp

This commit is contained in:
Zach Day 2024-06-21 01:15:33 -04:00
commit da896b9c09
127 changed files with 2187 additions and 973 deletions

View File

@ -31,11 +31,6 @@
font-family: 'emerald'; font-family: 'emerald';
src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype'); src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype');
} }
@font-face {
font-family: 'unifont';
src: url('./fonts/unifont-15.1.05.otf') format('opentype');
size-adjust: 70%;
}
@font-face { @font-face {
font-family: 'pkmnems'; font-family: 'pkmnems';

6
package-lock.json generated
View File

@ -8365,9 +8365,9 @@
"dev": true "dev": true
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "8.16.0", "version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "9-mega_2.png",
"format": "RGBA8888",
"size": {
"w": 88,
"h": 88
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 88,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 88,
"h": 87
},
"frame": {
"x": 0,
"y": 0,
"w": 88,
"h": 87
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:9b1bebbbe735399ba2678aa35a42b156:2dc7c20135acd855e9e97cb010985396:00f61506d33ec61875296e0fb5a82ee9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "9-mega_3.png",
"format": "RGBA8888",
"size": {
"w": 88,
"h": 88
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 88,
"h": 87
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 88,
"h": 87
},
"frame": {
"x": 0,
"y": 0,
"w": 88,
"h": 87
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:9b1bebbbe735399ba2678aa35a42b156:2dc7c20135acd855e9e97cb010985396:00f61506d33ec61875296e0fb5a82ee9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "9-mega_2.png",
"format": "RGBA8888",
"size": {
"w": 77,
"h": 77
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 77,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 77,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 77,
"h": 77
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5d9f38fc4da0e99e00a40be3452a927c:2c58504a78e2752d4c536f8a79dab703:00f61506d33ec61875296e0fb5a82ee9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "9-mega_3.png",
"format": "RGBA8888",
"size": {
"w": 77,
"h": 77
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 77,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 77,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 77,
"h": 77
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5d9f38fc4da0e99e00a40be3452a927c:2c58504a78e2752d4c536f8a79dab703:00f61506d33ec61875296e0fb5a82ee9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

View File

@ -1,7 +1,7 @@
{ {
"textures": [ "textures": [
{ {
"image": "types_pt_BR.png", "image": "types_pt-BR.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 32, "w": 32,

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,7 +1,7 @@
{ {
"textures": [ "textures": [
{ {
"image": "types_zh_CN.png", "image": "types_zh-CN.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 32, "w": 32,

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -1,7 +1,7 @@
{ {
"textures": [ "textures": [
{ {
"image": "types_zh_TW.png", "image": "types_zh-TW.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": { "size": {
"w": 32, "w": 32,

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 800 B

After

Width:  |  Height:  |  Size: 800 B

View File

Before

Width:  |  Height:  |  Size: 799 B

After

Width:  |  Height:  |  Size: 799 B

View File

@ -1,4 +1,4 @@
import { AbilityTranslationEntries, SimpleTranslationEntries, AchievementTranslationEntries, BerryTranslationEntries, DialogueTranslationEntries, ModifierTypeTranslationEntries, MoveTranslationEntries, PokemonInfoTranslationEntries } from "#app/interfaces/locales"; import { AbilityTranslationEntries, SimpleTranslationEntries, AchievementTranslationEntries, BerryTranslationEntries, DialogueTranslationEntries, ModifierTypeTranslationEntries, MoveTranslationEntries, PokemonInfoTranslationEntries, TranslationEntries } from "#app/interfaces/locales";
// Module declared to make referencing keys in the localization files type-safe. // Module declared to make referencing keys in the localization files type-safe.
declare module "i18next" { declare module "i18next" {
@ -14,6 +14,7 @@ declare module "i18next" {
biome: SimpleTranslationEntries; biome: SimpleTranslationEntries;
challenges: SimpleTranslationEntries; challenges: SimpleTranslationEntries;
commandUiHandler: SimpleTranslationEntries; commandUiHandler: SimpleTranslationEntries;
common: TranslationEntries;
PGMachv: AchievementTranslationEntries; PGMachv: AchievementTranslationEntries;
PGFachv: AchievementTranslationEntries; PGFachv: AchievementTranslationEntries;
PGMdialogue: DialogueTranslationEntries; PGMdialogue: DialogueTranslationEntries;

View File

@ -3,6 +3,7 @@ import UI from "./ui/ui";
import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases";
import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon";
import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species";
import { Constructor } from "#app/utils";
import * as Utils from "./utils"; import * as Utils from "./utils";
import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier";
import { PokeballType } from "./data/pokeball"; import { PokeballType } from "./data/pokeball";
@ -2340,8 +2341,14 @@ export default class BattleScene extends SceneBase {
return false; return false;
} }
getModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true): PersistentModifier[] { /**
return (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType); * Get all of the modifiers that match `modifierType`
* @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier}
* @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
* @returns the list of all modifiers that matched `modifierType`.
*/
getModifiers<T extends PersistentModifier>(modifierType: Constructor<T>, player: boolean = true): T[] {
return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType);
} }
findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] { findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] {
@ -2352,7 +2359,7 @@ export default class BattleScene extends SceneBase {
return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m)); return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m));
} }
applyShuffledModifiers(scene: BattleScene, modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { applyShuffledModifiers(scene: BattleScene, modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier[] {
let modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); let modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
scene.executeWithSeedOffset(() => { scene.executeWithSeedOffset(() => {
const shuffleModifiers = mods => { const shuffleModifiers = mods => {
@ -2367,7 +2374,7 @@ export default class BattleScene extends SceneBase {
return this.applyModifiersInternal(modifiers, player, args); return this.applyModifiersInternal(modifiers, player, args);
} }
applyModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { applyModifiers(modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier[] {
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
return this.applyModifiersInternal(modifiers, player, args); return this.applyModifiersInternal(modifiers, player, args);
} }
@ -2384,7 +2391,7 @@ export default class BattleScene extends SceneBase {
return appliedModifiers; return appliedModifiers;
} }
applyModifier(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier { applyModifier(modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier {
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
for (const modifier of modifiers) { for (const modifier of modifiers) {
if (modifier.apply(args)) { if (modifier.apply(args)) {
@ -2396,7 +2403,7 @@ export default class BattleScene extends SceneBase {
return null; return null;
} }
triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: { new(...args: any[]): SpeciesFormChangeTrigger }, delayed: boolean = false, modal: boolean = false): boolean { triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor<SpeciesFormChangeTrigger>, delayed: boolean = false, modal: boolean = false): boolean {
if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) {
const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon));
if (matchingFormChange) { if (matchingFormChange) {
@ -2420,7 +2427,7 @@ export default class BattleScene extends SceneBase {
return false; return false;
} }
validateAchvs(achvType: { new(...args: any[]): Achv }, ...args: any[]): void { validateAchvs(achvType: Constructor<Achv>, ...args: unknown[]): void {
const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType);
for (const achv of filteredAchvs) { for (const achv of filteredAchvs) {
this.validateAchv(achv, args); this.validateAchv(achv, args);

View File

@ -1,5 +1,6 @@
import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
import { Type } from "./type"; import { Type } from "./type";
import { Constructor } from "#app/utils";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattleStat, getBattleStatName } from "./battle-stat"; import { BattleStat, getBattleStatName } from "./battle-stat";
import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
@ -61,7 +62,7 @@ export class Ability implements Localizable {
* @param attrType any attribute that extends {@linkcode AbAttr} * @param attrType any attribute that extends {@linkcode AbAttr}
* @returns Array of attributes that match `attrType`, Empty Array if none match. * @returns Array of attributes that match `attrType`, Empty Array if none match.
*/ */
getAttrs<T extends AbAttr>(attrType: new(...args: any[]) => T ): T[] { getAttrs<T extends AbAttr>(attrType: Constructor<T> ): T[] {
return this.attrs.filter((a): a is T => a instanceof attrType); return this.attrs.filter((a): a is T => a instanceof attrType);
} }
@ -70,18 +71,18 @@ export class Ability implements Localizable {
* @param attrType any attribute that extends {@linkcode AbAttr} * @param attrType any attribute that extends {@linkcode AbAttr}
* @returns true if the ability has attribute `attrType` * @returns true if the ability has attribute `attrType`
*/ */
hasAttr<T extends AbAttr>(attrType: new(...args: any[]) => T): boolean { hasAttr<T extends AbAttr>(attrType: Constructor<T>): boolean {
return this.attrs.some((attr) => attr instanceof attrType); return this.attrs.some((attr) => attr instanceof attrType);
} }
attr<T extends new (...args: any[]) => AbAttr>(AttrType: T, ...args: ConstructorParameters<T>): Ability { attr<T extends Constructor<AbAttr>>(AttrType: T, ...args: ConstructorParameters<T>): Ability {
const attr = new AttrType(...args); const attr = new AttrType(...args);
this.attrs.push(attr); this.attrs.push(attr);
return this; return this;
} }
conditionalAttr<T extends new (...args: any[]) => AbAttr>(condition: AbAttrCondition, AttrType: T, ...args: ConstructorParameters<T>): Ability { conditionalAttr<T extends Constructor<AbAttr>>(condition: AbAttrCondition, AttrType: T, ...args: ConstructorParameters<T>): Ability {
const attr = new AttrType(...args); const attr = new AttrType(...args);
attr.addCondition(condition); attr.addCondition(condition);
this.attrs.push(attr); this.attrs.push(attr);
@ -2342,7 +2343,7 @@ export class BlockNonDirectDamageAbAttr extends AbAttr {
/** /**
* This attribute will block any status damage that you put in the parameter. * This attribute will block any status damage that you put in the parameter.
*/ */
export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { export class BlockStatusDamageAbAttr extends AbAttr {
private effects: StatusEffect[]; private effects: StatusEffect[];
/** /**
@ -2362,7 +2363,7 @@ export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr {
* @returns Returns true if status damage is blocked * @returns Returns true if status damage is blocked
*/ */
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.effects.includes(pokemon.status.effect)) { if (this.effects.includes(pokemon.status?.effect)) {
cancelled.value = true; cancelled.value = true;
return true; return true;
} }
@ -2476,6 +2477,9 @@ function getSheerForceHitDisableAbCondition(): AbAttrCondition {
function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition {
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (!pokemon.scene?.arena) {
return false;
}
if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) { if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) {
return false; return false;
} }
@ -3720,13 +3724,21 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt
} }
/** /**
* Applies immunity to physical moves. * Takes no damage from the first hit of a physical move.
* This is used in Ice Face ability. * This is used in Ice Face ability.
*/ */
export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr { export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
private multiplier: number;
constructor(condition: PokemonDefendCondition, multiplier: number) {
super(condition, multiplier);
this.multiplier = multiplier;
}
/** /**
* Applies the Ice Face pre-defense ability to the Pokémon. * Applies the Ice Face pre-defense ability to the Pokémon.
* Removes BattlerTagType.ICE_FACE hit by physical attack and is in Ice Face form. * Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form.
* *
* @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {Pokemon} pokemon - The Pokémon with the Ice Face ability.
* @param {boolean} passive - Whether the ability is passive. * @param {boolean} passive - Whether the ability is passive.
@ -3737,16 +3749,13 @@ export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr {
* @returns {boolean} - Whether the immunity was applied. * @returns {boolean} - Whether the immunity was applied.
*/ */
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const isImmune = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); if (this.condition(pokemon, attacker, move)) {
(args[0] as Utils.NumberHolder).value = this.multiplier;
if (isImmune) { pokemon.removeTag(BattlerTagType.ICE_FACE);
const simulated = args.length > 1 && args[1]; return true;
if (!simulated) {
pokemon.removeTag(BattlerTagType.ICE_FACE);
}
} }
return isImmune; return false;
} }
/** /**
@ -3761,7 +3770,7 @@ export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr {
} }
} }
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr }, function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: Constructor<TAttr>,
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> { pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
return new Promise(resolve => { return new Promise(resolve => {
if (!pokemon.canApplyAbility(passive)) { if (!pokemon.canApplyAbility(passive)) {
@ -3776,7 +3785,7 @@ function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any
const attrs = ability.getAttrs(attrType); const attrs = ability.getAttrs(attrType);
const clearSpliceQueueAndResolve = () => { const clearSpliceQueueAndResolve = () => {
pokemon.scene.clearPhaseQueueSplice(); pokemon.scene?.clearPhaseQueueSplice();
if (!passive) { if (!passive) {
return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve());
} else { } else {
@ -3839,32 +3848,32 @@ function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any
}); });
} }
export function applyAbAttrs(attrType: { new(...args: any[]): AbAttr }, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { export function applyAbAttrs(attrType: Constructor<AbAttr>, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<AbAttr>(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args); return applyAbAttrsInternal<AbAttr>(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args);
} }
export function applyPostBattleInitAbAttrs(attrType: { new(...args: any[]): PostBattleInitAbAttr }, export function applyPostBattleInitAbAttrs(attrType: Constructor<PostBattleInitAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostBattleInitAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, args), args); return applyAbAttrsInternal<PostBattleInitAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, args), args);
} }
export function applyPreDefendAbAttrs(attrType: { new(...args: any[]): PreDefendAbAttr }, export function applyPreDefendAbAttrs(attrType: Constructor<PreDefendAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
const simulated = args.length > 1 && args[1]; const simulated = args.length > 1 && args[1];
return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated); return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated);
} }
export function applyPostDefendAbAttrs(attrType: { new(...args: any[]): PostDefendAbAttr }, export function applyPostDefendAbAttrs(attrType: Constructor<PostDefendAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> { pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, attacker, move, hitResult, args), args); return applyAbAttrsInternal<PostDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, attacker, move, hitResult, args), args);
} }
export function applyPostMoveUsedAbAttrs(attrType: { new(...args: any[]): PostMoveUsedAbAttr }, export function applyPostMoveUsedAbAttrs(attrType: Constructor<PostMoveUsedAbAttr>,
pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], ...args: any[]): Promise<void> { pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostMoveUsedAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, args), args); return applyAbAttrsInternal<PostMoveUsedAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, args), args);
} }
export function applyBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]): BattleStatMultiplierAbAttr }, export function applyBattleStatMultiplierAbAttrs(attrType: Constructor<BattleStatMultiplierAbAttr>,
pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<BattleStatMultiplierAbAttr>(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, battleStat, statValue, args), args); return applyAbAttrsInternal<BattleStatMultiplierAbAttr>(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, battleStat, statValue, args), args);
} }
@ -3879,98 +3888,98 @@ export function applyBattleStatMultiplierAbAttrs(attrType: { new(...args: any[])
* @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat
* @param args unused * @param args unused
*/ */
export function applyFieldBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]): FieldMultiplyBattleStatAbAttr }, export function applyFieldBattleStatMultiplierAbAttrs(attrType: Constructor<FieldMultiplyBattleStatAbAttr>,
pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<FieldMultiplyBattleStatAbAttr>(attrType, pokemon, (attr, passive) => attr.applyFieldBattleStat(pokemon, passive, stat, statValue, checkedPokemon, hasApplied, args), args); return applyAbAttrsInternal<FieldMultiplyBattleStatAbAttr>(attrType, pokemon, (attr, passive) => attr.applyFieldBattleStat(pokemon, passive, stat, statValue, checkedPokemon, hasApplied, args), args);
} }
export function applyPreAttackAbAttrs(attrType: { new(...args: any[]): PreAttackAbAttr }, export function applyPreAttackAbAttrs(attrType: Constructor<PreAttackAbAttr>,
pokemon: Pokemon, defender: Pokemon, move: Move, ...args: any[]): Promise<void> { pokemon: Pokemon, defender: Pokemon, move: Move, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreAttackAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, defender, move, args), args); return applyAbAttrsInternal<PreAttackAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, defender, move, args), args);
} }
export function applyPostAttackAbAttrs(attrType: { new(...args: any[]): PostAttackAbAttr }, export function applyPostAttackAbAttrs(attrType: Constructor<PostAttackAbAttr>,
pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> { pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostAttackAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, defender, move, hitResult, args), args); return applyAbAttrsInternal<PostAttackAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, defender, move, hitResult, args), args);
} }
export function applyPostKnockOutAbAttrs(attrType: { new(...args: any[]): PostKnockOutAbAttr }, export function applyPostKnockOutAbAttrs(attrType: Constructor<PostKnockOutAbAttr>,
pokemon: Pokemon, knockedOut: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, knockedOut: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostKnockOutAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, knockedOut, args), args); return applyAbAttrsInternal<PostKnockOutAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, knockedOut, args), args);
} }
export function applyPostVictoryAbAttrs(attrType: { new(...args: any[]): PostVictoryAbAttr }, export function applyPostVictoryAbAttrs(attrType: Constructor<PostVictoryAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostVictoryAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, args), args); return applyAbAttrsInternal<PostVictoryAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, args), args);
} }
export function applyPostSummonAbAttrs(attrType: { new(...args: any[]): PostSummonAbAttr }, export function applyPostSummonAbAttrs(attrType: Constructor<PostSummonAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostSummonAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, args), args); return applyAbAttrsInternal<PostSummonAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, args), args);
} }
export function applyPreSwitchOutAbAttrs(attrType: { new(...args: any[]): PreSwitchOutAbAttr }, export function applyPreSwitchOutAbAttrs(attrType: Constructor<PreSwitchOutAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreSwitchOutAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true); return applyAbAttrsInternal<PreSwitchOutAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true);
} }
export function applyPreStatChangeAbAttrs(attrType: { new(...args: any[]): PreStatChangeAbAttr }, export function applyPreStatChangeAbAttrs(attrType: Constructor<PreStatChangeAbAttr>,
pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreStatChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreStatChange(pokemon, passive, stat, cancelled, args), args); return applyAbAttrsInternal<PreStatChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreStatChange(pokemon, passive, stat, cancelled, args), args);
} }
export function applyPostStatChangeAbAttrs(attrType: { new(...args: any[]): PostStatChangeAbAttr }, export function applyPostStatChangeAbAttrs(attrType: Constructor<PostStatChangeAbAttr>,
pokemon: Pokemon, stats: BattleStat[], levels: integer, selfTarget: boolean, ...args: any[]): Promise<void> { pokemon: Pokemon, stats: BattleStat[], levels: integer, selfTarget: boolean, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostStatChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostStatChange(pokemon, stats, levels, selfTarget, args), args); return applyAbAttrsInternal<PostStatChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostStatChange(pokemon, stats, levels, selfTarget, args), args);
} }
export function applyPreSetStatusAbAttrs(attrType: { new(...args: any[]): PreSetStatusAbAttr }, export function applyPreSetStatusAbAttrs(attrType: Constructor<PreSetStatusAbAttr>,
pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
const simulated = args.length > 1 && args[1]; const simulated = args.length > 1 && args[1];
return applyAbAttrsInternal<PreSetStatusAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); return applyAbAttrsInternal<PreSetStatusAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated);
} }
export function applyPreApplyBattlerTagAbAttrs(attrType: { new(...args: any[]): PreApplyBattlerTagAbAttr }, export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor<PreApplyBattlerTagAbAttr>,
pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreApplyBattlerTagAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, tag, cancelled, args), args); return applyAbAttrsInternal<PreApplyBattlerTagAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, tag, cancelled, args), args);
} }
export function applyPreWeatherEffectAbAttrs(attrType: { new(...args: any[]): PreWeatherEffectAbAttr }, export function applyPreWeatherEffectAbAttrs(attrType: Constructor<PreWeatherEffectAbAttr>,
pokemon: Pokemon, weather: Weather, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> { pokemon: Pokemon, weather: Weather, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreWeatherDamageAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, false, true); return applyAbAttrsInternal<PreWeatherDamageAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, false, true);
} }
export function applyPostTurnAbAttrs(attrType: { new(...args: any[]): PostTurnAbAttr }, export function applyPostTurnAbAttrs(attrType: Constructor<PostTurnAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostTurnAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, args), args); return applyAbAttrsInternal<PostTurnAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, args), args);
} }
export function applyPostWeatherChangeAbAttrs(attrType: { new(...args: any[]): PostWeatherChangeAbAttr }, export function applyPostWeatherChangeAbAttrs(attrType: Constructor<PostWeatherChangeAbAttr>,
pokemon: Pokemon, weather: WeatherType, ...args: any[]): Promise<void> { pokemon: Pokemon, weather: WeatherType, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostWeatherChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, weather, args), args); return applyAbAttrsInternal<PostWeatherChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, weather, args), args);
} }
export function applyPostWeatherLapseAbAttrs(attrType: { new(...args: any[]): PostWeatherLapseAbAttr }, export function applyPostWeatherLapseAbAttrs(attrType: Constructor<PostWeatherLapseAbAttr>,
pokemon: Pokemon, weather: Weather, ...args: any[]): Promise<void> { pokemon: Pokemon, weather: Weather, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostWeatherLapseAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, weather, args), args); return applyAbAttrsInternal<PostWeatherLapseAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, weather, args), args);
} }
export function applyPostTerrainChangeAbAttrs(attrType: { new(...args: any[]): PostTerrainChangeAbAttr }, export function applyPostTerrainChangeAbAttrs(attrType: Constructor<PostTerrainChangeAbAttr>,
pokemon: Pokemon, terrain: TerrainType, ...args: any[]): Promise<void> { pokemon: Pokemon, terrain: TerrainType, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostTerrainChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, terrain, args), args); return applyAbAttrsInternal<PostTerrainChangeAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, terrain, args), args);
} }
export function applyCheckTrappedAbAttrs(attrType: { new(...args: any[]): CheckTrappedAbAttr }, export function applyCheckTrappedAbAttrs(attrType: Constructor<CheckTrappedAbAttr>,
pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<CheckTrappedAbAttr>(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args, true); return applyAbAttrsInternal<CheckTrappedAbAttr>(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args, true);
} }
export function applyPostBattleAbAttrs(attrType: { new(...args: any[]): PostBattleAbAttr }, export function applyPostBattleAbAttrs(attrType: Constructor<PostBattleAbAttr>,
pokemon: Pokemon, ...args: any[]): Promise<void> { pokemon: Pokemon, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostBattleAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, args), args); return applyAbAttrsInternal<PostBattleAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, args), args);
} }
export function applyPostFaintAbAttrs(attrType: { new(...args: any[]): PostFaintAbAttr }, export function applyPostFaintAbAttrs(attrType: Constructor<PostFaintAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> { pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PostFaintAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, attacker, move, hitResult, args), args); return applyAbAttrsInternal<PostFaintAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, attacker, move, hitResult, args), args);
} }
@ -4807,7 +4816,7 @@ export function initAbilities() {
.conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0) .conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0)
// When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE // When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW) .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW)
.attr(IceFaceMoveImmunityAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE)) .attr(IceFaceBlockPhysicalAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0)
.ignorable(), .ignorable(),
new Ability(Abilities.POWER_SPOT, 8) new Ability(Abilities.POWER_SPOT, 8)
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3), .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3),

View File

@ -17,6 +17,7 @@ import { Abilities } from "#enums/abilities";
import { BattlerTagType } from "#enums/battler-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import i18next from "#app/plugins/i18n.js";
export enum BattlerTagLapseType { export enum BattlerTagLapseType {
FAINT, FAINT,
@ -105,7 +106,7 @@ export class RechargingTag extends BattlerTag {
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
super.lapse(pokemon, lapseType); super.lapse(pokemon, lapseType);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " must\nrecharge!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
pokemon.getMoveQueue().shift(); pokemon.getMoveQueue().shift();
@ -134,7 +135,10 @@ export class TrappedTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` was freed\nfrom ${this.getMoveName()}!`)); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTrappedOnRemove", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName()
}));
} }
getDescriptor(): string { getDescriptor(): string {
@ -146,7 +150,7 @@ export class TrappedTag extends BattlerTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, " can no\nlonger escape!"); return i18next.t("battle:battlerTagsTrappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -169,7 +173,7 @@ export class FlinchedTag extends BattlerTag {
super.lapse(pokemon, lapseType); super.lapse(pokemon, lapseType);
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " flinched!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -218,26 +222,26 @@ export class ConfusedTag extends BattlerTag {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION));
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became\nconfused!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " snapped\nout of confusion!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready confused!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType); const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nconfused!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION));
// 1/3 chance of hitting self with a 40 base power move // 1/3 chance of hitting self with a 40 base power move
@ -245,7 +249,7 @@ export class ConfusedTag extends BattlerTag {
const atk = pokemon.getBattleStat(Stat.ATK); const atk = pokemon.getBattleStat(Stat.ATK);
const def = pokemon.getBattleStat(Stat.DEF); const def = pokemon.getBattleStat(Stat.DEF);
const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100)); const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
pokemon.scene.queueMessage("It hurt itself in its\nconfusion!"); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedLapseHurtItself"));
pokemon.damageAndUpdate(damage); pokemon.damageAndUpdate(damage);
pokemon.battleData.hitCount++; pokemon.battleData.hitCount++;
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
@ -292,14 +296,17 @@ export class DestinyBondTag extends BattlerTag {
return false; return false;
} }
const targetMessage = getPokemonMessage(pokemon, "");
if (pokemon.isBossImmune()) { if (pokemon.isBossImmune()) {
pokemon.scene.queueMessage(`${targetMessage} is unaffected\nby the effects of Destiny Bond.`); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDestinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return false; return false;
} }
pokemon.scene.queueMessage(`${getPokemonMessage(source, ` took\n${targetMessage} down with it!`)}`); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsDestinyBondLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(source),
pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon)
})
);
pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true);
return false; return false;
} }
@ -317,24 +324,34 @@ export class InfatuatedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` fell in love\nwith ${pokemon.scene.getPokemonById(this.sourceId).name}!`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsInfatuatedOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name
})
);
} }
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready in love!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is in love\nwith ${pokemon.scene.getPokemonById(this.sourceId).name}!`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsInfatuatedLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name
})
);
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT));
if (pokemon.randSeedInt(2)) { if (pokemon.randSeedInt(2)) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nimmobilized by love!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
} }
} }
@ -345,7 +362,7 @@ export class InfatuatedTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " got over\nits infatuation.")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
isSourceLinked(): boolean { isSourceLinked(): boolean {
@ -380,7 +397,7 @@ export class SeedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was seeded!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSeededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex();
} }
@ -400,7 +417,7 @@ export class SeedTag extends BattlerTag {
const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false);
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(),
!reverseDrain ? damage : damage * -1, !reverseDrain ? damage : damage * -1,
!reverseDrain ? getPokemonMessage(pokemon, "'s health is\nsapped by Leech Seed!") : getPokemonMessage(source, "'s Leech Seed\nsucked up the liquid ooze!"), !reverseDrain ? i18next.t("battle:battlerTagsSeededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battle:battlerTagsSeededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }),
false, true)); false, true));
} }
} }
@ -422,20 +439,20 @@ export class NightmareTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " began\nhaving a Nightmare!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready locked in a Nightmare!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is locked\nin a Nightmare!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type
const cancelled = new Utils.BooleanHolder(false); const cancelled = new Utils.BooleanHolder(false);
@ -527,7 +544,7 @@ export class EncoreTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " got\nan Encore!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon);
if (movePhase) { if (movePhase) {
@ -543,7 +560,7 @@ export class EncoreTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s Encore\nended!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -553,7 +570,12 @@ export class HelpingHandTag extends BattlerTag {
} }
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
pokemon.scene.queueMessage(getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` is ready to\nhelp ${pokemon.name}!`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsHelpingHandOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)),
pokemonName: pokemon.name
})
);
} }
} }
@ -581,15 +603,22 @@ export class IngrainTag extends TrappedTag {
const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), pokemon.scene.unshiftPhase(
getPokemonMessage(pokemon, " absorbed\nnutrients with its roots!"), true)); new PokemonHealPhase(
pokemon.scene,
pokemon.getBattlerIndex(),
Math.floor(pokemon.getMaxHp() / 16),
i18next.t("battle:battlerTagsIngrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }),
true
)
);
} }
return ret; return ret;
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, " planted its roots!"); return i18next.t("battle:battlerTagsIngrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
getDescriptor(): string { getDescriptor(): string {
@ -605,15 +634,23 @@ export class AquaRingTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " surrounded\nitself with a veil of water!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsAquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.scene.unshiftPhase(
Math.floor(pokemon.getMaxHp() / 16), `${this.getMoveName()} restored\n${pokemon.name}\'s HP!`, true)); new PokemonHealPhase(
pokemon.scene,
pokemon.getBattlerIndex(),
Math.floor(pokemon.getMaxHp() / 16),
i18next.t("battle:battlerTagsAquaRingLapse", {
moveName: this.getMoveName(),
pokemonName: pokemon.name
}),
true));
} }
return ret; return ret;
@ -659,7 +696,7 @@ export class DrowsyTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " grew drowsy!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDrowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -702,7 +739,12 @@ export abstract class DamagingTrapTag extends TrappedTag {
const ret = super.lapse(pokemon, lapseType); const ret = super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby ${this.getMoveName()}!`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsDamagingTrapLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName()
})
);
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, this.commonAnim)); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, this.commonAnim));
const cancelled = new Utils.BooleanHolder(false); const cancelled = new Utils.BooleanHolder(false);
@ -723,7 +765,11 @@ export class BindTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, ` was squeezed by\n${pokemon.scene.getPokemonById(this.sourceId).name}'s ${this.getMoveName()}!`); return i18next.t("battle:battlerTagsBindOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name,
moveName: this.getMoveName()
});
} }
} }
@ -733,7 +779,10 @@ export class WrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, ` was Wrapped\nby ${pokemon.scene.getPokemonById(this.sourceId).name}!`); return i18next.t("battle:battlerTagsWrapOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name
});
} }
} }
@ -743,7 +792,7 @@ export abstract class VortexTrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, " was trapped\nin the vortex!"); return i18next.t("battle:battlerTagsVortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -765,7 +814,10 @@ export class ClampTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` Clamped\n${pokemon.name}!`); return i18next.t("battle:battlerTagsClampOnTrap", {
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)),
pokemonName: pokemon.name,
});
} }
} }
@ -775,7 +827,10 @@ export class SandTombTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, ` became trapped\nby ${this.getMoveName()}!`); return i18next.t("battle:battlerTagsSandTombOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName()
});
} }
} }
@ -785,7 +840,7 @@ export class MagmaStormTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, " became trapped\nby swirling magma!"); return i18next.t("battle:battlerTagsMagmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -795,7 +850,7 @@ export class SnapTrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, " got trapped\nby a snap trap!"); return i18next.t("battle:battlerTagsSnapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -805,7 +860,10 @@ export class ThunderCageTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped\n${getPokemonNameWithAffix(pokemon)}!`); return i18next.t("battle:battlerTagsThunderCageOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId))
});
} }
} }
@ -815,7 +873,10 @@ export class InfestationTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, ` has been afflicted \nwith an infestation by ${getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId))}!`); return i18next.t("battle:battlerTagsInfestationOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId))
});
} }
} }
@ -828,13 +889,13 @@ export class ProtectedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, "\nprotected itself!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.CUSTOM) { if (lapseType === BattlerTagLapseType.CUSTOM) {
new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene); new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, "\nprotected itself!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -959,12 +1020,12 @@ export class EnduringTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " braced\nitself!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.CUSTOM) { if (lapseType === BattlerTagLapseType.CUSTOM) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " endured\nthe hit!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -979,7 +1040,7 @@ export class SturdyTag extends BattlerTag {
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.CUSTOM) { if (lapseType === BattlerTagLapseType.CUSTOM) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " endured\nthe hit!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -1000,7 +1061,12 @@ export class PerishSongTag extends BattlerTag {
const ret = super.lapse(pokemon, lapseType); const ret = super.lapse(pokemon, lapseType);
if (ret) { if (ret) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, `\'s perish count fell to ${this.turnCount}.`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsPerishSongLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
turnCount: this.turnCount
})
);
} else { } else {
pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true);
} }
@ -1071,7 +1137,7 @@ export class TruantTag extends AbilityBattlerTag {
if (lastMove && lastMove.move !== Moves.NONE) { if (lastMove && lastMove.move !== Moves.NONE) {
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive));
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nloafing around!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTruantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
return true; return true;
@ -1086,7 +1152,7 @@ export class SlowStartTag extends AbilityBattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " can't\nget it going!"), null, false, null, true); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true);
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1100,7 +1166,7 @@ export class SlowStartTag extends AbilityBattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " finally\ngot its act together!"), null, false, null); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null);
} }
} }
@ -1146,13 +1212,13 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
break; break;
} }
pokemon.scene.queueMessage(getPokemonMessage(pokemon, `'s ${getStatName(highestStat)}\nwas heightened!`), null, false, null, true); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true);
} }
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(`The effects of ${getPokemonMessage(pokemon, `'s\n${allAbilities[this.ability].name} wore off!`)}`); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name }));
} }
} }
@ -1286,7 +1352,7 @@ export class CritBoostTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is getting\npumped!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1296,7 +1362,7 @@ export class CritBoostTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " relaxed.")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -1331,7 +1397,7 @@ export class SaltCuredTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is being salt cured!")); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSaltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex();
} }
@ -1348,7 +1414,12 @@ export class SaltCuredTag extends BattlerTag {
const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER);
pokemon.damageAndUpdate(Math.max(Math.floor(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), 1)); pokemon.damageAndUpdate(Math.max(Math.floor(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), 1));
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by ${this.getMoveName()}!`)); pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsSaltCuredLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName()
})
);
} }
} }
@ -1374,8 +1445,6 @@ export class CursedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " has been cursed!"));
this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex();
} }
@ -1390,7 +1459,7 @@ export class CursedTag extends BattlerTag {
if (!cancelled.value) { if (!cancelled.value) {
pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 4), 1)); pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 4), 1));
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by the ${this.getMoveName()}!`)); pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }

View File

@ -12,6 +12,7 @@ import { pokemonFormChanges } from "./pokemon-forms";
import { Challenges } from "#enums/challenges"; import { Challenges } from "#enums/challenges";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import { TypeColor, TypeShadow } from "#app/enums/color.js";
/** /**
* An enum for all the challenge types. The parameter entries on these describe the * An enum for all the challenge types. The parameter entries on these describe the
@ -160,7 +161,7 @@ export abstract class Challenge {
if (overrideValue === undefined) { if (overrideValue === undefined) {
overrideValue = this.value; overrideValue = this.value;
} }
return i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`); return `${i18next.t("challenges:usePokemon")}${i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`)}`;
} }
/** /**
@ -347,6 +348,37 @@ export class SingleGenerationChallenge extends Challenge {
return this.value > 0 ? 1 : 0; return this.value > 0 ? 1 : 0;
} }
/**
* Returns the textual representation of a challenge's current value.
* @param {value} overrideValue The value to check for. If undefined, gets the current value.
* @returns {string} The localised name for the current value.
*/
getValue(overrideValue?: integer): string {
if (overrideValue === undefined) {
overrideValue = this.value;
}
if (this.value === 0) {
return i18next.t("settings:off");
}
return i18next.t(`starterSelectUiHandler:gen${this.value}`);
}
/**
* Returns the description of a challenge's current value.
* @param {value} overrideValue The value to check for. If undefined, gets the current value.
* @returns {string} The localised description for the current value.
*/
getDescription(overrideValue?: integer): string {
if (overrideValue === undefined) {
overrideValue = this.value;
}
if (this.value === 0) {
return i18next.t("challenges:singleGeneration.desc_default");
}
return i18next.t("challenges:singleGeneration.desc", { gen: i18next.t(`challenges:singleGeneration.gen_${this.value}`) });
}
static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge { static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge {
const newChallenge = new SingleGenerationChallenge(); const newChallenge = new SingleGenerationChallenge();
newChallenge.value = source.value; newChallenge.value = source.value;
@ -438,6 +470,34 @@ export class SingleTypeChallenge extends Challenge {
return this.value > 0 ? 1 : 0; return this.value > 0 ? 1 : 0;
} }
/**
* Returns the textual representation of a challenge's current value.
* @param {value} overrideValue The value to check for. If undefined, gets the current value.
* @returns {string} The localised name for the current value.
*/
getValue(overrideValue?: integer): string {
if (overrideValue === undefined) {
overrideValue = this.value;
}
return Type[this.value - 1].toLowerCase();
}
/**
* Returns the description of a challenge's current value.
* @param {value} overrideValue The value to check for. If undefined, gets the current value.
* @returns {string} The localised description for the current value.
*/
getDescription(overrideValue?: integer): string {
if (overrideValue === undefined) {
overrideValue = this.value;
}
const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`);
const typeColor = `[color=${TypeColor[Type[this.value-1]]}][shadow=${TypeShadow[Type[this.value-1]]}]${type}[/shadow][/color]`;
const defaultDesc = i18next.t("challenges:singleType.desc_default");
const typeDesc = i18next.t("challenges:singleType.desc", {type: typeColor});
return this.value === 0 ? defaultDesc : typeDesc;
}
static loadChallenge(source: SingleTypeChallenge | any): SingleTypeChallenge { static loadChallenge(source: SingleTypeChallenge | any): SingleTypeChallenge {
const newChallenge = new SingleTypeChallenge(); const newChallenge = new SingleTypeChallenge();
newChallenge.value = source.value; newChallenge.value = source.value;

View File

@ -2,10 +2,11 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./
import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases";
import { BattleStat, getBattleStatName } from "./battle-stat"; import { BattleStat, getBattleStatName } from "./battle-stat";
import { EncoreTag } from "./battler-tags"; import { EncoreTag } from "./battler-tags";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages";
import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon";
import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect";
import { Type } from "./type"; import { Type } from "./type";
import { Constructor } from "#app/utils";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { WeatherType } from "./weather"; import { WeatherType } from "./weather";
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
@ -156,7 +157,7 @@ export default class Move implements Localizable {
* @param attrType any attribute that extends {@linkcode MoveAttr} * @param attrType any attribute that extends {@linkcode MoveAttr}
* @returns Array of attributes that match `attrType`, Empty Array if none match. * @returns Array of attributes that match `attrType`, Empty Array if none match.
*/ */
getAttrs<T extends MoveAttr>(attrType: new(...args: any[]) => T): T[] { getAttrs<T extends MoveAttr>(attrType: Constructor<T>): T[] {
return this.attrs.filter((a): a is T => a instanceof attrType); return this.attrs.filter((a): a is T => a instanceof attrType);
} }
@ -165,7 +166,7 @@ export default class Move implements Localizable {
* @param attrType any attribute that extends {@linkcode MoveAttr} * @param attrType any attribute that extends {@linkcode MoveAttr}
* @returns true if the move has attribute `attrType` * @returns true if the move has attribute `attrType`
*/ */
hasAttr<T extends MoveAttr>(attrType: new(...args: any[]) => T): boolean { hasAttr<T extends MoveAttr>(attrType: Constructor<T>): boolean {
return this.attrs.some((attr) => attr instanceof attrType); return this.attrs.some((attr) => attr instanceof attrType);
} }
@ -185,7 +186,7 @@ export default class Move implements Localizable {
* @param args the args needed to instantiate a the given class * @param args the args needed to instantiate a the given class
* @returns the called object {@linkcode Move} * @returns the called object {@linkcode Move}
*/ */
attr<T extends new (...args: any[]) => MoveAttr>(AttrType: T, ...args: ConstructorParameters<T>): this { attr<T extends Constructor<MoveAttr>>(AttrType: T, ...args: ConstructorParameters<T>): this {
const attr = new AttrType(...args); const attr = new AttrType(...args);
this.attrs.push(attr); this.attrs.push(attr);
let attrCondition = attr.getCondition(); let attrCondition = attr.getCondition();
@ -3963,6 +3964,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
return -3; return -3;
case BattlerTagType.ENCORE: case BattlerTagType.ENCORE:
return -2; return -2;
case BattlerTagType.MINIMIZED:
return 0;
case BattlerTagType.INGRAIN: case BattlerTagType.INGRAIN:
case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.IGNORE_ACCURACY:
case BattlerTagType.AQUA_RING: case BattlerTagType.AQUA_RING:
@ -3994,7 +3997,13 @@ export class CurseAttr extends MoveEffectAttr {
} }
const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2));
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand laid a curse on the ${target.name}!`)); user.scene.queueMessage(
i18next.t("battle:battlerTagsCursedOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(user),
pokemonName: target.name
})
);
target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); target.addTag(BattlerTagType.CURSED, 0, move.id, user.id);
return true; return true;
} else { } else {
@ -5283,7 +5292,16 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr {
} }
} }
/**
* Attribute used for moves that suppress abilities like {@linkcode Moves.GASTRO_ACID}.
* A suppressed ability cannot be activated.
*
* @extends MoveEffectAttr
* @see {@linkcode apply}
* @see {@linkcode getCondition}
*/
export class SuppressAbilitiesAttr extends MoveEffectAttr { export class SuppressAbilitiesAttr extends MoveEffectAttr {
/** Sets ability suppression for the target pokemon and displays a message. */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) { if (!super.apply(user, target, move, args)) {
return false; return false;
@ -5296,8 +5314,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr {
return true; return true;
} }
/** Causes the effect to fail when the target's ability is unsupressable or already suppressed. */
getCondition(): MoveConditionFunc { getCondition(): MoveConditionFunc {
return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr); return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !target.summonData.abilitySuppressed;
} }
} }
@ -5312,7 +5331,7 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr {
* abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move. * abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move.
* *
* @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not * @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not
* yet moved or if the target's abiilty is un-suppressable. * yet moved or if the suppression failed to apply.
*/ */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) { if (!super.apply(user, target, move, args)) {
@ -5491,7 +5510,7 @@ function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon, targe
}); });
} }
export function applyMoveAttrs(attrType: { new(...args: any[]): MoveAttr }, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise<void> { export function applyMoveAttrs(attrType: Constructor<MoveAttr>, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise<void> {
return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args);
} }
@ -7982,6 +8001,7 @@ export function initMoves() {
new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8)
.attr(RecoilAttr, true, 0.5), .attr(RecoilAttr, true, 0.5),
new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8)
.makesContact(false)
.attr(FlinchAttr), .attr(FlinchAttr),
new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true)

View File

@ -3,6 +3,7 @@ import Pokemon from "../field/pokemon";
import { SpeciesFormKey } from "./pokemon-species"; import { SpeciesFormKey } from "./pokemon-species";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import { MoveCategory, allMoves } from "./move"; import { MoveCategory, allMoves } from "./move";
import { Constructor } from "#app/utils";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
@ -178,7 +179,7 @@ export class SpeciesFormChange {
return true; return true;
} }
findTrigger(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): SpeciesFormChangeTrigger { findTrigger(triggerType: Constructor<SpeciesFormChangeTrigger>): SpeciesFormChangeTrigger {
if (!this.trigger.hasTriggerType(triggerType)) { if (!this.trigger.hasTriggerType(triggerType)) {
return null; return null;
} }
@ -208,7 +209,7 @@ export abstract class SpeciesFormChangeTrigger {
return true; return true;
} }
hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { hasTriggerType(triggerType: Constructor<SpeciesFormChangeTrigger>): boolean {
return this instanceof triggerType; return this instanceof triggerType;
} }
} }
@ -236,7 +237,7 @@ export class SpeciesFormChangeCompoundTrigger {
return true; return true;
} }
hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { hasTriggerType(triggerType: Constructor<SpeciesFormChangeTrigger>): boolean {
return !!this.triggers.find(t => t.hasTriggerType(triggerType)); return !!this.triggers.find(t => t.hasTriggerType(triggerType));
} }
} }

83
src/enums/color.ts Normal file
View File

@ -0,0 +1,83 @@
export enum Color {
WHITE = "#ffffff",
OFF_WHITE = "#f8f8f8",
LIGHT_GREY = "#a0a0a0",
GREY = "#484848",
DARK_GREY = "#404040",
PINK = "#f89890",
RED = "#e13d3d",
RED2 = "#e70808",
REDORANGE = "#d64b00",
ORANGE = "#f8b050",
LIGHT_YELLOW = "#e8e8a8",
YELLOW = "#ccbe00",
DARK_YELLOW = "#a68e17",
GREEN = "#78c850",
BLUE = "#40c8f8",
COMMON = "#ffffff",
GREAT = "#3890f8",
ULTRA = "#f8d038",
ROGUE = "#d52929",
MASTER = "#e020c0",
LUXURY = "#e64a18"
}
export enum TypeColor {
NORMAL = "#ADA594",
FIGHTING = "#A55239",
FLYING = "#9CADF7",
POISON = "#9141CB",
GROUND = "#AE7A3B",
ROCK = "#BDA55A",
BUG = "#ADBD21",
GHOST = "#6363B5",
STEEL = "#81A6BE",
FIRE = "#F75231",
WATER = "#399CFF",
GRASS = "#7BCE52",
ELECTRIC = "#FFC631",
PSYCHIC = "#EF4179",
ICE = "#5ACEE7",
DRAGON = "#7B63E7",
DARK = "#735A4A",
FAIRY = "#EF70EF",
}
export enum TypeShadow {
NORMAL = "#574F4A",
FIGHTING = "#4E637C",
FLYING = "#4E637C",
POISON = "#352166",
GROUND = "#572D1E",
ROCK = "#5F442D",
BUG = "#5F5010",
GHOST = "#323D5B",
STEEL = "#415C5F",
FIRE = "#7C1818",
WATER = "#1C4E80",
GRASS = "#4F6729",
ELECTRIC = "#804618",
PSYCHIC = "#782155",
ICE = "#2D5C74",
DRAGON = "#313874",
DARK = "#392725",
FAIRY = "#663878",
}
export enum ShadowColor {
GREY = "#636363",
PURPLE = "#6b5a73",
LIGHT_GREY = "#d0d0c8",
BROWN = "#69402a",
PINK = "#fca2a2",
BRIGHT_RED = "#f83018",
RED = "#984038",
MAROON = "#632929",
GREEN = "#306850",
BLUE = "#006090",
LIGHT_YELLOW = "#ded6b5",
YELLOW = "#ebd773",
DARK_YELLOW = "#a0a060",
ORANGE = "#c07800",
LIGHT_ORANGE = "#ffbd73",
}

View File

@ -71,11 +71,18 @@ export class TagAddedEvent extends ArenaEvent {
public arenaTagType: ArenaTagType; public arenaTagType: ArenaTagType;
/** The {@linkcode ArenaTagSide} the tag is being placed on */ /** The {@linkcode ArenaTagSide} the tag is being placed on */
public arenaTagSide: ArenaTagSide; public arenaTagSide: ArenaTagSide;
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number) { /** The current number of layers of the arena trap. */
public arenaTagLayers: number;
/** The maximum amount of layers of the arena trap. */
public arenaTagMaxLayers: number;
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number, arenaTagLayers?: number, arenaTagMaxLayers?: number) {
super(ArenaEventType.TAG_ADDED, duration); super(ArenaEventType.TAG_ADDED, duration);
this.arenaTagType = arenaTagType; this.arenaTagType = arenaTagType;
this.arenaTagSide = arenaTagSide; this.arenaTagSide = arenaTagSide;
this.arenaTagLayers = arenaTagLayers;
this.arenaTagMaxLayers = arenaTagMaxLayers;
} }
} }
/** /**

View File

@ -1,5 +1,6 @@
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { BiomePoolTier, PokemonPools, BiomeTierTrainerPools, biomePokemonPools, biomeTrainerPools } from "../data/biomes"; import { BiomePoolTier, PokemonPools, BiomeTierTrainerPools, biomePokemonPools, biomeTrainerPools } from "../data/biomes";
import { Constructor } from "#app/utils";
import * as Utils from "../utils"; import * as Utils from "../utils";
import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species"; import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species";
import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather"; import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather";
@ -7,7 +8,7 @@ import { CommonAnimPhase } from "../phases";
import { CommonAnim } from "../data/battle-anims"; import { CommonAnim } from "../data/battle-anims";
import { Type } from "../data/type"; import { Type } from "../data/type";
import Move from "../data/move"; import Move from "../data/move";
import { ArenaTag, ArenaTagSide, getArenaTag } from "../data/arena-tag"; import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "../data/arena-tag";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import { Terrain, TerrainType } from "../data/terrain"; import { Terrain, TerrainType } from "../data/terrain";
import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability";
@ -535,7 +536,7 @@ export class Arena {
this.ignoreAbilities = ignoreAbilities; this.ignoreAbilities = ignoreAbilities;
} }
applyTagsForSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide, ...args: any[]): void { applyTagsForSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide, ...args: unknown[]): void {
let tags = typeof tagType === "string" let tags = typeof tagType === "string"
? this.tags.filter(t => t.tagType === tagType) ? this.tags.filter(t => t.tagType === tagType)
: this.tags.filter(t => t instanceof tagType); : this.tags.filter(t => t instanceof tagType);
@ -545,7 +546,7 @@ export class Arena {
tags.forEach(t => t.apply(this, args)); tags.forEach(t => t.apply(this, args));
} }
applyTags(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, ...args: any[]): void { applyTags(tagType: ArenaTagType | Constructor<ArenaTag>, ...args: unknown[]): void {
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
} }
@ -553,6 +554,12 @@ export class Arena {
const existingTag = this.getTagOnSide(tagType, side); const existingTag = this.getTagOnSide(tagType, side);
if (existingTag) { if (existingTag) {
existingTag.onOverlap(this); existingTag.onOverlap(this);
if (existingTag instanceof ArenaTrapTag) {
const { tagType, side, turnCount, layers, maxLayers } = existingTag as ArenaTrapTag;
this.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers));
}
return false; return false;
} }
@ -560,16 +567,18 @@ export class Arena {
this.tags.push(newTag); this.tags.push(newTag);
newTag.onAdd(this, quiet); newTag.onAdd(this, quiet);
this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount)); const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {};
this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers));
return true; return true;
} }
getTag(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }): ArenaTag { getTag(tagType: ArenaTagType | Constructor<ArenaTag>): ArenaTag {
return this.getTagOnSide(tagType, ArenaTagSide.BOTH); return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
} }
getTagOnSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide): ArenaTag { getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag {
return typeof(tagType) === "string" return typeof(tagType) === "string"
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
: this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));

View File

@ -5,6 +5,7 @@ import { variantData } from "#app/data/variant";
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move"; import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
import { Constructor } from "#app/utils";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
import { getLevelTotalExp } from "../data/exp"; import { getLevelTotalExp } from "../data/exp";
@ -1064,7 +1065,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param {boolean} ignoreOverride If true, it ignores ability changing effects * @param {boolean} ignoreOverride If true, it ignores ability changing effects
* @returns {boolean} Whether an ability with that attribute is present and active * @returns {boolean} Whether an ability with that attribute is present and active
*/ */
hasAbilityWithAttr(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): boolean { hasAbilityWithAttr(attrType: Constructor<AbAttr>, canApply: boolean = true, ignoreOverride?: boolean): boolean {
if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) { if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) {
return true; return true;
} }
@ -2104,7 +2105,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return false; return false;
} }
getTag(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag { getTag(tagType: BattlerTagType | Constructor<BattlerTag>): BattlerTag {
if (!this.summonData) { if (!this.summonData) {
return null; return null;
} }
@ -2120,7 +2121,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.summonData.tags.find(t => tagFilter(t)); return this.summonData.tags.find(t => tagFilter(t));
} }
getTags(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag[] { getTags(tagType: BattlerTagType | Constructor<BattlerTag>): BattlerTag[] {
if (!this.summonData) { if (!this.summonData) {
return []; return [];
} }
@ -3504,6 +3505,10 @@ export class EnemyPokemon extends Pokemon {
const target = this.scene.getField()[mt]; const target = this.scene.getField()[mt];
let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1);
if (Number.isNaN(targetScore)) {
console.error(`Move ${move.name} returned score of NaN`);
targetScore = 0;
}
if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) { if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) {
targetScore = -20; targetScore = -20;
} else if (move instanceof AttackMove) { } else if (move instanceof AttackMove) {

View File

@ -278,7 +278,7 @@ export class QuietFormChangePhase extends BattlePhase {
} }
end(): void { end(): void {
if (this.pokemon.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) {
this.scene.playBgm(); this.scene.playBgm();
this.pokemon.summonData.battleStats = [ 0, 0, 0, 0, 0, 0, 0 ]; this.pokemon.summonData.battleStats = [ 0, 0, 0, 0, 0, 0, 0 ];
this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true));

View File

@ -2,6 +2,9 @@ export interface Localizable {
localize(): void; localize(): void;
} }
export interface TranslationEntries {
[key: string]: string | { [key: string]: string }
}
export interface SimpleTranslationEntries { export interface SimpleTranslationEntries {
[key: string]: string [key: string]: string
} }

View File

@ -71,4 +71,61 @@ export const battle: SimpleTranslationEntries = {
"statSeverelyFell": "sinkt drastisch", "statSeverelyFell": "sinkt drastisch",
"statWontGoAnyLower": "kann nicht weiter sinken", "statWontGoAnyLower": "kann nicht weiter sinken",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} ist zurückgeschreckt und kann nicht handeln!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} wurde verwirrt!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verwirrt!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verwirrt!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} ist verwirrt!",
"battlerTagsConfusedLapseHurtItself": "Es hat sich vor Verwirrung selbst verletzt!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} ist immun gegen den Effekt von Abgangsbund!",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} nimmt {{pokemonNameWithAffix2}} mit sich!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} hat sich in {{sourcePokemonName}} verliebt!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verliebt.",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} ist in {{sourcePokemonName}} verliebt!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} ist starr vor Liebe!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verliebt!",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} wurde bepflanzt!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}} wurden durch Egelsamen KP geraubt!",
"battlerTagsSeededLapseShed": "Egelsamen von {{pokemonNameWithAffix}} saugt Kloakensoße auf!",
"battlerTagsNightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!",
"battlerTagsNightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} gibt eine Zugabe",
"battlerTagsEncoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} pflanzt seine Wurzeln!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} umgibt sich mit einem Wasserring!",
"battlerTagsAquaRingLapse": "{{moveName}} füllt KP von {{pokemonName}} wieder auf!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} wurde schläfrig gemacht!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} wurde durch {{moveName}} von {{sourcePokemonName}} gequetscht!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} wurde von {{sourcePokemonName}} umwickelt!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} wird in dem Strudel gefangen!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} wurde von {{pokemonName}} geschnappt!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} wurde von {{moveName}} gefangen!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} wurde in wirbelndem Magma eingeschlossen!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} wurde durch Sandgrab gefangen!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} hat {{pokemonNameWithAffix}} gefangen!",
"battlerTagsInfestationOnTrap": "{{sourcePokemonNameWithAffix}} plagt {{pokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}} schützt sich selbst!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}} schützt sich selbst!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} sammelt sich, um die nächste Attacke zu überstehen!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!",
"battlerTagsPerishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} faulenzt!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!",
"battlerTagsHighestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!",
"battlerTagsHighestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!"
} as const; } as const;

View File

@ -1,67 +1,26 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Herausforderungsmodifikatoren", "title": "Herausforderungsmodifikatoren",
"confirm_start": "Mit diesen Modifikatoren fortfahren?", "illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!",
"singleGeneration.name": "Mono-Generation", "singleGeneration": {
"singleGeneration.value.0": "Aus", "name": "Mono-Generation",
"singleGeneration.desc.0": "Du kannst nur Pokémon aus der gewählten Generation verwenden.", "desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.",
"singleGeneration.value.1": "Generation 1", "desc_default": "Du kannst nur Pokémon gewählten Generation verwenden.",
"singleGeneration.desc.1": "Du kannst nur Pokémon aus der ersten Generation verwenden.", "gen_1": "ersten",
"singleGeneration.value.2": "Generation 2", "gen_2": "zweiten",
"singleGeneration.desc.2": "Du kannst nur Pokémon aus der zweiten Generation verwenden.", "gen_3": "dritten",
"singleGeneration.value.3": "Generation 3", "gen_4": "vierten",
"singleGeneration.desc.3": "Du kannst nur Pokémon aus der dritten Generation verwenden.", "gen_5": "fünften",
"singleGeneration.value.4": "Generation 4", "gen_6": "sechsten",
"singleGeneration.desc.4": "Du kannst nur Pokémon aus der vierten Generation verwenden.", "gen_7": "siebten",
"singleGeneration.value.5": "Generation 5", "gen_8": "achten",
"singleGeneration.desc.5": "Du kannst nur Pokémon aus der fünften Generation verwenden.", "gen_9": "neunten",
"singleGeneration.value.6": "Generation 6", },
"singleGeneration.desc.6": "Du kannst nur Pokémon aus der sechsten Generation verwenden.", "singleType": {
"singleGeneration.value.7": "Generation 7", "name": "Mono-Typ",
"singleGeneration.desc.7": "Du kannst nur Pokémon aus der siebten Generation verwenden.", "desc": "Du kannst nur Pokémon des Typs {{type}} verwenden.",
"singleGeneration.value.8": "Generation 8", "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden."
"singleGeneration.desc.8": "Du kannst nur Pokémon aus der achten Generation verwenden.", // types in pokemon-info
"singleGeneration.value.9": "Generation 9", },
"singleGeneration.desc.9": "Du kannst nur Pokémon aus der neunten Generation verwenden.",
"singleType.name": "Mono-Typ",
"singleType.value.0": "Aus",
"singleType.desc.0": "Du kannst nur Pokémon des gewählten Typs verwenden.",
"singleType.value.1": "Normal",
"singleType.desc.1": "Du kannst nur Pokémon des Typs Normal verwenden.",
"singleType.value.2": "Kampf",
"singleType.desc.2": "Du kannst nur Pokémon des Typs Kampf verwenden.",
"singleType.value.3": "Flug",
"singleType.desc.3": "Du kannst nur Pokémon des Typs Flug verwenden.",
"singleType.value.4": "Gift",
"singleType.desc.4": "Du kannst nur Pokémon des Typs Gift verwenden.",
"singleType.value.5": "Boden",
"singleType.desc.5": "Du kannst nur Pokémon des Typs Boden verwenden.",
"singleType.value.6": "Gestein",
"singleType.desc.6": "Du kannst nur Pokémon des Typs Gestein verwenden.",
"singleType.value.7": "Käfer",
"singleType.desc.7": "Du kannst nur Pokémon des Typs Käfer verwenden.",
"singleType.value.8": "Geist",
"singleType.desc.8": "Du kannst nur Pokémon des Typs Geist verwenden.",
"singleType.value.9": "Stahl",
"singleType.desc.9": "Du kannst nur Pokémon des Typs Stahl verwenden.",
"singleType.value.10": "Feuer",
"singleType.desc.10": "Du kannst nur Pokémon des Typs Feuer verwenden.",
"singleType.value.11": "Wasser",
"singleType.desc.11": "Du kannst nur Pokémon des Typs Wasser verwenden.",
"singleType.value.12": "Pflanze",
"singleType.desc.12": "Du kannst nur Pokémon des Typs Pflanze verwenden.",
"singleType.value.13": "Elektro",
"singleType.desc.13": "Du kannst nur Pokémon des Typs Elektro verwenden.",
"singleType.value.14": "Psycho",
"singleType.desc.14": "Du kannst nur Pokémon des Typs Psycho verwenden.",
"singleType.value.15": "Eis",
"singleType.desc.15": "Du kannst nur Pokémon des Typs Eis verwenden.",
"singleType.value.16": "Drache",
"singleType.desc.16": "Du kannst nur Pokémon des Typs Drache verwenden.",
"singleType.value.17": "Unlicht",
"singleType.desc.17": "Du kannst nur Pokémon des Typs Unlicht verwenden.",
"singleType.value.18": "Fee",
"singleType.desc.18": "Du kannst nur Pokémon des Typs Fee verwenden."
} as const; } as const;

5
src/locales/de/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Start",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/de/settings.js"; import { settings } from "#app/locales/de/settings.js";
import { common } from "#app/locales/de/common.js";
export const deConfig = { export const deConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const deConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -9,9 +9,9 @@ export const settings: SimpleTranslationEntries = {
"gamepad": "Controller", "gamepad": "Controller",
"keyboard": "Tastatur", "keyboard": "Tastatur",
"gameSpeed": "Spielgeschwindigkeit", "gameSpeed": "Spielgeschwindigkeit",
"hpBarSpeed": "KP-Balken Geschwindigkeit", "hpBarSpeed": "KP-Balken Geschw.",
"expGainsSpeed": "EXP-Balken Geschwindigkeit", "expGainsSpeed": "EP-Balken Geschw.",
"expPartyDisplay": "Team-EXP anzeigen", "expPartyDisplay": "Team-EP anzeigen",
"skipSeenDialogues": "Gesehenen Dialog überspringen", "skipSeenDialogues": "Gesehenen Dialog überspringen",
"battleStyle": "Kampfstil", "battleStyle": "Kampfstil",
"enableRetries": "Erneut versuchen aktivieren", "enableRetries": "Erneut versuchen aktivieren",
@ -22,7 +22,7 @@ export const settings: SimpleTranslationEntries = {
"fast": "Schnell", "fast": "Schnell",
"faster": "Schneller", "faster": "Schneller",
"skip": "Überspringen", "skip": "Überspringen",
"levelUpNotifications": "Auflevelbenachrichtigung", "levelUpNotifications": "Nur Lvl.-Up",
"on": "An", "on": "An",
"off": "Aus", "off": "Aus",
"switch": "Wechsel", "switch": "Wechsel",
@ -58,18 +58,18 @@ export const settings: SimpleTranslationEntries = {
"consistent": "Konistent", "consistent": "Konistent",
"mixedAnimated": "Gemischt animiert", "mixedAnimated": "Gemischt animiert",
"fusionPaletteSwaps": "Fusion-Farbpalettenwechsel", "fusionPaletteSwaps": "Fusion-Farbpalettenwechsel",
"playerGender": "Spieler Geschlecht", "playerGender": "Spielergeschlecht",
"typeHints": "Typhinweise", "typeHints": "Typhinweise",
"masterVolume": "Gesamtlautstärke", "masterVolume": "Gesamtlautstärke",
"bgmVolume": "Hintergrundmusik", "bgmVolume": "Hintergrundmusik",
"seVolume": "Spezialeffekte", "seVolume": "Spezialeffekte",
"musicPreference": "Musik Präferenz", "musicPreference": "Musik Präferenz",
"mixed": "Gemisch", "mixed": "Gemischt",
"gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken", "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.",
"delete": "Löschen", "delete": "Löschen",
"keyboardPleasePress": "Bitte eine Taste auf der Tastatur drücken", "keyboardPleasePress": "Bitte eine Taste auf der Tastatur drücken.",
"reset": "Zurücksetzen", "reset": "Reset",
"requireReload": "Neuladen benötigt", "requireReload": "Neuladen",
"action": "Aktion", "action": "Aktion",
"back": "Zurück", "back": "Zurück",
"pressToBind": "Zum Zuweisen drücken", "pressToBind": "Zum Zuweisen drücken",
@ -92,7 +92,7 @@ export const settings: SimpleTranslationEntries = {
"buttonSpeedUp": "Beschleunigen", "buttonSpeedUp": "Beschleunigen",
"buttonSlowDown": "Verlangsamen", "buttonSlowDown": "Verlangsamen",
"alt": " (Alt)", "alt": " (Alt)",
"mute": "Mute", "mute": "Stumm",
"controller": "Controller", "controller": "Controller",
"gamepadSupport": "Gamepad Support" "gamepadSupport": "Controllerunterstützung",
} as const; } as const;

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Passiv:", "passive": "Passiv:",
"nature": "Wesen:", "nature": "Wesen:",
"eggMoves": "Ei-Attacken", "eggMoves": "Ei-Attacken",
"start": "Start",
"addToParty": "Zum Team hinzufügen", "addToParty": "Zum Team hinzufügen",
"toggleIVs": "DVs anzeigen/verbergen", "toggleIVs": "DVs anzeigen/verbergen",
"manageMoves": "Attacken ändern", "manageMoves": "Attacken ändern",

View File

@ -71,4 +71,61 @@ export const battle: SimpleTranslationEntries = {
"statSeverelyFell": "severely fell", "statSeverelyFell": "severely fell",
"statWontGoAnyLower": "won't go any lower", "statWontGoAnyLower": "won't go any lower",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!"
} as const; } as const;

View File

@ -1,67 +1,26 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales.js";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Challenge Modifiers", "title": "Challenge Modifiers",
"start": "Start", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"illegalEvolution": "{{pokemon}} changed into an ineligble pokemon\nfor this challenge!", "singleGeneration": {
"singleGeneration.name": "Mono Gen", "name": "Mono Gen",
"singleGeneration.value.0": "Off", "desc": "You can only use Pokémon from Generation {{gen}}.",
"singleGeneration.desc.0": "You can only use pokemon from the chosen generation.", "desc_default": "You can only use Pokémon from the chosen generation.",
"singleGeneration.value.1": "Gen 1", "gen_1": "one",
"singleGeneration.desc.1": "You can only use pokemon from generation one.", "gen_2": "two",
"singleGeneration.value.2": "Gen 2", "gen_3": "three",
"singleGeneration.desc.2": "You can only use pokemon from generation two.", "gen_4": "four",
"singleGeneration.value.3": "Gen 3", "gen_5": "five",
"singleGeneration.desc.3": "You can only use pokemon from generation three.", "gen_6": "six",
"singleGeneration.value.4": "Gen 4", "gen_7": "seven",
"singleGeneration.desc.4": "You can only use pokemon from generation four.", "gen_8": "eight",
"singleGeneration.value.5": "Gen 5", "gen_9": "nine",
"singleGeneration.desc.5": "You can only use pokemon from generation five.", },
"singleGeneration.value.6": "Gen 6", "singleType": {
"singleGeneration.desc.6": "You can only use pokemon from generation six.", "name": "Mono Type",
"singleGeneration.value.7": "Gen 7", "desc": "You can only use Pokémon with the {{type}} type.",
"singleGeneration.desc.7": "You can only use pokemon from generation seven.", "desc_default": "You can only use Pokémon of the chosen type."
"singleGeneration.value.8": "Gen 8", //types in pokemon-info
"singleGeneration.desc.8": "You can only use pokemon from generation eight.", },
"singleGeneration.value.9": "Gen 9",
"singleGeneration.desc.9": "You can only use pokemon from generation nine.",
"singleType.name": "Mono Type",
"singleType.value.0": "Off",
"singleType.desc.0": "You can only use pokemon of the chosen type.",
"singleType.value.1": "Normal",
"singleType.desc.1": "You can only use pokemon with the Normal type.",
"singleType.value.2": "Fighting",
"singleType.desc.2": "You can only use pokemon with the Fighting type.",
"singleType.value.3": "Flying",
"singleType.desc.3": "You can only use pokemon with the Flying type.",
"singleType.value.4": "Poison",
"singleType.desc.4": "You can only use pokemon with the Poison type.",
"singleType.value.5": "Ground",
"singleType.desc.5": "You can only use pokemon with the Ground type.",
"singleType.value.6": "Rock",
"singleType.desc.6": "You can only use pokemon with the Rock type.",
"singleType.value.7": "Bug",
"singleType.desc.7": "You can only use pokemon with the Bug type.",
"singleType.value.8": "Ghost",
"singleType.desc.8": "You can only use pokemon with the Ghost type.",
"singleType.value.9": "Steel",
"singleType.desc.9": "You can only use pokemon with the Steel type.",
"singleType.value.10": "Fire",
"singleType.desc.10": "You can only use pokemon with the Fire type.",
"singleType.value.11": "Water",
"singleType.desc.11": "You can only use pokemon with the Water type.",
"singleType.value.12": "Grass",
"singleType.desc.12": "You can only use pokemon with the Grass type.",
"singleType.value.13": "Electric",
"singleType.desc.13": "You can only use pokemon with the Electric type.",
"singleType.value.14": "Psychic",
"singleType.desc.14": "You can only use pokemon with the Psychic type.",
"singleType.value.15": "Ice",
"singleType.desc.15": "You can only use pokemon with the Ice type.",
"singleType.value.16": "Dragon",
"singleType.desc.16": "You can only use pokemon with the Dragon type.",
"singleType.value.17": "Dark",
"singleType.desc.17": "You can only use pokemon with the Dark type.",
"singleType.value.18": "Fairy",
"singleType.desc.18": "You can only use pokemon with the Fairy type.",
} as const; } as const;

5
src/locales/en/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Start",
} as const;

View File

@ -1,3 +1,4 @@
import { common } from "#app/locales/en/common.js";
import { settings } from "#app/locales/en/settings.js"; import { settings } from "#app/locales/en/settings.js";
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger"; import { abilityTriggers } from "./ability-trigger";
@ -50,6 +51,7 @@ export const enConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Passive:", "passive": "Passive:",
"nature": "Nature:", "nature": "Nature:",
"eggMoves": "Egg Moves", "eggMoves": "Egg Moves",
"start": "Start",
"addToParty": "Add to Party", "addToParty": "Add to Party",
"toggleIVs": "Toggle IVs", "toggleIVs": "Toggle IVs",
"manageMoves": "Manage Moves", "manageMoves": "Manage Moves",

View File

@ -71,4 +71,61 @@ export const battle: SimpleTranslationEntries = {
"statSeverelyFell": "severely fell", "statSeverelyFell": "severely fell",
"statWontGoAnyLower": "won't go any lower", "statWontGoAnyLower": "won't go any lower",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!"
} as const; } as const;

View File

@ -1,67 +1,25 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Parámetros de Desafíos", "title": "Parámetros de Desafíos",
"points": "Malas Ideas", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"confirm_start": "¿Continuar con estos desafíos?", "singleGeneration": {
"singleGeneration.name": "Monogeneración", "name": "Monogeneración",
"singleGeneration.value.0": "No", "desc": "Solo puedes usar Pokémon de {{gen}} generación.",
"singleGeneration.desc.0": "Solo puedes usar Pokémon de la generación elegida.", "desc_default": "Solo puedes usar Pokémon de la generación elegida.",
"singleGeneration.value.1": "Gen 1", "gen_1": "primera",
"singleGeneration.desc.1": "Solo puedes usar Pokémon de primera generación.", "gen_2": "segunda",
"singleGeneration.value.2": "Gen 2", "gen_3": "tercera",
"singleGeneration.desc.2": "Solo puedes usar Pokémon de segunda generación.", "gen_4": "cuarta",
"singleGeneration.value.3": "Gen 3", "gen_5": "quinta",
"singleGeneration.desc.3": "Solo puedes usar Pokémon de tercera generación.", "gen_6": "sexta",
"singleGeneration.value.4": "Gen 4", "gen_7": "séptima",
"singleGeneration.desc.4": "Solo puedes usar Pokémon de cuarta generación.", "gen_8": "octava",
"singleGeneration.value.5": "Gen 5", "gen_9": "novena",
"singleGeneration.desc.5": "Solo puedes usar Pokémon de quinta generación.", },
"singleGeneration.value.6": "Gen 6", "singleType": {
"singleGeneration.desc.6": "Solo puedes usar Pokémon de sexta generación.", "name": "Monotipo",
"singleGeneration.value.7": "Gen 7", "desc": "Solo puedes usar Pokémon with the {{type}} type.",
"singleGeneration.desc.7": "Solo puedes usar Pokémon de séptima generación.", "desc_default": "Solo puedes usar Pokémon del tipo elegido.",
"singleGeneration.value.8": "Gen 8", },
"singleGeneration.desc.8": "Solo puedes usar Pokémon de octava generación.",
"singleGeneration.value.9": "Gen 9",
"singleGeneration.desc.9": "Solo puedes usar Pokémon de novena generación.",
"singleType.name": "Monotipo",
"singleType.value.0": "No",
"singleType.desc.0": "Solo puedes usar Pokémon del tipo elegido",
"singleType.value.1": "Normal",
"singleType.desc.1": "Solo puedes usar Pokémon de tipo Normal.",
"singleType.value.2": "Lucha",
"singleType.desc.2": "Solo puedes usar Pokémon de tipo Lucha.",
"singleType.value.3": "Volador",
"singleType.desc.3": "Solo puedes usar Pokémon de tipo Volador.",
"singleType.value.4": "Veneno",
"singleType.desc.4": "Solo puedes usar Pokémon de tipo Veneno.",
"singleType.value.5": "Tierra",
"singleType.desc.5": "Solo puedes usar Pokémon de tipo Tierra.",
"singleType.value.6": "Roca",
"singleType.desc.6": "Solo puedes usar Pokémon de tipo Roca.",
"singleType.value.7": "Bicho",
"singleType.desc.7": "Solo puedes usar Pokémon de tipo Bicho.",
"singleType.value.8": "Fantasma",
"singleType.desc.8": "Solo puedes usar Pokémon de tipo Fantasma.",
"singleType.value.9": "Acero",
"singleType.desc.9": "Solo puedes usar Pokémon de tipo Acero.",
"singleType.value.10": "Fuego",
"singleType.desc.10": "Solo puedes usar Pokémon de tipo Fuego.",
"singleType.value.11": "Agua",
"singleType.desc.11": "Solo puedes usar Pokémon de tipo Agua.",
"singleType.value.12": "Planta",
"singleType.desc.12": "Solo puedes usar Pokémon de tipo Planta.",
"singleType.value.13": "Eléctrico",
"singleType.desc.13": "Solo puedes usar Pokémon de tipo Eléctrico.",
"singleType.value.14": "Psíquico",
"singleType.desc.14": "Solo puedes usar Pokémon de tipo Psíquico.",
"singleType.value.15": "Hielo",
"singleType.desc.15": "Solo puedes usar Pokémon de tipo Hielo.",
"singleType.value.16": "Dragón",
"singleType.desc.16": "Solo puedes usar Pokémon de tipo Dragón.",
"singleType.value.17": "Siniestro",
"singleType.desc.17": "Solo puedes usar Pokémon de tipo Siniestro.",
"singleType.value.18": "Hada",
"singleType.desc.18": "Solo puedes usar Pokémon de tipo Hada.",
} as const; } as const;

5
src/locales/es/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Start",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/es/settings.js"; import { settings } from "#app/locales/es/settings.js";
import { common } from "#app/locales/es/common.js";
export const esConfig = { export const esConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const esConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Pasiva:", "passive": "Pasiva:",
"nature": "Natur:", "nature": "Natur:",
"eggMoves": "Mov. Huevo", "eggMoves": "Mov. Huevo",
"start": "Iniciar",
"addToParty": "Añadir a Equipo", "addToParty": "Añadir a Equipo",
"toggleIVs": "Mostrar IVs", "toggleIVs": "Mostrar IVs",
"manageMoves": "Gestionar Movs.", "manageMoves": "Gestionar Movs.",

View File

@ -62,13 +62,70 @@ export const battle: SimpleTranslationEntries = {
"drainMessage": "Lénergie de {{pokemonName}}\nest drainée !", "drainMessage": "Lénergie de {{pokemonName}}\nest drainée !",
"regainHealth": "{{pokemonName}} récupère\ndes PV !", "regainHealth": "{{pokemonName}} récupère\ndes PV !",
"fainted": "{{pokemonNameWithAffix}}\nest K.O. !", "fainted": "{{pokemonNameWithAffix}}\nest K.O. !",
"statRose": "rose", "statRose": "augmente",
"statSharplyRose": "sharply rose", "statSharplyRose": "augmente beaucoup",
"statRoseDrastically": "rose drastically", "statRoseDrastically": "augmente énormément",
"statWontGoAnyHigher": "won't go any higher", "statWontGoAnyHigher": "ne peut plus augmenter",
"statFell": "fell", "statFell": "baisse",
"statHarshlyFell": "harshly fell", "statHarshlyFell": "baisse beaucoup",
"statSeverelyFell": "severely fell", "statSeverelyFell": "baisse énormément",
"statWontGoAnyLower": "won't go any lower", "statWontGoAnyLower": "ne peut plus baisser",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} sont réduits de {{reduction}} !",
"battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus séchapper !",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} a la trouille !\nIl ne peut plus attaquer !",
"battlerTagsConfusedOnAdd": "Ça rend {{pokemonNameWithAffix}}\nconfus !",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\nnest plus confus !",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\nest déjà confus !",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\nest confus !",
"battlerTagsConfusedLapseHurtItself": "Il se blesse dans sa confusion.",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} nest pas affecté\nle Lien du Destin !",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}] est amoureux\nde {{sourcePokemonName}} !",
"battlerTagsInfatuatedLapseImmobilize": "Lamour empêche {{pokemonNameWithAffix}}\ndagir !",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\nnest plus amoureux !",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} est infecté !",
"battlerTagsSeededLapse": "Vampigraine draine lénergie\nde {{pokemonNameWithAffix}} !",
"battlerTagsSeededLapseShed": "La Vampigraine de {{pokemonNameWithAffix}}\naspire le suintement !",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier dun cauchemar !",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier dun cauchemar !",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} !\nEncore une fois !",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} nest\nplus obligé dutiliser la même capacité !",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} sentoure\ndun voile deau !",
"battlerTagsAquaRingLapse": "{{moveName}} restaure\nles PV de {{pokemonName}} !",
"battlerTagsDrowsyOnAdd": "Ça rend {{pokemonNameWithAffix}} somnolent !",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} est pris dans\nlétreinte de {{sourcePokemonName}} !",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} est ligoté\npar {{sourcePokemonName}} !",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans le tourbillon !",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} est pris dans le Claquoir\nde {{pokemonName}} !",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} est piégé\npar {{moveName}} !",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans un tourbillon de magma !",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} est tombé\ndans un Troquenard !",
"battlerTagsThunderCageOnTrap": "{{pokemonNameWithAffix}} se fait emprisonner\npar {{sourcePokemonNameWithAffix}} !",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} est harcelé\npar {{sourcePokemonNameWithAffix}} !",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"battlerTagsPerishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} paresse !",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\nnarrive pas à se motiver !",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à sy mettre sérieusement !",
"battlerTagsHighestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
"battlerTagsHighestStatBoostOnRemove": "Leffet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !"
} as const; } as const;

View File

@ -1,67 +1,26 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Paramètres du Challenge", "title": "Paramètres du Challenge",
"start": "Démarrer",
"illegalEvolution": "{{pokemon}} sest transformé en Pokémon\ninéligible pour ce challenge !", "illegalEvolution": "{{pokemon}} sest transformé en Pokémon\ninéligible pour ce challenge !",
"singleGeneration.name": "Mono-génération", "singleGeneration": {
"singleGeneration.value.0": "Désactivé", "name": "Mono-génération",
"singleGeneration.desc.0": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.",
"singleGeneration.value.1": "1G", "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.",
"singleGeneration.desc.1": "Vous ne pouvez choisir que des Pokémon de 1re génération.", "gen_1": "1re",
"singleGeneration.value.2": "2G", "gen_2": "2e",
"singleGeneration.desc.2": "Vous ne pouvez choisir que des Pokémon de 2e génération.", "gen_3": "3e",
"singleGeneration.value.3": "3G", "gen_4": "4e",
"singleGeneration.desc.3": "Vous ne pouvez choisir que des Pokémon de 3e génération.", "gen_5": "5e",
"singleGeneration.value.4": "4G", "gen_6": "6e",
"singleGeneration.desc.4": "Vous ne pouvez choisir que des Pokémon de 4e génération.", "gen_7": "7e",
"singleGeneration.value.5": "5G", "gen_8": "8e",
"singleGeneration.desc.5": "Vous ne pouvez choisir que des Pokémon de 5e génération.", "gen_9": "9e",
"singleGeneration.value.6": "6G", },
"singleGeneration.desc.6": "Vous ne pouvez choisir que des Pokémon de 6e génération.", "singleType": {
"singleGeneration.value.7": "7G", "name": "Mono-type",
"singleGeneration.desc.7": "Vous ne pouvez choisir que des Pokémon de 7e génération.", "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.",
"singleGeneration.value.8": "8G", "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné."
"singleGeneration.desc.8": "Vous ne pouvez choisir que des Pokémon de 8e génération.", //type in pokemon-info
"singleGeneration.value.9": "9G", },
"singleGeneration.desc.9": "Vous ne pouvez choisir que des Pokémon de 9e génération.",
"singleType.name": "Mono-type",
"singleType.value.0": "Désactivé",
"singleType.desc.0": "Vous ne pouvez choisir que des Pokémon du type sélectionné.",
"singleType.value.1": "Normal",
"singleType.desc.1": "Vous ne pouvez choisir que des Pokémon de type Normal.",
"singleType.value.2": "Combat",
"singleType.desc.2": "Vous ne pouvez choisir que des Pokémon de type Combat.",
"singleType.value.3": "Vol",
"singleType.desc.3": "Vous ne pouvez choisir que des Pokémon de type Vol.",
"singleType.value.4": "Poison",
"singleType.desc.4": "Vous ne pouvez choisir que des Pokémon de type Poison.",
"singleType.value.5": "Sol",
"singleType.desc.5": "Vous ne pouvez choisir que des Pokémon de type Sol.",
"singleType.value.6": "Roche",
"singleType.desc.6": "Vous ne pouvez choisir que des Pokémon de type Roche.",
"singleType.value.7": "Insecte",
"singleType.desc.7": "Vous ne pouvez choisir que des Pokémon de type Insecte.",
"singleType.value.8": "Spectre",
"singleType.desc.8": "Vous ne pouvez choisir que des Pokémon de type Spectre.",
"singleType.value.9": "Acier",
"singleType.desc.9": "Vous ne pouvez choisir que des Pokémon de type Acier.",
"singleType.value.10": "Feu",
"singleType.desc.10": "Vous ne pouvez choisir que des Pokémon de type Feu.",
"singleType.value.11": "Eau",
"singleType.desc.11": "Vous ne pouvez choisir que des Pokémon de type Eau.",
"singleType.value.12": "Plante",
"singleType.desc.12": "Vous ne pouvez choisir que des Pokémon de type Plante.",
"singleType.value.13": "Électrik",
"singleType.desc.13": "Vous ne pouvez choisir que des Pokémon de type Électrik.",
"singleType.value.14": "Psy",
"singleType.desc.14": "Vous ne pouvez choisir que des Pokémon de type Psy.",
"singleType.value.15": "Glace",
"singleType.desc.15": "Vous ne pouvez choisir que des Pokémon de type Glace.",
"singleType.value.16": "Dragon",
"singleType.desc.16": "Vous ne pouvez choisir que des Pokémon de type Dragon.",
"singleType.value.17": "Ténèbres",
"singleType.desc.17": "Vous ne pouvez choisir que des Pokémon de type Ténèbres.",
"singleType.value.18": "Fée",
"singleType.desc.18": "Vous ne pouvez choisir que des Pokémon de type Fée.",
} as const; } as const;

5
src/locales/fr/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Lancer",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/fr/settings.js"; import { settings } from "#app/locales/fr/settings.js";
import { common } from "#app/locales/fr/common.js";
export const frConfig = { export const frConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const frConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Passif :", "passive": "Passif :",
"nature": "Nature :", "nature": "Nature :",
"eggMoves": "Capacités Œuf", "eggMoves": "Capacités Œuf",
"start": "Lancer",
"addToParty": "Ajouter à léquipe", "addToParty": "Ajouter à léquipe",
"toggleIVs": "Voir les IV", "toggleIVs": "Voir les IV",
"manageMoves": "Modifier les Capacités", "manageMoves": "Modifier les Capacités",

View File

@ -62,13 +62,70 @@ export const battle: SimpleTranslationEntries = {
"drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!",
"regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!",
"fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!",
"statRose": "rose", "statRose": "è aumentato/a",
"statSharplyRose": "sharply rose", "statSharplyRose": "è aumentato/a molto",
"statRoseDrastically": "rose drastically", "statRoseDrastically": "è aumentato/a drasticamente",
"statWontGoAnyHigher": "won't go any higher", "statWontGoAnyHigher": "non può aumentare più di così",
"statFell": "fell", "statFell": "è diminuito/a",
"statHarshlyFell": "harshly fell", "statHarshlyFell": "è diminuito/a molto",
"statSeverelyFell": "severely fell", "statSeverelyFell": "è diminuito/a drasticamente",
"statWontGoAnyLower": "won't go any lower", "statWontGoAnyLower": "non può diminuire più di così",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} tentenna!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} è\nconfuso!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} non\nè più confuso!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} è\ngià confuso!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} è\nconfuso!",
"battlerTagsConfusedLapseHurtItself": "Si colpisce da solo per via della\nconfusione!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} è immune\na Destinobbligato.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} trascina\ncon sé{{pokemonNameWithAffix2}}!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} si è infatuato\ndi {{sourcePokemonName}}!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} è\ngià infatuato!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} è infatuato\ndi {{sourcePokemonName}}!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} è\nimmobilizzato dall'infatuazione!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} non è\npiù infatuato.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} è pieno di semi!",
"battlerTagsSeededLapse": "La salute di {{pokemonNameWithAffix}}\nviene prelevata da Parassiseme!",
"battlerTagsSeededLapseShed": "Parassiseme di {{pokemonNameWithAffix}}\nha risucchiato la melma!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} ha\nsubito Ripeti!",
"battlerTagsEncoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} ha messo le radici!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} si è circondato\ncon un velo d'acqua!",
"battlerTagsAquaRingLapse": "{{moveName}} ha ripristinato\ni PS di {{pokemonName}}!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} sta per addormentarsi!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} subisce danni\nper via di {{moveName}}!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} viene schiacciato da\n{{moveName}} di {{sourcePokemonName}}!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} è stato avvinghiato\nda {{sourcePokemonName}}!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel vortice!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} sta intenagliando\n{{pokemonName}}!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nda {{moveName}}!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel magma vorticoso!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nin una tagliola!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} ha intrappolato\n{{pokemonNameWithAffix}}!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} ha subito un\ninfestazione da parte di {{sourcePokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nsi è protetto!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nsi è protetto!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} si prepara a\nsubire il colpo!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!",
"battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!",
"battlerTagsHighestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!",
"battlerTagsHighestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!"
} as const; } as const;

View File

@ -1,67 +1,25 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Modificatori delle sfide", "title": "Modificatori delle sfide",
"points": "Pessime idee", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"confirm_start": "Procedere con le sfide selezionate?", "singleGeneration": {
"singleGeneration.name": "Mono gen", "name": "Mono gen",
"singleGeneration.value.0": "Off", "desc": "Puoi usare solo Pokémon di {{gen}} generazione.",
"singleGeneration.desc.0": "Puoi usare solo Pokémon della generazione selezionata.", "desc_default": "Puoi usare solo Pokémon della generazione selezionata.",
"singleGeneration.value.1": "1ª gen", "gen_1": "1ª",
"singleGeneration.desc.1": "Puoi usare solo Pokémon di 1ª generazione.", "gen_2": "2ª",
"singleGeneration.value.2": "2ª gen", "gen_3": "3ª",
"singleGeneration.desc.2": "Puoi usare solo Pokémon di 2ª generazione.", "gen_4": "4ª",
"singleGeneration.value.3": "3ª gen", "gen_5": "5ª",
"singleGeneration.desc.3": "Puoi usare solo Pokémon di 3ª generazione.", "gen_6": "6ª",
"singleGeneration.value.4": "4ª gen", "gen_7": "7ª",
"singleGeneration.desc.4": "Puoi usare solo Pokémon di 4ª generazione.", "gen_8": "8ª",
"singleGeneration.value.5": "5ª gen", "gen_9": "9ª",
"singleGeneration.desc.5": "Puoi usare solo Pokémon di 5ª generazione.", },
"singleGeneration.value.6": "6ª gen", "singleType": {
"singleGeneration.desc.6": "Puoi usare solo Pokémon di 6ª generazione.", "name": "Mono tipo",
"singleGeneration.value.7": "7ª gen", "desc": "Puoi usare solo Pokémon di tipo {{type}}.",
"singleGeneration.desc.7": "Puoi usare solo Pokémon di 7ª generazione.", "desc_default": "Puoi usare solo Pokémon del tipo selezionato."
"singleGeneration.value.8": "8ª gen", },
"singleGeneration.desc.8": "Puoi usare solo Pokémon di 8ª generazione.",
"singleGeneration.value.9": "9ª gen",
"singleGeneration.desc.9": "Puoi usare solo Pokémon di 9ª generazione.",
"singleType.name": "Mono tipo",
"singleType.value.0": "Off",
"singleType.desc.0": "Puoi usare solo Pokémon del tipo selezionato.",
"singleType.value.1": "Normale",
"singleType.desc.1": "Puoi usare solo Pokémon di tipo normale.",
"singleType.value.2": "Lotta",
"singleType.desc.2": "Puoi usare solo Pokémon di tipo lotta.",
"singleType.value.3": "Volante",
"singleType.desc.3": "Puoi usare solo Pokémon di tipo volante.",
"singleType.value.4": "Veleno",
"singleType.desc.4": "Puoi usare solo Pokémon di tipo veleno.",
"singleType.value.5": "Terra",
"singleType.desc.5": "Puoi usare solo Pokémon di tipo terra.",
"singleType.value.6": "Roccia",
"singleType.desc.6": "Puoi usare solo Pokémon di tipo roccia.",
"singleType.value.7": "Coleottero",
"singleType.desc.7": "Puoi usare solo Pokémon di tipo coleottero.",
"singleType.value.8": "Spettro",
"singleType.desc.8": "Puoi usare solo Pokémon di tipo spettro.",
"singleType.value.9": "Acciaio",
"singleType.desc.9": "Puoi usare solo Pokémon di tipo acciaio.",
"singleType.value.10": "Fuoco",
"singleType.desc.10": "Puoi usare solo Pokémon di tipo fuoco.",
"singleType.value.11": "Acqua",
"singleType.desc.11": "Puoi usare solo Pokémon di tipo acqua.",
"singleType.value.12": "Erba",
"singleType.desc.12": "Puoi usare solo Pokémon di tipo erba.",
"singleType.value.13": "Elettro",
"singleType.desc.13": "Puoi usare solo Pokémon di tipo elettro.",
"singleType.value.14": "Psico",
"singleType.desc.14": "Puoi usare solo Pokémon di tipo psico.",
"singleType.value.15": "Ghiaccio",
"singleType.desc.15": "Puoi usare solo Pokémon di tipo ghiaccio.",
"singleType.value.16": "Drago",
"singleType.desc.16": "Puoi usare solo Pokémon di tipo drago.",
"singleType.value.17": "Buio",
"singleType.desc.17": "Puoi usare solo Pokémon di tipo buio.",
"singleType.value.18": "Folletto",
"singleType.desc.18": "Puoi usare solo Pokémon di tipo folletto.",
} as const; } as const;

5
src/locales/it/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Inizia",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/it/settings.js"; import { settings } from "#app/locales/it/settings.js";
import { common } from "#app/locales/it/common.js";
export const itConfig = { export const itConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const itConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Passiva:", "passive": "Passiva:",
"nature": "Natura:", "nature": "Natura:",
"eggMoves": "Mosse da uova", "eggMoves": "Mosse da uova",
"start": "Inizia",
"addToParty": "Aggiungi al gruppo", "addToParty": "Aggiungi al gruppo",
"toggleIVs": "Vedi/Nascondi IV", "toggleIVs": "Vedi/Nascondi IV",
"manageMoves": "Gestisci mosse", "manageMoves": "Gestisci mosse",

View File

@ -70,5 +70,62 @@ export const battle: SimpleTranslationEntries = {
"statHarshlyFell": "[[가]] 크게 떨어졌다!", "statHarshlyFell": "[[가]] 크게 떨어졌다!",
"statSeverelyFell": "[[가]] 매우 크게 떨어졌다!", "statSeverelyFell": "[[가]] 매우 크게 떨어졌다!",
"statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!", "statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!",
"battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}로부터 풀려났다!",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}[[는]] 풀이 죽어\n움직일 수 없었다!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠졌다!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}의\n혼란이 풀렸다!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 혼란에 빠져 있다",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠져 있다!",
"battlerTagsConfusedLapseHurtItself": "영문도 모른채\n자신을 공격했다!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}[[는]]\n길동무의 영향을 받지 않는다.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}[[는]] {{pokemonNameWithAffix2}}[[를]]\n길동무로 삼았다!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱해졌다!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 헤롱헤롱해있다!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonName}}에게 헤롱헤롱해 있다!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}[[는]] 헤롱헤롱해서\n기술을 쓸 수 없었다!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱 상태에서 벗어났다.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}에게\n씨앗을 심었다!",
"battlerTagsSeededLapse": "씨뿌리기가 {{pokemonNameWithAffix}}의\n체력을 빼앗는다!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}[[는]]\n씨앗을 날려버렸다!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!",
"battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!",
"battlerTagsAquaRingLapse": "{{moveName}} 효과로 \n{{pokemonName}}[[는]] HP를 회복했다!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n휘감겼다!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}[[는]]\n소용돌이 속에 갇혔다!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}[[는]] {{pokemonName}}의\n껍질에 꼈다!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}에 붙잡혔다!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}[[는]]\n마그마의 소용돌이에 갇혔다!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}[[는]]\n집게덫에 붙잡혔다!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}[[는]]\n{{pokemonNameWithAffix}}를 가두었다!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonNameWithAffix}}에게 엉겨 붙었다!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n방어 태세에 들어갔다!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}[[는]]\n공격으로부터 몸을 지켰다!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}[[는]]\n버티기 태세에 들어갔다!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!",
"battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!"
} as const; } as const;

View File

@ -1,67 +1,26 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "챌린지 조건 설정", "title": "챌린지 조건 설정",
"points": "Bad Ideas", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"confirm_start": "이 조건으로 챌린지를 진행하시겠습니까?", "singleGeneration": {
"singleGeneration.name": "단일 세대", "name": "단일 세대",
"singleGeneration.value.0": "설정 안함", "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.",
"singleGeneration.desc.0": "선택한 세대의 포켓몬만 사용할 수 있습니다.", "desc_default": "선택한 세대의 포켓몬만 사용할 수 있습니다.",
"singleGeneration.value.1": "1세대", "gen_1": "1세대",
"singleGeneration.desc.1": "1세대의 포켓몬만 사용할 수 있습니다.", "gen_2": "2세대",
"singleGeneration.value.2": "2세대", "gen_3": "3세대",
"singleGeneration.desc.2": "2세대의 포켓몬만 사용할 수 있습니다.", "gen_4": "4세대",
"singleGeneration.value.3": "3세대", "gen_5": "5세대",
"singleGeneration.desc.3": "3세대의 포켓몬만 사용할 수 있습니다.", "gen_6": "6세대",
"singleGeneration.value.4": "4세대", "gen_7": "7세대",
"singleGeneration.desc.4": "4세대의 포켓몬만 사용할 수 있습니다.", "gen_8": "8세대",
"singleGeneration.value.5": "5세대", "gen_9": "9세대",
"singleGeneration.desc.5": "5세대의 포켓몬만 사용할 수 있습니다.", },
"singleGeneration.value.6": "6세대", "singleType": {
"singleGeneration.desc.6": "6세대의 포켓몬만 사용할 수 있습니다.", "name": "단일 타입",
"singleGeneration.value.7": "7세대", "desc": "{{type}} 타입의 포켓몬만 사용할 수 있습니다.",
"singleGeneration.desc.7": "7세대의 포켓몬만 사용할 수 있습니다.", "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다."
"singleGeneration.value.8": "8세대", //type in pokemon-info
"singleGeneration.desc.8": "8세대의 포켓몬만 사용할 수 있습니다.", },
"singleGeneration.value.9": "9세대",
"singleGeneration.desc.9": "9세대의 포켓몬만 사용할 수 있습니다.",
"singleType.name": "단일 타입",
"singleType.value.0": "설정 안함",
"singleType.desc.0": "선택한 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.1": "노말",
"singleType.desc.1": "노말 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.2": "격투",
"singleType.desc.2": "격투 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.3": "비행",
"singleType.desc.3": "비행 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.4": "독",
"singleType.desc.4": "독 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.5": "땅",
"singleType.desc.5": "땅 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.6": "바위 ",
"singleType.desc.6": "바위 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.7": "벌레",
"singleType.desc.7": "벌레 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.8": "고스트",
"singleType.desc.8": "고스트 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.9": "강철",
"singleType.desc.9": "강철 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.10": "불꽃",
"singleType.desc.10": "불꽃 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.11": "물",
"singleType.desc.11": "물 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.12": "풀",
"singleType.desc.12": "풀 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.13": "전기",
"singleType.desc.13": "전기 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.14": "에스퍼",
"singleType.desc.14": "에스퍼 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.15": "얼음",
"singleType.desc.15": "얼음 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.16": "드래곤",
"singleType.desc.16": "드래곤 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.17": "악",
"singleType.desc.17": "악 타입의 포켓몬만 사용할 수 있습니다.",
"singleType.value.18": "페어리",
"singleType.desc.18": "페어리 타입의 포켓몬만 사용할 수 있습니다.",
} as const; } as const;

5
src/locales/ko/common.ts Normal file
View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "시작",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/ko/settings.js"; import { settings } from "#app/locales/ko/settings.js";
import { common } from "#app/locales/ko/common.js";
export const koConfig = { export const koConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const koConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -250,14 +250,14 @@ export const modifierType: ModifierTypeTranslationEntries = {
}, },
TempBattleStatBoosterStatName: { TempBattleStatBoosterStatName: {
"ATK": "Attack", "ATK": "공격",
"DEF": "Defense", "DEF": "방어",
"SPATK": "Sp. Atk", "SPATK": "특수공격",
"SPDEF": "Sp. Def", "SPDEF": "특수방어",
"SPD": "Speed", "SPD": "스피드",
"ACC": "Accuracy", "ACC": "명중률",
"CRIT": "Critical Hit Ratio", "CRIT": "급소율",
"EVA": "Evasiveness", "EVA": "회피율",
"DEFAULT": "???", "DEFAULT": "???",
}, },

View File

@ -92,7 +92,7 @@ export const settings: SimpleTranslationEntries = {
"buttonSpeedUp": "속도 올리기", "buttonSpeedUp": "속도 올리기",
"buttonSlowDown": "속도 내리기", "buttonSlowDown": "속도 내리기",
"alt": " (대체)", "alt": " (대체)",
"mute": "Mute", "mute": "음소거",
"controller": "Controller", "controller": "컨트롤러",
"gamepadSupport": "Gamepad Support" "gamepadSupport": "게임패드 지원"
} as const; } as const;

View File

@ -6,7 +6,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
* account interactions, descriptive text, etc. * account interactions, descriptive text, etc.
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":"이 포켓몬들로 시작하시겠습니까?", "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?",
"gen1": "1세대", "gen1": "1세대",
"gen2": "2세대", "gen2": "2세대",
"gen3": "3세대", "gen3": "3세대",
@ -21,11 +21,12 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "패시브:", "passive": "패시브:",
"nature": "성격:", "nature": "성격:",
"eggMoves": "알 기술", "eggMoves": "알 기술",
"start": "시작",
"addToParty": "파티에 추가", "addToParty": "파티에 추가",
"toggleIVs": "개체값 토글", "toggleIVs": "개체값 토글",
"manageMoves": "기술 관리", "manageMoves": "기술 관리",
"manageNature": "성격 관리",
"useCandies": "사탕 사용", "useCandies": "사탕 사용",
"selectNature": "교체할 성격을 선택해주세요.",
"selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.",
"selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:",
"unlockPassive": "패시브 해금", "unlockPassive": "패시브 해금",

View File

@ -112,7 +112,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"school_kid": "학원끝난 아이", "school_kid": "학원끝난 아이",
"school_kid_female": "학원끝난 아이", "school_kid_female": "학원끝난 아이",
"school_kids": "학원끝난 아이", "school_kids": "학원끝난 아이",
"swimmer": "수팬티 소년", "swimmer": "수팬티 소년",
"swimmer_female": "비키니 아가씨", "swimmer_female": "비키니 아가씨",
"swimmers": "수영팬티 소년 & 비키니 아가씨", // 확인 필요 "swimmers": "수영팬티 소년 & 비키니 아가씨", // 확인 필요
"twins": "쌍둥이", "twins": "쌍둥이",

View File

@ -70,5 +70,62 @@ export const battle: SimpleTranslationEntries = {
"statHarshlyFell": "diminuiu duramente", "statHarshlyFell": "diminuiu duramente",
"statSeverelyFell": "diminuiu severamente", "statSeverelyFell": "diminuiu severamente",
"statWontGoAnyLower": "não vai mais diminuir", "statWontGoAnyLower": "não vai mais diminuir",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} hesitou!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!",
"battlerTagsConfusedLapseHurtItself": "Se machucou em sua\nconfusão!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} foi semeado!",
"battlerTagsSeededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!",
"battlerTagsSeededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} ganhou\num Encore!",
"battlerTagsEncoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!",
"battlerTagsAquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!",
"battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!",
"battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!",
"battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!"
} as const; } as const;

View File

@ -1,67 +1,25 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "Desafios", "title": "Desafios",
"start": "Iniciar",
"illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!", "illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!",
"singleGeneration.name": "Geração Única", "singleGeneration": {
"singleGeneration.value.0": "Desligado", "name": "Geração Única",
"singleGeneration.desc.0": "Você só pode user Pokémon de uma única geração.", "desc": "Você só pode user Pokémon da {{gen}} geração.",
"singleGeneration.value.1": "Geração 1", "desc_default": "Você só pode user Pokémon de uma única geração.",
"singleGeneration.desc.1": "Você só pode user Pokémon da primeira geração.", "gen_1": "primeira",
"singleGeneration.value.2": "Geração 2", "gen_2": "segunda",
"singleGeneration.desc.2": "Você só pode user Pokémon da segunda geração.", "gen_3": "terceira",
"singleGeneration.value.3": "Geração 3", "gen_4": "quarta",
"singleGeneration.desc.3": "Você só pode user Pokémon da terceira geração.", "gen_5": "quinta",
"singleGeneration.value.4": "Geração 4", "gen_6": "sexta",
"singleGeneration.desc.4": "Você só pode user Pokémon da quarta geração.", "gen_7": "sétima",
"singleGeneration.value.5": "Geração 5", "gen_8": "oitava",
"singleGeneration.desc.5": "Você só pode user Pokémon da quinta geração.", "gen_9": "nona",
"singleGeneration.value.6": "Geração 6", },
"singleGeneration.desc.6": "Você só pode user Pokémon da sexta geração.", "singleType": {
"singleGeneration.value.7": "Geração 7", "name": "Tipo Único",
"singleGeneration.desc.7": "Você só pode user Pokémon da sétima geração.", "desc": "Você só pode user Pokémon do tipo {{type}}.",
"singleGeneration.value.8": "Geração 8", "desc_default": "Você só pode user Pokémon de um único tipo."
"singleGeneration.desc.8": "Você só pode user Pokémon da oitava geração.", },
"singleGeneration.value.9": "Geração 9",
"singleGeneration.desc.9": "Você só pode user Pokémon da nona geração.",
"singleType.name": "Tipo Único",
"singleType.value.0": "Desligado",
"singleType.desc.0": "Você só pode user Pokémon de um único tipo.",
"singleType.value.1": "Normal",
"singleType.desc.1": "Você só pode user Pokémon do tipo Normal.",
"singleType.value.2": "Lutador",
"singleType.desc.2": "Você só pode user Pokémon do tipo Lutador.",
"singleType.value.3": "Voador",
"singleType.desc.3": "Você só pode user Pokémon do tipo Voador.",
"singleType.value.4": "Veneno",
"singleType.desc.4": "Você só pode user Pokémon do tipo Veneno.",
"singleType.value.5": "Terra",
"singleType.desc.5": "Você só pode user Pokémon do tipo Terra.",
"singleType.value.6": "Pedra",
"singleType.desc.6": "Você só pode user Pokémon do tipo Pedra.",
"singleType.value.7": "Inseto",
"singleType.desc.7": "Você só pode user Pokémon do tipo Inseto.",
"singleType.value.8": "Fantasma",
"singleType.desc.8": "Você só pode user Pokémon do tipo Fantasma.",
"singleType.value.9": "Aço",
"singleType.desc.9": "Você só pode user Pokémon do tipo Aço.",
"singleType.value.10": "Fogo",
"singleType.desc.10": "Você só pode user Pokémon do tipo Fogo.",
"singleType.value.11": "Água",
"singleType.desc.11": "Você só pode user Pokémon do tipo Água.",
"singleType.value.12": "Grama",
"singleType.desc.12": "Você só pode user Pokémon do tipo Grama.",
"singleType.value.13": "Elétrico",
"singleType.desc.13": "Você só pode user Pokémon do tipo Elétrico.",
"singleType.value.14": "Psíquico",
"singleType.desc.14": "Você só pode user Pokémon do tipo Psíquico.",
"singleType.value.15": "Gelo",
"singleType.desc.15": "Você só pode user Pokémon do tipo Gelo.",
"singleType.value.16": "Dragão",
"singleType.desc.16": "Você só pode user Pokémon do tipo Dragão.",
"singleType.value.17": "Sombrio",
"singleType.desc.17": "Você só pode user Pokémon do tipo Sombrio.",
"singleType.value.18": "Fada",
"singleType.desc.18": "Você só pode user Pokémon do tipo Fada.",
} as const; } as const;

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "Iniciar",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/pt_BR/settings.js"; import { settings } from "#app/locales/pt_BR/settings.js";
import { common } from "#app/locales/pt_BR/common.js";
export const ptBrConfig = { export const ptBrConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const ptBrConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -52,5 +52,5 @@ export const menu: SimpleTranslationEntries = {
"yes": "Sim", "yes": "Sim",
"no": "Não", "no": "Não",
"disclaimer": "AVISO", "disclaimer": "AVISO",
"disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis perdas de dados salvos),\n sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído."
} as const; } as const;

View File

@ -3,96 +3,96 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales.js";
export const settings: SimpleTranslationEntries = { export const settings: SimpleTranslationEntries = {
"boy": "Menino", "boy": "Menino",
"girl": "Menina", "girl": "Menina",
"general": "General", "general": "Geral",
"display": "Display", "display": "Exibição",
"audio": "Audio", "audio": "Áudio",
"gamepad": "Gamepad", "gamepad": "Controle",
"keyboard": "Keyboard", "keyboard": "Teclado",
"gameSpeed": "Game Speed", "gameSpeed": "Velocidade do Jogo",
"hpBarSpeed": "HP Bar Speed", "hpBarSpeed": "Velocidade da Barra de PS",
"expGainsSpeed": "EXP Gains Speed", "expGainsSpeed": "Velocidade do Ganho de EXP",
"expPartyDisplay": "Show EXP Party", "expPartyDisplay": "Exibição de EXP da Equipe",
"skipSeenDialogues": "Skip Seen Dialogues", "skipSeenDialogues": "Pular Diálogos Vistos",
"battleStyle": "Battle Style", "battleStyle": "Estilo de Batalha",
"enableRetries": "Enable Retries", "enableRetries": "Habilitar Novas Tentativas",
"tutorials": "Tutorials", "tutorials": "Tutorial",
"touchControls": "Touch Controls", "touchControls": "Controles de Toque",
"vibrations": "Vibrations", "vibrations": "Vibração",
"normal": "Normal", "normal": "Normal",
"fast": "Fast", "fast": "Rápido",
"faster": "Faster", "faster": "Mais Rápido",
"skip": "Skip", "skip": "Pular",
"levelUpNotifications": "Level Up Notifications", "levelUpNotifications": "Notificação",
"on": "On", "on": "Ligado",
"off": "Off", "off": "Desligado",
"switch": "Switch", "switch": "Alternar",
"set": "Set", "set": "Definido",
"auto": "Auto", "auto": "Automático",
"disabled": "Disabled", "disabled": "Desativado",
"language": "Language", "language": "Idioma",
"change": "Change", "change": "Mudar",
"uiTheme": "UI Theme", "uiTheme": "Tema da Interface",
"default": "Default", "default": "Padrão",
"legacy": "Legacy", "legacy": "Legado",
"windowType": "Window Type", "windowType": "Estilo da Janela",
"moneyFormat": "Money Format", "moneyFormat": "Formatação do Dinheiro",
"damageNumbers": "Damage Numbers", "damageNumbers": "Números de Dano",
"simple": "Simple", "simple": "Simples",
"fancy": "Fancy", "fancy": "Detalhado",
"abbreviated": "Abbreviated", "abbreviated": "Abreviado",
"moveAnimations": "Move Animations", "moveAnimations": "Animações de Movimento",
"showStatsOnLevelUp": "Show Stats on Level Up", "showStatsOnLevelUp": "Mostrar Atributos ao Subir de Nível",
"candyUpgradeNotification": "Candy Upgrade Notification", "candyUpgradeNotification": "Exibir Melhorias com Doce",
"passivesOnly": "Passives Only", "passivesOnly": "Passivas",
"candyUpgradeDisplay": "Candy Upgrade Display", "candyUpgradeDisplay": "Modo Melhorias com Doce",
"icon": "Icon", "icon": "Ícone",
"animation": "Animation", "animation": "Animação",
"moveInfo": "Move Info", "moveInfo": "Informações de Movimento",
"showMovesetFlyout": "Show Moveset Flyout", "showMovesetFlyout": "Mostrar Flutuante de Movimentos",
"showArenaFlyout": "Show Arena Flyout", "showArenaFlyout": "Mostrar Flutuante de Bioma",
"showTimeOfDayWidget": "Show Time of Day Widget", "showTimeOfDayWidget": "Widget da Hora do Dia",
"timeOfDayAnimation": "Time of Day Animation", "timeOfDayAnimation": "Animação da Hora do Dia",
"bounce": "Bounce", "bounce": "Saltar",
"timeOfDay_back": "Back", "timeOfDay_back": "Voltar",
"spriteSet": "Sprite Set", "spriteSet": "Conjunto de Sprites",
"consistent": "Consistent", "consistent": "Consistente",
"mixedAnimated": "Mixed Animated", "mixedAnimated": "Animado",
"fusionPaletteSwaps": "Fusion Palette Swaps", "fusionPaletteSwaps": "Cores da Paleta de Fusão",
"playerGender": "Player Gender", "playerGender": "Gênero do Jogador",
"typeHints": "Type Hints", "typeHints": "Dicas de Tipo",
"masterVolume": "Master Volume", "masterVolume": "Volume Mestre",
"bgmVolume": "BGM Volume", "bgmVolume": "Volume de BGM",
"seVolume": "SE Volume", "seVolume": "Volume de SE",
"musicPreference": "Music Preference", "musicPreference": "Preferência de Música",
"mixed": "Mixed", "mixed": "Misto",
"gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", "gamepadPleasePlug": "Conecte um controle ou pressione um botão",
"delete": "Delete", "delete": "Deletar",
"keyboardPleasePress": "Please Press a Key on Your Keyboard", "keyboardPleasePress": "Pressione uma tecla",
"reset": "Reset", "reset": "Redefinir",
"requireReload": "Reload Required", "requireReload": "Requer Reinício",
"action": "Action", "action": "Ação",
"back": "Back", "back": "Voltar",
"pressToBind": "Press to Bind", "pressToBind": "Pressione para Atribuir",
"pressButton": "Press a Button...", "pressButton": "Pressione um Botão...",
"buttonUp": "Up", "buttonUp": "Cima",
"buttonDown": "Down", "buttonDown": "Baixo",
"buttonLeft": "Left", "buttonLeft": "Esquerda",
"buttonRight": "Right", "buttonRight": "Direita",
"buttonAction": "Action", "buttonAction": "Ação",
"buttonMenu": "Menu", "buttonMenu": "Menu",
"buttonSubmit": "Submit", "buttonSubmit": "Confirmar",
"buttonCancel": "Cancel", "buttonCancel": "Cancelar",
"buttonStats": "Stats", "buttonStats": "Atributos",
"buttonCycleForm": "Cycle Form", "buttonCycleForm": "Próxima Forma",
"buttonCycleShiny": "Cycle Shiny", "buttonCycleShiny": "Próximo Shiny",
"buttonCycleGender": "Cycle Gender", "buttonCycleGender": "Próximo Gênero",
"buttonCycleAbility": "Cycle Ability", "buttonCycleAbility": "Próxima Habilidade",
"buttonCycleNature": "Cycle Nature", "buttonCycleNature": "Próxima Natureza",
"buttonCycleVariant": "Cycle Variant", "buttonCycleVariant": "Próxima Variante",
"buttonSpeedUp": "Speed Up", "buttonSpeedUp": "Acelerar",
"buttonSlowDown": "Slow Down", "buttonSlowDown": "Desacelerar",
"alt": " (Alt)", "alt": " (Alt)",
"mute": "Mute", "mute": "Mudo",
"controller": "Controller", "controller": "Controle",
"gamepadSupport": "Gamepad Support" "gamepadSupport": "Suporte para Controle"
} as const; } as const;

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "Passiva:", "passive": "Passiva:",
"nature": "Natureza:", "nature": "Natureza:",
"eggMoves": "Mov. de Ovo", "eggMoves": "Mov. de Ovo",
"start": "Iniciar",
"addToParty": "Adicionar à equipe", "addToParty": "Adicionar à equipe",
"toggleIVs": "Mostrar IVs", "toggleIVs": "Mostrar IVs",
"manageMoves": "Mudar Movimentos", "manageMoves": "Mudar Movimentos",

View File

@ -71,4 +71,61 @@ export const battle: SimpleTranslationEntries = {
"statSeverelyFell": "极大幅降低了!", "statSeverelyFell": "极大幅降低了!",
"statWontGoAnyLower": "已经无法再降低了!", "statWontGoAnyLower": "已经无法再降低了!",
"ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}点!", "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}点!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻击的反作用力而无法动弹!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}摆脱了{{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏缩了!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混乱了!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混乱解除了!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已经混乱了。",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混乱中!",
"battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影响",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同归于尽了!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}对{{sourcePokemonName}}着迷了!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已经着迷了!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}对{{sourcePokemonName}}着迷中!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不会着迷!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治愈了着迷状态!",
"battlerTagsSeededOnAdd": "将种子种植在了{{pokemonNameWithAffix}}身上!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生种子吸取了体力!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥浆!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}开始做恶梦了!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已经被恶梦缠身!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被恶梦缠身!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}}接受了再来一次!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再来一次状态解除了!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}摆出了帮助{{pokemonName}} 的架势!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回复了体力!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流环包裹了自己!",
"battlerTagsAquaRingLapse": "{{moveName}}回复了{{pokemonName}}的体力!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}产生睡意了!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的伤害!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}紧紧束缚住了!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}绑紧了!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋涡之中!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳夹住了{{pokemonName}}",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩风暴之中!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕兽夹困住了!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死缠烂打!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}摆出了防守的架势!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻击中保护了自己!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}摆出了挺住攻击的架势!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻击!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻击!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的灭亡计时变成{{turnCount}}了!",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懒!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}无法拿出平时的水平!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢复了平时的水平!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}现在干劲十足!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如释重负似地放松了下来。",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了盐腌状态!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的伤害!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,并诅咒了{{pokemonName}}",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到诅咒!"
} as const; } as const;

View File

@ -1,67 +1,25 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: SimpleTranslationEntries = { export const challenges: TranslationEntries = {
"title": "适用挑战条件", "title": "适用挑战条件",
"points": "Bad Ideas", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"confirm_start": "要执行这些挑战吗?", "singleGeneration": {
"singleGeneration.name": "单一世代", "name": "单一世代",
"singleGeneration.value.0": "关闭", "desc": "你只能使用第{{gen}}世代的宝可梦",
"singleGeneration.desc.0": "你只能使用所选世代的宝可梦", "desc_default": "你只能使用所选世代的宝可梦",
"singleGeneration.value.1": "第一世代", "gen_1": "一",
"singleGeneration.desc.1": "你只能使用第一世代的宝可梦", "gen_2": "二",
"singleGeneration.value.2": "第二世代", "gen_3": "三",
"singleGeneration.desc.2": "你只能使用第二世代的宝可梦", "gen_4": "四",
"singleGeneration.value.3": "第三世代", "gen_5": "五",
"singleGeneration.desc.3": "你只能使用第三世代的宝可梦", "gen_6": "六",
"singleGeneration.value.4": "第四世代", "gen_7": "七",
"singleGeneration.desc.4": "你只能使用第四世代的宝可梦", "gen_8": "八",
"singleGeneration.value.5": "第五世代", "gen_9": "九",
"singleGeneration.desc.5": "你只能使用第五世代的宝可梦", },
"singleGeneration.value.6": "第六世代", "singleType": {
"singleGeneration.desc.6": "你只能使用第六世代的宝可梦", "name": "单属性",
"singleGeneration.value.7": "第七世代", "desc": "你只能使用{{type}}属性的宝可梦",
"singleGeneration.desc.7": "你只能使用第七世代的宝可梦", "desc_default": "你只能使用所选属性的宝可梦"
"singleGeneration.value.8": "第八世代", },
"singleGeneration.desc.8": "你只能使用第八世代的宝可梦",
"singleGeneration.value.9": "第九世代",
"singleGeneration.desc.9": "你只能使用第九世代的宝可梦",
"singleType.name": "单属性",
"singleType.value.0": "关闭",
"singleType.desc.0": "你只能使用所选属性的宝可梦",
"singleType.value.1": "普通",
"singleType.desc.1": "你只能使用普通属性的宝可梦",
"singleType.value.2": "格斗",
"singleType.desc.2": "你只能使用格斗属性的宝可梦",
"singleType.value.3": "飞行",
"singleType.desc.3": "你只能使用飞行属性的宝可梦",
"singleType.value.4": "毒",
"singleType.desc.4": "你只能使用毒属性的宝可梦",
"singleType.value.5": "地面",
"singleType.desc.5": "你只能使用地面属性的宝可梦",
"singleType.value.6": "岩石",
"singleType.desc.6": "你只能使用岩石属性的宝可梦",
"singleType.value.7": "虫",
"singleType.desc.7": "你只能使用虫属性的宝可梦",
"singleType.value.8": "幽灵",
"singleType.desc.8": "你只能使用幽灵属性的宝可梦",
"singleType.value.9": "钢",
"singleType.desc.9": "你只能使用钢属性的宝可梦",
"singleType.value.10": "火",
"singleType.desc.10": "你只能使用火属性的宝可梦",
"singleType.value.11": "水",
"singleType.desc.11": "你只能使用水属性的宝可梦",
"singleType.value.12": "草",
"singleType.desc.12": "你只能使用草属性的宝可梦",
"singleType.value.13": "电",
"singleType.desc.13": "你只能使用电属性的宝可梦",
"singleType.value.14": "超能",
"singleType.desc.14": "你只能使用超能属性的宝可梦",
"singleType.value.15": "冰",
"singleType.desc.15": "你只能使用冰属性的宝可梦",
"singleType.value.16": "龙",
"singleType.desc.16": "你只能使用龙属性的宝可梦",
"singleType.value.17": "恶",
"singleType.desc.17": "你只能使用恶属性的宝可梦",
"singleType.value.18": "妖精",
"singleType.desc.18": "你只能使用妖精属性的宝可梦",
} as const; } as const;

View File

@ -0,0 +1,5 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const common: SimpleTranslationEntries = {
"start": "开始",
} as const;

View File

@ -40,6 +40,7 @@ import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { settings } from "#app/locales/zh_CN/settings.js"; import { settings } from "#app/locales/zh_CN/settings.js";
import { common } from "#app/locales/zh_CN/common.js";
export const zhCnConfig = { export const zhCnConfig = {
ability: ability, ability: ability,
@ -50,6 +51,7 @@ export const zhCnConfig = {
biome: biome, biome: biome,
challenges: challenges, challenges: challenges,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
common: common,
PGMachv: PGMachv, PGMachv: PGMachv,
PGFachv: PGFachv, PGFachv: PGFachv,
PGMdialogue: PGMdialogue, PGMdialogue: PGMdialogue,

View File

@ -93,7 +93,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
description: "招式命中率增加{{accuracyAmount}} (最大100)。", description: "招式命中率增加{{accuracyAmount}} (最大100)。",
}, },
"PokemonMultiHitModifierType": { "PokemonMultiHitModifierType": {
description: "攻击造成一次额外伤害,\n每堆叠一件会让攻击伤害\n衰减60/75/82.5%。", description: "攻击以40/25/12.5%的伤害造成2/3/4次伤害",
}, },
"TmModifierType": { "TmModifierType": {
name: "招式学习器 {{moveId}} - {{moveName}}", name: "招式学习器 {{moveId}} - {{moveName}}",

View File

@ -52,8 +52,8 @@ export const settings: SimpleTranslationEntries = {
"showArenaFlyout": "显示战场弹窗", "showArenaFlyout": "显示战场弹窗",
"showTimeOfDayWidget": "显示时间指示器", "showTimeOfDayWidget": "显示时间指示器",
"timeOfDayAnimation": "时间指示器动画", "timeOfDayAnimation": "时间指示器动画",
"bounce": "彈一下", "bounce": "弹跳",
"timeOfDay_back": "不", "timeOfDay_back": "不",
"spriteSet": "宝可梦动画", "spriteSet": "宝可梦动画",
"consistent": "默认", "consistent": "默认",
"mixedAnimated": "全部动画", "mixedAnimated": "全部动画",

View File

@ -21,7 +21,6 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"passive": "被动:", "passive": "被动:",
"nature": "性格:", "nature": "性格:",
"eggMoves": "蛋招式", "eggMoves": "蛋招式",
"start": "开始",
"addToParty": "加入队伍", "addToParty": "加入队伍",
"toggleIVs": "切换个体值", "toggleIVs": "切换个体值",
"manageMoves": "管理招式", "manageMoves": "管理招式",

View File

@ -68,4 +68,61 @@ export const battle: SimpleTranslationEntries = {
"statSeverelyFell": "severely fell", "statSeverelyFell": "severely fell",
"statWontGoAnyLower": "won't go any lower", "statWontGoAnyLower": "won't go any lower",
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"battlerTagsEncoreOnAdd": "({{pokemonNameWithAffix}} got\nan Encore!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!"
} as const; } as const;

Some files were not shown because too many files have changed in this diff Show More