From d88b82eab217f4d8418c505372bc1a9fe4e8fd67 Mon Sep 17 00:00:00 2001 From: GGbond Date: Sun, 8 Feb 2026 16:19:10 +0800 Subject: [PATCH] Fix immunity ability status sync to avoid persisting Toxic counter when only volatile conditions are cured (#9156) --- src/battle_util.c | 7 +++++-- test/battle/ability/oblivious.c | 26 ++++++++++++++++++++++++++ test/battle/ability/own_tempo.c | 26 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index cad82d035e..e352173577 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9703,8 +9703,11 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) } gBattleScripting.battler = gBattlerAbility = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); + if (effect == 1) // Only primary status changes should sync party status. + { + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + } return effect; } diff --git a/test/battle/ability/oblivious.c b/test/battle/ability/oblivious.c index ecbf2d3f5f..e8340b2955 100644 --- a/test/battle/ability/oblivious.c +++ b/test/battle/ability/oblivious.c @@ -99,3 +99,29 @@ SINGLE_BATTLE_TEST("Oblivious prevents Intimidate (Gen8+)") MESSAGE("Slowpoke's Oblivious prevents stat loss!"); } } + +SINGLE_BATTLE_TEST("Oblivious cured infatuation should not persist toxic counter after switching") +{ + s16 firstTick, secondTick, postSwitchTick; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); Status1(STATUS1_TOXIC_POISON); MaxHP(160); HP(160); Speed(100); } + PLAYER(SPECIES_WYNAUT) { Speed(90); } + OPPONENT(SPECIES_SLOWPOKE) { Gender(MON_FEMALE); Ability(ABILITY_OBLIVIOUS); Speed(80); } + } WHEN { + TURN { MOVE(opponent, MOVE_ATTRACT); } + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } SCENE { + HP_BAR(player, captureDamage: &firstTick); + HP_BAR(player, captureDamage: &secondTick); + HP_BAR(player, captureDamage: &postSwitchTick); + } THEN { + EXPECT_EQ(firstTick, 10); + EXPECT_EQ(secondTick, 20); + EXPECT_EQ(postSwitchTick, 10); + } +} diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 3195f2fcf1..5f8413e56b 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -143,3 +143,29 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from items") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); } } + +SINGLE_BATTLE_TEST("Own Tempo cured confusion should not persist toxic counter after switching") +{ + s16 firstTick, secondTick, postSwitchTick; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_TOXIC_POISON); MaxHP(160); HP(160); Speed(100); } + PLAYER(SPECIES_WYNAUT) { Speed(90); } + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); Speed(80); } + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); } + TURN { MOVE(opponent, MOVE_SKILL_SWAP); MOVE(player, MOVE_CELEBRATE, WITH_RNG(RNG_CONFUSION, FALSE)); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } SCENE { + HP_BAR(player, captureDamage: &firstTick); + HP_BAR(player, captureDamage: &secondTick); + HP_BAR(player, captureDamage: &postSwitchTick); + } THEN { + EXPECT_EQ(firstTick, 10); + EXPECT_EQ(secondTick, 20); + EXPECT_EQ(postSwitchTick, 10); + } +}