Untangle InitBtlControllers functions (#6748)

This commit is contained in:
Eduardo Quezada 2025-06-22 10:21:37 -04:00 committed by GitHub
parent b094b70dc5
commit cf7f15faac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 142 additions and 448 deletions

View File

@ -1,6 +1,8 @@
#ifndef GUARD_BATTLE_CONTROLLERS_H
#define GUARD_BATTLE_CONTROLLERS_H
typedef void (*BattleControllerFunc)(u32 battler);
enum {
REQUEST_ALL_BATTLE,
REQUEST_SPECIES_BATTLE,

View File

@ -36,8 +36,7 @@ COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; // Used by the b
COMMON_DATA void (*gBattlerControllerEndFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; // Controller's buffer complete function for each battler
static void CreateTasksForSendRecvLinkBuffers(void);
static void InitLinkBtlControllers(void);
static void InitSinglePlayerBtlControllers(void);
static void InitBtlControllersInternal(void);
static void SetBattlePartyIds(void);
static void Task_HandleSendLinkBuffersData(u8 taskId);
static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId);
@ -102,10 +101,7 @@ void InitBattleControllers(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
RecordedBattle_SaveParties();
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
InitLinkBtlControllers();
else
InitSinglePlayerBtlControllers();
InitBtlControllersInternal();
SetBattlePartyIds();
@ -122,492 +118,188 @@ void InitBattleControllers(void)
*((u8 *)(&gBattleStruct->tv) + i) = 0;
}
static void InitSinglePlayerBtlControllers(void)
static void InitBtlControllersInternal(void)
{
s32 i;
bool32 isLink = (gBattleTypeFlags & BATTLE_TYPE_LINK);
bool32 isDouble = IsDoubleBattle();
bool32 isMaster = (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER);
bool32 isRecorded = (gBattleTypeFlags & BATTLE_TYPE_RECORDED);
bool32 isRecordedMaster = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER);
bool32 isRecordedLink = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK);
bool32 isMulti = (gBattleTypeFlags & BATTLE_TYPE_MULTI);
bool32 isInGamePartner = (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER);
bool32 isAIvsAI = IsAiVsAiBattle();
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
if (!isLink || isMaster)
gBattleMainFunc = BeginBattleIntro;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
}
else
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
}
gBattlersCount = MAX_BATTLERS_COUNT;
BufferBattlePartyCurrentOrderBySide(0, 0);
BufferBattlePartyCurrentOrderBySide(1, 0);
BufferBattlePartyCurrentOrderBySide(2, 1);
BufferBattlePartyCurrentOrderBySide(3, 1);
gBattlerPartyIndexes[0] = 0;
gBattlerPartyIndexes[1] = 0;
if (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE)
{
gBattlerPartyIndexes[2] = 3;
gBattlerPartyIndexes[3] = 1;
}
else
{
gBattlerPartyIndexes[2] = 3;
gBattlerPartyIndexes[3] = 3;
}
}
else if (!IsDoubleBattle())
{
gBattleMainFunc = BeginBattleIntro;
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToSafari;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToWally;
else if (IsAiVsAiBattle())
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner;
else
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
if (!isDouble)
gBattlersCount = 2;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
{
gBattleMainFunc = BeginBattleIntro;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlersCount = 2;
}
else // see how the banks are switched
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
gBattlersCount = 2;
}
}
else
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
}
}
}
else
{
gBattleMainFunc = BeginBattleIntro;
if (IsAiVsAiBattle())
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner;
else
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
if (IsAiVsAiBattle())
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner;
else
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
|| !isMulti
|| (!isLink && !isRecorded)
|| (isLink && !isDouble))
{
bool32 isPlayerPrimary;
if (isLink)
isPlayerPrimary = (isMaster || (isDouble && isMulti));
else if (!isRecorded)
isPlayerPrimary = TRUE;
else if (isDouble)
isPlayerPrimary = (isInGamePartner || isMulti || isMaster);
else
isPlayerPrimary = (!isRecordedLink || isRecordedMaster);
if (isPlayerPrimary)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
}
else
{
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT;
gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT;
gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT;
}
if (isLink)
{
if (isDouble && isMulti && !isMaster)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToLinkPartner;
else
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer;
if (!isDouble || !isMulti || !isMaster)
{
gBattleMainFunc = BeginBattleIntro;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
BufferBattlePartyCurrentOrderBySide(0, 0);
BufferBattlePartyCurrentOrderBySide(1, 0);
BufferBattlePartyCurrentOrderBySide(2, 1);
BufferBattlePartyCurrentOrderBySide(3, 1);
gBattlerPartyIndexes[0] = 0;
gBattlerPartyIndexes[1] = 0;
gBattlerPartyIndexes[2] = 3;
gBattlerPartyIndexes[3] = 3;
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
u8 multiplayerId;
for (multiplayerId = gRecordedBattleMultiplayerId, i = 0; i < MAX_BATTLERS_COUNT; i++)
{
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0);
break;
case 1:
case 2:
BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1);
break;
}
if (i == multiplayerId)
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))
|| ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedOpponent;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
}
else
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
}
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToLinkOpponent;
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer;
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToLinkOpponent;
}
else
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedPlayer;
gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedOpponent;
gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT;
}
else
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT;
}
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent;
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToLinkPartner;
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent;
}
}
}
}
static void InitLinkBtlControllers(void)
{
s32 i;
u8 multiplayerId;
if (!IsDoubleBattle())
{
if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)
{
gBattleMainFunc = BeginBattleIntro;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlersCount = 2;
}
else
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT;
// Player 1
if (isRecorded)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToRecordedPlayer;
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToSafari;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToWally;
else if (isAIvsAI)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayerPartner;
else
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
// Opponent 1
bool32 isOpponent1Recorded;
if (isDouble)
isOpponent1Recorded = (!isInGamePartner && isRecorded && !isMulti && isRecordedLink);
else
isOpponent1Recorded = isRecorded && isRecordedLink;
gBattlersCount = 2;
if (isOpponent1Recorded)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToRecordedOpponent;
else
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent;
// Player 2
if (isInGamePartner)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner;
else if (isRecorded)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToRecordedPlayer;
else if (isAIvsAI)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner;
else
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer;
// Opponent 2
if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink)
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent;
else
gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToRecordedOpponent;
}
}
else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle())
{
if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)
{
gBattleMainFunc = BeginBattleIntro;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
bool32 bufferPartyOrders;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
}
if (!isLink)
bufferPartyOrders = (isInGamePartner || (isRecorded && isMulti));
else
bufferPartyOrders = (isDouble && isMulti);
if (bufferPartyOrders)
{
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT;
BufferBattlePartyCurrentOrderBySide(0, 0);
BufferBattlePartyCurrentOrderBySide(1, 0);
BufferBattlePartyCurrentOrderBySide(2, 1);
BufferBattlePartyCurrentOrderBySide(3, 1);
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
gBattlerPartyIndexes[0] = 0;
gBattlerPartyIndexes[1] = 0;
gBattlerPartyIndexes[2] = 3;
if (!isLink && isInGamePartner && (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE))
gBattlerPartyIndexes[3] = 1;
else
gBattlerPartyIndexes[3] = 3;
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
{
if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)
{
gBattleMainFunc = BeginBattleIntro;
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkPartner;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
}
else
{
gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkPartner;
gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT;
gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT;
gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer;
gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT;
gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent;
gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT;
gBattlersCount = MAX_BATTLERS_COUNT;
}
BufferBattlePartyCurrentOrderBySide(0, 0);
BufferBattlePartyCurrentOrderBySide(1, 0);
BufferBattlePartyCurrentOrderBySide(2, 1);
BufferBattlePartyCurrentOrderBySide(3, 1);
gBattlerPartyIndexes[0] = 0;
gBattlerPartyIndexes[1] = 0;
gBattlerPartyIndexes[2] = 3;
gBattlerPartyIndexes[3] = 3;
}
else
{
multiplayerId = GetMultiplayerId();
u8 multiplayerId = isLink ? GetMultiplayerId() : gRecordedBattleMultiplayerId;
if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)
gBattleMainFunc = BeginBattleIntro;
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
u32 linkPositionLeft, linkPositionRight;
BattleControllerFunc linkBtlControllerFunc;
if (i == multiplayerId)
{
linkPositionLeft = B_POSITION_PLAYER_LEFT;
linkPositionRight = B_POSITION_PLAYER_RIGHT;
linkBtlControllerFunc = isLink ? SetControllerToPlayer : SetControllerToRecordedPlayer;
}
else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))
|| ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))
{
linkPositionLeft = B_POSITION_PLAYER_LEFT;
linkPositionRight = B_POSITION_PLAYER_RIGHT;
linkBtlControllerFunc = isLink ? SetControllerToLinkPartner : SetControllerToRecordedPlayer;
}
else
{
linkPositionLeft = B_POSITION_OPPONENT_LEFT;
linkPositionRight = B_POSITION_OPPONENT_RIGHT;
linkBtlControllerFunc = isLink ? SetControllerToLinkOpponent : SetControllerToRecordedOpponent;
}
gBattlerControllerFuncs[gLinkPlayers[i].id] = linkBtlControllerFunc;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0);
gBattlerPositions[gLinkPlayers[i].id] = linkPositionLeft;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1);
gBattlerPositions[gLinkPlayers[i].id] = linkPositionRight;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
if (i == multiplayerId)
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else
{
if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))
|| ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else
{
gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent;
switch (gLinkPlayers[i].id)
{
case 0:
case 3:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;
gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
}
}
gBattlersCount = MAX_BATTLERS_COUNT;
}
}