From a8cd459370c5f512bab666435c29fb61573633e6 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 12 Aug 2024 21:54:24 +0200 Subject: [PATCH] Fixes Purifying Salt not halving dmg for dynamic move types (#5145) * Fixes Purifying Salt not halving dmg for dynamic move types * forgot to add --- src/battle_util.c | 11 +++++++---- test/battle/ability/purifying_salt.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index e517a8160503..3be34d1afcbc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8257,6 +8257,8 @@ u32 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u32 moveTarget, side; + u32 moveType; + GET_MOVE_TYPE(move, moveType); if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; @@ -8274,7 +8276,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) else { targetBattler = SetRandomTarget(gBattlerAttacker); - if (gMovesInfo[move].type == TYPE_ELECTRIC + if (moveType == TYPE_ELECTRIC && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD) { @@ -8282,7 +8284,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; } - else if (gMovesInfo[move].type == TYPE_WATER + else if (moveType == TYPE_WATER && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN) { @@ -9771,7 +9773,7 @@ static inline u32 CalcDefenseStat(u32 move, u32 battlerAtk, u32 battlerDef, u32 modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_PURIFYING_SALT: - if (gMovesInfo[move].type == TYPE_GHOST) + if (moveType == TYPE_GHOST) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; } @@ -10467,7 +10469,8 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); - u8 moveType = gMovesInfo[move].type; + u32 moveType; + GET_MOVE_TYPE(move, moveType); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index e1882624973c..4c25321e5f69 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -19,6 +19,24 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam } } +SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", s16 damage) +{ + u16 ability; + PARAMETRIZE { ability = ABILITY_STURDY; } + PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST); + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_GHOST); } + OPPONENT(SPECIES_GARGANACL) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage); + } +} + SINGLE_BATTLE_TEST("Purifying Salt makes Rest fail") { GIVEN {