From 164e0c7ebc240e2f9d74b584f56840cb1dedcb86 Mon Sep 17 00:00:00 2001 From: GGbond Date: Tue, 10 Feb 2026 20:56:38 +0800 Subject: [PATCH] Fix Present heal miss-flag handling and enforce Telepathy blocking (#9170) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_script_commands.c | 6 ++- test/battle/move_effect/present.c | 61 ++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0627013f5a..fbf4486689 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12133,13 +12133,17 @@ static void Cmd_presentdamagecalculation(void) { gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; } + else if (gBattlerTarget == BATTLE_PARTNER(gBattlerAttacker) && GetBattlerAbility(gBattlerTarget) == ABILITY_TELEPATHY) + { + gBattlescriptCurrInstr = BattleScript_MoveMissedPause; + } else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) { gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; } else { - gBattleStruct->moveResultFlags[gBattlerTarget] &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gBattlescriptCurrInstr = BattleScript_PresentHealTarget; } } diff --git a/test/battle/move_effect/present.c b/test/battle/move_effect/present.c index bd21f13de4..224e85bf8f 100644 --- a/test/battle/move_effect/present.c +++ b/test/battle/move_effect/present.c @@ -1,4 +1,63 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Present (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_PRESENT) == EFFECT_PRESENT); +} + +SINGLE_BATTLE_TEST("Present healing through Wonder Guard is still considered to have affected the target") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIRROR_MOVE) == EFFECT_MIRROR_MOVE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); HP(1); MaxHP(100); } + } WHEN { + TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 254)); } + TURN { MOVE(opponent, MOVE_MIRROR_MOVE, WITH_RNG(RNG_PRESENT, 1)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRESENT, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_MOVE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRESENT, opponent); + HP_BAR(player); + } +} + +DOUBLE_BATTLE_TEST("Present healing is blocked by Telepathy on an ally target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); HP(50); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PRESENT, target: playerRight, WITH_RNG(RNG_PRESENT, 254)); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRESENT, playerLeft); + HP_BAR(playerRight); + } + } THEN { + EXPECT_EQ(playerRight->hp, 50); + } +} + +SINGLE_BATTLE_TEST("Present with Parental Bond hits twice when damaging, but only once when healing") +{ + GIVEN { + ASSUME(GetSpeciesAbility(SPECIES_KANGASKHAN_MEGA, 0) == ABILITY_PARENTAL_BOND); + PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_PRESENT, gimmick: GIMMICK_MEGA, WITH_RNG(RNG_PRESENT, 1)); } + TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 254)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRESENT, player); + HP_BAR(opponent); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRESENT, player); + HP_BAR(opponent); + NOT HP_BAR(opponent); + } +}