Merge branch 'beta' into finish-buff-punish-moves

This commit is contained in:
NightKev 2024-08-12 22:56:30 -07:00
commit c5082e5508
67 changed files with 830 additions and 821 deletions

View File

@ -21,7 +21,7 @@ body:
- type: textarea - type: textarea
id: session-file id: session-file
attributes: 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/)). 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) placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
validations: validations:
@ -29,7 +29,7 @@ body:
- type: textarea - type: textarea
id: data-file id: data-file
attributes: 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/)). 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) placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
validations: validations:

View File

@ -55,7 +55,6 @@ import {UiInputs} from "./ui-inputs";
import { NewArenaEvent } from "./events/battle-scene"; import { NewArenaEvent } from "./events/battle-scene";
import { ArenaFlyout } from "./ui/arena-flyout"; import { ArenaFlyout } from "./ui/arena-flyout";
import { EaseType } from "#enums/ease-type"; import { EaseType } from "#enums/ease-type";
import { Abilities } from "#enums/abilities";
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
import { BattleStyle } from "#enums/battle-style"; import { BattleStyle } from "#enums/battle-style";
import { Biome } from "#enums/biome"; import { Biome } from "#enums/biome";
@ -1153,12 +1152,6 @@ export default class BattleScene extends SceneBase {
playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p))); playerField.forEach((_, p) => this.pushPhase(new ReturnPhase(this, p)));
for (const pokemon of this.getParty()) { for (const pokemon of this.getParty()) {
// Only trigger form change when Eiscue is in Noice form
// Hardcoded Eiscue for now in case it is fused with another pokemon
if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) {
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger);
}
pokemon.resetBattleData(); pokemon.resetBattleData();
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
} }
@ -2222,7 +2215,7 @@ export default class BattleScene extends SceneBase {
} }
} else if (!virtual) { } else if (!virtual) {
const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); 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)); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success));
} }

View File

@ -245,25 +245,6 @@ export class PreDefendAbAttr extends AbAttr {
} }
} }
export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
private formFunc: (p: Pokemon) => integer;
constructor(formFunc: ((p: Pokemon) => integer)) {
super(true);
this.formFunc = formFunc;
}
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const formIndex = this.formFunc(pokemon);
if (formIndex !== pokemon.formIndex) {
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
return true;
}
return false;
}
}
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (pokemon.isFullHp() && if (pokemon.isFullHp() &&
@ -330,21 +311,6 @@ export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultip
} }
} }
export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
constructor(condition: PokemonDefendCondition) {
super(condition, 1);
}
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.condition(pokemon, attacker, move)) {
(args[0] as Utils.NumberHolder).value = Math.floor(pokemon.getMaxHp() / 8);
return true;
}
return false;
}
}
/** /**
* Determines whether a Pokemon is immune to a move because of an ability. * Determines whether a Pokemon is immune to a move because of an ability.
* @extends PreDefendAbAttr * @extends PreDefendAbAttr
@ -377,12 +343,10 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr {
if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) {
return false; return false;
} }
if (attacker !== pokemon && move.type === this.immuneType) { if (attacker !== pokemon && move.type === this.immuneType) {
(args[0] as Utils.NumberHolder).value = 0; (args[0] as Utils.NumberHolder).value = 0;
return true; return true;
} }
return false; return false;
} }
@ -391,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 { export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr {
constructor(immuneType: Type) { constructor(immuneType: Type) {
super(immuneType); super(immuneType);
@ -539,45 +521,6 @@ export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr {
} }
} }
export class PostDefendDisguiseAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
if (pokemon.formIndex === 0 && pokemon.battleData.hitCount !== 0 && (move.category === MoveCategory.SPECIAL || move.category === MoveCategory.PHYSICAL)) {
const recoilDamage = Math.ceil((pokemon.getMaxHp() / 8) - attacker.turnData.damageDealt);
if (!recoilDamage) {
return false;
}
pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER);
pokemon.turnData.damageTaken += recoilDamage;
pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendDisguise", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
return true;
}
return false;
}
}
export class PostDefendFormChangeAbAttr extends PostDefendAbAttr {
private formFunc: (p: Pokemon) => integer;
constructor(formFunc: ((p: Pokemon) => integer)) {
super(true);
this.formFunc = formFunc;
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
const formIndex = this.formFunc(pokemon);
if (formIndex !== pokemon.formIndex) {
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
return true;
}
return false;
}
}
export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr {
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const attackPriority = new Utils.IntegerHolder(move.priority); const attackPriority = new Utils.IntegerHolder(move.priority);
@ -4045,34 +3988,44 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt
} }
/** /**
* Takes no damage from the first hit of a physical move. * Takes no damage from the first hit of a damaging move.
* This is used in Ice Face ability. * This is used in the Disguise and Ice Face abilities.
* @extends ReceivedMoveDamageMultiplierAbAttr
*/ */
export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAttr { export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
private multiplier: number; private multiplier: number;
private tagType: BattlerTagType;
private recoilDamageFunc: ((pokemon: Pokemon) => number) | undefined;
private triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string;
constructor(condition: PokemonDefendCondition, multiplier: number) { constructor(condition: PokemonDefendCondition, multiplier: number, tagType: BattlerTagType, triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string, recoilDamageFunc?: (pokemon: Pokemon) => number) {
super(condition, multiplier); super(condition, multiplier);
this.multiplier = multiplier; this.multiplier = multiplier;
this.tagType = tagType;
this.recoilDamageFunc = recoilDamageFunc;
this.triggerMessageFunc = triggerMessageFunc;
} }
/** /**
* Applies the Ice Face pre-defense ability to the Pokémon. * Applies the pre-defense ability to the Pokémon.
* Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form. * Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form.
* *
* @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {Pokemon} pokemon The Pokémon with the ability.
* @param {boolean} passive - Whether the ability is passive. * @param {boolean} passive n/a
* @param {Pokemon} attacker - The attacking Pokémon. * @param {Pokemon} attacker The attacking Pokémon.
* @param {PokemonMove} move - The move being used. * @param {PokemonMove} move The move being used.
* @param {Utils.BooleanHolder} cancelled - A holder for whether the move was cancelled. * @param {Utils.BooleanHolder} cancelled n/a
* @param {any[]} args - Additional arguments. * @param {any[]} args Additional arguments.
* @returns {boolean} - Whether the immunity was applied. * @returns {boolean} Whether the immunity was applied.
*/ */
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.condition(pokemon, attacker, move)) { if (this.condition(pokemon, attacker, move)) {
(args[0] as Utils.NumberHolder).value = this.multiplier; (args[0] as Utils.NumberHolder).value = this.multiplier;
pokemon.removeTag(BattlerTagType.ICE_FACE); pokemon.removeTag(this.tagType);
if (this.recoilDamageFunc) {
pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER);
}
return true; return true;
} }
@ -4080,14 +4033,14 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt
} }
/** /**
* Gets the message triggered when the Pokémon avoids damage using the Ice Face ability. * Gets the message triggered when the Pokémon avoids damage using the form-changing ability.
* @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {Pokemon} pokemon The Pokémon with the ability.
* @param {string} abilityName - The name of the ability. * @param {string} abilityName The name of the ability.
* @param {...any} args - Additional arguments. * @param {...any} args n/a
* @returns {string} - The trigger message. * @returns {string} The trigger message.
*/ */
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }); return this.triggerMessageFunc(pokemon, abilityName);
} }
} }
@ -4438,7 +4391,7 @@ export function initAbilities() {
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.LEVITATE, 3) 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(), .ignorable(),
new Ability(Abilities.EFFECT_SPORE, 3) new Ability(Abilities.EFFECT_SPORE, 3)
.attr(EffectSporeAbAttr), .attr(EffectSporeAbAttr),
@ -5004,20 +4957,18 @@ export function initAbilities() {
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.DISGUISE, 7) new Ability(Abilities.DISGUISE, 7)
.attr(PreDefendMoveDamageToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0)
.attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PreDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1)
.attr(PostDefendDisguiseAbAttr)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr) .attr(NoTransformAbilityAbAttr)
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.bypassFaint() // Add BattlerTagType.DISGUISE if the pokemon is in its disguised form
.ignorable() .conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false)
.partial(), .attr(FormBlockDamageAbAttr, (target, user, move) => !!target.getTag(BattlerTagType.DISGUISE) && target.getAttackTypeEffectiveness(move.type, user) > 0, 0, BattlerTagType.DISGUISE,
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
(pokemon) => Math.floor(pokemon.getMaxHp() / 8))
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.ignorable(),
new Ability(Abilities.BATTLE_BOND, 7) new Ability(Abilities.BATTLE_BOND, 7)
.attr(PostVictoryFormChangeAbAttr, () => 2) .attr(PostVictoryFormChangeAbAttr, () => 2)
.attr(PostBattleInitFormChangeAbAttr, () => 1) .attr(PostBattleInitFormChangeAbAttr, () => 1)
@ -5166,7 +5117,9 @@ export function initAbilities() {
.conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0) .conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0)
// When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE // When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW) .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW)
.attr(IceFaceBlockPhysicalAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0) .attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.ignorable(), .ignorable(),
new Ability(Abilities.POWER_SPOT, 8) new Ability(Abilities.POWER_SPOT, 8)
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3), .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3),

View File

@ -1558,36 +1558,25 @@ export class GroundedTag extends BattlerTag {
} }
} }
/** /** Common attributes of form change abilities that block damage */
* Provides the Ice Face ability's effects. export class FormBlockDamageTag extends BattlerTag {
*/ constructor(tagType: BattlerTagType) {
export class IceFaceTag extends BattlerTag { super(tagType, BattlerTagLapseType.CUSTOM, 1);
constructor(sourceMove: Moves) {
super(BattlerTagType.ICE_FACE, BattlerTagLapseType.CUSTOM, 1, sourceMove);
} }
/** /**
* Determines if the Ice Face tag can be added to the Pokémon. * Determines if the tag can be added to the Pokémon.
* @param {Pokemon} pokemon - The Pokémon to which the tag might be added. * @param {Pokemon} pokemon The Pokémon to which the tag might be added.
* @returns {boolean} - True if the tag can be added, false otherwise. * @returns {boolean} True if the tag can be added, false otherwise.
*/ */
canAdd(pokemon: Pokemon): boolean { canAdd(pokemon: Pokemon): boolean {
const weatherType = pokemon.scene.arena.weather?.weatherType; return pokemon.formIndex === 0;
const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW;
const isFormIceFace = pokemon.formIndex === 0;
// Hard code Eiscue for now, this is to prevent the game from crashing if fused pokemon has Ice Face
if ((pokemon.species.speciesId === Species.EISCUE && isFormIceFace) || isWeatherSnowOrHail) {
return true;
}
return false;
} }
/** /**
* Applies the Ice Face tag to the Pokémon. * Applies the tag to the Pokémon.
* Triggers a form change to Ice Face if the Pokémon is not in its Ice Face form. * Triggers a form change if the Pokémon is not in its defense form.
* @param {Pokemon} pokemon - The Pokémon to which the tag is added. * @param {Pokemon} pokemon The Pokémon to which the tag is added.
*/ */
onAdd(pokemon: Pokemon): void { onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon); super.onAdd(pokemon);
@ -1598,9 +1587,9 @@ export class IceFaceTag extends BattlerTag {
} }
/** /**
* Removes the Ice Face tag from the Pokémon. * Removes the tag from the Pokémon.
* Triggers a form change to Noice when the tag is removed. * Triggers a form change when the tag is removed.
* @param {Pokemon} pokemon - The Pokémon from which the tag is removed. * @param {Pokemon} pokemon The Pokémon from which the tag is removed.
*/ */
onRemove(pokemon: Pokemon): void { onRemove(pokemon: Pokemon): void {
super.onRemove(pokemon); super.onRemove(pokemon);
@ -1609,6 +1598,24 @@ export class IceFaceTag extends BattlerTag {
} }
} }
/** Provides the additional weather-based effects of the Ice Face ability */
export class IceFaceBlockDamageTag extends FormBlockDamageTag {
constructor(tagType: BattlerTagType) {
super(tagType);
}
/**
* Determines if the tag can be added to the Pokémon.
* @param {Pokemon} pokemon The Pokémon to which the tag might be added.
* @returns {boolean} True if the tag can be added, false otherwise.
*/
canAdd(pokemon: Pokemon): boolean {
const weatherType = pokemon.scene.arena.weather?.weatherType;
const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW;
return super.canAdd(pokemon) || isWeatherSnowOrHail;
}
}
/** /**
* Battler tag enabling the Stockpile mechanic. This tag handles: * Battler tag enabling the Stockpile mechanic. This tag handles:
@ -1890,7 +1897,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
case BattlerTagType.DESTINY_BOND: case BattlerTagType.DESTINY_BOND:
return new DestinyBondTag(sourceMove, sourceId); return new DestinyBondTag(sourceMove, sourceId);
case BattlerTagType.ICE_FACE: case BattlerTagType.ICE_FACE:
return new IceFaceTag(sourceMove); return new IceFaceBlockDamageTag(tagType);
case BattlerTagType.DISGUISE:
return new FormBlockDamageTag(tagType);
case BattlerTagType.STOCKPILING: case BattlerTagType.STOCKPILING:
return new StockpilingTag(sourceMove); return new StockpilingTag(sourceMove);
case BattlerTagType.OCTOLOCK: case BattlerTagType.OCTOLOCK:

View File

@ -15,9 +15,10 @@ export const EGG_SEED = 1073741824;
// Rates for specific random properties in 1/x // Rates for specific random properties in 1/x
const DEFAULT_SHINY_RATE = 128; const DEFAULT_SHINY_RATE = 128;
const GACHA_SHINY_UP_SHINY_RATE = 64; const GACHA_SHINY_UP_SHINY_RATE = 64;
const SAME_SPECIES_EGG_SHINY_RATE = 32; const SAME_SPECIES_EGG_SHINY_RATE = 24;
const SAME_SPECIES_EGG_HA_RATE = 16; const SAME_SPECIES_EGG_HA_RATE = 8;
const MANAPHY_EGG_MANAPHY_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 // 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; 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); 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 // Sets the hidden ability if a hidden ability exists and
// or if the same species egg hits the chance // the override is set or the egg hits the chance
let abilityIndex: number | undefined = undefined; let abilityIndex: number | undefined = undefined;
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
|| (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; abilityIndex = 2;
} }
@ -396,8 +398,7 @@ export class Egg {
* 2 cost mons get 1.5x * 2 cost mons get 1.5x
* 4, 6, 8 cost mons get 1.75x * 4, 6, 8 cost mons get 1.75x
* 3, 5, 7, 9 cost mons get 1x * 3, 5, 7, 9 cost mons get 1x
* Alolan, Galarian, and Paldean mons get 0.5x * Alolan, Galarian, Hisui, and Paldean mons get 0.5x
* Hisui mons get 0.125x
* *
* The total weight is also being calculated EACH time there is an egg hatch instead of being generated once * 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 * 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); let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100);
const species = getPokemonSpecies(speciesId); const species = getPokemonSpecies(speciesId);
if (species.isRegional()) { if (species.isRegional()) {
weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); weight = Math.floor(weight / 2);
} }
speciesWeights.push(totalWeight + weight); speciesWeights.push(totalWeight + weight);
totalWeight += weight; totalWeight += weight;

View File

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

View File

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

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "turnEndHpRestore": "{{pokemonName}}'s HP was restored.",
"hpIsFull": "{{pokemonName}}'s\nHP is full!", "hpIsFull": "{{pokemonName}}'s\nHP is full!",
"skipItemQuestion": "Are you sure you want to skip taking an item?", "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?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}", "wildPokemonWithAffix": "Wild {{pokemonName}}",

View File

@ -29,9 +29,9 @@ export const filterBar: SimpleTranslationEntries = {
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg", "egg": "Egg",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - No",
"sortByNumber": "No.", "sortByNumber": "No.",
"sortByCost": "Cost", "sortByCost": "Cost",
"sortByCandies": "Candy Count", "sortByCandies": "Candy Count",

View File

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

View File

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

View File

@ -57,6 +57,7 @@ export const battle: SimpleTranslationEntries = {
"escapeVerbSwitch": "auswechseln", "escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht", "escapeVerbFlee": "flucht",
"skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", "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!", "notDisabled": "{{moveName}} von {{pokemonName}} ist nicht mehr deaktiviert!",
"turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.",
"hpIsFull": "Die KP von {{pokemonName}} sind voll!", "hpIsFull": "Die KP von {{pokemonName}} sind voll!",

View File

@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passive", "passive": "Passive",
"passiveUnlocked": "Passive freigeschaltet", "passiveUnlocked": "Passive freigeschaltet",
"passiveLocked": "Passive gesperrt", "passiveLocked": "Passive gesperrt",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "Passive - Freischalten möglich",
"costReduction": "Cost Reduction", "costReduction": "Kostenreduzierung",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Kosten bereits reduziert",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Kosten noch nicht reduziert",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "Kosten können reduziert werden",
"favorite": "Favorite", "favorite": "Favorit",
"isFavorite": "Favorite - Yes", "isFavorite": "Favorit - Ja",
"notFavorite": "Favorite - No", "notFavorite": "Favorit - Nein",
"ribbon": "Band", "ribbon": "Band",
"hasWon": "Hat Klassik-Modus gewonnen", "hasWon": "Hat Klassik-Modus gewonnen",
"hasNotWon": "Hat Klassik-Modus nicht gewonnen", "hasNotWon": "Hat Klassik-Modus nicht gewonnen",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Versteckte Fähigkeit",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Versteckte Fähigkeit - Ja",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Versteckte Fähigkeit - Nein",
"egg": "Egg", "egg": "Ei",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Kauf möglich",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Ja",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - Nein",
"sortByNumber": "Pokédex-Nummer", "sortByNumber": "Pokédex-Nummer",
"sortByCost": "Kosten", "sortByCost": "Kosten",
"sortByCandies": "Anzahl Bonbons", "sortByCandies": "Anzahl Bonbons",

View File

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

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "turnEndHpRestore": "{{pokemonName}}'s HP was restored.",
"hpIsFull": "{{pokemonName}}'s\nHP is full!", "hpIsFull": "{{pokemonName}}'s\nHP is full!",
"skipItemQuestion": "Are you sure you want to skip taking an item?", "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?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}", "wildPokemonWithAffix": "Wild {{pokemonName}}",

View File

@ -29,9 +29,9 @@ export const filterBar: SimpleTranslationEntries = {
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Hidden Ability - No",
"egg": "Egg", "egg": "Egg",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Purchasable Egg",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Yes",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - No",
"sortByNumber": "No.", "sortByNumber": "No.",
"sortByCost": "Cost", "sortByCost": "Cost",
"sortByCandies": "Candy Count", "sortByCandies": "Candy Count",

View File

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

View File

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

View File

@ -57,9 +57,10 @@ export const battle: SimpleTranslationEntries = {
"escapeVerbSwitch": "cambiar", "escapeVerbSwitch": "cambiar",
"escapeVerbFlee": "huir", "escapeVerbFlee": "huir",
"notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!",
"turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "turnEndHpRestore": "Los PS de {{pokemonName}} fueron restaurados.",
"hpIsFull": "{{pokemonName}}'s\nHP is full!", "hpIsFull": "¡Los PS de {{pokemonName}}\nestán al máximo!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "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?", "eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?",
"wildPokemonWithAffix": "El {{pokemonName}} salvaje", "wildPokemonWithAffix": "El {{pokemonName}} salvaje",

View File

@ -3,35 +3,35 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const filterBar: SimpleTranslationEntries = { export const filterBar: SimpleTranslationEntries = {
"genFilter": "Gen.", "genFilter": "Gen.",
"typeFilter": "Tipo", "typeFilter": "Tipo",
"caughtFilter": "Caught", "caughtFilter": "Capturado",
"unlocksFilter": "Otros", "unlocksFilter": "Otros",
"miscFilter": "Misc", "miscFilter": "Misc.",
"sortFilter": "Orden", "sortFilter": "Orden",
"all": "Todo", "all": "Todo",
"normal": "Normal", "normal": "Normal",
"uncaught": "No Capt.", "uncaught": "No Capt.",
"passive": "Passive", "passive": "Pasiva",
"passiveUnlocked": "Pasiva Desbloq.", "passiveUnlocked": "Pasiva desbloq.",
"passiveLocked": "Pasiva Bloq.", "passiveLocked": "Pasiva bloq.",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "Pasiva - puede desbloq.",
"costReduction": "Cost Reduction", "costReduction": "Reducción de coste",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Reducción de coste desbloq.",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Reducción de coste bloq.",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "Red. de coste - puede desbloq.",
"favorite": "Favorite", "favorite": "Favoritos",
"isFavorite": "Favorite - Yes", "isFavorite": "Favoritos - Sí",
"notFavorite": "Favorite - No", "notFavorite": "Favoritos - No",
"ribbon": "Ribbon", "ribbon": "Cinta",
"hasWon": "Ya ha ganado", "hasWon": "Cinta - Sí",
"hasNotWon": "Aún no ha ganado", "hasNotWon": "Cinta - No",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Habilidad oculta",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Habilidad oculta - Sí",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Habilidad oculta - No",
"egg": "Egg", "egg": "Huevo",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Huevo - puede comprar",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Sí",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - No",
"sortByNumber": "Núm.", "sortByNumber": "Núm.",
"sortByCost": "Coste", "sortByCost": "Coste",
"sortByCandies": "# Caramelos", "sortByCandies": "# Caramelos",

View File

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

View File

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

View File

@ -10,7 +10,7 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"MoneyAchv": { "MoneyAchv": {
description: "Récolter un total de {{moneyAmount}} ₽", description: "Récolter un total de {{moneyAmount}} ₽.",
}, },
"10K_MONEY": { "10K_MONEY": {
name: "Épargnant", name: "Épargnant",
@ -26,7 +26,7 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"DamageAchv": { "DamageAchv": {
description: "Infliger {{damageAmount}} de dégâts en un coup", description: "Infliger {{damageAmount}} de dégâts en un coup.",
}, },
"250_DMG": { "250_DMG": {
name: "Caïd", name: "Caïd",
@ -42,7 +42,7 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"HealAchv": { "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": { "250_HEAL": {
name: "Infirmier", name: "Infirmier",
@ -58,7 +58,7 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"LevelAchv": { "LevelAchv": {
description: "Monter un Pokémon au N.{{level}}", description: "Monter un Pokémon au N.{{level}}.",
}, },
"LV_100": { "LV_100": {
name: "Et cest pas fini !", name: "Et cest pas fini !",
@ -71,7 +71,7 @@ export const PGMachv: AchievementTranslationEntries = {
}, },
"RibbonAchv": { "RibbonAchv": {
description: "Accumuler un total de {{ribbonAmount}} Rubans", description: "Accumuler un total de {{ribbonAmount}} Rubans.",
}, },
"10_RIBBONS": { "10_RIBBONS": {
name: "Maitre de la Ligue", name: "Maitre de la Ligue",
@ -91,83 +91,83 @@ export const PGMachv: AchievementTranslationEntries = {
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_BATTLE_STAT": {
name: "Travail déquipe", 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": { "MAX_FRIENDSHIP": {
name: "Copinage", 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": { "MEGA_EVOLVE": {
name: "Mégamorph", name: "Mégamorph",
description: "Méga-évoluer un Pokémon", description: "Méga-évoluer un Pokémon.",
}, },
"GIGANTAMAX": { "GIGANTAMAX": {
name: "Kaijū", name: "Kaijū",
description: "Gigamaxer un Pokémon", description: "Gigamaxer un Pokémon.",
}, },
"TERASTALLIZE": { "TERASTALLIZE": {
name: "Jaime les STAB", name: "Jaime les STAB",
description: "Téracristalliser un Pokémon", description: "Téracristalliser un Pokémon.",
}, },
"STELLAR_TERASTALLIZE": { "STELLAR_TERASTALLIZE": {
name: "Le type enfoui", name: "Le type enfoui",
description: "Téracristalliser un Pokémon en type Stellaire", description: "Téracristalliser un Pokémon en type Stellaire.",
}, },
"SPLICE": { "SPLICE": {
name: "Infinite Fusion", name: "Infinite Fusion",
description: "Fusionner deux Pokémon avec le Pointeau ADN", description: "Fusionner deux Pokémon avec le Pointeau ADN.",
}, },
"MINI_BLACK_HOLE": { "MINI_BLACK_HOLE": {
name: "Item-stellar", name: "Item-stellar",
description: "Obtenir un Mini Trou Noir", description: "Obtenir un Mini Trou Noir.",
}, },
"CATCH_MYTHICAL": { "CATCH_MYTHICAL": {
name: "Fabuleux", name: "Fabuleux",
description: "Capturer un Pokémon fabuleux", description: "Capturer un Pokémon fabuleux.",
}, },
"CATCH_SUB_LEGENDARY": { "CATCH_SUB_LEGENDARY": {
name: "(Semi-)Légendaire", name: "(Semi-)Légendaire",
description: "Capturer un Pokémon semi-légendaire", description: "Capturer un Pokémon semi-légendaire.",
}, },
"CATCH_LEGENDARY": { "CATCH_LEGENDARY": {
name: "Légendaire", name: "Légendaire",
description: "Capturer un Pokémon légendaire", description: "Capturer un Pokémon légendaire.",
}, },
"SEE_SHINY": { "SEE_SHINY": {
name: "Chromatique", name: "Chromatique",
description: "Trouver un Pokémon sauvage chromatique", description: "Trouver un Pokémon sauvage chromatique.",
}, },
"SHINY_PARTY": { "SHINY_PARTY": {
name: "Shasseur", 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": { "HATCH_MYTHICAL": {
name: "Œuf fabuleux", name: "Œuf fabuleux",
description: "Obtenir un Pokémon fabuleux dans un Œuf", description: "Obtenir un Pokémon fabuleux dans un Œuf.",
}, },
"HATCH_SUB_LEGENDARY": { "HATCH_SUB_LEGENDARY": {
name: "Œuf semi-légendaire", 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": { "HATCH_LEGENDARY": {
name: "Œuf légendaire", 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": { "HATCH_SHINY": {
name: "Œuf chromatique", name: "Œuf chromatique",
description: "Obtenir un Pokémon chromatique dans un Œuf", description: "Obtenir un Pokémon chromatique dans un Œuf.",
}, },
"HIDDEN_ABILITY": { "HIDDEN_ABILITY": {
name: "Potentiel enfoui", 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": { "PERFECT_IVS": {
name: "Certificat dauthenticité", name: "Certificat dauthenticité",
description: "Avoir des IV parfaits sur un Pokémon", description: "Avoir des IV parfaits sur un Pokémon.",
}, },
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
name: "Invaincu", name: "Invaincu",
description: "Terminer le jeu en mode classique", description: "Terminer le jeu en mode Classique.",
}, },
"UNEVOLVED_CLASSIC_VICTORY": { "UNEVOLVED_CLASSIC_VICTORY": {
name: "Le stagiaire de 3e", name: "Le stagiaire de 3e",
@ -176,39 +176,39 @@ export const PGMachv: AchievementTranslationEntries = {
"MONO_GEN_ONE": { "MONO_GEN_ONE": {
name: "Le rival originel", 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": { "MONO_GEN_TWO": {
name: "Entre tradition et modernité", 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": { "MONO_GEN_THREE": {
name: "Too much water ?", 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": { "MONO_GEN_FOUR": {
name: "Réellement la plus difficile ?", 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": { "MONO_GEN_FIVE": {
name: "Recast complet", 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": { "MONO_GEN_SIX": {
name: "Aristocrate", 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": { "MONO_GEN_SEVEN": {
name: "Seulement techniquement", 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": { "MONO_GEN_EIGHT": {
name: "Lheure de gloire", name: "Lheure 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": { "MONO_GEN_NINE": {
name: "Ça va, cétait EZ", 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": { "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) // 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 = { export const PGFachv: AchievementTranslationEntries = {
"Achievements": { "Achievements": {
name: "Succès", name: PGMachv.Achievements.name,
}, },
"Locked": { "Locked": {
name: "Verrouillé", name: PGMachv.Locked.name,
}, },
"MoneyAchv": { "MoneyAchv": PGMachv.MoneyAchv,
description: "Récolter un total de {{moneyAmount}} ₽",
},
"10K_MONEY": { "10K_MONEY": {
name: "Épargnante", name: "Épargnante",
}, },
"100K_MONEY": { "100K_MONEY": PGMachv["100K_MONEY"],
name: "Je possède des thunes",
},
"1M_MONEY": { "1M_MONEY": {
name: "Banquière", name: "Banquière",
}, },
@ -299,12 +295,8 @@ export const PGFachv: AchievementTranslationEntries = {
name: "Évadée fiscale", name: "Évadée fiscale",
}, },
"DamageAchv": { "DamageAchv": PGMachv.DamageAchv,
description: "Infliger {{damageAmount}} de dégâts en un coup", "250_DMG": PGMachv["250_DMG"],
},
"250_DMG": {
name: "Caïd",
},
"1000_DMG": { "1000_DMG": {
name: "Boxeuse", name: "Boxeuse",
}, },
@ -315,38 +307,20 @@ export const PGFachv: AchievementTranslationEntries = {
name: "One Punch Woman", name: "One Punch Woman",
}, },
"HealAchv": { "HealAchv": PGMachv.HealAchv,
description: "Soigner {{healAmount}} {{HP}} en une fois avec une capacité, un talent ou un objet tenu",
},
"250_HEAL": { "250_HEAL": {
name: "Infirmière", name: "Infirmière",
}, },
"1000_HEAL": { "1000_HEAL": PGMachv["1000_HEAL"],
name: "Médecin", "2500_HEAL": PGMachv["2500_HEAL"],
}, "10000_HEAL": PGMachv["10000_HEAL"],
"2500_HEAL": {
name: "Clerc",
},
"10000_HEAL": {
name: "Centre Pokémon",
},
"LevelAchv": { "LevelAchv": PGMachv.LevelAchv,
description: "Monter un Pokémon au N.{{level}}", "LV_100": PGMachv["LV_100"],
}, "LV_250": PGMachv["LV_250"],
"LV_100": { "LV_1000": PGMachv["LV_1000"],
name: "Et cest pas fini !",
},
"LV_250": {
name: "Élite",
},
"LV_1000": {
name: "Vers linfini et au-delà",
},
"RibbonAchv": { "RibbonAchv": PGMachv.RibbonAchv,
description: "Accumuler un total de {{ribbonAmount}} Rubans",
},
"10_RIBBONS": { "10_RIBBONS": {
name: "Maitresse de la Ligue", name: "Maitresse de la Ligue",
}, },
@ -363,187 +337,61 @@ export const PGFachv: AchievementTranslationEntries = {
name: "Master Maitresse de la Ligue", name: "Master Maitresse de la Ligue",
}, },
"TRANSFER_MAX_BATTLE_STAT": { "TRANSFER_MAX_BATTLE_STAT": PGMachv.TRANSFER_MAX_BATTLE_STAT,
name: "Travail déquipe", "MAX_FRIENDSHIP": PGMachv.MAX_FRIENDSHIP,
description: "Utiliser Relais avec au moins une statistique montée à fond", "MEGA_EVOLVE": PGMachv.MEGA_EVOLVE,
}, "GIGANTAMAX": PGMachv.GIGANTAMAX,
"MAX_FRIENDSHIP": { "TERASTALLIZE": PGMachv.TERASTALLIZE,
name: "Copinage", "STELLAR_TERASTALLIZE": PGMachv.STELLAR_TERASTALLIZE,
description: "Atteindre le niveau de bonheur maximal avec un Pokémon", "SPLICE": PGMachv.SPLICE,
}, "MINI_BLACK_HOLE": PGMachv.MINI_BLACK_HOLE,
"MEGA_EVOLVE": { "CATCH_MYTHICAL": PGMachv.CATCH_MYTHICAL,
name: "Mégamorph", "CATCH_SUB_LEGENDARY": PGMachv.CATCH_SUB_LEGENDARY,
description: "Méga-évoluer un Pokémon", "CATCH_LEGENDARY": PGMachv.CATCH_LEGENDARY,
}, "SEE_SHINY": PGMachv.SEE_SHINY,
"GIGANTAMAX": {
name: "Kaijū",
description: "Gigamaxer un Pokémon",
},
"TERASTALLIZE": {
name: "Jaime 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",
},
"SHINY_PARTY": { "SHINY_PARTY": {
name: "Shasseuse", name: "Shasseuse",
description: "Avoir une équipe exclusivement composée de Pokémon chromatiques", description: "Avoir une équipe exclusivement composée de Pokémon chromatiques",
}, },
"HATCH_MYTHICAL": { "HATCH_MYTHICAL": PGMachv.HATCH_MYTHICAL,
name: "Œuf fabuleux", "HATCH_SUB_LEGENDARY": PGMachv.HATCH_SUB_LEGENDARY,
description: "Obtenir un Pokémon fabuleux dans un Œuf", "HATCH_LEGENDARY": PGMachv.HATCH_LEGENDARY,
}, "HATCH_SHINY": PGMachv.HATCH_SHINY,
"HATCH_SUB_LEGENDARY": { "HIDDEN_ABILITY": PGMachv.HIDDEN_ABILITY,
name: "Œuf semi-légendaire", "PERFECT_IVS": PGMachv.PERFECT_IVS,
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 dauthenticité",
description: "Avoir des IV parfaits sur un Pokémon",
},
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
name: "Invaincue", name: "Invaincue",
description: "Terminer le jeu en mode classique", description: "Terminer le jeu en mode classique",
}, },
"UNEVOLVED_CLASSIC_VICTORY": { "UNEVOLVED_CLASSIC_VICTORY": PGMachv.UNEVOLVED_CLASSIC_VICTORY,
name: "Le stagiaire de 3e", "MONO_GEN_ONE": PGMachv.MONO_GEN_ONE,
description: "Terminer le mode Classique avec au moins un Pokémon non-évolué dans léquipe." "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": { "MonoType": PGMachv.MonoType,
name: "Le rival originel", "MONO_NORMAL": PGMachv.MONO_NORMAL,
description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", "MONO_FIGHTING": PGMachv.MONO_FIGHTING,
}, "MONO_FLYING": PGMachv.MONO_FLYING,
"MONO_GEN_TWO": { "MONO_POISON": PGMachv.MONO_POISON,
name: "Entre tradition et modernité", "MONO_GROUND": PGMachv.MONO_GROUND,
description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", "MONO_ROCK": PGMachv.MONO_ROCK,
}, "MONO_BUG": PGMachv.MONO_BUG,
"MONO_GEN_THREE": { "MONO_GHOST": PGMachv.MONO_GHOST,
name: "Too much water ?", "MONO_STEEL": PGMachv.MONO_STEEL,
description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", "MONO_FIRE": PGMachv.MONO_FIRE,
}, "MONO_WATER": PGMachv.MONO_WATER,
"MONO_GEN_FOUR": { "MONO_GRASS": PGMachv.MONO_GRASS,
name: "Réellement la plus difficile ?", "MONO_ELECTRIC": PGMachv.MONO_ELECTRIC,
description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", "MONO_PSYCHIC": PGMachv.MONO_PSYCHIC,
}, "MONO_ICE": PGMachv.MONO_ICE,
"MONO_GEN_FIVE": { "MONO_DRAGON": PGMachv.MONO_DRAGON,
name: "Recast complet", "MONO_DARK": PGMachv.MONO_DARK,
description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", "MONO_FAIRY": PGMachv.MONO_FAIRY,
}, "FRESH_START": PGMachv.FRESH_START
"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: "Lheure 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 tempoisonne !",
},
"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 »."
}
} as const; } as const;

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}} récupère des PV !", "turnEndHpRestore": "{{pokemonName}} récupère des PV !",
"hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.",
"eggHatching": "Hein ?", "eggHatching": "Hein ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV\nsur {{pokemonName}} ?", "ivScannerUseQuestion": "Utiliser le Scanner dIV\nsur {{pokemonName}} ?",
"wildPokemonWithAffix": "{{pokemonName}} sauvage", "wildPokemonWithAffix": "{{pokemonName}} sauvage",

View File

@ -69,5 +69,5 @@ export const battlerTags: SimpleTranslationEntries = {
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", "saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", "cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", "cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !",
} as const; } as const;

View File

@ -23,7 +23,7 @@ export const bgmName: SimpleTranslationEntries = {
"battle_galar_elite": "ÉB - Vs. Tournoi des Champions", "battle_galar_elite": "ÉB - Vs. Tournoi des Champions",
"battle_paldea_elite": "ÉV - Vs. Conseil 4", "battle_paldea_elite": "ÉV - Vs. Conseil 4",
"battle_bb_elite": "ÉV - Vs. Conseil 4 de lInstitut Myrtille", "battle_bb_elite": "ÉV - Vs. Conseil 4 de lInstitut Myrtille",
"battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", "battle_final_encounter": "PDM ÉdS DX - Vs. Rayquaza",
"battle_final": "NB - Vs. Ghetis", "battle_final": "NB - Vs. Ghetis",
"battle_kanto_gym": "N2B2 - Vs. Champion·ne dArène de Kanto", "battle_kanto_gym": "N2B2 - Vs. Champion·ne dArène de Kanto",
"battle_johto_gym": "N2B2 - Vs. Champion·ne dArène de Johto", "battle_johto_gym": "N2B2 - Vs. Champion·ne dArène de Johto",
@ -74,14 +74,14 @@ export const bgmName: SimpleTranslationEntries = {
"battle_trainer": "NB - Vs. Dresseur·euse", "battle_trainer": "NB - Vs. Dresseur·euse",
"battle_wild": "NB - Vs. Pokémon sauvage", "battle_wild": "NB - Vs. Pokémon sauvage",
"battle_wild_strong": "NB - Vs. Pokémon puissant 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_rocket_grunt": "HGSS Vs. Team Rocket",
"battle_aqua_magma_grunt": "ROSA Vs. Team Aqua/Magma", "battle_aqua_magma_grunt": "ROSA Vs. Team Aqua/Magma",
"battle_galactic_grunt": "DÉPS Vs. Team Galaxie", "battle_galactic_grunt": "DÉPS Vs. Team Galaxie",
"battle_plasma_grunt": "NB - Vs. Team Plasma", "battle_plasma_grunt": "NB - Vs. Team Plasma",
"battle_flare_grunt": "XY - Vs. Team Flare", "battle_flare_grunt": "XY - Vs. Team Flare",
"battle_rocket_boss": "USUL - Vs. Giovanni", "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_galactic_boss": "DÉPS - Vs. Hélio",
"battle_plasma_boss": "N2B2 - Vs. Ghetis", "battle_plasma_boss": "N2B2 - Vs. Ghetis",
"battle_flare_boss": "XY - Vs. Lysandre", "battle_flare_boss": "XY - Vs. Lysandre",

View File

@ -4,7 +4,7 @@ export const challenges: TranslationEntries = {
"title": "Paramètres du Challenge", "title": "Paramètres du Challenge",
"illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !", "illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !",
"singleGeneration": { "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": "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.", "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.",
"gen_1": "1re", "gen_1": "1re",
@ -18,7 +18,7 @@ export const challenges: TranslationEntries = {
"gen_9": "9e", "gen_9": "9e",
}, },
"singleType": { "singleType": {
"name": "Mono-type", "name": "Monotype",
"desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", "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é." "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné."
//type in pokemon-info //type in pokemon-info

View File

@ -4,7 +4,7 @@ export const filterBar: SimpleTranslationEntries = {
"genFilter": "Gen", "genFilter": "Gen",
"typeFilter": "Type", "typeFilter": "Type",
"caughtFilter": "Capturés", "caughtFilter": "Capturés",
"unlocksFilter": "Débloq.", "unlocksFilter": "Amélio.",
"miscFilter": "Divers", "miscFilter": "Divers",
"sortFilter": "Tri", "sortFilter": "Tri",
"all": "Tous", "all": "Tous",
@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passif", "passive": "Passif",
"passiveUnlocked": "Passif débloqué", "passiveUnlocked": "Passif débloqué",
"passiveLocked": "Passif verrouillé", "passiveLocked": "Passif verrouillé",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "Passif déblocable",
"costReduction": "Cost Reduction", "costReduction": "Cout réduit",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Cout réduit débloqué",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Cout réduit verrouillé",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "Cout réduit déblocable",
"favorite": "Favorite", "favorite": "Favoris",
"isFavorite": "Favorite - Yes", "isFavorite": "Favoris uniquement",
"notFavorite": "Favorite - No", "notFavorite": "Sans Favoris",
"ribbon": "Ruban", "ribbon": "Ruban",
"hasWon": "Ruban - Oui", "hasWon": "Ruban - Avec",
"hasNotWon": "Ruban - Non", "hasNotWon": "Ruban - Sans",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Talent caché",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Talent caché - Avec",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Talent caché - Sans",
"egg": "Egg", "egg": "Œuf",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Œuf achetable",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Avec",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - Sans",
"sortByNumber": "Par N°", "sortByNumber": "Par N°",
"sortByCost": "Par cout", "sortByCost": "Par cout",
"sortByCandies": "Par bonbons", "sortByCandies": "Par bonbons",

View File

@ -42,17 +42,17 @@ export const modifierType: ModifierTypeTranslationEntries = {
} }
}, },
"PokemonPpUpModifierType": { "PokemonPpUpModifierType": {
description: "Augmente le max de PP de {{upPoints}} à une capacité dun Pokémon pour chaque 5 PP max (max : 3).", description: "Augmente le max de PP de {{upPoints}} à une capacité dun Pokémon pour chaque 5 PP max (max : 3).",
}, },
"PokemonNatureChangeModifierType": { "PokemonNatureChangeModifierType": {
name: "Aromate {{natureName}}", 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": { "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": { "TempBattleStatBoosterModifierType": {
description: "Augmente dun cran {{tempBattleStatName}} pour toute léquipe pendant 5 combats.", description: "Augmente dun cran {{tempBattleStatName}} pour toute léquipe pendant 5 combats.",
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
description: "Augmente de 20% la puissance des capacités de type {{moveType}} dun Pokémon.", description: "Augmente de 20% la puissance des capacités de type {{moveType}} dun Pokémon.",
@ -93,7 +93,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
description: "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100).", description: "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100).",
}, },
"PokemonMultiHitModifierType": { "PokemonMultiHitModifierType": {
description: "Frappe une fois de plus en échange dune baisse de puissance de respectivement 60/75/82,5% par cumul.", description: "Frappe une fois de plus en échange dune baisse de puissance de respectivement 60/75/82,5% par cumul.",
}, },
"TmModifierType": { "TmModifierType": {
name: "CT{{moveId}} - {{moveName}}", name: "CT{{moveId}} - {{moveName}}",
@ -132,9 +132,9 @@ export const modifierType: ModifierTypeTranslationEntries = {
"RARE_CANDY": { name: "Super Bonbon" }, "RARE_CANDY": { name: "Super Bonbon" },
"RARER_CANDY": { name: "Hyper 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." }, "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." }, "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 quune Baie utilisée ne soit pas consommée." }, "BERRY_POUCH": { name: "Sac à Baies", description: "Ajoute 30% de chances quune 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 dagir en premier, indépendamment de la vitesse (après la priorité)." }, "QUICK_CLAW": { name: "Vive Griffe", description: "Ajoute 10% de chances dagir 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." }, "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." }, "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 dIV", description: "Révèle la qualité de deux IV dun Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, "IV_SCANNER": { name: "Scanner dIV", description: "Révèle la qualité de deux IV dun Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." },

View File

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

View File

@ -37,7 +37,7 @@ export const settings: SimpleTranslationEntries = {
"legacy": "Ancienne", "legacy": "Ancienne",
"windowType": "Type de fenêtre", "windowType": "Type de fenêtre",
"moneyFormat": "Format de largent", "moneyFormat": "Format de largent",
"damageNumbers": "Nombres de dégâts", "damageNumbers": "Affichage dégâts",
"simple": "Simple", "simple": "Simple",
"fancy": "Amélioré", "fancy": "Amélioré",
"abbreviated": "Abrégé", "abbreviated": "Abrégé",
@ -49,10 +49,10 @@ export const settings: SimpleTranslationEntries = {
"icon": "Icône", "icon": "Icône",
"animation": "Animation", "animation": "Animation",
"moveInfo": "Infos de capacité", "moveInfo": "Infos de capacité",
"showMovesetFlyout": "Afficher le volet de capacités", "showMovesetFlyout": "Afficher volet de capacités",
"showArenaFlyout": "Afficher le volet darène", "showArenaFlyout": "Afficher volet darène",
"showTimeOfDayWidget": "Widget de lheure", "showTimeOfDayWidget": "Widget dheure",
"timeOfDayAnimation": "Animation de lheure", "timeOfDayAnimation": "Animation dheure",
"bounce": "Sauter", "bounce": "Sauter",
"timeOfDay_back": "Retour", "timeOfDay_back": "Retour",
"spriteSet": "Ensemble de sprites", "spriteSet": "Ensemble de sprites",

View File

@ -28,8 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Voir les IV", "toggleIVs": "Voir les IV",
"manageMoves": "Modifier les Capacités", "manageMoves": "Modifier les Capacités",
"manageNature": "Modifier la Nature", "manageNature": "Modifier la Nature",
"addToFavorites": "Add to Favorites", "addToFavorites": "Ajouter aux Favoris",
"removeFromFavorites": "Remove from Favorites", "removeFromFavorites": "Retirer des Favoris",
"useCandies": "Utiliser des Bonbons", "useCandies": "Utiliser des Bonbons",
"selectNature": "Sélectionnez une nature.", "selectNature": "Sélectionnez une nature.",
"selectMoveSwapOut": "Sélectionnez la capacité à échanger.", "selectMoveSwapOut": "Sélectionnez la capacité à échanger.",

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}} ha recuperato dei PS.", "turnEndHpRestore": "{{pokemonName}} ha recuperato dei PS.",
"hpIsFull": "{{pokemonName}} ha già\ntutti i PS!", "hpIsFull": "{{pokemonName}} ha già\ntutti i PS!",
"skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?",
"itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.",
"eggHatching": "Oh?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?",
"stealEatBerry": "{{pokemonName}} ha rubato e mangiato\nla {{berryName}} di {{targetName}}!", "stealEatBerry": "{{pokemonName}} ha rubato e mangiato\nla {{berryName}} di {{targetName}}!",

View File

@ -3,35 +3,35 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const filterBar: SimpleTranslationEntries = { export const filterBar: SimpleTranslationEntries = {
"genFilter": "Gen", "genFilter": "Gen",
"typeFilter": "Tipo", "typeFilter": "Tipo",
"caughtFilter": "Caught", "caughtFilter": "Catturati",
"unlocksFilter": "Altro", "unlocksFilter": "Altro",
"miscFilter": "Misc", "miscFilter": "Misc",
"sortFilter": "Ordina", "sortFilter": "Ordina",
"all": "Tutto", "all": "Tutto",
"normal": "Normale", "normal": "Non shiny",
"uncaught": "Mancante", "uncaught": "Mancante",
"passive": "Passive", "passive": "Passiva",
"passiveUnlocked": "Passiva sbloccata", "passiveUnlocked": "Passiva sbloccata",
"passiveLocked": "Passiva bloccata", "passiveLocked": "Passiva bloccata",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "Passiva sbloccabile",
"costReduction": "Cost Reduction", "costReduction": "Riduzione costo",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "Costo ridotto",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "Costo non ridotto",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "Costo riducibile",
"favorite": "Favorite", "favorite": "Preferiti",
"isFavorite": "Favorite - Yes", "isFavorite": "Preferiti - Sì",
"notFavorite": "Favorite - No", "notFavorite": "Preferiti - No",
"ribbon": "Ribbon", "ribbon": "Fiocco",
"hasWon": "Ribbon - Yes", "hasWon": "Fiocco - Sì",
"hasNotWon": "Ribbon - No", "hasNotWon": "Fiocco - No",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "Abilità speciale",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "Abilità speciale - Sì",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "Abilità speciale - No",
"egg": "Egg", "egg": "Uova",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Uovo acquistabile",
"pokerus": "Pokerus", "pokerus": "Pokérus",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "Pokérus - Sì",
"noPokerus": "Pokerus - No", "noPokerus": "Pokérus - No",
"sortByNumber": "Num. Dex", "sortByNumber": "Num. Dex",
"sortByCost": "Costo", "sortByCost": "Costo",
"sortByCandies": "Caramelle", "sortByCandies": "Caramelle",

View File

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

View File

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

View File

@ -11,16 +11,16 @@ export const arenaTag: SimpleTranslationEntries = {
"reflectOnAdd": "リフレクターで 物理ダメージを さげた", "reflectOnAdd": "リフレクターで 物理ダメージを さげた",
"reflectOnAddPlayer": "味方の リフレクターで\n物理ダメージを さげた", "reflectOnAddPlayer": "味方の リフレクターで\n物理ダメージを さげた",
"reflectOnAddEnemy": "相手の リフレクターで\n物理ダメージを さげた", "reflectOnAddEnemy": "相手の リフレクターで\n物理ダメージを さげた",
"lightScreenOnAdd": "ひかりのかべで\n物理ダメージを さげた", "lightScreenOnAdd": "ひかりのかべで\n特殊ダメージを さげた",
"lightScreenOnAddPlayer": "味方の ひかりのかべで\n物理ダメージを さげた", "lightScreenOnAddPlayer": "味方の ひかりのかべで\n特殊ダメージを さげた",
"lightScreenOnAddEnemy": "相手の ひかりのかべで\n物理ダメージを さげた", "lightScreenOnAddEnemy": "相手の ひかりのかべで\n特殊ダメージを さげた",
"auroraVeilOnAdd": "オーロラベールで\n攻撃の ダメージを さげた", "auroraVeilOnAdd": "オーロラベールで\n攻撃の ダメージを さげた",
"auroraVeilOnAddPlayer": "味方の オーロラベールで\n攻撃ダメージを さげた", "auroraVeilOnAddPlayer": "味方の オーロラベールで\n攻撃ダメージを さげた",
"auroraVeilOnAddEnemy": "相手の オーロラベールで\n攻撃ダメージを さげた", "auroraVeilOnAddEnemy": "相手の オーロラベールで\n攻撃ダメージを さげた",
"conditionalProtectOnAdd": "{{moveName}}に 守られた!", "conditionalProtectOnAdd": "{{moveName}}に 守られた!",
"conditionalProtectOnAddPlayer": "見方が {{moveName}}に 守られた!", "conditionalProtectOnAddPlayer": "見方が {{moveName}}に 守られた!",
"conditionalProtectOnAddEnemy": "相手が {{moveName}}に 守られた!", "conditionalProtectOnAddEnemy": "相手が {{moveName}}に 守られた!",
"conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!", "conditionalProtectApply": "{{pokemonNameWithAffix}}が\n{{moveName}}に 守られた!",
"matBlockOnAdd": "{{pokemonNameWithAffix}}は\nたたみがえしを ねらっている", "matBlockOnAdd": "{{pokemonNameWithAffix}}は\nたたみがえしを ねらっている",
"noCritOnAddPlayer": "{{moveName}}の 力で 味方の急所が 隠れた!", "noCritOnAddPlayer": "{{moveName}}の 力で 味方の急所が 隠れた!",
"noCritOnAddEnemy": "{{moveName}}の 力で 相手の急所が 隠れた!", "noCritOnAddEnemy": "{{moveName}}の 力で 相手の急所が 隠れた!",
@ -33,7 +33,7 @@ export const arenaTag: SimpleTranslationEntries = {
"spikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", "spikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!",
"spikesActivateTrap": "{{pokemonNameWithAffix}}は\nまきびしの ダメージを 受けた", "spikesActivateTrap": "{{pokemonNameWithAffix}}は\nまきびしの ダメージを 受けた",
"toxicSpikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!", "toxicSpikesOnAdd": "{{opponentDesc}}の 足下に\n{{moveName}}が 散らばった!",
"toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}を 吸収した!", "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}は {{moveName}}で 毒を あびた!",
"stealthRockOnAdd": "{{opponentDesc}}の 周りに\nとがった岩が ただよい始めた", "stealthRockOnAdd": "{{opponentDesc}}の 周りに\nとがった岩が ただよい始めた",
"stealthRockActivateTrap": "{{pokemonNameWithAffix}}に\nとがった岩が 食い込んだ", "stealthRockActivateTrap": "{{pokemonNameWithAffix}}に\nとがった岩が 食い込んだ",
"stickyWebOnAdd": "相手の 足下に\n{{moveName}}が 広がった!", "stickyWebOnAdd": "相手の 足下に\n{{moveName}}が 広がった!",

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}の 体力が 回復した!", "turnEndHpRestore": "{{pokemonName}}の 体力が 回復した!",
"hpIsFull": "{{pokemonName}}の\n体力が 満タンだ!", "hpIsFull": "{{pokemonName}}の\n体力が 満タンだ!",
"skipItemQuestion": "本当に アイテムを 取らずに 進みますか?", "skipItemQuestion": "本当に アイテムを 取らずに 進みますか?",
"itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。",
"eggHatching": "おや?", "eggHatching": "おや?",
"ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?", "ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?",
"wildPokemonWithAffix": "野生の {{pokemonName}}", "wildPokemonWithAffix": "野生の {{pokemonName}}",

View File

@ -1,40 +1,40 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const filterBar: SimpleTranslationEntries = { export const filterBar: SimpleTranslationEntries = {
"genFilter": "Gen", "genFilter": "世代",
"typeFilter": "Type", "typeFilter": "タイプ",
"caughtFilter": "Caught", "caughtFilter": "捕獲",
"unlocksFilter": "Unlocks", "unlocksFilter": "解放",
"miscFilter": "Misc", "miscFilter": "その他",
"sortFilter": "Sort", "sortFilter": "並べ替え",
"all": "All", "all": "すべて",
"normal": "Not Shiny", "normal": "非色違い",
"uncaught": "Uncaught", "uncaught": "未捕獲",
"passive": "Passive", "passive": "パッシブ",
"passiveUnlocked": "Passive - Yes", "passiveUnlocked": "パッシブ - 解放済み",
"passiveLocked": "Passive - No", "passiveLocked": "パッシブ - 未解放",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "パッシブ - 解放可能",
"costReduction": "Cost Reduction", "costReduction": "ポイント削減",
"costReductionUnlocked": "Cost Reduction - Yes", "costReductionUnlocked": "ポイント削減 - 解放済み",
"costReductionLocked": "Cost Reduction - No", "costReductionLocked": "ポイント削減 - 未解放",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "ポイント削減 - 解放可能",
"favorite": "Favorite", "favorite": "お気に入り",
"isFavorite": "Favorite - Yes", "isFavorite": "お気に入り - あり",
"notFavorite": "Favorite - No", "notFavorite": "お気に入り - なし",
"ribbon": "Ribbon", "ribbon": "リボン",
"hasWon": "Ribbon - Yes", "hasWon": "リボン - あり",
"hasNotWon": "Ribbon - No", "hasNotWon": "リボン - なし",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "隠れ特性",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "隠れ特性 - あり",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "隠れ特性 - なし",
"egg": "Egg", "egg": "タマゴ",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "タマゴ - 購入可能",
"pokerus": "Pokerus", "pokerus": "ポケルス",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "ポケルス - あり",
"noPokerus": "Pokerus - No", "noPokerus": "ポケルス - なし",
"sortByNumber": "No.", "sortByNumber": "No.",
"sortByCost": "Cost", "sortByCost": "ポイント",
"sortByCandies": "Candy Count", "sortByCandies": "飴の数",
"sortByIVs": "IVs", "sortByIVs": "個体値",
"sortByName": "Name", "sortByName": "名前",
}; };

View File

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

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!",
"hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!",
"skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?",
"itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemname}}[[를]] 대신 받습니다.",
"eggHatching": "어라…?", "eggHatching": "어라…?",
"ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?",
"wildPokemonWithAffix": "야생 {{pokemonName}}", "wildPokemonWithAffix": "야생 {{pokemonName}}",

View File

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

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!",
"hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!",
"skipItemQuestion": "Tem certeza de que não quer escolher um item?", "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?", "eggHatching": "Opa?",
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?",
"wildPokemonWithAffix": "{{pokemonName}} selvagem", "wildPokemonWithAffix": "{{pokemonName}} selvagem",
@ -67,7 +68,7 @@ export const battle: SimpleTranslationEntries = {
"useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!",
"drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!",
"regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", "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}}!", "ppHealBerry": "{{pokemonNameWithAffix}} restaurou PP do movimento {{moveName}}\nusando sua {{berryName}}!",
"hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{berryName}}!", "hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{berryName}}!",
"fainted": "{{pokemonNameWithAffix}} desmaiou!", "fainted": "{{pokemonNameWithAffix}} desmaiou!",

View File

@ -35,11 +35,12 @@ import { modifier } from "./modifier";
import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; import { modifierSelectUiHandler } from "./modifier-select-ui-handler";
import { modifierType } from "./modifier-type"; import { modifierType } from "./modifier-type";
import { move } from "./move"; import { move } from "./move";
import { moveTriggers } from "./move-trigger";
import { nature } from "./nature"; import { nature } from "./nature";
import { partyUiHandler } from "./party-ui-handler"; import { partyUiHandler } from "./party-ui-handler";
import { pokeball } from "./pokeball"; import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon"; import { pokemon } from "./pokemon";
import { pokemonForm, battlePokemonForm } from "./pokemon-form"; import { battlePokemonForm, pokemonForm } from "./pokemon-form";
import { pokemonInfo } from "./pokemon-info"; import { pokemonInfo } from "./pokemon-info";
import { pokemonInfoContainer } from "./pokemon-info-container"; import { pokemonInfoContainer } from "./pokemon-info-container";
import { pokemonSummary } from "./pokemon-summary"; import { pokemonSummary } from "./pokemon-summary";
@ -52,7 +53,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { terrain, weather } from "./weather"; import { terrain, weather } from "./weather";
import { moveTriggers } from "./move-trigger";
export const ptBrConfig = { export const ptBrConfig = {
ability: ability, ability: ability,
@ -89,9 +89,12 @@ export const ptBrConfig = {
menu: menu, menu: menu,
menuUiHandler: menuUiHandler, menuUiHandler: menuUiHandler,
modifier: modifier, modifier: modifier,
modifierSelectUiHandler: modifierSelectUiHandler,
modifierType: modifierType, modifierType: modifierType,
move: move, move: move,
moveTriggers: moveTriggers,
nature: nature, nature: nature,
partyUiHandler: partyUiHandler,
pokeball: pokeball, pokeball: pokeball,
pokemon: pokemon, pokemon: pokemon,
pokemonForm: pokemonForm, pokemonForm: pokemonForm,
@ -109,8 +112,5 @@ export const ptBrConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler,
modifierSelectUiHandler: modifierSelectUiHandler,
moveTriggers: moveTriggers
}; };

View File

@ -13,22 +13,22 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "Passiva", "passive": "Passiva",
"passiveUnlocked": "Passiva Desbloqueada", "passiveUnlocked": "Passiva Desbloqueada",
"passiveLocked": "Passiva Bloqueada", "passiveLocked": "Passiva Bloqueada",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "Passiva - Pode Desbloquear",
"costReduction": "Redução de Custo", "costReduction": "Redução de Custo",
"costReductionUnlocked": "Redução de Custo Desbloq.", "costReductionUnlocked": "Redução de Custo Desbloq.",
"costReductionLocked": "Redução de Custo Bloq.", "costReductionLocked": "Redução de Custo Bloqueada",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "Redução de Custo Disponível",
"favorite": "Favorite", "favorite": "Favoritos",
"isFavorite": "Favorite - Yes", "isFavorite": "Favoritos - Sim",
"notFavorite": "Favorite - No", "notFavorite": "Favoritos - Não",
"ribbon": "Fita", "ribbon": "Fita",
"hasWon": "Fita - Sim", "hasWon": "Fita - Sim",
"hasNotWon": "Fita - Não", "hasNotWon": "Fita - Não",
"hiddenAbility": "Habilidade Oculta", "hiddenAbility": "Habilidade Oculta",
"hasHiddenAbility": "Habilidade Oculta - Sim", "hasHiddenAbility": "Habilidade Oculta - Sim",
"noHiddenAbility": "Habilidade Oculta - Não", "noHiddenAbility": "Habilidade Oculta - Não",
"egg": "Egg", "egg": "Ovo",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "Ovo Comprável",
"pokerus": "Pokérus", "pokerus": "Pokérus",
"hasPokerus": "Pokérus - Sim", "hasPokerus": "Pokérus - Sim",
"noPokerus": "Pokérus - Não", "noPokerus": "Pokérus - Não",

View File

@ -1,13 +1,13 @@
import { SimpleTranslationEntries } from "#app/interfaces/locales"; import { SimpleTranslationEntries } from "#app/interfaces/locales";
export const moveTriggers: SimpleTranslationEntries = { 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!", "cutHpPowerUpMove": "{{pokemonName}} diminuiu seus PS para aumentar o poder do ataque!",
"absorbedElectricity": "{{pokemonName}} absorveu eletricidade!", "absorbedElectricity": "{{pokemonName}} absorveu eletricidade!",
"switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!", "switchedStatChanges": "{{pokemonName}} trocou as mudanças de atributo com o alvo!",
"goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!", "goingAllOutForAttack": "{{pokemonName}} está arriscando tudo nesse ataque!",
"regainedHealth": "{{pokemonName}} recuperou/nsaúde!", "regainedHealth": "{{pokemonName}} recuperou/nsaúde!",
"keptGoingAndCrashed": "{{pokemonName}} continuou/nindo e bateu!", "keptGoingAndCrashed": "{{pokemonName}} errou o alvo/ne se arrebentou!",
"fled": "{{pokemonName}} fugiu!", "fled": "{{pokemonName}} fugiu!",
"cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!", "cannotBeSwitchedOut": "{{pokemonName}} não pode ser trocado!",
"swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!", "swappedAbilitiesWithTarget": "{{pokemonName}} trocou/nde habilidades com o alvo!",

View File

@ -13,6 +13,7 @@ export const battlePokemonForm: SimpleTranslationEntries = {
"eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!", "eternamaxChange": "{{preName}} Eternamaxou\npara {{pokemonName}}!",
"revertChange": "{{pokemonName}} voltou\npara sua forma original!", "revertChange": "{{pokemonName}} voltou\npara sua forma original!",
"formChange": "{{preName}} mudou de forma!", "formChange": "{{preName}} mudou de forma!",
"disguiseChange": "O seu disfarce serviu-lhe de isca!",
} as const; } as const;
export const pokemonForm: SimpleTranslationEntries = { export const pokemonForm: SimpleTranslationEntries = {
@ -180,15 +181,15 @@ export const pokemonForm: SimpleTranslationEntries = {
"gimmighoulChest": "Baú", "gimmighoulChest": "Baú",
"gimmighoulRoaming": "Perambulante", "gimmighoulRoaming": "Perambulante",
"koraidonApexBuild": "Apex Build", "koraidonApexBuild": "Apex Build",
"koraidonLimitedBuild":"Limited Build", "koraidonLimitedBuild": "Limited Build",
"koraidonSprintingBuild":"Sprinting Build", "koraidonSprintingBuild": "Sprinting Build",
"koraidonSwimmingBuild":"Swimming Build", "koraidonSwimmingBuild": "Swimming Build",
"koraidonGlidingBuild":"Gliding Build", "koraidonGlidingBuild": "Gliding Build",
"miraidonUltimateMode":"Ultimate Mode", "miraidonUltimateMode": "Ultimate Mode",
"miraidonLowPowerMode":"Low Power Mode", "miraidonLowPowerMode": "Low Power Mode",
"miraidonDriveMode":"Drive Mode", "miraidonDriveMode": "Drive Mode",
"miraidonAquaticMode":"Aquatic Mode", "miraidonAquaticMode": "Aquatic Mode",
"miraidonGlideMode":"Glide Mode", "miraidonGlideMode": "Glide Mode",
"poltchageistCounterfeit": "Imitação", "poltchageistCounterfeit": "Imitação",
"poltchageistArtisan": "Artesão", "poltchageistArtisan": "Artesão",
"paldeaTaurosCombat": "Combate", "paldeaTaurosCombat": "Combate",

View File

@ -28,8 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"toggleIVs": "Mostrar IVs", "toggleIVs": "Mostrar IVs",
"manageMoves": "Mudar Movimentos", "manageMoves": "Mudar Movimentos",
"manageNature": "Mudar Natureza", "manageNature": "Mudar Natureza",
"addToFavorites": "Add to Favorites", "addToFavorites": "Adicionar aos Favoritos",
"removeFromFavorites": "Remove from Favorites", "removeFromFavorites": "Remover dos Favoritos",
"useCandies": "Usar Doces", "useCandies": "Usar Doces",
"selectNature": "Escolha uma natureza.", "selectNature": "Escolha uma natureza.",
"selectMoveSwapOut": "Escolha um movimento para substituir.", "selectMoveSwapOut": "Escolha um movimento para substituir.",

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}的体力恢复了。", "turnEndHpRestore": "{{pokemonName}}的体力恢复了。",
"hpIsFull": "{{pokemonName}}的体力已满!", "hpIsFull": "{{pokemonName}}的体力已满!",
"skipItemQuestion": "你确定要跳过拾取道具吗?", "skipItemQuestion": "你确定要跳过拾取道具吗?",
"itemStackFull": "{{fullItemName}}持有数达到上限,\n你获得了{{itemName}}作为替代。",
"eggHatching": "咦?", "eggHatching": "咦?",
"stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}", "stealEatBerry": "{{pokemonName}}夺取并吃掉了\n{{targetName}}的{{berryName}}",
"ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP", "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP",

View File

@ -13,22 +13,22 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "被动", "passive": "被动",
"passiveUnlocked": "被动解锁", "passiveUnlocked": "被动解锁",
"passiveLocked": "被动未解锁", "passiveLocked": "被动未解锁",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "被动可解锁",
"costReduction": "费用降低", "costReduction": "费用降低",
"costReductionUnlocked": "已降费", "costReductionUnlocked": "已降费",
"costReductionLocked": "未降费", "costReductionLocked": "未降费",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "可降费",
"favorite": "Favorite", "favorite": "最爱",
"isFavorite": "Favorite - Yes", "isFavorite": "包含最爱",
"notFavorite": "Favorite - No", "notFavorite": "不包含最爱",
"ribbon": "缎带", "ribbon": "缎带",
"hasWon": "有缎带", "hasWon": "有缎带",
"hasNotWon": "无缎带", "hasNotWon": "无缎带",
"hiddenAbility": "梦特", "hiddenAbility": "梦特",
"hasHiddenAbility": "有梦特", "hasHiddenAbility": "有梦特",
"noHiddenAbility": "无梦特", "noHiddenAbility": "无梦特",
"egg": "Egg", "egg": "",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "可购买蛋",
"pokerus": "病毒", "pokerus": "病毒",
"hasPokerus": "有病毒", "hasPokerus": "有病毒",
"noPokerus": "无病毒", "noPokerus": "无病毒",

View File

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

View File

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

View File

@ -60,6 +60,7 @@ export const battle: SimpleTranslationEntries = {
"turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "turnEndHpRestore": "{{pokemonName}}'s HP was restored.",
"hpIsFull": "{{pokemonName}}'s\nHP is full!", "hpIsFull": "{{pokemonName}}'s\nHP is full!",
"skipItemQuestion": "你要跳過拾取道具嗎?", "skipItemQuestion": "你要跳過拾取道具嗎?",
"itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。",
"eggHatching": "咦?", "eggHatching": "咦?",
"ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?",
"wildPokemonWithAffix": "野生的 {{pokemonName}}", "wildPokemonWithAffix": "野生的 {{pokemonName}}",

View File

@ -13,25 +13,25 @@ export const filterBar: SimpleTranslationEntries = {
"passive": "被動", "passive": "被動",
"passiveUnlocked": "被動解鎖", "passiveUnlocked": "被動解鎖",
"passiveLocked": "被動未解鎖", "passiveLocked": "被動未解鎖",
"passiveUnlockable": "Passive - Can Unlock", "passiveUnlockable": "被動可解鎖",
"costReduction": "Cost Reduction", "costReduction": "費用降低",
"costReductionUnlocked": "Cost Reduction Unlocked", "costReductionUnlocked": "已降費",
"costReductionLocked": "Cost Reduction Locked", "costReductionLocked": "未降費",
"costReductionUnlockable": "Cost Reduction - Can Unlock", "costReductionUnlockable": "可降費",
"favorite": "Favorite", "favorite": "最愛",
"isFavorite": "Favorite - Yes", "isFavorite": "包含最愛",
"notFavorite": "Favorite - No", "notFavorite": "不包含最愛",
"ribbon": "緞帶", "ribbon": "緞帶",
"hasWon": "有緞帶", "hasWon": "有緞帶",
"hasNotWon": "無緞帶", "hasNotWon": "無緞帶",
"hiddenAbility": "Hidden Ability", "hiddenAbility": "隱藏特性",
"hasHiddenAbility": "Hidden Ability - Yes", "hasHiddenAbility": "有隱藏特性",
"noHiddenAbility": "Hidden Ability - No", "noHiddenAbility": "無隱藏特性",
"egg": "Egg", "egg": "",
"eggPurchasable": "Purchasable Egg", "eggPurchasable": "可購買蛋",
"pokerus": "Pokerus", "pokerus": "病毒",
"hasPokerus": "Pokerus - Yes", "hasPokerus": "有病毒",
"noPokerus": "Pokerus - No", "noPokerus": "無病毒",
"sortByNumber": "編號", "sortByNumber": "編號",
"sortByCost": "花費", "sortByCost": "花費",
"sortByCandies": "糖果", "sortByCandies": "糖果",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "#test/utils/testUtils"; import { SPLASH_ONLY } from "#test/utils/testUtils";
import { MovePhase, TurnEndPhase } from "#app/phases"; import { MovePhase, TurnEndPhase } from "#app/phases";
import { getMovePosition } from "#test/utils/gameManagerUtils"; 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 { BattlerTagType } from "#app/enums/battler-tag-type.js";
import { BattlerIndex } from "#app/battle.js"; import { BattlerIndex } from "#app/battle.js";
@ -30,6 +30,7 @@ describe("Abilities - Flash Fire", () => {
game.override game.override
.battleType("single") .battleType("single")
.ability(Abilities.FLASH_FIRE) .ability(Abilities.FLASH_FIRE)
.enemyAbility(Abilities.BALL_FETCH)
.startingLevel(20) .startingLevel(20)
.enemyLevel(20) .enemyLevel(20)
.disableCrits(); .disableCrits();
@ -75,13 +76,11 @@ describe("Abilities - Flash Fire", () => {
it("activated after being frozen", async() => { it("activated after being frozen", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY);
game.override.statusEffect(StatusEffect.FREEZE);
await game.startBattle([Species.BLISSEY]); await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!; 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)); game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.phaseInterceptor.to(TurnEndPhase); await game.phaseInterceptor.to(TurnEndPhase);

View File

@ -118,16 +118,16 @@ const languageSettings: { [key: string]: LanguageSetting } = {
}; };
const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [
{ passive: 50, costReduction: [30, 75], egg: 35 }, // 1 { passive: 40, costReduction: [25, 60], egg: 30 }, // 1 Cost
{ passive: 45, costReduction: [25, 60], egg: 35 }, // 2 { passive: 40, costReduction: [25, 60], egg: 30 }, // 2 Cost
{ passive: 40, costReduction: [20, 50], egg: 35 }, // 3 { passive: 35, costReduction: [20, 50], egg: 25 }, // 3 Cost
{ passive: 30, costReduction: [15, 40], egg: 30 }, // 4 { passive: 30, costReduction: [15, 40], egg: 20 }, // 4 Cost
{ passive: 25, costReduction: [12, 35], egg: 25 }, // 5 { passive: 25, costReduction: [12, 35], egg: 18 }, // 5 Cost
{ passive: 20, costReduction: [10, 30], egg: 20 }, // 6 { passive: 20, costReduction: [10, 30], egg: 15 }, // 6 Cost
{ passive: 15, costReduction: [8, 20], egg: 15 }, // 7 { passive: 15, costReduction: [8, 20], egg: 12 }, // 7 Cost
{ passive: 10, costReduction: [5, 15], egg: 10 }, // 8 { passive: 10, costReduction: [5, 15], egg: 8 }, // 8 Cost
{ passive: 10, costReduction: [3, 10], egg: 10 }, // 9 { passive: 10, costReduction: [5, 15], egg: 8 }, // 9 Cost
{ passive: 10, costReduction: [3, 10], egg: 10 }, // 10 { passive: 10, costReduction: [5, 15], egg: 8 }, // 10 Cost
]; ];
// Position of UI elements // Position of UI elements
@ -1328,44 +1328,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
break; break;
} }
} else { } 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 (button === Button.ACTION) {
if (!this.speciesStarterDexEntry?.caughtAttr) { if (!this.speciesStarterDexEntry?.caughtAttr) {
error = true; error = true;
} else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon } 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(); const ui = this.getUi();
let options: any[] = []; // TODO: add proper type 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 isPartyValid = this.isPartyValid();
const isValidForChallenge = new Utils.BooleanHolder(true); 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 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 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 = [ options = [
{ {
label: i18next.t("starterSelectUiHandler:addToParty"), label: i18next.t("starterSelectUiHandler:addToParty"),
handler: () => { handler: () => {
ui.setMode(Mode.STARTER_SELECT); 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) { if (!isDupe && isValidForChallenge.value && isOverValueLimit) {
const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; const cursorObj = this.starterCursorObjs[this.starterSpecies.length];
cursorObj.setVisible(true); cursorObj.setVisible(true);
cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); 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(); ui.playSelect();
} else { } else {
ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party 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 (this.canCycleNature) {
// if we could cycle natures, enable the improved nature menu // if we could cycle natures, enable the improved nature menu
const showNatureOptions = () => { const showNatureOptions = () => {
@ -1567,7 +1568,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
label: i18next.t("starterSelectUiHandler:addToFavorites"), label: i18next.t("starterSelectUiHandler:addToFavorites"),
handler: () => { handler: () => {
starterAttributes.favorite = true; 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); ui.setMode(Mode.STARTER_SELECT);
return true; return true;
} }
@ -1577,7 +1581,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
label: i18next.t("starterSelectUiHandler:removeFromFavorites"), label: i18next.t("starterSelectUiHandler:removeFromFavorites"),
handler: () => { handler: () => {
starterAttributes.favorite = false; 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); ui.setMode(Mode.STARTER_SELECT);
return true; return true;
} }
@ -1598,7 +1605,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
if (name.length > 0) { if (name.length > 0) {
this.pokemonNameText.setText(name); this.pokemonNameText.setText(name);
} else { } else {
this.pokemonNameText.setText(species.name); this.pokemonNameText.setText(this.lastSpecies.name);
} }
ui.setMode(Mode.STARTER_SELECT); ui.setMode(Mode.STARTER_SELECT);
}, },
@ -1631,16 +1638,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
ui.setMode(Mode.STARTER_SELECT); ui.setMode(Mode.STARTER_SELECT);
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined);
// Update the candy upgrade display // if starterContainer exists, update the passive background
if (this.isUpgradeIconEnabled() ) { if (starterContainer) {
this.setUpgradeIcon(starterContainer); // Update the candy upgrade display
} if (this.isUpgradeIconEnabled() ) {
if (this.isUpgradeAnimationEnabled()) { this.setUpgradeIcon(starterContainer);
this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); }
} if (this.isUpgradeAnimationEnabled()) {
this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true);
starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); }
starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr);
}
return true; return true;
} }
return false; return false;
@ -1666,21 +1675,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return this.scene.reset(true); return this.scene.reset(true);
} }
}); });
this.updateStarterValueLabel(starterContainer);
this.tryUpdateValue(0); this.tryUpdateValue(0);
ui.setMode(Mode.STARTER_SELECT); ui.setMode(Mode.STARTER_SELECT);
this.scene.playSound("buy"); this.scene.playSound("buy");
// If the notification setting is set to 'On', update the candy upgrade display // if starterContainer exists, update the value reduction background
if (this.scene.candyUpgradeNotification === 2) { if (starterContainer) {
if (this.isUpgradeIconEnabled() ) { this.updateStarterValueLabel(starterContainer);
this.setUpgradeIcon(starterContainer);
} // If the notification setting is set to 'On', update the candy upgrade display
if (this.isUpgradeAnimationEnabled()) { if (this.scene.candyUpgradeNotification === 2) {
this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); if (this.isUpgradeIconEnabled() ) {
this.setUpgradeIcon(starterContainer);
}
if (this.isUpgradeAnimationEnabled()) {
this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true);
}
} }
} }
return true; return true;
} }
return false; return false;
@ -1755,11 +1767,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
} }
} else { } else {
const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); 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) { switch (button) {
case Button.CYCLE_SHINY: case Button.CYCLE_SHINY:
if (this.canCycleShiny) { if (this.canCycleShiny) {
@ -2962,10 +2969,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const isValidForChallenge = new Utils.BooleanHolder(true); 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); 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 currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId);
const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; if (currentFilteredContainer) {
starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite;
currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); 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.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY);
this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); 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; this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1;