From 379e5fe5c2cf7c6e79c47afd99369f4c604f4e2f Mon Sep 17 00:00:00 2001 From: kd8lvt Date: Fri, 10 May 2024 20:43:53 -0400 Subject: [PATCH 1/4] Impl: Poison Heal --- src/data/ability.ts | 24 +++++++++++++++++++++++- src/phases.ts | 3 ++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 8a244b85b..bc29f37fc 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2398,6 +2398,28 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { } } +export class HealFromStatusAbAttr extends AbAttr { + private healRatio: integer + private statusEffect: StatusEffect; + private statusEffect2: StatusEffect; + constructor(healRatio: integer,statusEffect: StatusEffect,statusEffect2: StatusEffect) { + super(); + this.healRatio = healRatio; + this.statusEffect = statusEffect; + this.statusEffect2 = statusEffect2; + } + + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + if (pokemon.status.effect === this.statusEffect || pokemon.status.effect === this.statusEffect2) { + let healAmount: integer = Math.floor(pokemon.getMaxHp()*(this.healRatio/8)); + pokemon.heal(healAmount); + cancelled.value = true; + return true; + } + return false; + } +} + export class FlinchEffectAbAttr extends AbAttr { constructor() { super(true); @@ -3014,7 +3036,7 @@ export function initAbilities() { new Ability(Abilities.IRON_FIST, 4) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PUNCHING_MOVE), 1.2), new Ability(Abilities.POISON_HEAL, 4) - .unimplemented(), + .attr(HealFromStatusAbAttr,1,StatusEffect.POISON,StatusEffect.TOXIC), new Ability(Abilities.ADAPTABILITY, 4) .attr(StabBoostAbAttr), new Ability(Abilities.SKILL_LINK, 4) diff --git a/src/phases.ts b/src/phases.ts index 3d6fe7228..2c39be93d 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -30,7 +30,7 @@ import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, get import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; import { ArenaTagType } from "./data/enums/arena-tag-type"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, applyPostBattleInitAbAttrs, PostBattleInitAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr } from "./data/ability"; +import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, applyPostBattleInitAbAttrs, PostBattleInitAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, HealFromStatusAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -2968,6 +2968,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { pokemon.status.incrementTurn(); const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(HealFromStatusAbAttr, pokemon, cancelled); if (!cancelled.value) { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); From 036ab389232fcf5c9a8c526964f356deb6890f35 Mon Sep 17 00:00:00 2001 From: kd8lvt Date: Fri, 10 May 2024 20:47:46 -0400 Subject: [PATCH 2/4] Fix status turns not incrementing properly --- src/data/ability.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/ability.ts b/src/data/ability.ts index bc29f37fc..202ba335c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2413,6 +2413,7 @@ export class HealFromStatusAbAttr extends AbAttr { if (pokemon.status.effect === this.statusEffect || pokemon.status.effect === this.statusEffect2) { let healAmount: integer = Math.floor(pokemon.getMaxHp()*(this.healRatio/8)); pokemon.heal(healAmount); + pokemon.status.incrementTurn(); cancelled.value = true; return true; } From 77dd1262d9a65cfbab43727092db8831200b73e0 Mon Sep 17 00:00:00 2001 From: kd8lvt Date: Fri, 10 May 2024 21:07:26 -0400 Subject: [PATCH 3/4] Implement StatusEffect[] change suggested by @happinyz --- src/data/ability.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 202ba335c..213531023 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2400,17 +2400,15 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { export class HealFromStatusAbAttr extends AbAttr { private healRatio: integer - private statusEffect: StatusEffect; - private statusEffect2: StatusEffect; - constructor(healRatio: integer,statusEffect: StatusEffect,statusEffect2: StatusEffect) { + private statusEffects: StatusEffect[]; + constructor(healRatio: integer,statusEffects: StatusEffect[]) { super(); this.healRatio = healRatio; - this.statusEffect = statusEffect; - this.statusEffect2 = statusEffect2; + this.statusEffects = statusEffects; } apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { - if (pokemon.status.effect === this.statusEffect || pokemon.status.effect === this.statusEffect2) { + if (this.statusEffects.includes(pokemon.status.effect)) { let healAmount: integer = Math.floor(pokemon.getMaxHp()*(this.healRatio/8)); pokemon.heal(healAmount); pokemon.status.incrementTurn(); @@ -3037,7 +3035,7 @@ export function initAbilities() { new Ability(Abilities.IRON_FIST, 4) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PUNCHING_MOVE), 1.2), new Ability(Abilities.POISON_HEAL, 4) - .attr(HealFromStatusAbAttr,1,StatusEffect.POISON,StatusEffect.TOXIC), + .attr(HealFromStatusAbAttr,1,[StatusEffect.POISON,StatusEffect.TOXIC]), new Ability(Abilities.ADAPTABILITY, 4) .attr(StabBoostAbAttr), new Ability(Abilities.SKILL_LINK, 4) From 0ffec8db823b51381de043597006fbb488e6029c Mon Sep 17 00:00:00 2001 From: kd8lvt Date: Fri, 10 May 2024 22:16:38 -0400 Subject: [PATCH 4/4] Implement suggested change Co-authored-by: Alvin Zou <59787978+happinyz@users.noreply.github.com> --- src/data/ability.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 213531023..64011d105 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2401,7 +2401,7 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { export class HealFromStatusAbAttr extends AbAttr { private healRatio: integer private statusEffects: StatusEffect[]; - constructor(healRatio: integer,statusEffects: StatusEffect[]) { + constructor(healRatio: integer, statusEffects: StatusEffect[]) { super(); this.healRatio = healRatio; this.statusEffects = statusEffects;