From 63fafe6a2d892f1c43271511cd3c6d7838104330 Mon Sep 17 00:00:00 2001 From: AJ Fontaine Date: Tue, 6 Aug 2024 22:24:59 -0400 Subject: [PATCH 1/2] Added Wonder Room --- src/data/arena-tag.ts | 27 +++++++++++++++++++++++++++ src/data/move.ts | 3 ++- src/enums/arena-tag-type.ts | 3 ++- src/field/pokemon.ts | 13 ++++++++++++- src/locales/de/arena-flyout.ts | 1 + src/locales/de/arena-tag.ts | 2 ++ src/locales/en/arena-flyout.ts | 1 + src/locales/en/arena-tag.ts | 2 ++ src/locales/es/arena-flyout.ts | 1 + src/locales/es/arena-tag.ts | 2 ++ src/locales/fr/arena-flyout.ts | 1 + src/locales/fr/arena-tag.ts | 2 ++ src/locales/it/arena-flyout.ts | 1 + src/locales/it/arena-tag.ts | 2 ++ src/locales/ko/arena-flyout.ts | 1 + src/locales/ko/arena-tag.ts | 2 ++ src/locales/pt_BR/arena-flyout.ts | 1 + src/locales/pt_BR/arena-tag.ts | 2 ++ src/locales/zh_CN/arena-flyout.ts | 1 + src/locales/zh_CN/arena-tag.ts | 2 ++ src/locales/zh_TW/arena-flyout.ts | 1 + src/locales/zh_TW/arena-tag.ts | 2 ++ 22 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index fd72ab210266..772a4115488e 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -710,6 +710,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 @@ -834,5 +859,7 @@ 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); } } diff --git a/src/data/move.ts b/src/data/move.ts index 8ddc984e3048..56ab5043f7aa 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7358,9 +7358,10 @@ export function initMoves() { new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) .unimplemented(), 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 722096c42cd4..b206827d387d 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -21,5 +21,6 @@ export enum ArenaTagType { MAT_BLOCK = "MAT_BLOCK", CRAFTY_SHIELD = "CRAFTY_SHIELD", TAILWIND = "TAILWIND", - HAPPY_HOUR = "HAPPY_HOUR" + HAPPY_HOUR = "HAPPY_HOUR", + WONDER_ROOM = "WONDER_ROOM" } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 7fc5f14d0e11..1ba512558200 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -690,7 +690,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.isPlayer()) { this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel); } - const statValue = new Utils.NumberHolder(this.getStat(stat)); + const statValue = new Utils.NumberHolder(1); + const wonderRoom = new Utils.BooleanHolder(false); + this.scene.arena.applyTags(ArenaTagType.WONDER_ROOM, wonderRoom); + if (wonderRoom.value) { + if (stat === Stat.DEF) { + statValue.value = this.getStat(Stat.SPDEF); + } else if (stat === Stat.SPDEF) { + statValue.value = this.getStat(Stat.DEF); + } + } else { + statValue.value = this.getStat(stat); + } this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); const fieldApplied = new Utils.BooleanHolder(false); diff --git a/src/locales/de/arena-flyout.ts b/src/locales/de/arena-flyout.ts index c353b432bc01..134e87e128a3 100644 --- a/src/locales/de/arena-flyout.ts +++ b/src/locales/de/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Tarnsteine", "stickyWeb": "Klebenetz", "trickRoom": "Bizarroraum", + "wonderRoom": "Wunderraum", "gravity": "Erdanziehung", "reflect": "Reflektor", "lightScreen": "Lichtschild", diff --git a/src/locales/de/arena-tag.ts b/src/locales/de/arena-tag.ts index cc0a821aadea..723d4080fc8f 100644 --- a/src/locales/de/arena-tag.ts +++ b/src/locales/de/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "{{pokemonName}} ist im Klebenetz gefangen!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} hat die Dimensionen verdreht!", "trickRoomOnRemove": "Die verdrehte Dimension ist wieder normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "Die Erdanziehung wurde verstärkt!", "gravityOnRemove": "Die Erdanziehung ist wieder normal!", "tailwindOnAdd": "Die Pokémon erhalten Rückenwind!", diff --git a/src/locales/en/arena-flyout.ts b/src/locales/en/arena-flyout.ts index 8a31d37b10c9..57b33b0a10c1 100644 --- a/src/locales/en/arena-flyout.ts +++ b/src/locales/en/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Stealth Rock", "stickyWeb": "Sticky Web", "trickRoom": "Trick Room", + "wonderRoom": "Wonder Room", "gravity": "Gravity", "reflect": "Reflect", "lightScreen": "Light Screen", diff --git a/src/locales/en/arena-tag.ts b/src/locales/en/arena-tag.ts index 8bc2302368ab..8f92a1a75b33 100644 --- a/src/locales/en/arena-tag.ts +++ b/src/locales/en/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "Gravity intensified!", "gravityOnRemove": "Gravity returned to normal!", "tailwindOnAdd": "The Tailwind blew from behind team!", diff --git a/src/locales/es/arena-flyout.ts b/src/locales/es/arena-flyout.ts index 376b737811fd..346ee262840d 100644 --- a/src/locales/es/arena-flyout.ts +++ b/src/locales/es/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Trampa Rocas", "stickyWeb": "Red Vidcosa", "trickRoom": "Espacio Raro", + "wonderRoom": "Wonder Room", "gravity": "Gravedad", "reflect": "Reflejo", "lightScreen": "Pantalla de Luz", diff --git a/src/locales/es/arena-tag.ts b/src/locales/es/arena-tag.ts index 8bc2302368ab..8f92a1a75b33 100644 --- a/src/locales/es/arena-tag.ts +++ b/src/locales/es/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "Gravity intensified!", "gravityOnRemove": "Gravity returned to normal!", "tailwindOnAdd": "The Tailwind blew from behind team!", diff --git a/src/locales/fr/arena-flyout.ts b/src/locales/fr/arena-flyout.ts index cf412e3b6710..2b5a9325af1d 100644 --- a/src/locales/fr/arena-flyout.ts +++ b/src/locales/fr/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Piège de Roc", "stickyWeb": "Toile Gluante", "trickRoom": "Distorsion", + "wonderRoom": "Wonder Room", "gravity": "Gravité", "reflect": "Protection", "lightScreen": "Mur Lumière", diff --git a/src/locales/fr/arena-tag.ts b/src/locales/fr/arena-tag.ts index cc97cb4e34f0..7e5a43303bbd 100644 --- a/src/locales/fr/arena-tag.ts +++ b/src/locales/fr/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "{{pokemonName}} ennemi\nest pris dans la toile gluante !", "trickRoomOnAdd": "{{pokemonNameWithAffix}}\nfausse les dimensions !", "trickRoomOnRemove": "Les dimensions faussées\nreviennent à la normale !", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "La gravité s’intensifie !", "gravityOnRemove": "La gravité est revenue à la normale !", "tailwindOnAdd": "Un vent arrière souffle !", diff --git a/src/locales/it/arena-flyout.ts b/src/locales/it/arena-flyout.ts index 9e1e55226ea0..4fbc8432e1d5 100644 --- a/src/locales/it/arena-flyout.ts +++ b/src/locales/it/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Levitoroccia", "stickyWeb": "Rete Vischiosa", "trickRoom": "Distortozona", + "wonderRoom": "Wonder Room", "gravity": "Gravità", "reflect": "Riflesso", "lightScreen": "Schermoluce", diff --git a/src/locales/it/arena-tag.ts b/src/locales/it/arena-tag.ts index 8bc2302368ab..8f92a1a75b33 100644 --- a/src/locales/it/arena-tag.ts +++ b/src/locales/it/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "Gravity intensified!", "gravityOnRemove": "Gravity returned to normal!", "tailwindOnAdd": "The Tailwind blew from behind team!", diff --git a/src/locales/ko/arena-flyout.ts b/src/locales/ko/arena-flyout.ts index 33d9596af2c4..065447d9e18f 100644 --- a/src/locales/ko/arena-flyout.ts +++ b/src/locales/ko/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "스텔스록", "stickyWeb": "끈적끈적네트", "trickRoom": "트릭룸", + "wonderRoom": "Wonder Room", "gravity": "중력", "reflect": "리플렉터", "lightScreen": "빛의장막", diff --git a/src/locales/ko/arena-tag.ts b/src/locales/ko/arena-tag.ts index ca1039e2bc0e..3fca5c5eb001 100644 --- a/src/locales/ko/arena-tag.ts +++ b/src/locales/ko/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "{{pokemonName}}[[는]]\n끈적끈적네트에 걸렸다!", "trickRoomOnAdd": "{{pokemonNameWithAffix}}[[는]]\n시공을 뒤틀었다!", "trickRoomOnRemove": "뒤틀린 시공이 원래대로 되돌아왔다!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "중력이 강해졌다!", "gravityOnRemove": "중력이 원래대로 되돌아왔다!", "tailwindOnAdd": "순풍이 불기 시작했다!", diff --git a/src/locales/pt_BR/arena-flyout.ts b/src/locales/pt_BR/arena-flyout.ts index 97382aa2b2f8..93aabb63d743 100644 --- a/src/locales/pt_BR/arena-flyout.ts +++ b/src/locales/pt_BR/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Stealth Rock", "stickyWeb": "Sticky Web", "trickRoom": "Trick Room", + "wonderRoom": "Wonder Room", "gravity": "Gravity", "reflect": "Reflect", "lightScreen": "Light Screen", diff --git a/src/locales/pt_BR/arena-tag.ts b/src/locales/pt_BR/arena-tag.ts index 0d3b8ff587fb..cefd81513afb 100644 --- a/src/locales/pt_BR/arena-tag.ts +++ b/src/locales/pt_BR/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "{{pokemonName}} adversário foi pego por uma Sticky Web!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} distorceu\nas dimensões!", "trickRoomOnRemove": "As dimensões distorcidas\nretornaram ao normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "A gravidade aumentou!", "gravityOnRemove": "A gravidade retornou ao normal!", "tailwindOnAdd": "O Tailwind soprou de trás de sua equipe!", diff --git a/src/locales/zh_CN/arena-flyout.ts b/src/locales/zh_CN/arena-flyout.ts index e30642e7d213..8d85450d3226 100644 --- a/src/locales/zh_CN/arena-flyout.ts +++ b/src/locales/zh_CN/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "隐形岩", "stickyWeb": "黏黏网", "trickRoom": "戏法空间", + "wonderRoom": "Wonder Room", "gravity": "重力", "reflect": "反射壁", "lightScreen": "光墙", diff --git a/src/locales/zh_CN/arena-tag.ts b/src/locales/zh_CN/arena-tag.ts index 027a56674153..cf057d066d59 100644 --- a/src/locales/zh_CN/arena-tag.ts +++ b/src/locales/zh_CN/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "{{pokemonName}}\n被黏黏网粘住了!", "trickRoomOnAdd": "{{pokemonNameWithAffix}}\n扭曲了时空!", "trickRoomOnRemove": "扭曲的时空复原了!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "重力变强了!", "gravityOnRemove": "重力复原了!", "tailwindOnAdd": "从身后\n吹起了顺风!", diff --git a/src/locales/zh_TW/arena-flyout.ts b/src/locales/zh_TW/arena-flyout.ts index 8a31d37b10c9..57b33b0a10c1 100644 --- a/src/locales/zh_TW/arena-flyout.ts +++ b/src/locales/zh_TW/arena-flyout.ts @@ -36,6 +36,7 @@ export const arenaFlyout: SimpleTranslationEntries = { "stealthRock": "Stealth Rock", "stickyWeb": "Sticky Web", "trickRoom": "Trick Room", + "wonderRoom": "Wonder Room", "gravity": "Gravity", "reflect": "Reflect", "lightScreen": "Light Screen", diff --git a/src/locales/zh_TW/arena-tag.ts b/src/locales/zh_TW/arena-tag.ts index 8bc2302368ab..8f92a1a75b33 100644 --- a/src/locales/zh_TW/arena-tag.ts +++ b/src/locales/zh_TW/arena-tag.ts @@ -37,6 +37,8 @@ export const arenaTag: SimpleTranslationEntries = { "stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!", "trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!", "trickRoomOnRemove": "The twisted dimensions\nreturned to normal!", + "wonderRoomOnAdd": "It created a bizarre area in which the\nDefense and Special Defense stats are swapped!", + "wonderRoomOnRemove": "The Defense and Special Defense stats\nhave returned to normal!", "gravityOnAdd": "Gravity intensified!", "gravityOnRemove": "Gravity returned to normal!", "tailwindOnAdd": "The Tailwind blew from behind team!", From 8b3a9f908c165ef167f6fba361e79549363e96be Mon Sep 17 00:00:00 2001 From: AJ Fontaine Date: Wed, 25 Sep 2024 15:58:59 -0400 Subject: [PATCH 2/2] Post stat rework --- src/field/pokemon.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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; } /**