From 04245161e0fc89df5d5ce04b5d94c5ba593221a0 Mon Sep 17 00:00:00 2001 From: GGbond Date: Sun, 22 Mar 2026 02:02:13 +0800 Subject: [PATCH] Fix Commander cleanup to only clear STATE_COMMANDER semi-invulnerability for partners (#9598) --- src/battle_main.c | 11 +++++++---- src/battle_move_resolution.c | 2 +- test/battle/ability/commander.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 72c2b651e5..d6bd47e03c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3388,11 +3388,14 @@ const u8* FaintClearSetData(enum BattlerId battler) enum BattlerId partner = BATTLE_PARTNER(battler); // Clear commander state immediately so a replacement doesn't inherit it. gBattleStruct->battlerState[battler].commanderSpecies = SPECIES_NONE; - gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; - if (IsBattlerAlive(partner)) + if (gBattleMons[partner].volatiles.semiInvulnerable == STATE_COMMANDER) { - BtlController_EmitSpriteInvisibility(partner, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(partner); + gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; + if (IsBattlerAlive(partner)) + { + BtlController_EmitSpriteInvisibility(partner, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(partner); + } } } diff --git a/src/battle_move_resolution.c b/src/battle_move_resolution.c index b5c88b49af..371709b643 100644 --- a/src/battle_move_resolution.c +++ b/src/battle_move_resolution.c @@ -3751,7 +3751,7 @@ static enum MoveEndResult MoveEndClearBits(void) { enum BattlerId partner = BATTLE_PARTNER(i); gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; - if (IsBattlerAlive(partner)) + if (gBattleMons[partner].volatiles.semiInvulnerable == STATE_COMMANDER) gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; } } diff --git a/test/battle/ability/commander.c b/test/battle/ability/commander.c index 975291664a..fe9fce7953 100644 --- a/test/battle/ability/commander.c +++ b/test/battle/ability/commander.c @@ -506,3 +506,33 @@ DOUBLE_BATTLE_TEST("Commander clears when Dondozo is replaced and Tatsugiri can HP_BAR(playerRight); } } + +DOUBLE_BATTLE_TEST("Commander does not clear semi-invulnerability of non-Tatsugiri partner") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); + PLAYER(SPECIES_DONDOZO) { HP(1); Speed(1); } + PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); HP(1); Status1(STATUS1_POISON); Speed(2); } + PLAYER(SPECIES_PIDGEOT) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(90); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(80); } + } WHEN { + TURN { SKIP_TURN(playerRight); SEND_OUT(playerRight, 2); } + TURN { + MOVE(playerRight, MOVE_FLY, target: opponentLeft); + MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); + MOVE(opponentRight, MOVE_SCRATCH, target: playerRight); + } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_COMMANDER); + MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Tatsugiri fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Dondozo fainted!"); + NOT HP_BAR(playerRight); + } THEN { + EXPECT_EQ(playerRight->hp, playerRight->maxHP); + } +}