diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index fdc32b75c196..96a40cae536d 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -824,6 +824,31 @@ export class TrickRoomTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Room_(move) Wonder Room}. + * Swaps the Defense and Special Defense stats for all Pokémon on the field as long as this arena tag is up, + * also reversing the turn order for all Pokémon on the field as well. + */ +export class WonderRoomTag extends ArenaTag { + constructor(turnCount: integer) { + super(ArenaTagType.WONDER_ROOM, turnCount, Moves.WONDER_ROOM); + } + + apply(arena: Arena, args: any[]): boolean { + const isWonderRoom = args[0] as Utils.BooleanHolder; + isWonderRoom.value = !isWonderRoom.value; + return true; + } + + onAdd(arena: Arena): void { + arena.scene.queueMessage(i18next.t("arenaTag:wonderRoomOnAdd")); + } + + onRemove(arena: Arena): void { + arena.scene.queueMessage(i18next.t("arenaTag:wonderRoomOnRemove")); + } +} + /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}. * Grounds all Pokémon on the field, including Flying-types and those with @@ -965,6 +990,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new TailwindTag(turnCount, sourceId, side); case ArenaTagType.HAPPY_HOUR: return new HappyHourTag(turnCount, sourceId, side); + case ArenaTagType.WONDER_ROOM: + return new WonderRoomTag(turnCount); case ArenaTagType.SAFEGUARD: return new SafeguardTag(turnCount, sourceId, side); default: diff --git a/src/data/move.ts b/src/data/move.ts index 8866e86f708a..0ba5b93ff43d 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8100,9 +8100,10 @@ export function initMoves() { new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) .attr(AverageStatsAttr, [ Stat.ATK, Stat.SPATK ], "moveTriggers:sharedPower"), new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) + .attr(AddArenaTagAttr, ArenaTagType.WONDER_ROOM, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) - .unimplemented(), + .partial(), new AttackMove(Moves.PSYSHOCK, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(DefDefAttr), new AttackMove(Moves.VENOSHOCK, Type.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 1c79750c91ab..921351742959 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -23,5 +23,6 @@ export enum ArenaTagType { TAILWIND = "TAILWIND", HAPPY_HOUR = "HAPPY_HOUR", SAFEGUARD = "SAFEGUARD", - NO_CRIT = "NO_CRIT" + NO_CRIT = "NO_CRIT", + WONDER_ROOM = "WONDER_ROOM" } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 14f938094149..d6788c343a30 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -19,7 +19,7 @@ import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEv import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; -import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; +import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag, WonderRoomTag } from "../data/arena-tag"; import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; @@ -769,7 +769,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!bypassSummonData && this.summonData?.stats) { return this.summonData.stats; } - return this.stats; + const isWonderRoom = new Utils.BooleanHolder(false); + this.scene.arena.applyTags(WonderRoomTag, isWonderRoom); + return isWonderRoom.value + ? [this.stats[Stat.HP], this.stats[Stat.ATK], this.stats[Stat.SPDEF], this.stats[Stat.SPATK], this.stats[Stat.DEF], this.stats[Stat.SPD]] + : this.stats; } /**