diff --git a/include/battle_util.h b/include/battle_util.h index b9652c1caf..cb8a23e929 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -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 diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 66dd1adf7c..038080b241 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -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: diff --git a/src/battle_main.c b/src/battle_main.c index 5eb147a517..4ae111357a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -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: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index af80d4468c..62e2232f73 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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) diff --git a/src/battle_util.c b/src/battle_util.c index 3d880b6f39..d6ad292682 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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; diff --git a/test/battle/move_effect/skill_swap.c b/test/battle/move_effect/skill_swap.c index c3c2ca91f4..2d47a01da3 100644 --- a/test/battle/move_effect/skill_swap.c +++ b/test/battle/move_effect/skill_swap.c @@ -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")