Changed BattlerTagImmunityAbAttr to look at lists instead

This commit is contained in:
frutescens 2024-09-23 23:13:07 -07:00
parent bf3a2db47c
commit 7b08366a70
5 changed files with 14 additions and 88 deletions

View File

@ -2023,24 +2023,6 @@ export class PostSummonAbAttr extends AbAttr {
} }
} }
export class ApplyArenaTagAbAttr extends PostSummonAbAttr {
private tagType: ArenaTagType;
constructor(tagtype: ArenaTagType) {
super(true);
this.tagType = tagtype;
}
applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
const tag = pokemon.scene.arena.getTag(this.tagType);
if (!tag && !simulated) {
pokemon.scene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
return true;
}
return false;
}
}
/** /**
* Removes specified arena tags when a Pokemon is summoned. * Removes specified arena tags when a Pokemon is summoned.
*/ */
@ -2867,17 +2849,17 @@ export class PreApplyBattlerTagAbAttr extends AbAttr {
* Provides immunity to BattlerTags {@linkcode BattlerTag} to specified targets. * Provides immunity to BattlerTags {@linkcode BattlerTag} to specified targets.
*/ */
export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr {
private immuneTagType: BattlerTagType; private immuneTagTypes: BattlerTagType[];
private battlerTag: BattlerTag; private battlerTag: BattlerTag;
constructor(immuneTagType: BattlerTagType) { constructor(immuneTagTypes: BattlerTagType[]) {
super(); super();
this.immuneTagType = immuneTagType; this.immuneTagTypes = immuneTagTypes;
} }
applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (tag.tagType === this.immuneTagType) { if (this.immuneTagTypes.includes(tag.tagType)) {
cancelled.value = true; cancelled.value = true;
if (!simulated) { if (!simulated) {
this.battlerTag = tag; this.battlerTag = tag;
@ -4931,8 +4913,7 @@ export function initAbilities() {
.attr(TypeImmunityHealAbAttr, Type.WATER) .attr(TypeImmunityHealAbAttr, Type.WATER)
.ignorable(), .ignorable(),
new Ability(Abilities.OBLIVIOUS, 3) new Ability(Abilities.OBLIVIOUS, 3)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.INFATUATED) .attr(BattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT])
.attr(BattlerTagImmunityAbAttr, BattlerTagType.TAUNT)
.attr(IntimidateImmunityAbAttr) .attr(IntimidateImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.CLOUD_NINE, 3) new Ability(Abilities.CLOUD_NINE, 3)
@ -4945,7 +4926,7 @@ export function initAbilities() {
.attr(StatMultiplierAbAttr, Stat.ACC, 1.3), .attr(StatMultiplierAbAttr, Stat.ACC, 1.3),
new Ability(Abilities.INSOMNIA, 3) new Ability(Abilities.INSOMNIA, 3)
.attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .attr(BattlerTagImmunityAbAttr, [BattlerTagType.DROWSY])
.ignorable(), .ignorable(),
new Ability(Abilities.COLOR_CHANGE, 3) new Ability(Abilities.COLOR_CHANGE, 3)
.attr(PostDefendTypeChangeAbAttr) .attr(PostDefendTypeChangeAbAttr)
@ -4960,7 +4941,7 @@ export function initAbilities() {
.attr(IgnoreMoveEffectsAbAttr) .attr(IgnoreMoveEffectsAbAttr)
.partial(), .partial(),
new Ability(Abilities.OWN_TEMPO, 3) new Ability(Abilities.OWN_TEMPO, 3)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED) .attr(BattlerTagImmunityAbAttr, [BattlerTagType.CONFUSED])
.attr(IntimidateImmunityAbAttr) .attr(IntimidateImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.SUCTION_CUPS, 3) new Ability(Abilities.SUCTION_CUPS, 3)
@ -5023,7 +5004,7 @@ export function initAbilities() {
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON) .attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.INNER_FOCUS, 3) new Ability(Abilities.INNER_FOCUS, 3)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.FLINCHED) .attr(BattlerTagImmunityAbAttr, [BattlerTagType.FLINCHED])
.attr(IntimidateImmunityAbAttr) .attr(IntimidateImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.MAGMA_ARMOR, 3) new Ability(Abilities.MAGMA_ARMOR, 3)
@ -5124,7 +5105,7 @@ export function initAbilities() {
.attr(DoubleBattleChanceAbAttr), .attr(DoubleBattleChanceAbAttr),
new Ability(Abilities.VITAL_SPIRIT, 3) new Ability(Abilities.VITAL_SPIRIT, 3)
.attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .attr(BattlerTagImmunityAbAttr, [BattlerTagType.DROWSY])
.ignorable(), .ignorable(),
new Ability(Abilities.WHITE_SMOKE, 3) new Ability(Abilities.WHITE_SMOKE, 3)
.attr(ProtectStatAbAttr) .attr(ProtectStatAbAttr)
@ -5418,7 +5399,7 @@ export function initAbilities() {
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
.attr(MoveAbilityBypassAbAttr), .attr(MoveAbilityBypassAbAttr),
new Ability(Abilities.AROMA_VEIL, 6) new Ability(Abilities.AROMA_VEIL, 6)
.attr(ApplyArenaTagAbAttr, ArenaTagType.AROMA_VEIL), .attr(UserFieldBattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK]),
new Ability(Abilities.FLOWER_VEIL, 6) new Ability(Abilities.FLOWER_VEIL, 6)
.ignorable() .ignorable()
.unimplemented(), .unimplemented(),
@ -5443,7 +5424,7 @@ export function initAbilities() {
.attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), .attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)),
new Ability(Abilities.SWEET_VEIL, 6) new Ability(Abilities.SWEET_VEIL, 6)
.attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP)
.attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.DROWSY])
.ignorable() .ignorable()
.partial(), // Mold Breaker ally should not be affected by Sweet Veil .partial(), // Mold Breaker ally should not be affected by Sweet Veil
new Ability(Abilities.STANCE_CHANGE, 6) new Ability(Abilities.STANCE_CHANGE, 6)
@ -5597,7 +5578,7 @@ export function initAbilities() {
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(StatusEffectImmunityAbAttr, ...getNonVolatileStatusEffects()) .attr(StatusEffectImmunityAbAttr, ...getNonVolatileStatusEffects())
.attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY), .attr(BattlerTagImmunityAbAttr, [BattlerTagType.DROWSY]),
new Ability(Abilities.QUEENLY_MAJESTY, 7) new Ability(Abilities.QUEENLY_MAJESTY, 7)
.attr(FieldPriorityMoveImmunityAbAttr) .attr(FieldPriorityMoveImmunityAbAttr)
.ignorable(), .ignorable(),

View File

@ -955,40 +955,6 @@ class ImprisonTag extends ArenaTrapTag {
} }
} }
class AromaVeilTag extends ArenaTag {
private protectedTags: BattlerTagType[];
private source: Pokemon;
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
super(ArenaTagType.AROMA_VEIL, turnCount, undefined, sourceId, side);
this.protectedTags = [BattlerTagType.TAUNT, BattlerTagType.TORMENT, BattlerTagType.DISABLED, BattlerTagType.HEAL_BLOCK, BattlerTagType.ENCORE, BattlerTagType.INFATUATED];
}
onAdd(arena: Arena): void {
this.source = arena.scene.getPokemonById(this.sourceId!)!;
const party = this.source.isPlayer() ? this.source.scene.getPlayerField() : this.source.scene.getEnemyField();
party?.forEach((p: PlayerPokemon | EnemyPokemon ) => {
p.findAndRemoveTags(t => this.protectedTags.includes(t.tagType));
});
}
lapse(_arena: Arena): boolean {
return this.source.isActive(true) && this.source.hasAbility(Abilities.AROMA_VEIL);
}
apply(arena: Arena, args: any[]): boolean {
const targetPokemon = args[2];
if (this.protectedTags.includes(args[1] as BattlerTagType) && this.lapse(arena)) {
(args[0] as Utils.BooleanHolder).value = false;
arena.scene.queueMessage(i18next.t("abilityTriggers:aromaVeilImmunity", {
pokemonNameWithAffix: targetPokemon,
}));
}
return true;
}
}
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:
@ -1038,8 +1004,6 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
return new SafeguardTag(turnCount, sourceId, side); return new SafeguardTag(turnCount, sourceId, side);
case ArenaTagType.IMPRISON: case ArenaTagType.IMPRISON:
return new ImprisonTag(sourceId, side); return new ImprisonTag(sourceId, side);
case ArenaTagType.AROMA_VEIL:
return new AromaVeilTag(turnCount, sourceId, side);
default: default:
return null; return null;
} }

View File

@ -23,8 +23,6 @@ import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase"; import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase";
import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; import { PokemonAnimType } from "#app/enums/pokemon-anim-type";
import { ArenaTagType } from "#app/enums/arena-tag-type";
import { ArenaTagSide } from "./arena-tag";
export enum BattlerTagLapseType { export enum BattlerTagLapseType {
FAINT, FAINT,
@ -115,15 +113,6 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
super(tagType, lapseType, turnCount, sourceMove, sourceId); super(tagType, lapseType, turnCount, sourceMove, sourceId);
} }
override canAdd(pokemon: Pokemon): boolean {
const validArena = new Utils.BooleanHolder(true);
const arenaTag = pokemon.scene.arena.findTagsOnSide(t => t.tagType === ArenaTagType.AROMA_VEIL, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)[0];
if (arenaTag) {
arenaTag.apply(pokemon.scene.arena, [validArena, this.tagType, getPokemonNameWithAffix(pokemon)]);
}
return validArena.value;
}
/** @override */ /** @override */
override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
if (lapseType === BattlerTagLapseType.PRE_MOVE) { if (lapseType === BattlerTagLapseType.PRE_MOVE) {
@ -704,14 +693,8 @@ export class InfatuatedTag extends BattlerTag {
if (this.sourceId) { if (this.sourceId) {
const pkm = pokemon.scene.getPokemonById(this.sourceId); const pkm = pokemon.scene.getPokemonById(this.sourceId);
const validArena = new Utils.BooleanHolder(true);
const arenaTag = pokemon.scene.arena.findTagsOnSide(t => t.tagType === ArenaTagType.AROMA_VEIL, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)[0];
if (arenaTag) {
arenaTag.apply(pokemon.scene.arena, [validArena, this.tagType, getPokemonNameWithAffix(pokemon)]);
}
if (pkm) { if (pkm) {
return pokemon.isOppositeGender(pkm) && validArena.value; return pokemon.isOppositeGender(pkm);
} else { } else {
console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId);
return false; return false;

View File

@ -24,6 +24,5 @@ export enum ArenaTagType {
HAPPY_HOUR = "HAPPY_HOUR", HAPPY_HOUR = "HAPPY_HOUR",
SAFEGUARD = "SAFEGUARD", SAFEGUARD = "SAFEGUARD",
NO_CRIT = "NO_CRIT", NO_CRIT = "NO_CRIT",
AROMA_VEIL = "AROMA_VEIL",
IMPRISON = "IMPRISON" IMPRISON = "IMPRISON"
} }

View File

@ -60,6 +60,5 @@
"postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!", "preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!"
"aromaVeilImmunity": "{{pokemonNameWithAffix}} is protected by an aromatic veil!"
} }