diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 21c4d45584e..1fb634f7694 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -1114,10 +1114,7 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr { override canApply({ pokemon, opponent: attacker, move }: PostMoveInteractionAbAttrParams): boolean { const tag = globalScene.arena.getTag(this.arenaTagType) as EntryHazardTag; - return ( - this.condition(pokemon, attacker, move) && - (!globalScene.arena.getTag(this.arenaTagType) || tag.layers < tag.maxLayers) - ); + return this.condition(pokemon, attacker, move) && (!tag || tag.canAdd()); } override apply({ simulated, pokemon }: PostMoveInteractionAbAttrParams): void { diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 51b8b6c416b..ba2f1451778 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -747,8 +747,10 @@ export abstract class EntryHazardTag extends SerializableArenaTag { /** * The current number of layers this tag has. * Starts at 1 and increases each time the trap is laid. + * Intended to be mutable within the class itself and readonly outside of it + * @protected */ - public layers = 1; + public readonly layers: number = 1; /** The maximum number of layers this tag can have. */ public abstract get maxLayers(): number; /** Whether this tag should only affect grounded targets; default `true` */ @@ -762,6 +764,14 @@ export abstract class EntryHazardTag extends SerializableArenaTag { // TODO: Add a `canAdd` field to arena tags to remove need for callers to check layer counts + /** + * Check if this tag can have more layers added to it. + * @returns Whether this tag can have another layer added to it. + */ + public canAdd(): boolean { + return this.layers < this.maxLayers; + } + /** * Add a new layer to this tag upon overlap, triggering the tag's normal {@linkcode onAdd} effects upon doing so. */ @@ -769,7 +779,7 @@ export abstract class EntryHazardTag extends SerializableArenaTag { if (!this.canAdd()) { return; } - this.layers++; + (this as Mutable).layers++; this.onAdd(); } @@ -809,7 +819,7 @@ export abstract class EntryHazardTag extends SerializableArenaTag { public loadTag(source: BaseArenaTag & Pick): void { super.loadTag(source); - this.layers = source.layers; + (this as Mutable).layers = source.layers; } } @@ -906,7 +916,7 @@ class SpikesTag extends DamagingTrapTag { */ class StealthRockTag extends DamagingTrapTag { public readonly tagType = ArenaTagType.STEALTH_ROCK; - public override get maxLayers() { + override get maxLayers() { return 1 as const; } protected override get groundedOnly() { @@ -997,7 +1007,7 @@ class ToxicSpikesTag extends EntryHazardTag { */ class StickyWebTag extends EntryHazardTag { public readonly tagType = ArenaTagType.STICKY_WEB; - public override get maxLayers() { + override get maxLayers() { return 1 as const; } @@ -1061,7 +1071,7 @@ class StickyWebTag extends EntryHazardTag { */ class ImprisonTag extends EntryHazardTag { public readonly tagType = ArenaTagType.IMPRISON; - public override get maxLayers() { + override get maxLayers() { return 1 as const; } diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index cd98a3c3e9d..08d64f6e214 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -6156,7 +6156,7 @@ export class AddArenaTrapTagAttr extends AddArenaTagAttr { if (!tag) { return true; } - return tag.layers < tag.maxLayers; + return tag.canAdd(); }; } } @@ -6182,7 +6182,7 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr { if (!tag) { return true; } - return tag.layers < tag.maxLayers; + return tag.canAdd(); } return false; } diff --git a/src/field/arena.ts b/src/field/arena.ts index 34ee7aa853c..7bfeb7e5625 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -737,7 +737,7 @@ export class Arena { existingTag.onOverlap(globalScene.getPokemonById(sourceId)); if (existingTag instanceof EntryHazardTag) { - const { tagType, side, turnCount, layers, maxLayers } = existingTag as EntryHazardTag; + const { tagType, side, turnCount, layers, maxLayers } = existingTag; this.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers)); }