diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 7e895dc483f..10d4cfaad38 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1027,6 +1027,47 @@ class FireGrassPledgeTag extends ArenaTag { } } +/** + * Arena Tag implementing the "rainbow" effect from the combination + * of {@link https://bulbapedia.bulbagarden.net/wiki/Water_Pledge_(move) | Water Pledge} + * and {@link https://bulbapedia.bulbagarden.net/wiki/Fire_Pledge_(move) | Fire Pledge}. + * Doubles the secondary effect chance of moves from Pokemon on the + * given side of the field for 4 turns. + */ +class WaterFirePledgeTag extends ArenaTag { + constructor(sourceId: number, side: ArenaTagSide) { + super(ArenaTagType.WATER_FIRE_PLEDGE, 4, Moves.WATER_PLEDGE, sourceId, side); + } + + override onAdd(arena: Arena): void { + // "A rainbow appeared in the sky on your/the opposing team's side!" + arena.scene.queueMessage(i18next.t(`arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + } + + override apply(arena: Arena, args: any[]): boolean { + const moveChance = args[0] as Utils.NumberHolder; + moveChance.value *= 2; + return true; + } +} + +/** + * Arena Tag implementing the "swamp" effect from the combination + * of {@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pledge_(move) | Grass Pledge} + * and {@link https://bulbapedia.bulbagarden.net/wiki/Water_Pledge_(move) | Water Pledge}. + * Quarters the Speed of Pokemon on the given side of the field for 4 turns. + */ +class GrassWaterPledgeTag extends ArenaTag { + constructor(sourceId: number, side: ArenaTagSide) { + super(ArenaTagType.GRASS_WATER_PLEDGE, 4, Moves.GRASS_PLEDGE, sourceId, side); + } + + override onAdd(arena: Arena): void { + // "A swamp enveloped your/the opposing team!" + arena.scene.queueMessage(i18next.t(`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + } +} + export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { switch (tagType) { case ArenaTagType.MIST: @@ -1078,6 +1119,10 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new ImprisonTag(sourceId, side); case ArenaTagType.FIRE_GRASS_PLEDGE: return new FireGrassPledgeTag(sourceId, side); + case ArenaTagType.WATER_FIRE_PLEDGE: + return new WaterFirePledgeTag(sourceId, side); + case ArenaTagType.GRASS_WATER_PLEDGE: + return new GrassWaterPledgeTag(sourceId, side); default: return null; } diff --git a/src/data/move.ts b/src/data/move.ts index d1bfa6c2ed0..a1c54f2b6ac 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1027,7 +1027,14 @@ export class MoveEffectAttr extends MoveAttr { */ getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { const moveChance = new Utils.NumberHolder(move.chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility); + + if (!move.hasAttr(FlinchAttr) || moveChance.value <= move.chance) { + const userSide = user.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + user.scene.arena.applyTagsForSide(ArenaTagType.WATER_FIRE_PLEDGE, userSide, moveChance); + } + if (!selfEffect) { applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance); } @@ -8437,20 +8444,24 @@ export function initMoves() { .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) .attr(CombinedPledgeStabBoostAttr) + .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.FIRE_PLEDGE, true) + .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.GRASS_PLEDGE) .attr(BypassRedirectAttr), // technically incorrect, should only bypass Storm Drain/Lightning Rod new AttackMove(Moves.FIRE_PLEDGE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) .attr(CombinedPledgeStabBoostAttr) - .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.GRASS_PLEDGE, false) + .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.GRASS_PLEDGE) + .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.WATER_PLEDGE, true) .attr(BypassRedirectAttr), // technically incorrect, should only bypass Storm Drain/Lightning Rod new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) .attr(CombinedPledgeStabBoostAttr) - .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.FIRE_PLEDGE, false) + .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.WATER_PLEDGE) + .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.FIRE_PLEDGE) .attr(BypassRedirectAttr), // technically incorrect, should only bypass Storm Drain/Lightning Rod new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) .attr(ForceSwitchOutAttr, true), diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 9085d68e077..6e31f8b85aa 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -920,11 +920,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case Stat.SPD: - // Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon - if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) - || (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY))) { + const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + if (this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { ret *= 2; } + if (this.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) { + ret /= 4; + } if (this.getTag(BattlerTagType.SLOW_START)) { ret >>= 1; diff --git a/src/locales/en/arena-tag.json b/src/locales/en/arena-tag.json index f812ab52cbc..72097c0b3c5 100644 --- a/src/locales/en/arena-tag.json +++ b/src/locales/en/arena-tag.json @@ -54,7 +54,14 @@ "safeguardOnRemove": "The field is no longer protected by Safeguard!", "safeguardOnRemovePlayer": "Your team is no longer protected by Safeguard!", "safeguardOnRemoveEnemy": "The opposing team is no longer protected by Safeguard!", + "fireGrassPledgeOnAdd": "A sea of fire enveloped the field!", "fireGrassPledgeOnAddPlayer": "A sea of fire enveloped your team!", "fireGrassPledgeOnAddEnemy": "A sea of fire enveloped the opposing team!", - "fireGrassPledgeLapse": "{{pokemonNameWithAffix}} was hurt by the sea of fire!" + "fireGrassPledgeLapse": "{{pokemonNameWithAffix}} was hurt by the sea of fire!", + "waterFirePledgeOnAdd": "A rainbow appeared in the sky!", + "waterFirePledgeOnAddPlayer": "A rainbow appeared in the sky on your team's side!", + "waterFirePledgeOnAddEnemy": "A rainbow appeared in the sky on the opposing team's side!", + "grassWaterPledgeOnAdd": "A swamp enveloped the field!", + "grassWaterPledgeOnAddPlayer": "A swamp enveloped your team!", + "grassWaterPledgeOnAddEnemy": "A swamp enveloped the opposing team!" } \ No newline at end of file