From 2183fa748a641d157019456daf35a9f4bcb2195e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 6 Jan 2026 16:04:11 +0100 Subject: [PATCH] Fix field abilities activating when an other mon switches in (#8743) --- src/battle_move_resolution.c | 2 +- src/battle_util.c | 22 ++++++++++++++++++++++ test/battle/switch_in_abilities.c | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/battle_move_resolution.c b/src/battle_move_resolution.c index 3d371517ca..203e68009c 100644 --- a/src/battle_move_resolution.c +++ b/src/battle_move_resolution.c @@ -1846,7 +1846,7 @@ static void TryClearChargeVolatile(enum Type moveType) for (u32 battler = 0; battler < gBattlersCount; battler++) { - if (gBattleMons[battler].volatiles.chargeTimer == 2) // Has been set this turn by move + if (gBattleMons[battler].volatiles.chargeTimer == 2) // Has been set this turn by move or ability gBattleMons[battler].volatiles.chargeTimer--; } } diff --git a/src/battle_util.c b/src/battle_util.c index d0b64fd654..c5e0977811 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4580,6 +4580,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_DRIZZLE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); @@ -4592,6 +4594,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SAND_STREAM: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); @@ -4605,6 +4609,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_ORICHALCUM_PULSE: case ABILITY_DROUGHT: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); @@ -4617,6 +4623,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SNOW_WARNING: + if (!shouldAbilityTrigger) + break; { u32 weather = (GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 ? BATTLE_WEATHER_SNOW : BATTLE_WEATHER_HAIL); if (TryChangeBattleWeather(battler, weather, gLastUsedAbility)) @@ -4633,6 +4641,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_ELECTRIC_SURGE: case ABILITY_HADRON_ENGINE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) { BattleScriptCall(BattleScript_ElectricSurgeActivates); @@ -4640,6 +4650,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_GRASSY_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_GRASSY_TERRAIN)) { BattleScriptCall(BattleScript_GrassySurgeActivates); @@ -4647,6 +4659,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_MISTY_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_MISTY_TERRAIN)) { BattleScriptCall(BattleScript_MistySurgeActivates); @@ -4654,6 +4668,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_PSYCHIC_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) { BattleScriptCall(BattleScript_PsychicSurgeActivates); @@ -4748,6 +4764,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_DESOLATE_LAND: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN_PRIMAL, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); @@ -4755,6 +4773,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_PRIMORDIAL_SEA: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN_PRIMAL, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); @@ -4762,6 +4782,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_DELTA_STREAM: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_STRONG_WINDS, gLastUsedAbility)) { BattleScriptCall(BattleScript_WeatherAbilityActivates); diff --git a/test/battle/switch_in_abilities.c b/test/battle/switch_in_abilities.c index 1fc5e8a935..4dd4f1bcbb 100644 --- a/test/battle/switch_in_abilities.c +++ b/test/battle/switch_in_abilities.c @@ -247,3 +247,23 @@ ONE_VS_TWO_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO } } } + +DOUBLE_BATTLE_TEST("Status setting abilities don't re-activate when a new mon switches in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN { SWITCH(opponentLeft, 2); NOT ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); } + } THEN { + EXPECT(!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)); + } +}