Fix up end turn scripts plus small documentation (#7758)

This commit is contained in:
Alex 2025-09-19 20:07:24 +02:00 committed by GitHub
parent 9c3fe4c4af
commit e92598e9e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 52 additions and 28 deletions

View File

@ -4902,7 +4902,7 @@ BattleScript_IceBodyHeal::
datahpupdate BS_ATTACKER
printstring STRINGID_ICEBODYHPGAIN
waitmessage B_WAIT_TIME_LONG
end3
end2
BattleScript_OverworldStatusStarts::
printfromtable gStartingStatusStringIds
@ -5918,7 +5918,7 @@ BattleScript_PowerConstruct::
handleformchange BS_SCRIPTING, 2
printstring STRINGID_POWERCONSTRUCTTRANSFORM
waitmessage B_WAIT_TIME_SHORT
end3
end2
BattleScript_UltraBurst::
flushtextbox
@ -5956,7 +5956,11 @@ BattleScript_BattlerFormChangeEnd3::
BattleScript_BattlerFormChangeEnd3NoPopup::
call BattleScript_BattlerFormChangeNoPopup
end3
end2
BattleScript_BattlerFormChangeEnd2::
call BattleScript_BattlerFormChange
end2
BattleScript_BattlerFormChangeWithStringEnd3::
pause 5
@ -5987,7 +5991,7 @@ BattleScript_BallFetch::
call BattleScript_AbilityPopUp
printstring STRINGID_FETCHEDPOKEBALL
waitmessage B_WAIT_TIME_LONG
end3
end2
BattleScript_CudChewActivates::
pause B_WAIT_TIME_SHORTEST
@ -5995,7 +5999,7 @@ BattleScript_CudChewActivates::
setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries
consumeberry BS_ATTACKER, FALSE
setbyte sBERRY_OVERRIDE, 0
end3
end2
BattleScript_ApplyDisguiseFormChangeHPLoss::
jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn
@ -6564,7 +6568,7 @@ BattleScript_MoodyLower:
printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_MoodyEnd:
end3
end2
BattleScript_EmergencyExit::
pause 5
@ -6655,7 +6659,7 @@ BattleScript_AbilityHpHeal:
BattleScript_RainDishActivates::
call BattleScript_AbilityHpHeal
end3
end2
BattleScript_CheekPouchActivates::
copybyte sSAVED_BATTLER, gBattlerAttacker
@ -6672,7 +6676,7 @@ BattleScript_PickupActivates::
waitmessage B_WAIT_TIME_LONG
tryrestorehpberry
BattleScript_PickupActivatesEnd:
end3
end2
BattleScript_HarvestActivates::
pause 5
@ -6682,7 +6686,7 @@ BattleScript_HarvestActivates::
waitmessage B_WAIT_TIME_LONG
tryrestorehpberry
BattleScript_HarvestActivatesEnd:
end3
end2
BattleScript_SolarPowerActivates::
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE
@ -6692,7 +6696,7 @@ BattleScript_SolarPowerActivates::
printstring STRINGID_SOLARPOWERHPDROP
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_ATTACKER
end3
end2
BattleScript_HealerActivates::
call BattleScript_AbilityPopUp
@ -6700,7 +6704,7 @@ BattleScript_HealerActivates::
updatestatusicon BS_SCRIPTING
printstring STRINGID_HEALERCURE
waitmessage B_WAIT_TIME_LONG
end3
end2
BattleScript_SandstreamActivates::
pause B_WAIT_TIME_SHORT
@ -6725,7 +6729,7 @@ BattleScript_ShedSkinActivates::
printstring STRINGID_PKMNSXCUREDYPROBLEM
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_ATTACKER
end3
end2
BattleScript_ActivateWeatherAbilities:
saveattacker
@ -7089,7 +7093,7 @@ BattleScript_BadDreamsIncrement:
destroyabilitypopup
pause 15
BattleScript_BadDreamsEnd:
end3
end2
BattleScript_BadDreams_ShowPopUp:
copybyte gBattlerAbility, gBattlerAttacker
call BattleScript_AbilityPopUp
@ -7423,6 +7427,11 @@ BattleScript_AttackerAbilityStatRaiseEnd3::
restoreattacker
end3
BattleScript_AttackerAbilityStatRaiseEnd2::
call BattleScript_AttackerAbilityStatRaise
restoreattacker
end2
BattleScript_SwitchInAbilityMsg::
call BattleScript_AbilityPopUp
printfromtable gSwitchInAbilityStringIds

View File

@ -277,6 +277,7 @@ extern const u8 BattleScript_MoveStatDrain[];
extern const u8 BattleScript_TargetsStatWasMaxedOut[];
extern const u8 BattleScript_AttackerAbilityStatRaise[];
extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[];
extern const u8 BattleScript_AttackerAbilityStatRaiseEnd2[];
extern const u8 BattleScript_PoisonHealActivates[];
extern const u8 BattleScript_BadDreamsActivates[];
extern const u8 BattleScript_SwitchInAbilityMsg[];
@ -365,6 +366,7 @@ extern const u8 BattleScript_IllusionOffAndTerastallization[];
extern const u8 BattleScript_DancerActivates[];
extern const u8 BattleScript_AftermathDmg[];
extern const u8 BattleScript_BattlerFormChange[];
extern const u8 BattleScript_BattlerFormChangeEnd2[];
extern const u8 BattleScript_BattlerFormChangeEnd3[];
extern const u8 BattleScript_AttackerFormChangeWithString[];
extern const u8 BattleScript_BattlerFormChangeWithStringEnd3[];

View File

@ -1530,6 +1530,19 @@ static bool32 HandleEndTurnDynamax(u32 battler)
return effect;
}
/*
* Various end turn effects that happen after all battlers moved.
* Each Case will apply the effects for each battler. Moving to the next case when all battlers are done.
* If an effect is going to be applied on a better, the bool effect will be set to TRUE and a script set.
* The script is set with `BattleScriptExecute` and should have the ending `end2`
Example:
BattleScriptExecute(BattleScript_X);
(in battle_scripts_1.s)
BattleScript_X:
some commands
end2
*/
static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) =
{
[ENDTURN_ORDER] = HandleEndTurnOrder,

View File

@ -4509,7 +4509,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem);
gLastUsedItem = GetUsedHeldItem(gBattlerTarget);
BattleScriptPushCursorAndCallback(BattleScript_PickupActivates);
BattleScriptExecute(BattleScript_PickupActivates);
effect++;
}
break;
@ -4520,7 +4520,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES)
{
gLastUsedItem = GetUsedHeldItem(battler);
BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates);
BattleScriptExecute(BattleScript_HarvestActivates);
effect++;
}
break;
@ -4531,7 +4531,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER
&& !gBattleMons[battler].volatiles.healBlock)
{
BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal);
BattleScriptExecute(BattleScript_IceBodyHeal);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
@ -4548,7 +4548,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& !IsBattlerAtMaxHp(battler)
&& !gBattleMons[battler].volatiles.healBlock)
{
BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);
BattleScriptExecute(BattleScript_RainDishActivates);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8);
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
@ -4586,7 +4586,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
gBattleMons[battler].status1 = 0;
gBattleMons[battler].volatiles.nightmare = FALSE;
gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
BattleScriptExecute(BattleScript_ShedSkinActivates);
BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1);
MarkBattlerForControllerExec(battler);
effect++;
@ -4597,7 +4597,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
SaveBattlerAttacker(gBattlerAttacker);
SET_STATCHANGER(STAT_SPEED, 1, FALSE);
BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3);
BattleScriptExecute(BattleScript_AttackerAbilityStatRaiseEnd2);
gBattleScripting.battler = battler;
effect++;
}
@ -4629,7 +4629,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
i = RandomUniformExcept(RNG_MOODY_DECREASE, STAT_ATK, statsNum - 1, MoodyCantLowerStat);
SET_STATCHANGER2(gBattleScripting.savedStatChanger, i, 1, TRUE);
}
BattleScriptPushCursorAndCallback(BattleScript_MoodyActivates);
BattleScriptExecute(BattleScript_MoodyActivates);
effect++;
}
break;
@ -4644,14 +4644,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
}
break;
case ABILITY_BAD_DREAMS:
BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates);
BattleScriptExecute(BattleScript_BadDreamsActivates);
effect++;
break;
case ABILITY_SOLAR_POWER:
if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN))
{
SOLAR_POWER_HP_DROP:
BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates);
BattleScriptExecute(BattleScript_SolarPowerActivates);
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
if (gBattleStruct->moveDamage[battler] == 0)
gBattleStruct->moveDamage[battler] = 1;
@ -4664,7 +4664,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& gBattleMons[gBattleScripting.battler].status1 & STATUS1_ANY
&& RandomPercentage(RNG_HEALER, 30))
{
BattleScriptPushCursorAndCallback(BattleScript_HealerActivates);
BattleScriptExecute(BattleScript_HealerActivates);
effect++;
}
break;
@ -4677,7 +4677,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT))
{
gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3);
BattleScriptExecute(BattleScript_BattlerFormChangeEnd2);
effect++;
}
break;
@ -4685,7 +4685,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT))
{
gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_PowerConstruct);
BattleScriptExecute(BattleScript_PowerConstruct);
effect++;
}
break;
@ -4699,7 +4699,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
MarkBattlerForControllerExec(battler);
gHasFetchedBall = TRUE;
gLastUsedItem = gLastUsedBall;
BattleScriptPushCursorAndCallback(BattleScript_BallFetch);
BattleScriptExecute(BattleScript_BallFetch);
effect++;
}
break;
@ -4709,7 +4709,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& TryBattleFormChange(battler, FORM_CHANGE_BATTLE_TURN_END))
{
gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3NoPopup);
BattleScriptExecute(BattleScript_BattlerFormChangeEnd3NoPopup);
effect++;
}
break;
@ -4720,7 +4720,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
gDisableStructs[battler].cudChew = FALSE;
gLastUsedItem = gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)];
gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = ITEM_NONE;
BattleScriptPushCursorAndCallback(BattleScript_CudChewActivates);
BattleScriptExecute(BattleScript_CudChewActivates);
effect++;
}
else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES)