import Phaser from 'phaser'; export type LazySceneKey = 'StoryScene' | 'BattleScene' | 'CampScene' | 'EndingScene'; type LazySceneConstructor = new () => Phaser.Scene; const lazySceneLoaders: Record Promise> = { StoryScene: () => import('./StoryScene').then((module) => module.StoryScene), BattleScene: () => import('./BattleScene').then((module) => module.BattleScene), CampScene: () => import('./CampScene').then((module) => module.CampScene), EndingScene: () => import('./EndingScene').then((module) => module.EndingScene) }; const pendingSceneLoads = new Map>(); export function isLazySceneKey(key: string): key is LazySceneKey { return key === 'StoryScene' || key === 'BattleScene' || key === 'CampScene' || key === 'EndingScene'; } export async function ensureLazyScene(game: Phaser.Game, key: LazySceneKey) { if (game.scene.getScene(key)) { return; } const pendingLoad = pendingSceneLoads.get(key); if (pendingLoad) { await pendingLoad; return; } const load = lazySceneLoaders[key]().then((SceneClass) => { if (!game.scene.getScene(key)) { game.scene.add(key, SceneClass, false); } }); pendingSceneLoads.set(key, load); await load; } export async function startLazyScene(scene: Phaser.Scene, key: LazySceneKey, data?: Record) { await ensureLazyScene(scene.game, key); scene.scene.start(key, data); } export async function startGameScene(scene: Phaser.Scene, key: string, data?: Record) { if (isLazySceneKey(key)) { await startLazyScene(scene, key, data); return; } scene.scene.start(key, data); } export async function startLazySceneFromGame(game: Phaser.Game, key: LazySceneKey, data?: Record) { await ensureLazyScene(game, key); game.scene.start(key, data); }