From a74601fd60dfa9e2159ba1cd1b952d6171a24acb Mon Sep 17 00:00:00 2001 From: grintoul1 Date: Mon, 9 Feb 2026 13:34:10 +0000 Subject: [PATCH] Moved gMultiPartnerParty to heap to save EWRAM; corrected link multi battle flags checks in party getters --- include/battle_main.h | 2 +- src/battle_main.c | 13 +++++++++---- src/battle_util2.c | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/battle_main.h b/include/battle_main.h index 5b0c70ee64..42c80af740 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -116,7 +116,7 @@ bool32 DidPlayerForfeitNormalTrainerBattle(void); void BattleDebug_WonBattle(void); s32 Factorial(s32 n); -extern struct MultiPartnerMenuPokemon gMultiPartnerParty[PARTY_SIZE]; +extern struct MultiPartnerMenuPokemon *gMultiPartnerParty; extern const struct SpriteTemplate gUnusedBattleInitSprite; extern const struct OamData gOamData_BattleSpriteOpponentSide; diff --git a/src/battle_main.c b/src/battle_main.c index 89cb8becf1..0c5ef22076 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -149,7 +149,7 @@ EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT + 13] = {0}; // expanded for stupidly long z move names EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleEnvironment = 0; -EWRAM_DATA struct MultiPartnerMenuPokemon gMultiPartnerParty[PARTY_SIZE] = {0}; +EWRAM_DATA struct MultiPartnerMenuPokemon *gMultiPartnerParty = NULL; EWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL; EWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL; EWRAM_DATA u32 gBattleControllerExecFlags = 0; @@ -1393,8 +1393,9 @@ static void CB2_PreInitMultiBattle(void) case 0: if (gReceivedRemoteLinkPlayers && IsLinkTaskFinished()) { + gMultiPartnerParty = Alloc(sizeof(struct MultiPartnerMenuPokemon) * PARTY_SIZE); // only 3 mons actually used for link multis SetMultiPartnerMenuParty(B_TRAINER_0); - SendBlock(BitmaskAllOtherLinkPlayers(), gMultiPartnerParty, sizeof(struct MultiPartnerMenuPokemon) * 3); + SendBlock(BitmaskAllOtherLinkPlayers(), gMultiPartnerParty, sizeof(struct MultiPartnerMenuPokemon) * PARTY_SIZE); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -1412,12 +1413,12 @@ static void CB2_PreInitMultiBattle(void) if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1)) || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1)) { - memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty)); + memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(struct MultiPartnerMenuPokemon) * PARTY_SIZE); } } else { - memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty)); + memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(struct MultiPartnerMenuPokemon) * PARTY_SIZE); } } gBattleCommunication[MULTIUSE_STATE]++; @@ -1448,6 +1449,7 @@ static void CB2_PreInitMultiBattle(void) gBattleTypeFlags = *savedBattleTypeFlags; gMain.savedCallback = *savedCallback; SetMainCallback2(CB2_InitBattleInternal); + FREE_AND_SET_NULL(gMultiPartnerParty); } } else if (gReceivedRemoteLinkPlayers == 0) @@ -1455,6 +1457,7 @@ static void CB2_PreInitMultiBattle(void) gBattleTypeFlags = *savedBattleTypeFlags; gMain.savedCallback = *savedCallback; SetMainCallback2(CB2_InitBattleInternal); + FREE_AND_SET_NULL(gMultiPartnerParty); } break; } @@ -1476,6 +1479,7 @@ static void CB2_PreInitIngamePlayerPartnerBattle(void) { case 0: DebugPrintf("CB2_PreInitIngamePlayerPartnerBattle SetMultiPartnerMenuParty"); + gMultiPartnerParty = Alloc(sizeof(struct MultiPartnerMenuPokemon) * PARTY_SIZE); // Up to 6 Pokemon for Ingame Partner multis SetMultiPartnerMenuParty(B_TRAINER_2); gBattleCommunication[MULTIUSE_STATE]++; *savedCallback = gMain.savedCallback; @@ -1497,6 +1501,7 @@ static void CB2_PreInitIngamePlayerPartnerBattle(void) gBattleTypeFlags = *savedBattleTypeFlags; gMain.savedCallback = *savedCallback; SetMainCallback2(CB2_InitBattleInternal); + FREE_AND_SET_NULL(gMultiPartnerParty); } break; } diff --git a/src/battle_util2.c b/src/battle_util2.c index 8ed61a2fb0..cab1265fe9 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -237,14 +237,14 @@ u32 BattlePalace_TryEscapeStatus(enum BattlerId battler) struct Pokemon *GetBattlerParty(enum BattlerId battler) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI)) + if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) return GetSideParty(GetBattlerSide(battler)); return gParties[GetBattlerTrainer(battler)]; } struct Pokemon *GetTrainerParty(enum BattleTrainer trainer) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI)) + if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) return gParties[trainer & BIT_SIDE]; return gParties[trainer]; }