Compare commits

..

35 Commits

Author SHA1 Message Date
Jannik Tappert c78a95d5ae
Merge 16533b189f into 6030b780f2 2024-09-18 07:26:29 +00:00
Jannik Tappert 16533b189f
Update src/locales/de/pokemon-form.json 2024-09-18 09:26:27 +02:00
Jannik Tappert 22a5edd590
Update src/locales/de/pokemon-form.json 2024-09-18 09:25:04 +02:00
Jannik Tappert 2ce7c4a74e
Update src/locales/de/pokemon-form.json 2024-09-18 09:21:44 +02:00
Jannik Tappert b4c6c8c12b
Update src/locales/de/pokemon-form.json 2024-09-18 09:20:58 +02:00
Jannik Tappert 10c21fcd91
Update src/locales/de/pokemon-form.json 2024-09-18 09:20:22 +02:00
Jannik Tappert b2c1ebd961
Update src/locales/de/pokemon-form.json 2024-09-18 09:19:34 +02:00
Jannik Tappert 57d8af9093
Update src/locales/de/pokemon-form.json 2024-09-18 09:18:39 +02:00
Jannik Tappert 90fdf9cea7
Update src/locales/de/pokemon-form.json 2024-09-18 09:17:52 +02:00
Jannik Tappert 752e1c8c1b
Update src/locales/de/pokemon-form.json 2024-09-18 09:15:59 +02:00
Jannik Tappert 405ef19299
Update src/locales/de/pokemon-form.json 2024-09-18 09:15:32 +02:00
Jannik Tappert 71a79f3002
Update src/locales/de/pokemon-form.json 2024-09-18 09:14:14 +02:00
Jannik Tappert 75e24ef876
Update src/locales/de/pokemon-form.json 2024-09-18 09:13:36 +02:00
Jannik Tappert 96378c2a88
Update src/locales/de/pokemon-form.json 2024-09-18 09:09:18 +02:00
Jannik Tappert 0e36275199
Update src/locales/de/pokemon-form.json 2024-09-18 09:08:26 +02:00
Jannik Tappert 59f366d9f2
Update src/locales/de/pokemon-form.json 2024-09-18 09:06:32 +02:00
Jannik Tappert 5d858376ac
Update src/locales/de/pokemon-form.json 2024-09-18 09:05:26 +02:00
Jannik Tappert 0d2f6fb995
Update src/locales/de/pokemon-form.json 2024-09-18 09:05:06 +02:00
Jannik Tappert da8c11c5e8
Update src/locales/de/pokemon-form.json 2024-09-18 09:04:31 +02:00
Jannik Tappert 6cd4ff42eb
Update src/locales/de/pokemon-form.json 2024-09-18 09:04:01 +02:00
Jannik Tappert 30feeee5bd
Update src/locales/de/pokemon-form.json 2024-09-18 09:02:48 +02:00
flx-sta 6030b780f2
[Move][Mirror] Update HitTagAttr attributes v2 (#4297)
* [Move] Updated HitAttr tags

Affects Whirlwind/Fly, Steamroller/Minimize, and Malicious Moonsault/Minimize

* [Move] Update for MinimizeAccuracyAttr

Affects Steamroller and Malicious Moonsault

* add: whirlwind test

* add: steamroller test

* rename: `AlwaysHitMinimizeAttr` (from `MinimizeAccuracyAttr`)

* rename: `DealsDoubleDamageToTagAttr` (from `HitsTagAttr`)

---------

Co-authored-by: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com>
2024-09-17 22:41:46 -04:00
Jannik Tappert e386504977
[BUG][Beta] Fix English Status Symbols (#4293)
* Have English Status Symbols show up again :)

* It now uses the function instead

---------

Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
2024-09-17 22:26:47 -04:00
podar 106ed6b27b
[Bug] Using default animation for errors that occur. (#4266)
* Using default animation for errors that occur.

* Renaming function to make it clear that logging happens

* Updating logging for missing animations

* Missed committing linter changes

* Update src/data/battle-anims.ts

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

* Update src/data/battle-anims.ts

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

* Update src/data/battle-anims.ts

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

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
2024-09-17 22:15:47 -04:00
flx-sta 4389bff5d0
[Bug] Fix stat-protection-attribute not taking inverts (e.g. Contrary) into account (#4031)
* add generic types to`Pokemon.getAbilityAttrs()`

* add invert check to `ProtectStatAbAttr.apply...`

This makes sure that a stat is only protected if no other ability inverts the change. E.g. `Contrary` inverts any decrease to an increase

* migrate contrary.test.ts to game.classicMode

* move `StatStageChangeMultiplierAbAttr` resolve above `ProtectStatAbAttr`

The effect of StatStageChangeMultiplierAbAttr is now applied before resolving any ProtectStatAbAttr. Thus the stage (level) of the BattleStat change was properly altered at the time of resolving the protection

* revert ability.ts changes

* add automated tests for `Clear Body` + `Contrary`

* StateStageChangePhase replace ~~`IntegerHolder`~~ with `NumberHolder`

Update Utils import and replace all occurcences of `Utils.`

* contrary.test.ts: remove `js` import
2024-09-17 19:14:41 -07:00
Lugiad 1a3485ed43
Merge branch 'beta' into formChangeLocale 2024-09-18 02:17:03 +02:00
Lugiad 8fdae0f0ef
Update pokemon-form.json 2024-09-18 02:02:09 +02:00
Lugiad 82f6215806
Update pokemon-form.json 2024-09-18 02:02:06 +02:00
Lugiad 4181f078ae
Update pokemon-form.json 2024-09-18 02:02:02 +02:00
Lugiad 6409fe83b5
Update pokemon-form.json 2024-09-18 02:01:59 +02:00
Lugiad e5180cc89a
Update pokemon-form.json 2024-09-18 02:01:55 +02:00
Lugiad b5a83b689e
Update pokemon-form.json 2024-09-18 02:01:51 +02:00
Lugiad 36e14196de
Update pokemon-form.json 2024-09-18 02:01:47 +02:00
Lugiad a5e27bc3a7
Update pokemon-form.json 2024-09-18 02:01:43 +02:00
Madmadness65 00ba2eebc8
Add new biome BGM by Firel (#4301) 2024-09-17 21:57:34 +01:00
29 changed files with 995 additions and 74 deletions

View File

@ -55,7 +55,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to
- Pokémon Sword/Shield
- Pokémon Legends: Arceus
- Pokémon Scarlet/Violet
- Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music)
- Firel (Custom Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music)
- Lmz (Custom Jungle biome music)
- Andr06 (Custom Slum and Sea biome music)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2625,7 +2625,11 @@ export class PreStatStageChangeAbAttr extends AbAttr {
}
}
/**
* Protect one or all {@linkcode BattleStat} from reductions caused by other Pokémon's moves and Abilities
*/
export class ProtectStatAbAttr extends PreStatStageChangeAbAttr {
/** {@linkcode BattleStat} to protect or `undefined` if **all** {@linkcode BattleStat} are protected */
private protectedStat?: BattleStat;
constructor(protectedStat?: BattleStat) {
@ -2634,7 +2638,17 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr {
this.protectedStat = protectedStat;
}
applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean {
/**
* Apply the {@linkcode ProtectedStatAbAttr} to an interaction
* @param _pokemon
* @param _passive
* @param simulated
* @param stat the {@linkcode BattleStat} being affected
* @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true if the stat is protected
* @param _args
* @returns true if the stat is protected, false otherwise
*/
applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean {
if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) {
cancelled.value = true;
return true;
@ -3757,7 +3771,7 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr {
this.multiplier = multiplier;
}
apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value *= this.multiplier;
return true;

View File

@ -488,14 +488,14 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise<void> {
} else {
moveAnims.set(move, null);
const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP;
const moveName = Moves[move].toLowerCase().replace(/\_/g, "-");
const fetchAnimAndResolve = (move: Moves) => {
scene.cachedFetch(`./battle-anims/${moveName}.json`)
scene.cachedFetch(`./battle-anims/${Utils.animationFileName(move)}.json`)
.then(response => {
const contentType = response.headers.get("content-type");
if (!response.ok || contentType?.indexOf("application/json") === -1) {
console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText);
populateMoveAnim(move, moveAnims.get(defaultMoveAnim));
useDefaultAnim(move, defaultMoveAnim);
logMissingMoveAnim(move, response.status, response.statusText);
return resolve();
}
return response.json();
@ -515,6 +515,11 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise<void> {
} else {
resolve();
}
})
.catch(error => {
useDefaultAnim(move, defaultMoveAnim);
logMissingMoveAnim(move, error);
return resolve();
});
};
fetchAnimAndResolve(move);
@ -522,6 +527,29 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise<void> {
});
}
/**
* Populates the default animation for the given move.
*
* @param move the move to populate an animation for
* @param defaultMoveAnim the move to use as the default animation
*/
function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) {
populateMoveAnim(move, moveAnims.get(defaultMoveAnim));
}
/**
* Helper method for printing a warning to the console when a move animation is missing.
*
* @param move the move to populate an animation for
* @param optionalParams parameters to add to the error logging
*
* @remarks use {@linkcode useDefaultAnim} to use a default animation
*/
function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) {
const moveName = Utils.animationFileName(move);
console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams);
}
/**
* Fetches animation configs to be used in a Mystery Encounter
* @param scene

View File

@ -3839,7 +3839,7 @@ export class StormAccuracyAttr extends VariableAccuracyAttr {
* @extends VariableAccuracyAttr
* @see {@linkcode apply}
*/
export class MinimizeAccuracyAttr extends VariableAccuracyAttr {
export class AlwaysHitMinimizeAttr extends VariableAccuracyAttr {
/**
* @see {@linkcode apply}
* @param user N/A
@ -4855,10 +4855,10 @@ export class RemoveAllSubstitutesAttr extends MoveEffectAttr {
* Attribute used when a move hits a {@linkcode BattlerTagType} for double damage
* @extends MoveAttr
*/
export class HitsTagAttr extends MoveAttr {
export class DealsDoubleDamageToTagAttr extends MoveAttr {
/** The {@linkcode BattlerTagType} this move hits */
public tagType: BattlerTagType;
/** Should this move deal double damage against {@linkcode HitsTagAttr.tagType}? */
/** Should this move deal double damage against {@linkcode DealsDoubleDamageToTagAttr.tagType}? */
public doubleDamage: boolean;
constructor(tagType: BattlerTagType, doubleDamage?: boolean) {
@ -6752,12 +6752,11 @@ export function initMoves() {
new AttackMove(Moves.CUT, Type.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1)
.slicingMove(),
new AttackMove(Moves.GUST, Type.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1)
.attr(HitsTagAttr, BattlerTagType.FLYING, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, true)
.windMove(),
new AttackMove(Moves.WING_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1),
new StatusMove(Moves.WHIRLWIND, Type.NORMAL, -1, 20, -1, -6, 1)
.attr(ForceSwitchOutAttr)
.attr(HitsTagAttr, BattlerTagType.FLYING, false)
.ignoresSubstitute()
.hidesTarget()
.windMove(),
@ -6770,8 +6769,8 @@ export function initMoves() {
new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1),
new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1),
new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(AlwaysHitMinimizeAttr)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr),
new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1)
.attr(MultiHitAttr, MultiHitType._2),
@ -6795,8 +6794,8 @@ export function initMoves() {
.attr(OneHitKOAccuracyAttr),
new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(AlwaysHitMinimizeAttr)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1)
.attr(TrapAttr, BattlerTagType.WRAP),
@ -6864,7 +6863,7 @@ export function initMoves() {
new AttackMove(Moves.HYDRO_PUMP, Type.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1),
new AttackMove(Moves.SURF, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1)
.target(MoveTarget.ALL_NEAR_OTHERS)
.attr(HitsTagAttr, BattlerTagType.UNDERWATER, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERWATER, true)
.attr(GulpMissileTagAttr),
new AttackMove(Moves.ICE_BEAM, Type.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1)
.attr(StatusEffectAttr, StatusEffect.FREEZE),
@ -6947,18 +6946,18 @@ export function initMoves() {
new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.attr(ThunderAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.FLYING, false),
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false),
new AttackMove(Moves.ROCK_THROW, Type.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1)
.makesContact(false),
new AttackMove(Moves.EARTHQUAKE, Type.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1)
.attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, true)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1)
.makesContact(false)
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.FISSURE, Type.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1)
.attr(OneHitKOAttr)
.attr(OneHitKOAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.UNDERGROUND, false)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, false)
.makesContact(false),
new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1)
.attr(ChargeAttr, ChargeAnim.DIG_CHARGING, i18next.t("moveTriggers:dugAHole", {pokemonName: "{USER}"}), BattlerTagType.UNDERGROUND)
@ -7347,7 +7346,7 @@ export function initMoves() {
.attr(PreMoveMessageAttr, magnitudeMessageFunc)
.attr(MagnitudePowerAttr)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1)
.attr(HitsTagAttr, BattlerTagType.UNDERGROUND, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERGROUND, true)
.makesContact(false)
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.DYNAMIC_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2)
@ -7403,7 +7402,7 @@ export function initMoves() {
new AttackMove(Moves.CROSS_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2)
.attr(HighCritAttr),
new AttackMove(Moves.TWISTER, Type.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2)
.attr(HitsTagAttr, BattlerTagType.FLYING, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, true)
.attr(FlinchAttr)
.windMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
@ -7435,7 +7434,7 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2)
.attr(TrapAttr, BattlerTagType.WHIRLPOOL)
.attr(HitsTagAttr, BattlerTagType.UNDERWATER, true),
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.UNDERWATER, true),
new AttackMove(Moves.BEAT_UP, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2)
.attr(MultiHitAttr, MultiHitType.BEAT_UP)
.attr(BeatUpAttr)
@ -7658,7 +7657,7 @@ export function initMoves() {
new AttackMove(Moves.EXTRASENSORY, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3)
.attr(FlinchAttr),
new AttackMove(Moves.SKY_UPPERCUT, Type.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3)
.attr(HitsTagAttr, BattlerTagType.FLYING)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING)
.punchingMove(),
new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3)
.attr(TrapAttr, BattlerTagType.SAND_TOMB)
@ -7889,8 +7888,8 @@ export function initMoves() {
new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4)
.pulseMove(),
new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(AlwaysHitMinimizeAttr)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr),
new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4),
new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4)
@ -8087,7 +8086,7 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true)
.attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED)
.attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN])
.attr(HitsTagAttr, BattlerTagType.FLYING, false)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false)
.makesContact(false),
new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5)
.attr(CritOnlyAttr),
@ -8100,9 +8099,9 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true)
.danceMove(),
new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(AlwaysHitMinimizeAttr)
.attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true),
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true),
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS)
.condition(unknownTypeCondition)
@ -8253,12 +8252,14 @@ export function initMoves() {
.attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.slicingMove(),
new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(AlwaysHitMinimizeAttr)
.attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true),
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true),
new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5)
.attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5)
.attr(AlwaysHitMinimizeAttr)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr),
new SelfStatusMove(Moves.COTTON_GUARD, Type.GRASS, -1, 10, -1, 0, 5)
.attr(StatStageChangeAttr, [ Stat.DEF ], 3, true),
@ -8271,7 +8272,7 @@ export function initMoves() {
new AttackMove(Moves.HURRICANE, Type.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5)
.attr(ThunderAccuracyAttr)
.attr(ConfuseAttr)
.attr(HitsTagAttr, BattlerTagType.FLYING, false)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false)
.windMove(),
new AttackMove(Moves.HEAD_CHARGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5)
.attr(RecoilAttr)
@ -8325,9 +8326,9 @@ export function initMoves() {
.attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE)
.makesContact(false),
new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6)
.attr(MinimizeAccuracyAttr)
.attr(AlwaysHitMinimizeAttr)
.attr(FlyingTypeMultiplierAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnGravityCondition),
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
.target(MoveTarget.USER_SIDE)
@ -8498,8 +8499,8 @@ export function initMoves() {
new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6)
.attr(NeutralDamageAgainstFlyingTypeMultiplierAttr)
.attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true)
.attr(HitsTagAttr, BattlerTagType.FLYING, false)
.attr(HitsTagAttr, BattlerTagType.MAGNET_RISEN, false)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.FLYING, false)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MAGNET_RISEN, false)
.attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED)
.attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN])
.makesContact(false)
@ -8756,6 +8757,8 @@ export function initMoves() {
.partial()
.ignoresVirtual(),
new AttackMove(Moves.MALICIOUS_MOONSAULT, Type.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7)
.attr(AlwaysHitMinimizeAttr)
.attr(DealsDoubleDamageToTagAttr, BattlerTagType.MINIMIZED, true)
.partial()
.ignoresVirtual(),
new AttackMove(Moves.OCEANIC_OPERETTA, Type.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7)

View File

@ -746,7 +746,7 @@ export class Arena {
case Biome.TOWN:
return 7.288;
case Biome.PLAINS:
return 7.693;
return 17.485;
case Biome.GRASS:
return 1.995;
case Biome.TALL_GRASS:
@ -774,13 +774,13 @@ export class Arena {
case Biome.DESERT:
return 1.143;
case Biome.ICE_CAVE:
return 15.010;
return 0.000;
case Biome.MEADOW:
return 3.891;
case Biome.POWER_PLANT:
return 2.810;
return 9.447;
case Biome.VOLCANO:
return 5.116;
return 17.637;
case Biome.GRAVEYARD:
return 3.232;
case Biome.DOJO:

View File

@ -3,7 +3,7 @@ import BattleScene, { AnySound } from "../battle-scene";
import { Variant, VariantSet, variantColorCache } from "#app/data/variant";
import { variantData } from "#app/data/variant";
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "../data/move";
import Move, { HighCritAttr, DealsDoubleDamageToTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils";
import * as Utils from "../utils";
@ -1273,13 +1273,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param attrType {@linkcode AbAttr} The ability attribute to check for.
* @param canApply {@linkcode Boolean} If false, it doesn't check whether the ability is currently active
* @param ignoreOverride {@linkcode Boolean} If true, it ignores ability changing effects
* @returns {AbAttr[]} A list of all the ability attributes on this ability.
* @returns A list of all the ability attributes on this ability.
*/
getAbilityAttrs(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): AbAttr[] {
const abilityAttrs: AbAttr[] = [];
getAbilityAttrs<T extends AbAttr = AbAttr>(attrType: { new(...args: any[]): T }, canApply: boolean = true, ignoreOverride?: boolean): T[] {
const abilityAttrs: T[] = [];
if (!canApply || this.canApplyAbility()) {
abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs(attrType));
abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs<T>(attrType));
}
if (!canApply || this.canApplyAbility(true)) {
@ -1513,7 +1513,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType);
for (const tag of immuneTags) {
if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) {
if (move && !move.getAttrs(DealsDoubleDamageToTagAttr).some(attr => attr.tagType === tag.tagType)) {
typeMultiplier.value = 0;
break;
}
@ -2489,13 +2489,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier);
/**
* For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if:
* For each {@linkcode DealsDoubleDamageToTagAttr} the move has, doubles the damage of the move if:
* The target has a {@linkcode BattlerTagType} that this move interacts with
* AND
* The move doubles damage when used against that tag
*/
const hitsTagMultiplier = new Utils.NumberHolder(1);
move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => {
move.getAttrs(DealsDoubleDamageToTagAttr).filter(hta => hta.doubleDamage).forEach(hta => {
if (this.getTag(hta.tagType)) {
hitsTagMultiplier.value *= 2;
}

View File

@ -40,9 +40,14 @@
"castformRainy": "Regenform",
"castformSnowy": "Schneeform",
"deoxysNormal": "Normalform",
"deoxysAttack": "Angriffsform",
"deoxysDefense": "Verteidigungsform",
"deoxysSpeed": "Initiativeform",
"burmyPlant": "Pflanzenumhang",
"burmySandy": "Sandumhang",
"burmyTrash": "Lumpenumhang",
"cheribiOvercast": "Wolkenform",
"cheribiSunshine": "Sonnenform",
"shellosEast": "Östliches Meer",
"shellosWest": "Westliches Meer",
"rotomHeat": "Hitze-Rotom",
@ -50,21 +55,36 @@
"rotomFrost": "Frost-Rotom",
"rotomFan": "Wirbel-Rotom",
"rotomMow": "Schneid-Rotom",
"dialgaOrigin": "Urform",
"palkiaOrigin": "Urform",
"giratinaAltered": "Wandelform",
"giratinaOrigin": "Urform",
"shayminLand": "Landform",
"shayminSky": "Zenitform",
"basculinRedStriped": "Rotlinige Form",
"basculinBlueStriped": "Blaulinige Form",
"basculinWhiteStriped": "Weißlinige Form",
"darumakaZen": "Trance-Modus",
"deerlingSpring": "Frühlingsform",
"deerlingSummer": "Sommerform",
"deerlingAutumn": "Herbstform",
"deerlingWinter": "Winterform",
"tornadusIncarnate": "Inkarnationsform",
"tornadusTherian": "Tiergeistform",
"thundurusIncarnate": "Inkarnationsform",
"thundurusTherian": "Tiergeistform",
"landorusIncarnate": "Inkarnationsform",
"landorusTherian": "Tiergeistform",
"kyuremBlack": "Schwarzes Kyurem",
"kyuremWhite": "Weißes Kyurem",
"keldeoOrdinary": "Standardform",
"keldeoResolute": "Resolutform",
"meloettaAria": "Gesangsform",
"meloettaPirouette": "Tanzform",
"genesectShock": "Blitzmodul",
"genesectBurn": "Flammenmodul",
"genesectChill": "Gefriermodul",
"genesectDouse": "Aquamodul",
"froakieBattleBond": "Ash-Form",
"scatterbugMeadow": "Blumenmeermuster",
"scatterbugIcySnow": "Frostmuster",
@ -100,6 +120,10 @@
"furfrouLaReine": "Königinnenschnitt",
"furfrouKabuki": "Kabuki-Schnitt",
"furfrouPharaoh": "Herrscherschnitt",
"espurrMale": "männlich",
"espurrFemale": "weiblich",
"honedgeShiled": "Schildform",
"honedgeBlade": "Klingenform",
"pumpkabooSmall": "Größe S",
"pumpkabooLarge": "Größe L",
"pumpkabooSuper": "Größe XL",
@ -110,11 +134,34 @@
"zygarde50Pc": "50% Form Scharwandel",
"zygarde10Pc": "10% Form Scharwandel",
"zygardeComplete": "Optimum-Form",
"hoopaUnbound": "Entfesseltes Hoopa",
"oricorioBaile": "Flamenco-Stil",
"oricorioPompom": "Cheerleading-Stil",
"oricorioPau": "Hula-Stil",
"oricorioSensu": "Buyo-Stil",
"rockruffOwnTempo": "Gleichmut",
"rockruffMidday": "Tagform",
"rockruffMidnight": "Nachtform",
"rockruffMidnight": "Zwielichtform",
"wishiwashiSchool": "Schwarmform",
"typeNullNormal": "Typ:Normal",
"typeNullFighting": "Typ:Kampf",
"typeNullFlying": "Typ:Flug",
"typeNullPoison": "Typ:Gift",
"typeNullGround": "Typ:Boden",
"typeNullRock": "Typ:Gestein",
"typeNullBug": "Typ:Käfer",
"typeNullGhost": "Typ:Geist",
"typeNullSteel": "Typ:Stahl",
"typeNullFire": "Typ:Feuer",
"typeNullWater": "Typ:Wasser",
"typeNullGrass": "Typ:Pflanze",
"typeNullElectric": "Typ:Elektro",
"typeNullPsychic": "Typ:Psycho",
"typeNullIce": "Typ:Eis",
"typeNullDragon": "Typ:Drache",
"typeNullDark": "Typ:Unlicht",
"typeNullFairy": "Typ:Fee",
"miniorRedMeteor": "Rote-Meteorform",
"miniorOrangeMeteor": "Oranger-Meteorform",
"miniorYellowMeteor": "Gelber-Meteorform",
@ -131,25 +178,55 @@
"miniorViolet": "Violetter Kern",
"mimikyuDisguised": "Verkleidete Form",
"mimikyuBusted": "Entlarvte Form",
"necrozmaDuskMane": "Abendmähne",
"necrozmaDawnWings": "Morgenschwingen",
"necrozmaUltra": "Ultra-Necrozma",
"magearnaOriginal": "Originalfarbe",
"marshadowZenith": "Zenitform",
"sinisteaPhony": "Fälschungsform",
"sinisteaAntique": "Originalform",
"milceryVanillaCream": "Vanille-Creme",
"milceryRubyCream": "Ruby-Creme",
"milceryMatchaCream": "Matcha-Creme",
"milceryMintCream": "Minz-Creme",
"milceryLemonCream": "Zitronen-Creme",
"milcerySaltedCream": "Salz-Creme",
"milceryRubySwirl": "Ruby-Mix",
"milceryCaramelSwirl": "Karamell-Mix",
"milceryRainbowSwirl": "Trio-Mix",
"eiscueNoIce": "Wohlfühlkopf",
"indeedeeMale": "männlich",
"indeedeeFemale": "weiblich",
"morpekoFullBelly": "Pappsattmuster",
"morpekoHangry": "Kohldampfmuster",
"zacianHeroOfManyBattles": "Heldenhafter Krieger",
"zacianCrowned": "König des Schwertes",
"zamazentaHeroOfManyBattles": "Heldenhafter Krieger",
"zamazentaCrowned": "König des Schildes",
"kubfuSingleStrike": "Fokussierter Stil",
"kubfuRapidStrike": "Fließender Stil",
"zarudeDada": "Papa",
"calyrexIce": "Schimmelreiter",
"calyrexShadow": "Rappenreiter",
"basculinMale": "männlich",
"basculinFemale": "weiblich",
"enamorusIncarnate": "Inkarnationsform",
"enamorusTherian": "Tiergeistform",
"lechonkMale": "männlich",
"lechonkFemale": "weiblich",
"tandemausFour": "Dreierfamilie",
"tandemausThree": "Viererfamilie",
"squawkabillyGreenPlumage": "Grüngefiedert",
"squawkabillyBluePlumage": "Blaugefiedert",
"squawkabillyYellowPlumage": "Gelbgefiedert",
"squawkabillyWhitePlumage": "Weißgefiedert",
"finizenZero": "Alltagsform",
"finizenZero": "Heldenform",
"tatsugiriCurly": "Gebogene Form",
"tatsugiriDroopy": "Hängende Form",
"tatsugiriStretchy": "Gestrekte Form",
"dunsparceTwo": "Zweisegmentform",
"dunsparceThree": "Dreisegmentform",
"gimmighoulChest": "Truhenform",
"gimmighoulRoaming": "Wanderform",
"koraidonApexBuild": "Vollkommene Gestalt",
@ -164,6 +241,19 @@
"miraidonGlideMode": "Gleitmodus",
"poltchageistCounterfeit": "Imitationsform",
"poltchageistArtisan": "Kostbarkeitsform",
"poltchageistUnremarkable": "Simple Form",
"poltchageistMasterpiece": "Edle Form",
"ogerponTealMask": "Türkisgrüne Maske",
"ogerponTealMaskTera": "Türkisgrüne Maske (Terakristallisiert)",
"ogerponWellspringMask": "Brunnenmaske",
"ogerponWellspringMaskTera": "Brunnenmaske (Terakristallisiert)",
"ogerponHearthflameMask": "Ofenmaske",
"ogerponHearthflameMaskTera": "Ofenmaske (Terakristallisiert)",
"ogerponCornerstoneMask": "Fundamentmaske",
"ogerponCornerstoneMaskTera": "Fundamentmaske (Terakristallisiert)",
"terpagosTerastal": "Terakristall-Form",
"terpagosStellar": "Stellarform",
"galarDarumakaZen": "Trance-Modus",
"paldeaTaurosCombat": "Gefechtsvariante",
"paldeaTaurosBlaze": "Flammenvariante",
"paldeaTaurosAqua": "Flutenvariante"

View File

@ -108,7 +108,7 @@
"forest": "PMD EoS Dusk Forest",
"grass": "PMD EoS Apple Woods",
"graveyard": "PMD EoS Mystifying Forest",
"ice_cave": "PMD EoS Vast Ice Mountain",
"ice_cave": "Firel - -60F",
"island": "PMD EoS Craggy Coast",
"jungle": "Lmz - Jungle",
"laboratory": "Firel - Laboratory",
@ -116,8 +116,8 @@
"meadow": "PMD EoS Sky Peak Forest",
"metropolis": "Firel - Metropolis",
"mountain": "PMD EoS Mt. Horn",
"plains": "PMD EoS Sky Peak Prairie",
"power_plant": "PMD EoS Far Amp Plains",
"plains": "Firel - Route 888",
"power_plant": "Firel - The Klink",
"ruins": "PMD EoS Deep Sealed Ruin",
"sea": "Andr06 - Marine Mystique",
"seabed": "Firel - Seabed",
@ -128,7 +128,7 @@
"tall_grass": "PMD EoS Foggy Forest",
"temple": "PMD EoS Aegis Cave",
"town": "PMD EoS Random Dungeon Theme 3",
"volcano": "PMD EoS Steam Cave",
"volcano": "Firel - Twisturn Volcano",
"wasteland": "PMD EoS Hidden Highland",
"encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)",
"encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)",

View File

@ -40,9 +40,14 @@
"castformRainy": "Lluvia",
"castformSnowy": "Nieve",
"deoxysNormal": "Normal",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "Planta",
"burmySandy": "Arena",
"burmyTrash": "Basura",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "Este",
"shellosWest": "Oeste",
"rotomHeat": "Calor",
@ -50,21 +55,36 @@
"rotomFrost": "Frío",
"rotomFan": "Ventilador",
"rotomMow": "Corte",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "Modificada",
"giratinaOrigin": "Origin",
"shayminLand": "Tierra",
"shayminSky": "Sky",
"basculinRedStriped": "Raya Roja",
"basculinBlueStriped": "Raya Azul",
"basculinWhiteStriped": "Raya Blanca",
"darumakaZen": "Zen",
"deerlingSpring": "Primavera",
"deerlingSummer": "Verano",
"deerlingAutumn": "Otoño",
"deerlingWinter": "Invierno",
"tornadusIncarnate": "Avatar",
"tornadusTherian": "Therian",
"thundurusIncarnate": "Avatar",
"thundurusTherian": "Therian",
"landorusIncarnate": "Avatar",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "Habitual",
"keldeoResolute": "Resolute",
"meloettaAria": "Lírica",
"meloettaPirouette": "Danza",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "Fuerte Afecto",
"scatterbugMeadow": "Floral",
"scatterbugIcySnow": "Polar",
@ -100,6 +120,10 @@
"furfrouLaReine": "Aristócrata",
"furfrouKabuki": "Kabuki",
"furfrouPharaoh": "Faraónico",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "Pequeño",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Enorme",
@ -110,11 +134,34 @@
"zygarde50Pc": "Zygarde al 50%",
"zygarde10Pc": "Zygarde al 10%",
"zygardeComplete": "Zygarde Completo",
"hoopaUnbound": "Unbound",
"oricorioBaile": "Apasionado",
"oricorioPompom": "Animado",
"oricorioPau": "Plácido",
"oricorioSensu": "Refinado",
"rockruffOwnTempo": "Ritmo Propio",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "Núcleo Rojo",
"miniorOrangeMeteor": "Núcleo Naranja",
"miniorYellowMeteor": "Núcleo Amarillo",
@ -131,25 +178,55 @@
"miniorViolet": "Violeta",
"mimikyuDisguised": "Encubierta",
"mimikyuBusted": "Descubierta",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "Vetusto",
"marshadowZenith": "Cénit",
"sinisteaPhony": "Falsificada",
"sinisteaAntique": "Genuina",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "Cara Deshielo",
"indeedeeMale": "Macho",
"indeedeeFemale": "Hembra",
"morpekoFullBelly": "Saciada",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "Guerrero avezado",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "Guerrero avezado",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "Papá",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "Avatar",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "Plumaje Verde",
"squawkabillyBluePlumage": "Plumaje Azul",
"squawkabillyYellowPlumage": "Plumaje Amarillo",
"squawkabillyWhitePlumage": "Plumaje Blanco",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "Curvada",
"tatsugiriDroopy": "Lánguida",
"tatsugiriStretchy": "Estirada",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "Cofre",
"gimmighoulRoaming": "Andante",
"koraidonApexBuild": "Forma Plena",
@ -164,6 +241,19 @@
"miraidonGlideMode": "Modo Planeo",
"poltchageistCounterfeit": "Fraudulenta",
"poltchageistArtisan": "Opulenta",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combatiente",
"paldeaTaurosBlaze": "Ardiente",
"paldeaTaurosAqua": "Acuático"

View File

@ -40,9 +40,14 @@
"castformRainy": "Pioggia",
"castformSnowy": "Nuvola di neve",
"deoxysNormal": "Normale",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "Pianta",
"burmySandy": "Sabbia",
"burmyTrash": "Scarti",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "Est",
"shellosWest": "Ovest",
"rotomHeat": "Calore",
@ -50,21 +55,36 @@
"rotomFrost": "Gelo",
"rotomFan": "Vortice",
"rotomMow": "Taglio",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "Alterata",
"giratinaOrigin": "Origin",
"shayminLand": "Terra",
"shayminSky": "Sky",
"basculinRedStriped": "Linearossa",
"basculinBlueStriped": "Lineablu",
"basculinWhiteStriped": "Lineabianca",
"darumakaZen": "Zen",
"deerlingSpring": "Primavera",
"deerlingSummer": "Estate",
"deerlingAutumn": "Autunno",
"deerlingWinter": "Inverno",
"tornadusIncarnate": "Incarnazione",
"tornadusTherian": "Therian",
"thundurusIncarnate": "Incarnazione",
"thundurusTherian": "Therian",
"landorusIncarnate": "Incarnazione",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "Normale",
"keldeoResolute": "Resolute",
"meloettaAria": "Canto",
"meloettaPirouette": "Danza",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "Morfosintonia",
"scatterbugMeadow": "Giardinfiore",
"scatterbugIcySnow": "Nevi perenni",
@ -100,6 +120,10 @@
"furfrouLaReine": "Regina",
"furfrouKabuki": "Kabuki",
"furfrouPharaoh": "Faraone",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "Mini",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Maxi",
@ -110,11 +134,34 @@
"zygarde50Pc": "Forma 50% Sciamefusione",
"zygarde10Pc": "Forma 10% Sciamefusione",
"zygardeComplete": "Forma perfetta",
"hoopaUnbound": "Unbound",
"oricorioBaile": "Flamenco",
"oricorioPompom": "Cheerdance",
"oricorioPau": "Hula",
"oricorioSensu": "Buyō",
"rockruffOwnTempo": "Mentelocale",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "Nucleo Rosso",
"miniorOrangeMeteor": "Nucleo Arancione",
"miniorYellowMeteor": "Nucleo Giallo",
@ -131,25 +178,55 @@
"miniorViolet": "Violetto",
"mimikyuDisguised": "Mascherata",
"mimikyuBusted": "Smascherata",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "Colore Antico",
"marshadowZenith": "Zenith",
"sinisteaPhony": "Contraffatta",
"sinisteaAntique": "Autentica",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "Liquefaccia",
"indeedeeMale": "Maschio",
"indeedeeFemale": "Femmina",
"morpekoFullBelly": "Panciapiena",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "Eroe di Mille Lotte",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "Eroe di Mille Lotte",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "Papà",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "Incarnazione",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "Piume Verdi",
"squawkabillyBluePlumage": "Piume Azzurre",
"squawkabillyYellowPlumage": "Piume Gialle",
"squawkabillyWhitePlumage": "Piume Bianche",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "Arcuata",
"tatsugiriDroopy": "Adagiata",
"tatsugiriStretchy": "Tesa",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "Scrigno",
"gimmighoulRoaming": "Ambulante",
"koraidonApexBuild": "Foggia Integrale",
@ -164,6 +241,19 @@
"miraidonGlideMode": "Assetto Planata",
"poltchageistCounterfeit": "Taroccata",
"poltchageistArtisan": "Pregiata",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combattiva",
"paldeaTaurosBlaze": "Infuocata",
"paldeaTaurosAqua": "Acquatica"

View File

@ -40,9 +40,14 @@
"castformRainy": "あまみず",
"castformSnowy": "ゆきぐも",
"deoxysNormal": "ノーマル",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "くさき",
"burmySandy": "すなち",
"burmyTrash": "ゴミ",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "ひがし",
"shellosWest": "にし",
"rotomHeat": "ヒート",
@ -50,21 +55,36 @@
"rotomFrost": "フロスト",
"rotomFan": "スピン",
"rotomMow": "カット",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "アナザー",
"giratinaOrigin": "Origin",
"shayminLand": "ランド",
"shayminSky": "Sky",
"basculinRedStriped": "赤筋",
"basculinBlueStriped": "青筋",
"basculinWhiteStriped": "白筋",
"darumakaZen": "Zen",
"deerlingSpring": "春",
"deerlingSummer": "夏",
"deerlingAutumn": "秋",
"deerlingWinter": "冬",
"tornadusIncarnate": "けしん",
"tornadusTherian": "Therian",
"thundurusIncarnate": "けしん",
"thundurusTherian": "Therian",
"landorusIncarnate": "けしん",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "いつも",
"keldeoResolute": "Resolute",
"meloettaAria": "ボイス",
"meloettaPirouette": "ステップ",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "きずなへんげ",
"scatterbugMeadow": "はなぞの",
"scatterbugIcySnow": "ひょうせつ",
@ -100,6 +120,10 @@
"furfrouLaReine": "クイーン",
"furfrouKabuki": "カブキ",
"furfrouPharaoh": "キングダム",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "ちいさい",
"pumpkabooLarge": "おおきい",
"pumpkabooSuper": "とくだい",
@ -110,11 +134,34 @@
"zygarde50Pc": "50%フォルム スワームチェンジ",
"zygarde10Pc": "10%フォルム スワームチェンジ",
"zygardeComplete": "パーフェクトフォルム",
"hoopaUnbound": "Unbound",
"oricorioBaile": "めらめら",
"oricorioPompom": "ぱちぱち",
"oricorioPau": "ふらふら",
"oricorioSensu": "まいまい",
"rockruffOwnTempo": "マイペース",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "赤 りゅうせい",
"miniorOrangeMeteor": "オレンジ りゅうせい",
"miniorYellowMeteor": "黄 りゅうせい",
@ -131,22 +178,52 @@
"miniorViolet": "紫",
"mimikyuDisguised": "ばけたすがた",
"mimikyuBusted": "ばれたすがた",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "500ねんまえ",
"marshadowZenith": "Zパワー",
"sinisteaPhony": "がんさく",
"sinisteaAntique": "しんさく",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "ナイスなし",
"indeedeeMale": "オス",
"indeedeeFemale": "メス",
"morpekoFullBelly": "まんぷく",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "れきせんのゆうしゃ",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "れきせんのゆうしゃ",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "とうちゃん",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "けしん",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "グリーンフェザー",
"squawkabillyBluePlumage": "ブルーフェザー",
"squawkabillyYellowPlumage": "イエローフェザー",
"squawkabillyWhitePlumage": "ホワイトフェザー",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "そったすがた",
"tatsugiriDroopy": "たれたすがた",
"tatsugiriStretchy": "のびたすがた",
@ -164,6 +241,19 @@
"miraidonGlideMode":"グライドモード",
"poltchageistCounterfeit": "マガイモノ",
"poltchageistArtisan": "タカイモノ",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "コンバット",
"paldeaTaurosBlaze": "ブレイズ",
"paldeaTaurosAqua": "ウォーター"

View File

@ -40,9 +40,14 @@
"castformRainy": "빗방울의 모습",
"castformSnowy": "설운의 모습",
"deoxysNormal": "노말폼",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "초목도롱",
"burmySandy": "모래땅도롱",
"burmyTrash": "슈레도롱",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "동쪽바다의 모습",
"shellosWest": "서쪽바다의 모습",
"rotomHeat": "히트",
@ -50,21 +55,36 @@
"rotomFrost": "프로스트",
"rotomFan": "스핀",
"rotomMow": "커트",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "어나더폼",
"giratinaOrigin": "Origin",
"shayminLand": "랜드폼",
"shayminSky": "Sky",
"basculinRedStriped": "적색근의 모습",
"basculinBlueStriped": "청색근의 모습",
"basculinWhiteStriped": "백색근의 모습",
"darumakaZen": "Zen",
"deerlingSpring": "봄의 모습",
"deerlingSummer": "여름의 모습",
"deerlingAutumn": "가을의 모습",
"deerlingWinter": "겨울의 모습",
"tornadusIncarnate": "화신폼",
"tornadusTherian": "Therian",
"thundurusIncarnate": "화신폼",
"thundurusTherian": "Therian",
"landorusIncarnate": "화신폼",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "평상시 모습",
"keldeoResolute": "Resolute",
"meloettaAria": "보이스폼",
"meloettaPirouette": "스텝폼",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "유대변화",
"scatterbugMeadow": "화원의 모양",
"scatterbugIcySnow": "빙설의 모양",
@ -100,6 +120,10 @@
"furfrouLaReine": "퀸컷",
"furfrouKabuki": "가부키컷",
"furfrouPharaoh": "킹덤컷",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "작은 사이즈",
"pumpkabooLarge": "큰 사이즈",
"pumpkabooSuper": "특대 사이즈",
@ -110,11 +134,34 @@
"zygarde50Pc": "스웜체인지 50%폼",
"zygarde10Pc": "스웜체인지 10%폼",
"zygardeComplete": "퍼펙트폼",
"hoopaUnbound": "Unbound",
"oricorioBaile": "이글이글스타일",
"oricorioPompom": "파칙파칙스타일",
"oricorioPau": "훌라훌라스타일",
"oricorioSensu": "하늘하늘스타일",
"rockruffOwnTempo": "마이페이스",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "유성의 모습(빨강)",
"miniorOrangeMeteor": "유성의 모습(주황)",
"miniorYellowMeteor": "유성의 모습(노랑)",
@ -131,25 +178,55 @@
"miniorViolet": "보라색 코어",
"mimikyuDisguised": "둔갑한 모습",
"mimikyuBusted": "들킨 모습",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "500년 전의 색",
"marshadowZenith": "투지를 불태운 마샤도",
"sinisteaPhony": "위작품",
"sinisteaAntique": "진작품",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "나이스페이스",
"indeedeeMale": "수컷의 모습",
"indeedeeFemale": "암컷의 모습",
"morpekoFullBelly": "배부른 모양",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "역전의 용사",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "역전의 용사",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "아빠",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "화신폼",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "그린 페더",
"squawkabillyBluePlumage": "블루 페더",
"squawkabillyYellowPlumage": "옐로 페더",
"squawkabillyWhitePlumage": "화이트 페더",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "젖힌 모습",
"tatsugiriDroopy": "늘어진 모습",
"tatsugiriStretchy": "뻗은 모습",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "상자폼",
"gimmighoulRoaming": "도보폼",
"koraidonApexBuild": "완전형태",
@ -164,6 +241,19 @@
"miraidonGlideMode": "글라이드모드",
"poltchageistCounterfeit": "가짜배기의 모습",
"poltchageistArtisan": "알짜배기의 모습",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "컴뱃종",
"paldeaTaurosBlaze": "블레이즈종",
"paldeaTaurosAqua": "워터종"

View File

@ -40,9 +40,14 @@
"castformRainy": "Chuvoso",
"castformSnowy": "Nevado",
"deoxysNormal": "Normal",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "Vegetal",
"burmySandy": "Arenoso",
"burmyTrash": "Lixo",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "Leste",
"shellosWest": "Oeste",
"rotomHeat": "Calor",
@ -50,21 +55,36 @@
"rotomFrost": "Congelante",
"rotomFan": "Ventilador",
"rotomMow": "Corte",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "Alterado",
"giratinaOrigin": "Origin",
"shayminLand": "Terrestre",
"shayminSky": "Sky",
"basculinRedStriped": "Listras Vermelhas",
"basculinBlueStriped": "Listras Azuis",
"basculinWhiteStriped": "Listras Brancas",
"darumakaZen": "Zen",
"deerlingSpring": "Primavera",
"deerlingSummer": "Verão",
"deerlingAutumn": "Outono",
"deerlingWinter": "Inverno",
"tornadusIncarnate": "Materializado",
"tornadusTherian": "Therian",
"thundurusIncarnate": "Materializado",
"thundurusTherian": "Therian",
"landorusIncarnate": "Materializado",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "Comum",
"keldeoResolute": "Resolute",
"meloettaAria": "Ária",
"meloettaPirouette": "Pirueta",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "Vínculo de Batalha",
"scatterbugMeadow": "Prado",
"scatterbugIcySnow": "Neve Congelada",
@ -100,6 +120,10 @@
"furfrouLaReine": "Aristocrático",
"furfrouKabuki": "Kabuki",
"furfrouPharaoh": "Faraó",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "Pequeno",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Extragrande",
@ -110,11 +134,34 @@
"zygarde50Pc": "Forma 50% Agrupada",
"zygarde10Pc": "Forma 10% Agrupada",
"zygardeComplete": "Forma Completa",
"hoopaUnbound": "Unbound",
"oricorioBaile": "Flamenco",
"oricorioPompom": "Pompom",
"oricorioPau": "Hula",
"oricorioSensu": "Leque",
"rockruffOwnTempo": "Próprio Tempo",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "Meteoro Vermelho",
"miniorOrangeMeteor": "Meteoro Laranja",
"miniorYellowMeteor": "Meteoro Amarelo",
@ -131,25 +178,55 @@
"miniorViolet": "Violeta",
"mimikyuDisguised": "Disfarçado",
"mimikyuBusted": "Descoberto",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "Original",
"marshadowZenith": "Zênite",
"sinisteaPhony": "Falsificado",
"sinisteaAntique": "Autêntico",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "Descongelado",
"indeedeeMale": "Macho",
"indeedeeFemale": "Fêmea",
"morpekoFullBelly": "Saciado",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "Herói Veterano",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "Herói Veterano",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "Papa",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "Materializado",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "Plumas Verdes",
"squawkabillyBluePlumage": "Plumas Azuis",
"squawkabillyYellowPlumage": "Plumas Amarelas",
"squawkabillyWhitePlumage": "Plumas Brancas",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "Curvado",
"tatsugiriDroopy": "Caído",
"tatsugiriStretchy": "Reto",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "Baú",
"gimmighoulRoaming": "Perambulante",
"koraidonApexBuild": "Forma Plena",
@ -164,6 +241,19 @@
"miraidonGlideMode": "Modo Aéreo",
"poltchageistCounterfeit": "Imitação",
"poltchageistArtisan": "Artesão",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combate",
"paldeaTaurosBlaze": "Chamas",
"paldeaTaurosAqua": "Aquático"

View File

@ -40,9 +40,14 @@
"castformRainy": "雨天",
"castformSnowy": "雪天",
"deoxysNormal": "普通",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "草木蓑衣",
"burmySandy": "砂土蓑衣",
"burmyTrash": "垃圾蓑衣",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "东海",
"shellosWest": "西海",
"rotomHeat": "加热",
@ -50,21 +55,36 @@
"rotomFrost": "结冰",
"rotomFan": "旋转",
"rotomMow": "切割",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "别种",
"giratinaOrigin": "Origin",
"shayminLand": "陆上",
"shayminSky": "Sky",
"basculinRedStriped": "红条纹",
"basculinBlueStriped": "蓝条纹",
"basculinWhiteStriped": "白条纹",
"darumakaZen": "Zen",
"deerlingSpring": "春天",
"deerlingSummer": "夏天",
"deerlingAutumn": "秋天",
"deerlingWinter": "冬天",
"tornadusIncarnate": "化身",
"tornadusTherian": "Therian",
"thundurusIncarnate": "化身",
"thundurusTherian": "Therian",
"landorusIncarnate": "化身",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "通常",
"keldeoResolute": "Resolute",
"meloettaAria": "歌声",
"meloettaPirouette": "舞步形态",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "牵绊变身",
"scatterbugMeadow": "花园花纹",
"scatterbugIcySnow": "冰雪花纹",
@ -100,6 +120,10 @@
"furfrouLaReine": "女王造型",
"furfrouKabuki": "歌舞伎造型",
"furfrouPharaoh": "国王造型",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "小尺寸",
"pumpkabooLarge": "大尺寸",
"pumpkabooSuper": "特大尺寸",
@ -110,11 +134,34 @@
"zygarde50Pc": "50%形态 群聚变形",
"zygarde10Pc": "10%形态 群聚变形",
"zygardeComplete": "完全体形态",
"hoopaUnbound": "Unbound",
"oricorioBaile": "热辣热辣风格",
"oricorioPompom": "啪滋啪滋风格",
"oricorioPau": "呼拉呼拉风格",
"oricorioSensu": "轻盈轻盈风格",
"rockruffOwnTempo": "特殊岩狗狗",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "红色核心",
"miniorOrangeMeteor": "橙色核心",
"miniorYellowMeteor": "黄色核心",
@ -131,25 +178,55 @@
"miniorViolet": "紫色",
"mimikyuDisguised": "化形",
"mimikyuBusted": "现形",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "500年前的颜色",
"marshadowZenith": "全力",
"sinisteaPhony": "赝品",
"sinisteaAntique": "真品",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "解冻头",
"indeedeeMale": "雄性",
"indeedeeFemale": "雌性",
"morpekoFullBelly": "满腹花纹",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "百战勇者",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "百战勇者",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "老爹",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "化身",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "绿羽毛",
"squawkabillyBluePlumage": "蓝羽毛",
"squawkabillyYellowPlumage": "黄羽毛",
"squawkabillyWhitePlumage": "白羽毛",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "上弓姿势",
"tatsugiriDroopy": "下垂姿势",
"tatsugiriStretchy": "平挺姿势",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "宝箱形态",
"gimmighoulRoaming": "徒步形态",
"koraidonApexBuild": "顶尖形态",
@ -164,6 +241,19 @@
"miraidonGlideMode": "滑翔模式",
"poltchageistCounterfeit": "冒牌货",
"poltchageistArtisan": "高档货",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "斗战种",
"paldeaTaurosBlaze": "火炽种",
"paldeaTaurosAqua": "水澜种"

View File

@ -40,9 +40,14 @@
"castformRainy": "雨天",
"castformSnowy": "雪天",
"deoxysNormal": "普通",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "草木蓑衣",
"burmySandy": "砂土蓑衣",
"burmyTrash": "垃圾蓑衣",
"cheribiOvercast": "Overcast",
"cheribiSunshine": "Sunshine",
"shellosEast": "東海",
"shellosWest": "西海",
"rotomHeat": "加熱",
@ -50,21 +55,36 @@
"rotomFrost": "結冰",
"rotomFan": "旋轉",
"rotomMow": "切割",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "別種",
"giratinaOrigin": "Origin",
"shayminLand": "陸上",
"shayminSky": "Sky",
"basculinRedStriped": "紅條紋",
"basculinBlueStriped": "藍條紋",
"basculinWhiteStriped": "白條紋",
"darumakaZen": "Zen",
"deerlingSpring": "春天",
"deerlingSummer": "夏天",
"deerlingAutumn": "秋天",
"deerlingWinter": "冬天",
"tornadusIncarnate": "化身",
"tornadusTherian": "Therian",
"thundurusIncarnate": "化身",
"thundurusTherian": "Therian",
"landorusIncarnate": "化身",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "通常",
"keldeoResolute": "Resolute",
"meloettaAria": "歌聲",
"meloettaPirouette": "舞步形態",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakieBattleBond": "牽絆變身",
"scatterbugMeadow": "花園花紋",
"scatterbugIcySnow": "冰雪花紋",
@ -100,6 +120,10 @@
"furfrouLaReine": "女王造型",
"furfrouKabuki": "歌舞伎造型",
"furfrouPharaoh": "國王造型",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "小尺寸",
"pumpkabooLarge": "大尺寸",
"pumpkabooSuper": "特大尺寸",
@ -110,11 +134,34 @@
"zygarde50Pc": "50%形態 群聚變形",
"zygarde10Pc": "10%形態 群聚變形",
"zygardeComplete": "完全體形態",
"hoopaUnbound": "Unbound",
"oricorioBaile": "熱辣熱辣風格",
"oricorioPompom": "啪滋啪滋風格",
"oricorioPau": "呼拉呼拉風格",
"oricorioSensu": "輕盈輕盈風格",
"rockruffOwnTempo": "特殊岩狗狗",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "紅色核心",
"miniorOrangeMeteor": "橙色核心",
"miniorYellowMeteor": "黃色核心",
@ -131,25 +178,55 @@
"miniorViolet": "紫色",
"mimikyuDisguised": "化形",
"mimikyuBusted": "現形",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearnaOriginal": "500年前的顔色",
"marshadowZenith": "全力",
"sinisteaPhony": "赝品",
"sinisteaAntique": "真品",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscueNoIce": "解凍頭",
"indeedeeMale": "雄性",
"indeedeeFemale": "雌性",
"morpekoFullBelly": "滿腹花紋",
"morpekoHangry": "Hangry",
"zacianHeroOfManyBattles": "百戰勇者",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "百戰勇者",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarudeDada": "老爹",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "化身",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"squawkabillyGreenPlumage": "綠羽毛",
"squawkabillyBluePlumage": "藍羽毛",
"squawkabillyYellowPlumage": "黃羽毛",
"squawkabillyWhitePlumage": "白羽毛",
"finizenZero": "Zero",
"finizenZero": "Hero",
"tatsugiriCurly": "上弓姿勢",
"tatsugiriDroopy": "下垂姿勢",
"tatsugiriStretchy": "平挺姿勢",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "寶箱形態",
"gimmighoulRoaming": "徒步形態",
"koraidonApexBuild": "頂尖形態",
@ -164,6 +241,19 @@
"miraidonGlideMode":"滑翔模式",
"poltchageistCounterfeit": "冒牌貨",
"poltchageistArtisan": "高檔貨",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "鬥戰種",
"paldeaTaurosBlaze": "火熾種",
"paldeaTaurosAqua": "水瀾種"

View File

@ -4,7 +4,7 @@ import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr,
import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag";
import { MoveAnim } from "#app/data/battle-anims";
import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag } from "#app/data/battler-tags";
import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move";
import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, DealsDoubleDamageToTagAttr } from "#app/data/move";
import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { Moves } from "#app/enums/moves";
@ -394,7 +394,7 @@ export class MoveEffectPhase extends PokemonPhase {
}
const semiInvulnerableTag = target.getTag(SemiInvulnerableTag);
if (semiInvulnerableTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)) {
if (semiInvulnerableTag && !this.move.getMove().getAttrs(DealsDoubleDamageToTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType)) {
return false;
}

View File

@ -6,7 +6,7 @@ import Pokemon from "#app/field/pokemon";
import { getPokemonNameWithAffix } from "#app/messages";
import { ResetNegativeStatStageModifier } from "#app/modifier/modifier";
import { handleTutorial, Tutorial } from "#app/tutorial";
import * as Utils from "#app/utils";
import { NumberHolder, BooleanHolder } from "#app/utils";
import i18next from "i18next";
import { PokemonPhase } from "./pokemon-phase";
import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } from "#enums/stat";
@ -42,17 +42,23 @@ export class StatStageChangePhase extends PokemonPhase {
return this.end();
}
const stages = new NumberHolder(this.stages);
if (!this.ignoreAbilities) {
applyAbAttrs(StatStageChangeMultiplierAbAttr, pokemon, null, false, stages);
}
let simulate = false;
const filteredStats = this.stats.filter(stat => {
const cancelled = new Utils.BooleanHolder(false);
const cancelled = new BooleanHolder(false);
if (!this.selfTarget && this.stages < 0) {
if (!this.selfTarget && stages.value < 0) {
// TODO: Include simulate boolean when tag applications can be simulated
this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, cancelled);
}
if (!cancelled.value && !this.selfTarget && this.stages < 0) {
if (!cancelled.value && !this.selfTarget && stages.value < 0) {
applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate);
}
@ -64,12 +70,6 @@ export class StatStageChangePhase extends PokemonPhase {
return !cancelled.value;
});
const stages = new Utils.IntegerHolder(this.stages);
if (!this.ignoreAbilities) {
applyAbAttrs(StatStageChangeMultiplierAbAttr, pokemon, null, false, stages);
}
const relLevels = filteredStats.map(s => (stages.value >= 1 ? Math.min(pokemon.getStatStage(s) + stages.value, 6) : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s));
this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels);

View File

@ -31,7 +31,7 @@ describe("Abilities - Contrary", () => {
});
it("should invert stat changes when applied", async() => {
await game.startBattle([
await game.classicMode.startBattle([
Species.SLOWBRO
]);
@ -39,4 +39,39 @@ describe("Abilities - Contrary", () => {
expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
}, 20000);
describe("With Clear Body", () => {
it("should apply positive effects", async () => {
game.override
.enemyPassiveAbility(Abilities.CLEAR_BODY)
.moveset([Moves.TAIL_WHIP]);
await game.classicMode.startBattle([Species.SLOWBRO]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
game.move.select(Moves.TAIL_WHIP);
await game.phaseInterceptor.to("TurnEndPhase");
expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(1);
});
it("should block negative effects", async () => {
game.override
.enemyPassiveAbility(Abilities.CLEAR_BODY)
.enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL])
.moveset([Moves.SPLASH]);
await game.classicMode.startBattle([Species.SLOWBRO]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to("TurnEndPhase");
expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
});
});
});

View File

@ -0,0 +1,58 @@
import { BattlerIndex } from "#app/battle";
import { allMoves } from "#app/data/move";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { DamageCalculationResult } from "#app/field/pokemon";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Moves - Steamroller", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override.moveset([Moves.STEAMROLLER]).battleType("single").enemyAbility(Abilities.BALL_FETCH);
});
it("should always hit a minimzed target with double damage", async () => {
game.override.enemySpecies(Species.DITTO).enemyMoveset(Moves.MINIMIZE);
await game.classicMode.startBattle([Species.IRON_BOULDER]);
const ditto = game.scene.getEnemyPokemon()!;
vi.spyOn(ditto, "getAttackDamage");
ditto.hp = 5000;
const steamroller = allMoves[Moves.STEAMROLLER];
vi.spyOn(steamroller, "calculateBattleAccuracy");
const ironBoulder = game.scene.getPlayerPokemon()!;
vi.spyOn(ironBoulder, "getAccuracyMultiplier");
// Turn 1
game.move.select(Moves.STEAMROLLER);
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.toNextTurn();
// Turn 2
game.move.select(Moves.STEAMROLLER);
await game.toNextTurn();
const [dmgCalcTurn1, dmgCalcTurn2]: DamageCalculationResult[] = vi
.mocked(ditto.getAttackDamage)
.mock.results.map((r) => r.value);
expect(dmgCalcTurn2.damage).toBeGreaterThanOrEqual(dmgCalcTurn1.damage * 2);
expect(ditto.getTag(BattlerTagType.MINIMIZED)).toBeDefined();
expect(steamroller.calculateBattleAccuracy).toHaveReturnedWith(-1);
});
});

View File

@ -0,0 +1,53 @@
import { BattlerIndex } from "#app/battle";
import { allMoves } from "#app/data/move";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest";
describe("Moves - Whirlwind", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.WHIRLWIND)
.enemySpecies(Species.PIDGEY);
});
it.each([
{ move: Moves.FLY, name: "Fly" },
{ move: Moves.BOUNCE, name: "Bounce" },
{ move: Moves.SKY_DROP, name: "Sky Drop" },
])("should not hit a flying target: $name (=$move)", async ({ move }) => {
game.override.moveset([move]);
await game.classicMode.startBattle([Species.STARAPTOR]);
const staraptor = game.scene.getPlayerPokemon()!;
const whirlwind = allMoves[Moves.WHIRLWIND];
vi.spyOn(whirlwind, "getFailedText");
game.move.select(move);
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.toNextTurn();
expect(staraptor.findTag((t) => t.tagType === BattlerTagType.FLYING)).toBeDefined();
expect(whirlwind.getFailedText).toHaveBeenCalledOnce();
});
});

View File

@ -162,7 +162,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains);
this.add(this.splicedIcon);
this.statusIndicator = this.scene.add.sprite(0, 0, `statuses_${i18next.resolvedLanguage}`);
this.statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses"));
this.statusIndicator.setName("icon_status");
this.statusIndicator.setVisible(false);
this.statusIndicator.setOrigin(0, 0);

View File

@ -91,7 +91,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
valuesBg.setOrigin(0, 0);
this.val.add(valuesBg);
this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, "unknown");
this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, Utils.getLocalizedSpriteKey("types"), "unknown");
this.typ.setScale(0.8);
this.val.add(this.typ);
@ -138,7 +138,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
this.pow.setText(move.power >= 0 ? move.power.toString() : "---");
this.acc.setText(move.accuracy >= 0 ? move.accuracy.toString() : "---");
this.pp.setText(move.pp >= 0 ? move.pp.toString() : "---");
this.typ.setTexture(`types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[move.type].toLowerCase());
this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), Type[move.type].toLowerCase());
this.cat.setFrame(MoveCategory[move.category].toLowerCase());
this.desc.setText(move?.effect || "");

View File

@ -1272,7 +1272,7 @@ class PartySlot extends Phaser.GameObjects.Container {
}
if (this.pokemon.status) {
const statusIndicator = this.scene.add.sprite(0, 0, `statuses_${i18next.resolvedLanguage}`);
const statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses"));
statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase());
statusIndicator.setOrigin(0, 0);
statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0);

View File

@ -214,7 +214,7 @@ export default class SummaryUiHandler extends UiHandler {
this.statusContainer.add(statusLabel);
this.status = this.scene.add.sprite(91, 4, `statuses_${i18next.resolvedLanguage}`);
this.status = this.scene.add.sprite(91, 4, Utils.getLocalizedSpriteKey("statuses"));
this.status.setOrigin(0.5, 0);
this.statusContainer.add(this.status);

View File

@ -1,4 +1,5 @@
import { MoneyFormat } from "#enums/money-format";
import { Moves } from "#enums/moves";
import i18next from "i18next";
export const MissingTextureKey = "__MISSING";
@ -628,3 +629,12 @@ export function getLocalizedSpriteKey(baseKey: string) {
export function isBetween(num: number, min: number, max: number): boolean {
return num >= min && num <= max;
}
/**
* Helper method to return the animation filename for a given move
*
* @param move the move for which the animation filename is needed
*/
export function animationFileName(move: Moves): string {
return Moves[move].toLowerCase().replace(/\_/g, "-");
}