diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 6db9311bac8..e9d5a97ab8d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1191,6 +1191,9 @@ export default class BattleScene extends SceneBase { onComplete: () => { this.clearPhaseQueue(); + this.ui.freeUIData(); + this.uiContainer.remove(this.ui, true); + this.uiContainer.destroy(); this.children.removeAll(true); this.game.domContainer.innerHTML = ""; this.launchBattle(); diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index eeb6da319ef..5fa53b7c270 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -89,6 +89,13 @@ export class NavigationManager { } } + /** + * Removes menus from the manager in preparation for reset + */ + public clearNavigationMenus() { + this.navigationMenus.length = 0; + } + } export default class NavigationMenu extends Phaser.GameObjects.Container { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 29c58d7087e..40325d24af7 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2698,6 +2698,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateScroll(); }; + override destroy(): void { + // Without this the reference gets hung up and no startercontainers get GCd + this.starterContainers = []; + } + updateScroll = () => { const maxColumns = 9; const maxRows = 9; diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index 1f0155aef8b..89f8d9e65b6 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -62,4 +62,9 @@ export default abstract class UiHandler { clear() { this.active = false; } + /** + * To be implemented by individual handlers when necessary to free memory + * Called when {@linkcode BattleScene} is reset + */ + destroy(): void {} } diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 6d44997f649..9e8c52b1d24 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -53,6 +53,7 @@ import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler"; import AutoCompleteUiHandler from "./autocomplete-ui-handler"; import { Device } from "#enums/devices"; import MysteryEncounterUiHandler from "./mystery-encounter-ui-handler"; +import { NavigationManager } from "./settings/navigationMenu"; export enum Mode { MESSAGE, @@ -614,4 +615,14 @@ export default class UI extends Phaser.GameObjects.Container { return globalScene.inputMethod; } } + + /** + * Attempts to free memory held by UI handlers + * and clears menus from {@linkcode NavigationManager} to prepare for reset + */ + public freeUIData(): void { + this.handlers.forEach(h => h.destroy()); + this.handlers = []; + NavigationManager.getInstance().clearNavigationMenus(); + } }