From 4f55dade502a87130fc3c71cb012d59675bca404 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 25 Dec 2025 17:27:56 -0500 Subject: [PATCH] Fix Commander Dondozo Switching (#8624) --- src/battle_ai_switch_items.c | 37 ++++++++++++++++++----------------- test/battle/ai/ai_switching.c | 21 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 05091a815e..fab12b2df4 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1091,6 +1091,23 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) return FALSE; } +static bool32 CanBattlerConsiderSwitch(u32 battler) +{ + if (gBattleMons[battler].volatiles.wrapped) + return FALSE; + if (gBattleMons[battler].volatiles.escapePrevention) + return FALSE; + if (gBattleMons[battler].volatiles.root) + return FALSE; + if (IsAbilityPreventingEscape(battler)) + return FALSE; + if (gBattleStruct->battlerState[battler].commanderSpecies) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + return FALSE; + return TRUE; +} + bool32 ShouldSwitch(u32 battler) { u32 battlerIn1, battlerIn2; @@ -1100,15 +1117,7 @@ bool32 ShouldSwitch(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].volatiles.wrapped) - return FALSE; - if (gBattleMons[battler].volatiles.escapePrevention) - return FALSE; - if (gBattleMons[battler].volatiles.root) - return FALSE; - if (IsAbilityPreventingEscape(battler)) - return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + if (!CanBattlerConsiderSwitch(battler)) return FALSE; // Sequence Switching AI never switches mid-battle @@ -1251,15 +1260,7 @@ void ModifySwitchAfterMoveScoring(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].volatiles.wrapped) - return; - if (gBattleMons[battler].volatiles.escapePrevention) - return; - if (gBattleMons[battler].volatiles.root) - return; - if (IsAbilityPreventingEscape(battler)) - return; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + if (!CanBattlerConsiderSwitch(battler)) return; // Sequence Switching AI never switches mid-battle diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 91098f28a3..f0eee3ac90 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1724,3 +1724,24 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI considers both meeting and TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); hp > 80 ? EXPECT_SEND_OUT(opponent, 2) : EXPECT_SEND_OUT(opponent, 1); } } } + +AI_DOUBLE_BATTLE_TEST("AI will not choose to switch out Dondozo with Commander Tatsugiri") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + ASSUME(GetMoveEffect(MOVE_PERISH_SONG) == EFFECT_PERISH_SONG); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + OPPONENT(SPECIES_DONDOZO) { Level(50); Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_TATSUGIRI) { Moves(MOVE_WATER_GUN); Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_HEADBUTT); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE, MOVE_PERISH_SONG); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_ZIGZAGOON) { Moves (MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_PERISH_SONG); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_WATER_GUN); } + } +}