From 927f1898bb4c33f2151d077dd3c049fcf797291a Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 1 Sep 2025 13:43:12 -0400 Subject: [PATCH] AI handling for Coaching. (#7661) --- src/battle_ai_main.c | 14 ++++++++++++++ test/battle/ai/ai_doubles.c | 5 +++-- test/battle/move_effect/coaching.c | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8d9397fec7..dd837faffa 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3174,6 +3174,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || HasMoveWithCriticalHitChance(battlerAtkPartner)) ADJUST_SCORE(GOOD_EFFECT); break; + case EFFECT_COACHING: + if (!hasPartner + || !HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)) + { + ADJUST_SCORE(WORST_EFFECT); + } + else + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_DEF)); + } + break; default: break; } // our effect relative to partner diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 444f065a94..fcef1f9d0a 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -72,10 +72,11 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_EXPLOSION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + NOT_EXPECT_MOVE(opponentRight, statusMove); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 7245f8854b..642727de51 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -117,3 +117,23 @@ DOUBLE_BATTLE_TEST("Coaching fails if there's no ally") MESSAGE("But it failed!"); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Coaching") +{ + u32 move; + PARAMETRIZE { move = MOVE_HEADBUTT; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_COACHING, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } + } WHEN { + if (move == MOVE_HEADBUTT) + TURN { EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + } +}