diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8f11d1d67b..9d14f2b0eb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7850,3 +7850,15 @@ BattleScript_EjectButtonActivates:: switchineffects BS_SCRIPTING BattleScript_EjectButtonEnd: return + +BattleScript_EjectPackActivate_Ret:: + goto BattleScript_EjectButtonActivates + +BattleScript_EjectPackActivate_End2:: + call BattleScript_EjectPackActivate_Ret + end2 + +BattleScript_EjectPackActivates:: + jumpifcantswitch BS_SCRIPTING, BattleScript_EjectButtonEnd + goto BattleScript_EjectPackActivate_Ret + diff --git a/include/battle.h b/include/battle.h index a7b23061d8..c80dbcbc7f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -148,6 +148,7 @@ struct ProtectStruct struct SpecialStatus { + u8 statFell:1; u8 statLowered:1; u8 lightningRodRedirected:1; u8 restoredBattlerSprite: 1; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 88ffe3505c..aa51b6afad 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -354,5 +354,8 @@ extern const u8 BattleScript_AnnounceAirLockCloudNine[]; extern const u8 BattleScript_AttackerItemStatRaise[]; extern const u8 BattleScript_RedCardActivates[]; extern const u8 BattleScript_EjectButtonActivates[]; +extern const u8 BattleScript_EjectPackActivate_Ret[]; +extern const u8 BattleScript_EjectPackActivate_End2[]; +extern const u8 BattleScript_EjectPackActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0c72c581d7..9dcb58da8c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5027,7 +5027,7 @@ static void Cmd_moveend(void) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_EJECT_BUTTON && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) && (gSpecialStatuses[battler].physicalDmg != 0 || gSpecialStatuses[battler].specialDmg != 0) - && CountUsablePartyMons(battler) > 0) + && CountUsablePartyMons(battler) > 0) // has mon to switch into { gActiveBattler = gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; @@ -5061,7 +5061,7 @@ static void Cmd_moveend(void) && !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RED_CARD && (gSpecialStatuses[battler].physicalDmg != 0 || gSpecialStatuses[battler].specialDmg != 0) - && CountUsablePartyMons(battler) > 0) + && CountUsablePartyMons(battler) > 0) // has mon to switch into { gLastUsedItem = gBattleMons[battler].item; gActiveBattler = gBattleScripting.battler = battler; // battler with red card @@ -5078,6 +5078,27 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_EJECT_PACK: + { + u8 battlers[4] = {0, 1, 2, 3}; + SortBattlersBySpeed(battlers, FALSE); + for (i = 0; i < gBattlersCount; i++) + { + u8 battler = battlers[i]; + if (IsBattlerAlive(battler) + && gSpecialStatuses[battler].statFell + && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_EJECT_PACK + && CountUsablePartyMons(battler) > 0) // has mon to switch into + { + gSpecialStatuses[battler].statFell = FALSE; + gActiveBattler = gBattleScripting.battler = battler; + gLastUsedItem = gBattleMons[battler].item; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EjectPackActivates; + effect = TRUE; + break; // only fastest eject pack activates + } + } + } gBattleScripting.moveendState++; break; case MOVEEND_LIFE_ORB: @@ -9095,6 +9116,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr index++; gBattleTextBuff2[index] = B_BUFF_EOS; + gSpecialStatuses[gActiveBattler].statFell = TRUE; // for eject pack if (gBattleMons[gActiveBattler].statStages[statId] == MIN_STAT_STAGE) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else diff --git a/src/battle_util.c b/src/battle_util.c index df79bccea6..f16c538ac1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5357,6 +5357,23 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; + case HOLD_EFFECT_EJECT_PACK: + if (gSpecialStatuses[battlerId].statFell) + { + gSpecialStatuses[battlerId].statFell = FALSE; + gActiveBattler = gBattleScripting.battler = battlerId; + effect = ITEM_STATS_CHANGE; + if (moveTurn) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; + } + else + { + BattleScriptExecute(BattleScript_EjectPackActivate_End2); + } + } + break; } if (effect)