diff --git a/src/data/ability.ts b/src/data/ability.ts index bb1cc50b6..8952e8c14 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1731,10 +1731,30 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } /** - * Extends from {@link ProtectStatAbAttr} to allow abilities to mark that they can protect allies from stat changes. - * Requires the Affected Pokemon to then check if ally has any ability with this attribute and apply the effect. + * Attrbiute class to allow abilities to mark that they can protect allies from stat reductions. */ -export class AllyProtectStatAbAttr extends ProtectStatAbAttr { } +export class AllyProtectStatAbAttr extends PreStatChangeAbAttr { + private protectedStat: BattleStat; + + constructor(protectedStat?: BattleStat) { + super(); + + this.protectedStat = protectedStat; + } + + applyPreStatChange(pokemon: Pokemon, passive: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (this.protectedStat === undefined || stat === this.protectedStat) { + cancelled.value = true; + return true; + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : 'stats'}!`); + } +} export class PreSetStatusAbAttr extends AbAttr { applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { @@ -1766,10 +1786,30 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } /** - * Extends from {@link StatusEffectImmunityAbAttr} to allow abilities to mark that they can protect allies from status effects. - * Requires the Affected Pokemon to then check if ally has any ability with this attribute and apply the effect. + * Attrbiute class to allow abilities to mark that they can protect allies from status effects. */ -export class AllyStatusEffectImmunityAbAttr extends StatusEffectImmunityAbAttr { } +export class AllyStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { + private immuneEffects: StatusEffect[]; + + constructor(...immuneEffects: StatusEffect[]) { + super(); + + this.immuneEffects = immuneEffects; + } + + applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!this.immuneEffects.length || this.immuneEffects.indexOf(effect) > -1) { + cancelled.value = true; + return true; + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : 'status problems'}!`); + } +} export class PreApplyBattlerTagAbAttr extends AbAttr { applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { @@ -1801,10 +1841,30 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { } /** - * Extends from {@link BattlerTagImmunityAbAttr} to allow abilities to mark that they can protect allies from battler tags. - * Requires the Affected Pokemon to then check if ally has any ability with this attribute and apply the effect. + * Attrbiute class to allow abilities to mark that they can protect allies from battler tags */ -export class AllyBattlerTagImmunityAbAttr extends BattlerTagImmunityAbAttr { } +export class AllyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { + private immuneTagType: BattlerTagType; + + constructor(immuneTagType: BattlerTagType) { + super(); + + this.immuneTagType = immuneTagType; + } + + applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (tag.tagType === this.immuneTagType) { + cancelled.value = true; + return true; + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${(args[0] as BattlerTag).getDescriptor()}!`); + } +} export class BlockCritAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {