From c364348a16b604ccc5890a884170d8b3242f94db Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 24 Oct 2024 06:15:28 -0400 Subject: [PATCH] check last source of damage instead of last successful attacker --- src/data/ability.ts | 1 + src/data/move.ts | 1 + src/field/pokemon.ts | 2 ++ src/phases/faint-phase.ts | 5 +++-- src/phases/post-turn-status-effect-phase.ts | 1 + src/phases/weather-effect-phase.ts | 1 + 6 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index ebdd5105bb4..76b39e07b04 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3343,6 +3343,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + pokemon.turnData.lastDmgSrc = 0; } return true; diff --git a/src/data/move.ts b/src/data/move.ts index ec25844909e..bcfc7b6e381 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1352,6 +1352,7 @@ export class RecoilAttr extends MoveEffectAttr { user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); user.scene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", { pokemonName: getPokemonNameWithAffix(user) })); user.turnData.damageTaken += recoilDamage; + user.turnData.lastDmgSrc = user.id; return true; } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a3d7429ed9b..90dfb8dda4c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2796,6 +2796,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleData.hitCount++; const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); + this.turnData.lastDmgSrc = source.id; if (source.isPlayer() && !this.isPlayer()) { this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, new Utils.NumberHolder(damage)); } @@ -5125,6 +5126,7 @@ export class PokemonTurnData { public statStagesDecreased: boolean = false; public moveEffectiveness: TypeDamageMultiplier | null = null; public combiningPledge?: Moves; + public lastDmgSrc: integer; } export enum AiType { diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index eee1fd52938..976b62cefb8 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -96,12 +96,13 @@ export class FaintPhase extends PokemonPhase { const alivePlayField = this.scene.getField(true); alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); if (pokemon.turnData?.attacksReceived?.length) { - const defeatSource = this.scene.getPokemonById(pokemon.turnData.attacksReceived[0].sourceId); + const defeatSource = this.scene.getPokemonById(pokemon.turnData?.lastDmgSrc); + const selfKO = pokemon === defeatSource; if (defeatSource?.isOnField()) { applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; const pvattrs = pvmove.getAttrs(PostVictoryStatStageChangeAttr); - if (pvattrs.length) { + if (pvattrs.length && !selfKO) { for (const pvattr of pvattrs) { pvattr.applyPostVictory(defeatSource, defeatSource, pvmove); } diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts index 2efd992a2b5..6635507bee4 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -25,6 +25,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { if (!cancelled.value) { this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); const damage = new Utils.NumberHolder(0); + pokemon.turnData.lastDmgSrc = 0; switch (pokemon.status.effect) { case StatusEffect.POISON: damage.value = Math.max(pokemon.getMaxHp() >> 3, 1); diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index b48ee342780..83858a38505 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -54,6 +54,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length; if (!immune) { inflictDamage(pokemon); + pokemon.turnData.lastDmgSrc = 0; } }); }