diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index fbe8dd5390..ee66aa993c 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -877,7 +877,7 @@ static u32 ChooseMoveOrAction_Doubles(enum BattlerId battler) for (enum BattlerId battlerIndex = 0; battlerIndex < MAX_BATTLERS_COUNT; battlerIndex++) { - if (battlerIndex == battler || gBattleMons[battlerIndex].hp == 0) + if (gBattleMons[battlerIndex].hp == 0) { actionOrMoveIndex[battlerIndex] = 0xFF; bestMovePointsForTarget[battlerIndex] = -1; @@ -987,12 +987,14 @@ static u32 ChooseMoveOrAction_Doubles(enum BattlerId battler) static inline bool32 ShouldConsiderMoveForBattler(enum BattlerId battlerAi, enum BattlerId battlerDef, enum Move move) { + enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAi, move); if (battlerAi == BATTLE_PARTNER(battlerDef)) { - enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAi, move); if (target == TARGET_BOTH || target == TARGET_OPPONENTS_FIELD) return FALSE; } + if (!IsBattlerAlly(battlerAi, battlerDef) && target == TARGET_USER_OR_ALLY) + return FALSE; return TRUE; } @@ -3893,6 +3895,12 @@ static s32 AI_DoubleBattle(enum BattlerId battlerAtk, enum BattlerId battlerDef, ADJUST_SCORE(WORST_EFFECT); break; } + case EFFECT_ACUPRESSURE: + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_ATK_2)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_SPATK_2)); + break; + } default: break; } // attacker move effects diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index d1e2895cbe..37eeecfd38 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -462,7 +462,7 @@ static void OpponentHandleChooseMove(enum BattlerId battler) u32 chosenMove = moveInfo->moves[chosenMoveIndex]; enum MoveTarget target = GetBattlerMoveTargetType(battler, chosenMove); - if (target == TARGET_USER || target == TARGET_USER_OR_ALLY) + if (target == TARGET_USER) gBattlerTarget = battler; if (target == TARGET_BOTH) diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index dcd6328cfa..798a541634 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -1270,3 +1270,18 @@ AI_SINGLE_BATTLE_TEST("AI will not try to withstand hit with absorbing move if i TURN { MOVE(player, MOVE_DRAGON_RAGE); EXPECT_MOVE(opponent, MOVE_ENERGY_BALL); } } } + +AI_DOUBLE_BATTLE_TEST("AI can use Acupressure on its ally") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_WYNAUT) { HP(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_ACUPRESSURE); } + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentRight, MOVE_SCRATCH, target:playerRight); EXPECT_MOVE(opponentLeft, MOVE_ACUPRESSURE, target:opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ACUPRESSURE, opponentLeft); + } +} diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index a3b7b070b5..6db1ec029a 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -692,7 +692,7 @@ AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Last Switchin") MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_CELEBRATE); } } WHEN { TURN { - EXPECT_MOVE(opponentLeft, MOVE_MEMENTO, target: opponentRight); EXPECT_SEND_OUT(opponentLeft,1); + EXPECT_MOVE(opponentLeft, MOVE_MEMENTO, target: playerRight); EXPECT_SEND_OUT(opponentLeft,1); MOVE(playerRight, MOVE_MEMENTO, target: opponentRight); SEND_OUT(playerRight,4); EXPECT_MOVE(opponentRight, MOVE_MEMENTO, target: playerRight); EXPECT_SEND_OUT(opponentRight,4); }