From e746da3d7cda7b1d3e37ba877b78d55663932afa Mon Sep 17 00:00:00 2001 From: arColm Date: Sat, 27 Apr 2024 13:08:18 -0400 Subject: [PATCH] Implement Poison Puppeteer --- src/data/ability.ts | 20 +++++++++++++++++++- src/data/move.ts | 9 ++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index f6ccf7e856d..6081d8e5214 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -20,6 +20,7 @@ import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; import { Abilities } from "./enums/abilities"; import i18next, { Localizable } from "#app/plugins/i18n.js"; import { Command } from "../ui/command-ui-handler"; +import { Species } from "./enums/species"; export class Ability implements Localizable { public id: Abilities; @@ -1497,6 +1498,23 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } } +export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { + private effects: StatusEffect[]; + + constructor(...effects: StatusEffect[]) { + super(); + + this.effects = effects; + } + + applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { + if(this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { + return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3,2), move.moveId, defender.id); + } + return false; + } +} + export class PreSetStatusAbAttr extends AbAttr { applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; @@ -3401,6 +3419,6 @@ export function initAbilities() { new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT,ConfusionOnStatusEffectAbAttr,StatusEffect.POISON,StatusEffect.TOXIC) ); } diff --git a/src/data/move.ts b/src/data/move.ts index 9329d21c1d4..288bc1c7e9d 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -12,7 +12,7 @@ import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagType } from "./enums/arena-tag-type"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, NoTransformAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr } from "./ability"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, NoTransformAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr } from "./ability"; import { Abilities } from "./enums/abilities"; import { allAbilities } from './ability'; import { PokemonHeldItemModifier } from "../modifier/modifier"; @@ -998,8 +998,11 @@ export class StatusEffectAttr extends MoveEffectAttr { else return false; } - if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) - return pokemon.trySetStatus(this.effect, true, this.cureTurn); + if ((!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) + && pokemon.trySetStatus(this.effect, true, this.cureTurn)) { + applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, new PokemonMove(move.id), null,this.effect); + return true; + } } return false; }