From 02afaf2a66523c46ac38e3f719b001c03979688b Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 27 Dec 2025 22:39:45 +0000 Subject: [PATCH] Prevent AI seeing Pollen Puff damage on its ally (#8693) --- src/battle_ai_util.c | 4 ++++ test/battle/ai/ai_multi.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 20ebfdb27f..9e728d5213 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -901,6 +901,10 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u struct AiLogicData *aiData = gAiLogicData; gAiLogicData->aiCalcInProgress = TRUE; + if (moveEffect == EFFECT_HIT_ENEMY_HEAL_ALLY + && battlerDef == BATTLE_PARTNER(battlerAtk)) + return simDamage; + if (moveEffect == EFFECT_NATURE_POWER) move = GetNaturePowerMove(battlerAtk); diff --git a/test/battle/ai/ai_multi.c b/test/battle/ai/ai_multi.c index b46573b4ca..408a37f276 100644 --- a/test/battle/ai/ai_multi.c +++ b/test/battle/ai/ai_multi.c @@ -222,3 +222,31 @@ AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi b EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); } } + +AI_MULTI_BATTLE_TEST("Pollen Puff: AI correctly scores moves with EFFECT_HIT_ENEMY_HEAL_ALLY as damaging opponents but not allies") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + ASSUME(GetMoveEffect(MOVE_POLLEN_PUFF) == EFFECT_HIT_ENEMY_HEAL_ALLY); + // Speed tie so all think they are faster + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF, MOVE_CELEBRATE); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + } WHEN { + TURN { + // Targeting ally + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:opponentRight); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:playerLeft); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:opponentLeft); + + // Targeting opponent + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerLeft); + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerRight); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:opponentLeft); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:opponentRight); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerLeft); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerRight); + } + } +}