diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 7326647d419..8f6bd8dd950 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -42,9 +42,9 @@ bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler); -bool32 IsShieldsDownProtected(u32 battler); -u32 IsAbilityStatusProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler, u32 ability); +bool32 IsShieldsDownProtected(u32 battler, u32 ability); +u32 IsAbilityStatusProtected(u32 battler, u32 ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); u32 GetNaturePowerMove(u32 battler); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 24f60ecfdef..740328dab90 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -983,7 +983,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_SHIELDS_DOWN: - if (IsShieldsDownProtected(battlerAtk) && IsNonVolatileStatusMoveEffect(moveEffect)) + if (IsShieldsDownProtected(battlerAtk, aiData->abilities[battlerAtk]) && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; case ABILITY_LEAF_GUARD: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c341fb5175d..c2f742d2732 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1312,9 +1312,9 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 && !(hazardFlags & SIDE_STATUS_SAFEGUARD) - && !(IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL)) - && !(IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) - && !(IsAbilityStatusProtected(battler)) + && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) + && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index caa27f653b6..91358849420 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3031,7 +3031,7 @@ bool32 AI_CanGetFrostbite(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 33c05ee7c05..f5af50f450b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9320,25 +9320,25 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler) +u32 IsLeafGuardProtected(u32 battler, u32 ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) - return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + return ability == ABILITY_LEAF_GUARD; else return 0; } -bool32 IsShieldsDownProtected(u32 battler) +bool32 IsShieldsDownProtected(u32 battler, u32 ability) { - return (GetBattlerAbility(battler) == ABILITY_SHIELDS_DOWN + return (ability == ABILITY_SHIELDS_DOWN && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form } -u32 IsAbilityStatusProtected(u32 battler) +u32 IsAbilityStatusProtected(u32 battler, u32 ability) { - return IsFlowerVeilProtected(battler) - || IsLeafGuardProtected(battler) - || IsShieldsDownProtected(battler); + return IsLeafGuardProtected(battler, ability) + || IsShieldsDownProtected(battler, ability) + || IsFlowerVeilProtected(battler); } u32 GetHighestStatId(u32 battler) @@ -9612,7 +9612,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsShieldsDownProtected(battler)) + if (IsShieldsDownProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -11169,7 +11169,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler)) + if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 42cfffc6773..7fed3d243ae 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2687,7 +2687,7 @@ u8 DoBattlerEndTurnEffects(void) if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) && battlerAbility != ABILITY_VITAL_SPIRIT && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) - && !IsLeafGuardProtected(battler)) + && !IsLeafGuardProtected(battler, battlerAbility)) { CancelMultiTurnMoves(battler); gEffectBattler = gBattlerTarget = battler; @@ -6810,7 +6810,7 @@ bool32 CanBeSlept(u32 battler, u32 ability, enum SleepClauseBlock isBlockedBySle || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD || gBattleMons[battler].status1 & STATUS1_ANY || IsAbilityOnSide(battler, ABILITY_SWEET_VEIL) - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6825,7 +6825,7 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility) || defAbility == ABILITY_COMATOSE || defAbility == ABILITY_PURIFYING_SALT || IsAbilityOnSide(battlerDef, ABILITY_PASTEL_VEIL) - || IsAbilityStatusProtected(battlerDef) + || IsAbilityStatusProtected(battlerDef, defAbility) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6841,7 +6841,7 @@ bool32 CanBeBurned(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_THERMAL_EXCHANGE || ability == ABILITY_PURIFYING_SALT - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6855,7 +6855,7 @@ bool32 CanBeParalyzed(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6871,7 +6871,7 @@ bool32 CanBeFrozen(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6886,7 +6886,7 @@ bool32 CanGetFrostbite(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE;