Add other Pledge combo effects (untested)

This commit is contained in:
innerthunder 2024-09-29 19:36:46 -07:00
parent b9afcbb6aa
commit 82d929d34e
4 changed files with 71 additions and 6 deletions

View File

@ -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 { export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
switch (tagType) { switch (tagType) {
case ArenaTagType.MIST: case ArenaTagType.MIST:
@ -1078,6 +1119,10 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
return new ImprisonTag(sourceId, side); return new ImprisonTag(sourceId, side);
case ArenaTagType.FIRE_GRASS_PLEDGE: case ArenaTagType.FIRE_GRASS_PLEDGE:
return new FireGrassPledgeTag(sourceId, side); 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: default:
return null; return null;
} }

View File

@ -1027,7 +1027,14 @@ export class MoveEffectAttr extends MoveAttr {
*/ */
getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer {
const moveChance = new Utils.NumberHolder(move.chance); const moveChance = new Utils.NumberHolder(move.chance);
applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility); 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) { if (!selfEffect) {
applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance); applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance);
} }
@ -8437,20 +8444,24 @@ export function initMoves() {
.attr(CombinedPledgeTypeAttr) .attr(CombinedPledgeTypeAttr)
.attr(CombinedPledgePowerAttr) .attr(CombinedPledgePowerAttr)
.attr(CombinedPledgeStabBoostAttr) .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 .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) new AttackMove(Moves.FIRE_PLEDGE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5)
.attr(AwaitCombinedPledgeAttr) .attr(AwaitCombinedPledgeAttr)
.attr(CombinedPledgeTypeAttr) .attr(CombinedPledgeTypeAttr)
.attr(CombinedPledgePowerAttr) .attr(CombinedPledgePowerAttr)
.attr(CombinedPledgeStabBoostAttr) .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 .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) new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5)
.attr(AwaitCombinedPledgeAttr) .attr(AwaitCombinedPledgeAttr)
.attr(CombinedPledgeTypeAttr) .attr(CombinedPledgeTypeAttr)
.attr(CombinedPledgePowerAttr) .attr(CombinedPledgePowerAttr)
.attr(CombinedPledgeStabBoostAttr) .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 .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) new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5)
.attr(ForceSwitchOutAttr, true), .attr(ForceSwitchOutAttr, true),

View File

@ -920,11 +920,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
break; break;
case Stat.SPD: case Stat.SPD:
// Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) if (this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) {
|| (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY))) {
ret *= 2; ret *= 2;
} }
if (this.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) {
ret /= 4;
}
if (this.getTag(BattlerTagType.SLOW_START)) { if (this.getTag(BattlerTagType.SLOW_START)) {
ret >>= 1; ret >>= 1;

View File

@ -54,7 +54,14 @@
"safeguardOnRemove": "The field is no longer protected by Safeguard!", "safeguardOnRemove": "The field is no longer protected by Safeguard!",
"safeguardOnRemovePlayer": "Your team 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!", "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!", "fireGrassPledgeOnAddPlayer": "A sea of fire enveloped your team!",
"fireGrassPledgeOnAddEnemy": "A sea of fire enveloped the opposing 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!"
} }