diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dcf223070b..515c28d85c 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -820,17 +820,18 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; - s32 defAbility = AI_DATA->abilities[battlerDef]; + u32 defAbility = AI_DATA->abilities[battlerDef]; + u32 atkAbility = AI_DATA->abilities[battlerAtk]; // Check if physical moves hurt. - if (AI_DATA->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS + if (AI_DATA->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) { - if (IS_MOVE_PHYSICAL(move1) && !IS_MOVE_PHYSICAL(move2)) + if (gMovesInfo[move1].makesContact && !gMovesInfo[move2].makesContact) + return -1; + if (gMovesInfo[move2].makesContact && !gMovesInfo[move1].makesContact) return 1; - if (IS_MOVE_PHYSICAL(move2) && !IS_MOVE_PHYSICAL(move1)) - return 0; } // Check additional effects. diff --git a/test/battle/ai.c b/test/battle/ai.c index 59acdf966c..f69a748bc9 100644 --- a/test/battle/ai.c +++ b/test/battle/ai.c @@ -1000,3 +1000,27 @@ AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical i TURN { EXPECT_MOVE(opponent, MOVE_STORM_THROW); } } } + +AI_SINGLE_BATTLE_TEST("AI avoids contact moves against rocky helmet") +{ + u32 item; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_ROCKY_HELMET; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_BRANCH_POKE].makesContact); + ASSUME(!gMovesInfo[MOVE_LEAFAGE].makesContact); + ASSUME(gMovesInfo[MOVE_BRANCH_POKE].power == gMovesInfo[MOVE_LEAFAGE].power); + ASSUME(gMovesInfo[MOVE_BRANCH_POKE].type == gMovesInfo[MOVE_LEAFAGE].type); + ASSUME(gMovesInfo[MOVE_BRANCH_POKE].category == gMovesInfo[MOVE_LEAFAGE].category); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BRANCH_POKE, MOVE_LEAFAGE); } + } WHEN { + if (item == ITEM_ROCKY_HELMET) + TURN { EXPECT_MOVE(opponent, MOVE_LEAFAGE); } + else + TURN { EXPECT_MOVES(opponent, MOVE_LEAFAGE, MOVE_BRANCH_POKE); } + } +}