@al8b/runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -0
- package/dist/assets/constructors.d.mts +6 -0
- package/dist/assets/constructors.d.ts +6 -0
- package/dist/assets/constructors.js +40 -0
- package/dist/assets/constructors.js.map +1 -0
- package/dist/assets/constructors.mjs +12 -0
- package/dist/assets/constructors.mjs.map +1 -0
- package/dist/assets/index.d.mts +11 -0
- package/dist/assets/index.d.ts +11 -0
- package/dist/assets/index.js +276 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/assets/index.mjs +247 -0
- package/dist/assets/index.mjs.map +1 -0
- package/dist/assets/loader.d.mts +83 -0
- package/dist/assets/loader.d.ts +83 -0
- package/dist/assets/loader.js +260 -0
- package/dist/assets/loader.js.map +1 -0
- package/dist/assets/loader.mjs +237 -0
- package/dist/assets/loader.mjs.map +1 -0
- package/dist/browser/index.js +16599 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/index.min.js +171 -0
- package/dist/constants.d.mts +16 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +49 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +18 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/core/api-factory.d.mts +63 -0
- package/dist/core/api-factory.d.ts +63 -0
- package/dist/core/api-factory.js +239 -0
- package/dist/core/api-factory.js.map +1 -0
- package/dist/core/api-factory.mjs +214 -0
- package/dist/core/api-factory.mjs.map +1 -0
- package/dist/core/assets-registry.d.mts +14 -0
- package/dist/core/assets-registry.d.ts +14 -0
- package/dist/core/assets-registry.js +64 -0
- package/dist/core/assets-registry.js.map +1 -0
- package/dist/core/assets-registry.mjs +41 -0
- package/dist/core/assets-registry.mjs.map +1 -0
- package/dist/core/controller.d.mts +109 -0
- package/dist/core/controller.d.ts +109 -0
- package/dist/core/controller.js +1782 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/controller.mjs +1758 -0
- package/dist/core/controller.mjs.map +1 -0
- package/dist/core/debug-logger.d.mts +35 -0
- package/dist/core/debug-logger.d.ts +35 -0
- package/dist/core/debug-logger.js +177 -0
- package/dist/core/debug-logger.js.map +1 -0
- package/dist/core/debug-logger.mjs +154 -0
- package/dist/core/debug-logger.mjs.map +1 -0
- package/dist/core/error-handler.d.mts +25 -0
- package/dist/core/error-handler.d.ts +25 -0
- package/dist/core/error-handler.js +106 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/error-handler.mjs +81 -0
- package/dist/core/error-handler.mjs.map +1 -0
- package/dist/core/index.d.mts +14 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.js +1782 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +1757 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/hot-reload/index.d.mts +7 -0
- package/dist/hot-reload/index.d.ts +7 -0
- package/dist/hot-reload/index.js +103 -0
- package/dist/hot-reload/index.js.map +1 -0
- package/dist/hot-reload/index.mjs +78 -0
- package/dist/hot-reload/index.mjs.map +1 -0
- package/dist/hot-reload/updater.d.mts +33 -0
- package/dist/hot-reload/updater.d.ts +33 -0
- package/dist/hot-reload/updater.js +101 -0
- package/dist/hot-reload/updater.js.map +1 -0
- package/dist/hot-reload/updater.mjs +78 -0
- package/dist/hot-reload/updater.mjs.map +1 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +1859 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1817 -0
- package/dist/index.mjs.map +1 -0
- package/dist/input/index.d.mts +2 -0
- package/dist/input/index.d.ts +2 -0
- package/dist/input/index.js +79 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/index.mjs +54 -0
- package/dist/input/index.mjs.map +1 -0
- package/dist/input/manager.d.mts +37 -0
- package/dist/input/manager.d.ts +37 -0
- package/dist/input/manager.js +77 -0
- package/dist/input/manager.js.map +1 -0
- package/dist/input/manager.mjs +54 -0
- package/dist/input/manager.mjs.map +1 -0
- package/dist/loop/game-loop.d.mts +63 -0
- package/dist/loop/game-loop.d.ts +63 -0
- package/dist/loop/game-loop.js +156 -0
- package/dist/loop/game-loop.js.map +1 -0
- package/dist/loop/game-loop.mjs +131 -0
- package/dist/loop/game-loop.mjs.map +1 -0
- package/dist/loop/index.d.mts +1 -0
- package/dist/loop/index.d.ts +1 -0
- package/dist/loop/index.js +156 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/index.mjs +131 -0
- package/dist/loop/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +31 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +6 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/system/api.d.mts +28 -0
- package/dist/system/api.d.ts +28 -0
- package/dist/system/api.js +126 -0
- package/dist/system/api.js.map +1 -0
- package/dist/system/api.mjs +101 -0
- package/dist/system/api.mjs.map +1 -0
- package/dist/system/index.d.mts +2 -0
- package/dist/system/index.d.ts +2 -0
- package/dist/system/index.js +126 -0
- package/dist/system/index.js.map +1 -0
- package/dist/system/index.mjs +101 -0
- package/dist/system/index.mjs.map +1 -0
- package/dist/types/assets.d.mts +43 -0
- package/dist/types/assets.d.ts +43 -0
- package/dist/types/assets.js +19 -0
- package/dist/types/assets.js.map +1 -0
- package/dist/types/assets.mjs +1 -0
- package/dist/types/assets.mjs.map +1 -0
- package/dist/types/bridge.d.mts +66 -0
- package/dist/types/bridge.d.ts +66 -0
- package/dist/types/bridge.js +19 -0
- package/dist/types/bridge.js.map +1 -0
- package/dist/types/bridge.mjs +1 -0
- package/dist/types/bridge.mjs.map +1 -0
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types/runtime.d.mts +71 -0
- package/dist/types/runtime.d.ts +71 -0
- package/dist/types/runtime.js +19 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/runtime.mjs +1 -0
- package/dist/types/runtime.mjs.map +1 -0
- package/dist/types/vm.d.mts +1 -0
- package/dist/types/vm.d.ts +1 -0
- package/dist/types/vm.js +19 -0
- package/dist/types/vm.js.map +1 -0
- package/dist/types/vm.mjs +1 -0
- package/dist/types/vm.mjs.map +1 -0
- package/dist/utils/deep-clone.d.mts +14 -0
- package/dist/utils/deep-clone.d.ts +14 -0
- package/dist/utils/deep-clone.js +42 -0
- package/dist/utils/deep-clone.js.map +1 -0
- package/dist/utils/deep-clone.mjs +19 -0
- package/dist/utils/deep-clone.mjs.map +1 -0
- package/dist/utils/index.d.mts +3 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +156 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +129 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/object-pool.d.mts +66 -0
- package/dist/utils/object-pool.d.ts +66 -0
- package/dist/utils/object-pool.js +113 -0
- package/dist/utils/object-pool.js.map +1 -0
- package/dist/utils/object-pool.mjs +90 -0
- package/dist/utils/object-pool.mjs.map +1 -0
- package/dist/utils/shallow-equal.d.mts +15 -0
- package/dist/utils/shallow-equal.d.ts +15 -0
- package/dist/utils/shallow-equal.js +53 -0
- package/dist/utils/shallow-equal.js.map +1 -0
- package/dist/utils/shallow-equal.mjs +30 -0
- package/dist/utils/shallow-equal.mjs.map +1 -0
- package/dist/vm/index.d.mts +1 -0
- package/dist/vm/index.d.ts +1 -0
- package/dist/vm/index.js +37 -0
- package/dist/vm/index.js.map +1 -0
- package/dist/vm/index.mjs +9 -0
- package/dist/vm/index.mjs.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/controller.ts","../../src/assets/constructors.ts","../../src/assets/loader.ts","../../src/constants.ts","../../src/hot-reload/updater.ts","../../src/input/manager.ts","../../src/loop/game-loop.ts","../../src/system/api.ts","../../src/core/debug-logger.ts","../../src/core/error-handler.ts","../../src/core/assets-registry.ts","../../src/core/api-factory.ts","../../src/utils/object-pool.ts"],"sourcesContent":["import { AudioCore } from \"@al8b/audio\";\nimport { PlayerService } from \"@al8b/player\";\nimport { SceneManager } from \"@al8b/scene\";\nimport { Screen } from \"@al8b/screen\";\nimport { StatePlayer, TimeMachine, type StateSnapshot, type TimeMachineCommand } from \"@al8b/time\";\nimport { L8BVM } from \"@al8b/vm\";\nimport { AssetLoader } from \"../assets\";\nimport { SourceUpdater } from \"../hot-reload\";\nimport { InputManager } from \"../input\";\nimport { GameLoop } from \"../loop\";\nimport { System } from \"../system\";\nimport type {\n\tHostEvent,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { DebugLogger } from \"./debug-logger\";\nimport { reportError, reportWarnings } from \"./error-handler\";\nimport { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport { createRuntimeGlobalApi, createRuntimeMeta } from \"./api-factory\";\n\nexport interface RuntimeController {\n\treadonly screen: Screen;\n\treadonly audio: AudioCore;\n\treadonly input: InputManager;\n\treadonly system: System;\n\treadonly playerService: PlayerService;\n\treadonly sceneManager: SceneManager;\n\treadonly vm: L8BVM | null;\n\treadonly timeMachine: TimeMachine | null;\n\treadonly sprites: Record<string, any>;\n\treadonly maps: Record<string, any>;\n\treadonly sounds: Record<string, any>;\n\treadonly music: Record<string, any>;\n\treadonly assets: Record<string, any>;\n\treadonly stopped: boolean;\n\tstart(): Promise<void>;\n\tstop(): void;\n\tresume(): void;\n\treset(options?: RuntimeResetOptions): Promise<void>;\n\texportSnapshot(): RuntimeSnapshot;\n\timportSnapshot(snapshot: RuntimeSnapshot): Promise<void>;\n\tupdateSource(file: string, src: string, reinit?: boolean): boolean;\n\thandleMessage(message: any): void;\n\tsendHostEvent(event: HostEvent): void;\n\tgetCanvas(): HTMLCanvasElement;\n\tgetSession(): RuntimeSessionSnapshot | null;\n}\n\nexport function createRuntime(options: RuntimeOptions = {}): RuntimeController {\n\treturn new RuntimeControllerImpl(options);\n}\n\nexport class RuntimeControllerImpl implements RuntimeController {\n\tprivate readonly options: RuntimeOptions;\n\tprivate readonly listener: RuntimeListener;\n\tprivate readonly assetRegistry = new RuntimeAssetsRegistry();\n\tprivate readonly assetLoader: AssetLoader;\n\tprivate readonly debugLogger = new DebugLogger();\n\tprivate readonly DEBUG_UPDATE_FREQUENCY = 10;\n\tprivate readonly snapshotRestorer = new StatePlayer();\n\n\tprivate bridgeUnsubscribe: (() => void) | null = null;\n\tprivate sourceUpdater: SourceUpdater | null = null;\n\tprivate gameLoop: GameLoop | null = null;\n\tprivate frameCount = 0;\n\tprivate lastUpdateRate = -1;\n\tprivate isStopped = false;\n\tprivate preserveStorageOnNextBoot: boolean;\n\tprivate sessionSnapshot: RuntimeSessionSnapshot | null;\n\n\tpublic readonly screen: Screen;\n\tpublic readonly audio: AudioCore;\n\tpublic readonly input: InputManager;\n\tpublic readonly system: System;\n\tpublic readonly playerService: PlayerService;\n\tpublic readonly sceneManager: SceneManager;\n\tpublic vm: L8BVM | null = null;\n\tpublic timeMachine: TimeMachine | null = null;\n\n\tconstructor(options: RuntimeOptions = {}) {\n\t\tthis.options = options;\n\t\tthis.listener = options.listener || {};\n\t\tthis.preserveStorageOnNextBoot = options.preserveStorage || false;\n\t\tthis.sessionSnapshot = options.initialSession || null;\n\n\t\tthis.screen = new Screen({\n\t\t\truntime: this,\n\t\t\tcanvas: options.canvas,\n\t\t\twidth: options.width || 400,\n\t\t\theight: options.height || 400,\n\t\t});\n\n\t\tthis.audio = new AudioCore(this);\n\t\tthis.input = new InputManager(this.screen.getCanvas());\n\t\tthis.system = new System();\n\t\tthis.playerService = new PlayerService({\n\t\t\tpause: () => this.stop(),\n\t\t\tresume: () => this.resume(),\n\t\t\tpostMessage: (message: any) => this.emitPlayerMessage(message),\n\t\t\tgetFps: () => this.system.getAPI().fps,\n\t\t\tgetUpdateRate: () => this.system.getAPI().update_rate,\n\t\t\tsetUpdateRate: (rate: number) => {\n\t\t\t\tthis.system.getAPI().update_rate = rate;\n\t\t\t},\n\t\t});\n\t\tthis.sceneManager = new SceneManager();\n\t\tthis.assetLoader = new AssetLoader(options.url || \"\", options.resources || {}, this.audio, this.listener);\n\n\t\tthis.logStep(\"RuntimeController constructed\", {\n\t\t\twidth: this.screen.width,\n\t\t\theight: this.screen.height,\n\t\t\tresources: {\n\t\t\t\timages: options.resources?.images?.length ?? 0,\n\t\t\t\tsounds: options.resources?.sounds?.length ?? 0,\n\t\t\t\tmusic: options.resources?.music?.length ?? 0,\n\t\t\t},\n\t\t});\n\t}\n\n\tget sprites(): Record<string, any> {\n\t\treturn this.assetRegistry.sprites;\n\t}\n\n\tget maps(): Record<string, any> {\n\t\treturn this.assetRegistry.maps;\n\t}\n\n\tget sounds(): Record<string, any> {\n\t\treturn this.assetRegistry.sounds;\n\t}\n\n\tget music(): Record<string, any> {\n\t\treturn this.assetRegistry.music;\n\t}\n\n\tget assets(): Record<string, any> {\n\t\treturn this.assetRegistry.assets;\n\t}\n\n\tget stopped(): boolean {\n\t\treturn this.isStopped;\n\t}\n\n\tgetSession(): RuntimeSessionSnapshot | null {\n\t\treturn this.sessionSnapshot ? cloneSnapshot(this.sessionSnapshot) : null;\n\t}\n\n\tasync start(): Promise<void> {\n\t\tthis.logStep(\"startup: begin\");\n\n\t\tawait this.hydrateSession();\n\t\tthis.ensureBridgeSubscription();\n\n\t\tthis.logStep(\"startup: loading assets\");\n\t\tawait this.loadAssets();\n\t\tthis.logStep(\"startup: assets loaded\", {\n\t\t\tsprites: Object.keys(this.sprites).length,\n\t\t\tmaps: Object.keys(this.maps).length,\n\t\t\tsounds: Object.keys(this.sounds).length,\n\t\t\tmusic: Object.keys(this.music).length,\n\t\t\tassets: Object.keys(this.assets).length,\n\t\t});\n\n\t\tthis.logStep(\"startup: waiting for asset readiness\");\n\t\tawait this.waitForAssetsReady();\n\t\tthis.logStep(\"startup: assets ready\");\n\n\t\tthis.logStep(\"startup: initializing VM\");\n\t\tthis.initializeVM();\n\t\tthis.logStep(\"startup: VM ready\", {\n\t\t\tsourceFiles: Object.keys(this.options.sources || {}).length,\n\t\t});\n\n\t\tthis.logStep(\"startup: starting game loop\");\n\t\tthis.startGameLoop();\n\t\tthis.isStopped = false;\n\t\tthis.logStep(\"startup: completed\");\n\t}\n\n\tstop(): void {\n\t\tthis.logStep(\"lifecycle: stop requested\");\n\t\tthis.isStopped = true;\n\t\tthis.gameLoop?.stop();\n\t\tthis.audio.stopAll();\n\t}\n\n\tresume(): void {\n\t\tthis.logStep(\"lifecycle: resume requested\");\n\t\tthis.isStopped = false;\n\t\tthis.gameLoop?.resume();\n\t}\n\n\tasync reset(options: RuntimeResetOptions = {}): Promise<void> {\n\t\tthis.logStep(\"lifecycle: reset requested\", options);\n\t\tconst preservedSnapshot = options.preserveSnapshot ? this.exportSnapshot() : null;\n\t\tconst preserveSession = options.preserveSession ?? true;\n\t\tconst preserveStorage = options.preserveStorage ?? this.options.preserveStorage ?? false;\n\n\t\tthis.stop();\n\t\tthis.teardownRuntimeState();\n\n\t\tif (!preserveSession) {\n\t\t\tthis.sessionSnapshot = null;\n\t\t}\n\t\tthis.preserveStorageOnNextBoot = preserveStorage;\n\n\t\tawait this.start();\n\n\t\tif (preservedSnapshot) {\n\t\t\tawait this.importSnapshot(preservedSnapshot);\n\t\t}\n\t}\n\n\texportSnapshot(): RuntimeSnapshot {\n\t\tconst global = this.vm?.context?.global;\n\t\tconst routerState = this.sceneManager.router.getState();\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tglobal: global ? serializeGlobalSnapshot(global) : {},\n\t\t\tsession: this.getSession(),\n\t\t\trouter: {\n\t\t\t\tpath: routerState.path,\n\t\t\t\tsceneName: this.sceneManager.getCurrentSceneName(),\n\t\t\t},\n\t\t\tsystem: {\n\t\t\t\tupdateRate: this.system.getAPI().update_rate,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync importSnapshot(snapshot: RuntimeSnapshot): Promise<void> {\n\t\tif (!this.vm?.context?.global) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.snapshotRestorer.restoreState(this.vm.context.global as unknown as Record<string, unknown>, snapshot.global);\n\t\tthis.system.getAPI().update_rate = snapshot.system.updateRate;\n\t\tthis.updateGameLoopUpdateRate();\n\n\t\tif (snapshot.session) {\n\t\t\tthis.sessionSnapshot = cloneSnapshot(snapshot.session);\n\t\t}\n\n\t\tif (snapshot.router.path) {\n\t\t\tthis.sceneManager.router.replace(snapshot.router.path);\n\t\t} else if (snapshot.router.sceneName) {\n\t\t\tthis.sceneManager.setActiveScene(snapshot.router.sceneName);\n\t\t}\n\t}\n\n\tupdateSource(file: string, src: string, reinit = false): boolean {\n\t\tif (!this.sourceUpdater) return false;\n\t\treturn this.sourceUpdater.updateSource(file, src, reinit);\n\t}\n\n\thandleMessage(message: any): void {\n\t\tif (!message) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof message === \"object\" && \"type\" in message && typeof message.type === \"string\") {\n\t\t\tthis.sendHostEvent(message as HostEvent);\n\t\t\treturn;\n\t\t}\n\n\t\tif (message.name === \"time_machine\" && this.timeMachine) {\n\t\t\tthis.timeMachine.messageReceived(message);\n\t\t}\n\t}\n\n\tsendHostEvent(event: HostEvent): void {\n\t\tthis.handleHostEvent(event);\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\treturn this.screen.getCanvas();\n\t}\n\n\tprivate async loadAssets(): Promise<void> {\n\t\tconst collections = await this.assetLoader.loadAll();\n\t\tthis.assetRegistry.replace(collections);\n\t}\n\n\tprivate async waitForAssetsReady(): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst checkReady = () => {\n\t\t\t\tif (this.assetLoader.isReady()) {\n\t\t\t\t\tthis.system.setLoading(100);\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst progress = this.assetLoader.getProgress();\n\t\t\t\tthis.system.setLoading(Math.floor(progress * 100));\n\t\t\t\tthis.assetLoader.showLoadingBar(this.screen.getInterface());\n\t\t\t\trequestAnimationFrame(checkReady);\n\t\t\t};\n\n\t\t\tcheckReady();\n\t\t});\n\t}\n\n\tprivate initializeVM(): void {\n\t\tthis.logStep(\"vm: building meta/global APIs\");\n\n\t\tconst apiContext = {\n\t\t\tlistener: this.listener,\n\t\t\toptions: this.options,\n\t\t\tscreen: this.screen,\n\t\t\taudio: this.audio,\n\t\t\tinput: this.input,\n\t\t\tsystem: this.system,\n\t\t\tplayerService: this.playerService,\n\t\t\tsceneManager: this.sceneManager,\n\t\t\tassets: this.assetRegistry,\n\t\t\tbridge: this.options.bridge,\n\t\t\tgetVM: () => this.vm,\n\t\t\tgetSessionSnapshot: () => this.getSession(),\n\t\t\tsendHostEvent: (event: HostEvent) => this.emitBridgeEvent(event.type, event.payload),\n\t\t\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\t\tthis.sendBridgeRequest(name, payload, callback),\n\t\t\texportSnapshot: () => this.exportSnapshot(),\n\t\t\timportSnapshot: (snapshot: RuntimeSnapshot) => this.importSnapshot(snapshot),\n\t\t\tresetRuntime: (options?: RuntimeResetOptions) => this.reset(options),\n\t\t\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) =>\n\t\t\t\tthis.saveSnapshot(meta, callback),\n\t\t\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) =>\n\t\t\t\tthis.loadSnapshot(meta, callback),\n\t\t};\n\n\t\tconst meta = createRuntimeMeta(apiContext);\n\t\tconst global = createRuntimeGlobalApi(apiContext);\n\t\tthis.vm = new L8BVM(meta, global, this.options.namespace || \"/l8b\", this.preserveStorageOnNextBoot);\n\t\tthis.sourceUpdater = new SourceUpdater(\n\t\t\tthis.vm,\n\t\t\tthis.listener,\n\t\t\tthis.audio,\n\t\t\tthis.screen,\n\t\t\t() => reportWarnings(this.vm!, this.listener),\n\t\t\t(name: string, payload?: unknown) => this.emitBridgeEvent(name, payload),\n\t\t);\n\t\tthis.timeMachine = new TimeMachine(this as any);\n\n\t\tthis.timeMachine.onStatus((status: any) => {\n\t\t\tthis.emitBridgeEvent(\"time_machine_status\", { status });\n\t\t});\n\n\t\tthis.loadPrograms();\n\t\tthis.initializeScenesAndRouter();\n\n\t\tthis.emitBridgeEvent(\"runtime.started\", {});\n\t}\n\n\tprivate loadPrograms(): void {\n\t\tif (!this.vm) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst compiledRoutines = this.options.compiledRoutines || {};\n\t\tconst sources = this.options.sources || {};\n\n\t\tif (Object.keys(compiledRoutines).length > 0) {\n\t\t\tthis.logStep(\"vm: loading compiled routines\", { files: Object.keys(compiledRoutines) });\n\t\t\tfor (const [file, routine] of Object.entries(compiledRoutines)) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.vm.loadRoutine(routine, file);\n\t\t\t\t} catch (err: any) {\n\t\t\t\t\treportError(this.listener, {\n\t\t\t\t\t\terror: err.message || String(err),\n\t\t\t\t\t\ttype: \"compile\",\n\t\t\t\t\t\tstack: err.stack,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t});\n\t\t\t\t\tthis.logStep(\"vm: routine load error\", { file, message: err?.message || String(err) });\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (Object.keys(sources).length > 0) {\n\t\t\tthis.logStep(\"vm: executing sources\", { files: Object.keys(sources) });\n\t\t\tfor (const [file, src] of Object.entries(sources)) {\n\t\t\t\tthis.sourceUpdater?.updateSource(file, src, false);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.logStep(\"vm: no sources or compiled routines provided\");\n\t\t}\n\n\t\ttry {\n\t\t\tthis.vm.call(\"init\");\n\t\t\tthis.vm.runner.tick();\n\t\t\tthis.logStep(\"vm: init() executed\");\n\t\t} catch (err: any) {\n\t\t\treportError(this.listener, {\n\t\t\t\terror: err.message || String(err),\n\t\t\t\ttype: \"init\",\n\t\t\t\tstack: err.stack,\n\t\t\t});\n\t\t\tthis.logStep(\"vm: init() error\", { message: err?.message || String(err) });\n\t\t}\n\t}\n\n\tprivate initializeScenesAndRouter(): void {\n\t\tconst registeredScenes = this.sceneManager.registry.getNames();\n\t\tthis.logStep(\"router: initializing\", {\n\t\t\tregisteredScenes: registeredScenes.length,\n\t\t\tsceneNames: registeredScenes,\n\t\t});\n\t\tthis.sceneManager.router.init();\n\t\tconst activeScene = this.sceneManager.hasActiveScene()\n\t\t\t? (this.sceneManager as any).getCurrentSceneName?.() || \"unknown\"\n\t\t\t: null;\n\t\tconst routerState = this.sceneManager.router.getState();\n\t\tthis.logStep(\"router: initialized\", {\n\t\t\tactiveScene: activeScene || \"none\",\n\t\t\tpath: routerState.path,\n\t\t\thasActiveScene: this.sceneManager.hasActiveScene(),\n\t\t});\n\t}\n\n\tprivate startGameLoop(): void {\n\t\tthis.logStep(\"loop: creating game loop\");\n\t\tthis.gameLoop = new GameLoop({\n\t\t\tonUpdate: () => this.handleUpdate(),\n\t\t\tonDraw: () => this.handleDraw(),\n\t\t\tonTick: () => this.handleTick(),\n\t\t\tonWatchStep: () => this.handleWatchStep(),\n\t\t\tgetUpdateRate: () => {\n\t\t\t\tif (!this.vm) return undefined;\n\t\t\t\ttry {\n\t\t\t\t\treturn this.vm.context?.global?.system?.update_rate;\n\t\t\t\t} catch {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetFPS: (fps: number) => {\n\t\t\t\tif (!this.vm) return;\n\t\t\t\ttry {\n\t\t\t\t\tif (this.vm.context?.global?.system) {\n\t\t\t\t\t\tthis.vm.context.global.system.fps = fps;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t},\n\t\t});\n\t\tthis.gameLoop.start();\n\t\tthis.logStep(\"loop: started\");\n\t}\n\n\tprivate updateGameLoopUpdateRate(): void {\n\t\tif (!this.vm || !this.gameLoop) return;\n\t\ttry {\n\t\t\tconst updateRate = this.vm.context?.global?.system?.update_rate;\n\t\t\tconst rate = updateRate != null && updateRate > 0 && Number.isFinite(updateRate) ? updateRate : 60;\n\t\t\tif (rate !== this.lastUpdateRate) {\n\t\t\t\tthis.lastUpdateRate = rate;\n\t\t\t\tthis.gameLoop.setUpdateRate(rate);\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\tprivate handleUpdate(): void {\n\t\tif (!this.vm) return;\n\n\t\tthis.frameCount++;\n\t\tthis.input.update();\n\n\t\tif (this.frameCount % this.DEBUG_UPDATE_FREQUENCY === 0) {\n\t\t\tthis.debugLogger.debugInputs(this.input, this.options.debug);\n\t\t\tthis.debugLogger.debugScreen(this.screen, this.options.debug);\n\t\t}\n\n\t\tif (this.gameLoop) {\n\t\t\tthis.system.setFPS(this.gameLoop.getFPS());\n\t\t\tthis.updateGameLoopUpdateRate();\n\t\t}\n\n\t\ttry {\n\t\t\tif (this.sceneManager.hasActiveScene()) {\n\t\t\t\tthis.sceneManager.update();\n\t\t\t} else {\n\t\t\t\tthis.vm.call(\"update\");\n\t\t\t\tthis.vm.runner.tick();\n\t\t\t}\n\n\t\t\tif (this.vm.error_info) {\n\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\terr.type = \"update\";\n\t\t\t\treportError(this.listener, err);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\treportError(this.listener, {\n\t\t\t\terror: err.message || String(err),\n\t\t\t\ttype: \"update\",\n\t\t\t\tstack: err.stack,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleDraw(): void {\n\t\tif (!this.vm) return;\n\n\t\ttry {\n\t\t\tthis.screen.initDraw();\n\t\t\tthis.screen.updateInterface();\n\n\t\t\tif (this.sceneManager.hasActiveScene()) {\n\t\t\t\tthis.sceneManager.draw();\n\t\t\t} else {\n\t\t\t\tthis.vm.call(\"draw\");\n\t\t\t\tthis.vm.runner.tick();\n\t\t\t}\n\n\t\t\treportWarnings(this.vm, this.listener);\n\n\t\t\tif (this.vm.error_info) {\n\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\terr.type = \"draw\";\n\t\t\t\treportError(this.listener, err);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\treportError(this.listener, {\n\t\t\t\terror: err.message || String(err),\n\t\t\t\ttype: \"draw\",\n\t\t\t\tstack: err.stack,\n\t\t\t});\n\t\t}\n\n\t\tthis.timeMachine?.step();\n\t}\n\n\tprivate handleTick(): void {\n\t\tif (this.vm?.runner) {\n\t\t\t(this.vm.runner as any).tick?.();\n\t\t}\n\t}\n\n\tprivate handleWatchStep(): void {\n\t\tthis.timeMachine?.loopStep();\n\t}\n\n\tprivate ensureBridgeSubscription(): void {\n\t\tif (this.bridgeUnsubscribe || !this.options.bridge?.subscribe) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst maybeUnsubscribe = this.options.bridge.subscribe((event) => this.handleHostEvent(event));\n\t\tthis.bridgeUnsubscribe = typeof maybeUnsubscribe === \"function\" ? maybeUnsubscribe : null;\n\t}\n\n\tprivate handleHostEvent(event: HostEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"session.update\":\n\t\t\t\tthis.mergeSession(event.payload);\n\t\t\t\tbreak;\n\t\t\tcase \"runtime.reset\":\n\t\t\t\tvoid this.reset(asRecord(event.payload));\n\t\t\t\tbreak;\n\t\t\tcase \"runtime.import_snapshot\":\n\t\t\t\tif (isRuntimeSnapshot(event.payload)) {\n\t\t\t\t\tvoid this.importSnapshot(event.payload);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"runtime.export_snapshot\":\n\t\t\t\tthis.emitBridgeEvent(\"runtime.snapshot\", this.exportSnapshot());\n\t\t\t\tbreak;\n\t\t\tcase \"runtime.stop\":\n\t\t\tcase \"runtime.pause\":\n\t\t\t\tthis.stop();\n\t\t\t\tbreak;\n\t\t\tcase \"runtime.resume\":\n\t\t\t\tthis.resume();\n\t\t\t\tbreak;\n\t\t\tcase \"time_machine\":\n\t\t\t\tif (this.timeMachine && isRecord(event.payload)) {\n\t\t\t\t\tconst command = event.payload.command;\n\t\t\t\t\tif (typeof command === \"string\") {\n\t\t\t\t\t\tthis.timeMachine.messageReceived({\n\t\t\t\t\t\t\tname: \"time_machine\",\n\t\t\t\t\t\t\tcommand: command as TimeMachineCommand,\n\t\t\t\t\t\t\tposition:\n\t\t\t\t\t\t\t\ttypeof event.payload.position === \"number\" ? event.payload.position : undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate emitPlayerMessage(message: unknown): void {\n\t\tif (isRecord(message) && typeof message.type === \"string\") {\n\t\t\tthis.emitBridgeEvent(message.type, message);\n\t\t} else {\n\t\t\tthis.emitBridgeEvent(\"player.message\", message);\n\t\t}\n\t}\n\n\tprivate emitBridgeEvent(name: string, payload?: unknown): void {\n\t\tthis.options.bridge?.emit?.(name, payload);\n\t}\n\n\tprivate sendBridgeRequest(name: string, payload?: unknown, callback?: (result: unknown) => void): string | null {\n\t\tconst request = this.options.bridge?.request;\n\t\tif (!request) {\n\t\t\tcallback?.({\n\t\t\t\tok: false,\n\t\t\t\terror: `No runtime bridge request handler registered for \"${name}\"`,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\tconst requestId = createRequestId(name);\n\t\ttry {\n\t\t\tconst result = request(name, payload);\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\tvoid result\n\t\t\t\t\t.then((value) => callback?.(value))\n\t\t\t\t\t.catch((error) => callback?.({ ok: false, error: error instanceof Error ? error.message : String(error) }));\n\t\t\t} else {\n\t\t\t\tcallback?.(result);\n\t\t\t}\n\t\t\treturn requestId;\n\t\t} catch (error) {\n\t\t\tcallback?.({ ok: false, error: error instanceof Error ? error.message : String(error) });\n\t\t\treturn requestId;\n\t\t}\n\t}\n\n\tprivate saveSnapshot(meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void): unknown {\n\t\tconst snapshot = this.exportSnapshot();\n\t\tconst save = this.options.bridge?.saveSnapshot;\n\t\tif (!save) {\n\t\t\tconst fallback = { ok: false, error: \"No runtime bridge saveSnapshot handler registered\", snapshot };\n\t\t\tcallback?.(fallback);\n\t\t\treturn fallback;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = save(snapshot, meta);\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\tvoid result\n\t\t\t\t\t.then(() => callback?.({ ok: true, snapshot }))\n\t\t\t\t\t.catch((error) => callback?.({ ok: false, error: error instanceof Error ? error.message : String(error) }));\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tcallback?.({ ok: true, snapshot });\n\t\t\treturn { ok: true, snapshot };\n\t\t} catch (error) {\n\t\t\tconst failure = { ok: false, error: error instanceof Error ? error.message : String(error) };\n\t\t\tcallback?.(failure);\n\t\t\treturn failure;\n\t\t}\n\t}\n\n\tprivate loadSnapshot(meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void): unknown {\n\t\tconst load = this.options.bridge?.loadSnapshot;\n\t\tif (!load) {\n\t\t\tconst fallback = { ok: false, error: \"No runtime bridge loadSnapshot handler registered\" };\n\t\t\tcallback?.(fallback);\n\t\t\treturn fallback;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = load(meta);\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\tvoid result\n\t\t\t\t\t.then(async (snapshot) => {\n\t\t\t\t\t\tif (snapshot) {\n\t\t\t\t\t\t\tawait this.importSnapshot(snapshot);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcallback?.({ ok: true, snapshot });\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => callback?.({ ok: false, error: error instanceof Error ? error.message : String(error) }));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (result) {\n\t\t\t\tvoid this.importSnapshot(result);\n\t\t\t}\n\t\t\tcallback?.({ ok: true, snapshot: result });\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst failure = { ok: false, error: error instanceof Error ? error.message : String(error) };\n\t\t\tcallback?.(failure);\n\t\t\treturn failure;\n\t\t}\n\t}\n\n\tprivate async hydrateSession(): Promise<void> {\n\t\tif (this.sessionSnapshot) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst getSession = this.options.bridge?.getSession;\n\t\tif (!getSession) {\n\t\t\tthis.sessionSnapshot = this.options.initialSession || null;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst session = getSession();\n\t\t\tthis.sessionSnapshot = isPromiseLike(session) ? await session : session;\n\t\t} catch {\n\t\t\tthis.sessionSnapshot = this.options.initialSession || null;\n\t\t}\n\t}\n\n\tprivate mergeSession(payload: unknown): void {\n\t\tif (!isRecord(payload)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.sessionSnapshot || {};\n\t\tthis.sessionSnapshot = {\n\t\t\t...current,\n\t\t\t...payload,\n\t\t} as RuntimeSessionSnapshot;\n\t}\n\n\tprivate teardownRuntimeState(): void {\n\t\tthis.gameLoop = null;\n\t\tthis.sourceUpdater = null;\n\t\tthis.vm = null;\n\t\tthis.timeMachine = null;\n\t\tthis.frameCount = 0;\n\t\tthis.lastUpdateRate = -1;\n\t\tthis.isStopped = false;\n\t\tthis.sceneManager.registry.clear();\n\t\tthis.sceneManager.routeManager.clear();\n\t}\n\n\tprivate logStep(message: string, payload?: unknown): void {\n\t\tif (!this.options.debug?.lifecycle) return;\n\n\t\tconst prefix = \"[@al8b/runtime][lifecycle]\";\n\t\tif (payload !== undefined) {\n\t\t\tconsole.info(`${prefix} ${message}`, payload);\n\t\t} else {\n\t\t\tconsole.info(`${prefix} ${message}`);\n\t\t}\n\n\t\tif (this.listener.log) {\n\t\t\ttry {\n\t\t\t\tconst serialized = payload === undefined ? \"\" : ` ${JSON.stringify(payload)}`;\n\t\t\t\tthis.listener.log(`${prefix} ${message}${serialized}`);\n\t\t\t} catch {\n\t\t\t\tthis.listener.log(`${prefix} ${message}`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction serializeGlobalSnapshot(global: object): StateSnapshot {\n\tconst globalRecord = global as Record<string, unknown>;\n\tconst excluded = [\n\t\tglobalRecord.random,\n\t\tglobalRecord.screen,\n\t\tglobalRecord.audio,\n\t\tglobalRecord.keyboard,\n\t\tglobalRecord.mouse,\n\t\tglobalRecord.touch,\n\t\tglobalRecord.gamepad,\n\t\tglobalRecord.system,\n\t\tglobalRecord.storage,\n\t\tglobalRecord.host,\n\t\tglobalRecord.session,\n\t\tglobalRecord.memory,\n\t].filter((value) => value != null);\n\n\treturn deepCloneValue(globalRecord, excluded);\n}\n\nfunction deepCloneValue<T>(value: T, excluded: unknown[] = []): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (excluded.includes(value)) {\n\t\treturn null as T;\n\t}\n\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => deepCloneValue(entry, excluded)) as T;\n\t}\n\n\tif (typeof value === \"object\") {\n\t\tconst clone: Record<string, unknown> = {};\n\t\tfor (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n\t\t\tclone[key] = deepCloneValue(entry, excluded);\n\t\t}\n\t\treturn clone as T;\n\t}\n\n\treturn null as T;\n}\n\nfunction cloneSnapshot<T>(value: T): T {\n\treturn deepCloneValue(value);\n}\n\nfunction createRequestId(name: string): string {\n\treturn `${name}:${Date.now()}:${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n\treturn typeof value === \"object\" && value !== null && \"then\" in value && typeof (value as Promise<T>).then === \"function\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): RuntimeResetOptions | undefined {\n\treturn isRecord(value) ? (value as RuntimeResetOptions) : undefined;\n}\n\nfunction isRuntimeSnapshot(value: unknown): value is RuntimeSnapshot {\n\tif (!isRecord(value)) return false;\n\tif (value.version !== 1) return false;\n\tif (!isRecord(value.global)) return false;\n\t// Ensure router and session are present (can be null but not undefined)\n\tif (!(\"router\" in value)) return false;\n\tif (!(\"session\" in value)) return false;\n\treturn true;\n}\n","/**\n * Dynamic asset constructors\n *\n * Provides constructors for creating assets at runtime\n */\n\nimport { Sound } from \"@al8b/audio\";\nimport { TileMap } from \"@al8b/map\";\nimport { Image } from \"@al8b/image\";\nimport { Sprite } from \"@al8b/sprites\";\n\n/**\n * Export constructors for game code\n */\nexport { Image, Sprite, TileMap, Sound };\n","/**\n * AssetLoader - Handles loading of game assets\n *\n * Responsibilities:\n * - Load sprites, maps, sounds, music\n * - Track loading progress\n * - Show loading bar\n */\n\nimport { AudioCore, Sound, Music } from \"@al8b/audio\";\nimport { ASSET_LOAD_TIMEOUT_MS, DEFAULT_BLOCK_SIZE, LOADING_BAR_THROTTLE_MS } from \"../constants\";\nimport { LoadMap } from \"@al8b/map\";\nimport { LoadSprite } from \"@al8b/sprites\";\nimport type { AssetCollections, ResourceFile, Resources } from \"../types\";\nimport type { RuntimeListener } from \"../types\";\n\n/**\n * Race a promise against a timeout.\n * Rejects with a descriptive error if `ms` elapses before the promise settles.\n */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n\treturn Promise.race([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) =>\n\t\t\tsetTimeout(() => reject(new Error(`Asset load timed out after ${ms}ms`)), ms),\n\t\t),\n\t]);\n}\n\nexport class AssetLoader {\n\tprivate url: string;\n\tprivate resources: Resources;\n\tprivate collections: AssetCollections;\n\tprivate loadingBarTime: number | null = null;\n\tprivate audioCore: AudioCore;\n\tprivate listener?: RuntimeListener;\n\n\tconstructor(url: string, resources: Resources, audioCore: AudioCore, listener?: RuntimeListener) {\n\t\tthis.url = url;\n\t\tthis.resources = resources;\n\t\tthis.audioCore = audioCore;\n\t\tthis.listener = listener;\n\t\tthis.collections = {\n\t\t\tsprites: {},\n\t\t\tmaps: {},\n\t\t\tsounds: {},\n\t\t\tmusic: {},\n\t\t\tassets: {},\n\t\t};\n\t}\n\n\t/**\n\t * Load all assets\n\t */\n\tasync loadAll(): Promise<AssetCollections> {\n\t\tawait Promise.all([\n\t\t\tthis.loadSprites(),\n\t\t\tthis.loadMaps(),\n\t\t\tthis.loadSounds(),\n\t\t\tthis.loadMusic(),\n\t\t\tthis.loadGenericAssets(),\n\t\t]);\n\n\t\treturn this.collections;\n\t}\n\n\t/**\n\t * Load a set of callback-based assets (sprites or maps) with timeout and placeholder fallback.\n\t */\n\tprivate async loadCallbackAssets<TRes extends ResourceFile>(\n\t\tresources: TRes[] | undefined,\n\t\turlPrefix: string,\n\t\tcollectionKey: \"sprites\" | \"maps\",\n\t\tload: (url: string, res: TRes, onReady: () => void) => any,\n\t\tcreatePlaceholder: (name: string, res: TRes) => any,\n\t): Promise<void> {\n\t\tif (!resources) return;\n\n\t\tconst promises = resources.map(\n\t\t\t(res) =>\n\t\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\t\tconst name = res.file.split(\".\")[0].replace(/-/g, \"/\");\n\t\t\t\t\tconst url = `${this.url}${urlPrefix}/${res.file}?v=${res.version || 0}`;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst inner = new Promise<void>((onReady) => {\n\t\t\t\t\t\t\tthis.collections[collectionKey][name] = load(url, res, onReady);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\twithTimeout(inner, ASSET_LOAD_TIMEOUT_MS).then(resolve).catch((err) => {\n\t\t\t\t\t\t\tthis.listener?.log?.(`[AssetLoader] Failed to load ${collectionKey.slice(0, -1)} \"${name}\": ${String(err)}`);\n\t\t\t\t\t\t\tthis.collections[collectionKey][name] = createPlaceholder(name, res);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tthis.listener?.log?.(`[AssetLoader] Failed to load ${collectionKey.slice(0, -1)} \"${name}\": ${String(err)}`);\n\t\t\t\t\t\tthis.collections[collectionKey][name] = createPlaceholder(name, res);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t);\n\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Load sprites\n\t */\n\tprivate async loadSprites(): Promise<void> {\n\t\tawait this.loadCallbackAssets(\n\t\t\tthis.resources.images,\n\t\t\t\"sprites\",\n\t\t\t\"sprites\",\n\t\t\t(url, img, onReady) => LoadSprite(url, img.properties, onReady),\n\t\t\t(name, img) => ({\n\t\t\t\tname,\n\t\t\t\tready: false,\n\t\t\t\tframes: [],\n\t\t\t\tfps: (img.properties as any)?.fps || 5,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Load maps\n\t */\n\tprivate async loadMaps(): Promise<void> {\n\t\tawait this.loadCallbackAssets(\n\t\t\tthis.resources.maps,\n\t\t\t\"maps\",\n\t\t\t\"maps\",\n\t\t\t(url, _mapRes, onReady) => LoadMap(url, this.collections.sprites, onReady),\n\t\t\t(name) => ({\n\t\t\t\tname,\n\t\t\t\tready: false,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t\tblock_width: DEFAULT_BLOCK_SIZE,\n\t\t\t\tblock_height: DEFAULT_BLOCK_SIZE,\n\t\t\t\tdata: [],\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Load sounds\n\t */\n\tprivate async loadSounds(): Promise<void> {\n\t\tif (!this.resources.sounds) return;\n\n\t\tconst promises = this.resources.sounds.map((sound) => {\n\t\t\treturn new Promise<void>((resolve) => {\n\t\t\t\tconst name = sound.file.split(\".\")[0];\n\t\t\t\tconst url = `${this.url}sounds/${sound.file}?v=${sound.version || 0}`;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Sound class handles loading via XMLHttpRequest and AudioBuffer internally.\n\t\t\t\t\t// Resolve immediately — readiness is polled via isReady()/getProgress() in the game loop.\n\t\t\t\t\tconst soundInstance = new Sound(this.audioCore, url);\n\t\t\t\t\tthis.collections.sounds[name] = soundInstance;\n\t\t\t\t\tresolve();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.listener?.log?.(`[AssetLoader] Failed to load sound \"${name}\": ${String(err)}`);\n\t\t\t\t\tthis.collections.sounds[name] = new Sound(this.audioCore, url);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Load music\n\t */\n\tprivate async loadMusic(): Promise<void> {\n\t\tif (!this.resources.music) return;\n\n\t\tconst promises = this.resources.music.map((mus) => {\n\t\t\treturn new Promise<void>((resolve) => {\n\t\t\t\tconst name = mus.file.split(\".\")[0];\n\t\t\t\tconst url = `${this.url}music/${mus.file}?v=${mus.version || 0}`;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Music class handles HTML5 Audio internally (streaming — ready immediately).\n\t\t\t\t\tconst musicInstance = new Music(this.audioCore, url);\n\t\t\t\t\tthis.collections.music[name] = musicInstance;\n\t\t\t\t\tresolve();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.listener?.log?.(`[AssetLoader] Failed to load music \"${name}\": ${String(err)}`);\n\t\t\t\t\tthis.collections.music[name] = new Music(this.audioCore, url);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Load generic assets\n\t */\n\tprivate async loadGenericAssets(): Promise<void> {\n\t\tif (!this.resources.assets) return;\n\n\t\tfor (const asset of this.resources.assets) {\n\t\t\tconst name = asset.file.split(\".\")[0].replace(/-/g, \"/\");\n\t\t\tthis.collections.assets[name] = {\n\t\t\t\tname,\n\t\t\t\tfile: asset.file,\n\t\t\t\tversion: asset.version,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Check if all assets are ready\n\t */\n\tisReady(): boolean {\n\t\treturn this.countReady() === this.countTotal();\n\t}\n\n\t/**\n\t * Get loading progress (0-1)\n\t */\n\tgetProgress(): number {\n\t\tconst total = this.countTotal();\n\t\tif (total === 0) return 1;\n\t\treturn this.countReady() / total;\n\t}\n\n\t/**\n\t * Count total assets\n\t */\n\tprivate countTotal(): number {\n\t\tlet count = 0;\n\t\tcount += Object.keys(this.collections.sprites).length;\n\t\tcount += Object.keys(this.collections.maps).length;\n\t\tcount += Object.keys(this.collections.sounds).length;\n\t\tcount += Object.keys(this.collections.music).length;\n\t\treturn count;\n\t}\n\n\t/**\n\t * Count ready assets\n\t */\n\tprivate countReady(): number {\n\t\tlet ready = 0;\n\n\t\tfor (const sprite of Object.values(this.collections.sprites)) {\n\t\t\tif (sprite.ready) ready++;\n\t\t}\n\t\tfor (const map of Object.values(this.collections.maps)) {\n\t\t\tif (map.ready) ready++;\n\t\t}\n\t\tfor (const sound of Object.values(this.collections.sounds)) {\n\t\t\tif (sound.ready) ready++;\n\t\t}\n\t\tfor (const mus of Object.values(this.collections.music)) {\n\t\t\tif (mus.ready) ready++;\n\t\t}\n\n\t\treturn ready;\n\t}\n\n\t/**\n\t * Show loading bar on screen\n\t */\n\tshowLoadingBar(screenInterface: any): void {\n\t\t// Throttle redraws\n\t\tif (this.loadingBarTime && Date.now() < this.loadingBarTime + LOADING_BAR_THROTTLE_MS) {\n\t\t\treturn;\n\t\t}\n\t\tthis.loadingBarTime = Date.now();\n\n\t\tconst progress = this.getProgress();\n\t\tscreenInterface.clear(\"#000\");\n\t\tscreenInterface.drawRect(0, 0, 100, 10, \"#DDD\");\n\t\tscreenInterface.fillRect(-(1 - progress) * 48, 0, progress * 96, 6, \"#DDD\");\n\t}\n\n\t/**\n\t * Get loaded collections\n\t */\n\tgetCollections(): AssetCollections {\n\t\treturn this.collections;\n\t}\n}\n","/** Default frames per second */\nexport const DEFAULT_FPS = 60;\n\n/** Default update rate (updates per second) */\nexport const DEFAULT_UPDATE_RATE = 60;\n\n/** Frame time in milliseconds at 60 FPS */\nexport const FRAME_TIME_MS = 1000 / DEFAULT_FPS;\n\n/** Threshold in ms to detect long pauses (tab switch, etc.) */\nexport const PAUSE_THRESHOLD_MS = 160;\n\n/** Default tile/block size in pixels */\nexport const DEFAULT_BLOCK_SIZE = 16;\n\n/** Minimum interval between loading bar redraws in ms (~60fps) */\nexport const LOADING_BAR_THROTTLE_MS = 16;\n\n/** Timeout in ms for individual asset loads (sprite/map HTTP requests) */\nexport const ASSET_LOAD_TIMEOUT_MS = 30_000;\n","/**\n * Source code updater for hot reload\n * Matches runtime behavior for source updates\n */\n\nimport type { L8BVM } from \"@al8b/vm\";\nimport type { RuntimeListener } from \"../types\";\n\nexport class SourceUpdater {\n\tprivate updateMemory: Record<string, string> = {};\n\tprivate previousInit: string | null = null;\n\n\tconstructor(\n\t\tprivate vm: L8BVM,\n\t\tprivate listener: RuntimeListener,\n\t\tprivate audio?: { cancelBeeps(): void },\n\t\tprivate screen?: { clear(): void },\n\t\tprivate reportWarnings?: () => void,\n\t\tprivate emitBridgeEvent?: (name: string, payload?: unknown) => void,\n\t) {}\n\n\t/**\n\t * Update source code (hot reload)\n\t */\n\tupdateSource(file: string, src: string, reinit = false): boolean {\n\t\t// Return false if VM is not available\n\t\tif (!this.vm) return false;\n\n\t\t// Return false if source code hasn't changed\n\t\tif (src === this.updateMemory[file]) return false;\n\n\t\tthis.updateMemory[file] = src;\n\n\t\t// Cancel beeps and clear screen before hot reload\n\t\tif (this.audio) {\n\t\t\tthis.audio.cancelBeeps();\n\t\t}\n\t\tif (this.screen) {\n\t\t\tthis.screen.clear();\n\t\t}\n\n\t\ttry {\n\t\t\t// Compile and execute updated source code\n\t\t\t// Timeout of 3000ms prevents infinite loops during hot reload\n\t\t\tthis.vm.run(src, 3000, file);\n\n\t\t\t// Notify parent process of successful compilation\n\t\t\tif (this.emitBridgeEvent) {\n\t\t\t\tthis.emitBridgeEvent(\"compile_success\", { file });\n\t\t\t}\n\n\t\t\t// Report warnings after compilation\n\t\t\tif (this.reportWarnings) {\n\t\t\t\tthis.reportWarnings();\n\t\t\t}\n\n\t\t\t// Check for compilation or runtime errors from VM\n\t\t\tif (this.vm.error_info) {\n\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\terr.type = \"init\";\n\t\t\t\terr.file = file;\n\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Re-run init() function if it was modified during hot reload\n\t\t\t// This allows reinitialization without full page refresh\n\t\t\tif ((this.vm.runner as any)?.getFunctionSource) {\n\t\t\t\tconst init = (this.vm.runner as any).getFunctionSource(\"init\");\n\t\t\t\tif (init && init !== this.previousInit && reinit) {\n\t\t\t\t\tthis.previousInit = init;\n\t\t\t\t\tthis.vm.call(\"init\");\n\t\t\t\t\tif (this.vm.error_info) {\n\t\t\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\t\t\terr.type = \"init\";\n\t\t\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (err: any) {\n\t\t\t// Handle exceptions during compilation or execution\n\t\t\terr.file = file;\n\t\t\tthis.listener.reportError?.(err);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n","/**\n * InputManager - Manages all input systems\n *\n * Responsibilities:\n * - Initialize input systems\n * - Update input state each frame\n * - Provide unified input interface\n */\n\nimport { GamepadInput, KeyboardInput, MouseInput, TouchInput } from \"@al8b/input\";\n\nexport class InputManager {\n\tpublic keyboard: KeyboardInput;\n\tpublic mouse: MouseInput;\n\tpublic touch: TouchInput;\n\tpublic gamepad: GamepadInput;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\t// Initialize all input subsystems\n\t\t// Each system handles its own event listeners and state management\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput();\n\t\tthis.touch = new TouchInput(this.mouse);\n\t\tthis.gamepad = new GamepadInput();\n\n\t\t// Attach event listeners to canvas if provided\n\t\t// Canvas is required for mouse and touch input\n\t\tif (canvas) {\n\t\t\tthis.attachCanvas(canvas);\n\t\t}\n\t}\n\n\t/**\n\t * Attach input systems to canvas\n\t */\n\tattachCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n\n\t/**\n\t * Update all input systems (call each frame)\n\t */\n\tupdate(): void {\n\t\tthis.keyboard.update();\n\t\tthis.mouse.update();\n\t\tthis.touch.update();\n\t\tthis.gamepad.update();\n\t}\n\n\t/**\n\t * Get input states for game code\n\t */\n\tgetStates(): {\n\t\tkeyboard: any;\n\t\tmouse: any;\n\t\ttouch: any;\n\t\tgamepad: any;\n\t} {\n\t\treturn {\n\t\t\tkeyboard: this.keyboard.state,\n\t\t\tmouse: this.mouse.state,\n\t\t\ttouch: this.touch.state,\n\t\t\tgamepad: this.gamepad.status,\n\t\t};\n\t}\n}\n","import { DEFAULT_FPS, DEFAULT_UPDATE_RATE, FRAME_TIME_MS, LOADING_BAR_THROTTLE_MS, PAUSE_THRESHOLD_MS } from \"../constants\";\n\n/**\n * GameLoop - Manages the game update/draw cycle\n *\n * Responsibilities:\n * - requestAnimationFrame loop\n * - Delta time calculation\n * - FPS calculation\n * - Update rate management\n * - Frame skipping for catch-up\n */\n\nexport interface GameLoopCallbacks {\n\tonUpdate: () => void;\n\tonDraw: () => void;\n\tonTick?: () => void;\n\tonWatchStep?: () => void;\n\tgetUpdateRate?: () => number | undefined;\n\tsetFPS?: (fps: number) => void;\n}\n\nexport interface GameLoopState {\n\tcurrentFrame: number;\n\tfloatingFrame: number;\n\tdt: number;\n\tlastTime: number;\n\tfps: number;\n\tupdateRate: number;\n}\n\nexport class GameLoop {\n\tprivate callbacks: GameLoopCallbacks;\n\tprivate state: GameLoopState;\n\tprivate stopped = false;\n\tprivate animationFrameId: number | null = null;\n\n\tconstructor(callbacks: GameLoopCallbacks) {\n\t\tthis.callbacks = callbacks;\n\t\tthis.state = {\n\t\t\tcurrentFrame: 0,\n\t\t\tfloatingFrame: 0,\n\t\t\tdt: FRAME_TIME_MS,\n\t\t\tlastTime: performance.now(),\n\t\t\tfps: DEFAULT_FPS,\n\t\t\tupdateRate: DEFAULT_UPDATE_RATE,\n\t\t};\n\t\t// Bind loop once\n\t\tthis.loop = this.loop.bind(this);\n\t}\n\n\t/**\n\t * Start the game loop\n\t */\n\tstart(): void {\n\t\tthis.stopped = false;\n\t\tthis.state.lastTime = performance.now();\n\t\tthis.state.currentFrame = 0;\n\t\tthis.state.floatingFrame = 0;\n\t\tthis.loop();\n\t}\n\n\t/**\n\t * Stop the game loop\n\t */\n\tstop(): void {\n\t\tthis.stopped = true;\n\t\tif (this.animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(this.animationFrameId);\n\t\t\tthis.animationFrameId = null;\n\t\t}\n\t}\n\n\t/**\n\t * Resume the game loop\n\t */\n\tresume(): void {\n\t\tif (!this.stopped) return;\n\t\tthis.stopped = false;\n\t\tthis.state.lastTime = performance.now();\n\t\tthis.loop();\n\t}\n\n\t/**\n\t * Main game loop\n\t */\n\tprivate loop(): void {\n\t\tif (this.stopped) return;\n\n\t\t// Schedule next frame\n\t\tthis.animationFrameId = requestAnimationFrame(this.loop);\n\n\t\tconst time = performance.now();\n\n\t\t// Recover from long pause (tab switch, etc)\n\t\tif (Math.abs(time - this.state.lastTime) > PAUSE_THRESHOLD_MS) {\n\t\t\tthis.state.lastTime = time - LOADING_BAR_THROTTLE_MS;\n\t\t}\n\n\t\t// Calculate delta time\n\t\tconst dt = time - this.state.lastTime;\n\t\tthis.state.dt = this.state.dt * 0.9 + dt * 0.1; // Smooth with exponential moving average\n\t\tthis.state.lastTime = time;\n\n\t\t// Calculate FPS and update in global context\n\t\tconst fps = Math.round(1000 / this.state.dt);\n\t\tthis.state.fps = fps;\n\t\tif (this.callbacks.setFPS) {\n\t\t\tthis.callbacks.setFPS(fps);\n\t\t}\n\n\t\t// Read update_rate from global context each frame\n\t\tlet updateRate = this.state.updateRate; // Default\n\t\tif (this.callbacks.getUpdateRate) {\n\t\t\tconst rate = this.callbacks.getUpdateRate();\n\t\t\tif (rate != null && rate > 0 && Number.isFinite(rate)) {\n\t\t\t\tupdateRate = rate;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate how many update steps needed\n\t\tthis.state.floatingFrame += (this.state.dt * updateRate) / 1000;\n\t\tlet ds = Math.min(10, Math.round(this.state.floatingFrame - this.state.currentFrame));\n\n\t\t// Correction for 60fps (reduce jitter)\n\t\tif ((ds === 0 || ds === 2) && updateRate === DEFAULT_UPDATE_RATE && Math.abs(fps - DEFAULT_FPS) < 2) {\n\t\t\tds = 1;\n\t\t\tthis.state.floatingFrame = this.state.currentFrame + 1;\n\t\t}\n\n\t\t// Call update() multiple times if needed (catch up)\n\t\t// Loop from 1 to ds (inclusive), not 0 to steps-1\n\t\tfor (let i = 1; i <= ds; i++) {\n\t\t\tthis.callbacks.onUpdate();\n\n\t\t\t// Tick between updates (for threads/coroutines)\n\t\t\tif (i < ds && this.callbacks.onTick) {\n\t\t\t\tthis.callbacks.onTick();\n\t\t\t}\n\t\t}\n\n\t\t// Update current frame\n\t\tthis.state.currentFrame += ds;\n\n\t\t// Call draw() once per frame\n\t\tthis.callbacks.onDraw();\n\n\t\t// Tick after draw\n\t\tif (this.callbacks.onTick) {\n\t\t\tthis.callbacks.onTick();\n\t\t}\n\n\t\t// Watch step after draw if ds > 0\n\t\tif (ds > 0 && this.callbacks.onWatchStep) {\n\t\t\tthis.callbacks.onWatchStep();\n\t\t}\n\t}\n\n\t/**\n\t * Get current state\n\t */\n\tgetState(): GameLoopState {\n\t\treturn this.state;\n\t}\n\n\t/**\n\t * Set update rate\n\t */\n\tsetUpdateRate(rate: number): void {\n\t\tif (rate > 0 && Number.isFinite(rate)) {\n\t\t\tthis.state.updateRate = rate;\n\t\t}\n\t}\n\n\t/**\n\t * Get FPS\n\t */\n\tgetFPS(): number {\n\t\treturn this.state.fps;\n\t}\n}\n","/**\n * System API - System information and control\n */\n\nimport type { SystemAPI } from \"@al8b/vm\";\nimport { DEFAULT_FPS, DEFAULT_UPDATE_RATE } from \"../constants\";\n\nexport class System {\n\tprivate systemAPI: SystemAPI;\n\n\tconstructor() {\n\t\t// Create system API with mutable state\n\t\tthis.systemAPI = {\n\t\t\t// Time\n\t\t\tget time() {\n\t\t\t\treturn Date.now();\n\t\t\t},\n\n\t\t\t// FPS\n\t\t\tfps: DEFAULT_FPS,\n\n\t\t\t// CPU load\n\t\t\tcpu_load: 0,\n\n\t\t\t// Update rate\n\t\t\tupdate_rate: DEFAULT_UPDATE_RATE,\n\n\t\t\t// Language\n\t\t\tget language() {\n\t\t\t\treturn typeof navigator !== \"undefined\" ? navigator.language : \"en\";\n\t\t\t},\n\n\t\t\t// Input availability\n\t\t\tinputs: {\n\t\t\t\tget keyboard() {\n\t\t\t\t\treturn 1;\n\t\t\t\t},\n\t\t\t\tget mouse() {\n\t\t\t\t\treturn 1;\n\t\t\t\t},\n\t\t\t\tget touch() {\n\t\t\t\t\treturn typeof window !== \"undefined\" && \"ontouchstart\" in window ? 1 : 0;\n\t\t\t\t},\n\t\t\t\tget gamepad() {\n\t\t\t\t\treturn typeof navigator !== \"undefined\" && typeof navigator.getGamepads === \"function\" ? 1 : 0;\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t// Loading progress\n\t\t\tloading: 0,\n\n\t\t\t// Utility functions\n\t\t\tprompt: (text: string, callback: (result: string) => void) => {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\tconst result = window.prompt(text);\n\t\t\t\t\tif (result !== null && callback) {\n\t\t\t\t\t\tcallback(result);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tsay: (text: string) => {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\twindow.alert(text);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// File drop support\n\t\t\tfile: {\n\t\t\t\tdropped: 0,\n\t\t\t},\n\n\t\t\t// JavaScript interop (placeholder for future use)\n\t\t\tjavascript: {},\n\n\t\t\t// Additional flags\n\t\t\tdisable_autofullscreen: 0,\n\t\t\tpreemptive: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Get system API for game code\n\t */\n\tgetAPI(): SystemAPI {\n\t\treturn this.systemAPI;\n\t}\n\n\t/**\n\t * Update FPS\n\t */\n\tsetFPS(fps: number): void {\n\t\tthis.systemAPI.fps = fps;\n\t}\n\n\t/**\n\t * Update CPU load\n\t */\n\tsetCPULoad(load: number): void {\n\t\tthis.systemAPI.cpu_load = load;\n\t}\n\n\t/**\n\t * Update loading progress\n\t */\n\tsetLoading(progress: number): void {\n\t\tthis.systemAPI.loading = progress;\n\t}\n}\n","/**\n * Debug Logger - Diagnostic logging for runtime subsystems\n *\n * Provides batched, shallow-compared debug output for input and screen state.\n * Only active when debug options are enabled.\n */\n\nimport type { InputManager } from \"../input\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { RuntimeDebugOptions } from \"../types\";\n\nexport class DebugLogger {\n\tprivate lastInputDebug?: any;\n\tprivate lastScreenDebug?: {\n\t\twidth: number;\n\t\theight: number;\n\t\tcanvasWidth: number;\n\t\tcanvasHeight: number;\n\t};\n\n\t/**\n\t * Log input state changes (deduplication via shallow compare)\n\t */\n\tdebugInputs(input: InputManager, debug: RuntimeDebugOptions | undefined): void {\n\t\tif (!debug?.input) return;\n\n\t\tconst snapshot = this.createInputSnapshot(input, debug.input);\n\t\tif (!snapshot) return;\n\n\t\tif (this.lastInputDebug && shallowEqual(snapshot, this.lastInputDebug)) return;\n\n\t\tthis.lastInputDebug = snapshot;\n\t\tconsole.debug(\"[@al8b/runtime][input]\", snapshot);\n\t}\n\n\t/**\n\t * Log screen dimension changes\n\t */\n\tdebugScreen(screen: Screen, debug: RuntimeDebugOptions | undefined): void {\n\t\tif (!debug?.screen) return;\n\n\t\tconst canvas = screen.getCanvas();\n\t\tconst current = {\n\t\t\twidth: screen.width,\n\t\t\theight: screen.height,\n\t\t\tcanvasWidth: canvas.width,\n\t\t\tcanvasHeight: canvas.height,\n\t\t};\n\n\t\tif (\n\t\t\tthis.lastScreenDebug &&\n\t\t\tcurrent.width === this.lastScreenDebug.width &&\n\t\t\tcurrent.height === this.lastScreenDebug.height &&\n\t\t\tcurrent.canvasWidth === this.lastScreenDebug.canvasWidth &&\n\t\t\tcurrent.canvasHeight === this.lastScreenDebug.canvasHeight\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.lastScreenDebug = current;\n\t\tconsole.debug(\"[@al8b/runtime][screen]\", {\n\t\t\tscreen: { width: screen.width, height: screen.height },\n\t\t\tcanvas: {\n\t\t\t\twidth: canvas.width,\n\t\t\t\theight: canvas.height,\n\t\t\t\tclientWidth: canvas.clientWidth,\n\t\t\t\tclientHeight: canvas.clientHeight,\n\t\t\t\tstyle: { width: canvas.style.width, height: canvas.style.height },\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Create a snapshot of current input state based on enabled channels\n\t */\n\tprivate createInputSnapshot(\n\t\tinput: InputManager,\n\t\tsetting: NonNullable<RuntimeDebugOptions[\"input\"]>,\n\t): Record<string, any> | null {\n\t\tconst channels = getEnabledInputChannels(setting);\n\t\tif (channels.length === 0) return null;\n\n\t\tconst states = input.getStates();\n\t\tconst snapshot: Record<string, any> = {};\n\n\t\tif (channels.includes(\"touch\")) {\n\t\t\tsnapshot.touch = {\n\t\t\t\ttouching: states.touch.touching,\n\t\t\t\tpress: states.touch.press,\n\t\t\t\trelease: states.touch.release,\n\t\t\t\tx: Number(states.touch.x?.toFixed?.(2) ?? states.touch.x),\n\t\t\t\ty: Number(states.touch.y?.toFixed?.(2) ?? states.touch.y),\n\t\t\t\tcount: states.touch.touches?.length ?? 0,\n\t\t\t};\n\t\t}\n\n\t\tif (channels.includes(\"mouse\")) {\n\t\t\tsnapshot.mouse = {\n\t\t\t\tpressed: states.mouse.pressed,\n\t\t\t\tleft: states.mouse.left,\n\t\t\t\tx: Number(states.mouse.x?.toFixed?.(2) ?? states.mouse.x),\n\t\t\t\ty: Number(states.mouse.y?.toFixed?.(2) ?? states.mouse.y),\n\t\t\t\twheel: states.mouse.wheel,\n\t\t\t};\n\t\t}\n\n\t\tif (channels.includes(\"keyboard\")) {\n\t\t\tsnapshot.keyboard = {\n\t\t\t\tUP: states.keyboard.UP,\n\t\t\t\tDOWN: states.keyboard.DOWN,\n\t\t\t\tLEFT: states.keyboard.LEFT,\n\t\t\t\tRIGHT: states.keyboard.RIGHT,\n\t\t\t\tpress: states.keyboard.press,\n\t\t\t\trelease: states.keyboard.release,\n\t\t\t};\n\t\t}\n\n\t\tif (channels.includes(\"gamepad\")) {\n\t\t\tsnapshot.gamepad = {\n\t\t\t\tcount: input.gamepad.count,\n\t\t\t\tA: states.gamepad.A,\n\t\t\t\tB: states.gamepad.B,\n\t\t\t\tUP: states.gamepad.UP,\n\t\t\t\tDOWN: states.gamepad.DOWN,\n\t\t\t\tLEFT: states.gamepad.LEFT,\n\t\t\t\tRIGHT: states.gamepad.RIGHT,\n\t\t\t};\n\t\t}\n\n\t\treturn Object.keys(snapshot).length === 0 ? null : snapshot;\n\t}\n}\n\n/**\n * Get enabled input debug channels from setting\n */\nfunction getEnabledInputChannels(\n\tsetting: NonNullable<RuntimeDebugOptions[\"input\"]>,\n): Array<\"keyboard\" | \"mouse\" | \"touch\" | \"gamepad\"> {\n\tif (typeof setting === \"boolean\") {\n\t\treturn setting ? [\"keyboard\", \"mouse\", \"touch\", \"gamepad\"] : [];\n\t}\n\tconst channels: Array<\"keyboard\" | \"mouse\" | \"touch\" | \"gamepad\"> = [];\n\tif (setting.keyboard) channels.push(\"keyboard\");\n\tif (setting.mouse) channels.push(\"mouse\");\n\tif (setting.touch) channels.push(\"touch\");\n\tif (setting.gamepad) channels.push(\"gamepad\");\n\treturn channels;\n}\n\n/**\n * Shallow comparison of two objects (one level deep)\n */\nfunction shallowEqual(obj1: any, obj2: any): boolean {\n\tif (obj1 === obj2) return true;\n\tif (!obj1 || !obj2 || typeof obj1 !== \"object\" || typeof obj2 !== \"object\") return false;\n\n\tconst keys1 = Object.keys(obj1);\n\tconst keys2 = Object.keys(obj2);\n\tif (keys1.length !== keys2.length) return false;\n\n\tfor (const key of keys1) {\n\t\tconst val1 = obj1[key];\n\t\tconst val2 = obj2[key];\n\n\t\tif (val1 === val2) continue;\n\n\t\tif (val1 == null || val2 == null) {\n\t\t\tif (val1 !== val2) return false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof val1 === \"object\" && typeof val2 === \"object\") {\n\t\t\tconst keys1Nested = Object.keys(val1);\n\t\t\tconst keys2Nested = Object.keys(val2);\n\t\t\tif (keys1Nested.length !== keys2Nested.length) return false;\n\t\t\tfor (const nestedKey of keys1Nested) {\n\t\t\t\tif (val1[nestedKey] !== val2[nestedKey]) return false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n","/**\n * Error Handler - Error formatting and reporting for the runtime\n */\n\nimport { createDiagnostic, formatForBrowser } from \"@al8b/diagnostics\";\nimport type { RuntimeListener } from \"../types\";\nimport type { L8BVM } from \"@al8b/vm\";\n\n/**\n * Format error message with diagnostic information\n */\nexport function formatRuntimeError(error: any): any {\n\tif (error.code || error.context || error.suggestions) {\n\t\treturn error;\n\t}\n\n\tconst code = error.code || \"E2005\";\n\tconst diagnostic = createDiagnostic(code, {\n\t\tfile: error.file,\n\t\tline: error.line,\n\t\tcolumn: error.column,\n\t\tcontext: error.context,\n\t\tsuggestions: error.suggestions,\n\t\trelated: error.related,\n\t\tstackTrace: error.stackTrace,\n\t\tdata: {\n\t\t\terror: error.error || error.message,\n\t\t},\n\t});\n\n\tconst formattedMessage = formatForBrowser(diagnostic);\n\n\treturn {\n\t\t...error,\n\t\t...diagnostic,\n\t\tformatted: formattedMessage,\n\t};\n}\n\n/**\n * Report error to listener with enhanced formatting\n */\nexport function reportError(listener: RuntimeListener, error: any): void {\n\tif (listener.reportError) {\n\t\tconst formatted = formatRuntimeError(error);\n\t\tlistener.reportError(formatted);\n\t}\n}\n\n/**\n * Report warnings from VM context (invoking_non_function, using_undefined_variable)\n */\nexport function reportWarnings(vm: L8BVM | null, listener: RuntimeListener): void {\n\tif (!vm) return;\n\n\tconst warnings = vm.context?.warnings;\n\tif (!warnings) return;\n\n\tif (warnings.invoking_non_function) {\n\t\tfor (const value of Object.values(warnings.invoking_non_function)) {\n\t\t\tconst warning = value as any;\n\t\t\tif (!warning.reported) {\n\t\t\t\twarning.reported = true;\n\t\t\t\treportError(listener, {\n\t\t\t\t\terror: \"\",\n\t\t\t\t\ttype: \"non_function\",\n\t\t\t\t\texpression: warning.expression,\n\t\t\t\t\tline: warning.line,\n\t\t\t\t\tcolumn: warning.column,\n\t\t\t\t\tfile: warning.file,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tif (warnings.using_undefined_variable) {\n\t\tfor (const value of Object.values(warnings.using_undefined_variable)) {\n\t\t\tconst warning = value as any;\n\t\t\tif (!warning.reported) {\n\t\t\t\twarning.reported = true;\n\t\t\t\treportError(listener, {\n\t\t\t\t\terror: \"\",\n\t\t\t\t\ttype: \"undefined_variable\",\n\t\t\t\t\texpression: warning.expression,\n\t\t\t\t\tline: warning.line,\n\t\t\t\t\tcolumn: warning.column,\n\t\t\t\t\tfile: warning.file,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { AssetCollections } from \"../types\";\n\nexport class RuntimeAssetsRegistry {\n\tprivate collections: AssetCollections = {\n\t\tsprites: {},\n\t\tmaps: {},\n\t\tsounds: {},\n\t\tmusic: {},\n\t\tassets: {},\n\t};\n\n\treplace(collections: AssetCollections): void {\n\t\tthis.collections = collections;\n\t}\n\n\tgetCollections(): AssetCollections {\n\t\treturn this.collections;\n\t}\n\n\tget sprites(): AssetCollections[\"sprites\"] {\n\t\treturn this.collections.sprites;\n\t}\n\n\tget maps(): AssetCollections[\"maps\"] {\n\t\treturn this.collections.maps;\n\t}\n\n\tget sounds(): AssetCollections[\"sounds\"] {\n\t\treturn this.collections.sounds;\n\t}\n\n\tget music(): AssetCollections[\"music\"] {\n\t\treturn this.collections.music;\n\t}\n\n\tget assets(): AssetCollections[\"assets\"] {\n\t\treturn this.collections.assets;\n\t}\n}\n","import { Palette } from \"@al8b/palette\";\nimport type { SceneDefinition, SceneManager } from \"@al8b/scene\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random, Routine } from \"@al8b/vm\";\nimport { Image, Sound, Sprite, TileMap } from \"../assets\";\nimport type { InputManager } from \"../input\";\nimport type {\n\tHostEvent,\n\tRuntimeBridge,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { ObjectPool } from \"../utils/object-pool\";\nimport type { PlayerService } from \"@al8b/player\";\nimport type { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { AudioCore } from \"@al8b/audio\";\nimport type { System } from \"../system\";\n\nexport interface RuntimeApiFactoryContext {\n\tlistener: RuntimeListener;\n\toptions: RuntimeOptions;\n\tscreen: Screen;\n\taudio: AudioCore;\n\tinput: InputManager;\n\tsystem: System;\n\tplayerService: PlayerService;\n\tsceneManager: SceneManager;\n\tassets: RuntimeAssetsRegistry;\n\tbridge?: RuntimeBridge;\n\tgetVM: () => L8BVM | null;\n\tgetSessionSnapshot: () => RuntimeSessionSnapshot | null;\n\tsendHostEvent: (event: HostEvent) => void;\n\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\texportSnapshot: () => RuntimeSnapshot;\n\timportSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;\n\tresetRuntime: (options?: RuntimeResetOptions) => Promise<void>;\n\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n}\n\nexport function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions> {\n\treturn {\n\t\tprint: (text: unknown) => {\n\t\t\tconst vm = context.getVM();\n\t\t\tif ((typeof text === \"object\" || typeof text === \"function\") && vm) {\n\t\t\t\ttext = vm.toString(text);\n\t\t\t}\n\t\t\tif (context.listener.log) {\n\t\t\t\tcontext.listener.log(String(text));\n\t\t\t} else {\n\t\t\t\tconsole.log(text);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {\n\tObjectPool: typeof ObjectPool;\n\tPalette: typeof Palette;\n\thost: {\n\t\temit: (name: string, payload?: unknown) => void;\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\t};\n\tsession: {\n\t\tuser: () => RuntimeSessionSnapshot[\"user\"];\n\t\tplayer: () => RuntimeSessionSnapshot[\"player\"];\n\t\tgame: () => RuntimeSessionSnapshot[\"game\"];\n\t\troom: () => RuntimeSessionSnapshot[\"room\"];\n\t};\n\tmemory: {\n\t\texport: () => RuntimeSnapshot;\n\t\timport: (snapshot: RuntimeSnapshot) => Promise<void>;\n\t\treset: (options?: RuntimeResetOptions) => Promise<void>;\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t};\n} {\n\tconst inputStates = context.input.getStates();\n\tconst session = {\n\t\tuser: () => cloneValue(context.getSessionSnapshot()?.user ?? null),\n\t\tplayer: () => cloneValue(context.getSessionSnapshot()?.player ?? null),\n\t\tgame: () => cloneValue(context.getSessionSnapshot()?.game ?? null),\n\t\troom: () => cloneValue(context.getSessionSnapshot()?.room ?? null),\n\t};\n\tconst host = {\n\t\temit: (name: string, payload?: unknown) => {\n\t\t\tcontext.sendHostEvent({\n\t\t\t\ttype: name,\n\t\t\t\tpayload,\n\t\t\t\tsource: \"host\",\n\t\t\t});\n\t\t},\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\tcontext.sendHostRequest(name, payload, callback),\n\t};\n\tconst memory = {\n\t\texport: () => context.exportSnapshot(),\n\t\timport: (snapshot: RuntimeSnapshot) => context.importSnapshot(snapshot),\n\t\treset: (options?: RuntimeResetOptions) => context.resetRuntime(options),\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.saveSnapshot(meta, callback),\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.loadSnapshot(meta, callback),\n\t};\n\n\treturn {\n\t\tscreen: context.screen.getInterface(),\n\t\taudio: context.audio.getInterface(),\n\t\tkeyboard: inputStates.keyboard,\n\t\tmouse: inputStates.mouse,\n\t\ttouch: inputStates.touch,\n\t\tgamepad: inputStates.gamepad,\n\t\tsprites: context.assets.sprites,\n\t\tmaps: context.assets.maps,\n\t\tsounds: context.assets.sounds,\n\t\tmusic: context.assets.music,\n\t\tassets: context.assets.assets,\n\t\tplayer: context.playerService.getInterface(),\n\t\thost,\n\t\tsession,\n\t\tmemory,\n\t\tsystem: context.system.getAPI(),\n\t\tscene: (name: string, definition: unknown) => {\n\t\t\tconst convertedDefinition = convertSceneDefinition(asSceneDefinition(definition), context.getVM(), context.listener);\n\t\t\tcontext.sceneManager.registerScene(name, convertedDefinition);\n\t\t},\n\t\troute: (path: string, sceneName: string) => context.sceneManager.registerRoute(path, sceneName),\n\t\trouter: context.sceneManager.router.getInterface(),\n\t\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\nexport function convertSceneDefinition(\n\tdefinition: SceneDefinition,\n\tvm: L8BVM | null,\n\tlistener: RuntimeListener,\n): SceneDefinition {\n\tif (!vm?.runner?.main_thread?.processor) {\n\t\tlistener.log?.(\"[RuntimeController] VM not ready for scene conversion. Scene functions may not work correctly.\");\n\t\treturn definition;\n\t}\n\n\tconst processor = vm.runner.main_thread.processor;\n\tconst context = vm.context;\n\tconst converted: Record<string, unknown> = {};\n\n\tfor (const [key, value] of Object.entries(definition)) {\n\t\tif (value instanceof Routine) {\n\t\t\tconverted[key] = processor.routineAsFunction(value, context);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\tconverted[key] = convertSceneDefinition(value, vm, listener);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconverted[key] = value;\n\t}\n\n\treturn converted as SceneDefinition;\n}\n\nfunction asSceneDefinition(definition: unknown): SceneDefinition {\n\tif (!definition || typeof definition !== \"object\" || Array.isArray(definition)) {\n\t\tthrow new Error(\"Scene definition must be an object.\");\n\t}\n\n\treturn definition as SceneDefinition;\n}\n\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\treturn JSON.parse(JSON.stringify(value)) as T;\n}\n","/**\n * Object Pool utility for game entities\n *\n * Provides object pooling to reduce GC pressure and improve performance\n * for frequently created/destroyed game objects.\n */\n\n/**\n * Object pool for reusing objects\n *\n * @template T - Type of objects in the pool\n */\nexport class ObjectPool<T> {\n\tprivate pool: T[] = [];\n\tprivate factory: () => T;\n\tprivate reset: (obj: T) => void;\n\tprivate maxSize: number;\n\n\t/**\n\t * Create a new object pool\n\t *\n\t * @param factory - Function to create new objects\n\t * @param reset - Function to reset object state for reuse\n\t * @param maxSize - Maximum pool size (default: 100)\n\t */\n\tconstructor(factory: () => T, reset: (obj: T) => void, maxSize: number = 100) {\n\t\tthis.factory = factory;\n\t\tthis.reset = reset;\n\t\tthis.maxSize = maxSize;\n\t}\n\n\t/**\n\t * Acquire an object from the pool\n\t *\n\t * Returns a new object if pool is empty, otherwise reuses a pooled object.\n\t *\n\t * @returns Object from pool or newly created\n\t */\n\tacquire(): T {\n\t\tif (this.pool.length > 0) {\n\t\t\treturn this.pool.pop()!;\n\t\t}\n\t\treturn this.factory();\n\t}\n\n\t/**\n\t * Release an object back to the pool\n\t *\n\t * Resets the object and adds it back to the pool for reuse.\n\t * If pool is at max size, the object is discarded.\n\t *\n\t * @param obj - Object to release\n\t */\n\trelease(obj: T): void {\n\t\tif (this.pool.length >= this.maxSize) {\n\t\t\t// Pool is full, discard object\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reset(obj);\n\t\tthis.pool.push(obj);\n\t}\n\n\t/**\n\t * Clear all objects from the pool\n\t */\n\tclear(): void {\n\t\tthis.pool = [];\n\t}\n\n\t/**\n\t * Get current pool size\n\t *\n\t * @returns Number of objects in pool\n\t */\n\tsize(): number {\n\t\treturn this.pool.length;\n\t}\n\n\t/**\n\t * Get maximum pool size\n\t *\n\t * @returns Maximum pool size\n\t */\n\tgetMaxSize(): number {\n\t\treturn this.maxSize;\n\t}\n\n\t/**\n\t * Set maximum pool size\n\t *\n\t * @param maxSize - New maximum pool size\n\t */\n\tsetMaxSize(maxSize: number): void {\n\t\tthis.maxSize = maxSize;\n\t\t// Trim pool if it exceeds new max size\n\t\tif (this.pool.length > maxSize) {\n\t\t\tthis.pool = this.pool.slice(0, maxSize);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["AudioCore","PlayerService","SceneManager","Screen","StatePlayer","TimeMachine","L8BVM","Sound","TileMap","Image","Sprite","Sound","Music","DEFAULT_FPS","DEFAULT_UPDATE_RATE","FRAME_TIME_MS","PAUSE_THRESHOLD_MS","DEFAULT_BLOCK_SIZE","LOADING_BAR_THROTTLE_MS","ASSET_LOAD_TIMEOUT_MS","LoadMap","LoadSprite","withTimeout","promise","ms","Promise","race","_","reject","setTimeout","Error","AssetLoader","url","resources","collections","loadingBarTime","audioCore","listener","sprites","maps","sounds","music","assets","loadAll","all","loadSprites","loadMaps","loadSounds","loadMusic","loadGenericAssets","loadCallbackAssets","urlPrefix","collectionKey","load","createPlaceholder","promises","map","res","resolve","name","file","split","replace","version","inner","onReady","ASSET_LOAD_TIMEOUT_MS","then","catch","err","log","slice","String","images","img","LoadSprite","properties","ready","frames","fps","width","height","_mapRes","LoadMap","block_width","DEFAULT_BLOCK_SIZE","block_height","data","sound","soundInstance","Sound","mus","musicInstance","Music","asset","isReady","countReady","countTotal","getProgress","total","count","Object","keys","length","sprite","values","showLoadingBar","screenInterface","Date","now","LOADING_BAR_THROTTLE_MS","progress","clear","drawRect","fillRect","getCollections","SourceUpdater","updateMemory","previousInit","vm","listener","audio","screen","reportWarnings","emitBridgeEvent","updateSource","file","src","reinit","cancelBeeps","clear","run","error_info","err","Object","assign","type","reportError","runner","getFunctionSource","init","call","GamepadInput","KeyboardInput","MouseInput","TouchInput","InputManager","keyboard","mouse","touch","gamepad","canvas","KeyboardInput","MouseInput","TouchInput","GamepadInput","attachCanvas","setCanvas","update","getStates","state","status","GameLoop","callbacks","state","stopped","animationFrameId","currentFrame","floatingFrame","dt","FRAME_TIME_MS","lastTime","performance","now","fps","DEFAULT_FPS","updateRate","DEFAULT_UPDATE_RATE","loop","bind","start","stop","cancelAnimationFrame","resume","requestAnimationFrame","time","Math","abs","PAUSE_THRESHOLD_MS","LOADING_BAR_THROTTLE_MS","round","setFPS","getUpdateRate","rate","Number","isFinite","ds","min","i","onUpdate","onTick","onDraw","onWatchStep","getState","setUpdateRate","getFPS","System","systemAPI","time","Date","now","fps","DEFAULT_FPS","cpu_load","update_rate","DEFAULT_UPDATE_RATE","language","navigator","inputs","keyboard","mouse","touch","window","gamepad","getGamepads","loading","prompt","text","callback","result","say","alert","file","dropped","javascript","disable_autofullscreen","preemptive","getAPI","setFPS","setCPULoad","load","setLoading","progress","DebugLogger","lastInputDebug","lastScreenDebug","debugInputs","input","debug","snapshot","createInputSnapshot","shallowEqual","console","debugScreen","screen","canvas","getCanvas","current","width","height","canvasWidth","canvasHeight","clientWidth","clientHeight","style","setting","channels","getEnabledInputChannels","length","states","getStates","includes","touch","touching","press","release","x","Number","toFixed","y","count","touches","mouse","pressed","left","wheel","keyboard","UP","DOWN","LEFT","RIGHT","gamepad","A","B","Object","keys","push","obj1","obj2","keys1","keys2","key","val1","val2","keys1Nested","keys2Nested","nestedKey","createDiagnostic","formatForBrowser","formatRuntimeError","error","code","context","suggestions","diagnostic","createDiagnostic","file","line","column","related","stackTrace","data","message","formattedMessage","formatForBrowser","formatted","reportError","listener","reportWarnings","vm","warnings","invoking_non_function","value","Object","values","warning","reported","type","expression","using_undefined_variable","RuntimeAssetsRegistry","collections","sprites","maps","sounds","music","assets","replace","getCollections","Palette","Random","Routine","ObjectPool","pool","factory","reset","maxSize","acquire","length","pop","release","obj","push","clear","size","getMaxSize","setMaxSize","slice","createRuntimeMeta","context","print","text","vm","getVM","toString","listener","log","String","console","createRuntimeGlobalApi","inputStates","input","getStates","session","user","cloneValue","getSessionSnapshot","player","game","room","host","emit","name","payload","sendHostEvent","type","source","request","callback","sendHostRequest","memory","export","exportSnapshot","import","snapshot","importSnapshot","reset","options","resetRuntime","save","meta","saveSnapshot","load","loadSnapshot","screen","getInterface","audio","keyboard","mouse","touch","gamepad","sprites","assets","maps","sounds","music","playerService","system","getAPI","scene","definition","convertedDefinition","convertSceneDefinition","asSceneDefinition","sceneManager","registerScene","route","path","sceneName","registerRoute","router","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","runner","main_thread","processor","converted","key","value","Object","entries","Routine","routineAsFunction","Array","isArray","Error","JSON","parse","stringify","createRuntime","options","RuntimeControllerImpl","listener","assetRegistry","RuntimeAssetsRegistry","assetLoader","debugLogger","DebugLogger","DEBUG_UPDATE_FREQUENCY","snapshotRestorer","StatePlayer","bridgeUnsubscribe","sourceUpdater","gameLoop","frameCount","lastUpdateRate","isStopped","preserveStorageOnNextBoot","sessionSnapshot","screen","audio","input","system","playerService","sceneManager","vm","timeMachine","preserveStorage","initialSession","Screen","runtime","canvas","width","height","AudioCore","InputManager","getCanvas","System","PlayerService","pause","stop","resume","postMessage","message","emitPlayerMessage","getFps","getAPI","fps","getUpdateRate","update_rate","setUpdateRate","rate","SceneManager","AssetLoader","url","resources","logStep","images","length","sounds","music","sprites","maps","assets","stopped","getSession","cloneSnapshot","start","hydrateSession","ensureBridgeSubscription","loadAssets","Object","keys","waitForAssetsReady","initializeVM","sourceFiles","sources","startGameLoop","stopAll","reset","preservedSnapshot","preserveSnapshot","exportSnapshot","preserveSession","teardownRuntimeState","importSnapshot","global","context","routerState","router","getState","version","serializeGlobalSnapshot","session","path","sceneName","getCurrentSceneName","updateRate","snapshot","restoreState","updateGameLoopUpdateRate","replace","setActiveScene","updateSource","file","src","reinit","handleMessage","type","sendHostEvent","name","messageReceived","event","handleHostEvent","collections","loadAll","Promise","resolve","checkReady","isReady","setLoading","progress","getProgress","Math","floor","showLoadingBar","getInterface","requestAnimationFrame","apiContext","bridge","getVM","getSessionSnapshot","emitBridgeEvent","payload","sendHostRequest","callback","sendBridgeRequest","resetRuntime","saveSnapshot","meta","loadSnapshot","createRuntimeMeta","createRuntimeGlobalApi","L8BVM","namespace","SourceUpdater","reportWarnings","TimeMachine","onStatus","status","loadPrograms","initializeScenesAndRouter","compiledRoutines","files","routine","entries","loadRoutine","err","reportError","error","String","stack","call","runner","tick","registeredScenes","registry","getNames","sceneNames","init","activeScene","hasActiveScene","GameLoop","onUpdate","handleUpdate","onDraw","handleDraw","onTick","handleTick","onWatchStep","handleWatchStep","undefined","setFPS","Number","isFinite","update","debugInputs","debug","debugScreen","getFPS","error_info","assign","initDraw","updateInterface","draw","step","loopStep","subscribe","maybeUnsubscribe","mergeSession","asRecord","isRuntimeSnapshot","isRecord","command","position","emit","request","ok","requestId","createRequestId","result","isPromiseLike","then","value","catch","Error","save","fallback","failure","load","current","clear","routeManager","lifecycle","prefix","console","info","log","serialized","JSON","stringify","globalRecord","excluded","random","keyboard","mouse","touch","gamepad","storage","host","memory","filter","deepCloneValue","includes","Array","isArray","map","entry","clone","key","Date","now","toString","slice"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/hot-reload/index.ts
|
|
22
|
+
var hot_reload_exports = {};
|
|
23
|
+
__export(hot_reload_exports, {
|
|
24
|
+
SourceUpdater: () => SourceUpdater
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(hot_reload_exports);
|
|
27
|
+
|
|
28
|
+
// src/hot-reload/updater.ts
|
|
29
|
+
var SourceUpdater = class {
|
|
30
|
+
static {
|
|
31
|
+
__name(this, "SourceUpdater");
|
|
32
|
+
}
|
|
33
|
+
vm;
|
|
34
|
+
listener;
|
|
35
|
+
audio;
|
|
36
|
+
screen;
|
|
37
|
+
reportWarnings;
|
|
38
|
+
emitBridgeEvent;
|
|
39
|
+
updateMemory = {};
|
|
40
|
+
previousInit = null;
|
|
41
|
+
constructor(vm, listener, audio, screen, reportWarnings, emitBridgeEvent) {
|
|
42
|
+
this.vm = vm;
|
|
43
|
+
this.listener = listener;
|
|
44
|
+
this.audio = audio;
|
|
45
|
+
this.screen = screen;
|
|
46
|
+
this.reportWarnings = reportWarnings;
|
|
47
|
+
this.emitBridgeEvent = emitBridgeEvent;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update source code (hot reload)
|
|
51
|
+
*/
|
|
52
|
+
updateSource(file, src, reinit = false) {
|
|
53
|
+
if (!this.vm) return false;
|
|
54
|
+
if (src === this.updateMemory[file]) return false;
|
|
55
|
+
this.updateMemory[file] = src;
|
|
56
|
+
if (this.audio) {
|
|
57
|
+
this.audio.cancelBeeps();
|
|
58
|
+
}
|
|
59
|
+
if (this.screen) {
|
|
60
|
+
this.screen.clear();
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
this.vm.run(src, 3e3, file);
|
|
64
|
+
if (this.emitBridgeEvent) {
|
|
65
|
+
this.emitBridgeEvent("compile_success", {
|
|
66
|
+
file
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (this.reportWarnings) {
|
|
70
|
+
this.reportWarnings();
|
|
71
|
+
}
|
|
72
|
+
if (this.vm.error_info) {
|
|
73
|
+
const err = Object.assign({}, this.vm.error_info);
|
|
74
|
+
err.type = "init";
|
|
75
|
+
err.file = file;
|
|
76
|
+
this.listener.reportError?.(err);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (this.vm.runner?.getFunctionSource) {
|
|
80
|
+
const init = this.vm.runner.getFunctionSource("init");
|
|
81
|
+
if (init && init !== this.previousInit && reinit) {
|
|
82
|
+
this.previousInit = init;
|
|
83
|
+
this.vm.call("init");
|
|
84
|
+
if (this.vm.error_info) {
|
|
85
|
+
const err = Object.assign({}, this.vm.error_info);
|
|
86
|
+
err.type = "init";
|
|
87
|
+
this.listener.reportError?.(err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
err.file = file;
|
|
94
|
+
this.listener.reportError?.(err);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
100
|
+
0 && (module.exports = {
|
|
101
|
+
SourceUpdater
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hot-reload/index.ts","../../src/hot-reload/updater.ts"],"sourcesContent":["/**\n * Hot reload exports\n */\n\nexport { SourceUpdater } from \"./updater\";\n","/**\n * Source code updater for hot reload\n * Matches runtime behavior for source updates\n */\n\nimport type { L8BVM } from \"@al8b/vm\";\nimport type { RuntimeListener } from \"../types\";\n\nexport class SourceUpdater {\n\tprivate updateMemory: Record<string, string> = {};\n\tprivate previousInit: string | null = null;\n\n\tconstructor(\n\t\tprivate vm: L8BVM,\n\t\tprivate listener: RuntimeListener,\n\t\tprivate audio?: { cancelBeeps(): void },\n\t\tprivate screen?: { clear(): void },\n\t\tprivate reportWarnings?: () => void,\n\t\tprivate emitBridgeEvent?: (name: string, payload?: unknown) => void,\n\t) {}\n\n\t/**\n\t * Update source code (hot reload)\n\t */\n\tupdateSource(file: string, src: string, reinit = false): boolean {\n\t\t// Return false if VM is not available\n\t\tif (!this.vm) return false;\n\n\t\t// Return false if source code hasn't changed\n\t\tif (src === this.updateMemory[file]) return false;\n\n\t\tthis.updateMemory[file] = src;\n\n\t\t// Cancel beeps and clear screen before hot reload\n\t\tif (this.audio) {\n\t\t\tthis.audio.cancelBeeps();\n\t\t}\n\t\tif (this.screen) {\n\t\t\tthis.screen.clear();\n\t\t}\n\n\t\ttry {\n\t\t\t// Compile and execute updated source code\n\t\t\t// Timeout of 3000ms prevents infinite loops during hot reload\n\t\t\tthis.vm.run(src, 3000, file);\n\n\t\t\t// Notify parent process of successful compilation\n\t\t\tif (this.emitBridgeEvent) {\n\t\t\t\tthis.emitBridgeEvent(\"compile_success\", { file });\n\t\t\t}\n\n\t\t\t// Report warnings after compilation\n\t\t\tif (this.reportWarnings) {\n\t\t\t\tthis.reportWarnings();\n\t\t\t}\n\n\t\t\t// Check for compilation or runtime errors from VM\n\t\t\tif (this.vm.error_info) {\n\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\terr.type = \"init\";\n\t\t\t\terr.file = file;\n\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Re-run init() function if it was modified during hot reload\n\t\t\t// This allows reinitialization without full page refresh\n\t\t\tif ((this.vm.runner as any)?.getFunctionSource) {\n\t\t\t\tconst init = (this.vm.runner as any).getFunctionSource(\"init\");\n\t\t\t\tif (init && init !== this.previousInit && reinit) {\n\t\t\t\t\tthis.previousInit = init;\n\t\t\t\t\tthis.vm.call(\"init\");\n\t\t\t\t\tif (this.vm.error_info) {\n\t\t\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\t\t\terr.type = \"init\";\n\t\t\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (err: any) {\n\t\t\t// Handle exceptions during compilation or execution\n\t\t\terr.file = file;\n\t\t\tthis.listener.reportError?.(err);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACQO,IAAMA,gBAAN,MAAMA;EARb,OAQaA;;;;;;;;;EACJC,eAAuC,CAAC;EACxCC,eAA8B;EAEtC,YACSC,IACAC,UACAC,OACAC,QACAC,gBACAC,iBACP;SANOL,KAAAA;SACAC,WAAAA;SACAC,QAAAA;SACAC,SAAAA;SACAC,iBAAAA;SACAC,kBAAAA;EACN;;;;EAKHC,aAAaC,MAAcC,KAAaC,SAAS,OAAgB;AAEhE,QAAI,CAAC,KAAKT,GAAI,QAAO;AAGrB,QAAIQ,QAAQ,KAAKV,aAAaS,IAAAA,EAAO,QAAO;AAE5C,SAAKT,aAAaS,IAAAA,IAAQC;AAG1B,QAAI,KAAKN,OAAO;AACf,WAAKA,MAAMQ,YAAW;IACvB;AACA,QAAI,KAAKP,QAAQ;AAChB,WAAKA,OAAOQ,MAAK;IAClB;AAEA,QAAI;AAGH,WAAKX,GAAGY,IAAIJ,KAAK,KAAMD,IAAAA;AAGvB,UAAI,KAAKF,iBAAiB;AACzB,aAAKA,gBAAgB,mBAAmB;UAAEE;QAAK,CAAA;MAChD;AAGA,UAAI,KAAKH,gBAAgB;AACxB,aAAKA,eAAc;MACpB;AAGA,UAAI,KAAKJ,GAAGa,YAAY;AACvB,cAAMC,MAAWC,OAAOC,OAAO,CAAC,GAAG,KAAKhB,GAAGa,UAAU;AACrDC,YAAIG,OAAO;AACXH,YAAIP,OAAOA;AACX,aAAKN,SAASiB,cAAcJ,GAAAA;AAC5B,eAAO;MACR;AAIA,UAAK,KAAKd,GAAGmB,QAAgBC,mBAAmB;AAC/C,cAAMC,OAAQ,KAAKrB,GAAGmB,OAAeC,kBAAkB,MAAA;AACvD,YAAIC,QAAQA,SAAS,KAAKtB,gBAAgBU,QAAQ;AACjD,eAAKV,eAAesB;AACpB,eAAKrB,GAAGsB,KAAK,MAAA;AACb,cAAI,KAAKtB,GAAGa,YAAY;AACvB,kBAAMC,MAAWC,OAAOC,OAAO,CAAC,GAAG,KAAKhB,GAAGa,UAAU;AACrDC,gBAAIG,OAAO;AACX,iBAAKhB,SAASiB,cAAcJ,GAAAA;UAC7B;QACD;MACD;AAEA,aAAO;IACR,SAASA,KAAU;AAElBA,UAAIP,OAAOA;AACX,WAAKN,SAASiB,cAAcJ,GAAAA;AAC5B,aAAO;IACR;EACD;AACD;","names":["SourceUpdater","updateMemory","previousInit","vm","listener","audio","screen","reportWarnings","emitBridgeEvent","updateSource","file","src","reinit","cancelBeeps","clear","run","error_info","err","Object","assign","type","reportError","runner","getFunctionSource","init","call"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/hot-reload/updater.ts
|
|
5
|
+
var SourceUpdater = class {
|
|
6
|
+
static {
|
|
7
|
+
__name(this, "SourceUpdater");
|
|
8
|
+
}
|
|
9
|
+
vm;
|
|
10
|
+
listener;
|
|
11
|
+
audio;
|
|
12
|
+
screen;
|
|
13
|
+
reportWarnings;
|
|
14
|
+
emitBridgeEvent;
|
|
15
|
+
updateMemory = {};
|
|
16
|
+
previousInit = null;
|
|
17
|
+
constructor(vm, listener, audio, screen, reportWarnings, emitBridgeEvent) {
|
|
18
|
+
this.vm = vm;
|
|
19
|
+
this.listener = listener;
|
|
20
|
+
this.audio = audio;
|
|
21
|
+
this.screen = screen;
|
|
22
|
+
this.reportWarnings = reportWarnings;
|
|
23
|
+
this.emitBridgeEvent = emitBridgeEvent;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Update source code (hot reload)
|
|
27
|
+
*/
|
|
28
|
+
updateSource(file, src, reinit = false) {
|
|
29
|
+
if (!this.vm) return false;
|
|
30
|
+
if (src === this.updateMemory[file]) return false;
|
|
31
|
+
this.updateMemory[file] = src;
|
|
32
|
+
if (this.audio) {
|
|
33
|
+
this.audio.cancelBeeps();
|
|
34
|
+
}
|
|
35
|
+
if (this.screen) {
|
|
36
|
+
this.screen.clear();
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
this.vm.run(src, 3e3, file);
|
|
40
|
+
if (this.emitBridgeEvent) {
|
|
41
|
+
this.emitBridgeEvent("compile_success", {
|
|
42
|
+
file
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (this.reportWarnings) {
|
|
46
|
+
this.reportWarnings();
|
|
47
|
+
}
|
|
48
|
+
if (this.vm.error_info) {
|
|
49
|
+
const err = Object.assign({}, this.vm.error_info);
|
|
50
|
+
err.type = "init";
|
|
51
|
+
err.file = file;
|
|
52
|
+
this.listener.reportError?.(err);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (this.vm.runner?.getFunctionSource) {
|
|
56
|
+
const init = this.vm.runner.getFunctionSource("init");
|
|
57
|
+
if (init && init !== this.previousInit && reinit) {
|
|
58
|
+
this.previousInit = init;
|
|
59
|
+
this.vm.call("init");
|
|
60
|
+
if (this.vm.error_info) {
|
|
61
|
+
const err = Object.assign({}, this.vm.error_info);
|
|
62
|
+
err.type = "init";
|
|
63
|
+
this.listener.reportError?.(err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
} catch (err) {
|
|
69
|
+
err.file = file;
|
|
70
|
+
this.listener.reportError?.(err);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
SourceUpdater
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hot-reload/updater.ts"],"sourcesContent":["/**\n * Source code updater for hot reload\n * Matches runtime behavior for source updates\n */\n\nimport type { L8BVM } from \"@al8b/vm\";\nimport type { RuntimeListener } from \"../types\";\n\nexport class SourceUpdater {\n\tprivate updateMemory: Record<string, string> = {};\n\tprivate previousInit: string | null = null;\n\n\tconstructor(\n\t\tprivate vm: L8BVM,\n\t\tprivate listener: RuntimeListener,\n\t\tprivate audio?: { cancelBeeps(): void },\n\t\tprivate screen?: { clear(): void },\n\t\tprivate reportWarnings?: () => void,\n\t\tprivate emitBridgeEvent?: (name: string, payload?: unknown) => void,\n\t) {}\n\n\t/**\n\t * Update source code (hot reload)\n\t */\n\tupdateSource(file: string, src: string, reinit = false): boolean {\n\t\t// Return false if VM is not available\n\t\tif (!this.vm) return false;\n\n\t\t// Return false if source code hasn't changed\n\t\tif (src === this.updateMemory[file]) return false;\n\n\t\tthis.updateMemory[file] = src;\n\n\t\t// Cancel beeps and clear screen before hot reload\n\t\tif (this.audio) {\n\t\t\tthis.audio.cancelBeeps();\n\t\t}\n\t\tif (this.screen) {\n\t\t\tthis.screen.clear();\n\t\t}\n\n\t\ttry {\n\t\t\t// Compile and execute updated source code\n\t\t\t// Timeout of 3000ms prevents infinite loops during hot reload\n\t\t\tthis.vm.run(src, 3000, file);\n\n\t\t\t// Notify parent process of successful compilation\n\t\t\tif (this.emitBridgeEvent) {\n\t\t\t\tthis.emitBridgeEvent(\"compile_success\", { file });\n\t\t\t}\n\n\t\t\t// Report warnings after compilation\n\t\t\tif (this.reportWarnings) {\n\t\t\t\tthis.reportWarnings();\n\t\t\t}\n\n\t\t\t// Check for compilation or runtime errors from VM\n\t\t\tif (this.vm.error_info) {\n\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\terr.type = \"init\";\n\t\t\t\terr.file = file;\n\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Re-run init() function if it was modified during hot reload\n\t\t\t// This allows reinitialization without full page refresh\n\t\t\tif ((this.vm.runner as any)?.getFunctionSource) {\n\t\t\t\tconst init = (this.vm.runner as any).getFunctionSource(\"init\");\n\t\t\t\tif (init && init !== this.previousInit && reinit) {\n\t\t\t\t\tthis.previousInit = init;\n\t\t\t\t\tthis.vm.call(\"init\");\n\t\t\t\t\tif (this.vm.error_info) {\n\t\t\t\t\t\tconst err: any = Object.assign({}, this.vm.error_info);\n\t\t\t\t\t\terr.type = \"init\";\n\t\t\t\t\t\tthis.listener.reportError?.(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (err: any) {\n\t\t\t// Handle exceptions during compilation or execution\n\t\t\terr.file = file;\n\t\t\tthis.listener.reportError?.(err);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"],"mappings":";;;;AAQO,IAAMA,gBAAN,MAAMA;EARb,OAQaA;;;;;;;;;EACJC,eAAuC,CAAC;EACxCC,eAA8B;EAEtC,YACSC,IACAC,UACAC,OACAC,QACAC,gBACAC,iBACP;SANOL,KAAAA;SACAC,WAAAA;SACAC,QAAAA;SACAC,SAAAA;SACAC,iBAAAA;SACAC,kBAAAA;EACN;;;;EAKHC,aAAaC,MAAcC,KAAaC,SAAS,OAAgB;AAEhE,QAAI,CAAC,KAAKT,GAAI,QAAO;AAGrB,QAAIQ,QAAQ,KAAKV,aAAaS,IAAAA,EAAO,QAAO;AAE5C,SAAKT,aAAaS,IAAAA,IAAQC;AAG1B,QAAI,KAAKN,OAAO;AACf,WAAKA,MAAMQ,YAAW;IACvB;AACA,QAAI,KAAKP,QAAQ;AAChB,WAAKA,OAAOQ,MAAK;IAClB;AAEA,QAAI;AAGH,WAAKX,GAAGY,IAAIJ,KAAK,KAAMD,IAAAA;AAGvB,UAAI,KAAKF,iBAAiB;AACzB,aAAKA,gBAAgB,mBAAmB;UAAEE;QAAK,CAAA;MAChD;AAGA,UAAI,KAAKH,gBAAgB;AACxB,aAAKA,eAAc;MACpB;AAGA,UAAI,KAAKJ,GAAGa,YAAY;AACvB,cAAMC,MAAWC,OAAOC,OAAO,CAAC,GAAG,KAAKhB,GAAGa,UAAU;AACrDC,YAAIG,OAAO;AACXH,YAAIP,OAAOA;AACX,aAAKN,SAASiB,cAAcJ,GAAAA;AAC5B,eAAO;MACR;AAIA,UAAK,KAAKd,GAAGmB,QAAgBC,mBAAmB;AAC/C,cAAMC,OAAQ,KAAKrB,GAAGmB,OAAeC,kBAAkB,MAAA;AACvD,YAAIC,QAAQA,SAAS,KAAKtB,gBAAgBU,QAAQ;AACjD,eAAKV,eAAesB;AACpB,eAAKrB,GAAGsB,KAAK,MAAA;AACb,cAAI,KAAKtB,GAAGa,YAAY;AACvB,kBAAMC,MAAWC,OAAOC,OAAO,CAAC,GAAG,KAAKhB,GAAGa,UAAU;AACrDC,gBAAIG,OAAO;AACX,iBAAKhB,SAASiB,cAAcJ,GAAAA;UAC7B;QACD;MACD;AAEA,aAAO;IACR,SAASA,KAAU;AAElBA,UAAIP,OAAOA;AACX,WAAKN,SAASiB,cAAcJ,GAAAA;AAC5B,aAAO;IACR;EACD;AACD;","names":["SourceUpdater","updateMemory","previousInit","vm","listener","audio","screen","reportWarnings","emitBridgeEvent","updateSource","file","src","reinit","cancelBeeps","clear","run","error_info","err","Object","assign","type","reportError","runner","getFunctionSource","init","call"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { L8BVM } from '@al8b/vm';
|
|
2
|
+
import { RuntimeListener } from '../types/runtime.mjs';
|
|
3
|
+
import '../types/assets.mjs';
|
|
4
|
+
import '@al8b/framework-shared';
|
|
5
|
+
import '../types/bridge.mjs';
|
|
6
|
+
import '@al8b/time';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Source code updater for hot reload
|
|
10
|
+
* Matches runtime behavior for source updates
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
declare class SourceUpdater {
|
|
14
|
+
private vm;
|
|
15
|
+
private listener;
|
|
16
|
+
private audio?;
|
|
17
|
+
private screen?;
|
|
18
|
+
private reportWarnings?;
|
|
19
|
+
private emitBridgeEvent?;
|
|
20
|
+
private updateMemory;
|
|
21
|
+
private previousInit;
|
|
22
|
+
constructor(vm: L8BVM, listener: RuntimeListener, audio?: {
|
|
23
|
+
cancelBeeps(): void;
|
|
24
|
+
} | undefined, screen?: {
|
|
25
|
+
clear(): void;
|
|
26
|
+
} | undefined, reportWarnings?: (() => void) | undefined, emitBridgeEvent?: ((name: string, payload?: unknown) => void) | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Update source code (hot reload)
|
|
29
|
+
*/
|
|
30
|
+
updateSource(file: string, src: string, reinit?: boolean): boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { SourceUpdater };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { L8BVM } from '@al8b/vm';
|
|
2
|
+
import { RuntimeListener } from '../types/runtime.js';
|
|
3
|
+
import '../types/assets.js';
|
|
4
|
+
import '@al8b/framework-shared';
|
|
5
|
+
import '../types/bridge.js';
|
|
6
|
+
import '@al8b/time';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Source code updater for hot reload
|
|
10
|
+
* Matches runtime behavior for source updates
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
declare class SourceUpdater {
|
|
14
|
+
private vm;
|
|
15
|
+
private listener;
|
|
16
|
+
private audio?;
|
|
17
|
+
private screen?;
|
|
18
|
+
private reportWarnings?;
|
|
19
|
+
private emitBridgeEvent?;
|
|
20
|
+
private updateMemory;
|
|
21
|
+
private previousInit;
|
|
22
|
+
constructor(vm: L8BVM, listener: RuntimeListener, audio?: {
|
|
23
|
+
cancelBeeps(): void;
|
|
24
|
+
} | undefined, screen?: {
|
|
25
|
+
clear(): void;
|
|
26
|
+
} | undefined, reportWarnings?: (() => void) | undefined, emitBridgeEvent?: ((name: string, payload?: unknown) => void) | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Update source code (hot reload)
|
|
29
|
+
*/
|
|
30
|
+
updateSource(file: string, src: string, reinit?: boolean): boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { SourceUpdater };
|