More documentation in battle_main

This commit is contained in:
PikalaxALT
2021-03-12 16:56:09 -05:00
parent b38a5a85d4
commit f7f7e9a70d
2 changed files with 63 additions and 49 deletions
+2 -2
View File
@@ -359,8 +359,8 @@ extern struct BattleResults gBattleResults;
struct MultiPartnerEnigmaBerry
{
u8 field_0;
u8 field_1;
u8 versionSignatureLo;
u8 versionSignatureHi;
u8 vsScreenHealthFlagsLo;
u8 vsScreenHealthFlagsHi;
struct BattleEnigmaBerry battleEnigmaBerry;
+61 -47
View File
@@ -705,34 +705,43 @@ static void CB2_InitBattleInternal(void)
gBattleCommunication[MULTIUSE_STATE] = 0;
}
static void sub_800FFEC(void)
#define BUFFER_PARTY_VS_SCREEN_STATUS(party, flags, i) \
for ((i) = 0; (i) < PARTY_SIZE; (i)++) \
{ \
u16 species = GetMonData(&(party)[(i)], MON_DATA_SPECIES2); \
u16 hp = GetMonData(&(party)[(i)], MON_DATA_HP); \
u32 status = GetMonData(&(party)[(i)], MON_DATA_STATUS); \
\
if (species == SPECIES_NONE) \
continue; \
\
/* Is healthy mon? */ \
if (species != SPECIES_EGG && hp != 0 && status == 0) \
(flags) |= 1 << (i) * 2; \
\
if (species == SPECIES_NONE) /* Redundant */ \
continue; \
\
/* Is Egg or statused? */ \
if (hp != 0 && (species == SPECIES_EGG || status != 0)) \
(flags) |= 2 << (i) * 2; \
\
if (species == SPECIES_NONE) /* Redundant */ \
continue; \
\
/* Is fainted? */ \
if (species != SPECIES_EGG && hp == 0) \
(flags) |= 3 << (i) * 2; \
}
static void BufferPartyVsScreenHealth_AtStart(void)
{
u16 r6 = 0;
u16 species = SPECIES_NONE;
u16 hp = 0;
u32 status = 0;
u16 flags = 0;
s32 i;
for (i = 0; i < PARTY_SIZE; ++i)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
if (species == SPECIES_NONE)
continue;
if (species != SPECIES_EGG && hp != 0 && status == 0)
r6 |= 1 << i * 2;
if (species == SPECIES_NONE)
continue;
if (hp != 0 && (species == SPECIES_EGG || status != 0))
r6 |= 2 << i * 2;
if (species == SPECIES_NONE)
continue;
if (species != SPECIES_EGG && hp == 0)
r6 |= 3 << i * 2;
}
gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.vsScreenHealthFlagsLo = r6;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.vsScreenHealthFlagsHi) = r6 >> 8;
BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i);
gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.vsScreenHealthFlagsLo = flags;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.vsScreenHealthFlagsHi) = flags >> 8;
}
static void SetPlayerBerryDataInBattleStruct(void)
@@ -859,44 +868,47 @@ static void SetAllPlayersBerryData(void)
}
}
static void sub_8010414(u8 arg0, u8 arg1)
static void sub_8010414(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] == 0x201)
if (i != arg1 && i < arg1)
if (gBlockRecvBuffer[i][0] == 0x201 && i != multiPlayerId)
if (i < multiPlayerId)
break;
if (gBlockRecvBuffer[i][0] > 0x201 && i != arg1)
if (gBlockRecvBuffer[i][0] > 0x201 && i != multiPlayerId)
break;
}
if (i == arg0)
if (i == numPlayers)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
@@ -937,9 +949,10 @@ static void CB2_HandleStartBattle(void)
{
if (IsLinkTaskFinished())
{
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.field_0) = 1;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.field_1) = 2;
sub_800FFEC();
// 0x201
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.versionSignatureLo) = 1;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.versionSignatureHi) = 2;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.multiPartnerEnigmaBerry, sizeof(gBattleStruct->multiBuffer.multiPartnerEnigmaBerry));
gBattleCommunication[MULTIUSE_STATE] = 2;
@@ -1192,9 +1205,10 @@ static void CB2_HandleStartMultiBattle(void)
{
if (IsLinkTaskFinished())
{
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.field_0) = 1;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.field_1) = 2;
sub_800FFEC();
// 0x201
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.versionSignatureLo) = 1;
*(&gBattleStruct->multiBuffer.multiPartnerEnigmaBerry.versionSignatureHi) = 2;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.multiPartnerEnigmaBerry, sizeof(gBattleStruct->multiBuffer.multiPartnerEnigmaBerry));
++gBattleCommunication[MULTIUSE_STATE];