diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 28e544540..a94568b6e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,12 +1,12 @@ import { CommonAnim, CommonBattleAnim } from "./battle-anims"; -import { CommonAnimPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase } from "../phases"; +import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase } from "../phases"; import { getPokemonMessage } from "../messages"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import { Stat } from "./pokemon-stat"; import { StatusEffect } from "./status-effect"; import * as Utils from "../utils"; import { Moves } from "./enums/moves"; -import { ChargeAttr, allMoves } from "./move"; +import { ChargeAttr, MoveFlags, allMoves } from "./move"; import { Type } from "./type"; import { Abilities, FlinchEffectAbAttr, applyAbAttrs } from "./ability"; import { BattlerTagType } from "./enums/battler-tag-type"; @@ -567,8 +567,8 @@ export class ThunderCageTag extends DamagingTrapTag { export class ProtectedTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.PROTECTED, BattlerTagLapseType.CUSTOM, 0, sourceMove); + constructor(sourceMove: Moves, tagType: BattlerTagType = BattlerTagType.PROTECTED) { + super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -588,6 +588,26 @@ export class ProtectedTag extends BattlerTag { } } +export class ContactPoisonProtectedTag extends ProtectedTag { + constructor(sourceMove: Moves) { + super(sourceMove, BattlerTagType.BANEFUL_BUNKER); + } + + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + const ret = super.lapse(pokemon, lapseType); + + if (lapseType === BattlerTagLapseType.CUSTOM) { + const effectPhase = pokemon.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { + const attacker = effectPhase.getPokemon(); + attacker.trySetStatus(StatusEffect.POISON, true); + } + } + + return ret; + } +} + export class EnduringTag extends BattlerTag { constructor(sourceMove: Moves) { super(BattlerTagType.ENDURING, BattlerTagLapseType.CUSTOM, 0, sourceMove); @@ -788,6 +808,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new ThunderCageTag(turnCount, sourceId); case BattlerTagType.PROTECTED: return new ProtectedTag(sourceMove); + case BattlerTagType.BANEFUL_BUNKER: + return new ContactPoisonProtectedTag(sourceMove); case BattlerTagType.ENDURING: return new EnduringTag(sourceMove); case BattlerTagType.PERISH_SONG: diff --git a/src/data/enums/battler-tag-type.ts b/src/data/enums/battler-tag-type.ts index dbcbd032f..b65e011b1 100644 --- a/src/data/enums/battler-tag-type.ts +++ b/src/data/enums/battler-tag-type.ts @@ -22,6 +22,7 @@ export enum BattlerTagType { MAGMA_STORM = "MAGMA_STORM", THUNDER_CAGE = "THUNDER_CAGE", PROTECTED = "PROTECTED", + BANEFUL_BUNKER = "BANEFUL_BUNKER", ENDURING = "ENDURING", PERISH_SONG = "PERISH_SONG", TRUANT = "TRUANT", diff --git a/src/data/move.ts b/src/data/move.ts index 7fc1c49fe..dcb1894ee 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4098,8 +4098,8 @@ export function initMoves() { .attr(SandHealAttr), new AttackMove(Moves.FIRST_IMPRESSION, "First Impression", Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, "Although this move has great power, it only works the first turn each time the user enters battle.", -1, 2, 7) .condition(new FirstMoveCondition()), - new SelfStatusMove(Moves.BANEFUL_BUNKER, "Baneful Bunker (P)", Type.POISON, -1, 10, -1, "In addition to protecting the user from attacks, this move also poisons any attacker that makes direct contact.", -1, 4, 7) - .attr(ProtectAttr), + new SelfStatusMove(Moves.BANEFUL_BUNKER, "Baneful Bunker", Type.POISON, -1, 10, -1, "In addition to protecting the user from attacks, this move also poisons any attacker that makes direct contact.", -1, 4, 7) + .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER), new AttackMove(Moves.SPIRIT_SHACKLE, "Spirit Shackle (P)", Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, -1, "The user attacks while simultaneously stitching the target's shadow to the ground to prevent the target from escaping.", -1, 0, 7), new AttackMove(Moves.DARKEST_LARIAT, "Darkest Lariat (P)", Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, "The user swings both arms and hits the target. The target's stat changes don't affect this attack's damage.", -1, 0, 7), new AttackMove(Moves.SPARKLING_ARIA, "Sparkling Aria", Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, -1, "The user bursts into song, emitting many bubbles. Any Pokémon suffering from a burn will be healed by the touch of these bubbles.", -1, 0, 7) diff --git a/src/phases.ts b/src/phases.ts index 08da7658a..b30d98cf1 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -21,7 +21,7 @@ import { Biome } from "./data/enums/biome"; import { ModifierTier } from "./modifier/modifier-tier"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, RememberMoveModifierType, TmModifierType, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptionsForWave, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags"; import { BattlerTagType } from "./data/enums/battler-tag-type"; import { getPokemonMessage } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; @@ -2020,7 +2020,7 @@ export class MovePhase extends BattlePhase { } export class MoveEffectPhase extends PokemonPhase { - protected move: PokemonMove; + public move: PokemonMove; protected targets: BattlerIndex[]; constructor(scene: BattleScene, battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { @@ -2090,7 +2090,9 @@ export class MoveEffectPhase extends PokemonPhase { continue; } - const isProtected = !this.move.getMove().hasFlag(MoveFlags.IGNORE_PROTECT) && target.lapseTag(BattlerTagType.PROTECTED); + console.log(target.findTags(t => t instanceof ProtectedTag), 'TAGS') + + const isProtected = !this.move.getMove().hasFlag(MoveFlags.IGNORE_PROTECT) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); moveHistoryEntry.result = MoveResult.SUCCESS;