Compare commits

...

16 Commits

Author SHA1 Message Date
Amani H.
a35aff7b25
[Refactor/Bug] Overhaul & Document Item/Modifier Overrides (#2320)
* Overhaul & Document Item/Modifier Overrides

* add reverse lookup for modifier tier in modifier overrides

* Refactor `withTierFromPool`

* Minor NIT

* Another NIT

* Fix `strict null` issue

---------

Co-authored-by: ImperialSympathizer <imperialsympathizer@gmail.com>
2024-08-12 11:54:52 +01:00
NightKev
223295e827
[Fix] Refactor Disguise to work like Ice Face (#2684)
* Fix typos in `src/data/egg.ts` comments

* Refactor Disguise using Ice Face as a base

i18n {
  Co-authored-by: Arxxer <javiptn7@gmail.com>
  Co-authored-by: GoldTra <162721984+GoldTra@users.noreply.github.com>
  Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com>
  Co-authored-by: José Ricardo Fleury Oliveira <josefleury@discente.ufg.br>
  Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com>
}

Update tests

* Update jsdoc

* Make recoil damage a parameter

* Fix Ice Face i18n parameter name

* Add i18n placeholder strings for translation

* Update disguise test with override helper functions

* Move a form change from `battle-scene.ts` to `ability.ts`

* Remove a bit of obsolete code from the Disguise test

* Add some translations

Co-authored-by: Lugiad' <adrien.grivel@hotmail.fr>
Co-authored-by: returntoice <dieandbecome@gmail.com>
Co-authored-by: José Ricardo Fleury Oliveira <josefleury@discente.ufg.br>
Co-authored-by: Sonny Ding <93831983+sonnyding1@users.noreply.github.com>

* Add translation placeholder strings for Japanese and Catalan

* Update for strict-null

* Remove unused parameter from the `BattlerTag` class

* Remove species checks, fusion doesn't seem to be an issue (any more?)

* Move Ice Face weather-based code to a subclass

* Condense conditionals

Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>

---------

Co-authored-by: Lugiad' <adrien.grivel@hotmail.fr>
Co-authored-by: returntoice <dieandbecome@gmail.com>
Co-authored-by: José Ricardo Fleury Oliveira <josefleury@discente.ufg.br>
Co-authored-by: Sonny Ding <93831983+sonnyding1@users.noreply.github.com>
Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com>
2024-08-12 11:52:39 +01:00
Leo Kim
d3d376dca3
[Enhancement] update initial filter setting when not in challenge mode (#3506)
* update initial filter setting when not in challenge mode

* Modify the code with more consideration for future scalability.

* update initial setting in challenge mode also. no conditional setting!
2024-08-12 02:19:20 -04:00
Amani H.
d2c6aa5df8
[Bug] Prevent Relearnable Egg Moves in Fresh Start (#3466)
* [Bug] Prevent Relearnable Egg Moves in Fresh Start

* Mention Condition in Docs

* Use `isFreshStartChallenge()`
2024-08-12 01:49:32 -04:00
Tempoanon
63b5195b14
[Bug] Some fresh start fixes (#3420)
* Fix some fresh start bugs

* Forgot a !

* Add fresh start check on eviolite too

* Remove part about cost being 3

* Update src/game-mode.ts

Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>

* Rename isFreshStart helper function

---------

Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
2024-08-12 01:34:53 -04:00
allen925
c078e5d612
[Bug][Test] Fix minor bug of ability Flash Fire, added test file (#3458)
* fix: let flash fire hit after frozen, and baton pass not passing it. added: flash fire test file

* added more tests and made small adjustments

* Update src/test/abilities/flash_fire.test.ts

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>

---------

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>
2024-08-12 01:26:37 -04:00
DustinLin
ec26e751f8
[TEST] - adding parting shot move test (#3412)
* adding parting shot test

* improve tests

* updating test

* fixing existing tests

* more tests

* adding more tests
2024-08-12 01:13:56 -04:00
Enoch
0c64b01f3f
[Refactor] move and change localization key of battler-tags (#3498)
* move locale messages of battler tags : battle.ts -> battler-tags.ts

* Change message key name to simple

* Apply suggestions from code review

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-08-12 01:02:44 -04:00
Chapybara-jp
0028ae8a6d
[Localization(ja)] Translate starter-select-ui-handler.ts (#3481)
* [JA] [Localization] Translate starter-select-ui-handler.ts

Unsure about "Enable/Disbale Passive", need some advice.

* Update starter-select-ui-handler.ts
2024-08-12 01:02:06 -04:00
protimita
097d43feaf
[Localization(ja)] Translated modifier.ts, arena-tag.ts (#3487)
* [Localization][JA] translated modifier.ts

translation for modifier.ts

* Update src/locales/ja/modifier.ts

Co-authored-by: Chapybara-jp <charlie.beer@hotmail.com>

* Update src/locales/ja/modifier.ts

Co-authored-by: Chapybara-jp <charlie.beer@hotmail.com>

* [Localization][JA] Translated arena-tag.ts

Translation for arena-tag.ts

---------

Co-authored-by: Chapybara-jp <charlie.beer@hotmail.com>
2024-08-12 01:00:54 -04:00
Chapybara-jp
d19caf6650
[Localisation(ja)] Translated save-slot-select-ui-handler.ts (#3475)
* Translated save-slot-select-ui-handler.ts

"Wave" needs special coding to look correct.

* Update save-slot-select-ui-handler.ts

missed a space, punctuation

* Update save-slot-select-ui-handler.ts

* Update save-slot-select-ui-handler.ts
2024-08-12 00:57:47 -04:00
AJ Fontaine
77a9a2306b
[Item] Skip Ability Charm reward after wave 189 in classic (#3477) 2024-08-12 00:57:19 -04:00
Adrian T.
4b16b64eed
[Test] move util func to gameManager.ts (#3494) 2024-08-12 00:56:31 -04:00
NightKev
0e0ed10ce0
[Test] Fix test names that weren't changed from copy/pasting (#3502) 2024-08-12 00:54:42 -04:00
Leo Kim
53e54df9ee
[Enhancement] Add Passive / Cost Reduction - Can Unlock option and Egg purchasable filter (#3478)
* add unlockable state in passive/cost reduction filter. add egg purchasable filter

* update placeholders

* update option order of UNLOCKABLE between ON and EXCLUDE

* remove egg restriction when buying eggs
2024-08-12 00:44:15 -04:00
MokaStitcher
f8b9397d06
[UI] add open filter button for mobile touch pad (#3480) 2024-08-12 00:44:00 -04:00
88 changed files with 1788 additions and 1212 deletions

View File

@ -69,7 +69,9 @@ input:-internal-autofill-selected {
--controls-padding: 1rem; --controls-padding: 1rem;
--controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding)); --controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding));
--controls-size-with-wide-padding: calc(var(--controls-size) *1.2 + var(--controls-padding));
--control-group-extra-size: calc(var(--controls-size) * 0.8); --control-group-extra-size: calc(var(--controls-size) * 0.8);
--control-group-extra-wide-size: calc(var(--controls-size) * 1.2);
--control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); --control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
--control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); --control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
@ -117,25 +119,31 @@ input:-internal-autofill-selected {
width: var(--control-group-extra-size); width: var(--control-group-extra-size);
height: var(--control-group-extra-size); height: var(--control-group-extra-size);
} }
/* Hide buttons on specific UIs */ /* Hide buttons on specific UIs */
/* Show #cycleForm and #cycleShiny only on STARTER_SELECT and SETTINGS */ /* Show #apadPreviousTab and #apadNextTab only in settings, except in touch configuration panel */
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode^='SETTINGS']) #apadCycleForm, #touchControls:not([data-ui-mode^='SETTINGS']) #apadPreviousTab,
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode^='SETTINGS']) #apadCycleShiny { #touchControls:not([data-ui-mode^='SETTINGS']) #apadNextTab,
#touchControls:is(.config-mode) #apadPreviousTab,
#touchControls:is(.config-mode) #apadNextTab {
display: none; display: none;
} }
/* Show #apadInfo only in battle */ /* Show #apadInfo only in battle */
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']) #apadInfo { #touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apadInfo {
display: none; display: none;
} }
/* Show #apadInfo only in battle and target select */ /* Show #apadStats only in battle and shop */
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats { #touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats {
display: none; display: none;
} }
/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleForm,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleShiny,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleAbility, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleAbility,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender,
@ -272,8 +280,8 @@ input:-internal-autofill-selected {
} }
#control-group-cancel { #control-group-cancel {
right: var(--controls-size-with-padding); right: var(--controls-size-with-wide-padding);
bottom: var(--controls-padding);; bottom: var(--controls-padding);
} }
#control-group-extra-1 { #control-group-extra-1 {
@ -282,6 +290,7 @@ input:-internal-autofill-selected {
} }
#control-group-extra-2 { #control-group-extra-2 {
width: var(--control-group-extra-wide-size);
right: var(--control-group-extra-2-offset); right: var(--control-group-extra-2-offset);
bottom: var(--control-group-extra-2-offset); bottom: var(--control-group-extra-2-offset);
} }

View File

@ -96,36 +96,50 @@
</div> </div>
<div id="control-group-extra-1" class="control-group control-group-extra"> <div id="control-group-extra-1" class="control-group control-group-extra">
<div id="apadCycleShiny" class="apad-button apad-square apad-small" data-key="CYCLE_SHINY"> <!-- buttons to navigate settings tabs -->
<div id="apadPreviousTab" class="apad-button apad-square apad-small" data-key="CYCLE_FORM">
<span class="apad-label">F</span>
</div>
<div id="apadNextTab" class="apad-button apad-square apad-small" data-key="CYCLE_SHINY">
<span class="apad-label">R</span> <span class="apad-label">R</span>
</div> </div>
<div id="apadCycleVariant" class="apad-button apad-square apad-small" data-key="V"> <!-- buttons to open filter menu in starter select -->
<span class="apad-label">V</span> <div id="apadOpenFilters" class="apad-button apad-rectangle apad-small" data-key="STATS">
</div>
<div id="apadStats" class="apad-button apad-rectangle apad-small" data-key="STATS">
<span class="apad-label">C</span> <span class="apad-label">C</span>
</div> </div>
<!-- main menu button -->
<div id="apadMenu" class="apad-button apad-rectangle apad-small" data-key="MENU"> <div id="apadMenu" class="apad-button apad-rectangle apad-small" data-key="MENU">
<span class="apad-label">Menu</span> <span class="apad-label">Menu</span>
</div> </div>
</div> </div>
<div id="control-group-extra-2" class="control-group control-group-extra"> <div id="control-group-extra-2" class="control-group control-group-extra">
<!-- buttons to cycle through pokemon characteristics in starter select -->
<div id="apadCycleForm" class="apad-button apad-square apad-small" data-key="CYCLE_FORM"> <div id="apadCycleForm" class="apad-button apad-square apad-small" data-key="CYCLE_FORM">
<span class="apad-label">F</span> <span class="apad-label">F</span>
</div> </div>
<div id="apadCycleGender" class="apad-button apad-square apad-small" data-key="CYCLE_GENDER"> <div id="apadCycleGender" class="apad-button apad-square apad-small" data-key="CYCLE_GENDER">
<span class="apad-label">G</span> <span class="apad-label">G</span>
</div> </div>
<div id="apadCycleShiny" class="apad-button apad-square apad-small" data-key="CYCLE_SHINY">
<span class="apad-label">R</span>
</div>
<div id="apadCycleAbility" class="apad-button apad-square apad-small" data-key="CYCLE_ABILITY"> <div id="apadCycleAbility" class="apad-button apad-square apad-small" data-key="CYCLE_ABILITY">
<span class="apad-label">E</span> <span class="apad-label">E</span>
</div> </div>
<div id="apadCycleNature" class="apad-button apad-square apad-small" data-key="CYCLE_NATURE"> <div id="apadCycleNature" class="apad-button apad-square apad-small" data-key="CYCLE_NATURE">
<span class="apad-label">N</span> <span class="apad-label">N</span>
</div> </div>
<div id="apadCycleVariant" class="apad-button apad-square apad-small" data-key="V">
<span class="apad-label">V</span>
</div>
<!-- buttons to display battle-specific information -->
<div id="apadInfo" class="apad-button apad-rectangle apad-small" data-key="V"> <div id="apadInfo" class="apad-button apad-rectangle apad-small" data-key="V">
<span class="apad-label">V</span> <span class="apad-label">V</span>
</div> </div>
<div id="apadStats" class="apad-button apad-rectangle apad-small" data-key="STATS">
<span class="apad-label">C</span>
</div>
</div> </div>
</div> </div>

View File

@ -55,7 +55,6 @@ import {UiInputs} from "./ui-inputs";
import { NewArenaEvent } from "./events/battle-scene"; import { NewArenaEvent } from "./events/battle-scene";
import { ArenaFlyout } from "./ui/arena-flyout"; import { ArenaFlyout } from "./ui/arena-flyout";
import { EaseType } from "#enums/ease-type"; import { EaseType } from "#enums/ease-type";
import { Abilities } from "#enums/abilities";
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
import { BattleStyle } from "#enums/battle-style"; import { BattleStyle } from "#enums/battle-style";
import { Biome } from "#enums/biome"; import { Biome } from "#enums/biome";
@ -1153,12 +1152,6 @@ export default class BattleScene extends SceneBase {
playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p))); playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p)));
for (const pokemon of this.getParty()) { for (const pokemon of this.getParty()) {
// Only trigger form change when Eiscue is in Noice form
// Hardcoded Eiscue for now in case it is fused with another pokemon
if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) {
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger);
}
pokemon.resetBattleData(); pokemon.resetBattleData();
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
} }

View File

@ -245,25 +245,6 @@ export class PreDefendAbAttr extends AbAttr {
} }
} }
export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
private formFunc: (p: Pokemon) => integer;
constructor(formFunc: ((p: Pokemon) => integer)) {
super(true);
this.formFunc = formFunc;
}
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const formIndex = this.formFunc(pokemon);
if (formIndex !== pokemon.formIndex) {
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
return true;
}
return false;
}
}
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
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 {
if (pokemon.isFullHp() && if (pokemon.isFullHp() &&
@ -330,21 +311,6 @@ export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultip
} }
} }
export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
constructor(condition: PokemonDefendCondition) {
super(condition, 1);
}
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.condition(pokemon, attacker, move)) {
(args[0] as Utils.NumberHolder).value = Math.floor(pokemon.getMaxHp() / 8);
return true;
}
return false;
}
}
/** /**
* Determines whether a Pokemon is immune to a move because of an ability. * Determines whether a Pokemon is immune to a move because of an ability.
* @extends PreDefendAbAttr * @extends PreDefendAbAttr
@ -539,45 +505,6 @@ export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr {
} }
} }
export class PostDefendDisguiseAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
if (pokemon.formIndex === 0 && pokemon.battleData.hitCount !== 0 && (move.category === MoveCategory.SPECIAL || move.category === MoveCategory.PHYSICAL)) {
const recoilDamage = Math.ceil((pokemon.getMaxHp() / 8) - attacker.turnData.damageDealt);
if (!recoilDamage) {
return false;
}
pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER);
pokemon.turnData.damageTaken += recoilDamage;
pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendDisguise", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true;
}
return false;
}
}
export class PostDefendFormChangeAbAttr extends PostDefendAbAttr {
private formFunc: (p: Pokemon) => integer;
constructor(formFunc: ((p: Pokemon) => integer)) {
super(true);
this.formFunc = formFunc;
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
const formIndex = this.formFunc(pokemon);
if (formIndex !== pokemon.formIndex) {
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
return true;
}
return false;
}
}
export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr {
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 attackPriority = new Utils.IntegerHolder(move.priority); const attackPriority = new Utils.IntegerHolder(move.priority);
@ -4045,34 +3972,44 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt
} }
/** /**
* Takes no damage from the first hit of a physical move. * Takes no damage from the first hit of a damaging move.
* This is used in Ice Face ability. * This is used in the Disguise and Ice Face abilities.
* @extends ReceivedMoveDamageMultiplierAbAttr
*/ */
export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAttr { export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
private multiplier: number; private multiplier: number;
private tagType: BattlerTagType;
private recoilDamageFunc: ((pokemon: Pokemon) => number) | undefined;
private triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string;
constructor(condition: PokemonDefendCondition, multiplier: number) { constructor(condition: PokemonDefendCondition, multiplier: number, tagType: BattlerTagType, triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string, recoilDamageFunc?: (pokemon: Pokemon) => number) {
super(condition, multiplier); super(condition, multiplier);
this.multiplier = multiplier; this.multiplier = multiplier;
this.tagType = tagType;
this.recoilDamageFunc = recoilDamageFunc;
this.triggerMessageFunc = triggerMessageFunc;
} }
/** /**
* Applies the Ice Face pre-defense ability to the Pokémon. * Applies the pre-defense ability to the Pokémon.
* Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form. * Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form.
* *
* @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {Pokemon} pokemon The Pokémon with the ability.
* @param {boolean} passive - Whether the ability is passive. * @param {boolean} passive n/a
* @param {Pokemon} attacker - The attacking Pokémon. * @param {Pokemon} attacker The attacking Pokémon.
* @param {PokemonMove} move - The move being used. * @param {PokemonMove} move The move being used.
* @param {Utils.BooleanHolder} cancelled - A holder for whether the move was cancelled. * @param {Utils.BooleanHolder} cancelled n/a
* @param {any[]} args - Additional arguments. * @param {any[]} args Additional arguments.
* @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 {
if (this.condition(pokemon, attacker, move)) { if (this.condition(pokemon, attacker, move)) {
(args[0] as Utils.NumberHolder).value = this.multiplier; (args[0] as Utils.NumberHolder).value = this.multiplier;
pokemon.removeTag(BattlerTagType.ICE_FACE); pokemon.removeTag(this.tagType);
if (this.recoilDamageFunc) {
pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER);
}
return true; return true;
} }
@ -4080,14 +4017,14 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt
} }
/** /**
* Gets the message triggered when the Pokémon avoids damage using the Ice Face ability. * Gets the message triggered when the Pokémon avoids damage using the form-changing ability.
* @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {Pokemon} pokemon The Pokémon with the ability.
* @param {string} abilityName - The name of the ability. * @param {string} abilityName The name of the ability.
* @param {...any} args - Additional arguments. * @param {...any} args n/a
* @returns {string} - The trigger message. * @returns {string} The trigger message.
*/ */
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }); return this.triggerMessageFunc(pokemon, abilityName);
} }
} }
@ -4408,7 +4345,7 @@ export function initAbilities() {
.attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
.ignorable(), .ignorable(),
new Ability(Abilities.FLASH_FIRE, 3) new Ability(Abilities.FLASH_FIRE, 3)
.attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1, (pokemon: Pokemon) => !pokemon.status || pokemon.status.effect !== StatusEffect.FREEZE) .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1)
.ignorable(), .ignorable(),
new Ability(Abilities.SHIELD_DUST, 3) new Ability(Abilities.SHIELD_DUST, 3)
.attr(IgnoreMoveEffectsAbAttr) .attr(IgnoreMoveEffectsAbAttr)
@ -5004,20 +4941,18 @@ export function initAbilities() {
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.DISGUISE, 7) new Ability(Abilities.DISGUISE, 7)
.attr(PreDefendMoveDamageToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0)
.attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PreDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PostDefendDisguiseAbAttr)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr) .attr(NoTransformAbilityAbAttr)
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.bypassFaint() // Add BattlerTagType.DISGUISE if the pokemon is in its disguised form
.ignorable() .conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false)
.partial(), .attr(FormBlockDamageAbAttr, (target, user, move) => !!target.getTag(BattlerTagType.DISGUISE) && target.getAttackTypeEffectiveness(move.type, user) > 0, 0, BattlerTagType.DISGUISE,
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
(pokemon) => Math.floor(pokemon.getMaxHp() / 8))
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.ignorable(),
new Ability(Abilities.BATTLE_BOND, 7) new Ability(Abilities.BATTLE_BOND, 7)
.attr(PostVictoryFormChangeAbAttr, () => 2) .attr(PostVictoryFormChangeAbAttr, () => 2)
.attr(PostBattleInitFormChangeAbAttr, () => 1) .attr(PostBattleInitFormChangeAbAttr, () => 1)
@ -5166,7 +5101,9 @@ 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(IceFaceBlockPhysicalAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0) .attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
.attr(PostBattleInitFormChangeAbAttr, () => 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

@ -110,7 +110,7 @@ export class RechargingTag extends BattlerTag {
/** Cancels the source's move this turn and queues a "__ must recharge!" message */ /** Cancels the source's move this turn and queues a "__ must recharge!" message */
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.PRE_MOVE) { if (lapseType === BattlerTagLapseType.PRE_MOVE) {
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:rechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
pokemon.getMoveQueue().shift(); pokemon.getMoveQueue().shift();
} }
@ -177,7 +177,7 @@ export class TrappedTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTrappedOnRemove", { pokemon.scene.queueMessage(i18next.t("battlerTags:trappedOnRemove", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName() moveName: this.getMoveName()
})); }));
@ -192,7 +192,7 @@ export class TrappedTag extends BattlerTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsTrappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlerTags:trappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -223,7 +223,7 @@ export class FlinchedTag extends BattlerTag {
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.PRE_MOVE) { if (lapseType === BattlerTagLapseType.PRE_MOVE) {
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:flinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
return super.lapse(pokemon, lapseType); return super.lapse(pokemon, lapseType);
@ -272,26 +272,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(i18next.t("battle:battlerTagsConfusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnOverlap", { 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(i18next.t("battle:battlerTagsConfusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapse", { 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
@ -299,7 +299,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(i18next.t("battle:battlerTagsConfusedLapseHurtItself")); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
pokemon.damageAndUpdate(damage); pokemon.damageAndUpdate(damage);
pokemon.battleData.hitCount++; pokemon.battleData.hitCount++;
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
@ -347,12 +347,12 @@ export class DestinyBondTag extends BattlerTag {
} }
if (pokemon.isBossImmune()) { if (pokemon.isBossImmune()) {
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDestinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:destinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return false; return false;
} }
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsDestinyBondLapse", { i18next.t("battlerTags:destinyBondLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(source), pokemonNameWithAffix: getPokemonNameWithAffix(source),
pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon) pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon)
}) })
@ -387,7 +387,7 @@ export class InfatuatedTag extends BattlerTag {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsInfatuatedOnAdd", { i18next.t("battlerTags:infatuatedOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct?
}) })
@ -397,7 +397,7 @@ export class InfatuatedTag extends BattlerTag {
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -405,7 +405,7 @@ export class InfatuatedTag extends BattlerTag {
if (ret) { if (ret) {
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsInfatuatedLapse", { i18next.t("battlerTags:infatuatedLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct?
}) })
@ -413,7 +413,7 @@ export class InfatuatedTag extends BattlerTag {
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(i18next.t("battle:battlerTagsInfatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
(pokemon.scene.getCurrentPhase() as MovePhase).cancel(); (pokemon.scene.getCurrentPhase() as MovePhase).cancel();
} }
} }
@ -424,7 +424,7 @@ export class InfatuatedTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
isSourceLinked(): boolean { isSourceLinked(): boolean {
@ -459,7 +459,7 @@ export class SeedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSeededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:seededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct?
} }
@ -479,7 +479,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 ? i18next.t("battle:battlerTagsSeededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battle:battlerTagsSeededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), !reverseDrain ? i18next.t("battlerTags:seededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battlerTags:seededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }),
false, true)); false, true));
} }
} }
@ -501,20 +501,20 @@ export class NightmareTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onOverlap(pokemon: Pokemon): void { onOverlap(pokemon: Pokemon): void {
super.onOverlap(pokemon); super.onOverlap(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnOverlap", { 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(i18next.t("battle:battlerTagsNightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareLapse", { 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);
@ -602,7 +602,7 @@ export class EncoreTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnAdd", { 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) {
@ -618,7 +618,7 @@ export class EncoreTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -629,7 +629,7 @@ export class HelpingHandTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsHelpingHandOnAdd", { i18next.t("battlerTags:helpingHandOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
pokemonName: getPokemonNameWithAffix(pokemon) pokemonName: getPokemonNameWithAffix(pokemon)
}) })
@ -666,7 +666,7 @@ export class IngrainTag extends TrappedTag {
pokemon.scene, pokemon.scene,
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
Math.floor(pokemon.getMaxHp() / 16), Math.floor(pokemon.getMaxHp() / 16),
i18next.t("battle:battlerTagsIngrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }),
true true
) )
); );
@ -676,7 +676,7 @@ export class IngrainTag extends TrappedTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsIngrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlerTags:ingrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
getDescriptor(): string { getDescriptor(): string {
@ -717,7 +717,7 @@ export class AquaRingTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsAquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:aquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -729,7 +729,7 @@ export class AquaRingTag extends BattlerTag {
pokemon.scene, pokemon.scene,
pokemon.getBattlerIndex(), pokemon.getBattlerIndex(),
Math.floor(pokemon.getMaxHp() / 16), Math.floor(pokemon.getMaxHp() / 16),
i18next.t("battle:battlerTagsAquaRingLapse", { i18next.t("battlerTags:aquaRingLapse", {
moveName: this.getMoveName(), moveName: this.getMoveName(),
pokemonName: getPokemonNameWithAffix(pokemon) pokemonName: getPokemonNameWithAffix(pokemon)
}), }),
@ -779,7 +779,7 @@ export class DrowsyTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDrowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:drowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -823,7 +823,7 @@ export abstract class DamagingTrapTag extends TrappedTag {
if (ret) { if (ret) {
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsDamagingTrapLapse", { i18next.t("battlerTags:damagingTrapLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName() moveName: this.getMoveName()
}) })
@ -848,7 +848,7 @@ export class BindTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsBindOnTrap", { return i18next.t("battlerTags:bindOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
moveName: this.getMoveName() moveName: this.getMoveName()
@ -862,7 +862,7 @@ export class WrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsWrapOnTrap", { return i18next.t("battlerTags:wrapOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
}); });
@ -875,7 +875,7 @@ export abstract class VortexTrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsVortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlerTags:vortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -897,7 +897,7 @@ export class ClampTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsClampOnTrap", { return i18next.t("battlerTags:clampOnTrap", {
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
pokemonName: getPokemonNameWithAffix(pokemon), pokemonName: getPokemonNameWithAffix(pokemon),
}); });
@ -910,7 +910,7 @@ export class SandTombTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsSandTombOnTrap", { return i18next.t("battlerTags:sandTombOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName() moveName: this.getMoveName()
}); });
@ -923,7 +923,7 @@ export class MagmaStormTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsMagmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlerTags:magmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -933,7 +933,7 @@ export class SnapTrapTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsSnapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlerTags:snapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
} }
} }
@ -943,7 +943,7 @@ export class ThunderCageTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsThunderCageOnTrap", { return i18next.t("battlerTags:thunderCageOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
}); });
@ -956,7 +956,7 @@ export class InfestationTag extends DamagingTrapTag {
} }
getTrapMessage(pokemon: Pokemon): string { getTrapMessage(pokemon: Pokemon): string {
return i18next.t("battle:battlerTagsInfestationOnTrap", { return i18next.t("battlerTags:infestationOnTrap", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct?
}); });
@ -972,13 +972,13 @@ export class ProtectedTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:protectedOnAdd", { 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(i18next.t("battle:battlerTagsProtectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:protectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
// Stop multi-hit moves early // Stop multi-hit moves early
const effectPhase = pokemon.scene.getCurrentPhase(); const effectPhase = pokemon.scene.getCurrentPhase();
@ -1111,12 +1111,12 @@ export class EnduringTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:enduringOnAdd", { 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(i18next.t("battle:battlerTagsEnduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:enduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -1131,7 +1131,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(i18next.t("battle:battlerTagsSturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:sturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true; return true;
} }
@ -1153,7 +1153,7 @@ export class PerishSongTag extends BattlerTag {
if (ret) { if (ret) {
pokemon.scene.queueMessage( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsPerishSongLapse", { i18next.t("battlerTags:perishSongLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
turnCount: this.turnCount turnCount: this.turnCount
}) })
@ -1189,7 +1189,7 @@ export class CenterOfAttentionTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCenterOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:centerOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -1228,7 +1228,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(i18next.t("battle:battlerTagsTruantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:truantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
return true; return true;
@ -1243,7 +1243,7 @@ export class SlowStartTag extends AbilityBattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true);
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1257,7 +1257,7 @@ export class SlowStartTag extends AbilityBattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null);
} }
} }
@ -1304,13 +1304,13 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
break; break;
} }
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true); pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { 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(i18next.t("battle:battlerTagsHighestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name }));
} }
} }
@ -1397,13 +1397,13 @@ export class MagnetRisenTag extends TypeImmuneTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsMagnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsMagnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -1444,7 +1444,7 @@ export class CritBoostTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1454,7 +1454,7 @@ export class CritBoostTag extends BattlerTag {
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -1477,7 +1477,7 @@ export class SaltCuredTag extends BattlerTag {
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSaltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:saltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct?
} }
@ -1495,7 +1495,7 @@ export class SaltCuredTag extends BattlerTag {
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( pokemon.scene.queueMessage(
i18next.t("battle:battlerTagsSaltCuredLapse", { i18next.t("battlerTags:saltCuredLapse", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
moveName: this.getMoveName() moveName: this.getMoveName()
}) })
@ -1539,7 +1539,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(i18next.t("battle:battlerTagsCursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
} }
} }
@ -1558,36 +1558,25 @@ export class GroundedTag extends BattlerTag {
} }
} }
/** /** Common attributes of form change abilities that block damage */
* Provides the Ice Face ability's effects. export class FormBlockDamageTag extends BattlerTag {
*/ constructor(tagType: BattlerTagType) {
export class IceFaceTag extends BattlerTag { super(tagType, BattlerTagLapseType.CUSTOM, 1);
constructor(sourceMove: Moves) {
super(BattlerTagType.ICE_FACE, BattlerTagLapseType.CUSTOM, 1, sourceMove);
} }
/** /**
* Determines if the Ice Face tag can be added to the Pokémon. * Determines if the tag can be added to the Pokémon.
* @param {Pokemon} pokemon - The Pokémon to which the tag might be added. * @param {Pokemon} pokemon The Pokémon to which the tag might be added.
* @returns {boolean} - True if the tag can be added, false otherwise. * @returns {boolean} True if the tag can be added, false otherwise.
*/ */
canAdd(pokemon: Pokemon): boolean { canAdd(pokemon: Pokemon): boolean {
const weatherType = pokemon.scene.arena.weather?.weatherType; return pokemon.formIndex === 0;
const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW;
const isFormIceFace = pokemon.formIndex === 0;
// Hard code Eiscue for now, this is to prevent the game from crashing if fused pokemon has Ice Face
if ((pokemon.species.speciesId === Species.EISCUE && isFormIceFace) || isWeatherSnowOrHail) {
return true;
}
return false;
} }
/** /**
* Applies the Ice Face tag to the Pokémon. * Applies the tag to the Pokémon.
* Triggers a form change to Ice Face if the Pokémon is not in its Ice Face form. * Triggers a form change if the Pokémon is not in its defense form.
* @param {Pokemon} pokemon - The Pokémon to which the tag is added. * @param {Pokemon} pokemon The Pokémon to which the tag is added.
*/ */
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
@ -1598,9 +1587,9 @@ export class IceFaceTag extends BattlerTag {
} }
/** /**
* Removes the Ice Face tag from the Pokémon. * Removes the tag from the Pokémon.
* Triggers a form change to Noice when the tag is removed. * Triggers a form change when the tag is removed.
* @param {Pokemon} pokemon - The Pokémon from which the tag is removed. * @param {Pokemon} pokemon The Pokémon from which the tag is removed.
*/ */
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
@ -1609,6 +1598,24 @@ export class IceFaceTag extends BattlerTag {
} }
} }
/** Provides the additional weather-based effects of the Ice Face ability */
export class IceFaceBlockDamageTag extends FormBlockDamageTag {
constructor(tagType: BattlerTagType) {
super(tagType);
}
/**
* Determines if the tag can be added to the Pokémon.
* @param {Pokemon} pokemon The Pokémon to which the tag might be added.
* @returns {boolean} True if the tag can be added, false otherwise.
*/
canAdd(pokemon: Pokemon): boolean {
const weatherType = pokemon.scene.arena.weather?.weatherType;
const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW;
return super.canAdd(pokemon) || isWeatherSnowOrHail;
}
}
/** /**
* Battler tag enabling the Stockpile mechanic. This tag handles: * Battler tag enabling the Stockpile mechanic. This tag handles:
@ -1663,7 +1670,7 @@ export class StockpilingTag extends BattlerTag {
if (this.stockpiledCount < 3) { if (this.stockpiledCount < 3) {
this.stockpiledCount++; this.stockpiledCount++;
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsStockpilingOnAdd", { pokemon.scene.queueMessage(i18next.t("battlerTags:stockpilingOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
stockpiledCount: this.stockpiledCount stockpiledCount: this.stockpiledCount
})); }));
@ -1890,7 +1897,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
case BattlerTagType.DESTINY_BOND: case BattlerTagType.DESTINY_BOND:
return new DestinyBondTag(sourceMove, sourceId); return new DestinyBondTag(sourceMove, sourceId);
case BattlerTagType.ICE_FACE: case BattlerTagType.ICE_FACE:
return new IceFaceTag(sourceMove); return new IceFaceBlockDamageTag(tagType);
case BattlerTagType.DISGUISE:
return new FormBlockDamageTag(tagType);
case BattlerTagType.STOCKPILING: case BattlerTagType.STOCKPILING:
return new StockpilingTag(sourceMove); return new StockpilingTag(sourceMove);
case BattlerTagType.OCTOLOCK: case BattlerTagType.OCTOLOCK:

View File

@ -630,8 +630,8 @@ export class FreshStartChallenge extends Challenge {
} }
applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean {
if (defaultStarterSpecies.includes(species) && cost.value !== 3) { if (defaultStarterSpecies.includes(species)) {
cost.value = 3; cost.value = speciesStarters[species];
return true; return true;
} }
return false; return false;

View File

@ -4414,7 +4414,7 @@ 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( user.scene.queueMessage(
i18next.t("battle:battlerTagsCursedOnAdd", { i18next.t("battle:cursedOnAdd", {
pokemonNameWithAffix: getPokemonNameWithAffix(user), pokemonNameWithAffix: getPokemonNameWithAffix(user),
pokemonName: getPokemonNameWithAffix(target) pokemonName: getPokemonNameWithAffix(target)
}) })

View File

@ -372,6 +372,9 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie
if (isRevert) { if (isRevert) {
return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) }); return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) });
} }
if (pokemon.getAbility().id === Abilities.DISGUISE) {
return i18next.t("battlePokemonForm:disguiseChange");
}
return i18next.t("battlePokemonForm:formChange", { preName }); return i18next.t("battlePokemonForm:formChange", { preName });
} }

View File

@ -60,6 +60,7 @@ export enum BattlerTagType {
DESTINY_BOND = "DESTINY_BOND", DESTINY_BOND = "DESTINY_BOND",
CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION",
ICE_FACE = "ICE_FACE", ICE_FACE = "ICE_FACE",
DISGUISE = "DISGUISE",
STOCKPILING = "STOCKPILING", STOCKPILING = "STOCKPILING",
RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE",
ALWAYS_GET_HIT = "ALWAYS_GET_HIT", ALWAYS_GET_HIT = "ALWAYS_GET_HIT",

View File

@ -916,13 +916,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* excluding any moves already known. * excluding any moves already known.
* *
* Available egg moves are only included if the {@linkcode Pokemon} was * Available egg moves are only included if the {@linkcode Pokemon} was
* in the starting party of the run. * in the starting party of the run and if Fresh Start is not active.
* @returns an array of {@linkcode Moves}, the length of which is determined * @returns an array of {@linkcode Moves}, the length of which is determined
* by how many learnable moves there are for the {@linkcode Pokemon}. * by how many learnable moves there are for the {@linkcode Pokemon}.
*/ */
getLearnableLevelMoves(): Moves[] { getLearnableLevelMoves(): Moves[] {
let levelMoves = this.getLevelMoves(1, true).map(lm => lm[1]); let levelMoves = this.getLevelMoves(1, true).map(lm => lm[1]);
if (this.metBiome === -1) { if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge()) {
levelMoves = this.getUnlockedEggMoves().concat(levelMoves); levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
} }
return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm)); return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
@ -2440,8 +2440,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
for (const tag of source.summonData.tags) { for (const tag of source.summonData.tags) {
// bypass yawn, and infatuation as those can not be passed via Baton Pass // bypass those can not be passed via Baton Pass
if (tag.sourceMove === Moves.YAWN || tag.tagType === BattlerTagType.INFATUATED) { const excludeTagTypes = new Set([BattlerTagType.DROWSY, BattlerTagType.INFATUATED, BattlerTagType.FIRE_BOOST]);
if (excludeTagTypes.has(tag.tagType)) {
continue; continue;
} }

View File

@ -8,6 +8,7 @@ import Overrides from "#app/overrides";
import * as Utils from "./utils"; import * as Utils from "./utils";
import { Biome } from "#enums/biome"; import { Biome } from "#enums/biome";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { Challenges } from "./enums/challenges";
export enum GameModes { export enum GameModes {
CLASSIC, CLASSIC,
@ -55,6 +56,23 @@ export class GameMode implements GameModeConfig {
this.battleConfig = battleConfig || {}; this.battleConfig = battleConfig || {};
} }
/**
* Helper function to see if a GameMode has a specific challenge type
* @param challenge the Challenges it looks for
* @returns true if the game mode has that challenge
*/
hasChallenge(challenge: Challenges): boolean {
return this.challenges.some(c => c.id === challenge);
}
/**
* Helper function to see if the game mode is using fresh start
* @returns true if a fresh start challenge is being applied
*/
isFreshStartChallenge(): boolean {
return this.hasChallenge(Challenges.FRESH_START);
}
/** /**
* @returns either: * @returns either:
* - override from overrides.ts * - override from overrides.ts

View File

@ -10,6 +10,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
"quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}'s disguise was busted!",
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "Congratulations!", "congratulations": "Congratulations!",
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
"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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism 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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "nightmares", "nightmareDesc": "nightmares",
"ingrainDesc": "roots", "ingrainDesc": "roots",
"drowsyDesc": "drowsiness", "drowsyDesc": "drowsiness",
"rechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"trappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"trappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!",
"flinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"confusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"confusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"confusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"confusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"destinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"infatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"seededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"seededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"seededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"nightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"nightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"encoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!",
"encoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"aquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"bindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"wrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"vortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"infestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"protectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"enduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"enduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"sturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"perishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"truantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"highestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -8,14 +8,16 @@ export const filterBar: SimpleTranslationEntries = {
"miscFilter": "Misc", "miscFilter": "Misc",
"sortFilter": "Sort", "sortFilter": "Sort",
"all": "All", "all": "All",
"normal": "Normal", "normal": "Not Shiny",
"uncaught": "Uncaught", "uncaught": "Uncaught",
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passive Unlocked", "passiveUnlocked": "Passive - Yes",
"passiveLocked": "Passive Locked", "passiveLocked": "Passive - No",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction - Yes",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction - No",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!",
"revertChange": "{{pokemonName}} reverted\nto its original form!", "revertChange": "{{pokemonName}} reverted\nto its original form!",
"formChange": "{{preName}} changed form!", "formChange": "{{preName}} changed form!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage": "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "blockRecoilDamage": "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!",
"badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!",
"costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!",
"iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} wehrt Schaden mit {{abilityName}} ab!",
"perishBody": "Durch {{abilityName}} von {{pokemonName}} werden beide Pokémon nach drei Runden K.O. gehen!", "perishBody": "Durch {{abilityName}} von {{pokemonName}} werden beide Pokémon nach drei Runden K.O. gehen!",
"poisonHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", "poisonHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!",
"trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!",
@ -13,7 +13,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockItemTheft": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Item-Diebstahl!", "blockItemTheft": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Item-Diebstahl!",
"typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!",
"postDefendDisguise": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", "disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!",
"moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...", "moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...",
"reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!",
"postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.", "unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.",
"congratulations": "Glückwunsch!", "congratulations": "Glückwunsch!",
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
"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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} zieht alle Aufmerksamkeit auf sich!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} schwebt aufgrund von Elektromagnetismus!",
"battlerTagsMagnetRisenOnRemove": "Der Elektromagnetismus von {{pokemonNameWithAffix}} hört auf zu wirken!",
"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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "Nachtmahr", "nightmareDesc": "Nachtmahr",
"ingrainDesc": "Verwurzlung", "ingrainDesc": "Verwurzlung",
"drowsyDesc": "Schläfrigkeit", "drowsyDesc": "Schläfrigkeit",
"rechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!",
"trappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!",
"trappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.",
"flinchedLapse": "{{pokemonNameWithAffix}} ist zurückgeschreckt und kann nicht handeln!",
"confusedOnAdd": "{{pokemonNameWithAffix}} wurde verwirrt!",
"confusedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verwirrt!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verwirrt!",
"confusedLapse": "{{pokemonNameWithAffix}} ist verwirrt!",
"confusedLapseHurtItself": "Es hat sich vor Verwirrung selbst verletzt!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} ist immun gegen den Effekt von Abgangsbund!",
"destinyBondLapse": "{{pokemonNameWithAffix}} nimmt {{pokemonNameWithAffix2}} mit sich!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} hat sich in {{sourcePokemonName}} verliebt!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verliebt.",
"infatuatedLapse": "{{pokemonNameWithAffix}} ist in {{sourcePokemonName}} verliebt!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} ist starr vor Liebe!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verliebt!",
"seededOnAdd": "{{pokemonNameWithAffix}} wurde bepflanzt!",
"seededLapse": "{{pokemonNameWithAffix}} wurden durch Egelsamen KP geraubt!",
"seededLapseShed": "Egelsamen von {{pokemonNameWithAffix}} saugt Kloakensoße auf!",
"nightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!",
"nightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!",
"encoreOnAdd": "{{pokemonNameWithAffix}} gibt eine Zugabe",
"encoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!",
"ingrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} pflanzt seine Wurzeln!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} umgibt sich mit einem Wasserring!",
"aquaRingLapse": "{{moveName}} füllt KP von {{pokemonName}} wieder auf!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} wurde schläfrig gemacht!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"bindOnTrap": "{{pokemonNameWithAffix}} wurde durch {{moveName}} von {{sourcePokemonName}} gequetscht!",
"wrapOnTrap": "{{pokemonNameWithAffix}} wurde von {{sourcePokemonName}} umwickelt!",
"vortexOnTrap": "{{pokemonNameWithAffix}} wird in dem Strudel gefangen!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} wurde von {{pokemonName}} geschnappt!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} wurde von {{moveName}} gefangen!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} wurde in wirbelndem Magma eingeschlossen!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} wurde durch Sandgrab gefangen!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} hat {{pokemonNameWithAffix}} gefangen!",
"infestationOnTrap": "{{sourcePokemonNameWithAffix}} plagt {{pokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}} schützt sich selbst!",
"protectedLapse": "{{pokemonNameWithAffix}} schützt sich selbst!",
"enduringOnAdd": "{{pokemonNameWithAffix}} sammelt sich, um die nächste Attacke zu überstehen!",
"enduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!",
"sturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!",
"perishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} zieht alle Aufmerksamkeit auf sich!",
"truantLapse": "{{pokemonNameWithAffix}} faulenzt!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!",
"highestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!",
"highestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} schwebt aufgrund von Elektromagnetismus!",
"magnetRisenOnRemove": "Der Elektromagnetismus von {{pokemonNameWithAffix}} hört auf zu wirken!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!",
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passive freigeschaltet", "passiveUnlocked": "Passive freigeschaltet",
"passiveLocked": "Passive gesperrt", "passiveLocked": "Passive gesperrt",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -14,6 +14,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
"formChange": "{{preName}} hat seine Form geändert!", "formChange": "{{preName}} hat seine Form geändert!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!",
"badDreams": "{{pokemonName}} is tormented!", "badDreams": "{{pokemonName}} is tormented!",
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
"iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!",
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
"quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}'s disguise was busted!",
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
"postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "Congratulations!", "congratulations": "Congratulations!",
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
"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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism 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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "nightmares", "nightmareDesc": "nightmares",
"ingrainDesc": "roots", "ingrainDesc": "roots",
"drowsyDesc": "drowsiness", "drowsyDesc": "drowsiness",
"rechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"trappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"trappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!",
"flinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"confusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"confusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"confusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"confusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"destinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"infatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"seededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"seededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"seededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"nightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"nightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"encoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!",
"encoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"aquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"bindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"wrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"vortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"infestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"protectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"enduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"enduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"sturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"perishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"truantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"highestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -11,11 +11,13 @@ export const filterBar: SimpleTranslationEntries = {
"normal": "Not Shiny", "normal": "Not Shiny",
"uncaught": "Uncaught", "uncaught": "Uncaught",
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passive Unlocked", "passiveUnlocked": "Passive - Yes",
"passiveLocked": "Passive Locked", "passiveLocked": "Passive - No",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction - Yes",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction - No",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!",
"revertChange": "{{pokemonName}} reverted\nto its original form!", "revertChange": "{{pokemonName}} reverted\nto its original form!",
"formChange": "{{preName}} changed form!", "formChange": "{{preName}} changed form!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -7,13 +7,13 @@ export const abilityTriggers: SimpleTranslationEntries = {
"iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!",
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!",
"windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!",
"quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", "quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!",
"disguiseAvoidedDamage" : "¡El disfraz de {{pokemonNameWithAffix}} se ha roto!",
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
"postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "Congratulations!", "congratulations": "Congratulations!",
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
"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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism 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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "nightmares", "nightmareDesc": "nightmares",
"ingrainDesc": "roots", "ingrainDesc": "roots",
"drowsyDesc": "drowsiness", "drowsyDesc": "drowsiness",
"rechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
"trappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
"trappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!",
"flinchedLapse": "{{pokemonNameWithAffix}} flinched!",
"confusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
"confusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
"confusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
"confusedLapseHurtItself": "It hurt itself in its\nconfusion!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
"destinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
"infatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
"seededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
"seededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
"seededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
"nightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
"nightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
"encoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!",
"encoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
"aquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
"bindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
"wrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
"vortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
"infestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
"protectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
"enduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
"enduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"sturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
"perishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
"truantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
"highestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Pasiva Desbloq.", "passiveUnlocked": "Pasiva Desbloq.",
"passiveLocked": "Pasiva Bloq.", "passiveLocked": "Pasiva Bloq.",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!",
"revertChange": "{{pokemonName}} reverted\nto its original form!", "revertChange": "{{pokemonName}} reverted\nto its original form!",
"formChange": "{{preName}} changed form!", "formChange": "{{preName}} changed form!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !",
"badDreams": "{{pokemonName}} a le sommeil agité !", "badDreams": "{{pokemonName}} a le sommeil agité !",
"costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !",
"iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !",
"perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
"poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
"trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !",
@ -13,7 +13,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet dêtre volé !", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet dêtre volé !",
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !",
"postDefendDisguise": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !", "disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !",
"moveImmunity": "Ça n'affecte pas {{pokemonNameWithAffix}}…", "moveImmunity": "Ça n'affecte pas {{pokemonNameWithAffix}}…",
"reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !",
"postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\nle transforme en type {{typeName}} !", "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\nle transforme en type {{typeName}} !",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"unlockedSomething": "{{unlockedThing}}\na été débloqué.", "unlockedSomething": "{{unlockedThing}}\na été débloqué.",
"congratulations": "Félicitations !", "congratulations": "Félicitations !",
"beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !", "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
"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}} !",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de lattention !",
"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 !",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
"battlerTagsMagnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse 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 !",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "les cauchemars", "nightmareDesc": "les cauchemars",
"ingrainDesc": "lenracinement", "ingrainDesc": "lenracinement",
"drowsyDesc": "la somnolence", "drowsyDesc": "la somnolence",
"rechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !",
"trappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus séchapper !",
"trappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !",
"flinchedLapse": "{{pokemonNameWithAffix}} a la trouille !\nIl ne peut plus attaquer !",
"confusedOnAdd": "Ça rend {{pokemonNameWithAffix}}\nconfus !",
"confusedOnRemove": "{{pokemonNameWithAffix}}\nnest plus confus !",
"confusedOnOverlap": "{{pokemonNameWithAffix}}\nest déjà confus !",
"confusedLapse": "{{pokemonNameWithAffix}}\nest confus !",
"confusedLapseHurtItself": "Il se blesse dans sa confusion.",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} nest pas affecté\nle Lien du Destin !",
"destinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !",
"infatuatedLapse": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !",
"infatuatedLapseImmobilize": "Lamour empêche {{pokemonNameWithAffix}}\ndagir !",
"infatuatedOnRemove": "{{pokemonNameWithAffix}}\nnest plus amoureux !",
"seededOnAdd": "{{pokemonNameWithAffix}} est infecté !",
"seededLapse": "Vampigraine draine lénergie\nde {{pokemonNameWithAffix}} !",
"seededLapseShed": "La Vampigraine de {{pokemonNameWithAffix}}\naspire le suintement !",
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier dun cauchemar !",
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier dun cauchemar !",
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
"encoreOnRemove": "{{pokemonNameWithAffix}} nest\nplus obligé dutiliser la même capacité !",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
"ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} sentoure\ndun voile deau !",
"aquaRingLapse": "{{moveName}} restaure\nles PV de {{pokemonName}} !",
"drowsyOnAdd": "Ça rend {{pokemonNameWithAffix}} somnolent !",
"damagingTrapLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"bindOnTrap": "{{pokemonNameWithAffix}} est pris dans\nlétreinte de {{sourcePokemonName}} !",
"wrapOnTrap": "{{pokemonNameWithAffix}} est ligoté\npar {{sourcePokemonName}} !",
"vortexOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans le tourbillon !",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} est pris dans le Claquoir\nde {{pokemonName}} !",
"sandTombOnTrap": "{{pokemonNameWithAffix}} est piégé\npar {{moveName}} !",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans un tourbillon de magma !",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} est tombé\ndans un Troquenard !",
"thunderCageOnTrap": "{{pokemonNameWithAffix}} se fait emprisonner\npar {{sourcePokemonNameWithAffix}} !",
"infestationOnTrap": "{{pokemonNameWithAffix}} est harcelé\npar {{sourcePokemonNameWithAffix}} !",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
"protectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
"enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
"enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de lattention !",
"truantLapse": "{{pokemonNameWithAffix}} paresse !",
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nnarrive pas à se motiver !",
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à sy mettre sérieusement !",
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
"highestStatBoostOnRemove": "Leffet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
"magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
"critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
"critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passif", "passive": "Passif",
"passiveUnlocked": "Passif débloqué", "passiveUnlocked": "Passif débloqué",
"passiveLocked": "Passif verrouillé", "passiveLocked": "Passif verrouillé",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} devient\n{{pokemonName}} !", "eternamaxChange": "{{preName}} devient\n{{pokemonName}} !",
"revertChange": "{{pokemonName}} retourne\nà sa forme initiale !", "revertChange": "{{pokemonName}} retourne\nà sa forme initiale !",
"formChange": "{{preName}} change de forme !", "formChange": "{{preName}} change de forme !",
"disguiseChange": "Le déguisement absorbe lattaque !",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!",
"badDreams": "{{pokemonName}} è tormentato dagli incubi!", "badDreams": "{{pokemonName}} è tormentato dagli incubi!",
"costar": "{{pokemonName}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!", "costar": "{{pokemonName}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!",
"iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} ha evitato\ni danni grazie a {{abilityName}}!",
"perishBody": "{{abilityName}} di {{pokemonName}}\nmanderà KO entrambi i Pokémon dopo 3 turni!", "perishBody": "{{abilityName}} di {{pokemonName}}\nmanderà KO entrambi i Pokémon dopo 3 turni!",
"poisonHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "poisonHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!",
"trace": "L'abilità {{abilityName}} di {{targetName}}\nviene copiata da {{pokemonName}} con Traccia!", "trace": "L'abilità {{abilityName}} di {{targetName}}\nviene copiata da {{pokemonName}} con Traccia!",
@ -13,7 +13,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!", "blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!",
"typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!",
"postDefendDisguise": "{{pokemonNameWithAffix}} è stato smascherato!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!",
"moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!",
"postDefendTypeChange": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo ha reso di tipo {{typeName}}!", "postDefendTypeChange": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo ha reso di tipo {{typeName}}!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "Congratulazioni!", "congratulations": "Congratulazioni!",
"beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!",
"ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!", "ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} è al centro\ndellattenzione!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} si solleva in aria\na causa dellelettromagnetismo!",
"battlerTagsMagnetRisenOnRemove": "Leffetto dellelettromagnetismo di {{pokemonNameWithAffix}}\nè terminato!",
"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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "nightmares", "nightmareDesc": "nightmares",
"ingrainDesc": "roots", "ingrainDesc": "roots",
"drowsyDesc": "drowsiness", "drowsyDesc": "drowsiness",
"rechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!",
"trappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!",
"trappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}",
"flinchedLapse": "{{pokemonNameWithAffix}} tentenna!",
"confusedOnAdd": "{{pokemonNameWithAffix}} è\nconfuso!",
"confusedOnRemove": "{{pokemonNameWithAffix}} non\nè più confuso!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} è\ngià confuso!",
"confusedLapse": "{{pokemonNameWithAffix}} è\nconfuso!",
"confusedLapseHurtItself": "Si colpisce da solo per via della\nconfusione!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} è immune\na Destinobbligato.",
"destinyBondLapse": "{{pokemonNameWithAffix}} trascina\ncon sé{{pokemonNameWithAffix2}}!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} si è infatuato\ndi {{sourcePokemonName}}!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} è\ngià infatuato!",
"infatuatedLapse": "{{pokemonNameWithAffix}} è infatuato\ndi {{sourcePokemonName}}!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} è\nimmobilizzato dall'infatuazione!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} non è\npiù infatuato.",
"seededOnAdd": "{{pokemonNameWithAffix}} è pieno di semi!",
"seededLapse": "La salute di {{pokemonNameWithAffix}}\nviene prelevata da Parassiseme!",
"seededLapseShed": "Parassiseme di {{pokemonNameWithAffix}}\nha risucchiato la melma!",
"nightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!",
"nightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!",
"encoreOnAdd": "{{pokemonNameWithAffix}} ha\nsubito Ripeti!",
"encoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!",
"ingrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} ha messo le radici!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} si è circondato\ncon un velo d'acqua!",
"aquaRingLapse": "{{moveName}} ha ripristinato\ni PS di {{pokemonName}}!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} sta per addormentarsi!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} subisce danni\nper via di {{moveName}}!",
"bindOnTrap": "{{pokemonNameWithAffix}} viene schiacciato da\n{{moveName}} di {{sourcePokemonName}}!",
"wrapOnTrap": "{{pokemonNameWithAffix}} è stato avvinghiato\nda {{sourcePokemonName}}!",
"vortexOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel vortice!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} sta intenagliando\n{{pokemonName}}!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nda {{moveName}}!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel magma vorticoso!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nin una tagliola!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} ha intrappolato\n{{pokemonNameWithAffix}}!",
"infestationOnTrap": "{{pokemonNameWithAffix}} ha subito un\ninfestazione da parte di {{sourcePokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nsi è protetto!",
"protectedLapse": "{{pokemonNameWithAffix}}\nsi è protetto!",
"enduringOnAdd": "{{pokemonNameWithAffix}} si prepara a\nsubire il colpo!",
"enduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!",
"sturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!",
"perishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} è al centro\ndellattenzione!",
"truantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!",
"highestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!",
"highestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} si solleva in aria\na causa dellelettromagnetismo!",
"magnetRisenOnRemove": "Leffetto dellelettromagnetismo di {{pokemonNameWithAffix}}\nè terminato!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!",
"saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passiva sbloccata", "passiveUnlocked": "Passiva sbloccata",
"passiveLocked": "Passiva bloccata", "passiveLocked": "Passiva bloccata",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} si Dynamaxxa infinitamente\nin {{pokemonName}}!", "eternamaxChange": "{{preName}} si Dynamaxxa infinitamente\nin {{pokemonName}}!",
"revertChange": "{{pokemonName}} è tornato\nalla sua forma originaria!", "revertChange": "{{pokemonName}} è tornato\nalla sua forma originaria!",
"formChange": "{{preName}} ha cambiato forma!", "formChange": "{{preName}} ha cambiato forma!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -10,6 +10,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
"trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!",
"windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!", "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!",
"quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}'s disguise was busted!",
"blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない",
"typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した", "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。",

View File

@ -1,53 +1,53 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const arenaTag: SimpleTranslationEntries = { export const arenaTag: SimpleTranslationEntries = {
"yourTeam": "your team", "yourTeam": "味方",
"opposingTeam": "the opposing team", "opposingTeam": "相手",
"arenaOnRemove": "{{moveName}}'s effect wore off.", "arenaOnRemove": "{{moveName}}の 効果が 切れた",
"arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.", "arenaOnRemovePlayer": "{{moveName}}の 効果が\n味方から 切れた",
"arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.", "arenaOnRemoveEnemy": "{{moveName}}の 効果が\n相手から 切れた",
"mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!", "mistOnAdd": "{{pokemonNameWithAffix}}の 味方は\n白い霧に 包まれた",
"mistApply": "The mist prevented\nthe lowering of stats!", "mistApply": "白い霧が\n能力変化の 削減から 守った",
"reflectOnAdd": "Reflect reduced the damage of physical moves.", "reflectOnAdd": "リフレクターで 物理ダメージを さげた",
"reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.", "reflectOnAddPlayer": "味方の リフレクターで\n物理ダメージを さげた",
"reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.", "reflectOnAddEnemy": "相手の リフレクターで\n物理ダメージを さげた",
"lightScreenOnAdd": "Light Screen reduced the damage of special moves.", "lightScreenOnAdd": "ひかりのかべで\n物理ダメージを さげた",
"lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.", "lightScreenOnAddPlayer": "味方の ひかりのかべで\n物理ダメージを さげた",
"lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.", "lightScreenOnAddEnemy": "相手の ひかりのかべで\n物理ダメージを さげた",
"auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.", "auroraVeilOnAdd": "オーロラベールで\n攻撃の ダメージを さげた",
"auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.", "auroraVeilOnAddPlayer": "味方の オーロラベールで\n攻撃ダメージを さげた",
"auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.", "auroraVeilOnAddEnemy": "相手の オーロラベールで\n攻撃ダメージを さげた",
"conditionalProtectOnAdd": "{{moveName}} protected team!", "conditionalProtectOnAdd": "{{moveName}}に 守られた!",
"conditionalProtectOnAddPlayer": "{{moveName}} protected your team!", "conditionalProtectOnAddPlayer": "見方が {{moveName}}に 守られた!",
"conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!", "conditionalProtectOnAddEnemy": "相手が {{moveName}}に 守られた!",
"conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!", "conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!",
"matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!", "matBlockOnAdd": "{{pokemonNameWithAffix}}は\nたたみがえしを ねらっている",
"noCritOnAddPlayer": "The {{moveName}} shielded your\nteam from critical hits!", "noCritOnAddPlayer": "{{moveName}}の 力で 味方の急所が 隠れた!",
"noCritOnAddEnemy": "The {{moveName}} shielded the opposing\nteam from critical hits!", "noCritOnAddEnemy": "{{moveName}}の 力で 相手の急所が 隠れた!",
"noCritOnRemove": "{{pokemonNameWithAffix}}'s {{moveName}}\nwore off!", "noCritOnRemove": "{{pokemonNameWithAffix}}の {{moveName}}の\n効果が なくなった",
"wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!", "wishTagOnAdd": "{{pokemonNameWithAffix}}の\nねがいごとが かなった",
"mudSportOnAdd": "Electricity's power was weakened!", "mudSportOnAdd": "電気の威力が 弱まった!",
"mudSportOnRemove": "The effects of Mud Sport\nhave faded.", "mudSportOnRemove": "どろあそびの 効果が なくなった!",
"waterSportOnAdd": "Fire's power was weakened!", "waterSportOnAdd": "炎の威力が 弱まった!",
"waterSportOnRemove": "The effects of Water Sport\nhave faded.", "waterSportOnRemove": "みずあそびの 効果が なくなった!",
"spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", "spikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!",
"spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!", "spikesActivateTrap": "{{pokemonNameWithAffix}}は\nまきびしの ダメージを 受けた",
"toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!", "toxicSpikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!",
"toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!", "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}を 吸収した!",
"stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!", "stealthRockOnAdd": "{{opponentDesc}}の 周りに\nとがった岩が ただよい始めた",
"stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!", "stealthRockActivateTrap": "{{pokemonNameWithAffix}}に\nとがった岩が 食い込んだ",
"stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!", "stickyWebOnAdd": "相手の 足下に\n{{moveName}}が 広がった!",
"stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", "stickyWebActivateTrap": "相手の {{pokemonName}}は\nねばねばネットに ひっかかった",
"trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", "trickRoomOnAdd": "{{pokemonNameWithAffix}}は\n時空を ゆがめた",
"trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", "trickRoomOnRemove": "ゆがんだ 時空が 元に戻った!",
"gravityOnAdd": "Gravity intensified!", "gravityOnAdd": "じゅうりょくが 強くなった!",
"gravityOnRemove": "Gravity returned to normal!", "gravityOnRemove": "じゅうりょくが 元に戻った!",
"tailwindOnAdd": "The Tailwind blew from behind team!", "tailwindOnAdd": "追い風が 吹き始めた!",
"tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!", "tailwindOnAddPlayer": "味方に\n追い風が 吹き始めた",
"tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!", "tailwindOnAddEnemy": "相手に\n追い風が 吹き始めた",
"tailwindOnRemove": "Team's Tailwind petered out!", "tailwindOnRemove": "追い風が 止んだ!",
"tailwindOnRemovePlayer": "Your team's Tailwind petered out!", "tailwindOnRemovePlayer": "味方の 追い風が 止んだ!",
"tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!", "tailwindOnRemoveEnemy": "相手の 追い風が 止んだ!",
"happyHourOnAdd": "Everyone is caught up in the happy atmosphere!", "happyHourOnAdd": "みんなが ハッピーな気分に\n包まれた",
"happyHourOnRemove": "The atmosphere returned to normal.", "happyHourOnRemove": "みんなの 気分が 元に戻った",
} as const; } as const;

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "おめでとうございます!!", "congratulations": "おめでとうございます!!",
"beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!", "beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!",
"ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!", "ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}は 攻撃の 反動で 動けない!",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}は もう 逃げられない!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の 効果が 解けた!",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}は ひるんで 技が出せない!",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}は 混乱 した!",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}の 混乱が 解けた!",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}は すでに 混乱している!",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}は 混乱している!",
"battlerTagsConfusedLapseHurtItself": "わけも わからず 自分を 攻撃した!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}を みちづれに できない!",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}は 相手を みちづれに した!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は\nメロメロで わざが 出せなかった",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロ状態が 治った!",
"battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}に 種を 植(う)えつけた!",
"battlerTagsSeededLapse": "やどりぎが {{pokemonNameWithAffix}}の 体力を うばう!",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを 吸い取った!",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを 見始めた!",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}は すでに うなされている!",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}は あくむに うなされている!",
"battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}は アンコールを 受けた!",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}の アンコール状態が 解けた!",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}は {{pokemonName}}を\nてだすけする 体制に 入った!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}は 根から\n養分ようぶん 吸い取った",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}は 根を 張った!",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}は 水のリングを まとった!",
"battlerTagsAquaRingLapse": "{{pokemonName}}は {{moveName}}で\n体力を 回復した",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} の ねむけを 誘(さそ)った!",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}は {{moveName}}の ダメージを 受けた!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 締め付けられた!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 巻き付かれた!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}は 渦(うず)の中に 閉じ込められた!",
"battlerTagsClampOnTrap": "{{pokemonName}}は {{sourcePokemonNameWithAffix}}の\nからに 挟まれた",
"battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}は {{moveName}}に 捕らわれた!",
"battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}は マグマの\n うず 閉じ込められた",
"battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}は トラバサミに 捕らわれた!",
"battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}は {{pokemonNameWithAffix}}に 閉じ込められた!",
"battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonNameWithAffix}}に まとわりつかれた!",
"battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}は\nまもりの 体制に 入った",
"battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}は\n攻撃から 身を守った",
"battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}は\nこらえる 体制に 入った",
"battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた",
"battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた",
"battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}の ほろびのカウントが {{turnCount}}になった!",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}は 注目の 的になった!",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}は 怠(なま)けている!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}は 調子が 上がらない!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}は 調子を 取り戻した!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}の {{statName}}が\n上がっている 状態に なった",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}の {{abilityName}}の 効果が なくなった!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)で 浮かび上がった!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)が なくなった!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}は 張り切っている!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}は 落ち着いた。",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}は しおづけに なった!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "nightmares", "nightmareDesc": "nightmares",
"ingrainDesc": "roots", "ingrainDesc": "roots",
"drowsyDesc": "drowsiness", "drowsyDesc": "drowsiness",
"rechargingLapse": "{{pokemonNameWithAffix}}は 攻撃の 反動で 動けない!",
"trappedOnAdd": "{{pokemonNameWithAffix}}は もう 逃げられない!",
"trappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の 効果が 解けた!",
"flinchedLapse": "{{pokemonNameWithAffix}}は ひるんで 技が出せない!",
"confusedOnAdd": "{{pokemonNameWithAffix}}は 混乱 した!",
"confusedOnRemove": "{{pokemonNameWithAffix}}の 混乱が 解けた!",
"confusedOnOverlap": "{{pokemonNameWithAffix}}は すでに 混乱している!",
"confusedLapse": "{{pokemonNameWithAffix}}は 混乱している!",
"confusedLapseHurtItself": "わけも わからず 自分を 攻撃した!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}を みちづれに できない!",
"destinyBondLapse": "{{pokemonNameWithAffix}}は 相手を みちづれに した!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!",
"infatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は\nメロメロで わざが 出せなかった",
"infatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロ状態が 治った!",
"seededOnAdd": "{{pokemonNameWithAffix}}に 種を 植(う)えつけた!",
"seededLapse": "やどりぎが {{pokemonNameWithAffix}}の 体力を うばう!",
"seededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを 吸い取った!",
"nightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを 見始めた!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}}は すでに うなされている!",
"nightmareLapse": "{{pokemonNameWithAffix}}は あくむに うなされている!",
"encoreOnAdd": "{{pokemonNameWithAffix}}は アンコールを 受けた!",
"encoreOnRemove": "{{pokemonNameWithAffix}}の アンコール状態が 解けた!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}}は {{pokemonName}}を\nてだすけする 体制に 入った!",
"ingrainLapse": "{{pokemonNameWithAffix}}は 根から\n養分ようぶん 吸い取った",
"ingrainOnTrap": "{{pokemonNameWithAffix}}は 根を 張った!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}}は 水のリングを まとった!",
"aquaRingLapse": "{{pokemonName}}は {{moveName}}で\n体力を 回復した",
"drowsyOnAdd": "{{pokemonNameWithAffix}} の ねむけを 誘(さそ)った!",
"damagingTrapLapse": "{{pokemonNameWithAffix}}は {{moveName}}の ダメージを 受けた!",
"bindOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 締め付けられた!",
"wrapOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に 巻き付かれた!",
"vortexOnTrap": "{{pokemonNameWithAffix}}は 渦(うず)の中に 閉じ込められた!",
"clampOnTrap": "{{pokemonName}}は {{sourcePokemonNameWithAffix}}の\nからに 挟まれた",
"sandTombOnTrap": "{{pokemonNameWithAffix}}は {{moveName}}に 捕らわれた!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}}は マグマの\n うず 閉じ込められた",
"snapTrapOnTrap": "{{pokemonNameWithAffix}}は トラバサミに 捕らわれた!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}は {{pokemonNameWithAffix}}に 閉じ込められた!",
"infestationOnTrap": "{{pokemonNameWithAffix}}は {{sourcePokemonNameWithAffix}}に まとわりつかれた!",
"protectedOnAdd": "{{pokemonNameWithAffix}}は\nまもりの 体制に 入った",
"protectedLapse": "{{pokemonNameWithAffix}}は\n攻撃から 身を守った",
"enduringOnAdd": "{{pokemonNameWithAffix}}は\nこらえる 体制に 入った",
"enduringLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた",
"sturdyLapse": "{{pokemonNameWithAffix}}は\n攻撃を こらえた",
"perishSongLapse": "{{pokemonNameWithAffix}}の ほろびのカウントが {{turnCount}}になった!",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}は 注目の 的になった!",
"truantLapse": "{{pokemonNameWithAffix}}は 怠(なま)けている!",
"slowStartOnAdd": "{{pokemonNameWithAffix}}は 調子が 上がらない!",
"slowStartOnRemove": "{{pokemonNameWithAffix}}は 調子を 取り戻した!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}の {{statName}}が\n上がっている 状態に なった",
"highestStatBoostOnRemove": "{{pokemonNameWithAffix}}の {{abilityName}}の 効果が なくなった!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)で 浮かび上がった!",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}は 電磁力(でんじりょく)が なくなった!",
"critBoostOnAdd": "{{pokemonNameWithAffix}}は 張り切っている!",
"critBoostOnRemove": "{{pokemonNameWithAffix}}は 落ち着いた。",
"saltCuredOnAdd": "{{pokemonNameWithAffix}}は しおづけに なった!",
"saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている",
"cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!",
} as const; } as const;

View File

@ -11,11 +11,13 @@ export const filterBar: SimpleTranslationEntries = {
"normal": "Not Shiny", "normal": "Not Shiny",
"uncaught": "Uncaught", "uncaught": "Uncaught",
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passive Unlocked", "passiveUnlocked": "Passive - Yes",
"passiveLocked": "Passive Locked", "passiveLocked": "Passive - No",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction - Yes",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction - No",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -1,14 +1,14 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const modifier: SimpleTranslationEntries = { export const modifier: SimpleTranslationEntries = {
"surviveDamageApply": "{{pokemonNameWithAffix}} hung on\nusing its {{typeName}}!", "surviveDamageApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で もちこたえた!",
"turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "turnHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 回復!",
"hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 回復!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 復活した!",
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}は {{typeName}}で\n下がった能力が 元に戻った",
"moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "moneyInterestApply": "{{typeName}}から {{moneyAmount}}円 取得した!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を 吸い取った!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を うばい取った!",
"enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!", "enemyTurnHealApply": "{{pokemonNameWithAffix}}は\n体力を 回復",
"bypassSpeedChanceApply": "{{pokemonName}} can act faster than normal, thanks to its {{itemName}}!", "bypassSpeedChanceApply": "{{pokemonName}}は {{itemName}}で\n行動が はやくなった",
} as const; } as const;

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!",
"revertChange": "{{pokemonName}} reverted\nto its original form!", "revertChange": "{{pokemonName}} reverted\nto its original form!",
"formChange": "{{preName}} changed form!", "formChange": "{{preName}} changed form!",
"disguiseChange": "Its disguise served it as a decoy!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -1,9 +1,9 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const saveSlotSelectUiHandler: SimpleTranslationEntries = { export const saveSlotSelectUiHandler: SimpleTranslationEntries = {
"overwriteData": "せんたくしたスロットにデータをうわがきしますか", "overwriteData": "選択した スロットに データを 上書きします",
"loading": "ローディング...", "loading": "読込中…",
"wave": "Wave", "wave": "波",//This needs to be preceded by 第[x],e.g.第1波、第248波
"lv": "Lv", "lv": "Lv",
"empty": "なし", "empty": "なし",
} as const; } as const;

View File

@ -6,46 +6,46 @@ 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": "この条件で チャレンジを 始めますか?",
"confirmExit": "しゅうりょう しますか?", "confirmExit": "終了しますか?",
"invalidParty": "This is not a valid starting party!", "invalidParty": "手持ちは チャレンジの 条件で 認められない!",
"gen1": "1せだい", "gen1": "1世代",
"gen2": "2せだい", "gen2": "2世代",
"gen3": "3せだい", "gen3": "3世代",
"gen4": "4せだい", "gen4": "4世代",
"gen5": "5せだい", "gen5": "5世代",
"gen6": "6せだい", "gen6": "6世代",
"gen7": "7せだい", "gen7": "7世代",
"gen8": "8せだい", "gen8": "8世代",
"gen9": "9せだい", "gen9": "9世代",
"growthRate": "EXPタイプ:", "growthRate": "経験値タイプ:",
"ability": "とくせい:", "ability": "特性:",
"passive": "パッシブ:", "passive": "パッシブ:",
"nature": "せいかく:", "nature": "性格:",
"eggMoves": "タマゴわざ", "eggMoves": "タマゴ",
"start": "始める", "start": "始める",
"addToParty": "えらぶ", "addToParty": "手持ちに入れる",
"toggleIVs": "個体値を ひょうじ", "toggleIVs": "個体値を表示",
"manageMoves": "わざを ならびかえ", "manageMoves": "技を並び替える",
"manageNature": "せいかくを ならびかえ", "manageNature": "性格を変える",
"addToFavorites": "Add to Favorites", "addToFavorites": "お気に入りにする",
"removeFromFavorites": "Remove from Favorites", "removeFromFavorites": "お気に入りから除く",
"useCandies": "アメを つかう", "useCandies": "飴を使う",
"selectNature": "せいかくをえらんでください", "selectNature": "性格を選んでください。",
"selectMoveSwapOut": "交換する技を選択してください", "selectMoveSwapOut": "入れ替えたい技を選んでください。",
"selectMoveSwapWith": "交換先の技を選択してください", "selectMoveSwapWith": "他の技と交換してください",
"unlockPassive": "パッシブを かいほうする", "unlockPassive": "パッシブを開放",
"reduceCost": "ポケモンの 必要ポイントを へらす", "reduceCost": "ポイントを減らす",
"sameSpeciesEgg": "Buy an Egg", "sameSpeciesEgg": "タマゴを買う",
"cycleShiny": ": 色違い変更", "cycleShiny": ": 色違い変更",
"cycleForm": ": フォルム変更", "cycleForm": ": フォルム変更",
"cycleGender": ": 性別変更", "cycleGender": ": 性別変更",
"cycleAbility": ": 特性変更", "cycleAbility": ": 特性変更",
"cycleNature": ": 性格変更", "cycleNature": ": 性格変更",
"cycleVariant": ": 色変更", "cycleVariant": ": 色変更",
"enablePassive": "パッシブ ゆうこう", "enablePassive": "パッシブ - オン",
"disablePassive": "パッシブ むこう", "disablePassive": "パッシブ - オフ",
"locked": "Locked", "locked": "開放されていない",
"disabled": "Disabled", "disabled": "無効",
"uncaught": "Uncaught" "uncaught": "捕まっていない"
}; };

View File

@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!",
"badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!",
"costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!", "costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!",
"iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!",
"perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!",
"poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.",
"trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!", "trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!",
"windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!",
"quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}의 정체가 드러났다!",
"blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!",
"postDefendDisguise": "{{pokemonNameWithAffix}}의\n정체가 드러났다!",
"moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...",
"reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"congratulations": "축하합니다!", "congratulations": "축하합니다!",
"beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!",
"ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{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}}[[가]] 되었다!",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}[[는]]\n주목의 대상이 되었다!",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}의\n{{abilityName}} 효과가 사라졌다!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}[[는]]\n전자력으로 떠올랐다!",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}의\n전자력이 없어졌다!",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "악몽", "nightmareDesc": "악몽",
"ingrainDesc": "뿌리", "ingrainDesc": "뿌리",
"drowsyDesc": "졸음", "drowsyDesc": "졸음",
"rechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!",
"trappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!",
"trappedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}로부터 풀려났다!",
"flinchedLapse": "{{pokemonNameWithAffix}}[[는]] 풀이 죽어\n움직일 수 없었다!",
"confusedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠졌다!",
"confusedOnRemove": "{{pokemonNameWithAffix}}의\n혼란이 풀렸다!",
"confusedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 혼란에 빠져 있다",
"confusedLapse": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠져 있다!",
"confusedLapseHurtItself": "영문도 모른채\n자신을 공격했다!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}[[는]]\n길동무의 영향을 받지 않는다.",
"destinyBondLapse": "{{pokemonNameWithAffix}}[[는]] {{pokemonNameWithAffix2}}[[를]]\n길동무로 삼았다!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱해졌다!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 헤롱헤롱해있다!",
"infatuatedLapse": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonName}}에게 헤롱헤롱해 있다!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}[[는]] 헤롱헤롱해서\n기술을 쓸 수 없었다!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱 상태에서 벗어났다.",
"seededOnAdd": "{{pokemonNameWithAffix}}에게\n씨앗을 심었다!",
"seededLapse": "씨뿌리기가 {{pokemonNameWithAffix}}의\n체력을 빼앗는다!",
"seededLapseShed": "{{pokemonNameWithAffix}}[[는]]\n씨앗을 날려버렸다!",
"nightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!",
"nightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!",
"encoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!",
"encoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!",
"ingrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!",
"ingrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!",
"aquaRingLapse": "{{moveName}} 효과로\n{{pokemonName}}[[는]] HP를 회복했다!",
"drowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!",
"damagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!",
"bindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!",
"wrapOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n휘감겼다!",
"vortexOnTrap": "{{pokemonNameWithAffix}}[[는]]\n소용돌이 속에 갇혔다!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}}[[는]] {{pokemonName}}의\n껍질에 꼈다!",
"sandTombOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}에 붙잡혔다!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}}[[는]]\n마그마의 소용돌이에 갇혔다!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}}[[는]]\n집게덫에 붙잡혔다!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}[[는]]\n{{pokemonNameWithAffix}}를 가두었다!",
"infestationOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonNameWithAffix}}에게 엉겨 붙었다!",
"protectedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n방어 태세에 들어갔다!",
"protectedLapse": "{{pokemonNameWithAffix}}[[는]]\n공격으로부터 몸을 지켰다!",
"enduringOnAdd": "{{pokemonNameWithAffix}}[[는]]\n버티기 태세에 들어갔다!",
"enduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!",
"sturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!",
"perishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}[[는]]\n주목의 대상이 되었다!",
"truantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!",
"slowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!",
"highestStatBoostOnRemove": "{{pokemonNameWithAffix}}의\n{{abilityName}} 효과가 사라졌다!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}}[[는]]\n전자력으로 떠올랐다!",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}의\n전자력이 없어졌다!",
"critBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!",
"critBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!",
"saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.",
"cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!",
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "패시브", "passive": "패시브",
"passiveUnlocked": "패시브 해금", "passiveUnlocked": "패시브 해금",
"passiveLocked": "패시브 잠김", "passiveLocked": "패시브 잠김",
"passiveUnlockable": "패시브 해금 가능",
"costReduction": "코스트 감소", "costReduction": "코스트 감소",
"costReductionUnlocked": "코스트 감소됨", "costReductionUnlocked": "코스트 감소됨",
"costReductionLocked": "코스트 감소 없음", "costReductionLocked": "코스트 감소 없음",
"costReductionUnlockable": "코스트 감소 가능",
"favorite": "즐겨찾기", "favorite": "즐겨찾기",
"isFavorite": "즐겨찾기 등록됨", "isFavorite": "즐겨찾기 등록됨",
"notFavorite": "즐겨찾기 제외됨", "notFavorite": "즐겨찾기 제외됨",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "숨겨진 특성", "hiddenAbility": "숨겨진 특성",
"hasHiddenAbility": "숨겨진 특성 보유", "hasHiddenAbility": "숨겨진 특성 보유",
"noHiddenAbility": "숨겨진 특성 없음", "noHiddenAbility": "숨겨진 특성 없음",
"egg": "알",
"eggPurchasable": "알 구매 가능",
"pokerus": "포켓러스", "pokerus": "포켓러스",
"hasPokerus": "포켓러스 감염", "hasPokerus": "포켓러스 감염",
"noPokerus": "포켓러스 없음", "noPokerus": "포켓러스 없음",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", "eternamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!",
"revertChange": "{{pokemonName}}[[는]]\n원래 모습으로 되돌아왔다!", "revertChange": "{{pokemonName}}[[는]]\n원래 모습으로 되돌아왔다!",
"formChange": "{{preName}}[[는]]\n다른 모습으로 변화했다!", "formChange": "{{preName}}[[는]]\n다른 모습으로 변화했다!",
"disguiseChange": "탈이 대타가 되었다!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage": "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano reverso!", "blockRecoilDamage": "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano reverso!",
"badDreams": "{{pokemonName}} está tendo pesadelos!", "badDreams": "{{pokemonName}} está tendo pesadelos!",
"costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!",
"iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} evitou\ndanos com sua {{abilityName}}!",
"perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!",
"poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!",
"trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!",
"windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!",
"quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", "quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!",
"disguiseAvoidedDamage" : "O disfarce de {{pokemonNameWithAffix}} foi descoberto!",
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!",
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!",
"postDefendDisguise": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!",
"moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!", "moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!", "reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!",
"postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!", "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!",

View File

@ -95,65 +95,4 @@ export const battle: SimpleTranslationEntries = {
"unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.",
"congratulations": "Parabéns!", "congratulations": "Parabéns!",
"beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!",
"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}}.",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} virou o centro\ndas atenções!",
"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!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitou com eletromagnetismo!",
"battlerTagsMagnetRisenOnRemove": "O eletromagnetismo de {{pokemonNameWithAffix}} sumiu!",
"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!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!",
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "os pesadelos", "nightmareDesc": "os pesadelos",
"ingrainDesc": "o enraizamento", "ingrainDesc": "o enraizamento",
"drowsyDesc": "a sonolência", "drowsyDesc": "a sonolência",
"rechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!",
"trappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!",
"trappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!",
"flinchedLapse": "{{pokemonNameWithAffix}} hesitou!",
"confusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!",
"confusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!",
"confusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!",
"confusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!",
"confusedLapseHurtItself": "Se machucou em sua\nconfusão!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.",
"destinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!",
"infatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.",
"seededOnAdd": "{{pokemonNameWithAffix}} foi semeado!",
"seededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!",
"seededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!",
"nightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!",
"nightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!",
"encoreOnAdd": "{{pokemonNameWithAffix}} ganhou\num Encore!",
"encoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!",
"ingrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!",
"ingrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!",
"aquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!",
"drowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!",
"damagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!",
"bindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!",
"wrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!",
"vortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!",
"sandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!",
"infestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!",
"protectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!",
"enduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!",
"enduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!",
"sturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!",
"perishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} virou o centro\ndas atenções!",
"truantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!",
"slowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!",
"slowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!",
"highestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!",
"highestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitou com eletromagnetismo!",
"magnetRisenOnRemove": "O eletromagnetismo de {{pokemonNameWithAffix}} sumiu!",
"critBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!",
"critBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!",
"saltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passiva", "passive": "Passiva",
"passiveUnlocked": "Passiva Desbloqueada", "passiveUnlocked": "Passiva Desbloqueada",
"passiveLocked": "Passiva Bloqueada", "passiveLocked": "Passiva Bloqueada",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Redução de Custo", "costReduction": "Redução de Custo",
"costReductionUnlocked": "Redução de Custo Desbloq.", "costReductionUnlocked": "Redução de Custo Desbloq.",
"costReductionLocked": "Redução de Custo Bloq.", "costReductionLocked": "Redução de Custo Bloq.",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Habilidade Oculta", "hiddenAbility": "Habilidade Oculta",
"hasHiddenAbility": "Habilidade Oculta - Sim", "hasHiddenAbility": "Habilidade Oculta - Sim",
"noHiddenAbility": "Habilidade Oculta - Não", "noHiddenAbility": "Habilidade Oculta - Não",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokérus", "pokerus": "Pokérus",
"hasPokerus": "Pokérus - Sim", "hasPokerus": "Pokérus - Sim",
"noPokerus": "Pokérus - Não", "noPokerus": "Pokérus - Não",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!",
"revertChange": "{{pokemonName}} voltou\npara sua forma original!", "revertChange": "{{pokemonName}} voltou\npara sua forma original!",
"formChange": "{{preName}} mudou de forma!", "formChange": "{{preName}} mudou de forma!",
"disguiseChange": "O seu disfarce serviu-lhe de isca!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力", "blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力",
"badDreams": "{{pokemonName}}被折磨着!", "badDreams": "{{pokemonName}}被折磨着!",
"costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!",
"iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}因为{{abilityName}}\n避免了伤害",
"perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡", "perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡",
"poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP", "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP",
"trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}", "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}",
"windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!",
"quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}的画皮脱落了!",
"blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具", "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具",
"typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP", "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害",
"postDefendDisguise": "{{pokemonNameWithAffix}}的\n画皮脱落了",
"moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!",
"reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆", "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆",
"postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!",

View File

@ -87,65 +87,4 @@ export const battle: SimpleTranslationEntries = {
"unlockedSomething": "{{unlockedThing}}\n已解锁。", "unlockedSomething": "{{unlockedThing}}\n已解锁。",
"congratulations": "恭喜!", "congratulations": "恭喜!",
"beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}\n你获得了{{newModifier}}", "beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}\n你获得了{{newModifier}}",
"battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹",
"battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!",
"battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}",
"battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了无法使出招式",
"battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了",
"battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了",
"battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。",
"battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中",
"battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!",
"battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响",
"battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!",
"battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!",
"battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了",
"battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!",
"battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷",
"battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态",
"battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!",
"battlerTagsSeededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力",
"battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆",
"battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了",
"battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身",
"battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身",
"battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次",
"battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了",
"battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!",
"battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力",
"battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了",
"battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己",
"battlerTagsAquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!",
"battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了",
"battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!",
"battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!",
"battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!",
"battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中",
"battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}",
"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}}了!",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n变得万众瞩目了",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因电磁力浮了起来",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n电磁力消失了",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "恶梦", "nightmareDesc": "恶梦",
"ingrainDesc": "扎根", "ingrainDesc": "扎根",
"drowsyDesc": "瞌睡", "drowsyDesc": "瞌睡",
"rechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹",
"trappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!",
"trappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}",
"flinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了无法使出招式",
"confusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了",
"confusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了",
"confusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。",
"confusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中",
"confusedLapseHurtItself": "不知所以地攻击了自己!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响",
"destinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了",
"infatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷",
"infatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态",
"seededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!",
"seededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力",
"seededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆",
"nightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了",
"nightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身",
"nightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身",
"encoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次",
"encoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了",
"helpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!",
"ingrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力",
"ingrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了",
"aquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己",
"aquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!",
"drowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了",
"damagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!",
"bindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!",
"wrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!",
"vortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中",
"clampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}",
"sandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中",
"snapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}",
"infestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!",
"protectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势",
"protectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己",
"enduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势",
"enduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击",
"sturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击",
"perishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n变得万众瞩目了",
"truantLapse": "{{pokemonNameWithAffix}}\n正在偷懒",
"slowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平",
"slowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!",
"highestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因电磁力浮了起来",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n电磁力消失了",
"critBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足",
"critBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。",
"saltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态",
"saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}",
"cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "被动", "passive": "被动",
"passiveUnlocked": "被动解锁", "passiveUnlocked": "被动解锁",
"passiveLocked": "被动未解锁", "passiveLocked": "被动未解锁",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "费用降低", "costReduction": "费用降低",
"costReductionUnlocked": "已降费", "costReductionUnlocked": "已降费",
"costReductionLocked": "未降费", "costReductionLocked": "未降费",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "梦特", "hiddenAbility": "梦特",
"hasHiddenAbility": "有梦特", "hasHiddenAbility": "有梦特",
"noHiddenAbility": "无梦特", "noHiddenAbility": "无梦特",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "病毒", "pokerus": "病毒",
"hasPokerus": "有病毒", "hasPokerus": "有病毒",
"noPokerus": "无病毒", "noPokerus": "无病毒",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}}无极巨化成了\n{{pokemonName}}", "eternamaxChange": "{{preName}}无极巨化成了\n{{pokemonName}}",
"revertChange": "{{pokemonName}}变回了\n原本的样子", "revertChange": "{{pokemonName}}变回了\n原本的样子",
"formChange": "{{preName}}变成其他样子了。", "formChange": "{{preName}}变成其他样子了。",
"disguiseChange": "它的画皮被当作诱饵使用了!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = {
"blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力", "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力",
"badDreams": "{{pokemonName}} 被折磨着!", "badDreams": "{{pokemonName}} 被折磨着!",
"costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化", "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化",
"iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害",
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
"trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!",
"windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!",
"quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!",
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}的畫皮脫落了!",
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
"postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",

View File

@ -84,65 +84,4 @@ export const battle: SimpleTranslationEntries = {
"unlockedSomething": "{{unlockedThing}}\nhas been unlocked.", "unlockedSomething": "{{unlockedThing}}\nhas been unlocked.",
"congratulations": "Congratulations!", "congratulations": "Congratulations!",
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
"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}}了!",
"battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n變得萬眾矚目了",
"battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!",
"battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!",
"battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!",
"battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!",
"battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!",
"battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因電磁力浮了起來",
"battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n電磁力消失了",
"battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!",
"battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。",
"battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!",
"battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
"battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}",
"battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!",
"battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
} as const; } as const;

View File

@ -9,4 +9,65 @@ export const battlerTags: SimpleTranslationEntries = {
"nightmareDesc": "惡夢", "nightmareDesc": "惡夢",
"ingrainDesc": "扎根", "ingrainDesc": "扎根",
"drowsyDesc": "瞌睡", "drowsyDesc": "瞌睡",
"rechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!",
"trappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!",
"trappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}",
"flinchedLapse": "{{pokemonNameWithAffix}}畏縮了!",
"confusedOnAdd": "{{pokemonNameWithAffix}}混亂了!",
"confusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!",
"confusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。",
"confusedLapse": "{{pokemonNameWithAffix}}正在混亂中!",
"confusedLapseHurtItself": "不知所以地攻擊了自己!",
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響",
"destinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!",
"infatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!",
"infatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!",
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!",
"seededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!",
"seededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!",
"seededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!",
"nightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!",
"nightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!",
"nightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!",
"encoreOnAdd": "{{pokemonNameWithAffix}}接受了再來一次!",
"encoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!",
"helpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!",
"ingrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!",
"ingrainOnTrap": "{{pokemonNameWithAffix}}扎根了!",
"aquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!",
"aquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!",
"drowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!",
"damagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!",
"bindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!",
"wrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!",
"vortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!",
"clampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}",
"sandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!",
"magmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!",
"snapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!",
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}",
"infestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!",
"protectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!",
"protectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!",
"enduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!",
"enduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!",
"sturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!",
"perishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n變得萬眾矚目了",
"truantLapse": "{{pokemonNameWithAffix}}正在偷懶!",
"slowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!",
"slowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!",
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!",
"highestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因電磁力浮了起來",
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n電磁力消失了",
"critBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!",
"critBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。",
"saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!",
"saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}",
"cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
} as const; } as const;

View File

@ -13,9 +13,11 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "被動", "passive": "被動",
"passiveUnlocked": "被動解鎖", "passiveUnlocked": "被動解鎖",
"passiveLocked": "被動未解鎖", "passiveLocked": "被動未解鎖",
"passiveUnlockable": "Passive - Can Unlock",
"costReduction": "Cost Reduction", "costReduction": "Cost Reduction",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cost Reduction Unlocked",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cost Reduction Locked",
"costReductionUnlockable": "Cost Reduction - Can Unlock",
"favorite": "Favorite", "favorite": "Favorite",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorite - Yes",
"notFavorite": "Favorite - No", "notFavorite": "Favorite - No",
@ -25,6 +27,8 @@ export const filterBar: SimpleTranslationEntries = {
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Hidden Ability",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Hidden Ability - Yes",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg",
"eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokerus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokerus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokerus - No",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}", "eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}",
"revertChange": "{{pokemonName}}變回了\n原本的樣子", "revertChange": "{{pokemonName}}變回了\n原本的樣子",
"formChange": "{{preName}}變為其他樣子了。", "formChange": "{{preName}}變為其他樣子了。",
"disguiseChange": "它的畫皮被當作誘餌使用了!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {

View File

@ -115,6 +115,26 @@ export class ModifierType {
return this; return this;
} }
/**
* Populates the tier field by performing a reverse lookup on the modifier pool specified by {@linkcode poolType} using the
* {@linkcode ModifierType}'s id.
* @param poolType the {@linkcode ModifierPoolType} to look into to derive the item's tier; defaults to {@linkcode ModifierPoolType.PLAYER}
*/
withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType {
for (const tier of Object.values(getModifierPoolForType(poolType))) {
for (const modifier of tier) {
if (this.id === modifier.modifierType.id) {
this.tier = modifier.modifierType.tier;
break;
}
}
if (this.tier) {
break;
}
}
return this;
}
newModifier(...args: any[]): Modifier | null { newModifier(...args: any[]): Modifier | null {
return this.newModifierFunc && this.newModifierFunc(this, args); return this.newModifierFunc && this.newModifierFunc(this, args);
} }
@ -855,7 +875,7 @@ export class FusePokemonModifierType extends PokemonModifierType {
class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator {
constructor() { constructor() {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) {
return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20);
} }
@ -919,12 +939,13 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
constructor() { constructor() {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { const items = SpeciesStatBoosterModifierTypeGenerator.items;
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in items)) {
return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem);
} }
const values = Object.values(SpeciesStatBoosterModifierTypeGenerator.items); const values = Object.values(items);
const keys = Object.keys(SpeciesStatBoosterModifierTypeGenerator.items); const keys = Object.keys(items);
const weights = keys.map(() => 0); const weights = keys.map(() => 0);
for (const p of party) { for (const p of party) {
@ -979,7 +1000,10 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
class TmModifierTypeGenerator extends ModifierTypeGenerator { class TmModifierTypeGenerator extends ModifierTypeGenerator {
constructor(tier: ModifierTier) { constructor(tier: ModifierTier) {
super((party: Pokemon[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) {
return new TmModifierType(pregenArgs[0] as Moves);
}
const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm))); const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm)));
const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i);
if (!tierUniqueCompatibleTms.length) { if (!tierUniqueCompatibleTms.length) {
@ -994,7 +1018,7 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator {
class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
constructor(rare: boolean) { constructor(rare: boolean) {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in EvolutionItem)) {
return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem);
} }
@ -1021,7 +1045,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
constructor() { constructor() {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) {
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
} }
@ -1274,7 +1298,7 @@ export const modifierTypes = {
SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(),
TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in TempBattleStat)) {
return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat); return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat);
} }
const randTempBattleStat = Utils.randSeedInt(6) as TempBattleStat; const randTempBattleStat = Utils.randSeedInt(6) as TempBattleStat;
@ -1283,7 +1307,7 @@ export const modifierTypes = {
DIRE_HIT: () => new TempBattleStatBoosterModifierType(TempBattleStat.CRIT), DIRE_HIT: () => new TempBattleStatBoosterModifierType(TempBattleStat.CRIT),
BASE_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { BASE_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Stat)) {
const stat = pregenArgs[0] as Stat; const stat = pregenArgs[0] as Stat;
return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(stat), stat); return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(stat), stat);
} }
@ -1294,14 +1318,14 @@ export const modifierTypes = {
ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(),
MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) {
return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature);
} }
return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature); return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature);
}), }),
TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) {
return new TerastallizeModifierType(pregenArgs[0] as Type); return new TerastallizeModifierType(pregenArgs[0] as Type);
} }
if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) { if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) {
@ -1318,7 +1342,7 @@ export const modifierTypes = {
}), }),
BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in BerryType)) {
return new BerryModifierType(pregenArgs[0] as BerryType); return new BerryModifierType(pregenArgs[0] as BerryType);
} }
const berryTypes = Utils.getEnumValues(BerryType); const berryTypes = Utils.getEnumValues(BerryType);
@ -1545,7 +1569,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32),
new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)),
new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => {
if (party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]) { if (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]) {
return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0; return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0;
} }
return 0; return 0;
@ -1604,7 +1628,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.SOUL_DEW, 7), new WeightedModifierType(modifierTypes.SOUL_DEW, 7),
//new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6),
new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4),
new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)),
new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5),
new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3),
new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3),
@ -1623,7 +1647,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.MULTI_LENS, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18),
new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5),
new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24),
new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1),
].map(m => { ].map(m => {
m.setTier(ModifierTier.MASTER); return m; m.setTier(ModifierTier.MASTER); return m;
}) })
@ -1908,15 +1932,36 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo
} }
}); });
// OVERRIDE IF NECESSARY overridePlayerModifierTypeOptions(options, party);
Overrides.ITEM_REWARD_OVERRIDE.forEach((item, i) => {
const override = modifierTypes[item]();
options[i].type = override instanceof ModifierTypeGenerator ? override.generateType(party) : override;
});
return options; return options;
} }
/**
* Replaces the {@linkcode ModifierType} of the entries within {@linkcode options} with any
* {@linkcode ModifierOverride} entries listed in {@linkcode Overrides.ITEM_REWARD_OVERRIDE}
* up to the smallest amount of entries between {@linkcode options} and the override array.
* @param options Array of naturally rolled {@linkcode ModifierTypeOption}s
* @param party Array of the player's current party
*/
export function overridePlayerModifierTypeOptions(options: ModifierTypeOption[], party: PlayerPokemon[]) {
const minLength = Math.min(options.length, Overrides.ITEM_REWARD_OVERRIDE.length);
for (let i = 0; i < minLength; i++) {
const override: ModifierOverride = Overrides.ITEM_REWARD_OVERRIDE[i];
const modifierFunc = modifierTypes[override.name];
let modifierType: ModifierType | null = modifierFunc();
if (modifierType instanceof ModifierTypeGenerator) {
const pregenArgs = ("type" in override) && (override.type !== null) ? [override.type] : undefined;
modifierType = modifierType.generateType(party, pregenArgs);
}
if (modifierType) {
options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool();
}
}
}
export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] { export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] {
if (!(waveIndex % 10)) { if (!(waveIndex % 10)) {
return []; return [];
@ -1955,7 +2000,19 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base
} }
export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: Modifiers.PersistentModifier[], scene: BattleScene): Modifiers.EnemyPersistentModifier { export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: Modifiers.PersistentModifier[], scene: BattleScene): Modifiers.EnemyPersistentModifier {
const tierStackCount = tier === ModifierTier.ULTRA ? 5 : tier === ModifierTier.GREAT ? 3 : 1; let tierStackCount: number;
switch (tier) {
case ModifierTier.ULTRA:
tierStackCount = 5;
break;
case ModifierTier.GREAT:
tierStackCount = 3;
break;
default:
tierStackCount = 1;
break;
}
const retryCount = 50; const retryCount = 50;
let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier);
let r = 0; let r = 0;
@ -1983,7 +2040,20 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.P
for (const p of party) { for (const p of party) {
for (let m = 0; m < 3; m++) { for (let m = 0; m < 3; m++) {
const tierValue = Utils.randSeedInt(64); const tierValue = Utils.randSeedInt(64);
const tier = tierValue > 25 ? ModifierTier.COMMON : tierValue > 12 ? ModifierTier.GREAT : tierValue > 4 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER;
let tier: ModifierTier;
if (tierValue > 25) {
tier = ModifierTier.COMMON;
} else if (tierValue > 12) {
tier = ModifierTier.GREAT;
} else if (tierValue > 4) {
tier = ModifierTier.ULTRA;
} else if (tierValue) {
tier = ModifierTier.ROGUE;
} else {
tier = ModifierTier.MASTER;
}
const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier(p) as Modifiers.PokemonHeldItemModifier; const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier(p) as Modifiers.PokemonHeldItemModifier;
ret.push(modifier); ret.push(modifier);
} }
@ -2029,7 +2099,19 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
} }
} while (upgraded); } while (upgraded);
} }
tier = tierValue > 255 ? ModifierTier.COMMON : tierValue > 60 ? ModifierTier.GREAT : tierValue > 12 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER;
if (tierValue > 255) {
tier = ModifierTier.COMMON;
} else if (tierValue > 60) {
tier = ModifierTier.GREAT;
} else if (tierValue > 12) {
tier = ModifierTier.ULTRA;
} else if (tierValue) {
tier = ModifierTier.ROGUE;
} else {
tier = ModifierTier.MASTER;
}
tier += upgradeCount; tier += upgradeCount;
while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) { while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) {
tier--; tier--;
@ -2122,6 +2204,19 @@ export function getLuckString(luckValue: integer): string {
} }
export function getLuckTextTint(luckValue: integer): integer { export function getLuckTextTint(luckValue: integer): integer {
const modifierTier = luckValue ? luckValue > 2 ? luckValue > 5 ? luckValue > 9 ? luckValue > 11 ? ModifierTier.LUXURY : ModifierTier.MASTER : ModifierTier.ROGUE : ModifierTier.ULTRA : ModifierTier.GREAT : ModifierTier.COMMON; let modifierTier: ModifierTier;
if (luckValue > 11) {
modifierTier = ModifierTier.LUXURY;
} else if (luckValue > 9) {
modifierTier = ModifierTier.MASTER;
} else if (luckValue > 5) {
modifierTier = ModifierTier.ROGUE;
} else if (luckValue > 2) {
modifierTier = ModifierTier.ULTRA;
} else if (luckValue) {
modifierTier = ModifierTier.GREAT;
} else {
modifierTier = ModifierTier.COMMON;
}
return getModifierTierTextTint(modifierTier); return getModifierTierTextTint(modifierTier);
} }

View File

@ -2734,30 +2734,29 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier {
} }
/** /**
* Uses override from overrides.ts to set PersistentModifiers for starting a new game * Uses either `MODIFIER_OVERRIDE` in overrides.ts to set {@linkcode PersistentModifier}s for either:
* @param scene current BattleScene * - The player
* @param player is this for player for enemy * - The enemy
* @param scene current {@linkcode BattleScene}
* @param isPlayer {@linkcode boolean} for whether the the player (`true`) or enemy (`false`) is being overridden
*/ */
export function overrideModifiers(scene: BattleScene, player: boolean = true): void { export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true): void {
const modifierOverride = player ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; const modifiersOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE;
if (!modifierOverride || modifierOverride.length === 0 || !scene) { if (!modifiersOverride || modifiersOverride.length === 0 || !scene) {
return; return;
} // if no override, do nothing }
// if it's the opponent, we clear all his current modifiers to avoid stacking
if (!player) { // If it's the opponent, clear all of their current modifiers to avoid stacking
if (!isPlayer) {
scene.clearEnemyModifiers(); scene.clearEnemyModifiers();
} }
// we loop through all the modifier name given in the override file
modifierOverride.forEach(item => { modifiersOverride.forEach(item => {
const modifierName = item.name; const modifierFunc = modifierTypes[item.name];
const qty = item.count || 1; const modifier = modifierFunc().withIdFromFunc(modifierFunc).newModifier() as PersistentModifier;
if (!modifierTypes.hasOwnProperty(modifierName)) { modifier.stackCount = item.count || 1;
return;
} // if the modifier does not exist, we skip it if (isPlayer) {
const modifierType: ModifierType = modifierTypes[modifierName]();
const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier;
modifier.stackCount = qty;
if (player) {
scene.addModifier(modifier, true, false, false, true); scene.addModifier(modifier, true, false, false, true);
} else { } else {
scene.addEnemyModifier(modifier, true, true); scene.addEnemyModifier(modifier, true, true);
@ -2766,37 +2765,38 @@ export function overrideModifiers(scene: BattleScene, player: boolean = true): v
} }
/** /**
* Uses override from overrides.ts to set PokemonHeldItemModifiers for starting a new game * Uses either `HELD_ITEMS_OVERRIDE` in overrides.ts to set {@linkcode PokemonHeldItemModifier}s for either:
* @param scene current BattleScene * - The first member of the player's team when starting a new game
* @param player is this for player for enemy * - An enemy {@linkcode Pokemon} being spawned in
* @param scene current {@linkcode BattleScene}
* @param pokemon {@linkcode Pokemon} whose held items are being overridden
* @param isPlayer {@linkcode boolean} for whether the {@linkcode pokemon} is the player's (`true`) or an enemy (`false`)
*/ */
export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, player: boolean = true): void { export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, isPlayer: boolean = true): void {
const heldItemsOverride = player ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; const heldItemsOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE;
if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) { if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) {
return; return;
} // if no override, do nothing }
// we loop through all the itemName given in the override file
heldItemsOverride.forEach(item => { heldItemsOverride.forEach(item => {
const itemName = item.name; const modifierFunc = modifierTypes[item.name];
let modifierType: ModifierType | null = modifierFunc();
const qty = item.count || 1; const qty = item.count || 1;
if (!modifierTypes.hasOwnProperty(itemName)) {
return;
} // if the item does not exist, we skip it
const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list
let itemModifier: PokemonHeldItemModifier;
if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) { if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) {
const pregenArgs = "type" in item ? [item.type] : undefined; const pregenArgs = ("type" in item) && (item.type !== null) ? [item.type] : undefined;
itemModifier = modifierType.generateType([], pregenArgs)?.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; modifierType = modifierType.generateType([], pregenArgs);
} else {
itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier;
} }
// we create the item
itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon const heldItemModifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier;
itemModifier.stackCount = qty; // we say how many items we want if (heldItemModifier) {
if (player) { heldItemModifier.pokemonId = pokemon.id;
scene.addModifier(itemModifier, true, false, false, true); heldItemModifier.stackCount = qty;
} else { if (isPlayer) {
scene.addEnemyModifier(itemModifier, true, true); scene.addModifier(heldItemModifier, true, false, false, true);
} else {
scene.addEnemyModifier(heldItemModifier, true, true);
}
} }
}); });
} }

View File

@ -12,7 +12,7 @@ import { type PokeballCounts } from "./battle-scene";
import { Gender } from "./data/gender"; import { Gender } from "./data/gender";
import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars
import { Variant } from "./data/variant"; import { Variant } from "./data/variant";
import { type ModifierOverride, type ModifierTypeKeys } from "./modifier/modifier-type"; import { type ModifierOverride } from "./modifier/modifier-type";
/** /**
* Overrides that are using when testing different in game situations * Overrides that are using when testing different in game situations
@ -51,6 +51,7 @@ class DefaultOverrides {
readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null;
/** Multiplies XP gained by this value including 0. Set to null to ignore the override */ /** Multiplies XP gained by this value including 0. Set to null to ignore the override */
readonly XP_MULTIPLIER_OVERRIDE: number | null = null; readonly XP_MULTIPLIER_OVERRIDE: number | null = null;
readonly NEVER_CRIT_OVERRIDE: boolean = false;
/** default 1000 */ /** default 1000 */
readonly STARTING_MONEY_OVERRIDE: integer = 0; readonly STARTING_MONEY_OVERRIDE: integer = 0;
/** Sets all shop item prices to 0 */ /** Sets all shop item prices to 0 */
@ -155,20 +156,28 @@ class DefaultOverrides {
* STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY"}] * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY"}]
* ``` * ```
*/ */
readonly STARTING_MODIFIER_OVERRIDE: Array<ModifierOverride> = []; readonly STARTING_MODIFIER_OVERRIDE: ModifierOverride[] = [];
readonly OPP_MODIFIER_OVERRIDE: Array<ModifierOverride> = []; /**
* Override array of {@linkcode ModifierOverride}s used to provide modifiers to enemies.
*
* Note that any previous modifiers are cleared.
*/
readonly OPP_MODIFIER_OVERRIDE: ModifierOverride[] = [];
readonly STARTING_HELD_ITEMS_OVERRIDE: Array<ModifierOverride> = []; /** Override array of {@linkcode ModifierOverride}s used to provide held items to first party member when starting a new game. */
readonly OPP_HELD_ITEMS_OVERRIDE: Array<ModifierOverride> = []; readonly STARTING_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
readonly NEVER_CRIT_OVERRIDE: boolean = false; /** Override array of {@linkcode ModifierOverride}s used to provide held items to enemies on spawn. */
readonly OPP_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
/** /**
* An array of items by keys as defined in the "modifierTypes" object in the "modifier/modifier-type.ts" file. * Override array of {@linkcode ModifierOverride}s used to replace the generated item rolls after a wave.
* Items listed will replace the normal rolls. *
* If less items are listed than rolled, only some items will be replaced * If less entries are listed than rolled, only those entries will be used to replace the corresponding items while the rest randomly generated.
* If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. * If more entries are listed than rolled, only the first X entries will be used, where X is the number of items rolled.
*
* Note that, for all items in the array, `count` is not used.
*/ */
readonly ITEM_REWARD_OVERRIDE: Array<ModifierTypeKeys> = []; readonly ITEM_REWARD_OVERRIDE: ModifierOverride[] = [];
} }
export const defaultOverrides = new DefaultOverrides(); export const defaultOverrides = new DefaultOverrides();

View File

@ -2031,7 +2031,7 @@ export class CommandPhase extends FieldPhase {
} }
break; break;
case Command.BALL: case Command.BALL:
if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { if (!this.scene.gameMode.isFreshStartChallenge() && this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => {

View File

@ -1,18 +1,21 @@
import { Status, StatusEffect } from "#app/data/status-effect.js"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { QuietFormChangePhase } from "#app/form-change-phase.js";
import { TurnEndPhase } from "#app/phases.js";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager"; import GameManager from "#test/utils/gameManager";
import { getMovePosition } from "#test/utils/gameManagerUtils"; import { getMovePosition } from "#test/utils/gameManagerUtils";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Moves } from "#enums/moves";
import { Abilities } from "#enums/abilities";
import { Species } from "#enums/species";
import { StatusEffect } from "#app/data/status-effect.js";
import { MoveEffectPhase, MoveEndPhase, TurnEndPhase, TurnInitPhase } from "#app/phases.js";
import { BattleStat } from "#app/data/battle-stat.js";
import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000; const TIMEOUT = 20 * 1000;
describe("Abilities - DISGUISE", () => { describe("Abilities - Disguise", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
const bustedForm = 1;
const disguisedForm = 0;
beforeAll(() => { beforeAll(() => {
phaserGame = new Phaser.Game({ phaserGame = new Phaser.Game({
@ -26,72 +29,134 @@ describe("Abilities - DISGUISE", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
const moveToUse = Moves.SPLASH;
game.override.battleType("single"); game.override.battleType("single");
game.override.ability(Abilities.DISGUISE);
game.override.moveset([moveToUse]);
game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
});
test( game.override.enemySpecies(Species.MIMIKYU);
"check if fainted pokemon switched to base form on arena reset", game.override.enemyMoveset(SPLASH_ONLY);
async () => {
const baseForm = 0,
bustedForm = 1;
game.override.startingWave(4);
game.override.starterForms({
[Species.MIMIKYU]: bustedForm,
});
await game.startBattle([Species.MAGIKARP, Species.MIMIKYU]); game.override.starterSpecies(Species.REGIELEKI);
game.override.moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]);
}, TIMEOUT);
const mimikyu = game.scene.getParty().find((p) => p.species.speciesId === Species.MIMIKYU); it("takes no damage from attacking move and transforms to Busted form, taking 1/8 max HP damage from the disguise breaking", async () => {
expect(mimikyu).not.toBe(undefined); await game.startBattle();
expect(mimikyu!.formIndex).toBe(bustedForm);
mimikyu!.hp = 0; const mimikyu = game.scene.getEnemyPokemon()!;
mimikyu!.status = new Status(StatusEffect.FAINT); const maxHp = mimikyu.getMaxHp();
expect(mimikyu!.isFainted()).toBe(true); const disguiseDamage = Math.floor(maxHp / 8);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); expect(mimikyu.formIndex).toBe(disguisedForm);
await game.doKillOpponents();
await game.phaseInterceptor.to(TurnEndPhase);
game.doSelectModifier();
await game.phaseInterceptor.to(QuietFormChangePhase);
expect(mimikyu!.formIndex).toBe(baseForm); game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK));
},
TIMEOUT
);
test( await game.phaseInterceptor.to(MoveEndPhase);
"damage taken should be equal to 1/8 of its maximum HP, rounded down",
async () => {
const baseForm = 0,
bustedForm = 1;
game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); expect(mimikyu.hp).equals(maxHp - disguiseDamage);
game.override.startingLevel(20); expect(mimikyu.formIndex).toBe(bustedForm);
game.override.enemyLevel(20); }, TIMEOUT);
game.override.enemySpecies(Species.MAGIKARP);
game.override.starterForms({
[Species.MIMIKYU]: baseForm,
});
await game.startBattle([Species.MIMIKYU]); it("doesn't break disguise when attacked with ineffective move", async () => {
await game.startBattle();
const mimikyu = game.scene.getPlayerPokemon()!; const mimikyu = game.scene.getEnemyPokemon()!;
const damage = (Math.floor(mimikyu!.getMaxHp()/8));
expect(mimikyu).not.toBe(undefined); expect(mimikyu.formIndex).toBe(disguisedForm);
expect(mimikyu!.formIndex).toBe(baseForm);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); game.doAttack(getMovePosition(game.scene, 0, Moves.VACUUM_WAVE));
await game.phaseInterceptor.to(TurnEndPhase);
expect(mimikyu!.formIndex).toBe(bustedForm); await game.phaseInterceptor.to(MoveEndPhase);
expect(game.scene.getEnemyPokemon()!.turnData.currDamageDealt).toBe(damage);
}, expect(mimikyu.formIndex).toBe(disguisedForm);
TIMEOUT }, TIMEOUT);
);
it("takes no damage from the first hit of a multihit move and transforms to Busted form, then takes damage from the second hit", async () => {
game.override.moveset([Moves.SURGING_STRIKES]);
game.override.enemyLevel(5);
await game.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
const maxHp = mimikyu.getMaxHp();
const disguiseDamage = Math.floor(maxHp / 8);
expect(mimikyu.formIndex).toBe(disguisedForm);
game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES));
// First hit
await game.phaseInterceptor.to(MoveEffectPhase);
expect(mimikyu.hp).equals(maxHp - disguiseDamage);
expect(mimikyu.formIndex).toBe(disguisedForm);
// Second hit
await game.phaseInterceptor.to(MoveEffectPhase);
expect(mimikyu.hp).lessThan(maxHp - disguiseDamage);
expect(mimikyu.formIndex).toBe(bustedForm);
}, TIMEOUT);
it("takes effects from status moves and damage from status effects", async () => {
await game.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
expect(mimikyu.hp).toBe(mimikyu.getMaxHp());
game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_THREAD));
await game.phaseInterceptor.to(TurnEndPhase);
expect(mimikyu.formIndex).toBe(disguisedForm);
expect(mimikyu.status?.effect).toBe(StatusEffect.POISON);
expect(mimikyu.summonData.battleStats[BattleStat.SPD]).toBe(-1);
expect(mimikyu.hp).toBeLessThan(mimikyu.getMaxHp());
}, TIMEOUT);
it("persists form change when switched out", async () => {
game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
game.override.starterSpecies(0);
await game.startBattle([Species.MIMIKYU, Species.FURRET]);
const mimikyu = game.scene.getPlayerPokemon()!;
const maxHp = mimikyu.getMaxHp();
const disguiseDamage = Math.floor(maxHp / 8);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.phaseInterceptor.to(TurnEndPhase);
expect(mimikyu.formIndex).toBe(bustedForm);
expect(mimikyu.hp).equals(maxHp - disguiseDamage);
await game.toNextTurn();
game.doSwitchPokemon(1);
await game.phaseInterceptor.to(TurnEndPhase);
expect(mimikyu.formIndex).toBe(bustedForm);
}, TIMEOUT);
it("reverts to Disguised on arena reset", async () => {
game.override.startingWave(4);
game.override.starterSpecies(Species.MIMIKYU);
game.override.starterForms({
[Species.MIMIKYU]: bustedForm
});
game.override.enemySpecies(Species.MAGIKARP);
game.override.enemyAbility(Abilities.BALL_FETCH);
await game.startBattle();
const mimikyu = game.scene.getPlayerPokemon()!;
expect(mimikyu.formIndex).toBe(bustedForm);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.doKillOpponents();
await game.phaseInterceptor.to(TurnEndPhase);
game.doSelectModifier();
await game.phaseInterceptor.to(TurnInitPhase);
expect(mimikyu.formIndex).toBe(disguisedForm);
}, TIMEOUT);
}); });

View File

@ -0,0 +1,131 @@
import { Species } from "#app/enums/species.js";
import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "#test/utils/testUtils";
import { MovePhase, TurnEndPhase } from "#app/phases";
import { getMovePosition } from "#test/utils/gameManagerUtils";
import { Status, StatusEffect } from "#app/data/status-effect.js";
import { BattlerTagType } from "#app/enums/battler-tag-type.js";
import { BattlerIndex } from "#app/battle.js";
describe("Abilities - Flash Fire", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.ability(Abilities.FLASH_FIRE)
.startingLevel(20)
.enemyLevel(20)
.disableCrits();
});
it("immune to Fire-type moves", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.phaseInterceptor.to(TurnEndPhase);
expect(blissey.hp).toBe(blissey.getMaxHp());
}, 20000);
it("not activate if the Pokémon is protected from the Fire-type move", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.PROTECT]);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
game.doAttack(getMovePosition(game.scene, 0, Moves.PROTECT));
await game.phaseInterceptor.to(TurnEndPhase);
expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeUndefined();
}, 20000);
it("activated by Will-O-Wisp", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.WILL_O_WISP)).moveset(SPLASH_ONLY);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.move.forceHit();
await game.phaseInterceptor.to(MovePhase, false);
await game.move.forceHit();
await game.phaseInterceptor.to(TurnEndPhase);
expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeDefined();
}, 20000);
it("activated after being frozen", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
blissey!.status = new Status(StatusEffect.FREEZE);
expect(blissey.status?.effect).toBe(StatusEffect.FREEZE);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.phaseInterceptor.to(TurnEndPhase);
expect(blissey!.getTag(BattlerTagType.FIRE_BOOST)).toBeDefined();
}, 20000);
it("not passing with baton pass", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.BATON_PASS]);
await game.startBattle([Species.BLISSEY, Species.CHANSEY]);
// ensure use baton pass after enemy moved
game.doAttack(getMovePosition(game.scene, 0, Moves.BATON_PASS));
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
game.doSelectPartyPokemon(1);
await game.phaseInterceptor.to(TurnEndPhase);
const chansey = game.scene.getPlayerPokemon()!;
expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.CHANSEY);
expect(chansey!.getTag(BattlerTagType.FIRE_BOOST)).toBeUndefined();
}, 20000);
it("boosts Fire-type move when the ability is activated", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.FIRE_PLEDGE)).moveset([Moves.EMBER, Moves.SPLASH]);
game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
const initialHP = 1000;
blissey.hp = initialHP;
// first turn
game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER));
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
await game.phaseInterceptor.to(TurnEndPhase);
const originalDmg = initialHP - blissey.hp;
expect(blissey.hp > 0);
blissey.hp = initialHP;
// second turn
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.phaseInterceptor.to(TurnEndPhase);
const flashFireDmg = initialHP - blissey.hp;
expect(flashFireDmg).toBeGreaterThan(originalDmg);
}, 20000);
});

View File

@ -16,7 +16,7 @@ import { SPLASH_ONLY } from "#test/utils/testUtils";
const TIMEOUT = 20 * 1000; const TIMEOUT = 20 * 1000;
describe("Abilities - Protean", () => { describe("Abilities - Libero", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -8,7 +8,7 @@ import { getMovePosition } from "#test/utils/gameManagerUtils";
import { WeatherType } from "#app/enums/weather-type.js"; import { WeatherType } from "#app/enums/weather-type.js";
describe("Ability Timing", () => { describe("Abilities - Sand Spit", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -8,7 +8,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "#test/utils/testUtils"; import { SPLASH_ONLY } from "#test/utils/testUtils";
import { Status, StatusEffect } from "#app/data/status-effect.js"; import { Status, StatusEffect } from "#app/data/status-effect.js";
describe("Test Battle Phase", () => { describe("Double Battles", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -5,7 +5,7 @@ import { Species } from "#enums/species";
import Phaser from "phaser"; import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Test Battle Phase", () => { describe("Error Handling", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -7,7 +7,7 @@ import { Moves } from "#app/enums/moves.js";
import { getMovePosition } from "../utils/gameManagerUtils"; import { getMovePosition } from "../utils/gameManagerUtils";
import { MoveEffectPhase } from "#app/phases.js"; import { MoveEffectPhase } from "#app/phases.js";
describe("Internals", () => { describe("Moves - Foresight", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -8,7 +8,7 @@ import { getMovePosition } from "../utils/gameManagerUtils";
import { MoveEffectPhase } from "#app/phases.js"; import { MoveEffectPhase } from "#app/phases.js";
import { BattlerIndex } from "#app/battle.js"; import { BattlerIndex } from "#app/battle.js";
describe("Internals", () => { describe("Moves - Miracle Eye", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -0,0 +1,206 @@
import { SPLASH_ONLY } from "../utils/testUtils";
import { BerryPhase, MessagePhase, TurnInitPhase, FaintPhase } from "#app/phases";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test, it } from "vitest";
import GameManager from "../utils/gameManager";
import { getMovePosition } from "../utils/gameManagerUtils";
import { BattleStat } from "#app/data/battle-stat";
const TIMEOUT = 20 * 1000;
describe("Moves - Parting Shot", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override.battleType("single");
game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]);
game.override.enemyMoveset(SPLASH_ONLY);
game.override.startingLevel(5);
game.override.enemyLevel(5);
});
test(
"Parting Shot when buffed by prankster should fail against dark types",
async () => {
game.override
.enemySpecies(Species.POOCHYENA)
.ability(Abilities.PRANKSTER);
await game.startBattle([Species.MURKROW, Species.MEOWTH]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
test(
"Parting shot should fail against good as gold ability",
async () => {
game.override
.enemySpecies(Species.GHOLDENGO)
.enemyAbility(Abilities.GOOD_AS_GOLD);
await game.startBattle([Species.MURKROW, Species.MEOWTH]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
it.skip( // TODO: fix this bug to pass the test!
"Parting shot should fail if target is -6/-6 de-buffed",
async () => {
game.override.moveset([Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH]);
await game.startBattle([Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA]);
// use Memento 3 times to debuff enemy
game.doAttack(getMovePosition(game.scene, 0, Moves.MEMENTO));
await game.phaseInterceptor.to(FaintPhase);
expect(game.scene.getParty()[0].isFainted()).toBe(true);
game.doSelectPartyPokemon(1);
await game.phaseInterceptor.to(TurnInitPhase, false);
game.doAttack(getMovePosition(game.scene, 0, Moves.MEMENTO));
await game.phaseInterceptor.to(FaintPhase);
expect(game.scene.getParty()[0].isFainted()).toBe(true);
game.doSelectPartyPokemon(2);
await game.phaseInterceptor.to(TurnInitPhase, false);
game.doAttack(getMovePosition(game.scene, 0, Moves.MEMENTO));
await game.phaseInterceptor.to(FaintPhase);
expect(game.scene.getParty()[0].isFainted()).toBe(true);
game.doSelectPartyPokemon(3);
// set up done
await game.phaseInterceptor.to(TurnInitPhase, false);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(-6);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-6);
// now parting shot should fail
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
expect(battleStatsOpponent[BattleStat.ATK]).toBe(-6);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-6);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
it.skip( // TODO: fix this bug to pass the test!
"Parting shot shouldn't allow switch out when mist is active",
async () => {
game.override
.enemySpecies(Species.ALTARIA)
.enemyAbility(Abilities.NONE)
.enemyMoveset(Array(4).fill(Moves.MIST));
await game.startBattle([Species.SNORLAX, Species.MEOWTH]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
it.skip( // TODO: fix this bug to pass the test!
"Parting shot shouldn't allow switch out against clear body ability",
async () => {
game.override
.enemySpecies(Species.TENTACOOL)
.enemyAbility(Abilities.CLEAR_BODY);
await game.startBattle([Species.SNORLAX, Species.MEOWTH]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
it.skip( // TODO: fix this bug to pass the test!
"Parting shot should de-buff and not fail if no party available to switch - party size 1",
async () => {
await game.startBattle([Species.MURKROW]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = enemyPokemon.summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-1);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
it.skip( // TODO: fix this bug to pass the test!
"Parting shot regularly not fail if no party available to switch - party fainted",
async () => {
await game.startBattle([Species.MURKROW, Species.MEOWTH]);
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
// intentionally kill party pokemon, switch to second slot (now 1 party mon is fainted)
await game.killPokemon(game.scene.getParty()[0]);
expect(game.scene.getParty()[0].isFainted()).toBe(true);
await game.phaseInterceptor.run(MessagePhase);
game.doSelectPartyPokemon(1);
await game.phaseInterceptor.to(TurnInitPhase, false);
game.doAttack(getMovePosition(game.scene, 0, Moves.PARTING_SHOT));
await game.phaseInterceptor.to(BerryPhase, false);
const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MEOWTH);
}, TIMEOUT
);
});

View File

@ -10,7 +10,7 @@ import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "#test/utils/testUtils"; import { SPLASH_ONLY } from "#test/utils/testUtils";
describe("Abilities - Wind Rider", () => { describe("Moves - Tailwind", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;

View File

@ -26,7 +26,6 @@ import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js";
import { OverridesHelper } from "./overridesHelper"; import { OverridesHelper } from "./overridesHelper";
import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type.js"; import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type.js";
import overrides from "#app/overrides.js"; import overrides from "#app/overrides.js";
import { removeEnemyHeldItems } from "./testUtils";
import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js";
import { MoveHelper } from "./moveHelper"; import { MoveHelper } from "./moveHelper";
import { vi } from "vitest"; import { vi } from "vitest";
@ -137,7 +136,7 @@ export default class GameManager {
await this.phaseInterceptor.run(EncounterPhase); await this.phaseInterceptor.run(EncounterPhase);
if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) {
removeEnemyHeldItems(this); this.removeEnemyHeldItems();
} }
} }
@ -405,4 +404,13 @@ export default class GameManager {
vi.spyOn(this.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue(order); vi.spyOn(this.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue(order);
} }
/**
* Removes all held items from enemy pokemon
*/
removeEnemyHeldItems(): void {
this.scene.clearEnemyHeldItemModifiers();
this.scene.clearEnemyModifiers();
console.log("Enemy held items removed");
}
} }

View File

@ -1,7 +1,6 @@
import { Moves } from "#app/enums/moves.js"; import { Moves } from "#app/enums/moves.js";
import i18next, { type ParseKeys } from "i18next"; import i18next, { type ParseKeys } from "i18next";
import { vi } from "vitest"; import { vi } from "vitest";
import GameManager from "./gameManager";
/** Ready to use array of Moves.SPLASH x4 */ /** Ready to use array of Moves.SPLASH x4 */
export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]; export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH];
@ -26,13 +25,3 @@ export function mockI18next() {
export function arrayOfRange(start: integer, end: integer) { export function arrayOfRange(start: integer, end: integer) {
return Array.from({ length: end - start }, (_v, k) => k + start); return Array.from({ length: end - start }, (_v, k) => k + start);
} }
/**
* Removes all held items from enemy pokemon
* @param game The {@link GameManager} instance
*/
export function removeEnemyHeldItems(game: GameManager): void {
game.scene.clearEnemyHeldItemModifiers();
game.scene.clearEnemyModifiers();
console.log("Enemy held items removed");
}

View File

@ -7,7 +7,8 @@ import i18next from "i18next";
export enum DropDownState { export enum DropDownState {
ON = 0, ON = 0,
OFF = 1, OFF = 1,
EXCLUDE = 2 EXCLUDE = 2,
UNLOCKABLE = 3
} }
export enum DropDownType { export enum DropDownType {
@ -46,6 +47,7 @@ export class DropDownOption extends Phaser.GameObjects.Container {
private onColor = 0x33bbff; private onColor = 0x33bbff;
private offColor = 0x272727; private offColor = 0x272727;
private excludeColor = 0xff5555; private excludeColor = 0xff5555;
private unlockableColor = 0xffff00;
constructor(scene: SceneBase, val: any, labels: DropDownLabel | DropDownLabel[]) { constructor(scene: SceneBase, val: any, labels: DropDownLabel | DropDownLabel[]) {
super(scene); super(scene);
@ -114,6 +116,9 @@ export class DropDownOption extends Phaser.GameObjects.Container {
case DropDownState.EXCLUDE: case DropDownState.EXCLUDE:
this.toggle.setTint(this.excludeColor); this.toggle.setTint(this.excludeColor);
break; break;
case DropDownState.UNLOCKABLE:
this.toggle.setTint(this.unlockableColor);
break;
} }
} }

View File

@ -445,12 +445,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const passiveLabels = [ const passiveLabels = [
new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF),
new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON),
new DropDownLabel(i18next.t("filterBar:passiveUnlockable"), undefined, DropDownState.UNLOCKABLE),
new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE),
]; ];
const costReductionLabels = [ const costReductionLabels = [
new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF),
new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON),
new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE),
new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE),
]; ];
@ -477,6 +479,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON),
new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE), new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE),
]; ];
const eggLabels = [
new DropDownLabel(i18next.t("filterBar:egg"), undefined, DropDownState.OFF),
new DropDownLabel(i18next.t("filterBar:eggPurchasable"), undefined, DropDownState.ON),
];
const pokerusLabels = [ const pokerusLabels = [
new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF),
new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON),
@ -485,6 +491,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
new DropDownOption(this.scene, "FAVORITE", favoriteLabels), new DropDownOption(this.scene, "FAVORITE", favoriteLabels),
new DropDownOption(this.scene, "WIN", winLabels), new DropDownOption(this.scene, "WIN", winLabels),
new DropDownOption(this.scene, "HIDDEN_ABILITY", hiddenAbilityLabels), new DropDownOption(this.scene, "HIDDEN_ABILITY", hiddenAbilityLabels),
new DropDownOption(this.scene, "EGG", eggLabels),
new DropDownOption(this.scene, "POKERUS", pokerusLabels), new DropDownOption(this.scene, "POKERUS", pokerusLabels),
]; ];
this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL));
@ -966,13 +973,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
* Set the selections for all filters to their default starting value * Set the selections for all filters to their default starting value
*/ */
resetFilters() : void { resetFilters() : void {
const genDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.GEN); const caughtDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.CAUGHT);
this.filterBar.setValsToDefault(); this.filterBar.setValsToDefault();
if (!this.scene.gameMode.isChallenge) { // initial setting, in caught filter, select the options excluding the uncaught option
// if not in a challenge, in Gen hybrid filter hovering mode, set the cursor to the Gen1 for (let i = 0; i < caughtDropDown.options.length; i++) {
genDropDown.setCursor(1); // if the option is not "ALL" or "UNCAUGHT", toggle it
if (caughtDropDown.options[i].val !== "ALL" && caughtDropDown.options[i].val !== "UNCAUGHT") {
caughtDropDown.toggleOptionState(i);
}
} }
} }
@ -1680,37 +1690,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}); });
} }
// Same species egg menu option. Only visible if passive is bought // Same species egg menu option.
if (passiveAttr & PassiveAttr.UNLOCKED) { const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]);
const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); options.push({
options.push({ label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`,
label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, handler: () => {
handler: () => { if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) {
if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) {
if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { starterData.candyCount -= sameSpeciesEggCost;
starterData.candyCount -= sameSpeciesEggCost;
}
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG});
egg.addEggToGameData(this.scene);
this.scene.gameData.saveSystem().then(success => {
if (!success) {
return this.scene.reset(true);
}
});
ui.setMode(Mode.STARTER_SELECT);
this.scene.playSound("buy");
return true;
} }
return false; this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
},
item: "candy", const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG});
itemArgs: starterColors[this.lastSpecies.speciesId] egg.addEggToGameData(this.scene);
});
} this.scene.gameData.saveSystem().then(success => {
if (!success) {
return this.scene.reset(true);
}
});
ui.setMode(Mode.STARTER_SELECT);
this.scene.playSound("buy");
return true;
}
return false;
},
item: "candy",
itemArgs: starterColors[this.lastSpecies.speciesId]
});
options.push({ options.push({
label: i18next.t("menu:cancel"), label: i18next.t("menu:cancel"),
handler: () => { handler: () => {
@ -2289,13 +2297,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const isCaught = !!(caughtVariants & DexAttr.NON_SHINY); const isCaught = !!(caughtVariants & DexAttr.NON_SHINY);
const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught;
const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0; const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0;
const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked;
const isCostReduced = this.scene.gameData.starterData[container.species.speciesId].valueReduction > 0; const isCostReduced = this.scene.gameData.starterData[container.species.speciesId].valueReduction > 0;
const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId);
const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false; const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false;
const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0;
const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0;
const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined;
const isHA = this.scene.gameData.starterData[container.species.speciesId].abilityAttr & AbilityAttr.ABILITY_HIDDEN; const isHA = this.scene.gameData.starterData[container.species.speciesId].abilityAttr & AbilityAttr.ABILITY_HIDDEN;
const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId);
const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation);
@ -2320,6 +2331,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return isPassiveUnlocked; return isPassiveUnlocked;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) {
return !isPassiveUnlocked; return !isPassiveUnlocked;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) {
return isPassiveUnlockable;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) {
return true; return true;
} }
@ -2330,6 +2343,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return isCostReduced; return isCostReduced;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) {
return !isCostReduced; return !isCostReduced;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) {
return isCostReductionUnlockable;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) {
return true; return true;
} }
@ -2369,6 +2384,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
} }
}); });
const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "EGG" && misc.state === DropDownState.ON) {
return isEggPurchasable;
} else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) {
return !isEggPurchasable;
} else if (misc.val === "EGG" && misc.state === DropDownState.OFF) {
return true;
}
});
const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) {
return this.pokerusSpecies.includes(container.species); return this.pokerusSpecies.includes(container.species);
@ -2379,7 +2404,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
} }
}); });
if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsPokerus) { if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) {
this.filteredStarterContainers.push(container); this.filteredStarterContainers.push(container);
} }
}); });