58 lines
1.8 KiB
TypeScript
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);
|
|
}
|