diff --git a/include/battle_util.h b/include/battle_util.h index 9539321cd5..bac3f3bbf9 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -335,5 +335,6 @@ bool32 IsSleepClauseActiveForSide(u32 battlerSide); bool32 IsSleepClauseEnabled(); void ClearDamageCalcResults(void); u32 DoesDestinyBondFail(u32 battler); +bool32 IsMoveEffectBlockedByTarget(u32 ability); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1dff66341d..5a24ead2fe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3177,15 +3177,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; if (!primary && affectsUser != MOVE_EFFECT_AFFECTS_USER - && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (battlerAbility == ABILITY_SHIELD_DUST || GetBattlerHoldEffect(gEffectBattler, TRUE) == HOLD_EFFECT_COVERT_CLOAK)) - { - if (battlerAbility == ABILITY_SHIELD_DUST) - RecordAbilityBattle(gEffectBattler, battlerAbility); - else - RecordItemEffectBattle(gEffectBattler, HOLD_EFFECT_COVERT_CLOAK); + && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) + && IsMoveEffectBlockedByTarget(battlerAbility)) INCREMENT_RESET_RETURN - } if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION) @@ -6258,7 +6252,8 @@ static void Cmd_moveend(void) case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts, Wake-Up Slap, Sparkling Aria if ((gBattleMons[gBattlerTarget].status1 & gMovesInfo[gCurrentMove].argument.status) && IsBattlerAlive(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && (gBattleStruct->numSpreadTargets > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget)))) { gBattleMons[gBattlerTarget].status1 &= ~(gMovesInfo[gCurrentMove].argument.status); diff --git a/src/battle_util.c b/src/battle_util.c index 6925a1c64d..debd3b1981 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -12161,3 +12161,20 @@ bool32 DoesDestinyBondFail(u32 battler) return TRUE; return FALSE; } + +// This check has always to be the last in a condtion statement because of the recording of AI data. +bool32 IsMoveEffectBlockedByTarget(u32 ability) +{ + if (ability == ABILITY_SHIELD_DUST) + { + RecordAbilityBattle(gBattlerTarget, ability); + return TRUE; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_COVERT_CLOAK) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); + return TRUE; + } + + return FALSE; +} diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index 9374a5f018..6b777d9aea 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -124,7 +124,6 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; - KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -150,7 +149,6 @@ DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending SINGLE_BATTLE_TEST("Shield Dust blocks Sparkling Aria in singles") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_VIVILLON) { Ability(ABILITY_SHIELD_DUST); Status1(STATUS1_BURN); } diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index b55b1492da..150ddcbba3 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -127,7 +127,6 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; - KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -153,7 +152,6 @@ DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending SINGLE_BATTLE_TEST("Covert Cloak blocks Sparkling Aria in singles") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); Status1(STATUS1_BURN); }