Clean up battlescript calls with func BattleScriptCall (#6873)

This commit is contained in:
Alex 2025-05-31 09:09:35 +02:00 committed by GitHub
parent 21499cbee1
commit eb81820ae3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 217 additions and 448 deletions

View File

@ -222,6 +222,7 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler);
void UpdateSentPokesToOpponentValue(u32 battler);
void BattleScriptPush(const u8 *bsPtr);
void BattleScriptPushCursor(void);
void BattleScriptCall(const u8 *bsPtr);
void BattleScriptPop(void);
u32 TrySetCantSelectMoveBattleScript(u32 battler);
u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check);

View File

@ -502,10 +502,9 @@ void BS_UndoDynamax(void)
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX)
{
BattleScriptPushCursor();
UndoDynamax(battler);
gBattleScripting.battler = battler;
gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret;
BattleScriptCall(BattleScript_DynamaxEnds_Ret);
return;
}

View File

@ -1341,8 +1341,7 @@ static void Cmd_attackcanceler(void)
}
else
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MagicCoat;
BattleScriptCall(BattleScript_MagicCoat);
}
return;
}
@ -1367,8 +1366,7 @@ static void Cmd_attackcanceler(void)
{
ClearDamageCalcResults();
SetAtkCancellerForCalledMove(); // Edge case for bouncing a powder move against a grass type pokemon.
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MagicBounce;
BattleScriptCall(BattleScript_MagicBounce);
gBattlerAbility = battler;
return;
}
@ -1391,8 +1389,7 @@ static void Cmd_attackcanceler(void)
gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE;
gBattleStruct->snatchedMoveIsUsed = TRUE;
gBattleScripting.battler = gBattlerByTurnOrder[i];
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SnatchedMove;
BattleScriptCall(BattleScript_SnatchedMove);
return;
}
}
@ -1401,16 +1398,14 @@ static void Cmd_attackcanceler(void)
{
gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE;
gLastUsedAbility = ABILITY_LIGHTNING_ROD;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TookAttack;
BattleScriptCall(BattleScript_TookAttack);
RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected)
{
gSpecialStatuses[gBattlerTarget].stormDrainRedirected = FALSE;
gLastUsedAbility = ABILITY_STORM_DRAIN;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TookAttack;
BattleScriptCall(BattleScript_TookAttack);
RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)
@ -2282,8 +2277,7 @@ static void Cmd_adjustdamage(void)
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
&& gBattleMons[gBattlerAttacker].item)
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_GemActivates;
BattleScriptCall(BattleScript_GemActivates);
gLastUsedItem = gBattleMons[gBattlerAttacker].item;
}
}
@ -2301,8 +2295,7 @@ static void Cmd_multihitresultmessage(void)
if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_STURDIED)
{
gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SturdiedMsg;
BattleScriptCall(BattleScript_SturdiedMsg);
return;
}
else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_HUNG_ON)
@ -2310,8 +2303,7 @@ static void Cmd_multihitresultmessage(void)
gLastUsedItem = gBattleMons[gBattlerTarget].item;
gPotentialItemEffectBattler = gBattlerTarget;
gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
BattleScriptCall(BattleScript_HangedOnMsg);
return;
}
}
@ -2377,8 +2369,7 @@ static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, u32 moveType)
&& !gBattleStruct->printedStrongWindsWeakenedAttack)
{
gBattleStruct->printedStrongWindsWeakenedAttack = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds;
BattleScriptCall(BattleScript_AttackWeakenedByStrongWinds);
return TRUE;
}
}
@ -2392,8 +2383,7 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef)
{
gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE;
gBattleScripting.battler = battlerDef;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups;
BattleScriptCall(BattleScript_TeraShellDistortingTypeMatchups);
return TRUE;
}
return FALSE;
@ -2408,8 +2398,7 @@ static inline bool32 TryActivateWeakenessBerry(u32 battlerDef)
gBattleScripting.battler = battlerDef;
gLastUsedItem = gBattleMons[battlerDef].item;
gBattleStruct->partyState[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]].ateBerry = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryReduceDmg;
BattleScriptCall(BattleScript_BerryReduceDmg);
return TRUE;
}
@ -2653,8 +2642,7 @@ static void Cmd_datahpupdate(void)
if (gDisableStructs[battler].substituteHP == 0)
{
gBattlescriptCurrInstr = cmd->nextInstr;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SubstituteFade;
BattleScriptCall(BattleScript_SubstituteFade);
return;
}
}
@ -2868,11 +2856,10 @@ static void Cmd_resultmessage(void)
gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE;
u32 side = GetBattlerSide(gBattlerTarget);
if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE)
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species;
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species;
gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE;
gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage;
BattleScriptCall(BattleScript_IceFaceNullsDamage);
return;
}
@ -2883,8 +2870,7 @@ static void Cmd_resultmessage(void)
{
gMultiHitCounter = 0;
*moveResultFlags &= ~MOVE_RESULT_MISSED;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
BattleScriptCall(BattleScript_MultiHitPrintStrings);
return;
}
@ -2962,8 +2948,7 @@ static void Cmd_resultmessage(void)
gLastUsedItem = gBattleMons[gBattlerTarget].item;
gPotentialItemEffectBattler = gBattlerTarget;
*moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
BattleScriptCall(BattleScript_HangedOnMsg);
return;
default:
if (*moveResultFlags & MOVE_RESULT_ONE_HIT_KO)
@ -2971,22 +2956,19 @@ static void Cmd_resultmessage(void)
*moveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO;
*moveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
*moveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_OneHitKOMsg;
BattleScriptCall(BattleScript_OneHitKOMsg);
return;
}
else if (*moveResultFlags & MOVE_RESULT_STURDIED)
{
*moveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SturdiedMsg;
BattleScriptCall(BattleScript_SturdiedMsg);
return;
}
else if (*moveResultFlags & MOVE_RESULT_FOE_ENDURED)
{
*moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EnduredMsg;
BattleScriptCall(BattleScript_EnduredMsg);
return;
}
else if (*moveResultFlags & MOVE_RESULT_FOE_HUNG_ON)
@ -2994,8 +2976,7 @@ static void Cmd_resultmessage(void)
gLastUsedItem = gBattleMons[gBattlerTarget].item;
gPotentialItemEffectBattler = gBattlerTarget;
*moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
BattleScriptCall(BattleScript_HangedOnMsg);
return;
}
else if (*moveResultFlags & MOVE_RESULT_FAILED)
@ -3005,8 +2986,7 @@ static void Cmd_resultmessage(void)
else if (B_AFFECTION_MECHANICS == TRUE && (*moveResultFlags & MOVE_RESULT_FOE_ENDURED_AFFECTION))
{
*moveResultFlags &= ~MOVE_RESULT_FOE_ENDURED_AFFECTION;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_AffectionBasedEndurance;
BattleScriptCall(BattleScript_AffectionBasedEndurance);
return;
}
}
@ -4704,10 +4684,9 @@ static void Cmd_dofaintanimation(void)
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX)
{
BattleScriptPushCursor();
UndoDynamax(battler);
gBattleScripting.battler = battler;
gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret;
BattleScriptCall(BattleScript_DynamaxEnds_Ret);
return;
}
@ -5179,9 +5158,8 @@ static void Cmd_getexp(void)
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, expBattler, *expMonId);
PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL));
BattleScriptPushCursor();
gLeveledUpInBattle |= 1 << *expMonId;
gBattlescriptCurrInstr = BattleScript_LevelUp;
BattleScriptCall(BattleScript_LevelUp);
gBattleStruct->battlerExpReward = T1_READ_32(&gBattleResources->bufferB[expBattler][2]);
AdjustFriendship(&gPlayerParty[*expMonId], FRIENDSHIP_EVENT_GROW_LEVEL);
@ -6087,8 +6065,7 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef)
if (GetBattlerAbility(battlerDef) == ABILITY_STICKY_HOLD && IsBattlerAlive(battlerDef))
{
gBattlerAbility = battlerDef;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;
BattleScriptCall(BattleScript_StickyHoldActivates);
}
else
{
@ -6111,8 +6088,7 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef)
gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[battlerDef];
}
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_KnockedOff;
BattleScriptCall(BattleScript_KnockedOff);
}
return TRUE;
}
@ -6225,8 +6201,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
StealTargetItem(battlerAtk, battlerDef);
gBattleScripting.battler = gBattlerAbility = battlerAtk;
gEffectBattler = battlerDef;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MagicianActivates;
BattleScriptCall(BattleScript_MagicianActivates);
effect = TRUE;
}
break;
@ -6259,8 +6234,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
SET_STATCHANGER(stat, numMonsFainted, FALSE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, stat);
gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget;
BattleScriptCall(BattleScript_RaiseStatOnFaintingTarget);
effect = TRUE;
}
}
@ -6285,8 +6259,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species);
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species;
gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker;
BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker);
effect = TRUE;
}
else
@ -6316,8 +6289,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
gLastUsedAbility = abilityAtk;
gBattlerAbility = battlerAtk;
gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EffectBattleBondStatIncrease;
BattleScriptCall(BattleScript_EffectBattleBondStatIncrease);
effect = TRUE;
}
}
@ -6376,8 +6348,7 @@ static void Cmd_moveend(void)
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect;
BattleScriptCall(BattleScript_SpikyShieldEffect);
effect = 1;
}
break;
@ -6392,8 +6363,7 @@ static void Cmd_moveend(void)
gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1;
else
gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_KingsShieldEffect;
BattleScriptCall(BattleScript_KingsShieldEffect);
effect = 1;
}
break;
@ -6403,8 +6373,7 @@ static void Cmd_moveend(void)
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER;
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect;
BattleScriptCall(BattleScript_BanefulBunkerEffect);
effect = 1;
}
break;
@ -6414,8 +6383,7 @@ static void Cmd_moveend(void)
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleScripting.moveEffect = MOVE_EFFECT_BURN | MOVE_EFFECT_AFFECTS_USER;
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect;
BattleScriptCall(BattleScript_BanefulBunkerEffect);
effect = 1;
}
break;
@ -6429,8 +6397,7 @@ static void Cmd_moveend(void)
gBattlerAttacker = gBattlerTarget;
gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable
gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_KingsShieldEffect;
BattleScriptCall(BattleScript_KingsShieldEffect);
effect = 1;
}
break;
@ -6442,8 +6409,7 @@ static void Cmd_moveend(void)
gBattlerAttacker = gBattlerTarget;
gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable
gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_KingsShieldEffect;
BattleScriptCall(BattleScript_KingsShieldEffect);
effect = 1;
}
break;
@ -6460,8 +6426,7 @@ static void Cmd_moveend(void)
gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN;
BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1);
MarkBattlerForControllerExec(gBattlerAttacker);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BeakBlastBurn;
BattleScriptCall(BattleScript_BeakBlastBurn);
effect = 1;
}
}
@ -6483,14 +6448,12 @@ static void Cmd_moveend(void)
gBattleStruct->moveDamage[gBattlerAttacker] *= -1;
gHitMarker |= HITMARKER_PASSIVE_DAMAGE;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EffectAbsorbLiquidOoze;
BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze);
}
else
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EffectAbsorb;
BattleScriptCall(BattleScript_EffectAbsorb);
}
}
gBattleScripting.moveendState++;
@ -6506,8 +6469,7 @@ static void Cmd_moveend(void)
&& CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN))
{
SET_STATCHANGER(STAT_ATK, 1, FALSE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RageIsBuilding;
BattleScriptCall(BattleScript_RageIsBuilding);
effect = TRUE;
}
gBattleScripting.moveendState++;
@ -6603,23 +6565,22 @@ static void Cmd_moveend(void)
}
effect = TRUE;
BattleScriptPushCursor();
if (targetAbility == ABILITY_SUCTION_CUPS)
{
gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet;
BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet);
}
else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED)
{
gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet;
BattleScriptCall(BattleScript_PrintMonIsRootedRet);
}
else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)
{
gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed;
BattleScriptCall(BattleScript_HitSwitchTargetDynamaxed);
}
else
{
gBattleScripting.switchCase = B_SWITCH_HIT;
gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget;
BattleScriptCall(BattleScript_TryHitSwitchTarget);
}
}
break;
@ -6899,11 +6860,10 @@ static void Cmd_moveend(void)
gBattleScripting.multihitString[4]++;
if (gMultiHitCounter == 0)
{
BattleScriptPushCursor();
if (GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty())
gBattlescriptCurrInstr = BattleScript_ScaleShot;
BattleScriptCall(BattleScript_ScaleShot);
else
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
BattleScriptCall(BattleScript_MultiHitPrintStrings);
effect = TRUE;
}
else
@ -6936,8 +6896,7 @@ static void Cmd_moveend(void)
}
else
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
BattleScriptCall(BattleScript_MultiHitPrintStrings);
effect = TRUE;
}
}
@ -6959,8 +6918,7 @@ static void Cmd_moveend(void)
gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE;
BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1);
MarkBattlerForControllerExec(gBattlerTarget);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove;
BattleScriptCall(BattleScript_DefrostedViaFireMove);
effect = TRUE;
}
if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE
@ -6972,8 +6930,7 @@ static void Cmd_moveend(void)
gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE;
BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1);
MarkBattlerForControllerExec(gBattlerTarget);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove;
BattleScriptCall(BattleScript_FrostbiteHealedViaFireMove);
effect = TRUE;
}
gBattleScripting.moveendState++;
@ -7002,8 +6959,7 @@ static void Cmd_moveend(void)
if (gBattleStruct->moveDamage[gBattlerAttacker] == 0)
gBattleStruct->moveDamage[gBattlerAttacker] = 1;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RecoilIfMiss;
BattleScriptCall(BattleScript_RecoilIfMiss);
effect = TRUE;
}
break;
@ -7011,8 +6967,7 @@ static void Cmd_moveend(void)
if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker))
{
gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleStruct->moveDamage[gBattlerTarget] * max(1, GetMoveRecoil(gCurrentMove)) / 100);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil;
BattleScriptCall(BattleScript_MoveEffectRecoil);
effect = TRUE;
}
break;
@ -7020,8 +6975,7 @@ static void Cmd_moveend(void)
if (!IsAbilityOnField(ABILITY_DAMP))
{
gBattleStruct->moveDamage[gBattlerAttacker] = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_FaintAttackerForExplosion;
BattleScriptCall(BattleScript_FaintAttackerForExplosion);
effect = TRUE;
}
break;
@ -7032,16 +6986,14 @@ static void Cmd_moveend(void)
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD)
{
gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MaxHp50Recoil;
BattleScriptCall(BattleScript_MaxHp50Recoil);
effect = TRUE;
}
break;
case EFFECT_RAPID_SPIN:
if (IsBattlerTurnDamaged(gBattlerTarget))
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RapidSpinAway;
BattleScriptCall(BattleScript_RapidSpinAway);
effect = TRUE;
}
break;
@ -7054,8 +7006,7 @@ static void Cmd_moveend(void)
{
SET_STATCHANGER(STAT_ATK, GetGenConfig(GEN_CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat;
BattleScriptCall(BattleScript_FellStingerRaisesStat);
effect = TRUE;
}
break;
@ -7115,8 +7066,7 @@ static void Cmd_moveend(void)
gLastUsedItem = gBattleMons[battler].item;
effect = TRUE;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectButtonActivates;
BattleScriptCall(BattleScript_EjectButtonActivates);
gAiLogicData->ejectButtonSwitch = TRUE;
break; // Only the fastest Eject Button activates
}
@ -7169,8 +7119,7 @@ static void Cmd_moveend(void)
gLastUsedItem = gBattleMons[battler].item;
effect = TRUE;
gBattleStruct->battlerState[battler].usedEjectItem = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectPackActivates;
BattleScriptCall(BattleScript_EjectPackActivates);
gAiLogicData->ejectPackSwitch = TRUE;
break; // Only the fastest Eject item activates
}
@ -7189,8 +7138,7 @@ static void Cmd_moveend(void)
if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_WHITE_HERB
&& RestoreWhiteHerbStats(i))
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
BattleScriptCall(BattleScript_WhiteHerbRet);
effect = TRUE;
break;
}
@ -7232,13 +7180,12 @@ static void Cmd_moveend(void)
SaveBattlerAttacker(gBattlerAttacker);
gBattleScripting.battler = battler;
gEffectBattler = gBattlerAttacker;
BattleScriptPushCursor();
if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG
|| GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)
gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch;
BattleScriptCall(BattleScript_RedCardActivationNoSwitch);
else
gBattlescriptCurrInstr = BattleScript_RedCardActivates;
BattleScriptCall(BattleScript_RedCardActivates);
break; // Only fastest red card activates
}
}
@ -7281,8 +7228,7 @@ static void Cmd_moveend(void)
StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item
gEffectBattler = gBattlerAttacker;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_Pickpocket; // Includes sticky hold check to print separate string
BattleScriptCall(BattleScript_Pickpocket); // Includes sticky hold check to print separate string
effect = TRUE;
break; // Pickpocket activates on fastest mon, so exit loop.
}
@ -7325,12 +7271,11 @@ static void Cmd_moveend(void)
effect = TRUE;
gBattleScripting.battler = battler;
BattleScriptPushCursor();
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || IsOnPlayerSide(battler))
gBattlescriptCurrInstr = BattleScript_EmergencyExit;
BattleScriptCall(BattleScript_EmergencyExit);
else
gBattlescriptCurrInstr = BattleScript_EmergencyExitWild;
BattleScriptCall(BattleScript_EmergencyExitWild);
break; // Only the fastest Emergency Exit / Wimp Out activates
}
@ -7348,8 +7293,7 @@ static void Cmd_moveend(void)
&& !NoAliveMonsForBattlerSide(gBattlerTarget))
{
effect = TRUE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EffectHitEscape;
BattleScriptCall(BattleScript_EffectHitEscape);
}
gBattleScripting.moveendState++;
break;
@ -7370,8 +7314,7 @@ static void Cmd_moveend(void)
gLastUsedAbility = gBattleMons[BATTLE_PARTNER(i)].ability;
gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(i);
gBattlerAttacker = i;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SymbiosisActivates;
BattleScriptCall(BattleScript_SymbiosisActivates);
effect = TRUE;
}
}
@ -8168,15 +8111,14 @@ static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId)
gBattleScripting.battler = battler;
gBattleCommunication[MULTISTRING_CHOOSER] = multistringId;
BattleScriptPushCursor();
if (gBattlescriptCurrInstr[1] == BS_TARGET)
gBattlescriptCurrInstr = BattleScript_DmgHazardsOnTarget;
BattleScriptCall(BattleScript_DmgHazardsOnTarget);
else if (gBattlescriptCurrInstr[1] == BS_ATTACKER)
gBattlescriptCurrInstr = BattleScript_DmgHazardsOnAttacker;
BattleScriptCall(BattleScript_DmgHazardsOnAttacker);
else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING)
gBattlescriptCurrInstr = BattleScript_DmgHazardsOnBattlerScripting;
BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting);
else
gBattlescriptCurrInstr = BattleScript_DmgHazardsOnFaintedBattler;
BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler);
}
bool32 DoSwitchInAbilities(u32 battler)
@ -8208,8 +8150,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gSpecialStatuses[battler].announceNeutralizingGas = TRUE;
gDisableStructs[battler].neutralizingGas = TRUE;
gBattlerAbility = battler;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SwitchInAbilityMsgRet;
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.
@ -8219,14 +8160,12 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gBattlerAttacker = battler;
if (gBattleStruct->battlerState[battler].storedHealingWish)
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HealingWishActivates;
BattleScriptCall(BattleScript_HealingWishActivates);
gBattleStruct->battlerState[battler].storedHealingWish = FALSE;
}
else // Lunar Dance
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_LunarDanceActivates;
BattleScriptCall(BattleScript_LunarDanceActivates);
gBattleStruct->battlerState[battler].storedLunarDance = FALSE;
}
}
@ -8265,8 +8204,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_TOXIC_SPIKES;
gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0;
gBattleScripting.battler = battler;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ToxicSpikesAbsorbed;
BattleScriptCall(BattleScript_ToxicSpikesAbsorbed);
}
else if (IsBattlerAffectedByHazards(battler, TRUE))
{
@ -8283,11 +8221,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1);
MarkBattlerForControllerExec(battler);
gBattleScripting.battler = battler;
BattleScriptPushCursor();
if (tspikes == 0)
gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned;
BattleScriptCall(BattleScript_ToxicSpikesPoisoned);
else
gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned;
BattleScriptCall(BattleScript_ToxicSpikesBadlyPoisoned);
}
}
}
@ -8299,8 +8236,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gDisableStructs[battler].stickyWebDone = TRUE;
gBattleScripting.battler = battler;
SET_STATCHANGER(STAT_SPEED, 1, TRUE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn;
BattleScriptCall(BattleScript_StickyWebOnSwitchIn);
}
else if (!(gDisableStructs[battler].steelSurgeDone)
&& (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEELSURGE)
@ -8318,9 +8254,8 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gBattleStruct->zmove.healReplacement = FALSE;
gBattleStruct->moveDamage[battler] = -1 * (gBattleMons[battler].maxHP);
gBattleScripting.battler = battler;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP;
gBattlescriptCurrInstr = BattleScript_HealReplacementZMove;
BattleScriptCall(BattleScript_HealReplacementZMove);
return TRUE;
}
else
@ -9699,8 +9634,7 @@ static void RemoveAllTerrains(void)
PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);\
*sideStatuses &= ~status; \
sideTimer->structField = 0; \
BattleScriptPushCursor(); \
gBattlescriptCurrInstr = battlescript; \
BattleScriptCall(battlescript); \
} \
else \
{ \
@ -9741,15 +9675,13 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear)
if (gBattleWeather & B_WEATHER_FOG)
{
gBattleWeather &= ~B_WEATHER_FOG;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_FogEnded_Ret;
BattleScriptCall(BattleScript_FogEnded_Ret);
return TRUE;
}
if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY))
{
RemoveAllTerrains();
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TerrainEnds_Ret;
BattleScriptCall(BattleScript_TerrainEnds_Ret);
return TRUE;
}
}
@ -9785,8 +9717,7 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear)
gBattlerTarget = i;
gDisableStructs[i].substituteHP = 0;
gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SubstituteFade;
BattleScriptCall(BattleScript_SubstituteFade);
}
gBattlerAttacker = saveBattler;
return TRUE;
@ -10174,16 +10105,15 @@ static void Cmd_various(void)
{
gLastUsedItem = gBattleMons[gBattlerTarget].item;
RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE));
BattleScriptPushCursor();
// If Frisk identifies two mons' items, show the pop-up only once.
if (gBattleStruct->friskedAbility)
{
gBattlescriptCurrInstr = BattleScript_FriskMsg;
BattleScriptCall(BattleScript_FriskMsg);
}
else
{
gBattleStruct->friskedAbility = TRUE;
gBattlescriptCurrInstr = BattleScript_FriskMsgWithPopup;
BattleScriptCall(BattleScript_FriskMsgWithPopup);
}
return;
}
@ -10624,8 +10554,7 @@ static void Cmd_various(void)
{
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ScriptingAbilityStatRaise;
BattleScriptCall(BattleScript_ScriptingAbilityStatRaise);
return;
}
}
@ -11172,8 +11101,7 @@ static void Cmd_various(void)
VARIOUS_ARGS(const u8 *failInstr);
if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler))
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet;
BattleScriptCall(BattleScript_ConsumableStatRaiseRet);
}
else
{
@ -14351,50 +14279,43 @@ static void Cmd_rapidspinfree(void)
gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED;
gBattlerTarget = gBattleStruct->wrappedBy[gBattlerAttacker];
PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WrapFree;
BattleScriptCall(BattleScript_WrapFree);
}
else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED)
{
gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED;
gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_LeechSeedFree;
BattleScriptCall(BattleScript_LeechSeedFree);
}
else if (gSideStatuses[atkSide] & SIDE_STATUS_SPIKES)
{
gSideStatuses[atkSide] &= ~SIDE_STATUS_SPIKES;
gSideTimers[atkSide].spikesAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SpikesFree;
BattleScriptCall(BattleScript_SpikesFree);
}
else if (gSideStatuses[atkSide] & SIDE_STATUS_TOXIC_SPIKES)
{
gSideStatuses[atkSide] &= ~SIDE_STATUS_TOXIC_SPIKES;
gSideTimers[atkSide].toxicSpikesAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ToxicSpikesFree;
BattleScriptCall(BattleScript_ToxicSpikesFree);
}
else if (gSideStatuses[atkSide] & SIDE_STATUS_STICKY_WEB)
{
gSideStatuses[atkSide] &= ~SIDE_STATUS_STICKY_WEB;
gSideTimers[atkSide].stickyWebAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_StickyWebFree;
BattleScriptCall(BattleScript_StickyWebFree);
}
else if (gSideStatuses[atkSide] & SIDE_STATUS_STEALTH_ROCK)
{
gSideStatuses[atkSide] &= ~SIDE_STATUS_STEALTH_ROCK;
gSideTimers[atkSide].stealthRockAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_StealthRockFree;
BattleScriptCall(BattleScript_StealthRockFree);
}
else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE)
{
gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE;
gSideTimers[atkSide].steelsurgeAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SteelsurgeFree;
BattleScriptCall(BattleScript_SteelsurgeFree);
}
else
{
@ -16686,15 +16607,13 @@ void BS_DoStockpileStatChangesWearOff(void)
{
SET_STATCHANGER(STAT_DEF, abs(gDisableStructs[battler].stockpileDef), TRUE);
gDisableStructs[battler].stockpileDef = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = cmd->statChangeInstr;
BattleScriptCall(cmd->statChangeInstr);
}
else if (gDisableStructs[battler].stockpileSpDef)
{
SET_STATCHANGER(STAT_SPDEF, abs(gDisableStructs[battler].stockpileSpDef), TRUE);
gDisableStructs[battler].stockpileSpDef = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = cmd->statChangeInstr;
BattleScriptCall(cmd->statChangeInstr);
}
else
{
@ -16857,8 +16776,7 @@ void BS_TrySymbiosis(void)
gLastUsedAbility = gBattleMons[partner].ability;
gBattleScripting.battler = gBattlerAbility = partner;
gEffectBattler = battler;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SymbiosisActivates;
BattleScriptCall(BattleScript_SymbiosisActivates);
return;
}
@ -17841,14 +17759,12 @@ void BS_TryActivateGulpMissile(void)
switch(gBattleMons[gBattlerTarget].species)
{
case SPECIES_CRAMORANT_GORGING:
BattleScriptPushCursor();
TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE);
gBattlescriptCurrInstr = BattleScript_GulpMissileGorging;
BattleScriptCall(BattleScript_GulpMissileGorging);
return;
case SPECIES_CRAMORANT_GULPING:
BattleScriptPushCursor();
TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE);
gBattlescriptCurrInstr = BattleScript_GulpMissileGulping;
BattleScriptCall(BattleScript_GulpMissileGulping);
return;
}
}
@ -18306,8 +18222,7 @@ void BS_SpectralThiefPrintStats(void)
stat,
MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED)
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_StatUpMsg;
BattleScriptCall(BattleScript_StatUpMsg);
return;
}
}
@ -18688,8 +18603,7 @@ void BS_TryIntimidatEjectpack(void)
gBattleScripting.battler = affectedBattler;
gLastUsedItem = gBattleMons[affectedBattler].item;
RecordItemEffectBattle(affectedBattler, HOLD_EFFECT_EJECT_PACK);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret;
BattleScriptCall(BattleScript_EjectPackActivate_Ret);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -141,9 +141,8 @@ u32 BattlePalace_TryEscapeStatus(u8 battler)
// Wake up from Uproar
gBattleMons[battler].status1 &= ~(STATUS1_SLEEP);
gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
BattleScriptCall(BattleScript_MoveUsedWokeUp);
effect = 2;
}
else
@ -171,9 +170,8 @@ u32 BattlePalace_TryEscapeStatus(u8 battler)
{
// Wake up
gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
BattleScriptCall(BattleScript_MoveUsedWokeUp);
effect = 2;
}
}
@ -192,8 +190,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler)
{
// Unfreeze
gBattleMons[battler].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
BattleScriptCall(BattleScript_MoveUsedUnfroze);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED;
}
effect = 2;