From 63fbcce1cdb6ccbb09b78e39155e2d5efdb61ee3 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sun, 3 May 2026 16:07:32 +0200 Subject: [PATCH] Reduce battle heap usge outside main battle screen (#9906) --- include/battle_util2.h | 2 ++ src/battle_controller_oak_old_man.c | 4 ++-- src/battle_controller_player.c | 4 ++-- src/battle_controller_safari.c | 4 ++-- src/battle_controller_wally.c | 2 +- src/battle_main.c | 2 +- src/battle_script_commands.c | 6 +++--- src/battle_util2.c | 25 +++++++++++++++++++++---- src/reshow_battle_screen.c | 1 + 9 files changed, 35 insertions(+), 15 deletions(-) diff --git a/include/battle_util2.h b/include/battle_util2.h index 5f91ba6dd6..1438c53f8d 100644 --- a/include/battle_util2.h +++ b/include/battle_util2.h @@ -6,5 +6,7 @@ void FreeBattleResources(void); void AdjustFriendshipOnBattleFaint(enum BattlerId battler); void SwitchPartyOrderInGameMulti(enum BattlerId battler, u8 arg1); u32 BattlePalace_TryEscapeStatus(enum BattlerId battler); +void AllocateBattleGfxResources(void); +void CloseMainBattleScreen(void); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index b855f6e2c3..716b958ade 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -302,7 +302,7 @@ static void OpenPartyMenuToChooseMon(enum BattlerId battler) gBattlerControllerFuncs[battler] = WaitForMonSelection; caseId = gTasks[gBattleControllerData[battler]].data[0]; DestroyTask(gBattleControllerData[battler]); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); OpenPartyMenuInBattle(caseId); } } @@ -325,7 +325,7 @@ static void OpenBagAndChooseItem(enum BattlerId battler) { gBattlerControllerFuncs[battler] = CompleteWhenChoseItem; ReshowBattleScreenDummy(); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) CB2_BagMenuFromBattle(); else diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index f5ba8ba0be..e6725e2889 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1587,7 +1587,7 @@ static void OpenPartyMenuToChooseMon(enum BattlerId battler) gBattlerControllerFuncs[battler] = WaitForMonSelection; caseId = gTasks[gBattleControllerData[battler]].data[0]; DestroyTask(gBattleControllerData[battler]); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); OpenPartyMenuInBattle(caseId); } } @@ -1614,7 +1614,7 @@ static void OpenBagAndChooseItem(enum BattlerId battler) { gBattlerControllerFuncs[battler] = CompleteWhenChoseItem; ReshowBattleScreenDummy(); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); CB2_BagMenuFromBattle(); } } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 633f76e9c6..3b2449d41a 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -209,7 +209,7 @@ static void SafariOpenPokeblockCase(enum BattlerId battler) if (!gPaletteFade.active) { gBattlerControllerFuncs[battler] = CompleteWhenChosePokeblock; - FreeAllWindowBuffers(); + CloseMainBattleScreen(); OpenPokeblockCaseInBattle(); } } @@ -230,7 +230,7 @@ static void OpenPartyMenuToChooseMon(enum BattlerId battler) gBattlerControllerFuncs[battler] = WaitForMonSelection; u8 caseId = gTasks[gBattleControllerData[battler]].data[0]; DestroyTask(gBattleControllerData[battler]); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); OpenPartyMenuInBattle(caseId); } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index de31aef0c3..ae92fc23d1 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -191,7 +191,7 @@ static void OpenBagAfterPaletteFade(enum BattlerId battler) { gBattlerControllerFuncs[battler] = CompleteOnChosenItem; ReshowBattleScreenDummy(); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); DoWallyTutorialBagMenu(); } } diff --git a/src/battle_main.c b/src/battle_main.c index 3e2e877b47..4c68a9de9a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5659,7 +5659,7 @@ static void TryEvolvePokemon(void) if (species != SPECIES_NONE) { - FreeAllWindowBuffers(); + CloseMainBattleScreen(); gBattleMainFunc = WaitForEvoSceneToFinish; GetEvolutionTargetSpecies(&gParties[B_TRAINER_0][i], mode, evolutionItemArg, NULL, &canStopEvo, DO_EVO); EvolutionScene(&gParties[B_TRAINER_0][i], species, canStopEvo, i); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b0bbceb485..497d7e5d38 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5976,7 +5976,7 @@ static void Cmd_yesnoboxlearnmove(void) case 2: if (!gPaletteFade.active) { - FreeAllWindowBuffers(); + CloseMainBattleScreen(); ShowSelectMovePokemonSummaryScreen(gParties[B_TRAINER_0], gBattleStruct->expGetterMonId, ReshowBattleScreenAfterMenu, gMoveToLearn); gBattleScripting.learnMoveState++; } @@ -11126,7 +11126,7 @@ static void Cmd_displaydexinfo(void) case 1: if (!gPaletteFade.active) { - FreeAllWindowBuffers(); + CloseMainBattleScreen(); gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(species, GetMonData(mon, MON_DATA_IS_SHINY), GetMonData(mon, MON_DATA_PERSONALITY)); @@ -11284,7 +11284,7 @@ static void Cmd_trygivecaughtmonnick(void) { struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); - FreeAllWindowBuffers(); + CloseMainBattleScreen(); MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, diff --git a/src/battle_util2.c b/src/battle_util2.c index 4ac81e2a47..3f18ff1917 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -11,8 +11,27 @@ #include "constants/abilities.h" #include "random.h" #include "battle_scripts.h" +#include "window.h" #include "constants/battle_string_ids.h" +void AllocateBattleGfxResources(void) +{ + gBattleAnimBgTileBuffer = AllocZeroed(0x2000); + gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000); +} + +static void FreeBattleGfxResources(void) +{ + FREE_AND_SET_NULL(gBattleAnimBgTileBuffer); + FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer); +} + +void CloseMainBattleScreen(void) +{ + FreeBattleGfxResources(); + FreeAllWindowBuffers(); +} + void AllocateBattleResources(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER && gMapHeader.regionMapSectionId == MAPSEC_TRAINER_TOWER_2) @@ -40,8 +59,7 @@ void AllocateBattleResources(void) gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); - gBattleAnimBgTileBuffer = AllocZeroed(0x2000); - gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000); + AllocateBattleGfxResources(); if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) { @@ -76,8 +94,7 @@ void FreeBattleResources(void) FREE_AND_SET_NULL(gLinkBattleSendBuffer); FREE_AND_SET_NULL(gLinkBattleRecvBuffer); - FREE_AND_SET_NULL(gBattleAnimBgTileBuffer); - FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer); + FreeBattleGfxResources(); } } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 9f239f69a9..3da952e219 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -50,6 +50,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) case 0: ScanlineEffect_Clear(); BattleInitBgsAndWindows(); + AllocateBattleGfxResources(); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); ShowBg(0);