From 3ea095a941419487fc0a67726f34c75fd92d82a2 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 30 Sep 2025 21:16:02 +0200 Subject: [PATCH] More White Herb fixes/clean up (#7826) Co-authored-by: Bassoonian --- asm/macros/battle_script.inc | 5 --- data/battle_scripts_1.s | 1 - include/battle_main.h | 1 + include/battle_util.h | 2 +- src/battle_main.c | 9 +++++ src/battle_script_commands.c | 16 +++----- src/battle_util.c | 50 ++++++------------------- test/battle/hold_effect/restore_stats.c | 4 +- 8 files changed, 30 insertions(+), 58 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4cb30b27f1..cf5c97308b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1373,11 +1373,6 @@ .4byte \failInstr .endm - .macro itemstatchangeeffects battler:req - callnative BS_RunStatChangeItems - .byte \battler - .endm - .macro allyswitchswapbattlers callnative BS_AllySwitchSwapBattler .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a07cc0178b..c8bd206ca1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6761,7 +6761,6 @@ BattleScript_ActivateWeatherAbilities_Loop: return BattleScript_TryIntimidateHoldEffects: - itemstatchangeeffects BS_TARGET jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_ADRENALINE_ORB, BattleScript_TryIntimidateHoldEffectsRet jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_TryIntimidateHoldEffectsRet setstatchanger STAT_SPEED, 1, FALSE diff --git a/include/battle_main.h b/include/battle_main.h index 5c8a71a26e..58b44504d9 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -58,6 +58,7 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_NEUTRALIZING_GAS, FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES, FIRST_TURN_EVENTS_ITEM_EFFECTS, + FIRST_TURN_EVENTS_WHITE_HERB, FIRST_TURN_EVENTS_OPPORTUNIST, FIRST_TURN_EVENTS_MIRROR_HERB, FIRST_TURN_EVENTS_EJECT_PACK, diff --git a/include/battle_util.h b/include/battle_util.h index fc75904a8f..e0f69e43d3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -77,6 +77,7 @@ enum ItemCaseId ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field ITEMEFFECT_WHITE_HERB, ITEMEFFECT_WHITE_HERB_ENDTURN, + ITEMEFFECT_WHITE_HERB_FIRST_TURN, ITEMEFFECT_MIRROR_HERB, ITEMEFFECT_MIRROR_HERB_FIRST_TURN, }; @@ -408,7 +409,6 @@ bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -u32 RestoreWhiteHerbStats(u32 battler); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); diff --git a/src/battle_main.c b/src/battle_main.c index 5d1b55d03e..f7c9d2e13e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3885,6 +3885,15 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; + case FIRST_TURN_EVENTS_WHITE_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventsBeforeFirstTurnState++; + break; case FIRST_TURN_EVENTS_OPPORTUNIST: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c0938c30f1..22ec1cf256 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7822,6 +7822,11 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) return TRUE; } + for (i = 0; i < gBattlersCount; i++) + { + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i)) + return TRUE; + } for (i = 0; i < gBattlersCount; i++) { if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, i, GetBattlerAbility(i), 0, 0)) @@ -7829,7 +7834,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } for (i = 0; i < gBattlersCount; i++) { - if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) + if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, i)) return TRUE; } @@ -15352,15 +15357,6 @@ void BS_TryAllySwitch(void) } } -void BS_RunStatChangeItems(void) -{ - NATIVE_ARGS(u8 battler); - - // Change instruction before calling ItemBattleEffects. - gBattlescriptCurrInstr = cmd->nextInstr; - ItemBattleEffects(ITEMEFFECT_WHITE_HERB, GetBattlerForBattleScript(cmd->battler)); -} - static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) { u32 i, j; diff --git a/src/battle_util.c b/src/battle_util.c index 439ceb1a27..6a0b09ebbc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6575,7 +6575,7 @@ u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID) return ITEM_NO_EFFECT; } -u32 RestoreWhiteHerbStats(u32 battler) +static u32 RestoreWhiteHerbStats(u32 battler, enum ItemCaseId caseID) { u32 i, effect = 0; @@ -6592,7 +6592,12 @@ u32 RestoreWhiteHerbStats(u32 battler) gLastUsedItem = gBattleMons[battler].item; gBattleScripting.battler = battler; gPotentialItemEffectBattler = battler; - } + if (caseID == ITEMEFFECT_WHITE_HERB) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); +} + return effect; } @@ -6932,16 +6937,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) gBattleStruct->moneyMultiplierItem = 1; } break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - { - if (caseID == ITEMEFFECT_ON_SWITCH_IN) - BattleScriptCall(BattleScript_WhiteHerbRet); - else - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; case HOLD_EFFECT_CONFUSE_SPICY: if (B_BERRIES_INSTANT >= GEN_4) effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); @@ -7177,11 +7172,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_RESTORE_PP: effect = ItemRestorePp(battler, gLastUsedItem, caseID); break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - break; case HOLD_EFFECT_CONFUSE_SPICY: effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); break; @@ -7638,32 +7628,14 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case ITEMEFFECT_WHITE_HERB: case ITEMEFFECT_WHITE_HERB_ENDTURN: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - { - if (caseID == ITEMEFFECT_WHITE_HERB) - BattleScriptCall(BattleScript_WhiteHerbRet); - else - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; - default: - break; - } + case ITEMEFFECT_WHITE_HERB_FIRST_TURN: + if (battlerHoldEffect == HOLD_EFFECT_WHITE_HERB) + effect = RestoreWhiteHerbStats(battler, caseID); break; case ITEMEFFECT_MIRROR_HERB: case ITEMEFFECT_MIRROR_HERB_FIRST_TURN: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_MIRROR_HERB: + if (battlerHoldEffect == HOLD_EFFECT_MIRROR_HERB) effect = TryConsumeMirrorHerb(battler, caseID); - break; - default: - break; - } break; } diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index 52cbf2e3df..4a8f020023 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -55,10 +55,10 @@ DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); MESSAGE("The opposing Wobbuffet returned its stats to normal using its White Herb!"); - - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); MESSAGE("The opposing Wynaut returned its stats to normal using its White Herb!"); } THEN {