const Phaser = require('phaser'); // Scenes constantly showing const MenuCrypList = require('./menu.cryps.list'); const MenuNavigation = require('./menu.navigation'); const ItemList = require('./item.list'); // Scenes which change depending on menu context const Zones = require('./zones'); const GameList = require('./game.list'); const StatSheet = require('./statsheet'); const SpecSheet = require('./specsheet'); const ItemInfo = require('./item.info'); const FIXED_MENU_SCENES = [ 'MenuCrypList', 'MenuNavigation', 'ItemList', ]; const MAIN_MENU_SCENES = [ 'Zones', 'GameList', 'StatSheet', 'SpecSheet', 'ItemInfo', ]; const NULL_UUID = '00000000-0000-0000-0000-000000000000'; class Menu extends Phaser.Scene { constructor() { super({ key: 'Menu', active: true }); } create() { this.registry.events.on('changedata', this.updateData, this); this.registry.events.on('setdata', this.updateData, this); // When we load the menu request the latest items // Item list will restart when the data comes in this.registry.get('ws').sendVboxState(NULL_UUID); this.scene.manager.add('MenuCrypList', MenuCrypList, true); this.scene.manager.add('MenuNavigation', MenuNavigation, true); this.scene.manager.add('ItemList', ItemList, true); return true; } updateData(parent, key, data) { if (!data) return false; // Controls which scene shows in the main top right section switch (key) { case 'game': return this.cleanUp(); case 'zone': return this.newMainScene('Zones', Zones, data); case 'gameList': return this.newMainScene('GameList', GameList, data); case 'crypStats': return this.newMainScene('StatSheet', StatSheet, data); case 'crypSpec': return this.newMainScene('SpecSheet', SpecSheet, data); case 'itemInfo': return this.newMainScene('ItemInfo', ItemInfo, data); default: return false; } } newMainScene(key, scene, data) { let addScene = true; // List of scenes which could be occupying the main section of the menu MAIN_MENU_SCENES.forEach((sKey) => { if (this.scene.manager.keys[sKey]) { if (key === sKey) { // If there is new data for the current scene restart this.scene.manager.keys[sKey].scene.restart(data); addScene = false; } else { // Delete the old scene this.scene.manager.keys[sKey].cleanUp(); } } }); if (addScene) this.scene.manager.add(key, scene, true, data); } cleanUp() { this.registry.events.off('changedata', this.updateData, this); this.registry.events.off('setdata', this.updateData, this); // Delete scenes which could be showing before switching to battle scene const removeScenes = (sKey) => { if (this.scene.get(sKey)) this.scene.get(sKey).cleanUp(); }; FIXED_MENU_SCENES.forEach(removeScenes); MAIN_MENU_SCENES.forEach(removeScenes); this.scene.remove(); } } module.exports = Menu;