From 7e0b1de2ae3887bb367e11088af67ca03faf0440 Mon Sep 17 00:00:00 2001 From: ghostyboyy97 <106448956+ghostyboyy97@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:27:46 -0500 Subject: [PATCH] fix (setup): ignore self-speed drop when checking speed control on KO threshold change (#8409) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_ai_util.c | 2 +- test/battle/ai/ai_calc_best_move_score.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a401dd5f94..b5b887f37b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4750,7 +4750,7 @@ static bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SPD_MINUS_2: { - if(aiIsFaster) + if (aiIsFaster && !additionalEffect->self) return TRUE; } default: diff --git a/test/battle/ai/ai_calc_best_move_score.c b/test/battle/ai/ai_calc_best_move_score.c index cfad45a0aa..88525249dc 100644 --- a/test/battle/ai/ai_calc_best_move_score.c +++ b/test/battle/ai/ai_calc_best_move_score.c @@ -112,3 +112,24 @@ AI_SINGLE_BATTLE_TEST("AI will select Throat Chop if the sound move is the best TURN { EXPECT_MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_HYPER_VOICE);} } } + +AI_SINGLE_BATTLE_TEST("HasMoveThatChangesKOThreshold - AI should not see self-targeted speed drops as preventing setup moves in 2hko cases") +{ + u16 move; + PARAMETRIZE { move = MOVE_EARTHQUAKE; } + PARAMETRIZE { move = MOVE_BULLDOZE; } + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_HAMMER_ARM, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(GetMoveEffect(MOVE_NASTY_PLOT) == EFFECT_SPECIAL_ATTACK_UP_2); + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == 100); + ASSUME(GetMovePower(MOVE_HAMMER_ARM) == 100); + ASSUME(GetMovePower(MOVE_BULLDOZE) == 60); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_RHYDON) { Level(100); Nature(NATURE_ADAMANT); Item(ITEM_EVIOLITE); Speed(1); Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_HAMMER_ARM, move); } + OPPONENT(SPECIES_GRIMMSNARL) { Level(100); Nature(NATURE_JOLLY); Ability(ABILITY_INFILTRATOR); Speed(2); HP(300); Moves(MOVE_NASTY_PLOT, MOVE_AURA_SPHERE); } + } WHEN { + TURN { MOVE(player, MOVE_HAMMER_ARM); EXPECT_MOVE(opponent, move == MOVE_EARTHQUAKE ? MOVE_NASTY_PLOT : MOVE_AURA_SPHERE); } + } +}