Files
heros_web/src/game/scenes/lazyScenes.ts

58 lines
1.8 KiB
TypeScript

import Phaser from 'phaser';
export type LazySceneKey = 'StoryScene' | 'BattleScene' | 'CampScene' | 'EndingScene';
type LazySceneConstructor = new () => Phaser.Scene;
const lazySceneLoaders: Record<LazySceneKey, () => Promise<LazySceneConstructor>> = {
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<LazySceneKey, Promise<void>>();
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<string, unknown>) {
await ensureLazyScene(scene.game, key);
scene.scene.start(key, data);
}
export async function startGameScene(scene: Phaser.Scene, key: string, data?: Record<string, unknown>) {
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<string, unknown>) {
await ensureLazyScene(game, key);
game.scene.start(key, data);
}