Sync BattleStruct.multiBuffer from Em/FR

This commit is contained in:
PikalaxALT
2021-06-16 15:55:20 -04:00
parent ad22809844
commit acb87f3f2f
8 changed files with 81 additions and 71 deletions
+17 -8
View File
@@ -281,13 +281,22 @@ struct AI_Stack
u8 size;
};
struct LinkPartnerHeader
{
u8 versionSignatureLo;
u8 versionSignatureHi;
u8 vsScreenHealthFlagsLo;
u8 vsScreenHealthFlagsHi;
struct BattleEnigmaBerry battleEnigmaBerry;
};
struct BattleStruct /* 0x2000000 */
{
/*0x00000*/ u8 unk0;
/*0x00001*/ bool8 unk1;
/*0x00002*/ u8 unk2;
/*0x00003*/ bool8 unk3;
u8 filler4[0x15DDA];
/*0x00000*/ union{
struct LinkPartnerHeader linkPartnerHeader;
struct MultiBattlePokemonTx multiBattleMons[3];
} multiBuffer;
u8 filler60[0x15D7E];
/*0x15DDE*/ u8 unk15DDE;
/*0x15DDF*/ u8 unk15DDF;
/*0x15DE0*/ u8 filler15DE0[0x220];
@@ -393,7 +402,7 @@ struct BattleStruct /* 0x2000000 */
/*0x160C7*/ u8 unk160C7;
/*0x160C8*/ u8 AI_monToSwitchIntoId[2];
/*0x160CA*/ u8 synchroniseEffect;
/*0x160CB*/ u8 linkPlayerIndex;
/*0x160CB*/ u8 multiplayerId;
/*0x160CC*/ u16 usedHeldItems[4];
/*0x160D4*/ u8 unk160D4;
/*0x160D5*/ u8 unk160D5;
@@ -659,7 +668,7 @@ void sub_800D6D4();
void ApplyPlayerChosenFrameToBattleMenu();
void DrawMainBattleBackground(void);
void LoadBattleTextboxAndBackground();
void sub_800DE30(u8);
void InitLinkBattleVsScreen(u8);
void DrawBattleEntryBackground();
// src/battle_2.o
@@ -667,7 +676,7 @@ void CB2_InitBattle(void);
void CB2_InitBattleInternal(void);
void CB2_HandleStartBattle(void);
void sub_800F104(void);
void sub_800F298(void);
void CB2_HandleStartMultiBattle(void);
void BattleMainCB2(void);
void sub_800F838(struct Sprite *);
u8 CreateNPCTrainerParty(struct Pokemon *, u16);
+1 -15
View File
@@ -97,20 +97,6 @@ struct Unk2001000
u16 array[53561];
};
struct UnknownPokemonStruct2
{
/*0x00*/ u16 species;
/*0x02*/ u16 heldItem;
/*0x04*/ u8 nickname[11];
/*0x0F*/ u8 level;
/*0x10*/ u16 hp;
/*0x12*/ u16 maxhp;
/*0x14*/ u32 status;
/*0x18*/ u32 personality;
/*0x1C*/ u8 gender;
/*0x1D*/ u8 language;
};
void CB2_PartyMenuMain(void);
void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed);
void SetPartyMenuSettings(u8 menuType, u8 battleTypeFlags, TaskFunc menuHandlerFunc, u8 textId);
@@ -151,7 +137,7 @@ void SetHeldItemIconVisibility(u8 a, u8 monIndex);
void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer);
void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon);
void PrintPartyMenuMonNicknames(void);
void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon);
void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct MultiBattlePokemonTx *pokemon);
u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer);
void PartyMenuPutStatusTilemap(u8 monIndex, u8 b, u8 status);
void PartyMenuDoPrintLevel(u8 monIndex, u8 b, u8 level);
+14
View File
@@ -193,6 +193,20 @@ struct UnknownPokemonStruct
/*0x2B*/u8 friendship;
};
struct MultiBattlePokemonTx
{
/*0x00*/ u16 species;
/*0x02*/ u16 heldItem;
/*0x04*/ u8 nickname[11];
/*0x0F*/ u8 level;
/*0x10*/ u16 hp;
/*0x12*/ u16 maxhp;
/*0x14*/ u32 status;
/*0x18*/ u32 personality;
/*0x1C*/ u8 gender;
/*0x1D*/ u8 language;
};
#define BATTLE_STATS_NO 8
struct BattlePokemon
+10 -10
View File
@@ -416,7 +416,7 @@ static void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest)
}
CpuSet(src, dest, 3);
} else {
if (windowId == gBattleStruct->linkPlayerIndex) {
if (windowId == gBattleStruct->multiplayerId) {
r4 = gTasks[taskId].data[3];
} else {
r4 = gTasks[taskId].data[4];
@@ -468,7 +468,7 @@ static void PrintLinkBattleWinLossTie(void)
{
// id = player position?
switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].id)
switch (gLinkPlayers[gBattleStruct->multiplayerId].id)
{
case 0:
case 2:
@@ -486,7 +486,7 @@ static void PrintLinkBattleWinLossTie(void)
else
{
switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].id)
switch (gLinkPlayers[gBattleStruct->multiplayerId].id)
{
case 1:
case 3:
@@ -508,7 +508,7 @@ static void PrintLinkBattleWinLossTie(void)
if (gBattleOutcome == 1)
{
if (gLinkPlayers[gBattleStruct->linkPlayerIndex].id != 0)
if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)
{
PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
@@ -521,7 +521,7 @@ static void PrintLinkBattleWinLossTie(void)
}
else
{
if (gLinkPlayers[gBattleStruct->linkPlayerIndex].id != 0)
if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)
{
PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
@@ -535,7 +535,7 @@ static void PrintLinkBattleWinLossTie(void)
}
void sub_800DE30(u8 taskId)
void InitLinkBattleVsScreen(u8 taskId)
{
u8 palette;
int i;
@@ -559,11 +559,11 @@ void sub_800DE30(u8 taskId)
} else {
u8 windowId = 4;
u8 playerId = gBattleStruct->linkPlayerIndex;
u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1;
u8 playerId = gBattleStruct->multiplayerId;
u8 opponentId = gBattleStruct->multiplayerId ^ 1;
if (gLinkPlayers[playerId].id) {
opponentId = gBattleStruct->linkPlayerIndex;
playerId = gBattleStruct->linkPlayerIndex ^ 1;
opponentId = gBattleStruct->multiplayerId;
playerId = gBattleStruct->multiplayerId ^ 1;
}
Text_InitWindow8002E4C(
+35 -34
View File
@@ -76,7 +76,7 @@ extern const u8 gUnknown_Debug_821F7F3[];
extern const u8 BattleText_YesNo[];
extern u8 gStatStageRatios[][2];
extern u8 gActionsByTurnOrder[4];
extern struct UnknownPokemonStruct2 gMultiPartnerParty[];
extern struct MultiBattlePokemonTx gMultiPartnerParty[];
extern u8 gBattleBufferB[][0x200];
extern u8 gActiveBattler;
extern u32 gBattleControllerExecFlags;
@@ -283,7 +283,7 @@ void CB2_InitBattleInternal(void)
SetVBlankCallback(sub_800FCFC);
SetUpBattleVarsAndBirchPoochyena();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
SetMainCallback2(sub_800F298);
SetMainCallback2(CB2_HandleStartMultiBattle);
else
SetMainCallback2(CB2_HandleStartBattle);
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)
@@ -301,7 +301,7 @@ void CB2_InitBattleInternal(void)
gBattleCommunication[0] = 0;
}
void sub_800E9EC(void)
void BufferPartyVsScreenHealth_AtStart(void)
{
u16 r6 = 0;
u16 species;
@@ -330,21 +330,21 @@ void sub_800E9EC(void)
if (species != SPECIES_EGG && hp == 0)
r6 |= 3 << i * 2;
}
gBattleStruct->unk2 = r6;
gBattleStruct->unk3 = r6 >> 8;
gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsLo = r6;
gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsHi = r6 >> 8;
}
static void SetPlayerBerryDataInBattleStruct(void)
{
s32 i;
struct UnknownStruct8 *_ewram4 = &ewram4;
struct BattleEnigmaBerry * battleBerry = &gBattleStruct->multiBuffer.linkPartnerHeader.battleEnigmaBerry;
for (i = 0; i < 7; i++)
_ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
battleBerry->name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
for (i = 0; i < 18; i++)
_ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
_ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect;
_ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam;
battleBerry->itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
battleBerry->holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
battleBerry->holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
}
void SetAllPlayersBerryData(void)
@@ -419,7 +419,7 @@ void CB2_HandleStartBattle(void)
BuildOamBuffer();
playerId = GetMultiplayerId();
ewram160CB = playerId;
gBattleStruct->multiplayerId = playerId;
enemyId = playerId ^ 1;
switch (gBattleCommunication[0])
@@ -429,9 +429,9 @@ void CB2_HandleStartBattle(void)
{
if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
{
gBattleStruct->unk0 = 1;
gBattleStruct->unk1 = 1;
sub_800E9EC();
gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureLo = 1;
gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureHi = 1;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
#if DEBUG
if (gUnknown_02023A14_50 & 8)
@@ -443,7 +443,7 @@ void CB2_HandleStartBattle(void)
}
}
#endif
SendBlock(bitmask_all_link_players_but_self(), gBattleStruct, 32);
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkPartnerHeader, sizeof(gBattleStruct->multiBuffer.linkPartnerHeader));
gBattleCommunication[0] = 1;
}
}
@@ -494,11 +494,11 @@ void CB2_HandleStartBattle(void)
}
}
SetAllPlayersBerryData();
taskId = CreateTask(sub_800DE30, 0);
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
gTasks[taskId].data[3] = gBattleStruct->unk2 | (gBattleStruct->unk3 << 8);
gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkPartnerHeader.vsScreenHealthFlagsHi << 8);
gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1];
gBattleCommunication[0]++;
}
@@ -576,7 +576,7 @@ void CB2_HandleStartBattle(void)
}
}
void sub_800F02C(void)
void PrepareOwnMultiPartnerBuffer(void)
{
s32 i;
@@ -598,7 +598,7 @@ void sub_800F02C(void)
if (gMultiPartnerParty[i].language != 1)
PadNameString(nickname, 0);
}
memcpy(gSharedMem, gMultiPartnerParty, 0x60);
memcpy(gBattleStruct->multiBuffer.multiBattleMons, gMultiPartnerParty, 3 * sizeof(struct MultiBattlePokemonTx));
}
void sub_800F104(void)
@@ -609,7 +609,7 @@ void sub_800F104(void)
s32 i;
playerId = GetMultiplayerId();
ewram160CB = playerId;
gBattleStruct->multiplayerId = playerId;
// Seriously, Game Freak?
pSavedCallback = ewram160C4_Callback;
pSavedBattleTypeFlags = ewram160C2_Flags;
@@ -634,8 +634,8 @@ void sub_800F104(void)
#endif
if (IsLinkTaskFinished())
{
sub_800F02C();
SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60);
PrepareOwnMultiPartnerBuffer();
SendBlock(bitmask_all_link_players_but_self(), gBattleStruct->multiBuffer.multiBattleMons, 3 * sizeof(struct MultiBattlePokemonTx));
gBattleCommunication[0]++;
}
}
@@ -652,7 +652,7 @@ void sub_800F104(void)
{
if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerId].id & 1))
|| ((gLinkPlayers[i].id & 1) && (gLinkPlayers[playerId].id & 1)))
memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], 0x60);
memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], 3 * sizeof(struct MultiBattlePokemonTx));
}
}
gBattleCommunication[0]++;
@@ -680,13 +680,13 @@ void sub_800F104(void)
}
}
void sub_800F298(void)
void CB2_HandleStartMultiBattle(void)
{
u8 playerId;
s32 id;
playerId = GetMultiplayerId();
ewram160CB = playerId;
gBattleStruct->multiplayerId = playerId;
RunTasks();
AnimateSprites();
BuildOamBuffer();
@@ -707,11 +707,11 @@ void sub_800F298(void)
#endif
if (IsLinkTaskFinished())
{
gBattleStruct->unk0 = 1;
gBattleStruct->unk1 = 1;
sub_800E9EC();
*(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureLo) = 1;
*(&gBattleStruct->multiBuffer.linkPartnerHeader.versionSignatureHi) = 1;
BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20);
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkPartnerHeader, sizeof(gBattleStruct->multiBuffer.linkPartnerHeader));
gBattleCommunication[0]++;
}
}
@@ -722,6 +722,7 @@ void sub_800F298(void)
u8 taskId;
ResetBlockReceivedFlags();
// LinkBattleComputeBattleTypeFlags
id = 0;
if (gBlockRecvBuffer[0][0] == 0x100)
{
@@ -767,9 +768,9 @@ void sub_800F298(void)
}
SetAllPlayersBerryData();
memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
taskId = CreateTask(sub_800DE30, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 270;
gTasks[taskId].data[2] = 90;
gTasks[taskId].data[5] = 0;
gTasks[taskId].data[3] = 0;
gTasks[taskId].data[4] = 0;
@@ -1195,7 +1196,7 @@ void sub_800FE40(u8 taskId)
{
struct Pokemon *sp4 = NULL;
struct Pokemon *sp8 = NULL;
u8 r2 = ewram160CB;
u8 r2 = gBattleStruct->multiplayerId;
u32 r7;
s32 i;
@@ -1321,7 +1322,7 @@ void c2_8011A1C(void)
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(sub_800FCFC);
taskId = CreateTask(sub_800DE30, 0);
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 1;
+2 -2
View File
@@ -658,7 +658,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
{
if (gLastUsedItem == ITEM_ENIGMA_BERRY)
{
if (gLinkPlayers[gBattleStruct->linkPlayerIndex].id == gPotentialItemEffectBattler)
if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler)
{
StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
#ifdef ENGLISH
@@ -949,7 +949,7 @@ void ExpandBattleTextBuffPlaceholders(u8* src, u8* dst)
{
if (hword == ITEM_ENIGMA_BERRY)
{
if (gLinkPlayers[gBattleStruct->linkPlayerIndex].id == gPotentialItemEffectBattler)
if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler)
{
StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name);
#ifdef ENGLISH
+1 -1
View File
@@ -23,7 +23,7 @@
extern u8 gPlayerPartyCount;
extern u8 gLastFieldPokeMenuOpened;
extern u8 gUnknown_020384F0;
extern struct UnknownPokemonStruct2 gMultiPartnerParty[3];
extern struct MultiBattlePokemonTx gMultiPartnerParty[3];
extern u8 gUnknown_0202E8F6;
extern const u16 gBattleTowerBannedSpecies[];
+1 -1
View File
@@ -2828,7 +2828,7 @@ void unref_sub_806D964(u8 taskId)
TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]);
}
void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon)
void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct MultiBattlePokemonTx *pokemon)
{
u8 x = gUnknown_08376678[menuType][monIndex].x;
u8 y = gUnknown_08376678[menuType][monIndex].y;