From 223295e8277b2639889dc6067a965b5f3bf1bc74 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 12 Aug 2024 03:52:39 -0700 Subject: [PATCH 01/14] [Fix] Refactor Disguise to work like Ice Face (#2684) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix typos in `src/data/egg.ts` comments * Refactor Disguise using Ice Face as a base i18n { Co-authored-by: Arxxer 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 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' Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira 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' Co-authored-by: returntoice Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Sonny Ding <93831983+sonnyding1@users.noreply.github.com> Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> --- src/battle-scene.ts | 7 - src/data/ability.ts | 143 ++++++-------------- src/data/battler-tags.ts | 61 +++++---- src/data/pokemon-forms.ts | 3 + src/enums/battler-tag-type.ts | 1 + src/locales/ca_ES/ability-trigger.ts | 1 + src/locales/ca_ES/pokemon-form.ts | 1 + src/locales/de/ability-trigger.ts | 4 +- src/locales/de/pokemon-form.ts | 1 + src/locales/en/ability-trigger.ts | 4 +- src/locales/en/pokemon-form.ts | 1 + src/locales/es/ability-trigger.ts | 6 +- src/locales/es/pokemon-form.ts | 1 + src/locales/fr/ability-trigger.ts | 4 +- src/locales/fr/pokemon-form.ts | 1 + src/locales/it/ability-trigger.ts | 4 +- src/locales/it/pokemon-form.ts | 1 + src/locales/ja/ability-trigger.ts | 1 + src/locales/ja/pokemon-form.ts | 1 + src/locales/ko/ability-trigger.ts | 4 +- src/locales/ko/pokemon-form.ts | 1 + src/locales/pt_BR/ability-trigger.ts | 4 +- src/locales/pt_BR/pokemon-form.ts | 1 + src/locales/zh_CN/ability-trigger.ts | 4 +- src/locales/zh_CN/pokemon-form.ts | 1 + src/locales/zh_TW/ability-trigger.ts | 4 +- src/locales/zh_TW/pokemon-form.ts | 1 + src/test/abilities/disguise.test.ts | 189 ++++++++++++++++++--------- 28 files changed, 238 insertions(+), 217 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0775da48112..21d381a9713 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -55,7 +55,6 @@ import {UiInputs} from "./ui-inputs"; import { NewArenaEvent } from "./events/battle-scene"; import { ArenaFlyout } from "./ui/arena-flyout"; import { EaseType } from "#enums/ease-type"; -import { Abilities } from "#enums/abilities"; import { BattleSpec } from "#enums/battle-spec"; import { BattleStyle } from "#enums/battle-style"; import { Biome } from "#enums/biome"; @@ -1153,12 +1152,6 @@ export default class BattleScene extends SceneBase { playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p))); 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(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } diff --git a/src/data/ability.ts b/src/data/ability.ts index edc213099a9..961c724416a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -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 { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { 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. * @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 { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { 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. - * This is used in Ice Face ability. + * Takes no damage from the first hit of a damaging move. + * 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 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); this.multiplier = multiplier; + this.tagType = tagType; + this.recoilDamageFunc = recoilDamageFunc; + this.triggerMessageFunc = triggerMessageFunc; } /** - * Applies the Ice Face pre-defense ability to the Pokémon. - * Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form. + * Applies the pre-defense ability to the Pokémon. + * 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 {boolean} passive - Whether the ability is passive. - * @param {Pokemon} attacker - The attacking Pokémon. - * @param {PokemonMove} move - The move being used. - * @param {Utils.BooleanHolder} cancelled - A holder for whether the move was cancelled. - * @param {any[]} args - Additional arguments. - * @returns {boolean} - Whether the immunity was applied. + * @param {Pokemon} pokemon The Pokémon with the ability. + * @param {boolean} passive n/a + * @param {Pokemon} attacker The attacking Pokémon. + * @param {PokemonMove} move The move being used. + * @param {Utils.BooleanHolder} cancelled n/a + * @param {any[]} args Additional arguments. + * @returns {boolean} Whether the immunity was applied. */ 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 = this.multiplier; - pokemon.removeTag(BattlerTagType.ICE_FACE); + pokemon.removeTag(this.tagType); + if (this.recoilDamageFunc) { + pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER); + } 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. - * @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. - * @param {string} abilityName - The name of the ability. - * @param {...any} args - Additional arguments. - * @returns {string} - The trigger message. + * Gets the message triggered when the Pokémon avoids damage using the form-changing ability. + * @param {Pokemon} pokemon The Pokémon with the ability. + * @param {string} abilityName The name of the ability. + * @param {...any} args n/a + * @returns {string} The trigger message. */ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }); + return this.triggerMessageFunc(pokemon, abilityName); } } @@ -5004,20 +4941,18 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), 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(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .bypassFaint() - .ignorable() - .partial(), + // Add BattlerTagType.DISGUISE if the pokemon is in its disguised form + .conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false) + .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) .attr(PostVictoryFormChangeAbAttr, () => 2) .attr(PostBattleInitFormChangeAbAttr, () => 1) @@ -5166,7 +5101,9 @@ export function initAbilities() { .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 .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(), new Ability(Abilities.POWER_SPOT, 8) .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3), diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 3b6e005d7e8..898bbbc306b 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1558,36 +1558,25 @@ export class GroundedTag extends BattlerTag { } } -/** - * Provides the Ice Face ability's effects. - */ -export class IceFaceTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ICE_FACE, BattlerTagLapseType.CUSTOM, 1, sourceMove); +/** Common attributes of form change abilities that block damage */ +export class FormBlockDamageTag extends BattlerTag { + constructor(tagType: BattlerTagType) { + super(tagType, BattlerTagLapseType.CUSTOM, 1); } /** - * Determines if the Ice Face 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. + * 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; - 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; + return pokemon.formIndex === 0; } /** - * Applies the Ice Face tag to the Pokémon. - * Triggers a form change to Ice Face if the Pokémon is not in its Ice Face form. - * @param {Pokemon} pokemon - The Pokémon to which the tag is added. + * Applies the tag to the Pokémon. + * 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. */ onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); @@ -1598,9 +1587,9 @@ export class IceFaceTag extends BattlerTag { } /** - * Removes the Ice Face tag from the Pokémon. - * Triggers a form change to Noice when the tag is removed. - * @param {Pokemon} pokemon - The Pokémon from which the tag is removed. + * Removes the tag from the Pokémon. + * Triggers a form change when the tag is removed. + * @param {Pokemon} pokemon The Pokémon from which the tag is removed. */ onRemove(pokemon: Pokemon): void { 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: @@ -1890,7 +1897,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.DESTINY_BOND: return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.ICE_FACE: - return new IceFaceTag(sourceMove); + return new IceFaceBlockDamageTag(tagType); + case BattlerTagType.DISGUISE: + return new FormBlockDamageTag(tagType); case BattlerTagType.STOCKPILING: return new StockpilingTag(sourceMove); case BattlerTagType.OCTOLOCK: diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index a55b9186839..c4cf4184f57 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -372,6 +372,9 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie if (isRevert) { 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 }); } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index fd1455eab6c..5aab5036caf 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -60,6 +60,7 @@ export enum BattlerTagType { DESTINY_BOND = "DESTINY_BOND", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", ICE_FACE = "ICE_FACE", + DISGUISE = "DISGUISE", STOCKPILING = "STOCKPILING", RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", ALWAYS_GET_HIT = "ALWAYS_GET_HIT", diff --git a/src/locales/ca_ES/ability-trigger.ts b/src/locales/ca_ES/ability-trigger.ts index ce41a964922..2bdd17baa56 100644 --- a/src/locales/ca_ES/ability-trigger.ts +++ b/src/locales/ca_ES/ability-trigger.ts @@ -10,6 +10,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "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!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", diff --git a/src/locales/ca_ES/pokemon-form.ts b/src/locales/ca_ES/pokemon-form.ts index e8d6fb8df4a..922f23fafea 100644 --- a/src/locales/ca_ES/pokemon-form.ts +++ b/src/locales/ca_ES/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "revertChange": "{{pokemonName}} reverted\nto its original form!", "formChange": "{{preName}} changed form!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 30433ec9bdd..72023a842b3 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage": "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", "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!", "poisonHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", @@ -13,7 +13,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockItemTheft": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Item-Diebstahl!", "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "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}}...", "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", diff --git a/src/locales/de/pokemon-form.ts b/src/locales/de/pokemon-form.ts index 53ecc310411..0aadfc287e0 100644 --- a/src/locales/de/pokemon-form.ts +++ b/src/locales/de/pokemon-form.ts @@ -14,6 +14,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!", "revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!", "formChange": "{{preName}} hat seine Form geändert!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index ce41a964922..035fe8371be 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", "badDreams": "{{pokemonName}} is tormented!", "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!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "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!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", - "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", diff --git a/src/locales/en/pokemon-form.ts b/src/locales/en/pokemon-form.ts index e8d6fb8df4a..922f23fafea 100644 --- a/src/locales/en/pokemon-form.ts +++ b/src/locales/en/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "revertChange": "{{pokemonName}} reverted\nto its original form!", "formChange": "{{preName}} changed form!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index 6b1f66a11e3..60bc186e99d 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -7,13 +7,13 @@ export const abilityTriggers: SimpleTranslationEntries = { "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "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}}!", - "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!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", - "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", diff --git a/src/locales/es/pokemon-form.ts b/src/locales/es/pokemon-form.ts index 96e40bcfbbd..7098ba597f7 100644 --- a/src/locales/es/pokemon-form.ts +++ b/src/locales/es/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "revertChange": "{{pokemonName}} reverted\nto its original form!", "formChange": "{{preName}} changed form!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index f6b9c306cd1..cd077993b4e 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", "badDreams": "{{pokemonName}} a le sommeil agité !", "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 !", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", "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é !", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "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}}…", "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\nle transforme en type {{typeName}} !", diff --git a/src/locales/fr/pokemon-form.ts b/src/locales/fr/pokemon-form.ts index f96931fd0e9..51158356ef3 100644 --- a/src/locales/fr/pokemon-form.ts +++ b/src/locales/fr/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} devient\n{{pokemonName}} !", "revertChange": "{{pokemonName}} retourne\nà sa forme initiale !", "formChange": "{{preName}} change de forme !", + "disguiseChange": "Le déguisement absorbe l’attaque !", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 37472dbdeab..95db5cbf26c 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -4,7 +4,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", "badDreams": "{{pokemonName}} è tormentato dagli incubi!", "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!", "poisonHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "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!", "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", - "postDefendDisguise": "{{pokemonNameWithAffix}} è stato smascherato!", + "disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!", "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", "postDefendTypeChange": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo ha reso di tipo {{typeName}}!", diff --git a/src/locales/it/pokemon-form.ts b/src/locales/it/pokemon-form.ts index eb5d132bacd..d8bf9eeaab2 100644 --- a/src/locales/it/pokemon-form.ts +++ b/src/locales/it/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} si Dynamaxxa infinitamente\nin {{pokemonName}}!", "revertChange": "{{pokemonName}} è tornato\nalla sua forma originaria!", "formChange": "{{preName}} ha cambiato forma!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/ja/ability-trigger.ts b/src/locales/ja/ability-trigger.ts index a1ef05407be..7c7d081f645 100644 --- a/src/locales/ja/ability-trigger.ts +++ b/src/locales/ja/ability-trigger.ts @@ -10,6 +10,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった!", + "disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}'s disguise was busted!", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!", "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。", diff --git a/src/locales/ja/pokemon-form.ts b/src/locales/ja/pokemon-form.ts index e8d6fb8df4a..922f23fafea 100644 --- a/src/locales/ja/pokemon-form.ts +++ b/src/locales/ja/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} Eternamaxed\ninto {{pokemonName}}!", "revertChange": "{{pokemonName}} reverted\nto its original form!", "formChange": "{{preName}} changed form!", + "disguiseChange": "Its disguise served it as a decoy!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 61be21bc7ec..974e6970569 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", "costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!", - "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", "trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!", "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", + "disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}의 정체가 드러났다!", "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", - "postDefendDisguise": "{{pokemonNameWithAffix}}의\n정체가 드러났다!", "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", diff --git a/src/locales/ko/pokemon-form.ts b/src/locales/ko/pokemon-form.ts index 78c9a762233..9f6b9b08408 100644 --- a/src/locales/ko/pokemon-form.ts +++ b/src/locales/ko/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}}[[는]]\n{{pokemonName}}가 되었다!", "revertChange": "{{pokemonName}}[[는]]\n원래 모습으로 되돌아왔다!", "formChange": "{{preName}}[[는]]\n다른 모습으로 변화했다!", + "disguiseChange": "탈이 대타가 되었다!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index f5d9511f3f6..fde45e92af3 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage": "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano reverso!", "badDreams": "{{pokemonName}} está tendo pesadelos!", "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!", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", "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!", + "disguiseAvoidedDamage" : "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", - "postDefendDisguise": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", "moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!", "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!", diff --git a/src/locales/pt_BR/pokemon-form.ts b/src/locales/pt_BR/pokemon-form.ts index 6c7c649862a..01e3f951a9d 100644 --- a/src/locales/pt_BR/pokemon-form.ts +++ b/src/locales/pt_BR/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!", "revertChange": "{{pokemonName}} voltou\npara sua forma original!", "formChange": "{{preName}} mudou de forma!", + "disguiseChange": "O seu disfarce serviu-lhe de isca!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index 0f2201049d2..0d69a78f0f7 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力!", "badDreams": "{{pokemonName}}被折磨着!", "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", - "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}因为{{abilityName}}\n避免了伤害!", "perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡!", "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP!", "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", + "disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}的画皮脱落了!", "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!", "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!", - "postDefendDisguise": "{{pokemonNameWithAffix}}的\n画皮脱落了", "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", diff --git a/src/locales/zh_CN/pokemon-form.ts b/src/locales/zh_CN/pokemon-form.ts index 8fb82712e64..ea0c611e5aa 100644 --- a/src/locales/zh_CN/pokemon-form.ts +++ b/src/locales/zh_CN/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}}无极巨化成了\n{{pokemonName}}!", "revertChange": "{{pokemonName}}变回了\n原本的样子!", "formChange": "{{preName}}变成其他样子了。", + "disguiseChange": "它的画皮被当作诱饵使用了!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index baa20614a44..c0d348633bc 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -4,16 +4,16 @@ export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", "badDreams": "{{pokemonName}} 被折磨着!", "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", - "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}的畫皮脫落了!", "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", - "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", diff --git a/src/locales/zh_TW/pokemon-form.ts b/src/locales/zh_TW/pokemon-form.ts index aa30840fcc0..55bb13946b7 100644 --- a/src/locales/zh_TW/pokemon-form.ts +++ b/src/locales/zh_TW/pokemon-form.ts @@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = { "eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}!", "revertChange": "{{pokemonName}}變回了\n原本的樣子!", "formChange": "{{preName}}變為其他樣子了。", + "disguiseChange": "它的畫皮被當作誘餌使用了!", } as const; export const pokemonForm: SimpleTranslationEntries = { diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 09a0dbf7f8a..183295f6f41 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -1,18 +1,21 @@ -import { Status, StatusEffect } from "#app/data/status-effect.js"; -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 { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "#test/utils/gameManager"; 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; -describe("Abilities - DISGUISE", () => { +describe("Abilities - Disguise", () => { let phaserGame: Phaser.Game; let game: GameManager; + const bustedForm = 1; + const disguisedForm = 0; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -26,72 +29,134 @@ describe("Abilities - DISGUISE", () => { beforeEach(() => { game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; 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( - "check if fainted pokemon switched to base form on arena reset", - async () => { - const baseForm = 0, - bustedForm = 1; - game.override.startingWave(4); - game.override.starterForms({ - [Species.MIMIKYU]: bustedForm, - }); + game.override.enemySpecies(Species.MIMIKYU); + game.override.enemyMoveset(SPLASH_ONLY); - 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); - expect(mimikyu).not.toBe(undefined); - expect(mimikyu!.formIndex).toBe(bustedForm); + it("takes no damage from attacking move and transforms to Busted form, taking 1/8 max HP damage from the disguise breaking", async () => { + await game.startBattle(); - mimikyu!.hp = 0; - mimikyu!.status = new Status(StatusEffect.FAINT); - expect(mimikyu!.isFainted()).toBe(true); + const mimikyu = game.scene.getEnemyPokemon()!; + const maxHp = mimikyu.getMaxHp(); + const disguiseDamage = Math.floor(maxHp / 8); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + expect(mimikyu.formIndex).toBe(disguisedForm); - expect(mimikyu!.formIndex).toBe(baseForm); - }, - TIMEOUT - ); + game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK)); - test( - "damage taken should be equal to 1/8 of its maximum HP, rounded down", - async () => { - const baseForm = 0, - bustedForm = 1; + await game.phaseInterceptor.to(MoveEndPhase); - game.override.enemyMoveset([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); - game.override.startingLevel(20); - game.override.enemyLevel(20); - game.override.enemySpecies(Species.MAGIKARP); - game.override.starterForms({ - [Species.MIMIKYU]: baseForm, - }); + expect(mimikyu.hp).equals(maxHp - disguiseDamage); + expect(mimikyu.formIndex).toBe(bustedForm); + }, TIMEOUT); - 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 damage = (Math.floor(mimikyu!.getMaxHp()/8)); + const mimikyu = game.scene.getEnemyPokemon()!; - expect(mimikyu).not.toBe(undefined); - expect(mimikyu!.formIndex).toBe(baseForm); + expect(mimikyu.formIndex).toBe(disguisedForm); - game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); - await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.VACUUM_WAVE)); - expect(mimikyu!.formIndex).toBe(bustedForm); - expect(game.scene.getEnemyPokemon()!.turnData.currDamageDealt).toBe(damage); - }, - TIMEOUT - ); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(mimikyu.formIndex).toBe(disguisedForm); + }, 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); }); From a35aff7b2520aa53541386bac5dc4e8d44f2776c Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Mon, 12 Aug 2024 06:54:52 -0400 Subject: [PATCH 02/14] [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 --- src/modifier/modifier-type.ts | 137 ++++++++++++++++++++++++++++------ src/modifier/modifier.ts | 88 +++++++++++----------- src/overrides.ts | 31 +++++--- 3 files changed, 180 insertions(+), 76 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 942ef4e1bfc..16a74757598 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -115,6 +115,26 @@ export class ModifierType { 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 { return this.newModifierFunc && this.newModifierFunc(this, args); } @@ -855,7 +875,7 @@ export class FusePokemonModifierType extends PokemonModifierType { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); } @@ -919,12 +939,13 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { 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); } - const values = Object.values(SpeciesStatBoosterModifierTypeGenerator.items); - const keys = Object.keys(SpeciesStatBoosterModifierTypeGenerator.items); + const values = Object.values(items); + const keys = Object.keys(items); const weights = keys.map(() => 0); for (const p of party) { @@ -979,7 +1000,10 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { class TmModifierTypeGenerator extends ModifierTypeGenerator { 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 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) { @@ -994,7 +1018,7 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in EvolutionItem)) { return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); } @@ -1021,7 +1045,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); } @@ -1274,7 +1298,7 @@ export const modifierTypes = { SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), 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); } const randTempBattleStat = Utils.randSeedInt(6) as TempBattleStat; @@ -1283,7 +1307,7 @@ export const modifierTypes = { DIRE_HIT: () => new TempBattleStatBoosterModifierType(TempBattleStat.CRIT), 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; return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(stat), stat); } @@ -1294,14 +1318,14 @@ export const modifierTypes = { ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), 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(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature); }), 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); } if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) { @@ -1318,7 +1342,7 @@ export const modifierTypes = { }), 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); } const berryTypes = Utils.getEnumValues(BerryType); @@ -1908,15 +1932,36 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo } }); - // OVERRIDE IF NECESSARY - Overrides.ITEM_REWARD_OVERRIDE.forEach((item, i) => { - const override = modifierTypes[item](); - options[i].type = override instanceof ModifierTypeGenerator ? override.generateType(party) : override; - }); + overridePlayerModifierTypeOptions(options, party); 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[] { if (!(waveIndex % 10)) { return []; @@ -1955,7 +2000,19 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base } 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; let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); let r = 0; @@ -1983,7 +2040,20 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.P for (const p of party) { for (let m = 0; m < 3; m++) { 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; ret.push(modifier); } @@ -2029,7 +2099,19 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } } 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; while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) { tier--; @@ -2122,6 +2204,19 @@ export function getLuckString(luckValue: integer): string { } 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); } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index c6871353a7d..93ea067e424 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2734,30 +2734,29 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } /** - * Uses override from overrides.ts to set PersistentModifiers for starting a new game - * @param scene current BattleScene - * @param player is this for player for enemy + * Uses either `MODIFIER_OVERRIDE` in overrides.ts to set {@linkcode PersistentModifier}s for either: + * - The player + * - 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 { - const modifierOverride = player ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; - if (!modifierOverride || modifierOverride.length === 0 || !scene) { +export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true): void { + const modifiersOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; + if (!modifiersOverride || modifiersOverride.length === 0 || !scene) { 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(); } - // we loop through all the modifier name given in the override file - modifierOverride.forEach(item => { - const modifierName = item.name; - const qty = item.count || 1; - if (!modifierTypes.hasOwnProperty(modifierName)) { - return; - } // if the modifier does not exist, we skip it - const modifierType: ModifierType = modifierTypes[modifierName](); - const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier; - modifier.stackCount = qty; - if (player) { + + modifiersOverride.forEach(item => { + const modifierFunc = modifierTypes[item.name]; + const modifier = modifierFunc().withIdFromFunc(modifierFunc).newModifier() as PersistentModifier; + modifier.stackCount = item.count || 1; + + if (isPlayer) { scene.addModifier(modifier, true, false, false, true); } else { 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 - * @param scene current BattleScene - * @param player is this for player for enemy + * Uses either `HELD_ITEMS_OVERRIDE` in overrides.ts to set {@linkcode PokemonHeldItemModifier}s for either: + * - The first member of the player's team when starting a new game + * - 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 { - const heldItemsOverride = player ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; +export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, isPlayer: boolean = true): void { + const heldItemsOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) { return; - } // if no override, do nothing - // we loop through all the itemName given in the override file + } + heldItemsOverride.forEach(item => { - const itemName = item.name; + const modifierFunc = modifierTypes[item.name]; + let modifierType: ModifierType | null = modifierFunc(); 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) { - const pregenArgs = "type" in item ? [item.type] : undefined; - itemModifier = modifierType.generateType([], pregenArgs)?.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; - } else { - itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + const pregenArgs = ("type" in item) && (item.type !== null) ? [item.type] : undefined; + modifierType = modifierType.generateType([], pregenArgs); } - // we create the item - itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon - itemModifier.stackCount = qty; // we say how many items we want - if (player) { - scene.addModifier(itemModifier, true, false, false, true); - } else { - scene.addEnemyModifier(itemModifier, true, true); + + const heldItemModifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier; + if (heldItemModifier) { + heldItemModifier.pokemonId = pokemon.id; + heldItemModifier.stackCount = qty; + if (isPlayer) { + scene.addModifier(heldItemModifier, true, false, false, true); + } else { + scene.addEnemyModifier(heldItemModifier, true, true); + } } }); } diff --git a/src/overrides.ts b/src/overrides.ts index 88db105475c..8b3d628e05e 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -12,7 +12,7 @@ import { type PokeballCounts } from "./battle-scene"; import { Gender } from "./data/gender"; import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars 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 @@ -51,6 +51,7 @@ class DefaultOverrides { readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ readonly XP_MULTIPLIER_OVERRIDE: number | null = null; + readonly NEVER_CRIT_OVERRIDE: boolean = false; /** default 1000 */ readonly STARTING_MONEY_OVERRIDE: integer = 0; /** Sets all shop item prices to 0 */ @@ -155,20 +156,28 @@ class DefaultOverrides { * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY"}] * ``` */ - readonly STARTING_MODIFIER_OVERRIDE: Array = []; - readonly OPP_MODIFIER_OVERRIDE: Array = []; + readonly STARTING_MODIFIER_OVERRIDE: 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 = []; - readonly OPP_HELD_ITEMS_OVERRIDE: Array = []; - readonly NEVER_CRIT_OVERRIDE: boolean = false; + /** Override array of {@linkcode ModifierOverride}s used to provide held items to first party member when starting a new game. */ + readonly STARTING_HELD_ITEMS_OVERRIDE: ModifierOverride[] = []; + /** 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. - * Items listed will replace the normal rolls. - * If less items are listed than rolled, only some items will be replaced - * If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. + * Override array of {@linkcode ModifierOverride}s used to replace the generated item rolls after a wave. + * + * 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 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 = []; + readonly ITEM_REWARD_OVERRIDE: ModifierOverride[] = []; } export const defaultOverrides = new DefaultOverrides(); From 5020d742f76151cdf437d32f778ec7b1ad4e8369 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Mon, 12 Aug 2024 22:25:24 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[Bug]=20Fixed=20bug=20where=20container?= =?UTF-8?q?=20for=20unfiltered=20Pok=C3=A9mon=20does=20not=20try=20to=20se?= =?UTF-8?q?tVisible=20(#3509)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/starter-select-ui-handler.ts | 105 +++++++++++++++------------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 8cea765fb57..00e6a1881dc 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1328,44 +1328,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else { + + let starterContainer; + const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; + // prepare persistent starter data to store changes + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; + + // this gets the correct pokemon cursor depending on whether you're in the starter screen or the party icons + if (!this.starterIconsCursorObj.visible) { + starterContainer = this.filteredStarterContainers[this.cursor]; + } else { + // if species is in filtered starters, get the starter container from the filtered starters, it can be undefined if the species is not in the filtered starters + starterContainer = this.filteredStarterContainers[this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies)]; + } + if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; } else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon - - let species; - - // this gets the correct generation and pokemon cursor depending on whether you're in the starter screen or the party icons - if (!this.starterIconsCursorObj.visible) { - species = this.filteredStarterContainers[this.cursor].species; - } else { - species = this.starterSpecies[this.starterIconsCursorIndex]; - } const ui = this.getUi(); let options: any[] = []; // TODO: add proper type - const [isDupe, removeIndex]: [boolean, number] = this.isInParty(species); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed - + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed const isPartyValid = this.isPartyValid(); const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), isPartyValid); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.lastSpecies, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)), isPartyValid); const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); - const newCost = this.scene.gameData.getSpeciesStarterValue(species.speciesId); + const newCost = this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < 6) { // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party options = [ { label: i18next.t("starterSelectUiHandler:addToParty"), handler: () => { ui.setMode(Mode.STARTER_SELECT); - const isOverValueLimit = this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId), true); + const isOverValueLimit = this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), true); if (!isDupe && isValidForChallenge.value && isOverValueLimit) { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - this.addToParty(species, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); + this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); ui.playSelect(); } else { ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party @@ -1481,9 +1485,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); } - const starterContainer = this.filteredStarterContainers[this.cursor]; - const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; if (this.canCycleNature) { // if we could cycle natures, enable the improved nature menu const showNatureOptions = () => { @@ -1567,7 +1568,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { label: i18next.t("starterSelectUiHandler:addToFavorites"), handler: () => { starterAttributes.favorite = true; - starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + // if the starter container not exists, it means the species is not in the filtered starters + if (starterContainer) { + starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + } ui.setMode(Mode.STARTER_SELECT); return true; } @@ -1577,7 +1581,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { label: i18next.t("starterSelectUiHandler:removeFromFavorites"), handler: () => { starterAttributes.favorite = false; - starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + // if the starter container not exists, it means the species is not in the filtered starters + if (starterContainer) { + starterContainer.favoriteIcon.setVisible(starterAttributes.favorite); + } ui.setMode(Mode.STARTER_SELECT); return true; } @@ -1598,7 +1605,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (name.length > 0) { this.pokemonNameText.setText(name); } else { - this.pokemonNameText.setText(species.name); + this.pokemonNameText.setText(this.lastSpecies.name); } ui.setMode(Mode.STARTER_SELECT); }, @@ -1631,16 +1638,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); - // Update the candy upgrade display - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(starterContainer); - } - if (this.isUpgradeAnimationEnabled()) { - this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); - } - - starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); + // if starterContainer exists, update the passive background + if (starterContainer) { + // Update the candy upgrade display + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(starterContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + } + starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); + } return true; } return false; @@ -1666,21 +1675,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return this.scene.reset(true); } }); - this.updateStarterValueLabel(starterContainer); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("buy"); - // If the notification setting is set to 'On', update the candy upgrade display - if (this.scene.candyUpgradeNotification === 2) { - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(starterContainer); - } - if (this.isUpgradeAnimationEnabled()) { - this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + // if starterContainer exists, update the value reduction background + if (starterContainer) { + this.updateStarterValueLabel(starterContainer); + + // If the notification setting is set to 'On', update the candy upgrade display + if (this.scene.candyUpgradeNotification === 2) { + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(starterContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + } } } - return true; } return false; @@ -1755,11 +1767,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else { const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); - // prepare persistent starter data to store changes - let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; - if (!starterAttributes) { - starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; - } switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { @@ -2962,10 +2969,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isValidForChallenge = new Utils.BooleanHolder(true); Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); - const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId)!; - const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; - starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); - currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); + const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId); + if (currentFilteredContainer) { + const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); + currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); + } this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1; From 5505a4d1f07f47e0a88f0fbebbc456cf1067ae61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Fleury=20Oliveira?= Date: Mon, 12 Aug 2024 11:07:41 -0300 Subject: [PATCH 04/14] [Localization] Updated and localized "The stack for this item is full." message (#3491) * [Localization] Localized "The stack for this item is full." message * Update src/locales/es/battle.ts Co-authored-by: Asdar * Update src/locales/es/battle.ts Co-authored-by: Asdar * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/zh_CN/battle.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/battle-scene.ts Co-authored-by: Enoch * Update src/locales/zh_TW/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/ko/battle.ts Co-authored-by: Enoch * remake * Update src/locales/fr/battle.ts Co-authored-by: Lugiad' * Update src/locales/de/battle.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/es/battle.ts Co-authored-by: Asdar * Update src/locales/es/battle.ts Co-authored-by: Asdar * Update src/locales/ja/battle.ts Co-authored-by: protimita * Update Korean translation for battle.ts * Update src/locales/zh_CN/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/battle.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_CN/battle.ts * trailing space --------- Co-authored-by: Asdar Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: Lugiad' Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: Enoch Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: protimita --- src/battle-scene.ts | 2 +- src/locales/ca_ES/battle.ts | 1 + src/locales/de/battle.ts | 1 + src/locales/en/battle.ts | 1 + src/locales/es/battle.ts | 5 +++-- src/locales/fr/battle.ts | 1 + src/locales/it/battle.ts | 1 + src/locales/ja/battle.ts | 1 + src/locales/ko/battle.ts | 1 + src/locales/pt_BR/battle.ts | 1 + src/locales/zh_CN/battle.ts | 1 + src/locales/zh_TW/battle.ts | 1 + 12 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 21d381a9713..66b966270fd 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2215,7 +2215,7 @@ export default class BattleScene extends SceneBase { } } else if (!virtual) { const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, undefined, true); + this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, true); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } diff --git a/src/locales/ca_ES/battle.ts b/src/locales/ca_ES/battle.ts index 9513e010579..522fbb3261b 100644 --- a/src/locales/ca_ES/battle.ts +++ b/src/locales/ca_ES/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Are you sure you want to skip taking an item?", + "itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", "wildPokemonWithAffix": "Wild {{pokemonName}}", diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 778411aad9b..b082a6932e9 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -57,6 +57,7 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "auswechseln", "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", + "itemStackFull": "Du hast bereits zu viele von {{fullItemName}}. Du erhältst stattdessen {{itemName}}.", "notDisabled": "{{moveName}} von {{pokemonName}} ist nicht mehr deaktiviert!", "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", "hpIsFull": "Die KP von {{pokemonName}} sind voll!", diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 9513e010579..522fbb3261b 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Are you sure you want to skip taking an item?", + "itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", "wildPokemonWithAffix": "Wild {{pokemonName}}", diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index 582766ec5b6..eb37699d911 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -57,9 +57,10 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiar", "escapeVerbFlee": "huir", "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "turnEndHpRestore": "Los PS de {{pokemonName}} fueron restaurados.", + "hpIsFull": "¡Los PS de {{pokemonName}}\nestán al máximo!", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", + "itemStackFull": "El máximo número de {{fullItemName}} ha sido alcanzado. Recibirás {{itemName}} en su lugar.", "eggHatching": "¿Y esto?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", "wildPokemonWithAffix": "El {{pokemonName}} salvaje", diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index 4a775bc89dc..12ee9e0d696 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}} récupère des PV !", "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", + "itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.", "eggHatching": "Hein ?", "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?", "wildPokemonWithAffix": "{{pokemonName}} sauvage", diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index 16cb1f58642..bd7227eacb6 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}} ha recuperato dei PS.", "hpIsFull": "{{pokemonName}} ha già\ntutti i PS!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", + "itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.", "eggHatching": "Oh?", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", "stealEatBerry": "{{pokemonName}} ha rubato e mangiato\nla {{berryName}} di {{targetName}}!", diff --git a/src/locales/ja/battle.ts b/src/locales/ja/battle.ts index 116dff28c0a..926e2d9b0e4 100644 --- a/src/locales/ja/battle.ts +++ b/src/locales/ja/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}の 体力が 回復した!", "hpIsFull": "{{pokemonName}}の\n体力が 満タンだ!", "skipItemQuestion": "本当に アイテムを 取らずに 進みますか?", + "itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。", "eggHatching": "おや?", "ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?", "wildPokemonWithAffix": "野生の {{pokemonName}}", diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index c1149c8efcd..bdbcbcdf8d2 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", + "itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemname}}[[를]] 대신 받습니다.", "eggHatching": "어라…?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", "wildPokemonWithAffix": "야생 {{pokemonName}}", diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index daa8d56ccb3..920acd17d6f 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", "skipItemQuestion": "Tem certeza de que não quer escolher um item?", + "itemStackFull": "O estoque de {{fullItemName}} está cheio.\nVocê receberá {{itemName}} no lugar.", "eggHatching": "Opa?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", "wildPokemonWithAffix": "{{pokemonName}} selvagem", diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index c018faa0b01..5a73fbba09f 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}的体力恢复了。", "hpIsFull": "{{pokemonName}}的体力已满!", "skipItemQuestion": "你确定要跳过拾取道具吗?", + "itemStackFull": "{{fullItemName}}持有数达到上限,\n你获得了{{itemName}}作为替代。", "eggHatching": "咦?", "stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}!", "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP!", diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index e8ecd5228f5..357ad4ffbc3 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = { "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "你要跳過拾取道具嗎?", + "itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。", "eggHatching": "咦?", "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", "wildPokemonWithAffix": "野生的 {{pokemonName}}", From 4a095af4117dc648dc2c5a387cf5366ee550d412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo=20Fleury=20Oliveira?= Date: Mon, 12 Aug 2024 11:07:51 -0300 Subject: [PATCH 05/14] [Localization] Updated Portuguese translations (#3511) * berry * favorites * more updates --- src/locales/pt_BR/ability-trigger.ts | 2 +- src/locales/pt_BR/battle.ts | 2 +- src/locales/pt_BR/config.ts | 12 ++++++------ src/locales/pt_BR/move-trigger.ts | 4 ++-- src/locales/pt_BR/pokemon-form.ts | 18 +++++++++--------- src/locales/pt_BR/starter-select-ui-handler.ts | 4 ++-- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index fde45e92af3..da91fa3213f 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -10,7 +10,7 @@ export const abilityTriggers: SimpleTranslationEntries = { "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", "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!", - "disguiseAvoidedDamage" : "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", + "disguiseAvoidedDamage": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index 920acd17d6f..24d4e8c928f 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -68,7 +68,7 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "stealEatBerry": "{{pokemonName}} roubou e comeu\na {{berryName}} de {{targetName}}!", "ppHealBerry": "{{pokemonNameWithAffix}} restaurou PP do movimento {{moveName}}\nusando sua {{berryName}}!", "hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} desmaiou!", diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 5f7582dca63..b48fcfdc8d8 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -35,11 +35,12 @@ import { modifier } from "./modifier"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; import { modifierType } from "./modifier-type"; import { move } from "./move"; +import { moveTriggers } from "./move-trigger"; import { nature } from "./nature"; import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; -import { pokemonForm, battlePokemonForm } from "./pokemon-form"; +import { battlePokemonForm, pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonSummary } from "./pokemon-summary"; @@ -52,7 +53,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { terrain, weather } from "./weather"; -import { moveTriggers } from "./move-trigger"; export const ptBrConfig = { ability: ability, @@ -89,9 +89,12 @@ export const ptBrConfig = { menu: menu, menuUiHandler: menuUiHandler, modifier: modifier, + modifierSelectUiHandler: modifierSelectUiHandler, modifierType: modifierType, move: move, + moveTriggers: moveTriggers, nature: nature, + partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, pokemonForm: pokemonForm, @@ -109,8 +112,5 @@ export const ptBrConfig = { trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, - weather: weather, - partyUiHandler: partyUiHandler, - modifierSelectUiHandler: modifierSelectUiHandler, - moveTriggers: moveTriggers + weather: weather }; diff --git a/src/locales/pt_BR/move-trigger.ts b/src/locales/pt_BR/move-trigger.ts index a6a6e198b8f..9dc151e12b9 100644 --- a/src/locales/pt_BR/move-trigger.ts +++ b/src/locales/pt_BR/move-trigger.ts @@ -1,13 +1,13 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const moveTriggers: SimpleTranslationEntries = { - "hitWithRecoil" : "{{pokemonName}} foi ferido pelo dano reverso!", + "hitWithRecoil": "{{pokemonName}} foi ferido pelo dano reverso!", "cutHpPowerUpMove": "{{pokemonName}} diminuiu seus PS para aumentar o poder do ataque!", "absorbedElectricity": "{{pokemonName}} absorveu eletricidade!", "switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!", "goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!", "regainedHealth": "{{pokemonName}} recuperou/nsaúde!", - "keptGoingAndCrashed": "{{pokemonName}} continuou/nindo e bateu!", + "keptGoingAndCrashed": "{{pokemonName}} errou o alvo/ne se arrebentou!", "fled": "{{pokemonName}} fugiu!", "cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!", "swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!", diff --git a/src/locales/pt_BR/pokemon-form.ts b/src/locales/pt_BR/pokemon-form.ts index 01e3f951a9d..062fc165ae0 100644 --- a/src/locales/pt_BR/pokemon-form.ts +++ b/src/locales/pt_BR/pokemon-form.ts @@ -181,15 +181,15 @@ export const pokemonForm: SimpleTranslationEntries = { "gimmighoulChest": "Baú", "gimmighoulRoaming": "Perambulante", "koraidonApexBuild": "Apex Build", - "koraidonLimitedBuild":"Limited Build", - "koraidonSprintingBuild":"Sprinting Build", - "koraidonSwimmingBuild":"Swimming Build", - "koraidonGlidingBuild":"Gliding Build", - "miraidonUltimateMode":"Ultimate Mode", - "miraidonLowPowerMode":"Low Power Mode", - "miraidonDriveMode":"Drive Mode", - "miraidonAquaticMode":"Aquatic Mode", - "miraidonGlideMode":"Glide Mode", + "koraidonLimitedBuild": "Limited Build", + "koraidonSprintingBuild": "Sprinting Build", + "koraidonSwimmingBuild": "Swimming Build", + "koraidonGlidingBuild": "Gliding Build", + "miraidonUltimateMode": "Ultimate Mode", + "miraidonLowPowerMode": "Low Power Mode", + "miraidonDriveMode": "Drive Mode", + "miraidonAquaticMode": "Aquatic Mode", + "miraidonGlideMode": "Glide Mode", "poltchageistCounterfeit": "Imitação", "poltchageistArtisan": "Artesão", "paldeaTaurosCombat": "Combate", diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index 2cec9a5335e..f76762ffe9f 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -28,8 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "toggleIVs": "Mostrar IVs", "manageMoves": "Mudar Movimentos", "manageNature": "Mudar Natureza", - "addToFavorites": "Add to Favorites", - "removeFromFavorites": "Remove from Favorites", + "addToFavorites": "Adicionar aos Favoritos", + "removeFromFavorites": "Remover dos Favoritos", "useCandies": "Usar Doces", "selectNature": "Escolha uma natureza.", "selectMoveSwapOut": "Escolha um movimento para substituir.", From 377b422cd17af889cd14a8df96d57de405a05510 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 12 Aug 2024 16:08:23 +0200 Subject: [PATCH 06/14] [Localization] - Missing translations to the Filter bar in some languages (#3457) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update filter-bar.ts * Update filter-bar.ts * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update filter-bar.ts * Update src/locales/ja/filter-bar.ts Co-authored-by: Chapybara-jp * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update filter-bar.ts * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * Update filter-bar.ts * [Localization][JA]Update filter-bar.ts Added hyphens for constancy. Added 4 new translations. * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update filter-bar.ts * Update filter-bar.ts * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update src/locales/es/filter-bar.ts Co-authored-by: Asdar * Update filter-bar.ts * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update src/locales/de/filter-bar.ts Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> * Update filter-bar.ts * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/pt_BR/filter-bar.ts Co-authored-by: José Ricardo Fleury Oliveira * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_CN/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> * Update src/locales/zh_TW/filter-bar.ts Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> --------- Co-authored-by: Asdar Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: José Ricardo Fleury Oliveira Co-authored-by: Chapybara-jp Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com> Co-authored-by: mercurius-00 <80205689+mercurius-00@users.noreply.github.com> Co-authored-by: protimita --- src/locales/ca_ES/filter-bar.ts | 6 +-- src/locales/de/filter-bar.ts | 32 +++++++-------- src/locales/en/filter-bar.ts | 6 +-- src/locales/es/filter-bar.ts | 48 +++++++++++----------- src/locales/fr/filter-bar.ts | 36 ++++++++--------- src/locales/it/filter-bar.ts | 40 +++++++++---------- src/locales/ja/filter-bar.ts | 70 ++++++++++++++++----------------- src/locales/pt_BR/filter-bar.ts | 16 ++++---- src/locales/zh_CN/filter-bar.ts | 14 +++---- src/locales/zh_TW/filter-bar.ts | 32 +++++++-------- 10 files changed, 150 insertions(+), 150 deletions(-) diff --git a/src/locales/ca_ES/filter-bar.ts b/src/locales/ca_ES/filter-bar.ts index ffd227f90ca..cbdb22c03bd 100644 --- a/src/locales/ca_ES/filter-bar.ts +++ b/src/locales/ca_ES/filter-bar.ts @@ -29,9 +29,9 @@ export const filterBar: SimpleTranslationEntries = { "noHiddenAbility": "Hidden Ability - No", "egg": "Egg", "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Yes", + "noPokerus": "Pokérus - No", "sortByNumber": "No.", "sortByCost": "Cost", "sortByCandies": "Candy Count", diff --git a/src/locales/de/filter-bar.ts b/src/locales/de/filter-bar.ts index 10736b226c5..102686dd93f 100644 --- a/src/locales/de/filter-bar.ts +++ b/src/locales/de/filter-bar.ts @@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Passive freigeschaltet", "passiveLocked": "Passive gesperrt", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", + "passiveUnlockable": "Passive - Freischalten möglich", + "costReduction": "Kostenreduzierung", + "costReductionUnlocked": "Kosten bereits reduziert", + "costReductionLocked": "Kosten noch nicht reduziert", + "costReductionUnlockable": "Kosten können reduziert werden", + "favorite": "Favorit", + "isFavorite": "Favorit - Ja", + "notFavorite": "Favorit - Nein", "ribbon": "Band", "hasWon": "Hat Klassik-Modus gewonnen", "hasNotWon": "Hat Klassik-Modus nicht gewonnen", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "hiddenAbility": "Versteckte Fähigkeit", + "hasHiddenAbility": "Versteckte Fähigkeit - Ja", + "noHiddenAbility": "Versteckte Fähigkeit - Nein", + "egg": "Ei", + "eggPurchasable": "Kauf möglich", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Ja", + "noPokerus": "Pokérus - Nein", "sortByNumber": "Pokédex-Nummer", "sortByCost": "Kosten", "sortByCandies": "Anzahl Bonbons", diff --git a/src/locales/en/filter-bar.ts b/src/locales/en/filter-bar.ts index ffd227f90ca..cbdb22c03bd 100644 --- a/src/locales/en/filter-bar.ts +++ b/src/locales/en/filter-bar.ts @@ -29,9 +29,9 @@ export const filterBar: SimpleTranslationEntries = { "noHiddenAbility": "Hidden Ability - No", "egg": "Egg", "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Yes", + "noPokerus": "Pokérus - No", "sortByNumber": "No.", "sortByCost": "Cost", "sortByCandies": "Candy Count", diff --git a/src/locales/es/filter-bar.ts b/src/locales/es/filter-bar.ts index e713c10c21b..e98289c447c 100644 --- a/src/locales/es/filter-bar.ts +++ b/src/locales/es/filter-bar.ts @@ -3,35 +3,35 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen.", "typeFilter": "Tipo", - "caughtFilter": "Caught", + "caughtFilter": "Capturado", "unlocksFilter": "Otros", - "miscFilter": "Misc", + "miscFilter": "Misc.", "sortFilter": "Orden", "all": "Todo", "normal": "Normal", "uncaught": "No Capt.", - "passive": "Passive", - "passiveUnlocked": "Pasiva Desbloq.", - "passiveLocked": "Pasiva Bloq.", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", - "ribbon": "Ribbon", - "hasWon": "Ya ha ganado", - "hasNotWon": "Aún no ha ganado", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "passive": "Pasiva", + "passiveUnlocked": "Pasiva desbloq.", + "passiveLocked": "Pasiva bloq.", + "passiveUnlockable": "Pasiva - puede desbloq.", + "costReduction": "Reducción de coste", + "costReductionUnlocked": "Reducción de coste desbloq.", + "costReductionLocked": "Reducción de coste bloq.", + "costReductionUnlockable": "Red. de coste - puede desbloq.", + "favorite": "Favoritos", + "isFavorite": "Favoritos - Sí", + "notFavorite": "Favoritos - No", + "ribbon": "Cinta", + "hasWon": "Cinta - Sí", + "hasNotWon": "Cinta - No", + "hiddenAbility": "Habilidad oculta", + "hasHiddenAbility": "Habilidad oculta - Sí", + "noHiddenAbility": "Habilidad oculta - No", + "egg": "Huevo", + "eggPurchasable": "Huevo - puede comprar", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sí", + "noPokerus": "Pokérus - No", "sortByNumber": "Núm.", "sortByCost": "Coste", "sortByCandies": "# Caramelos", diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index f3130808f40..9b519fc75e6 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passif", "passiveUnlocked": "Passif débloqué", "passiveLocked": "Passif verrouillé", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", + "passiveUnlockable": "Passif débloquable", + "costReduction": "Cout réduit", + "costReductionUnlocked": "Cout réduit débloqué", + "costReductionLocked": "Cout réduit verrouillé", + "costReductionUnlockable": "Cout réduit débloquable", + "favorite": "Favoris", + "isFavorite": "Favoris uniquement", + "notFavorite": "Sans Favoris", "ribbon": "Ruban", - "hasWon": "Ruban - Oui", - "hasNotWon": "Ruban - Non", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "hasWon": "Ruban - Avec", + "hasNotWon": "Ruban - Sans", + "hiddenAbility": "Talent caché", + "hasHiddenAbility": "Talent caché - Avec", + "noHiddenAbility": "Talent caché - Sans", + "egg": "Œuf", + "eggPurchasable": "Œuf achetable", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Avec", + "noPokerus": "Pokérus - Sans", "sortByNumber": "Par N°", "sortByCost": "Par cout", "sortByCandies": "Par bonbons", diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts index f956544291d..0256f6bcf21 100644 --- a/src/locales/it/filter-bar.ts +++ b/src/locales/it/filter-bar.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Tipo", - "caughtFilter": "Caught", + "caughtFilter": "Catturati", "unlocksFilter": "Altro", "miscFilter": "Misc", "sortFilter": "Ordina", @@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passive", "passiveUnlocked": "Passiva sbloccata", "passiveLocked": "Passiva bloccata", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", - "ribbon": "Ribbon", - "hasWon": "Ribbon - Yes", - "hasNotWon": "Ribbon - No", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "passiveUnlockable": "Passiva sbloccabile", + "costReduction": "Costo ridotto", + "costReductionUnlocked": "Costo ridotto sbloccato", + "costReductionLocked": "Costo ridotto bloccato", + "costReductionUnlockable": "Costo ridotto sbloccabile", + "favorite": "Preferiti", + "isFavorite": "Preferiti - Sì", + "notFavorite": "Preferiti - No", + "ribbon": "Fiocco", + "hasWon": "Fiocco - Sì", + "hasNotWon": "Fiocco - No", + "hiddenAbility": "Abilità speciale", + "hasHiddenAbility": "Abilità speciale - Sì", + "noHiddenAbility": "Abilità speciale - No", + "egg": "Uova", + "eggPurchasable": "Uovo acquistabile", + "pokerus": "Pokérus", + "hasPokerus": "Pokérus - Sì", + "noPokerus": "Pokérus - No", "sortByNumber": "Num. Dex", "sortByCost": "Costo", "sortByCandies": "Caramelle", diff --git a/src/locales/ja/filter-bar.ts b/src/locales/ja/filter-bar.ts index ffd227f90ca..9900cb02800 100644 --- a/src/locales/ja/filter-bar.ts +++ b/src/locales/ja/filter-bar.ts @@ -1,40 +1,40 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const filterBar: SimpleTranslationEntries = { - "genFilter": "Gen", - "typeFilter": "Type", - "caughtFilter": "Caught", - "unlocksFilter": "Unlocks", - "miscFilter": "Misc", - "sortFilter": "Sort", - "all": "All", - "normal": "Not Shiny", - "uncaught": "Uncaught", - "passive": "Passive", - "passiveUnlocked": "Passive - Yes", - "passiveLocked": "Passive - No", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction - Yes", - "costReductionLocked": "Cost Reduction - No", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", - "ribbon": "Ribbon", - "hasWon": "Ribbon - Yes", - "hasNotWon": "Ribbon - No", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "genFilter": "世代", + "typeFilter": "タイプ", + "caughtFilter": "捕獲", + "unlocksFilter": "解放", + "miscFilter": "その他", + "sortFilter": "並べ替え", + "all": "すべて", + "normal": "非色違い", + "uncaught": "未捕獲", + "passive": "パッシブ", + "passiveUnlocked": "パッシブ - 解放済み", + "passiveLocked": "パッシブ - 未解放", + "passiveUnlockable": "パッシブ - 解放可能", + "costReduction": "ポイント削減", + "costReductionUnlocked": "ポイント削減 - 解放済み", + "costReductionLocked": "ポイント削減 - 未解放", + "costReductionUnlockable": "ポイント削減 - 解放可能", + "favorite": "お気に入り", + "isFavorite": "お気に入り - あり", + "notFavorite": "お気に入り - なし", + "ribbon": "リボン", + "hasWon": "リボン - あり", + "hasNotWon": "リボン - なし", + "hiddenAbility": "隠れ特性", + "hasHiddenAbility": "隠れ特性 - あり", + "noHiddenAbility": "隠れ特性 - なし", + "egg": "タマゴ", + "eggPurchasable": "タマゴ - 購入可能", + "pokerus": "ポケルス", + "hasPokerus": "ポケルス - あり", + "noPokerus": "ポケルス - なし", "sortByNumber": "No.", - "sortByCost": "Cost", - "sortByCandies": "Candy Count", - "sortByIVs": "IVs", - "sortByName": "Name", + "sortByCost": "ポイント", + "sortByCandies": "飴の数", + "sortByIVs": "個体値", + "sortByName": "名前", }; diff --git a/src/locales/pt_BR/filter-bar.ts b/src/locales/pt_BR/filter-bar.ts index d85fa65a536..1e39c1445d4 100644 --- a/src/locales/pt_BR/filter-bar.ts +++ b/src/locales/pt_BR/filter-bar.ts @@ -13,22 +13,22 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passiva", "passiveUnlocked": "Passiva Desbloqueada", "passiveLocked": "Passiva Bloqueada", - "passiveUnlockable": "Passive - Can Unlock", + "passiveUnlockable": "Passiva - Pode Desbloquear", "costReduction": "Redução de Custo", "costReductionUnlocked": "Redução de Custo Desbloq.", - "costReductionLocked": "Redução de Custo Bloq.", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", + "costReductionLocked": "Redução de Custo Bloqueada", + "costReductionUnlockable": "Redução de Custo Disponível", + "favorite": "Favoritos", + "isFavorite": "Favoritos - Sim", + "notFavorite": "Favoritos - Não", "ribbon": "Fita", "hasWon": "Fita - Sim", "hasNotWon": "Fita - Não", "hiddenAbility": "Habilidade Oculta", "hasHiddenAbility": "Habilidade Oculta - Sim", "noHiddenAbility": "Habilidade Oculta - Não", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", + "egg": "Ovo", + "eggPurchasable": "Ovo Comprável", "pokerus": "Pokérus", "hasPokerus": "Pokérus - Sim", "noPokerus": "Pokérus - Não", diff --git a/src/locales/zh_CN/filter-bar.ts b/src/locales/zh_CN/filter-bar.ts index 48b56d15071..3ca59de4e2c 100644 --- a/src/locales/zh_CN/filter-bar.ts +++ b/src/locales/zh_CN/filter-bar.ts @@ -13,22 +13,22 @@ export const filterBar: SimpleTranslationEntries = { "passive": "被动", "passiveUnlocked": "被动解锁", "passiveLocked": "被动未解锁", - "passiveUnlockable": "Passive - Can Unlock", + "passiveUnlockable": "被动可解锁", "costReduction": "费用降低", "costReductionUnlocked": "已降费", "costReductionLocked": "未降费", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", + "costReductionUnlockable": "可降费", + "favorite": "最爱", + "isFavorite": "包含最爱", + "notFavorite": "不包含最爱", "ribbon": "缎带", "hasWon": "有缎带", "hasNotWon": "无缎带", "hiddenAbility": "梦特", "hasHiddenAbility": "有梦特", "noHiddenAbility": "无梦特", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", + "egg": "蛋", + "eggPurchasable": "可购买蛋", "pokerus": "病毒", "hasPokerus": "有病毒", "noPokerus": "无病毒", diff --git a/src/locales/zh_TW/filter-bar.ts b/src/locales/zh_TW/filter-bar.ts index d784b0a6b6a..4c0821d98db 100644 --- a/src/locales/zh_TW/filter-bar.ts +++ b/src/locales/zh_TW/filter-bar.ts @@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = { "passive": "被動", "passiveUnlocked": "被動解鎖", "passiveLocked": "被動未解鎖", - "passiveUnlockable": "Passive - Can Unlock", - "costReduction": "Cost Reduction", - "costReductionUnlocked": "Cost Reduction Unlocked", - "costReductionLocked": "Cost Reduction Locked", - "costReductionUnlockable": "Cost Reduction - Can Unlock", - "favorite": "Favorite", - "isFavorite": "Favorite - Yes", - "notFavorite": "Favorite - No", + "passiveUnlockable": "被動可解鎖", + "costReduction": "費用降低", + "costReductionUnlocked": "已降費", + "costReductionLocked": "未降費", + "costReductionUnlockable": "可降費", + "favorite": "最愛", + "isFavorite": "包含最愛", + "notFavorite": "不包含最愛", "ribbon": "緞帶", "hasWon": "有緞帶", "hasNotWon": "無緞帶", - "hiddenAbility": "Hidden Ability", - "hasHiddenAbility": "Hidden Ability - Yes", - "noHiddenAbility": "Hidden Ability - No", - "egg": "Egg", - "eggPurchasable": "Purchasable Egg", - "pokerus": "Pokerus", - "hasPokerus": "Pokerus - Yes", - "noPokerus": "Pokerus - No", + "hiddenAbility": "隱藏特性", + "hasHiddenAbility": "有隱藏特性", + "noHiddenAbility": "無隱藏特性", + "egg": "蛋", + "eggPurchasable": "可購買蛋", + "pokerus": "病毒", + "hasPokerus": "有病毒", + "noPokerus": "無病毒", "sortByNumber": "編號", "sortByCost": "花費", "sortByCandies": "糖果", From 55174f14aad10db582e2f3db7d8a7e5deb6f5d55 Mon Sep 17 00:00:00 2001 From: Chapybara-jp Date: Mon, 12 Aug 2024 16:10:18 +0200 Subject: [PATCH 07/14] [Localisation(ja)] arena-tag.ts (#3510) Technical issues made it so that my suggestions weren't added in the PR, added them here instead. toxicSpikesActivateTrapPoison seems to have incorrect dialog in English as well. ( "[X] absorbed [Y]!" ) --- src/locales/ja/arena-tag.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locales/ja/arena-tag.ts b/src/locales/ja/arena-tag.ts index 54df26fa44f..fc86ddec886 100644 --- a/src/locales/ja/arena-tag.ts +++ b/src/locales/ja/arena-tag.ts @@ -11,16 +11,16 @@ export const arenaTag: SimpleTranslationEntries = { "reflectOnAdd": "リフレクターで 物理ダメージを さげた", "reflectOnAddPlayer": "味方の リフレクターで\n物理ダメージを さげた", "reflectOnAddEnemy": "相手の リフレクターで\n物理ダメージを さげた", - "lightScreenOnAdd": "ひかりのかべで\n物理ダメージを さげた", - "lightScreenOnAddPlayer": "味方の ひかりのかべで\n物理ダメージを さげた", - "lightScreenOnAddEnemy": "相手の ひかりのかべで\n物理ダメージを さげた", + "lightScreenOnAdd": "ひかりのかべで\n特殊ダメージを さげた", + "lightScreenOnAddPlayer": "味方の ひかりのかべで\n特殊ダメージを さげた", + "lightScreenOnAddEnemy": "相手の ひかりのかべで\n特殊ダメージを さげた", "auroraVeilOnAdd": "オーロラベールで\n攻撃の ダメージを さげた", "auroraVeilOnAddPlayer": "味方の オーロラベールで\n攻撃ダメージを さげた", "auroraVeilOnAddEnemy": "相手の オーロラベールで\n攻撃ダメージを さげた", "conditionalProtectOnAdd": "{{moveName}}に 守られた!", "conditionalProtectOnAddPlayer": "見方が {{moveName}}に 守られた!", "conditionalProtectOnAddEnemy": "相手が {{moveName}}に 守られた!", - "conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!", + "conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!", "matBlockOnAdd": "{{pokemonNameWithAffix}}は\nたたみがえしを ねらっている!", "noCritOnAddPlayer": "{{moveName}}の 力で 味方の急所が 隠れた!", "noCritOnAddEnemy": "{{moveName}}の 力で 相手の急所が 隠れた!", @@ -33,7 +33,7 @@ export const arenaTag: SimpleTranslationEntries = { "spikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", "spikesActivateTrap": "{{pokemonNameWithAffix}}は\nまきびしの ダメージを 受けた!", "toxicSpikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", - "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}を 吸収した!", + "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}で 毒を あびた!", "stealthRockOnAdd": "{{opponentDesc}}の 周りに\nとがった岩が ただよい始めた!", "stealthRockActivateTrap": "{{pokemonNameWithAffix}}に\nとがった岩が 食い込んだ!", "stickyWebOnAdd": "相手の 足下に\n{{moveName}}が 広がった!", From f1dfaff6063753629ac70f0c285208167149fd49 Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 12 Aug 2024 23:18:40 +0900 Subject: [PATCH 08/14] [Typo] Swaps bug report field names (#3507) --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 644fdcbe563..23c4a0a2159 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -21,7 +21,7 @@ body: - type: textarea id: session-file attributes: - label: User data export file + label: Session export file description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)). placeholder: Focus me and then drop your file here (or use the upload button at the bottom) validations: @@ -29,7 +29,7 @@ body: - type: textarea id: data-file attributes: - label: Session export file + label: User data export file description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)). placeholder: Focus me and then drop your file here (or use the upload button at the bottom) validations: From 6a6b333fa1d22a4fed3cab2202c38351abac5695 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 12 Aug 2024 16:21:43 +0200 Subject: [PATCH 09/14] [Localization(fr)] Update filter-bar.ts (#3515) --- src/locales/fr/filter-bar.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index 9b519fc75e6..be7c1035ea4 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -4,7 +4,7 @@ export const filterBar: SimpleTranslationEntries = { "genFilter": "Gen", "typeFilter": "Type", "caughtFilter": "Capturés", - "unlocksFilter": "Débloq.", + "unlocksFilter": "Amélio.", "miscFilter": "Divers", "sortFilter": "Tri", "all": "Tous", @@ -13,11 +13,11 @@ export const filterBar: SimpleTranslationEntries = { "passive": "Passif", "passiveUnlocked": "Passif débloqué", "passiveLocked": "Passif verrouillé", - "passiveUnlockable": "Passif débloquable", + "passiveUnlockable": "Passif déblocable", "costReduction": "Cout réduit", "costReductionUnlocked": "Cout réduit débloqué", "costReductionLocked": "Cout réduit verrouillé", - "costReductionUnlockable": "Cout réduit débloquable", + "costReductionUnlockable": "Cout réduit déblocable", "favorite": "Favoris", "isFavorite": "Favoris uniquement", "notFavorite": "Sans Favoris", From c32f195fe092c4ff6e57d51549bab377c92b32d2 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 12 Aug 2024 17:44:05 +0200 Subject: [PATCH 10/14] [Localization] French corrections/translations/adjustments tour (#3516) * Update battler-tags.ts * Update settings.ts * Update filter-bar.ts * Update modifier-type.ts * Update achv.ts * Update modifier-type.ts * Update achv.ts * Update starter-select-ui-handler.ts * Update challenges.ts * Update bgm-name.ts * Update achv.ts * Update bgm-name.ts --- src/locales/fr/achv.ts | 346 ++++++-------------- src/locales/fr/battler-tags.ts | 2 +- src/locales/fr/bgm-name.ts | 6 +- src/locales/fr/challenges.ts | 4 +- src/locales/fr/filter-bar.ts | 2 +- src/locales/fr/modifier-type.ts | 18 +- src/locales/fr/settings.ts | 10 +- src/locales/fr/starter-select-ui-handler.ts | 4 +- 8 files changed, 120 insertions(+), 272 deletions(-) diff --git a/src/locales/fr/achv.ts b/src/locales/fr/achv.ts index a2d7d2378a1..43977cb7692 100644 --- a/src/locales/fr/achv.ts +++ b/src/locales/fr/achv.ts @@ -10,7 +10,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "MoneyAchv": { - description: "Récolter un total de {{moneyAmount}} ₽", + description: "Récolter un total de {{moneyAmount}} ₽.", }, "10K_MONEY": { name: "Épargnant", @@ -26,7 +26,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "DamageAchv": { - description: "Infliger {{damageAmount}} de dégâts en un coup", + description: "Infliger {{damageAmount}} de dégâts en un coup.", }, "250_DMG": { name: "Caïd", @@ -42,7 +42,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "HealAchv": { - description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", + description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu.", }, "250_HEAL": { name: "Infirmier", @@ -58,7 +58,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "LevelAchv": { - description: "Monter un Pokémon au N.{{level}}", + description: "Monter un Pokémon au N.{{level}}.", }, "LV_100": { name: "Et c’est pas fini !", @@ -71,7 +71,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "RibbonAchv": { - description: "Accumuler un total de {{ribbonAmount}} Rubans", + description: "Accumuler un total de {{ribbonAmount}} Rubans.", }, "10_RIBBONS": { name: "Maitre de la Ligue", @@ -91,83 +91,83 @@ export const PGMachv: AchievementTranslationEntries = { "TRANSFER_MAX_BATTLE_STAT": { name: "Travail d’équipe", - description: "Utiliser Relais avec au moins une statistique montée à fond", + description: "Utiliser Relais avec au moins une statistique montée à fond.", }, "MAX_FRIENDSHIP": { name: "Copinage", - description: "Atteindre le niveau de bonheur maximal avec un Pokémon", + description: "Atteindre le niveau de bonheur maximal avec un Pokémon.", }, "MEGA_EVOLVE": { name: "Mégamorph", - description: "Méga-évoluer un Pokémon", + description: "Méga-évoluer un Pokémon.", }, "GIGANTAMAX": { name: "Kaijū", - description: "Gigamaxer un Pokémon", + description: "Gigamaxer un Pokémon.", }, "TERASTALLIZE": { name: "J’aime les STAB", - description: "Téracristalliser un Pokémon", + description: "Téracristalliser un Pokémon.", }, "STELLAR_TERASTALLIZE": { name: "Le type enfoui", - description: "Téracristalliser un Pokémon en type Stellaire", + description: "Téracristalliser un Pokémon en type Stellaire.", }, "SPLICE": { name: "Infinite Fusion", - description: "Fusionner deux Pokémon avec le Pointeau ADN", + description: "Fusionner deux Pokémon avec le Pointeau ADN.", }, "MINI_BLACK_HOLE": { name: "Item-stellar", - description: "Obtenir un Mini Trou Noir", + description: "Obtenir un Mini Trou Noir.", }, "CATCH_MYTHICAL": { name: "Fabuleux", - description: "Capturer un Pokémon fabuleux", + description: "Capturer un Pokémon fabuleux.", }, "CATCH_SUB_LEGENDARY": { name: "(Semi-)Légendaire", - description: "Capturer un Pokémon semi-légendaire", + description: "Capturer un Pokémon semi-légendaire.", }, "CATCH_LEGENDARY": { name: "Légendaire", - description: "Capturer un Pokémon légendaire", + description: "Capturer un Pokémon légendaire.", }, "SEE_SHINY": { name: "Chromatique", - description: "Trouver un Pokémon sauvage chromatique", + description: "Trouver un Pokémon sauvage chromatique.", }, "SHINY_PARTY": { name: "Shasseur", - description: "Avoir une équipe exclusivement composée de Pokémon chromatiques", + description: "Avoir une équipe exclusivement composée de Pokémon chromatiques.", }, "HATCH_MYTHICAL": { name: "Œuf fabuleux", - description: "Obtenir un Pokémon fabuleux dans un Œuf", + description: "Obtenir un Pokémon fabuleux dans un Œuf.", }, "HATCH_SUB_LEGENDARY": { name: "Œuf semi-légendaire", - description: "Obtenir un Pokémon semi-légendaire dans un Œuf", + description: "Obtenir un Pokémon semi-légendaire dans un Œuf.", }, "HATCH_LEGENDARY": { name: "Œuf légendaire", - description: "Obtenir un Pokémon légendaire dans un Œuf", + description: "Obtenir un Pokémon légendaire dans un Œuf.", }, "HATCH_SHINY": { name: "Œuf chromatique", - description: "Obtenir un Pokémon chromatique dans un Œuf", + description: "Obtenir un Pokémon chromatique dans un Œuf.", }, "HIDDEN_ABILITY": { name: "Potentiel enfoui", - description: "Capturer un Pokémon possédant un talent caché", + description: "Capturer un Pokémon possédant un talent caché.", }, "PERFECT_IVS": { name: "Certificat d’authenticité", - description: "Avoir des IV parfaits sur un Pokémon", + description: "Avoir des IV parfaits sur un Pokémon.", }, "CLASSIC_VICTORY": { name: "Invaincu", - description: "Terminer le jeu en mode classique", + description: "Terminer le jeu en mode Classique.", }, "UNEVOLVED_CLASSIC_VICTORY": { name: "Le stagiaire de 3e", @@ -176,39 +176,39 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_GEN_ONE": { name: "Le rival originel", - description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 1re génération.", }, "MONO_GEN_TWO": { name: "Entre tradition et modernité", - description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 2e génération.", }, "MONO_GEN_THREE": { name: "Too much water ?", - description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 3e génération.", }, "MONO_GEN_FOUR": { name: "Réellement la plus difficile ?", - description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 4e génération.", }, "MONO_GEN_FIVE": { name: "Recast complet", - description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 5e génération.", }, "MONO_GEN_SIX": { name: "Aristocrate", - description: "Terminer un challenge avec uniquement des Pokémon de 6e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 6e génération.", }, "MONO_GEN_SEVEN": { name: "Seulement techniquement", - description: "Terminer un challenge avec uniquement des Pokémon de 7e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 7e génération.", }, "MONO_GEN_EIGHT": { name: "L’heure de gloire", - description: "Terminer un challenge avec uniquement des Pokémon de 8e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 8e génération.", }, "MONO_GEN_NINE": { name: "Ça va, c’était EZ", - description: "Terminer un challenge avec uniquement des Pokémon de 9e génération.", + description: "Terminer un challenge avec uniquement des Pokémon\nde 9e génération.", }, "MonoType": { @@ -277,21 +277,17 @@ export const PGMachv: AchievementTranslationEntries = { // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) export const PGFachv: AchievementTranslationEntries = { "Achievements": { - name: "Succès", + name: PGMachv.Achievements.name, }, "Locked": { - name: "Verrouillé", + name: PGMachv.Locked.name, }, - "MoneyAchv": { - description: "Récolter un total de {{moneyAmount}} ₽", - }, + "MoneyAchv": PGMachv.MoneyAchv, "10K_MONEY": { name: "Épargnante", }, - "100K_MONEY": { - name: "Je possède des thunes", - }, + "100K_MONEY": PGMachv["100K_MONEY"], "1M_MONEY": { name: "Banquière", }, @@ -299,12 +295,8 @@ export const PGFachv: AchievementTranslationEntries = { name: "Évadée fiscale", }, - "DamageAchv": { - description: "Infliger {{damageAmount}} de dégâts en un coup", - }, - "250_DMG": { - name: "Caïd", - }, + "DamageAchv": PGMachv.DamageAchv, + "250_DMG": PGMachv["250_DMG"], "1000_DMG": { name: "Boxeuse", }, @@ -315,38 +307,20 @@ export const PGFachv: AchievementTranslationEntries = { name: "One Punch Woman", }, - "HealAchv": { - description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu", - }, + "HealAchv": PGMachv.HealAchv, "250_HEAL": { name: "Infirmière", }, - "1000_HEAL": { - name: "Médecin", - }, - "2500_HEAL": { - name: "Clerc", - }, - "10000_HEAL": { - name: "Centre Pokémon", - }, + "1000_HEAL": PGMachv["1000_HEAL"], + "2500_HEAL": PGMachv["2500_HEAL"], + "10000_HEAL": PGMachv["10000_HEAL"], - "LevelAchv": { - description: "Monter un Pokémon au N.{{level}}", - }, - "LV_100": { - name: "Et c’est pas fini !", - }, - "LV_250": { - name: "Élite", - }, - "LV_1000": { - name: "Vers l’infini et au-delà", - }, + "LevelAchv": PGMachv.LevelAchv, + "LV_100": PGMachv["LV_100"], + "LV_250": PGMachv["LV_250"], + "LV_1000": PGMachv["LV_1000"], - "RibbonAchv": { - description: "Accumuler un total de {{ribbonAmount}} Rubans", - }, + "RibbonAchv": PGMachv.RibbonAchv, "10_RIBBONS": { name: "Maitresse de la Ligue", }, @@ -363,187 +337,61 @@ export const PGFachv: AchievementTranslationEntries = { name: "Master Maitresse de la Ligue", }, - "TRANSFER_MAX_BATTLE_STAT": { - name: "Travail d’équipe", - description: "Utiliser Relais avec au moins une statistique montée à fond", - }, - "MAX_FRIENDSHIP": { - name: "Copinage", - description: "Atteindre le niveau de bonheur maximal avec un Pokémon", - }, - "MEGA_EVOLVE": { - name: "Mégamorph", - description: "Méga-évoluer un Pokémon", - }, - "GIGANTAMAX": { - name: "Kaijū", - description: "Gigamaxer un Pokémon", - }, - "TERASTALLIZE": { - name: "J’aime les STAB", - description: "Téracristalliser un Pokémon", - }, - "STELLAR_TERASTALLIZE": { - name: "Le type enfoui", - description: "Téracristalliser un Pokémon en type Stellaire", - }, - "SPLICE": { - name: "Infinite Fusion", - description: "Fusionner deux Pokémon avec le Pointeau ADN", - }, - "MINI_BLACK_HOLE": { - name: "Item-stellar", - description: "Obtenir un Mini Trou Noir", - }, - "CATCH_MYTHICAL": { - name: "Fabuleux", - description: "Capturer un Pokémon fabuleux", - }, - "CATCH_SUB_LEGENDARY": { - name: "(Semi-)Légendaire", - description: "Capturer un Pokémon semi-légendaire", - }, - "CATCH_LEGENDARY": { - name: "Légendaire", - description: "Capturer un Pokémon légendaire", - }, - "SEE_SHINY": { - name: "Chromatique", - description: "Trouver un Pokémon sauvage chromatique", - }, + "TRANSFER_MAX_BATTLE_STAT": PGMachv.TRANSFER_MAX_BATTLE_STAT, + "MAX_FRIENDSHIP": PGMachv.MAX_FRIENDSHIP, + "MEGA_EVOLVE": PGMachv.MEGA_EVOLVE, + "GIGANTAMAX": PGMachv.GIGANTAMAX, + "TERASTALLIZE": PGMachv.TERASTALLIZE, + "STELLAR_TERASTALLIZE": PGMachv.STELLAR_TERASTALLIZE, + "SPLICE": PGMachv.SPLICE, + "MINI_BLACK_HOLE": PGMachv.MINI_BLACK_HOLE, + "CATCH_MYTHICAL": PGMachv.CATCH_MYTHICAL, + "CATCH_SUB_LEGENDARY": PGMachv.CATCH_SUB_LEGENDARY, + "CATCH_LEGENDARY": PGMachv.CATCH_LEGENDARY, + "SEE_SHINY": PGMachv.SEE_SHINY, "SHINY_PARTY": { name: "Shasseuse", description: "Avoir une équipe exclusivement composée de Pokémon chromatiques", }, - "HATCH_MYTHICAL": { - name: "Œuf fabuleux", - description: "Obtenir un Pokémon fabuleux dans un Œuf", - }, - "HATCH_SUB_LEGENDARY": { - name: "Œuf semi-légendaire", - description: "Obtenir un Pokémon semi-légendaire dans un Œuf", - }, - "HATCH_LEGENDARY": { - name: "Œuf légendaire", - description: "Obtenir un Pokémon légendaire dans un Œuf", - }, - "HATCH_SHINY": { - name: "Œuf chromatique", - description: "Obtenir un Pokémon chromatique dans un Œuf", - }, - "HIDDEN_ABILITY": { - name: "Potentiel enfoui", - description: "Capturer un Pokémon possédant un talent caché", - }, - "PERFECT_IVS": { - name: "Certificat d’authenticité", - description: "Avoir des IV parfaits sur un Pokémon", - }, + "HATCH_MYTHICAL": PGMachv.HATCH_MYTHICAL, + "HATCH_SUB_LEGENDARY": PGMachv.HATCH_SUB_LEGENDARY, + "HATCH_LEGENDARY": PGMachv.HATCH_LEGENDARY, + "HATCH_SHINY": PGMachv.HATCH_SHINY, + "HIDDEN_ABILITY": PGMachv.HIDDEN_ABILITY, + "PERFECT_IVS": PGMachv.PERFECT_IVS, "CLASSIC_VICTORY": { name: "Invaincue", description: "Terminer le jeu en mode classique", }, - "UNEVOLVED_CLASSIC_VICTORY": { - name: "Le stagiaire de 3e", - description: "Terminer le mode Classique avec au moins un Pokémon non-évolué dans l’équipe." - }, + "UNEVOLVED_CLASSIC_VICTORY": PGMachv.UNEVOLVED_CLASSIC_VICTORY, + "MONO_GEN_ONE": PGMachv.MONO_GEN_ONE, + "MONO_GEN_TWO": PGMachv.MONO_GEN_TWO, + "MONO_GEN_THREE": PGMachv.MONO_GEN_THREE, + "MONO_GEN_FOUR": PGMachv.MONO_GEN_FOUR, + "MONO_GEN_FIVE": PGMachv.MONO_GEN_FIVE, + "MONO_GEN_SIX": PGMachv.MONO_GEN_SIX, + "MONO_GEN_SEVEN": PGMachv.MONO_GEN_SEVEN, + "MONO_GEN_EIGHT": PGMachv.MONO_GEN_EIGHT, + "MONO_GEN_NINE": PGMachv.MONO_GEN_NINE, - "MONO_GEN_ONE": { - name: "Le rival originel", - description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", - }, - "MONO_GEN_TWO": { - name: "Entre tradition et modernité", - description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", - }, - "MONO_GEN_THREE": { - name: "Too much water ?", - description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", - }, - "MONO_GEN_FOUR": { - name: "Réellement la plus difficile ?", - description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", - }, - "MONO_GEN_FIVE": { - name: "Recast complet", - description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", - }, - "MONO_GEN_SIX": { - name: "Aristocrate", - description: "Terminer un challenge avec uniquement des Pokémon de 6e génération.", - }, - "MONO_GEN_SEVEN": { - name: "Seulement techniquement", - description: "Terminer un challenge avec uniquement des Pokémon de 7e génération.", - }, - "MONO_GEN_EIGHT": { - name: "L’heure de gloire", - description: "Terminer un challenge avec uniquement des Pokémon de 8e génération.", - }, - "MONO_GEN_NINE": { - name: "Ça va, c’était EZ", - description: "Terminer un challenge avec uniquement des Pokémon de 9e génération.", - }, - - "MonoType": { - description: "Terminer un challenge en monotype {{type}}.", - }, - "MONO_NORMAL": { - name: "Extraordinairement banal", - }, - "MONO_FIGHTING": { - name: "Je connais le kung-fu", - }, - "MONO_FLYING": { - name: "Angry Birds", - }, - "MONO_POISON": { - name: "Touche moi je t’empoisonne !", - }, - "MONO_GROUND": { - name: "Prévisions : Séisme", - }, - "MONO_ROCK": { - name: "Comme un roc", - }, - "MONO_BUG": { - name: "Une chenille !", - }, - "MONO_GHOST": { - name: "SOS Fantômes", - }, - "MONO_STEEL": { - name: "De type Acier !", - }, - "MONO_FIRE": { - name: "Allumer le feu", - }, - "MONO_WATER": { - name: "Vacances en Bretagne", - }, - "MONO_GRASS": { - name: "Ne pas toucher !", - }, - "MONO_ELECTRIC": { - name: "À la masse", - }, - "MONO_PSYCHIC": { - name: "Grocervo", - }, - "MONO_ICE": { - name: "Froid comme la glace", - }, - "MONO_DRAGON": { - name: "Légendes du club, ou presque", - }, - "MONO_DARK": { - name: "Ça va lui passer", - }, - "MONO_FAIRY": { - name: "Hey ! Listen !", - }, - "FRESH_START": { - name: "Du premier coup !", - description: "Terminer un challenge « Nouveau départ »." - } + "MonoType": PGMachv.MonoType, + "MONO_NORMAL": PGMachv.MONO_NORMAL, + "MONO_FIGHTING": PGMachv.MONO_FIGHTING, + "MONO_FLYING": PGMachv.MONO_FLYING, + "MONO_POISON": PGMachv.MONO_POISON, + "MONO_GROUND": PGMachv.MONO_GROUND, + "MONO_ROCK": PGMachv.MONO_ROCK, + "MONO_BUG": PGMachv.MONO_BUG, + "MONO_GHOST": PGMachv.MONO_GHOST, + "MONO_STEEL": PGMachv.MONO_STEEL, + "MONO_FIRE": PGMachv.MONO_FIRE, + "MONO_WATER": PGMachv.MONO_WATER, + "MONO_GRASS": PGMachv.MONO_GRASS, + "MONO_ELECTRIC": PGMachv.MONO_ELECTRIC, + "MONO_PSYCHIC": PGMachv.MONO_PSYCHIC, + "MONO_ICE": PGMachv.MONO_ICE, + "MONO_DRAGON": PGMachv.MONO_DRAGON, + "MONO_DARK": PGMachv.MONO_DARK, + "MONO_FAIRY": PGMachv.MONO_FAIRY, + "FRESH_START": PGMachv.FRESH_START } as const; diff --git a/src/locales/fr/battler-tags.ts b/src/locales/fr/battler-tags.ts index 6d3dca19264..7598dcaff74 100644 --- a/src/locales/fr/battler-tags.ts +++ b/src/locales/fr/battler-tags.ts @@ -69,5 +69,5 @@ export const battlerTags: SimpleTranslationEntries = { "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}}!", + "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !", } as const; diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts index e66c8102e46..f3ae438d36d 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -23,7 +23,7 @@ export const bgmName: SimpleTranslationEntries = { "battle_galar_elite": "ÉB - Vs. Tournoi des Champions", "battle_paldea_elite": "ÉV - Vs. Conseil 4", "battle_bb_elite": "ÉV - Vs. Conseil 4 de l’Institut Myrtille", - "battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", + "battle_final_encounter": "PDM ÉdS DX - Vs. Rayquaza", "battle_final": "NB - Vs. Ghetis", "battle_kanto_gym": "N2B2 - Vs. Champion·ne d’Arène de Kanto", "battle_johto_gym": "N2B2 - Vs. Champion·ne d’Arène de Johto", @@ -74,14 +74,14 @@ export const bgmName: SimpleTranslationEntries = { "battle_trainer": "NB - Vs. Dresseur·euse", "battle_wild": "NB - Vs. Pokémon sauvage", "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", - "end_summit": "PDM ÉSDX - Tour Céleste", + "end_summit": "PDM ÉdS DX - Tour Céleste (Sommet)", "battle_rocket_grunt": "HGSS Vs. Team Rocket", "battle_aqua_magma_grunt": "ROSA Vs. Team Aqua/Magma", "battle_galactic_grunt": "DÉPS Vs. Team Galaxie", "battle_plasma_grunt": "NB - Vs. Team Plasma", "battle_flare_grunt": "XY - Vs. Team Flare", "battle_rocket_boss": "USUL - Vs. Giovanni", - "battle_aqua_magma_boss": "ROSA - Vs. Max/Arthur", + "battle_aqua_magma_boss": "ROSA - Vs. Arthur/Max", "battle_galactic_boss": "DÉPS - Vs. Hélio", "battle_plasma_boss": "N2B2 - Vs. Ghetis", "battle_flare_boss": "XY - Vs. Lysandre", diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index 694cc242e73..e91c897f83a 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -4,7 +4,7 @@ export const challenges: TranslationEntries = { "title": "Paramètres du Challenge", "illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !", "singleGeneration": { - "name": "Mono-génération", + "name": "Monogénération", "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", "gen_1": "1re", @@ -18,7 +18,7 @@ export const challenges: TranslationEntries = { "gen_9": "9e", }, "singleType": { - "name": "Mono-type", + "name": "Monotype", "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." //type in pokemon-info diff --git a/src/locales/fr/filter-bar.ts b/src/locales/fr/filter-bar.ts index be7c1035ea4..b5e7ef3b333 100644 --- a/src/locales/fr/filter-bar.ts +++ b/src/locales/fr/filter-bar.ts @@ -26,7 +26,7 @@ export const filterBar: SimpleTranslationEntries = { "hasNotWon": "Ruban - Sans", "hiddenAbility": "Talent caché", "hasHiddenAbility": "Talent caché - Avec", - "noHiddenAbility": "Talent caché - Sans", + "noHiddenAbility": "Talent caché - Sans", "egg": "Œuf", "eggPurchasable": "Œuf achetable", "pokerus": "Pokérus", diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 3635b318336..0a472b9f0d9 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -42,17 +42,17 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonPpUpModifierType": { - description: "Augmente le max de PP de {{upPoints}} à une capacité d’un Pokémon pour chaque 5 PP max (max : 3).", + description: "Augmente le max de PP de {{upPoints}} à une capacité d’un Pokémon pour chaque 5 PP max (max : 3).", }, "PokemonNatureChangeModifierType": { name: "Aromate {{natureName}}", - description: "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié.", + description: "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié.", }, "DoubleBattleChanceBoosterModifierType": { - description: "Double les chances de tomber sur un combat double pendant {{battleCount}} combats.", + description: "Double les chances de tomber sur un combat double pendant {{battleCount}} combats.", }, "TempBattleStatBoosterModifierType": { - description: "Augmente d’un cran {{tempBattleStatName}} pour toute l’équipe pendant 5 combats.", + description: "Augmente d’un cran {{tempBattleStatName}} pour toute l’équipe pendant 5 combats.", }, "AttackTypeBoosterModifierType": { description: "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon.", @@ -93,7 +93,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100).", }, "PokemonMultiHitModifierType": { - description: "Frappe une fois de plus en échange d’une baisse de puissance de respectivement 60/75/82,5% par cumul.", + description: "Frappe une fois de plus en échange d’une baisse de puissance de respectivement 60/75/82,5% par cumul.", }, "TmModifierType": { name: "CT{{moveId}} - {{moveName}}", @@ -132,9 +132,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "RARE_CANDY": { name: "Super Bonbon" }, "RARER_CANDY": { name: "Hyper Bonbon" }, - "MEGA_BRACELET": { name: "Méga-Bracelet", description: "Débloque les Méga-Gemmes." }, + "MEGA_BRACELET": { name: "Méga-Bracelet", description: "Débloque les Méga-Gemmes dans la boutique." }, "DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque le Dynamax." }, - "TERA_ORB": { name: "Orbe Téracristal", description: "Débloque les Téra-Éclats." }, + "TERA_ORB": { name: "Orbe Téracristal", description: "Débloque les Téra-Éclats dans la boutique." }, "MAP": { name: "Carte", description: "Vous permet de choisir votre destination à un croisement." }, @@ -211,7 +211,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "BERRY_POUCH": { name: "Sac à Baies", description: "Ajoute 30% de chances qu’une Baie utilisée ne soit pas consommée." }, - "FOCUS_BAND": { name: "Bandeau", description: "Ajoute 10% de chances de survivre avec 1 PV si les dégâts reçus pouvaient mettre K.O." }, + "FOCUS_BAND": { name: "Bandeau", description: "Ajoute 10% de chances de survivre avec 1 PV si les dégâts reçus pouvaient mettre K.O. ." }, "QUICK_CLAW": { name: "Vive Griffe", description: "Ajoute 10% de chances d’agir en premier, indépendamment de la vitesse (après la priorité)." }, @@ -226,7 +226,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "BATON": { name: "Bâton", description: "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, "SHINY_CHARM": { name: "Charme Chroma", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique." }, - "ABILITY_CHARM": { name: "Charme Talent", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un Talent Caché." }, + "ABILITY_CHARM": { name: "Charme Talent", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un talent caché." }, "IV_SCANNER": { name: "Scanner d’IV", description: "Révèle la qualité de deux IV d’un Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index 19e9f57ead6..95246ccb7d0 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -37,7 +37,7 @@ export const settings: SimpleTranslationEntries = { "legacy": "Ancienne", "windowType": "Type de fenêtre", "moneyFormat": "Format de l’argent", - "damageNumbers": "Nombres de dégâts", + "damageNumbers": "Affichage dégâts", "simple": "Simple", "fancy": "Amélioré", "abbreviated": "Abrégé", @@ -49,10 +49,10 @@ export const settings: SimpleTranslationEntries = { "icon": "Icône", "animation": "Animation", "moveInfo": "Infos de capacité", - "showMovesetFlyout": "Afficher le volet de capacités", - "showArenaFlyout": "Afficher le volet d’arène", - "showTimeOfDayWidget": "Widget de l’heure", - "timeOfDayAnimation": "Animation de l’heure", + "showMovesetFlyout": "Afficher volet de capacités", + "showArenaFlyout": "Afficher volet d’arène", + "showTimeOfDayWidget": "Widget d’heure", + "timeOfDayAnimation": "Animation d’heure", "bounce": "Sauter", "timeOfDay_back": "Retour", "spriteSet": "Ensemble de sprites", diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index aea207b140d..e46d0ac953c 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -28,8 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "toggleIVs": "Voir les IV", "manageMoves": "Modifier les Capacités", "manageNature": "Modifier la Nature", - "addToFavorites": "Add to Favorites", - "removeFromFavorites": "Remove from Favorites", + "addToFavorites": "Ajouter aux Favoris", + "removeFromFavorites": "Retirer des Favoris", "useCandies": "Utiliser des Bonbons", "selectNature": "Sélectionnez une nature.", "selectMoveSwapOut": "Sélectionnez la capacité à échanger.", From 897f0279ec19d73c2d47337c95c5d76e44f9b29e Mon Sep 17 00:00:00 2001 From: Mumble Date: Mon, 12 Aug 2024 09:19:58 -0700 Subject: [PATCH 11/14] [BUG] Pokemon with the Levitate ability - Sand Attack Interaction Fix (#3442) * Included a check for move category in TypeImmunityAbAttr * Failure 1 * Created new attribute for Levitate - blame Game Freak * renamed abattr to more descriptive attacktypeimmunityabattr * need caffeine * the documentation --------- Co-authored-by: Frutescens --- src/data/ability.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 961c724416a..cb3db27ddc1 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -343,12 +343,10 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { return false; } - if (attacker !== pokemon && move.type === this.immuneType) { (args[0] as Utils.NumberHolder).value = 0; return true; } - return false; } @@ -357,6 +355,24 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { } } +export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { + constructor(immuneType: Type, condition?: AbAttrCondition) { + super(immuneType, condition); + } + + /** + * Applies immunity if the move used is not a status move. + * Type immunity abilities that do not give additional benefits (HP recovery, stat boosts, etc) are not immune to status moves of the type + * Example: Levitate + */ + applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (move.category !== MoveCategory.STATUS) { + return super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); + } + return false; + } +} + export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { constructor(immuneType: Type) { super(immuneType); @@ -4375,7 +4391,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) + .attr(AttackTypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), From 9669735d4c5c5050752648959322335371880078 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 12 Aug 2024 19:58:25 +0200 Subject: [PATCH 12/14] [Localization(it)] Update filter-bar.ts (#3517) --- src/locales/it/filter-bar.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/locales/it/filter-bar.ts b/src/locales/it/filter-bar.ts index 0256f6bcf21..84ff98f381d 100644 --- a/src/locales/it/filter-bar.ts +++ b/src/locales/it/filter-bar.ts @@ -8,16 +8,16 @@ export const filterBar: SimpleTranslationEntries = { "miscFilter": "Misc", "sortFilter": "Ordina", "all": "Tutto", - "normal": "Normale", + "normal": "Non shiny", "uncaught": "Mancante", - "passive": "Passive", + "passive": "Passiva", "passiveUnlocked": "Passiva sbloccata", "passiveLocked": "Passiva bloccata", "passiveUnlockable": "Passiva sbloccabile", - "costReduction": "Costo ridotto", - "costReductionUnlocked": "Costo ridotto sbloccato", - "costReductionLocked": "Costo ridotto bloccato", - "costReductionUnlockable": "Costo ridotto sbloccabile", + "costReduction": "Riduzione costo", + "costReductionUnlocked": "Costo ridotto", + "costReductionLocked": "Costo non ridotto", + "costReductionUnlockable": "Costo riducibile", "favorite": "Preferiti", "isFavorite": "Preferiti - Sì", "notFavorite": "Preferiti - No", From 6d515d58b552a76acd5dec03c12886a540b4e2a5 Mon Sep 17 00:00:00 2001 From: damocleas Date: Mon, 12 Aug 2024 16:27:33 -0400 Subject: [PATCH 13/14] [Balance] Egg and Starter Adjustments (increase HA chance, decrease candy costs) (#3419) * [Balance] Egg Adjustments * Reduced Cost of Same-Species Eggs * Update egg.ts * check errors * Candy per Species-Egg Adjusted * Set egg cost back to 10 for 9/10 cost mons * 8-10 Legendaries made to 8 cost Eggs * Updated some Passive Costs and Cost Reductions * Change HA rate of eggs to 192 Also clean up the if to make it more readable * Changed HA Rate from Same-Species Eggs up 1/4 -> 1/8 * Rename "voucher*" variables to "gacha*" --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/egg.ts | 19 ++++++++++--------- src/ui/starter-select-ui-handler.ts | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/data/egg.ts b/src/data/egg.ts index 9c76591f01b..3e872d364f3 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -15,9 +15,10 @@ export const EGG_SEED = 1073741824; // Rates for specific random properties in 1/x const DEFAULT_SHINY_RATE = 128; const GACHA_SHINY_UP_SHINY_RATE = 64; -const SAME_SPECIES_EGG_SHINY_RATE = 32; -const SAME_SPECIES_EGG_HA_RATE = 16; +const SAME_SPECIES_EGG_SHINY_RATE = 24; +const SAME_SPECIES_EGG_HA_RATE = 8; const MANAPHY_EGG_MANAPHY_RATE = 8; +const GACHA_EGG_HA_RATE = 192; // 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs const DEFAULT_RARE_EGGMOVE_RATE = 6; @@ -211,11 +212,12 @@ export class Egg { pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); } - // Sets the hidden ability if a hidden ability exists and the override is set - // or if the same species egg hits the chance + // Sets the hidden ability if a hidden ability exists and + // the override is set or the egg hits the chance let abilityIndex: number | undefined = undefined; - if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility - || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { + const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)); + const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE)); + if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) { abilityIndex = 2; } @@ -396,8 +398,7 @@ export class Egg { * 2 cost mons get 1.5x * 4, 6, 8 cost mons get 1.75x * 3, 5, 7, 9 cost mons get 1x - * Alolan, Galarian, and Paldean mons get 0.5x - * Hisui mons get 0.125x + * Alolan, Galarian, Hisui, and Paldean mons get 0.5x * * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once * and being the same each time @@ -408,7 +409,7 @@ export class Egg { let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); const species = getPokemonSpecies(speciesId); if (species.isRegional()) { - weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + weight = Math.floor(weight / 2); } speciesWeights.push(totalWeight + weight); totalWeight += weight; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 00e6a1881dc..e80a82be5ff 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -118,16 +118,16 @@ const languageSettings: { [key: string]: LanguageSetting } = { }; const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ - { passive: 50, costReduction: [30, 75], egg: 35 }, // 1 - { passive: 45, costReduction: [25, 60], egg: 35 }, // 2 - { passive: 40, costReduction: [20, 50], egg: 35 }, // 3 - { passive: 30, costReduction: [15, 40], egg: 30 }, // 4 - { passive: 25, costReduction: [12, 35], egg: 25 }, // 5 - { passive: 20, costReduction: [10, 30], egg: 20 }, // 6 - { passive: 15, costReduction: [8, 20], egg: 15 }, // 7 - { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 - { passive: 10, costReduction: [3, 10], egg: 10 }, // 9 - { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 + { passive: 40, costReduction: [25, 60], egg: 30 }, // 1 Cost + { passive: 40, costReduction: [25, 60], egg: 30 }, // 2 Cost + { passive: 35, costReduction: [20, 50], egg: 25 }, // 3 Cost + { passive: 30, costReduction: [15, 40], egg: 20 }, // 4 Cost + { passive: 25, costReduction: [12, 35], egg: 18 }, // 5 Cost + { passive: 20, costReduction: [10, 30], egg: 15 }, // 6 Cost + { passive: 15, costReduction: [8, 20], egg: 12 }, // 7 Cost + { passive: 10, costReduction: [5, 15], egg: 8 }, // 8 Cost + { passive: 10, costReduction: [5, 15], egg: 8 }, // 9 Cost + { passive: 10, costReduction: [5, 15], egg: 8 }, // 10 Cost ]; // Position of UI elements From 6c2c14cb1ed8de19511d019d5f1020062fbdb92c Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 12 Aug 2024 19:21:51 -0700 Subject: [PATCH 14/14] [Test] Fix Flash Fire tests to remove enemy ability RNG (#3523) * Fix Flash Fire tests to remove enemy ability RNG * Replace manual status application with override use --- src/test/abilities/flash_fire.test.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/abilities/flash_fire.test.ts b/src/test/abilities/flash_fire.test.ts index a5b3677edee..b77b271b754 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/src/test/abilities/flash_fire.test.ts @@ -7,7 +7,7 @@ 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 { StatusEffect } from "#app/data/status-effect.js"; import { BattlerTagType } from "#app/enums/battler-tag-type.js"; import { BattlerIndex } from "#app/battle.js"; @@ -30,6 +30,7 @@ describe("Abilities - Flash Fire", () => { game.override .battleType("single") .ability(Abilities.FLASH_FIRE) + .enemyAbility(Abilities.BALL_FETCH) .startingLevel(20) .enemyLevel(20) .disableCrits(); @@ -75,13 +76,11 @@ describe("Abilities - Flash Fire", () => { it("activated after being frozen", async() => { game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); + game.override.statusEffect(StatusEffect.FREEZE); 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);