From c489d36fc6732dfdf4b789b23a57ff92a5692e9b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 27 May 2025 23:36:00 +0200 Subject: [PATCH] Fixes Gen3 berry activation timing (#6993) --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 10 +++++----- include/battle_util.h | 1 + src/battle_end_turn.c | 16 ++++++++++++++++ src/battle_script_commands.c | 16 +++++----------- src/battle_util.c | 11 +++++++++++ test/battle/hold_effect/restore_hp.c | 17 +++++++++++++++++ 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 41b61288ac..e671bc1649 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1012,7 +1012,7 @@ .4byte \jumpInstr .endm - .macro tryhealingitem + .macro tryrestorehpberry .byte 0xbb .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e38f7ba6f1..380213e22f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5716,7 +5716,7 @@ BattleScript_MagicRoomEnds:: setbyte gBattlerTarget, 0 BattleScript_MagicRoomHealingItemsLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 - tryhealingitem + tryrestorehpberry addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop end2 @@ -6993,7 +6993,7 @@ BattleScript_DoTurnDmg: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd - tryhealingitem + tryrestorehpberry BattleScript_DoTurnDmgEnd: end2 @@ -7241,7 +7241,7 @@ BattleScript_YawnEnd: BattleScript_EmbargoEndTurn:: printstring STRINGID_EMBARGOENDS waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry end2 BattleScript_TelekinesisEndTurn:: @@ -7533,7 +7533,7 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry BattleScript_PickupActivatesEnd: end3 @@ -7543,7 +7543,7 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry BattleScript_HarvestActivatesEnd: end3 diff --git a/include/battle_util.h b/include/battle_util.h index 6dececdf4d..2ce91c3f25 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -383,5 +383,6 @@ u32 RestoreWhiteHerbStats(u32 battler); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); +bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 5ac9a69ee4..7e9f8b15f5 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -20,6 +20,7 @@ enum EndTurnResolutionOrder ENDTURN_VARIOUS, ENDTURN_WEATHER, ENDTURN_WEATHER_DAMAGE, + ENDTURN_GEN_3_BERRY_ACTIVATION, ENDTURN_EMERGENCY_EXIT_1, ENDTURN_AFFECTION, ENDTURN_FUTURE_SIGHT, @@ -283,6 +284,20 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) return effect; } +static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler) +{ + bool32 effect = FALSE; + + if (B_HP_BERRIES >= GEN_4) // Skip handler for > Gen3 + { + gBattleStruct->endTurnEventsCounter++; + return effect; + } + gBattleStruct->turnEffectsBattlerId++; + effect = TryRestoreHPBerries(battler, ITEMEFFECT_NORMAL); + return effect; +} + static bool32 HandleEndTurnEmergencyExit(u32 battler) { bool32 effect = FALSE; @@ -1514,6 +1529,7 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = [ENDTURN_VARIOUS] = HandleEndTurnVarious, [ENDTURN_WEATHER] = HandleEndTurnWeather, [ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage, + [ENDTURN_GEN_3_BERRY_ACTIVATION] = HandleEndTurnGenThreeBerryActivation, [ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit, [ENDTURN_AFFECTION] = HandleEndTurnAffection, [ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ec9dd03601..aaf479ad9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -533,7 +533,7 @@ static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); -static void Cmd_tryhealingitem(void); +static void Cmd_tryrestorehpberry(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); @@ -792,7 +792,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_tryhealingitem, //0xBB + Cmd_tryrestorehpberry, //0xBB Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE @@ -14274,17 +14274,11 @@ static void Cmd_jumpifnopursuitswitchdmg(void) } } -static void Cmd_tryhealingitem(void) +static void Cmd_tryrestorehpberry(void) { CMD_ARGS(); - - if (gItemsInfo[gBattleMons[gBattlerAttacker].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice - { - if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerAttacker, FALSE)) - return; - } - + if (TryRestoreHPBerries(gBattlerAttacker, ITEMEFFECT_TRY_HEALING)) + return; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index a3b58e3ea7..6d256dc998 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11442,3 +11442,14 @@ void UpdateStallMons(void) } // Handling for moves that target multiple opponents in doubles not handled currently } + +bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) +{ + if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES + || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + { + if (ItemBattleEffects(caseId, battler, FALSE)) + return TRUE; + } + return FALSE; +} diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index ef96ead7e4..9db149c023 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -63,3 +63,20 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } + +#if B_HP_BERRIES <= GEN_3 +SINGLE_BATTLE_TEST("Restore HP Berry triggers only during the end turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} +#endif