Battle controller pret documentation (#7029)

This commit is contained in:
Alex 2025-06-02 14:22:11 +02:00 committed by GitHub
parent 46e09a9e46
commit d33651bfd0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 81 additions and 63 deletions

View File

@ -72,41 +72,63 @@ enum {
// (e.g. MarkBattlerForControllerExec) instead of using these macros
// directly.
#define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \
gBattleControllerExecFlags |= (1u << battler)
static inline void MarkBattleControllerActiveOnLocal(u32 battler)
{
gBattleControllerExecFlags |= (1u << battler);
}
#define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battler) \
gBattleControllerExecFlags &= ~(1u << battler)
static inline void MarkBattleControllerIdleOnLocal(u32 battler)
{
gBattleControllerExecFlags &= ~(1u << battler);
}
#define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \
(gBattleControllerExecFlags & (1u << battler))
static inline bool32 IsBattleControllerActiveOnLocal(u32 battler)
{
return gBattleControllerExecFlags & (1u << battler);
}
#define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battler) \
gBattleControllerExecFlags |= ((1u << battler) << (32 - MAX_BATTLERS_COUNT))
static inline void MarkBattleControllerMessageOutboundOverLink(u32 battler)
{
gBattleControllerExecFlags |= ((1u << battler) << (32 - MAX_BATTLERS_COUNT));
}
#define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battler) \
gBattleControllerExecFlags &= ~((1 << 28) << (battler))
static inline void MarkBattleControllerMessageSynchronizedOverLink(u32 battler)
{
gBattleControllerExecFlags &= ~((1 << 28) << (battler));
}
#define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \
gBattleControllerExecFlags |= ((1u << battler) << ((playerId) << 2))
static inline bool32 IsBattleControllerMessageSynchronizedOverLink(u32 battler)
{
return gBattleControllerExecFlags & (1u << (battler + 28));
}
#define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId) \
gBattleControllerExecFlags &= ~((1u << battler) << ((playerId) * 4))
static inline void MarkBattleControllerActiveForPlayer(u32 battler, u32 playerId)
{
gBattleControllerExecFlags |= ((1u << battler) << ((playerId) << 2));
}
#define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \
(gBattleControllerExecFlags & ((1u << battler) << ((playerId) * 4)))
static inline void MarkBattleControllerIdleForPlayer(u32 battler, u32 playerId)
{
gBattleControllerExecFlags &= ~((1u << battler) << ((playerId) * 4));
}
static inline bool32 IsBattleControllerActiveForPlayer(u32 battler, u32 playerId)
{
return gBattleControllerExecFlags & ((1u << battler) << ((playerId) * 4));
}
// This actually checks if a specific controller is active on any player or if
// *any* controller is pending sync over link communications, but the macro name
// can only be so specific before it just gets ridiculous.
#define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battler) \
(gBattleControllerExecFlags & ( \
(1u << battler) \
| (0xF << 28) \
| (1u << battler << 4) \
| (1u << battler << 8) \
| (1u << battler << 12) \
))
static inline bool32 IsBattleControllerActiveOrPendingSyncAnywhere(u32 battler)
{
return gBattleControllerExecFlags & (
(1u << battler)
| (0xF << 28)
| (1u << battler << 4)
| (1u << battler << 8)
| (1u << battler << 12));
}
// Special arguments for Battle Controller functions.

View File

@ -114,7 +114,7 @@ void SetControllerToLinkOpponent(u32 battler)
static void LinkOpponentBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands))
sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -320,7 +320,7 @@ static void LinkOpponentBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -113,7 +113,7 @@ void SetControllerToLinkPartner(u32 battler)
static void LinkPartnerBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands))
sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -164,7 +164,7 @@ static void LinkPartnerBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -127,7 +127,7 @@ void SetControllerToOpponent(u32 battler)
static void OpponentBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands))
sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -364,7 +364,7 @@ static void OpponentBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -182,13 +182,13 @@ static void PlayerBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}
static void PlayerBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands))
sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler);

View File

@ -117,7 +117,7 @@ void SetControllerToPlayerPartner(u32 battler)
static void PlayerPartnerBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands))
sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -236,7 +236,7 @@ static void PlayerPartnerBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -120,7 +120,7 @@ void SetControllerToRecordedOpponent(u32 battler)
static void RecordedOpponentBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands))
sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -141,7 +141,7 @@ static void RecordedOpponentBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -117,7 +117,7 @@ void SetControllerToRecordedPlayer(u32 battler)
static void RecordedPlayerBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands))
sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -313,7 +313,7 @@ static void RecordedPlayerBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -109,7 +109,7 @@ void SetControllerToSafari(u32 battler)
static void SafariBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -237,7 +237,7 @@ static void SafariBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -125,7 +125,7 @@ void SetControllerToWally(u32 battler)
static void WallyBufferRunCommand(u32 battler)
{
if (gBattleControllerExecFlags & (1u << battler))
if (IsBattleControllerActiveOnLocal(battler))
{
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands))
sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler);
@ -284,7 +284,7 @@ static void WallyBufferExecCompleted(u32 battler)
}
else
{
gBattleControllerExecFlags &= ~(1u << battler);
MarkBattleControllerIdleOnLocal(battler);
}
}

View File

@ -956,7 +956,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
switch (BYTE_TO_RECEIVE(0))
{
case B_COMM_TO_CONTROLLER:
if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler))
if (IsBattleControllerActiveOnLocal(battler))
return;
memcpy(gBattleResources->bufferA[battler], &BYTE_TO_RECEIVE(LINK_BUFF_DATA), blockSize);
@ -975,7 +975,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
break;
case B_COMM_CONTROLLER_IS_DONE:
playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA);
MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId);
MarkBattleControllerIdleForPlayer(battler, playerId);
break;
}

View File

@ -4210,7 +4210,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action.
if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
RecordedBattle_SetBattlerAction(battler, gBattleResources->bufferB[battler][1]);
gChosenActionByBattler[battler] = gBattleResources->bufferB[battler][1];
@ -4414,7 +4414,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CASE_CHOSEN:
if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
switch (gChosenActionByBattler[battler])
{
@ -4544,11 +4544,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CONFIRMED_STANDBY:
if (!(gBattleControllerExecFlags & ((1u << battler)
| (0xF << 28)
| (1u << (battler + 4))
| (1u << (battler + 8))
| (1u << (battler + 12)))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
if (AllAtActionConfirmed())
i = TRUE;
@ -4570,7 +4566,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CONFIRMED:
if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12)))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++;
}
@ -4584,7 +4580,7 @@ static void HandleTurnActionSelectionState(void)
{
gBattlerAttacker = battler;
gBattlescriptCurrInstr = gSelectionBattleScripts[battler];
if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12)))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
@ -4592,7 +4588,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_SET_BEFORE_ACTION:
if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12)))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
gBattleCommunication[battler] = STATE_BEFORE_ACTION_CHOSEN;
}
@ -4616,7 +4612,7 @@ static void HandleTurnActionSelectionState(void)
{
gBattlerAttacker = battler;
gBattlescriptCurrInstr = gSelectionBattleScripts[battler];
if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12)))))
if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}

View File

@ -988,29 +988,29 @@ static void UNUSED MarkAllBattlersForControllerExec(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
for (i = 0; i < gBattlersCount; i++)
gBattleControllerExecFlags |= 1u << (i + 32 - MAX_BATTLERS_COUNT);
MarkBattleControllerMessageOutboundOverLink(i);
}
else
{
for (i = 0; i < gBattlersCount; i++)
gBattleControllerExecFlags |= 1u << i;
MarkBattleControllerActiveOnLocal(i);
}
}
bool32 IsBattlerMarkedForControllerExec(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
return (gBattleControllerExecFlags & (1u << (battler + 28))) != 0;
return IsBattleControllerMessageSynchronizedOverLink(battler);
else
return (gBattleControllerExecFlags & (1u << battler)) != 0;
return IsBattleControllerActiveOnLocal(battler);
}
void MarkBattlerForControllerExec(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
gBattleControllerExecFlags |= 1u << (battler + 32 - MAX_BATTLERS_COUNT);
MarkBattleControllerMessageOutboundOverLink(battler);
else
gBattleControllerExecFlags |= 1u << battler;
MarkBattleControllerActiveOnLocal(battler);
}
void MarkBattlerReceivedLinkData(u32 battler)
@ -1018,9 +1018,9 @@ void MarkBattlerReceivedLinkData(u32 battler)
s32 i;
for (i = 0; i < GetLinkPlayerCount(); i++)
gBattleControllerExecFlags |= 1u << (battler + (i << 2));
MarkBattleControllerActiveForPlayer(battler, i);
gBattleControllerExecFlags &= ~(1u << (28 + battler));
MarkBattleControllerMessageSynchronizedOverLink(battler);
}
const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState)