import { engine } from "/Scripts/engine/engine-init"; import { HookManager, TrackedHook } from "/Scripts/engine/hooks/hook-manager"; import { Hook } from "/Scripts/types/hook"; import { Scene } from "/Scripts/types/scene"; /** * A scene being tracked by the manager */ export interface TrackedScene { /** * The id assigned to the scene */ sceneId: number, /** * The scene itself */ scene: Scene, /** * A map of a scene to all hooks related to the scene */ sceneHooks: Array /** * A map of engine signal to the list of hooks that should be called when that signal fires */ signalHookMap: Record> } /** * Loads scenes */ export class SceneLoader { /** * The hook manager */ hookManager: HookManager /** * The list of loaded scenes */ loadedScenes: TrackedScene[] /** * A record of tracked scene id to tracked scene object */ sceneIdMap: Record /** * A scene */ sceneIdIncrementer: number = 0 /** * Registers all hooks in a scene to the hook manager * @param scene The scene */ registerScene(scene: Scene, isServerScene: boolean){ const shouldRegister: boolean = !this.containsScene(scene) if(shouldRegister){ //add to the list of tracked scenes const trackedScene: TrackedScene = { sceneId: this.sceneIdIncrementer++, scene: scene, sceneHooks: [], signalHookMap: { }, } this.loadedScenes.push(trackedScene) this.sceneIdMap[trackedScene.sceneId] = trackedScene //load all hooks from the scene scene.hooks.forEach((hook: Hook) => { engine.hookManager.registerHook(trackedScene,hook,isServerScene) }) } } /** * Deregisters all hooks in a scene from the hook manager * @param scene The scene */ deregisterScene(scene: Scene){ throw new Error("Unsupported Operation!") } /** * Checks if the manager is tracking a given scene * @param scene The scene * @returns true if it is being tracked already, false otherwise */ containsScene(scene: Scene): boolean { this.loadedScenes.forEach(trackedScene => { if(trackedScene.scene === scene){ return true } }) return false } /** * Gets a tracked scene by its id * @param sceneId The tracked scene * @returns The tracked scene if it exists, null otherwise */ getScene(sceneId: number){ return this.sceneIdMap[sceneId] } }