From 0e33bf916e80e4dcf4f96ca0419a8b2fda5da51d Mon Sep 17 00:00:00 2001 From: moostoet <70690976+moostoet@users.noreply.github.com> Date: Sat, 3 Jan 2026 08:50:17 +0100 Subject: [PATCH] Fix berry activation timing for Yawn sleep and Leech Seed damage (#8776) --- data/battle_scripts_1.s | 2 ++ include/constants/hold_effects.h | 1 + src/battle_script_commands.c | 4 ++++ test/battle/hold_effect/cure_status.c | 19 +++++++++++++++++++ test/battle/hold_effect/restore_hp.c | 19 +++++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e37074b339..b7abe25190 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4958,6 +4958,7 @@ BattleScript_LeechSeedTurnDrain: healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER + tryactivateitem BS_ATTACKER, ACTIVATION_ON_HP_THRESHOLD return BattleScript_BideStoringEnergy:: @@ -6294,6 +6295,7 @@ BattleScript_YawnMakesAsleepEnd2:: waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate + tryactivateitem BS_EFFECT_BATTLER, ACTIVATION_ON_STATUS_CHANGE jumpfifsemiinvulnerable BS_EFFECT_BATTLER, STATE_SKY_DROP, BattleScript_YawnEnd makevisible BS_EFFECT_BATTLER skydropyawn diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 32dacc36d3..8be7b39bf2 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -157,6 +157,7 @@ enum ItemActivationState ACTIVATION_ON_PICK_UP, ACTIVATION_ON_HARVEST, ACTIVATION_ON_HP_THRESHOLD, + ACTIVATION_ON_STATUS_CHANGE, }; #endif // GUARD_HOLD_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 126bb76d4c..edbe3f89ea 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12211,6 +12211,10 @@ static void Cmd_tryactivateitem(void) if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnHpThresholdActivation)) return; break; + case ACTIVATION_ON_STATUS_CHANGE: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnStatusChangeActivation)) + return; + break; } } diff --git a/test/battle/hold_effect/cure_status.c b/test/battle/hold_effect/cure_status.c index 0f389af4d5..0318d3991a 100644 --- a/test/battle/hold_effect/cure_status.c +++ b/test/battle/hold_effect/cure_status.c @@ -116,6 +116,25 @@ SINGLE_BATTLE_TEST("Chesto and Lum Berries cure sleep") } } +SINGLE_BATTLE_TEST("Chesto Berry cures sleep when Yawn takes effect") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHESTO_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_YAWN); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + STATUS_ICON(player, sleep: FALSE); + } +} + TO_DO_BATTLE_TEST("Chesto and Lum Berries don't trigger if the holder has Comatose") SINGLE_BATTLE_TEST("Cheri and Lum Berries cure paralysis") diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index ef96ead7e4..2441e92449 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -63,3 +63,22 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } + +SINGLE_BATTLE_TEST("Sitrus Berry restores HP immediately after Leech Seed damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(80); HP(41); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_LEECH_SEED); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, player); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } +}