summaryrefslogtreecommitdiff
path: root/src/battle_main.c
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-03-29 20:56:15 -0400
committerGitHub <noreply@github.com>2021-03-29 20:56:15 -0400
commit50e9666e1637b15bd57fd7ee88180e50d2eb5e8c (patch)
treeb1543b6d79695862cb60d686548dd1a996b69e8c /src/battle_main.c
parentdea07dc8656c8fb32f5b389b9f4f9a30fe26e555 (diff)
parente8b6b4b65e3b53f5fcf83035b9f848c5ef6378bd (diff)
Merge branch 'master' into doc-introcred
Diffstat (limited to 'src/battle_main.c')
-rw-r--r--src/battle_main.c110
1 files changed, 57 insertions, 53 deletions
diff --git a/src/battle_main.c b/src/battle_main.c
index a1bc6ae7b..3507ff765 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -68,9 +68,6 @@ extern const struct BgTemplate gBattleBgTemplates[];
extern const struct WindowTemplate *const gBattleWindowTemplates[];
// this file's functions
-#if !defined(NONMATCHING) && MODERN
-#define static
-#endif
static void CB2_InitBattleInternal(void);
static void CB2_PreInitMultiBattle(void);
static void CB2_PreInitIngamePlayerPartnerBattle(void);
@@ -579,7 +576,7 @@ void CB2_InitBattle(void)
AllocateBattleResources();
AllocateBattleSpritesData();
AllocateMonSpritesGfx();
- sub_8185F84();
+ RecordedBattle_ClearFrontierPassFlag();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -736,16 +733,16 @@ static void BufferPartyVsScreenHealth_AtStart(void)
s32 i;
BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i);
- gBattleStruct->vsScreenHealthFlagsLo = flags;
- *(&gBattleStruct->vsScreenHealthFlagsHi) = flags >> 8;
- gBattleStruct->vsScreenHealthFlagsHi |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7;
+ gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8;
+ gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7;
}
static void SetPlayerBerryDataInBattleStruct(void)
{
s32 i;
struct BattleStruct *battleStruct = gBattleStruct;
- struct BattleEnigmaBerry *battleBerry = &battleStruct->battleEnigmaBerry;
+ struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry;
if (IsEnigmaBerryValid() == TRUE)
{
@@ -885,52 +882,56 @@ static void SetAllPlayersBerryData(void)
}
}
-static void sub_8036EB8(u8 arg0, u8 arg1)
+// This was inlined in Ruby/Sapphire
+static void FindLinkBattleMaster(u8 numPlayers, u8 multiPlayerId)
{
- u8 var = 0;
+ u8 found = 0;
- if (gBlockRecvBuffer[0][0] == 256)
+ // If player 1 is playing the minimum version, player 1 is master.
+ if (gBlockRecvBuffer[0][0] == 0x100)
{
- if (arg1 == 0)
+ if (multiPlayerId == 0)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
- var++;
+ found++;
}
- if (var == 0)
+ if (found == 0)
{
+ // If multiple different versions are being used, player 1 is master.
s32 i;
- for (i = 0; i < arg0; i++)
+ for (i = 0; i < numPlayers; i++)
{
if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
break;
}
- if (i == arg0)
+ if (i == numPlayers)
{
- if (arg1 == 0)
+ if (multiPlayerId == 0)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
- var++;
+ found++;
}
- if (var == 0)
+ if (found == 0)
{
- for (i = 0; i < arg0; i++)
+ // Lowest index player with the highest game version is master.
+ for (i = 0; i < numPlayers; i++)
{
- if (gBlockRecvBuffer[i][0] == 0x300)
+ if (gBlockRecvBuffer[i][0] == 0x300 && i != multiPlayerId)
{
- if (i != arg1 && i < arg1)
+ if (i < multiPlayerId)
break;
}
- if (gBlockRecvBuffer[i][0] > 0x300 && i != arg1)
+ if (gBlockRecvBuffer[i][0] > 0x300 && i != multiPlayerId)
break;
}
- if (i == arg0)
+ if (i == numPlayers)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
@@ -973,8 +974,9 @@ static void CB2_HandleStartBattle(void)
{
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
@@ -984,7 +986,7 @@ static void CB2_HandleStartBattle(void)
gLinkPlayers[1].id = 1;
}
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE] = 2;
}
if (gWirelessCommType)
@@ -1005,16 +1007,16 @@ static void CB2_HandleStartBattle(void)
u8 taskId;
ResetBlockReceivedFlags();
- sub_8036EB8(2, playerMultiplayerId);
+ FindLinkBattleMaster(2, playerMultiplayerId);
SetAllPlayersBerryData();
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[3] = gBattleStruct->vsScreenHealthFlagsLo | (gBattleStruct->vsScreenHealthFlagsHi << 8);
+ gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8);
gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1];
- sub_8185F90(gBlockRecvBuffer[playerMultiplayerId][1]);
- sub_8185F90(gBlockRecvBuffer[enemyMultiplayerId][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[playerMultiplayerId][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[enemyMultiplayerId][1]);
SetDeoxysStats();
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1181,11 +1183,12 @@ static void CB2_HandleStartMultiPartnerBattle(void)
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE] = 2;
}
@@ -1207,7 +1210,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
u8 taskId;
ResetBlockReceivedFlags();
- sub_8036EB8(2, playerMultiplayerId);
+ FindLinkBattleMaster(2, playerMultiplayerId);
SetAllPlayersBerryData();
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
@@ -1568,12 +1571,13 @@ static void CB2_HandleStartMultiBattle(void)
{
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE]++;
}
if (gWirelessCommType)
@@ -1592,7 +1596,7 @@ static void CB2_HandleStartMultiBattle(void)
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
ResetBlockReceivedFlags();
- sub_8036EB8(4, playerMultiplayerId);
+ FindLinkBattleMaster(4, playerMultiplayerId);
SetAllPlayersBerryData();
SetDeoxysStats();
var = CreateTask(InitLinkBattleVsScreen, 0);
@@ -1604,7 +1608,7 @@ static void CB2_HandleStartMultiBattle(void)
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
- sub_8185F90(gBlockRecvBuffer[id][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[id][1]);
switch (gLinkPlayers[id].id)
{
case 0:
@@ -1789,10 +1793,10 @@ static void CB2_HandleStartMultiBattle(void)
case 8:
if (IsLinkTaskFinished())
{
- u32* ptr = (u32*)(&gBattleStruct->field_180);
+ u32* ptr = gBattleStruct->multiBuffer.battleVideo;
ptr[0] = gBattleTypeFlags;
ptr[1] = gRecordedBattleRngSeed; // UB: overwrites berry data
- SendBlock(bitmask_all_link_players_but_self(), ptr, 8);
+ SendBlock(bitmask_all_link_players_but_self(), ptr, sizeof(gBattleStruct->multiBuffer.battleVideo));
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2251,7 +2255,7 @@ static void EndLinkBattleInSteps(void)
{
u8 monsCount;
- gMain.field_439_x4 = sub_8185FAC();
+ gMain.anyLinkBattlerHasFrontierPass = RecordedBattle_GetFrontierPassFlag();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
monsCount = 4;
@@ -2267,7 +2271,7 @@ static void EndLinkBattleInSteps(void)
FreeAllWindowBuffers();
SetMainCallback2(sub_80392A8);
}
- else if (!gMain.field_439_x4)
+ else if (!gMain.anyLinkBattlerHasFrontierPass)
{
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
@@ -2331,9 +2335,9 @@ static void EndLinkBattleInSteps(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 9:
- if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.field_439_x4 = 0;
+ gMain.anyLinkBattlerHasFrontierPass = 0;
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
FreeBattleSpritesData();
@@ -2429,7 +2433,7 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
- if (gMain.field_439_x4 && gReceivedRemoteLinkPlayers == 0)
+ if (gMain.anyLinkBattlerHasFrontierPass && gReceivedRemoteLinkPlayers == 0)
CreateTask(Task_ReconnectWithLinkPlayers, 5);
gBattleCommunication[MULTIUSE_STATE]++;
break;
@@ -2499,7 +2503,7 @@ static void sub_803939C(void)
if (IsLinkTaskFinished() == TRUE)
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
@@ -2510,15 +2514,15 @@ static void sub_803939C(void)
case 8:
if (--gBattleCommunication[1] == 0)
{
- if (gMain.field_439_x4 && !gWirelessCommType)
+ if (gMain.anyLinkBattlerHasFrontierPass && !gWirelessCommType)
SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 9:
- if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.field_439_x4 = 0;
+ gMain.anyLinkBattlerHasFrontierPass = 0;
if (!gPaletteFade.active)
{
SetMainCallback2(gMain.savedCallback);
@@ -2548,7 +2552,7 @@ static void sub_803939C(void)
case 11:
if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0)
{
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
@@ -2560,7 +2564,7 @@ static void sub_803939C(void)
case 7:
if (!IsTextPrinterActive(0))
{
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
if (IsLinkTaskFinished() == TRUE)
{