More White Herb fixes/clean up (#7826)

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
Alex 2025-09-30 21:16:02 +02:00 committed by GitHub
parent db43fc3c83
commit 3ea095a941
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 30 additions and 58 deletions

View File

@ -1373,11 +1373,6 @@
.4byte \failInstr
.endm
.macro itemstatchangeeffects battler:req
callnative BS_RunStatChangeItems
.byte \battler
.endm
.macro allyswitchswapbattlers
callnative BS_AllySwitchSwapBattler
.endm

View File

@ -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

View File

@ -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,

View File

@ -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);

View File

@ -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
{

View File

@ -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;

View File

@ -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;
}

View File

@ -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 {