Minor White Herb and Neutralizing Gas clean up (#7754)

This commit is contained in:
Alex 2025-09-22 15:57:47 +02:00 committed by GitHub
parent 7172639bc0
commit 780867611e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 41 additions and 39 deletions

View File

@ -49,6 +49,7 @@ enum {
ABILITYEFFECT_ATK_SYNCHRONIZE,
ABILITYEFFECT_MOVE_END_OTHER,
ABILITYEFFECT_NEUTRALIZINGGAS,
ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN,
ABILITYEFFECT_ON_WEATHER,
ABILITYEFFECT_ON_TERRAIN,
ABILITYEFFECT_SWITCH_IN_TERRAIN,
@ -71,7 +72,8 @@ enum ItemCaseId
ITEMEFFECT_ORBS,
ITEMEFFECT_LIFEORB_SHELLBELL,
ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field
ITEMEFFECT_STATS_CHANGED, // For White Herb and Eject Pack
ITEMEFFECT_WHITE_HERB,
ITEMEFFECT_WHITE_HERB_ENDTURN,
};
enum ItemEffect

View File

@ -1443,7 +1443,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
effect = TRUE;
break;
case HOLD_EFFECT_WHITE_HERB:
if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler))
if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_ENDTURN, battler))
effect = TRUE;
break;
default:

View File

@ -3851,8 +3851,13 @@ static void TryDoEventsBeforeFirstTurn(void)
gBattleStruct->eventsBeforeFirstTurnState++;
break;
case FIRST_TURN_EVENTS_NEUTRALIZING_GAS:
if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, 0, 0, 0, 0) != 0)
return;
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
{
i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++];
if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, i, gBattleMons[i].ability, 0, 0) != 0)
return;
}
gBattleStruct->switchInBattlerCounter = 0;
gBattleStruct->eventsBeforeFirstTurnState++;
break;
case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES:

View File

@ -6703,16 +6703,10 @@ static void Cmd_moveend(void)
if (!IsBattlerAlive(i))
continue;
if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_WHITE_HERB
&& RestoreWhiteHerbStats(i))
{
BattleScriptCall(BattleScript_WhiteHerbRet);
effect = TRUE;
break;
}
if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i))
return;
}
if (!effect)
gBattleScripting.moveendState++;
gBattleScripting.moveendState++;
break;
case MOVEEND_THIRD_MOVE_BLOCK:
// Special case for Steel Roller since it has to check the chosen move
@ -7687,13 +7681,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
u32 i = 0;
u32 side = GetBattlerSide(battler);
// Neutralizing Gas announces itself before hazards
if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[battler].announceNeutralizingGas == 0)
if (!gSpecialStatuses[battler].announceNeutralizingGas
&& AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, battler, gBattleMons[battler].ability, 0, 0))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS;
gSpecialStatuses[battler].announceNeutralizingGas = TRUE;
gDisableStructs[battler].neutralizingGas = TRUE;
gBattlerAbility = battler;
BattleScriptCall(BattleScript_SwitchInAbilityMsgRet);
}
// Healing Wish activates before hazards.
// Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways.
@ -15272,7 +15263,7 @@ void BS_RunStatChangeItems(void)
// Change instruction before calling ItemBattleEffects.
gBattlescriptCurrInstr = cmd->nextInstr;
ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler));
ItemBattleEffects(ITEMEFFECT_WHITE_HERB, GetBattlerForBattleScript(cmd->battler));
}
static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove)

View File

@ -5535,20 +5535,18 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
break;
case ABILITYEFFECT_NEUTRALIZINGGAS:
case ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN:
// Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards
for (i = 0; i < gBattlersCount; i++)
if (ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[battler].neutralizingGas)
{
if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[i].neutralizingGas)
{
gDisableStructs[i].neutralizingGas = TRUE;
gBattlerAbility = i;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS;
gDisableStructs[battler].neutralizingGas = TRUE;
gBattlerAbility = battler;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS;
if (caseID == ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN)
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
if (effect != 0)
break;
else
BattleScriptCall(BattleScript_SwitchInAbilityMsgRet);
effect++;
}
break;
case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes.
@ -6873,7 +6871,12 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
case HOLD_EFFECT_WHITE_HERB:
effect = RestoreWhiteHerbStats(battler);
if (effect != 0)
BattleScriptExecute(BattleScript_WhiteHerbEnd2);
{
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)
@ -7071,11 +7074,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_BLACK_SLUDGE:
if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON))
{
@ -7579,13 +7577,19 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
}
}
break;
case ITEMEFFECT_STATS_CHANGED:
case ITEMEFFECT_WHITE_HERB:
case ITEMEFFECT_WHITE_HERB_ENDTURN:
switch (battlerHoldEffect)
{
case HOLD_EFFECT_WHITE_HERB:
effect = RestoreWhiteHerbStats(battler);
if (effect != 0)
BattleScriptCall(BattleScript_WhiteHerbRet);
{
if (caseID == ITEMEFFECT_WHITE_HERB)
BattleScriptCall(BattleScript_WhiteHerbRet);
else
BattleScriptExecute(BattleScript_WhiteHerbEnd2);
}
break;
default:
break;

View File

@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Skill Swap swaps user and target's abilities")
} THEN {
EXPECT_EQ(player->ability, ABILITY_BLAZE);
EXPECT_EQ(opponent->ability, ABILITY_TELEPATHY);
}
}
}
DOUBLE_BATTLE_TEST("Skill Swap only swaps user's ability with target's ability")