From d33651bfd0e16bbeb8084dfa8cd84178386c5f9b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:22:11 +0200 Subject: [PATCH] Battle controller pret documentation (#7029) --- include/battle_controllers.h | 70 +++++++++++++++-------- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 4 +- src/battle_controller_player.c | 4 +- src/battle_controller_player_partner.c | 4 +- src/battle_controller_recorded_opponent.c | 4 +- src/battle_controller_recorded_player.c | 4 +- src/battle_controller_safari.c | 4 +- src/battle_controller_wally.c | 4 +- src/battle_controllers.c | 4 +- src/battle_main.c | 18 +++--- src/battle_util.c | 16 +++--- 13 files changed, 81 insertions(+), 63 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 8f2d78ed41..2ce28ca609 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -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. diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index c79588695d..a039a5b522 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -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); } } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index f54ee0d220..9b27309bf6 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -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); } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 03c78fb9e9..f6fae5ae57 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -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); } } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index f374345206..f437d8ee13 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -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); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index ad5aa15312..9929f421cc 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -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); } } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1e471044d5..944cf6e072 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -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); } } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2476929282..a3032db1a8 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -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); } } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 560a95cc5f..4a1fc3888c 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -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); } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 3381e5a5bd..6cba0fc3e7 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -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); } } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 9b6a74fc6e..4faec49613 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -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; } diff --git a/src/battle_main.c b/src/battle_main.c index d1bc8ed0c8..8ea21a023d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -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]](); } diff --git a/src/battle_util.c b/src/battle_util.c index 6d256dc998..3bf809d530 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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)