diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 56b05e561c..e55b3ef6e1 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -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, diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 57a4b3e357..a9b0d875d4 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -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; } }