@al8b/runtime 0.1.13 → 0.1.14

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.
Files changed (56) hide show
  1. package/dist/assets/index.d.mts +0 -1
  2. package/dist/assets/index.d.ts +0 -1
  3. package/dist/assets/loader.d.mts +0 -1
  4. package/dist/assets/loader.d.ts +0 -1
  5. package/dist/browser/index.js +780 -2681
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/browser/index.min.js +27 -39
  8. package/dist/core/api-factory.d.mts +1 -5
  9. package/dist/core/api-factory.d.ts +1 -5
  10. package/dist/core/api-factory.js +17 -38
  11. package/dist/core/api-factory.js.map +1 -1
  12. package/dist/core/api-factory.mjs +18 -38
  13. package/dist/core/api-factory.mjs.map +1 -1
  14. package/dist/core/controller.d.mts +0 -5
  15. package/dist/core/controller.d.ts +0 -5
  16. package/dist/core/controller.js +23 -98
  17. package/dist/core/controller.js.map +1 -1
  18. package/dist/core/controller.mjs +24 -99
  19. package/dist/core/controller.mjs.map +1 -1
  20. package/dist/core/debug-logger.d.mts +0 -1
  21. package/dist/core/debug-logger.d.ts +0 -1
  22. package/dist/core/error-handler.d.mts +1 -2
  23. package/dist/core/error-handler.d.ts +1 -2
  24. package/dist/core/error-handler.js +2 -17
  25. package/dist/core/error-handler.js.map +1 -1
  26. package/dist/core/error-handler.mjs +2 -17
  27. package/dist/core/error-handler.mjs.map +1 -1
  28. package/dist/core/index.d.mts +0 -2
  29. package/dist/core/index.d.ts +0 -2
  30. package/dist/core/index.js +23 -98
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/core/index.mjs +24 -99
  33. package/dist/core/index.mjs.map +1 -1
  34. package/dist/hot-reload/index.d.mts +0 -1
  35. package/dist/hot-reload/index.d.ts +0 -1
  36. package/dist/hot-reload/index.js.map +1 -1
  37. package/dist/hot-reload/index.mjs.map +1 -1
  38. package/dist/hot-reload/updater.d.mts +0 -1
  39. package/dist/hot-reload/updater.d.ts +0 -1
  40. package/dist/hot-reload/updater.js.map +1 -1
  41. package/dist/hot-reload/updater.mjs.map +1 -1
  42. package/dist/index.d.mts +0 -2
  43. package/dist/index.d.ts +0 -2
  44. package/dist/index.js +23 -98
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.mjs +24 -99
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/types/bridge.d.mts +0 -4
  49. package/dist/types/bridge.d.ts +0 -4
  50. package/dist/types/bridge.js.map +1 -1
  51. package/dist/types/index.d.mts +0 -1
  52. package/dist/types/index.d.ts +0 -1
  53. package/dist/types/runtime.d.mts +13 -2
  54. package/dist/types/runtime.d.ts +13 -2
  55. package/dist/types/runtime.js.map +1 -1
  56. package/package.json +12 -16
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../../../tooling/diagnostics/src/core/codes.ts","../../../../tooling/diagnostics/src/core/types.ts","../../../../tooling/diagnostics/src/core/messages/api/asset-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/audio-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/draw-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/input-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/map-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/palette-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/screen-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/sprite-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/storage-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/time-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/validation-messages.ts","../../../../tooling/diagnostics/src/core/messages/api/index.ts","../../../../tooling/diagnostics/src/core/messages/cli-messages.ts","../../../../tooling/diagnostics/src/core/messages/compilation-messages.ts","../../../../tooling/diagnostics/src/core/messages/runtime-messages.ts","../../../../tooling/diagnostics/src/core/messages/scene-messages.ts","../../../../tooling/diagnostics/src/core/messages/syntax-messages.ts","../../../../tooling/diagnostics/src/core/messages/warning-messages.ts","../../../../tooling/diagnostics/src/core/messages/index.ts","../../../../tooling/diagnostics/src/core/formatter.ts","../../../../core/audio/src/core/audio-core.ts","../../../../core/audio/src/constants.ts","../../../../core/audio/src/devices/beeper.ts","../../../../core/audio/src/core/audio-worklet.ts","../../../../core/audio/src/devices/music.ts","../../../../core/audio/src/devices/sound.ts","../../../../core/map/src/core/tile-map.ts","../../../../core/map/src/drawing/renderer.ts","../../../../core/map/src/shared/references.ts","../../../../core/image/src/blending.ts","../../../../core/image/src/core/color.ts","../../../../core/image/src/core/context.ts","../../../../core/image/src/core/drawing.ts","../../../../core/image/src/core/font.ts","../../../../core/image/src/core/map-rendering.ts","../../../../core/image/src/core/pixel.ts","../../../../core/image/src/core/shapes.ts","../../../../core/image/src/core/sprite-rendering.ts","../../../../core/image/src/core/text.ts","../../../../core/image/src/core/transform.ts","../../../../core/image/src/core/image.ts","../../../../core/sprites/src/sprite.ts","../../src/constants.ts","../../src/assets/loader.ts","../../../../core/player/src/player-service.ts","../../../../core/scene/src/constants.ts","../../../../core/scene/src/utils.ts","../../../../core/scene/src/route-manager.ts","../../../../core/scene/src/router.ts","../../../../core/scene/src/scene-registry.ts","../../../../core/scene/src/errors.ts","../../../../core/scene/src/scene-manager.ts","../../../../core/screen/src/drawing/sprite-screen.ts","../../../../core/screen/src/drawing/primitives-screen.ts","../../../../core/screen/src/core/base-screen.ts","../../../../core/screen/src/tri/ttri.ts","../../../../core/screen/src/drawing/text-screen.ts","../../../../core/screen/src/tri/triangle-screen.ts","../../../../core/screen/src/core/screen.ts","../../../../core/time/src/core/machine.ts","../../../../core/time/src/constants.ts","../../../../core/time/src/utils.ts","../../../../core/time/src/playback/player.ts","../../../../core/time/src/recording/recorder.ts","../../../stdlib/src/json.ts","../../../stdlib/src/list.ts","../../../stdlib/src/math.ts","../../../stdlib/src/string.ts","../../../../lootiscript/src/random.ts","../../../../lootiscript/src/v1/token.ts","../../../../lootiscript/src/v1/tokenizer.ts","../../../../lootiscript/src/v1/parser.ts","../../../../lootiscript/src/v1/routine.ts","../../../../lootiscript/src/v1/program.ts","../../../../lootiscript/src/v1/function-bridge.ts","../../../../lootiscript/src/v1/inline-cache.ts","../../../../lootiscript/src/v1/memory-pool.ts","../../../../lootiscript/src/v1/processor-operators.ts","../../../../lootiscript/src/v1/processor.ts","../../../../lootiscript/src/v1/compiler.ts","../../../../lootiscript/src/v1/runner.ts","../../../../lootiscript/src/v1/profiler.ts","../../../../lootiscript/src/v1/transpiler.ts","../../../io/src/storage/index.ts","../../../vm/src/context.ts","../../../vm/src/extensions.ts","../../../vm/src/l8bvm.ts","../../../vm/src/index.ts","../../src/hot-reload/updater.ts","../../../../core/input/src/core/input-manager.ts","../../../../core/input/src/devices/gamepad.ts","../../../../core/input/src/shared/constants.ts","../../../../core/input/src/shared/utils.ts","../../../../core/input/src/devices/keyboard.ts","../../../../core/input/src/devices/mouse.ts","../../../../core/input/src/devices/touch.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","../../../../core/palette/src/core/palette.ts","../../src/utils/object-pool.ts","../../src/core/api-factory.ts","../../src/core/controller.ts","../../src/utils/deep-clone.ts","../../src/utils/shallow-equal.ts"],"sourcesContent":["/**\n * @al8b/runtime\n *\n * Browser runtime facade and supporting subsystems for AL8B games.\n */\n\nexport * from \"./assets\";\n// Component exports (for advanced usage)\nexport * from \"./core\";\nexport * from \"./hot-reload\";\nexport * from \"./input\";\nexport * from \"./loop\";\nexport * from \"./storage\";\nexport * from \"./system\";\n// Type exports\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./vm\";\n","/**\n * Diagnostic codes for L8B ecosystem\n *\n * Code format:\n * - E1xxx: Syntax errors\n * - E2xxx: Runtime errors\n * - E3xxx: Compilation errors\n * - E4xxx: Type errors\n * - E5xxx: Scene errors\n * - E6xxx: CLI errors\n * - W1xxx: Syntax warnings\n * - W2xxx: Runtime warnings\n * - W3xxx: Compilation warnings\n * - W4xxx: Type warnings\n * - W5xxx: Scene warnings\n */\n\n/**\n * Syntax Error Codes (E1xxx)\n */\nexport enum SyntaxErrorCode {\n\tE1001 = \"E1001\", // Unterminated function\n\tE1002 = \"E1002\", // Too many 'end'\n\tE1003 = \"E1003\", // Missing 'end'\n\tE1004 = \"E1004\", // Unexpected token\n\tE1005 = \"E1005\", // Missing token\n\tE1006 = \"E1006\", // Unexpected end of file\n\tE1007 = \"E1007\", // Misuse of reserved keyword\n\tE1008 = \"E1008\", // Unterminated string\n\tE1009 = \"E1009\", // Unterminated object/array\n}\n\n/**\n * Runtime Error Codes (E2xxx)\n */\nexport enum RuntimeErrorCode {\n\tE2001 = \"E2001\", // Undefined variable\n\tE2002 = \"E2002\", // Type mismatch\n\tE2003 = \"E2003\", // Division by zero\n\tE2004 = \"E2004\", // Function not found\n\tE2005 = \"E2005\", // Invalid operation\n}\n\n/**\n * Compilation Error Codes (E3xxx)\n */\nexport enum CompilationErrorCode {\n\tE3001 = \"E3001\", // Compilation failed\n\tE3002 = \"E3002\", // File not found\n\tE3003 = \"E3003\", // Parse error\n}\n\n/**\n * Scene Error Codes (E5xxx)\n */\nexport enum SceneErrorCode {\n\tE5001 = \"E5001\", // Invalid path\n\tE5002 = \"E5002\", // Invalid scene name\n\tE5003 = \"E5003\", // Invalid scene definition\n\tE5004 = \"E5004\", // Scene not found\n\tE5005 = \"E5005\", // No route matched\n\tE5006 = \"E5006\", // No scenes registered\n\tE5007 = \"E5007\", // Scene has no draw function\n}\n\n/**\n * CLI Error Codes (E6xxx)\n */\nexport enum CLIErrorCode {\n\tE6001 = \"E6001\", // Config error\n\tE6002 = \"E6002\", // Build error\n\tE6003 = \"E6003\", // Server error\n}\n\n/**\n * API Error Codes (E7xxx)\n */\nexport enum APIErrorCode {\n\t// Screen API Errors (E7001-E7010)\n\tE7001 = \"E7001\", // Failed to get canvas context\n\tE7002 = \"E7002\", // Invalid canvas dimensions\n\tE7003 = \"E7003\", // Invalid color format\n\tE7004 = \"E7004\", // Sprite not found\n\tE7005 = \"E7005\", // Sprite not ready\n\tE7006 = \"E7006\", // Invalid font\n\tE7007 = \"E7007\", // Invalid blend mode\n\n\t// Audio API Errors (E7011-E7020)\n\tE7011 = \"E7011\", // Audio context creation failed\n\tE7012 = \"E7012\", // Audio worklet failed to start\n\tE7013 = \"E7013\", // Sound not found\n\tE7014 = \"E7014\", // Music not found\n\tE7015 = \"E7015\", // Audio context suspended\n\tE7016 = \"E7016\", // Invalid audio parameters\n\n\t// Sprite API Errors (E7021-E7030)\n\tE7021 = \"E7021\", // Sprite loading failed\n\tE7022 = \"E7022\", // Invalid sprite properties\n\tE7023 = \"E7023\", // Invalid sprite URL\n\tE7024 = \"E7024\", // Sprite frame out of bounds\n\n\t// Map API Errors (E7031-E7040)\n\tE7031 = \"E7031\", // Map canvas context failed\n\tE7032 = \"E7032\", // Invalid tile coordinates\n\tE7033 = \"E7033\", // Tile sprite not found\n\tE7034 = \"E7034\", // Invalid map dimensions\n\n\t// Asset API Errors (E7041-E7050)\n\tE7041 = \"E7041\", // Asset not found\n\tE7042 = \"E7042\", // Asset loading failed\n\tE7043 = \"E7043\", // Invalid asset type\n\tE7044 = \"E7044\", // Asset not ready\n\n\t// Input API Errors (E7051-E7060)\n\tE7051 = \"E7051\", // Input device not available\n\tE7052 = \"E7052\", // Invalid input state\n\n\t// Storage API Errors (E7061-E7070)\n\tE7061 = \"E7061\", // Storage quota exceeded\n\tE7062 = \"E7062\", // Storage operation failed\n\tE7063 = \"E7063\", // Invalid storage key\n\n\t// Palette API Errors (E7071-E7080)\n\tE7071 = \"E7071\", // Palette not found\n\tE7072 = \"E7072\", // Invalid palette format\n\tE7073 = \"E7073\", // Invalid color index\n\tE7074 = \"E7074\", // Palette loading failed\n\tE7075 = \"E7075\", // Invalid palette size\n\n\t// Time API Errors (E7081-E7090)\n\tE7081 = \"E7081\", // Invalid time value\n\tE7082 = \"E7082\", // Time playback failed\n\tE7083 = \"E7083\", // Time recording failed\n\tE7084 = \"E7084\", // Invalid time format\n\n\t// Drawing API Errors (E7091-E7100)\n\tE7091 = \"E7091\", // Drawing operation failed\n\tE7092 = \"E7092\", // Invalid drawing context\n\tE7093 = \"E7093\", // Invalid drawing parameters\n\n\t// API Validation Errors (E7100-E7199)\n\tE7100 = \"E7100\", // Unknown API property\n}\n\n/**\n * Warning Codes (W1xxx - W5xxx)\n */\nexport enum WarningCode {\n\t// Syntax Warnings (W1xxx)\n\tW1001 = \"W1001\", // Assigning to API variable\n\tW1002 = \"W1002\", // Assignment as condition\n\n\t// Runtime Warnings (W2xxx)\n\tW2001 = \"W2001\", // Deprecated API usage\n\n\t// Scene Warnings (W5xxx)\n\tW5001 = \"W5001\", // Activating first scene\n\tW5002 = \"W5002\", // No route matched initial\n\tW5003 = \"W5003\", // No scenes registered warning\n\tW5004 = \"W5004\", // No scenes before init\n}\n\n/**\n * Union type of all error codes\n */\nexport type ErrorCode =\n\t| SyntaxErrorCode\n\t| RuntimeErrorCode\n\t| CompilationErrorCode\n\t| SceneErrorCode\n\t| CLIErrorCode\n\t| APIErrorCode;\n\n/**\n * Union type of all diagnostic codes\n */\nexport type DiagnosticCode = ErrorCode | WarningCode;\n","/**\n * Core types for diagnostics system\n */\n\n/**\n * Severity level of a diagnostic\n */\nexport enum DiagnosticSeverity {\n\tError = \"error\",\n\tWarning = \"warning\",\n\tInfo = \"info\",\n}\n\n/**\n * Diagnostic code categories\n */\nexport enum DiagnosticCategory {\n\tSyntax = \"syntax\",\n\tRuntime = \"runtime\",\n\tCompilation = \"compilation\",\n\tType = \"type\",\n\tScene = \"scene\",\n\tCLI = \"cli\",\n\tAPI = \"api\",\n}\n\n/**\n * Related location for diagnostics (e.g., where function started)\n */\nexport interface RelatedLocation {\n\tfile: string;\n\tline: number;\n\tcolumn: number;\n\tmessage: string;\n}\n\n/**\n * Call frame for stack traces\n */\nexport interface CallFrame {\n\tfunctionName: string;\n\tfile: string;\n\tline: number;\n\tcolumn: number;\n}\n\n/**\n * Base diagnostic information\n */\nexport interface Diagnostic {\n\t/** Diagnostic code (e.g., \"E1001\") */\n\tcode: string;\n\t/** Severity level */\n\tseverity: DiagnosticSeverity;\n\t/** Formatted message */\n\tmessage: string;\n\t/** Optional file path */\n\tfile?: string;\n\t/** Optional line number (1-based) */\n\tline?: number;\n\t/** Optional column number (1-based) */\n\tcolumn?: number;\n\t/** Optional error span length */\n\tlength?: number;\n\t/** Optional source context */\n\tcontext?: string;\n\t/** Optional fix suggestions */\n\tsuggestions?: string[];\n\t/** Optional related location */\n\trelated?: RelatedLocation;\n\t/** Optional stack trace */\n\tstackTrace?: CallFrame[];\n\t/** Optional category */\n\tcategory?: DiagnosticCategory;\n\t/** Optional additional data */\n\tdata?: Record<string, unknown>;\n}\n\n/**\n * Message template function arguments\n */\nexport interface MessageArgs {\n\t[key: string]: string | number | boolean | undefined;\n}\n\n/**\n * Message template definition\n */\nexport interface MessageTemplate {\n\t/** Diagnostic code */\n\tcode: string;\n\t/** Severity level */\n\tseverity: DiagnosticSeverity;\n\t/** Message template (string or function) */\n\tmessage: string | ((args: MessageArgs) => string);\n\t/** Optional description */\n\tdescription?: string;\n\t/** Optional default suggestions */\n\tsuggestions?: string[] | ((args: MessageArgs) => string[]);\n\t/** Optional category */\n\tcategory?: DiagnosticCategory;\n}\n","/**\n * Asset API error message templates (E7041-E7050)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const assetMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7041]: {\n\t\tcode: APIErrorCode.E7041,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Asset not found: '${args.assetName}'`,\n\t\tdescription: \"The requested asset does not exist\",\n\t\tsuggestions: [\"Check if the asset name is correct\", \"Verify the asset was loaded\", \"Check asset loading order\"],\n\t},\n\t[APIErrorCode.E7042]: {\n\t\tcode: APIErrorCode.E7042,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Asset loading failed: ${args.assetName || \"unknown\"}`,\n\t\tdescription: \"The asset could not be loaded\",\n\t\tsuggestions: [\n\t\t\t\"Check if the asset URL is correct\",\n\t\t\t\"Verify the file exists\",\n\t\t\t\"Check network connection\",\n\t\t\t\"Check CORS settings\",\n\t\t],\n\t},\n\t[APIErrorCode.E7043]: {\n\t\tcode: APIErrorCode.E7043,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid asset type: '${args.assetType}'`,\n\t\tdescription: \"The asset type is not supported\",\n\t\tsuggestions: [\"Use a supported asset type\", \"Check asset type documentation\"],\n\t},\n\t[APIErrorCode.E7044]: {\n\t\tcode: APIErrorCode.E7044,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Asset '${args.assetName}' is not ready`,\n\t\tdescription: \"The asset exists but has not finished loading\",\n\t\tsuggestions: [\"Wait for the asset to finish loading\", \"Check asset.ready before using it\"],\n\t},\n};\n","/**\n * Audio API error message templates (E7011-E7020)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const audioMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7011]: {\n\t\tcode: APIErrorCode.E7011,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Audio context creation failed\",\n\t\tdescription: \"The browser could not create an AudioContext\",\n\t\tsuggestions: [\n\t\t\t\"Check if the browser supports Web Audio API\",\n\t\t\t\"Try user interaction to activate audio\",\n\t\t\t\"Check browser console for more details\",\n\t\t],\n\t},\n\t[APIErrorCode.E7012]: {\n\t\tcode: APIErrorCode.E7012,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Audio worklet failed to start\",\n\t\tdescription: \"The audio worklet processor could not be initialized\",\n\t\tsuggestions: [\n\t\t\t\"Check if AudioWorklet is supported\",\n\t\t\t\"Verify the worklet code is valid\",\n\t\t\t\"Check browser console for errors\",\n\t\t],\n\t},\n\t[APIErrorCode.E7013]: {\n\t\tcode: APIErrorCode.E7013,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Sound not found: '${args.soundName}'`,\n\t\tdescription: \"The requested sound does not exist in the sound collection\",\n\t\tsuggestions: [\n\t\t\t\"Check if the sound name is spelled correctly\",\n\t\t\t\"Verify the sound was loaded before use\",\n\t\t\t\"Check the sound file path\",\n\t\t],\n\t},\n\t[APIErrorCode.E7014]: {\n\t\tcode: APIErrorCode.E7014,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Music not found: '${args.musicName}'`,\n\t\tdescription: \"The requested music does not exist in the music collection\",\n\t\tsuggestions: [\n\t\t\t\"Check if the music name is spelled correctly\",\n\t\t\t\"Verify the music was loaded before use\",\n\t\t\t\"Check the music file path\",\n\t\t],\n\t},\n\t[APIErrorCode.E7015]: {\n\t\tcode: APIErrorCode.E7015,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Audio context is suspended\",\n\t\tdescription: \"The audio context requires user interaction to resume\",\n\t\tsuggestions: [\n\t\t\t\"Wait for user interaction (click, touch, keypress)\",\n\t\t\t\"The context will resume automatically\",\n\t\t\t\"Check if audio autoplay is blocked\",\n\t\t],\n\t},\n\t[APIErrorCode.E7016]: {\n\t\tcode: APIErrorCode.E7016,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid audio parameters: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Audio playback parameters are invalid\",\n\t\tsuggestions: [\"Check volume is between 0 and 1\", \"Check pitch is a positive number\", \"Check pan is between -1 and 1\"],\n\t},\n};\n","/**\n * Drawing API error message templates (E7091-E7100)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const drawMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7091]: {\n\t\tcode: APIErrorCode.E7091,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Drawing operation failed: ${args.operation || \"unknown\"}`,\n\t\tdescription: \"A drawing operation could not be completed\",\n\t\tsuggestions: [\"Check if drawing context is valid\", \"Verify drawing parameters\", \"Check canvas state\"],\n\t},\n\t[APIErrorCode.E7092]: {\n\t\tcode: APIErrorCode.E7092,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Invalid drawing context\",\n\t\tdescription: \"The drawing context is invalid or not available\",\n\t\tsuggestions: [\n\t\t\t\"Check if canvas context is initialized\",\n\t\t\t\"Verify context is not destroyed\",\n\t\t\t\"Reinitialize drawing context\",\n\t\t],\n\t},\n\t[APIErrorCode.E7093]: {\n\t\tcode: APIErrorCode.E7093,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid drawing parameters: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Drawing parameters are invalid\",\n\t\tsuggestions: [\n\t\t\t\"Check coordinate values are valid numbers\",\n\t\t\t\"Verify dimensions are positive\",\n\t\t\t\"Check color values are valid\",\n\t\t\t\"Verify all required parameters are provided\",\n\t\t],\n\t},\n};\n","/**\n * Input API error message templates (E7051-E7060)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const inputMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7051]: {\n\t\tcode: APIErrorCode.E7051,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Input device not available: '${args.device}'`,\n\t\tdescription: \"The requested input device is not available\",\n\t\tsuggestions: [\"Check if the device is connected\", \"Verify browser permissions\", \"Check device support\"],\n\t},\n\t[APIErrorCode.E7052]: {\n\t\tcode: APIErrorCode.E7052,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid input state: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Input state is invalid or corrupted\",\n\t\tsuggestions: [\"Reinitialize input system\", \"Check input device connections\"],\n\t},\n};\n","/**\n * Map API error message templates (E7031-E7040)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const mapMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7031]: {\n\t\tcode: APIErrorCode.E7031,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Map canvas context failed\",\n\t\tdescription: \"Could not get 2D context for map rendering canvas\",\n\t\tsuggestions: [\"Check if canvas element is valid\", \"Verify browser supports canvas\"],\n\t},\n\t[APIErrorCode.E7032]: {\n\t\tcode: APIErrorCode.E7032,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid tile coordinates: (${args.x}, ${args.y})`,\n\t\tdescription: \"Tile coordinates are out of map bounds\",\n\t\tsuggestions: [\"Check coordinates are within map dimensions\", \"Verify map was properly initialized\"],\n\t},\n\t[APIErrorCode.E7033]: {\n\t\tcode: APIErrorCode.E7033,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Tile sprite not found: '${args.spriteName}'`,\n\t\tdescription: \"The sprite for the tile does not exist\",\n\t\tsuggestions: [\"Check if the sprite name is correct\", \"Verify the sprite was loaded\", \"Check tile definition\"],\n\t},\n\t[APIErrorCode.E7034]: {\n\t\tcode: APIErrorCode.E7034,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid map dimensions: ${args.width || \"?\"}x${args.height || \"?\"}`,\n\t\tdescription: \"Map dimensions are invalid\",\n\t\tsuggestions: [\"Ensure width and height are positive numbers\", \"Check map initialization\"],\n\t},\n};\n","/**\n * Palette API error message templates (E7071-E7080)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const paletteMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7071]: {\n\t\tcode: APIErrorCode.E7071,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Palette not found: '${args.paletteName}'`,\n\t\tdescription: \"The requested palette does not exist\",\n\t\tsuggestions: [\"Check if the palette name is correct\", \"Verify the palette was loaded\", \"Check palette loading order\"],\n\t},\n\t[APIErrorCode.E7072]: {\n\t\tcode: APIErrorCode.E7072,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid palette format: ${args.format || \"unknown\"}`,\n\t\tdescription: \"The palette format is not supported\",\n\t\tsuggestions: [\n\t\t\t\"Use a supported palette format\",\n\t\t\t\"Check palette format documentation\",\n\t\t\t\"Verify the palette file format\",\n\t\t],\n\t},\n\t[APIErrorCode.E7073]: {\n\t\tcode: APIErrorCode.E7073,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid color index: ${args.index} (valid range: 0-${args.maxIndex || 255})`,\n\t\tdescription: \"The color index is out of palette range\",\n\t\tsuggestions: [\"Check color index is within palette range\", \"Verify palette size\", \"Use a valid color index\"],\n\t},\n\t[APIErrorCode.E7074]: {\n\t\tcode: APIErrorCode.E7074,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Palette loading failed: ${args.paletteName || \"unknown\"}`,\n\t\tdescription: \"The palette could not be loaded\",\n\t\tsuggestions: [\n\t\t\t\"Check if the palette file exists\",\n\t\t\t\"Verify the palette file format\",\n\t\t\t\"Check file permissions\",\n\t\t\t\"Check network connection if loading from URL\",\n\t\t],\n\t},\n\t[APIErrorCode.E7075]: {\n\t\tcode: APIErrorCode.E7075,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid palette size: ${args.size || \"unknown\"} (expected: ${args.expectedSize || \"256\"})`,\n\t\tdescription: \"The palette size is invalid\",\n\t\tsuggestions: [\n\t\t\t\"Check palette size matches expected size\",\n\t\t\t\"Verify palette data is complete\",\n\t\t\t\"Check palette initialization\",\n\t\t],\n\t},\n};\n","/**\n * Screen API error message templates (E7001-E7010)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const screenMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7001]: {\n\t\tcode: APIErrorCode.E7001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Failed to get 2D canvas context\",\n\t\tdescription: \"The browser could not create a 2D rendering context for the canvas\",\n\t\tsuggestions: [\n\t\t\t\"Check if the canvas element is valid\",\n\t\t\t\"Verify the browser supports canvas 2D rendering\",\n\t\t\t\"Check for conflicting canvas contexts\",\n\t\t],\n\t},\n\t[APIErrorCode.E7002]: {\n\t\tcode: APIErrorCode.E7002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid canvas dimensions: ${args.width || \"?\"}x${args.height || \"?\"}`,\n\t\tdescription: \"Canvas dimensions are invalid (zero or negative)\",\n\t\tsuggestions: [\"Ensure width and height are positive numbers\", \"Check if canvas was properly initialized\"],\n\t},\n\t[APIErrorCode.E7003]: {\n\t\tcode: APIErrorCode.E7003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid color format: ${args.color}`,\n\t\tdescription: \"The color value provided is not in a valid format\",\n\t\tsuggestions: [\n\t\t\t\"Use hex format: '#RRGGBB' or '#RGB'\",\n\t\t\t\"Use named colors: 'red', 'blue', etc.\",\n\t\t\t\"Use numeric format for palette colors\",\n\t\t],\n\t},\n\t[APIErrorCode.E7004]: {\n\t\tcode: APIErrorCode.E7004,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Sprite not found: '${args.spriteName}'`,\n\t\tdescription: \"The requested sprite does not exist in the sprite collection\",\n\t\tsuggestions: [\n\t\t\t\"Check if the sprite name is spelled correctly\",\n\t\t\t\"Verify the sprite was loaded before use\",\n\t\t\t\"Check if the sprite is in the correct namespace\",\n\t\t],\n\t},\n\t[APIErrorCode.E7005]: {\n\t\tcode: APIErrorCode.E7005,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Sprite '${args.spriteName}' is not ready`,\n\t\tdescription: \"The sprite exists but has not finished loading\",\n\t\tsuggestions: [\n\t\t\t\"Wait for the sprite to finish loading\",\n\t\t\t\"Check sprite.ready before using it\",\n\t\t\t\"Use a callback or promise to wait for loading\",\n\t\t],\n\t},\n\t[APIErrorCode.E7006]: {\n\t\tcode: APIErrorCode.E7006,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid font: '${args.font}'`,\n\t\tdescription: \"The font name is invalid or not available\",\n\t\tsuggestions: [\"Use a valid font name\", \"Check if the font is loaded\", \"Use a fallback font\"],\n\t},\n\t[APIErrorCode.E7007]: {\n\t\tcode: APIErrorCode.E7007,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid blend mode: '${args.blendMode}'`,\n\t\tdescription: \"The blend mode is not supported\",\n\t\tsuggestions: [\n\t\t\t\"Use a valid blend mode: 'normal', 'additive', 'multiply', etc.\",\n\t\t\t\"Check the list of supported blend modes\",\n\t\t],\n\t},\n};\n","/**\n * Sprite API error message templates (E7021-E7030)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const spriteMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7021]: {\n\t\tcode: APIErrorCode.E7021,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Sprite loading failed: ${args.url || \"unknown URL\"}`,\n\t\tdescription: \"The sprite image could not be loaded\",\n\t\tsuggestions: [\n\t\t\t\"Check if the URL is correct\",\n\t\t\t\"Verify the image file exists\",\n\t\t\t\"Check CORS settings if loading from different domain\",\n\t\t\t\"Check browser console for network errors\",\n\t\t],\n\t},\n\t[APIErrorCode.E7022]: {\n\t\tcode: APIErrorCode.E7022,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid sprite properties: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Sprite properties are invalid\",\n\t\tsuggestions: [\n\t\t\t\"Check frames is a positive number\",\n\t\t\t\"Check fps is a positive number\",\n\t\t\t\"Verify all required properties are set\",\n\t\t],\n\t},\n\t[APIErrorCode.E7023]: {\n\t\tcode: APIErrorCode.E7023,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid sprite URL: ${args.url}`,\n\t\tdescription: \"The sprite URL is invalid or malformed\",\n\t\tsuggestions: [\n\t\t\t\"Use a valid URL or relative path\",\n\t\t\t\"Check if the URL is properly formatted\",\n\t\t\t\"Verify the file extension is correct\",\n\t\t],\n\t},\n\t[APIErrorCode.E7024]: {\n\t\tcode: APIErrorCode.E7024,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Sprite frame out of bounds: frame ${args.frame} of ${args.totalFrames}`,\n\t\tdescription: \"The requested frame index is out of range\",\n\t\tsuggestions: [\n\t\t\t\"Check frame index is between 0 and totalFrames-1\",\n\t\t\t\"Verify the sprite has the expected number of frames\",\n\t\t],\n\t},\n};\n","/**\n * Storage API error message templates (E7061-E7070)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const storageMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7061]: {\n\t\tcode: APIErrorCode.E7061,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: \"Storage quota exceeded\",\n\t\tdescription: \"The storage quota has been exceeded\",\n\t\tsuggestions: [\"Clear old storage data\", \"Reduce the amount of data stored\", \"Check storage quota limits\"],\n\t},\n\t[APIErrorCode.E7062]: {\n\t\tcode: APIErrorCode.E7062,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Storage operation failed: ${args.error || \"unknown\"}`,\n\t\tdescription: \"A storage operation could not be completed\",\n\t\tsuggestions: [\"Check storage permissions\", \"Verify storage is available\", \"Check browser console for details\"],\n\t},\n\t[APIErrorCode.E7063]: {\n\t\tcode: APIErrorCode.E7063,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid storage key: '${args.key}'`,\n\t\tdescription: \"The storage key is invalid\",\n\t\tsuggestions: [\"Use a valid key format\", \"Check key length and characters\"],\n\t},\n};\n","/**\n * Time API error message templates (E7081-E7090)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const timeMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7081]: {\n\t\tcode: APIErrorCode.E7081,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid time value: ${args.value || \"unknown\"}`,\n\t\tdescription: \"The time value is invalid or out of range\",\n\t\tsuggestions: [\"Check time value is a positive number\", \"Verify time is within valid range\", \"Check time format\"],\n\t},\n\t[APIErrorCode.E7082]: {\n\t\tcode: APIErrorCode.E7082,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Time playback failed: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Time playback operation could not be completed\",\n\t\tsuggestions: [\n\t\t\t\"Check if time playback is initialized\",\n\t\t\t\"Verify playback state\",\n\t\t\t\"Check for conflicting time operations\",\n\t\t],\n\t},\n\t[APIErrorCode.E7083]: {\n\t\tcode: APIErrorCode.E7083,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Time recording failed: ${args.error || \"unknown\"}`,\n\t\tdescription: \"Time recording operation could not be completed\",\n\t\tsuggestions: [\"Check if time recording is initialized\", \"Verify recording state\", \"Check available storage space\"],\n\t},\n\t[APIErrorCode.E7084]: {\n\t\tcode: APIErrorCode.E7084,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => `Invalid time format: ${args.format || \"unknown\"}`,\n\t\tdescription: \"The time format is not supported\",\n\t\tsuggestions: [\"Use a supported time format\", \"Check time format documentation\", \"Verify time string format\"],\n\t},\n};\n","/**\n * API Validation error message templates (E7100-E7199)\n */\n\nimport { APIErrorCode } from \"../../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../../types\";\n\nexport const validationMessages: Record<string, MessageTemplate> = {\n\t[APIErrorCode.E7100]: {\n\t\tcode: APIErrorCode.E7100,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.API,\n\t\tmessage: (args) => {\n\t\t\tconst suggestion = args.suggestion as string | undefined;\n\t\t\tif (suggestion) {\n\t\t\t\treturn `Unknown property '${args.propertyName}' on ${args.objectName}. Did you mean '${suggestion}'?`;\n\t\t\t}\n\t\t\treturn `Unknown property '${args.propertyName}' on ${args.objectName}.`;\n\t\t},\n\t\tdescription: \"A property or method that does not exist on the API object was accessed\",\n\t\tsuggestions: [\n\t\t\t\"Check if the property name is spelled correctly\",\n\t\t\t\"Verify the API object supports this property\",\n\t\t\t\"Check the API documentation for available properties\",\n\t\t],\n\t},\n};\n","/**\n * API error messages index - combines all API message categories\n */\n\nimport type { MessageTemplate } from \"../../types\";\nimport { assetMessages } from \"./asset-messages\";\nimport { audioMessages } from \"./audio-messages\";\nimport { drawMessages } from \"./draw-messages\";\nimport { inputMessages } from \"./input-messages\";\nimport { mapMessages } from \"./map-messages\";\nimport { paletteMessages } from \"./palette-messages\";\nimport { screenMessages } from \"./screen-messages\";\nimport { spriteMessages } from \"./sprite-messages\";\nimport { storageMessages } from \"./storage-messages\";\nimport { timeMessages } from \"./time-messages\";\nimport { validationMessages } from \"./validation-messages\";\n\n/**\n * All API error message templates combined\n */\nexport const apiMessages: Record<string, MessageTemplate> = {\n\t...screenMessages,\n\t...audioMessages,\n\t...spriteMessages,\n\t...mapMessages,\n\t...assetMessages,\n\t...inputMessages,\n\t...storageMessages,\n\t...paletteMessages,\n\t...timeMessages,\n\t...drawMessages,\n\t...validationMessages,\n};\n","/**\n * CLI error message templates (E6xxx)\n */\n\nimport { CLIErrorCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const cliMessages: Record<string, MessageTemplate> = {\n\t[CLIErrorCode.E6001]: {\n\t\tcode: CLIErrorCode.E6001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.CLI,\n\t\tmessage: (args) => String(args.error || \"Configuration error\"),\n\t\tdescription: \"An error occurred while processing configuration\",\n\t\tsuggestions: [\"Check the configuration file\", \"Verify all required configuration options are present\"],\n\t},\n\t[CLIErrorCode.E6002]: {\n\t\tcode: CLIErrorCode.E6002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.CLI,\n\t\tmessage: (args) => String(args.error || \"Build error\"),\n\t\tdescription: \"An error occurred during the build process\",\n\t\tsuggestions: [\"Check the build output for details\", \"Fix the reported errors and try again\"],\n\t},\n\t[CLIErrorCode.E6003]: {\n\t\tcode: CLIErrorCode.E6003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.CLI,\n\t\tmessage: (args) => String(args.error || \"Server error\"),\n\t\tdescription: \"An error occurred in the development server\",\n\t\tsuggestions: [\"Check the server logs for details\", \"Restart the development server\"],\n\t},\n};\n","/**\n * Compilation error message templates (E3xxx)\n */\n\nimport { CompilationErrorCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const compilationMessages: Record<string, MessageTemplate> = {\n\t[CompilationErrorCode.E3001]: {\n\t\tcode: CompilationErrorCode.E3001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Compilation,\n\t\tmessage: (args) => String(args.error || \"Compilation failed\"),\n\t\tdescription: \"The compilation process encountered an error\",\n\t\tsuggestions: [\"Check the error messages above for details\", \"Fix the reported errors and try again\"],\n\t},\n\t[CompilationErrorCode.E3002]: {\n\t\tcode: CompilationErrorCode.E3002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Compilation,\n\t\tmessage: (args) => `File not found: ${args.filePath || args.file || \"unknown file\"}`,\n\t\tdescription: \"A required file could not be found\",\n\t\tsuggestions: [\"Check if the file path is correct\", \"Verify the file exists at the specified location\"],\n\t},\n\t[CompilationErrorCode.E3003]: {\n\t\tcode: CompilationErrorCode.E3003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Compilation,\n\t\tmessage: (args) => String(args.error || \"Parse error\"),\n\t\tdescription: \"The source code could not be parsed\",\n\t\tsuggestions: [\"Check the syntax of the source code\", \"Look for syntax errors in the file\"],\n\t},\n};\n","/**\n * Runtime error message templates (E2xxx)\n */\n\nimport { RuntimeErrorCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const runtimeMessages: Record<string, MessageTemplate> = {\n\t[RuntimeErrorCode.E2001]: {\n\t\tcode: RuntimeErrorCode.E2001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: (args) => `Undefined variable '${args.variableName}'`,\n\t\tdescription: \"A variable was referenced but not defined\",\n\t\tsuggestions: [\n\t\t\t\"Check if the variable name is spelled correctly\",\n\t\t\t\"Verify the variable is defined before use\",\n\t\t\t\"Check the variable scope\",\n\t\t],\n\t},\n\t[RuntimeErrorCode.E2002]: {\n\t\tcode: RuntimeErrorCode.E2002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: (args) => `Type mismatch: expected ${args.expectedType}, got ${args.actualType}`,\n\t\tdescription: \"An operation was performed with incompatible types\",\n\t\tsuggestions: [\"Check the types of the operands\", \"Use type conversion if needed\"],\n\t},\n\t[RuntimeErrorCode.E2003]: {\n\t\tcode: RuntimeErrorCode.E2003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: \"Division by zero\",\n\t\tdescription: \"An attempt was made to divide by zero\",\n\t\tsuggestions: [\"Check the divisor before division\", \"Add a conditional check to prevent division by zero\"],\n\t},\n\t[RuntimeErrorCode.E2004]: {\n\t\tcode: RuntimeErrorCode.E2004,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: (args) => `Function '${args.functionName}' not found`,\n\t\tdescription: \"A function was called but not defined\",\n\t\tsuggestions: [\n\t\t\t\"Check if the function name is spelled correctly\",\n\t\t\t\"Verify the function is defined before use\",\n\t\t\t\"Check if the function is in the correct scope\",\n\t\t],\n\t},\n\t[RuntimeErrorCode.E2005]: {\n\t\tcode: RuntimeErrorCode.E2005,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: (args) => String(args.error || \"Invalid operation\"),\n\t\tdescription: \"An invalid operation was attempted\",\n\t\tsuggestions: [\"Check the operation and its operands\", \"Verify the operation is valid for the given types\"],\n\t},\n};\n","/**\n * Scene error message templates (E5xxx)\n */\n\nimport { SceneErrorCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const sceneMessages: Record<string, MessageTemplate> = {\n\t[SceneErrorCode.E5001]: {\n\t\tcode: SceneErrorCode.E5001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Invalid path: ${args.path}`,\n\t\tdescription: \"An invalid scene path was provided\",\n\t\tsuggestions: [\"Check the path format\", \"Verify the path is valid\"],\n\t},\n\t[SceneErrorCode.E5002]: {\n\t\tcode: SceneErrorCode.E5002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Invalid scene name: ${args.name}`,\n\t\tdescription: \"An invalid scene name was provided\",\n\t\tsuggestions: [\"Check the scene name format\", \"Verify the scene name is valid\"],\n\t},\n\t[SceneErrorCode.E5003]: {\n\t\tcode: SceneErrorCode.E5003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Invalid scene definition for '${args.name}'`,\n\t\tdescription: \"A scene was defined with invalid configuration\",\n\t\tsuggestions: [\"Check the scene definition syntax\", \"Verify all required properties are provided\"],\n\t},\n\t[SceneErrorCode.E5004]: {\n\t\tcode: SceneErrorCode.E5004,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Scene not found: ${args.name}`,\n\t\tdescription: \"A requested scene could not be found\",\n\t\tsuggestions: [\"Check if the scene is registered\", \"Verify the scene name is correct\"],\n\t},\n\t[SceneErrorCode.E5005]: {\n\t\tcode: SceneErrorCode.E5005,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `No route matched for path: ${args.path}`,\n\t\tdescription: \"No scene route matched the provided path\",\n\t\tsuggestions: [\"Check if a route exists for this path\", \"Verify the path format matches the route pattern\"],\n\t},\n\t[SceneErrorCode.E5006]: {\n\t\tcode: SceneErrorCode.E5006,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: \"No scenes registered\",\n\t\tdescription: \"No scenes have been registered in the router\",\n\t\tsuggestions: [\"Register at least one scene before using the router\", \"Check if scene registration is called\"],\n\t},\n\t[SceneErrorCode.E5007]: {\n\t\tcode: SceneErrorCode.E5007,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Scene '${args.name}' has no draw() function`,\n\t\tdescription: \"A scene is missing the required draw function\",\n\t\tsuggestions: [\"Add a draw() function to the scene\", \"Check if the function name is correct\"],\n\t},\n};\n","/**\n * Syntax error message templates (E1xxx)\n */\n\nimport { SyntaxErrorCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const syntaxMessages: Record<string, MessageTemplate> = {\n\t[SyntaxErrorCode.E1001]: {\n\t\tcode: SyntaxErrorCode.E1001,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => {\n\t\t\tif (args.functionName) {\n\t\t\t\treturn `Function '${args.functionName}' started at line ${args.functionStartLine} is not closed`;\n\t\t\t}\n\t\t\treturn `Unterminated '${args.blockType || \"block\"}' ; no matching 'end' found`;\n\t\t},\n\t\tdescription: \"A function or block declaration was started but not properly closed\",\n\t\tsuggestions: (args) => {\n\t\t\tif (args.functionName) {\n\t\t\t\treturn [\n\t\t\t\t\t`Add 'end' after the last statement to close function '${args.functionName}'`,\n\t\t\t\t\t\"Check if you have an extra 'end' statement somewhere\",\n\t\t\t\t\t\"Verify all nested blocks (if, for, while) are properly closed\",\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t`Add 'end' to close the '${args.blockType || \"block\"}' statement`,\n\t\t\t\t\"Check if you have nested blocks that need to be closed first\",\n\t\t\t];\n\t\t},\n\t},\n\t[SyntaxErrorCode.E1002]: {\n\t\tcode: SyntaxErrorCode.E1002,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: \"Too many 'end' statements\",\n\t\tdescription: \"An 'end' keyword was found without a matching opening statement\",\n\t\tsuggestions: [\n\t\t\t\"Remove the extra 'end' statement\",\n\t\t\t\"Check if you have a missing opening statement (if, for, while, function)\",\n\t\t],\n\t},\n\t[SyntaxErrorCode.E1003]: {\n\t\tcode: SyntaxErrorCode.E1003,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: \"Missing 'end' statement\",\n\t\tdescription: \"A block was opened but not closed with 'end'\",\n\t\tsuggestions: [\"Add an 'end' statement to close the block\", \"Check all nested blocks are properly closed\"],\n\t},\n\t[SyntaxErrorCode.E1004]: {\n\t\tcode: SyntaxErrorCode.E1004,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => String(args.error || \"Unexpected token\"),\n\t\tdescription: \"An unexpected token was encountered during parsing\",\n\t\tsuggestions: [\"Check the syntax around this location\", \"Verify you're using the correct syntax for this statement\"],\n\t},\n\t[SyntaxErrorCode.E1005]: {\n\t\tcode: SyntaxErrorCode.E1005,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => `Missing ${args.expected || \"token\"}`,\n\t\tdescription: \"A required token was expected but not found\",\n\t\tsuggestions: [\"Check if you're missing a required keyword or symbol\", \"Verify the syntax is complete\"],\n\t},\n\t[SyntaxErrorCode.E1006]: {\n\t\tcode: SyntaxErrorCode.E1006,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: \"Unexpected end of file\",\n\t\tdescription: \"The file ended while parsing was incomplete\",\n\t\tsuggestions: [\"Check if you're missing a closing statement\", \"Verify all blocks are properly closed\"],\n\t},\n\t[SyntaxErrorCode.E1007]: {\n\t\tcode: SyntaxErrorCode.E1007,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => `Misuse of reserved keyword '${args.keyword}'`,\n\t\tdescription: \"A reserved keyword was used incorrectly\",\n\t\tsuggestions: [\"Use a different identifier name\", \"Check the context where this keyword is used\"],\n\t},\n\t[SyntaxErrorCode.E1008]: {\n\t\tcode: SyntaxErrorCode.E1008,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: \"Unterminated string\",\n\t\tdescription: \"A string literal was started but not closed\",\n\t\tsuggestions: [\"Add a closing quote to terminate the string\", \"Check for escaped quotes within the string\"],\n\t},\n\t[SyntaxErrorCode.E1009]: {\n\t\tcode: SyntaxErrorCode.E1009,\n\t\tseverity: DiagnosticSeverity.Error,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => `Unterminated ${args.type || \"object/array\"}`,\n\t\tdescription: \"An object or array was started but not closed\",\n\t\tsuggestions: [\"Add a closing brace or bracket\", \"Check for nested objects/arrays that need to be closed first\"],\n\t},\n};\n","/**\n * Warning message templates (W1xxx - W5xxx)\n */\n\nimport { WarningCode } from \"../codes\";\nimport { DiagnosticCategory, DiagnosticSeverity, type MessageTemplate } from \"../types\";\n\nexport const warningMessages: Record<string, MessageTemplate> = {\n\t// Syntax Warnings (W1xxx)\n\t[WarningCode.W1001]: {\n\t\tcode: WarningCode.W1001,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: (args) => `Assigning to API variable '${args.variableName}'`,\n\t\tdescription: \"You are modifying a read-only API variable\",\n\t\tsuggestions: [\"Use a local variable instead\", \"Check if you meant to use a different variable\"],\n\t},\n\t[WarningCode.W1002]: {\n\t\tcode: WarningCode.W1002,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Syntax,\n\t\tmessage: \"Assignment used as condition\",\n\t\tdescription: \"An assignment operator (=) was used in a condition instead of comparison (==)\",\n\t\tsuggestions: [\"Use == for comparison instead of =\", \"Check if you meant to assign before comparing\"],\n\t},\n\n\t// Runtime Warnings (W2xxx)\n\t[WarningCode.W2001]: {\n\t\tcode: WarningCode.W2001,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Runtime,\n\t\tmessage: (args) => `Deprecated API usage: ${args.apiName}`,\n\t\tdescription: \"A deprecated API is being used\",\n\t\tsuggestions: [\"Update to the new API\", \"Check the documentation for migration guide\"],\n\t},\n\n\t// Scene Warnings (W5xxx)\n\t[WarningCode.W5001]: {\n\t\tcode: WarningCode.W5001,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `Activating first available scene: ${args.sceneName}`,\n\t\tdescription: \"No route matched, so the first scene was activated\",\n\t\tsuggestions: [\"Register a route for the initial path\", \"Check if the route pattern is correct\"],\n\t},\n\t[WarningCode.W5002]: {\n\t\tcode: WarningCode.W5002,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: (args) => `No route matched initial path, activating first scene: ${args.sceneName}`,\n\t\tdescription: \"The initial path didn't match any route\",\n\t\tsuggestions: [\"Register a route for the initial path\", \"Check if the route pattern matches the initial path\"],\n\t},\n\t[WarningCode.W5003]: {\n\t\tcode: WarningCode.W5003,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: \"No scenes registered. Game may show blank screen.\",\n\t\tdescription: \"No scenes have been registered\",\n\t\tsuggestions: [\"Register at least one scene\", \"Check if scene registration is called\"],\n\t},\n\t[WarningCode.W5004]: {\n\t\tcode: WarningCode.W5004,\n\t\tseverity: DiagnosticSeverity.Warning,\n\t\tcategory: DiagnosticCategory.Scene,\n\t\tmessage: \"No scenes registered. Make sure to call scene() before router.init().\",\n\t\tdescription: \"Router was initialized before any scenes were registered\",\n\t\tsuggestions: [\"Register scenes before calling router.init()\", \"Check the order of initialization\"],\n\t},\n};\n","/**\n * Message templates index - combines all message categories\n */\n\nimport type { MessageTemplate } from \"../types\";\nimport { apiMessages } from \"./api\";\nimport { cliMessages } from \"./cli-messages\";\nimport { compilationMessages } from \"./compilation-messages\";\nimport { runtimeMessages } from \"./runtime-messages\";\nimport { sceneMessages } from \"./scene-messages\";\nimport { syntaxMessages } from \"./syntax-messages\";\nimport { warningMessages } from \"./warning-messages\";\n\n/**\n * All diagnostic message templates combined\n */\nexport const MESSAGES: Record<string, MessageTemplate> = {\n\t...syntaxMessages,\n\t...runtimeMessages,\n\t...compilationMessages,\n\t...sceneMessages,\n\t...cliMessages,\n\t...apiMessages,\n\t...warningMessages,\n};\n\n/**\n * Get a message template for a diagnostic code\n */\nexport function getMessageTemplate(code: string): MessageTemplate | undefined {\n\treturn MESSAGES[code];\n}\n\n/**\n * Format a message from a template with arguments\n */\nexport function formatMessage(code: string, args: Record<string, any> = {}): string {\n\tconst template = getMessageTemplate(code);\n\tif (!template) {\n\t\treturn args.error || args.message || `Unknown error: ${code}`;\n\t}\n\n\tif (typeof template.message === \"string\") {\n\t\treturn template.message;\n\t}\n\n\treturn template.message(args);\n}\n\n/**\n * Get suggestions for a diagnostic code\n */\nexport function getSuggestions(code: string, args: Record<string, any> = {}): string[] {\n\tconst template = getMessageTemplate(code);\n\tif (!template || !template.suggestions) {\n\t\treturn [];\n\t}\n\n\tif (typeof template.suggestions === \"function\") {\n\t\treturn template.suggestions(args);\n\t}\n\n\treturn template.suggestions;\n}\n","/**\n * Diagnostic formatters for different output formats\n *\n * Provides formatting functions for CLI, LSP, Browser console, etc.\n */\n\nimport { formatMessage, getSuggestions } from \"./messages\";\nimport { type Diagnostic, DiagnosticSeverity, type RelatedLocation } from \"./types\";\n\n/**\n * Format diagnostic for CLI output (terminal)\n */\nexport function formatForCLI(diagnostic: Diagnostic): string {\n\tconst lines: string[] = [];\n\tconst code = diagnostic.code || \"\";\n\tconst severity = diagnostic.severity || DiagnosticSeverity.Error;\n\tconst message = diagnostic.message || \"Unknown error\";\n\n\t// Add severity indicator (✗ for errors, ⚠ for warnings)\n\tconst indicator = severity === DiagnosticSeverity.Error ? \"✗\" : \"⚠\";\n\tlines.push(`${indicator} [${code}] ${message}`);\n\n\t// Add file location with line and column numbers\n\tif (diagnostic.file) {\n\t\tlet location = ` at ${diagnostic.file}`;\n\t\tif (diagnostic.line !== undefined) {\n\t\t\tlocation += `:${diagnostic.line}`;\n\t\t\tif (diagnostic.column !== undefined) {\n\t\t\t\tlocation += `:${diagnostic.column}`;\n\t\t\t}\n\t\t}\n\t\tlines.push(location);\n\t}\n\n\t// Add source code context if available\n\tif (diagnostic.context) {\n\t\tlines.push(\"\");\n\t\tlines.push(diagnostic.context);\n\t}\n\n\t// Add actionable suggestions for fixing the error\n\tconst suggestions = diagnostic.suggestions || getSuggestions(code, diagnostic.data);\n\tif (suggestions.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Suggestions:\");\n\t\tfor (const suggestion of suggestions) {\n\t\t\tlines.push(` • ${suggestion}`);\n\t\t}\n\t}\n\n\t// Add related location information if available\n\tif (diagnostic.related) {\n\t\tlines.push(\"\");\n\t\tlines.push(\n\t\t\t`Related: ${diagnostic.related.message} at ${diagnostic.related.file}:${diagnostic.related.line}:${diagnostic.related.column}`,\n\t\t);\n\t}\n\n\t// Add stack trace for runtime errors\n\tif (diagnostic.stackTrace && diagnostic.stackTrace.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Stack trace:\");\n\t\tfor (const frame of diagnostic.stackTrace) {\n\t\t\tconst functionName = frame.functionName || \"<anonymous>\";\n\t\t\tlines.push(` at ${functionName} (${frame.file}:${frame.line}:${frame.column})`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Format diagnostic for Language Server Protocol (LSP)\n */\nexport function formatForLSP(diagnostic: Diagnostic): {\n\trange: {\n\t\tstart: {\n\t\t\tline: number;\n\t\t\tcharacter: number;\n\t\t};\n\t\tend: {\n\t\t\tline: number;\n\t\t\tcharacter: number;\n\t\t};\n\t};\n\tseverity: number;\n\tcode?: string;\n\tsource?: string;\n\tmessage: string;\n\trelatedInformation?: Array<{\n\t\tlocation: {\n\t\t\turi: string;\n\t\t\trange: {\n\t\t\t\tstart: {\n\t\t\t\t\tline: number;\n\t\t\t\t\tcharacter: number;\n\t\t\t\t};\n\t\t\t\tend: {\n\t\t\t\t\tline: number;\n\t\t\t\t\tcharacter: number;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\tmessage: string;\n\t}>;\n} {\n\tconst line = Math.max(0, (diagnostic.line || 1) - 1); // Convert 1-based to 0-based\n\tconst column = Math.max(0, (diagnostic.column || 1) - 1); // Convert 1-based to 0-based\n\tconst length = diagnostic.length || 1;\n\tconst endColumn = column + length;\n\n\t// Map diagnostic severity to LSP severity levels\n\tlet lspSeverity: number;\n\tswitch (diagnostic.severity) {\n\t\tcase DiagnosticSeverity.Error:\n\t\t\tlspSeverity = 1; // Error\n\t\t\tbreak;\n\t\tcase DiagnosticSeverity.Warning:\n\t\t\tlspSeverity = 2; // Warning\n\t\t\tbreak;\n\t\tcase DiagnosticSeverity.Info:\n\t\t\tlspSeverity = 3; // Information\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlspSeverity = 1;\n\t}\n\n\tconst result: any = {\n\t\trange: {\n\t\t\tstart: {\n\t\t\t\tline,\n\t\t\t\tcharacter: column,\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tline,\n\t\t\t\tcharacter: endColumn,\n\t\t\t},\n\t\t},\n\t\tseverity: lspSeverity,\n\t\tmessage: diagnostic.message || \"Unknown error\",\n\t\tsource: \"l8b\",\n\t};\n\n\tif (diagnostic.code) {\n\t\tresult.code = diagnostic.code;\n\t}\n\n\t// Collect related information for LSP diagnostic\n\tconst relatedInformation: any[] = [];\n\n\t// Include related location if provided\n\tif (diagnostic.related) {\n\t\trelatedInformation.push({\n\t\t\tlocation: {\n\t\t\t\turi: diagnostic.related.file,\n\t\t\t\trange: {\n\t\t\t\t\tstart: {\n\t\t\t\t\t\tline: diagnostic.related.line - 1,\n\t\t\t\t\t\tcharacter: diagnostic.related.column - 1,\n\t\t\t\t\t},\n\t\t\t\t\tend: {\n\t\t\t\t\t\tline: diagnostic.related.line - 1,\n\t\t\t\t\t\tcharacter: diagnostic.related.column + 10,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tmessage: diagnostic.related.message || \"Related location\",\n\t\t});\n\t}\n\n\t// Include first suggestion as related information with lightbulb icon\n\tconst suggestions = diagnostic.suggestions || getSuggestions(diagnostic.code || \"\", diagnostic.data);\n\tif (suggestions.length > 0) {\n\t\trelatedInformation.push({\n\t\t\tlocation: {\n\t\t\t\turi: diagnostic.file || \"\",\n\t\t\t\trange: {\n\t\t\t\t\tstart: {\n\t\t\t\t\t\tline,\n\t\t\t\t\t\tcharacter: column,\n\t\t\t\t\t},\n\t\t\t\t\tend: {\n\t\t\t\t\t\tline,\n\t\t\t\t\t\tcharacter: endColumn,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tmessage: `💡 ${suggestions[0]}`,\n\t\t});\n\t}\n\n\tif (relatedInformation.length > 0) {\n\t\tresult.relatedInformation = relatedInformation;\n\t}\n\n\treturn result;\n}\n\n/**\n * Format diagnostic for browser console\n */\nexport function formatForBrowser(diagnostic: Diagnostic): string {\n\tconst code = diagnostic.code || \"\";\n\tconst message = diagnostic.message || \"Unknown error\";\n\n\t// Build message with code\n\tlet formatted = \"\";\n\tif (code) {\n\t\tformatted += `[${code}] `;\n\t}\n\tformatted += message;\n\n\t// Add location\n\tif (diagnostic.file) {\n\t\tformatted += `\\n at ${diagnostic.file}`;\n\t\tif (diagnostic.line !== undefined) {\n\t\t\tformatted += `:${diagnostic.line}`;\n\t\t\tif (diagnostic.column !== undefined) {\n\t\t\t\tformatted += `:${diagnostic.column}`;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add context\n\tif (diagnostic.context) {\n\t\tformatted += `\\n\\n${diagnostic.context}`;\n\t}\n\n\t// Add suggestions\n\tconst suggestions = diagnostic.suggestions || getSuggestions(code, diagnostic.data);\n\tif (suggestions.length > 0) {\n\t\tformatted += \"\\n\\nSuggestions:\";\n\t\tfor (const suggestion of suggestions) {\n\t\t\tformatted += `\\n • ${suggestion}`;\n\t\t}\n\t}\n\n\t// Add related location\n\tif (diagnostic.related) {\n\t\tformatted += `\\n\\nRelated: ${diagnostic.related.message} at ${diagnostic.related.file}:${diagnostic.related.line}:${diagnostic.related.column}`;\n\t}\n\n\t// Add stack trace\n\tif (diagnostic.stackTrace && diagnostic.stackTrace.length > 0) {\n\t\tformatted += \"\\n\\nStack trace:\";\n\t\tfor (const frame of diagnostic.stackTrace) {\n\t\t\tconst functionName = frame.functionName || \"<anonymous>\";\n\t\t\tformatted += `\\n at ${functionName} (${frame.file}:${frame.line}:${frame.column})`;\n\t\t}\n\t}\n\n\treturn formatted;\n}\n\n/**\n * Report a runtime error through the listener chain.\n * Consolidates the repeated createDiagnostic + formatForBrowser + reportError pattern\n * used across core packages.\n */\nexport function reportRuntimeError(\n\tlistener: { reportError?: (msg: string) => void } | undefined,\n\tcode: string,\n\tdata?: Record<string, unknown>,\n): void {\n\tconst diagnostic = createDiagnostic(code, { data });\n\tconst formatted = formatForBrowser(diagnostic);\n\tlistener?.reportError?.(formatted);\n}\n\n/**\n * Format diagnostic as a simple string (for logging)\n */\nexport function formatSimple(diagnostic: Diagnostic): string {\n\tconst code = diagnostic.code || \"\";\n\tconst message = diagnostic.message || \"Unknown error\";\n\tconst location = diagnostic.file ? ` at ${diagnostic.file}${diagnostic.line ? `:${diagnostic.line}` : \"\"}` : \"\";\n\n\treturn `[${code}] ${message}${location}`;\n}\n\n/**\n * Create a diagnostic object from code and arguments\n */\nexport function createDiagnostic(\n\tcode: string,\n\targs: {\n\t\tfile?: string;\n\t\tline?: number;\n\t\tcolumn?: number;\n\t\tlength?: number;\n\t\tcontext?: string;\n\t\tsuggestions?: string[];\n\t\trelated?: RelatedLocation;\n\t\tstackTrace?: Array<{\n\t\t\tfunctionName: string;\n\t\t\tfile: string;\n\t\t\tline: number;\n\t\t\tcolumn: number;\n\t\t}>;\n\t\tdata?: Record<string, unknown>;\n\t} = {},\n): Diagnostic {\n\tconst message = formatMessage(code, {\n\t\t...args,\n\t\t...args.data,\n\t});\n\tconst suggestions =\n\t\targs.suggestions ||\n\t\tgetSuggestions(code, {\n\t\t\t...args,\n\t\t\t...args.data,\n\t\t});\n\n\treturn {\n\t\tcode,\n\t\tseverity: code.startsWith(\"E\") ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning,\n\t\tmessage,\n\t\tfile: args.file,\n\t\tline: args.line,\n\t\tcolumn: args.column,\n\t\tlength: args.length,\n\t\tcontext: args.context,\n\t\tsuggestions,\n\t\trelated: args.related,\n\t\tstackTrace: args.stackTrace,\n\t\tdata: args.data,\n\t};\n}\n","/**\n * AudioCore - Web Audio API wrapper\n * Manages audio context, beeper, and sound/music playback\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { Beeper } from \"../devices/beeper\";\nimport { AUDIO_WORKLET_CODE } from \"./audio-worklet\";\n\n/** An actively playing sound/music that can be stopped */\ninterface PlayingHandle {\n\tstop: () => void;\n}\n\n/** Item that can be woken up on audio context activation */\ninterface WakeUpItem {\n\twakeUp: () => void;\n}\n\nexport class AudioCore {\n\tpublic context!: AudioContext;\n\tprivate buffer: string[] = [];\n\tprivate playing: PlayingHandle[] = [];\n\tprivate wakeupList: WakeUpItem[] = [];\n\tprivate workletNode?: AudioWorkletNode;\n\tprivate beeper?: Beeper;\n\tprivate runtime: any;\n\tprivate masterVolume: number = 1;\n\n\tconstructor(runtime: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.getContext();\n\t}\n\n\t/**\n\t * Check if audio context is running\n\t */\n\tpublic isStarted(): boolean {\n\t\treturn this.context.state === \"running\";\n\t}\n\n\t/**\n\t * Add item to wakeup list (for mobile audio activation)\n\t */\n\tpublic addToWakeUpList(item: WakeUpItem): void {\n\t\tthis.wakeupList.push(item);\n\t}\n\n\tprivate interfaceCache: Record<string, any> | null = null;\n\n\t/**\n\t * Set master volume (0-1). Applied as a multiplier to all sound/music playback.\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tthis.masterVolume = Math.max(0, Math.min(1, volume));\n\t}\n\n\t/**\n\t * Get current master volume (0-1)\n\t */\n\tpublic getVolume(): number {\n\t\treturn this.masterVolume;\n\t}\n\n\t/**\n\t * Get interface for game code\n\t */\n\tpublic getInterface() {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\t\tthis.interfaceCache = {\n\t\t\tbeep: (sequence: string) => this.beep(sequence),\n\t\t\tcancelBeeps: () => this.cancelBeeps(),\n\t\t\tplaySound: (sound: any, volume?: number, pitch?: number, pan?: number, loopit?: boolean) =>\n\t\t\t\tthis.playSound(sound, volume, pitch, pan, loopit),\n\t\t\tplayMusic: (music: any, volume?: number, loopit?: boolean) => this.playMusic(music, volume, loopit),\n\t\t\tsetVolume: (volume: number) => this.setVolume(volume),\n\t\t\tgetVolume: () => this.getVolume(),\n\t\t\tstopAll: () => this.stopAll(),\n\t\t};\n\t\treturn this.interfaceCache;\n\t}\n\n\t/**\n\t * Play sound effect\n\t */\n\tpublic playSound(sound: any, volume: number = 1, pitch: number = 1, pan: number = 0, loopit: boolean = false): number {\n\t\tif (typeof sound === \"string\") {\n\t\t\tconst soundName = sound.replace(/\\//g, \"-\");\n\t\t\tconst s = this.runtime.sounds[soundName];\n\t\t\tif (!s) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7013, { soundName });\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn s.play(volume * this.masterVolume, pitch, pan, loopit);\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Play music\n\t */\n\tpublic playMusic(music: any, volume: number = 1, loopit: boolean = false): number {\n\t\tif (typeof music === \"string\") {\n\t\t\tconst musicName = music.replace(/\\//g, \"-\");\n\t\t\tconst m = this.runtime.music[musicName];\n\t\t\tif (!m) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7014, { musicName });\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn m.play(volume * this.masterVolume, loopit);\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Get or create audio context (lazy initialization - created on first use)\n\t * Note: Browser may suspend context until user interaction, which is handled automatically\n\t */\n\tpublic getContext(): AudioContext {\n\t\tif (!this.context) {\n\t\t\tconst AudioContextClass = (window as any).AudioContext || (window as any).webkitAudioContext;\n\t\t\t// Create context - browser may suspend until user interaction\n\t\t\tthis.context = new AudioContextClass();\n\n\t\t\t// If context is suspended, set up activation listeners\n\t\t\tif (this.context.state !== \"running\") {\n\t\t\t\tconst activate = () => {\n\t\t\t\t\tif (this.context && this.context.state !== \"running\") {\n\t\t\t\t\t\tthis.context.resume();\n\t\t\t\t\t\tif (this.beeper) {\n\t\t\t\t\t\t\tthis.start();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of this.wakeupList) {\n\t\t\t\t\t\t\titem.wakeUp();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Clean up listeners\n\t\t\t\t\t\tdocument.body.removeEventListener(\"touchend\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"mouseup\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"click\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"keydown\", activate);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Add multiple event listeners for better compatibility\n\t\t\t\tdocument.body.addEventListener(\"touchend\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"mouseup\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"click\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"keydown\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t} else if (this.beeper) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t}\n\n\t\treturn this.context;\n\t}\n\n\t/**\n\t * Start audio processor\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (this.workletNode) return;\n\n\t\ttry {\n\t\t\tconst blob = new Blob([AUDIO_WORKLET_CODE], {\n\t\t\t\ttype: \"application/javascript\",\n\t\t\t});\n\t\t\tconst url = URL.createObjectURL(blob);\n\n\t\t\tawait this.context.audioWorklet.addModule(url);\n\n\t\t\tthis.workletNode = new AudioWorkletNode(this.context, \"l8b-audio-processor\");\n\t\t\tthis.workletNode.connect(this.context.destination);\n\n\t\t\tthis.flushBuffer();\n\t\t} catch (e) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7012, { error: String(e) });\n\t\t}\n\t}\n\n\t/**\n\t * Flush buffered messages\n\t */\n\tprivate flushBuffer(): void {\n\t\tif (!this.workletNode) return;\n\n\t\twhile (this.buffer.length > 0) {\n\t\t\tthis.workletNode.port.postMessage(this.buffer.splice(0, 1)[0]);\n\t\t}\n\t}\n\n\t/**\n\t * Get or create beeper\n\t */\n\tpublic getBeeper(): Beeper {\n\t\tif (!this.beeper) {\n\t\t\t// Create Beeper instance\n\t\t\tthis.beeper = new Beeper(this);\n\n\t\t\tif (this.context.state === \"running\") {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t}\n\t\treturn this.beeper;\n\t}\n\n\t/**\n\t * Play beep sequence\n\t */\n\tpublic beep(sequence: string): void {\n\t\tthis.getBeeper().beep(sequence);\n\t}\n\n\t/**\n\t * Add beeps to audio processor\n\t */\n\tpublic addBeeps(beeps: any[]): void {\n\t\tfor (const b of beeps) {\n\t\t\tb.duration *= this.context.sampleRate;\n\t\t\tb.increment = b.frequency / this.context.sampleRate;\n\t\t}\n\n\t\tif (this.workletNode) {\n\t\t\tthis.workletNode.port.postMessage(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"beep\",\n\t\t\t\t\tsequence: beeps,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.buffer.push(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"beep\",\n\t\t\t\t\tsequence: beeps,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Cancel all beeps\n\t */\n\tpublic cancelBeeps(): void {\n\t\tif (this.workletNode) {\n\t\t\tthis.workletNode.port.postMessage(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"cancel_beeps\",\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.buffer.push(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"cancel_beeps\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tthis.stopAll();\n\t}\n\n\t/**\n\t * Add playing sound/music to list\n\t */\n\tpublic addPlaying(item: PlayingHandle): void {\n\t\tthis.playing.push(item);\n\t}\n\n\t/**\n\t * Remove playing sound/music from list\n\t */\n\tpublic removePlaying(item: PlayingHandle): void {\n\t\tconst index = this.playing.indexOf(item);\n\t\tif (index >= 0) {\n\t\t\tthis.playing.splice(index, 1);\n\t\t}\n\t}\n\n\t/**\n\t * Stop all playing sounds/music\n\t */\n\tpublic stopAll(): void {\n\t\tfor (const p of this.playing) {\n\t\t\ttry {\n\t\t\t\tp.stop();\n\t\t\t} catch (err) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7016, { error: String(err) });\n\t\t\t}\n\t\t}\n\t\tthis.playing = [];\n\t}\n}\n","/** A4 reference frequency in Hz (concert pitch) */\nexport const A4_FREQUENCY = 440;\n\n/** Ratio between adjacent semitones in equal temperament */\nexport const SEMITONE_RATIO = 2 ** (1 / 12);\n\n/** MIDI note number for A4 */\nexport const A4_MIDI_NOTE = 69;\n","/**\n * Beeper - Procedural sound generation from text sequences\n * Converts music notation strings into beep sequences\n * Example: \"square tempo 120 C4 D4 E4 F4\"\n */\nimport { A4_FREQUENCY, A4_MIDI_NOTE, SEMITONE_RATIO } from \"../constants\";\nexport class Beeper {\n\tprivate audio: any;\n\tprivate notes: Record<string | number, number> = {};\n\tprivate plainNotes: Record<string, number> = {};\n\tprivate currentOctave = 5;\n\tprivate currentDuration = 0.5;\n\tprivate currentVolume = 0.5;\n\tprivate currentSpan = 1;\n\tprivate currentWaveform = \"square\";\n\n\tconstructor(audio: any) {\n\t\tthis.audio = audio;\n\t\tthis.initializeNotes();\n\t}\n\n\t/**\n\t * Initialize note mappings\n\t */\n\tprivate initializeNotes(): void {\n\t\tconst noteNames = [\n\t\t\t[\"C\", \"DO\"],\n\t\t\t[\"C#\", \"DO#\", \"Db\", \"REb\"],\n\t\t\t[\"D\", \"RE\"],\n\t\t\t[\"D#\", \"RE#\", \"Eb\", \"MIb\"],\n\t\t\t[\"E\", \"MI\"],\n\t\t\t[\"F\", \"FA\"],\n\t\t\t[\"F#\", \"FA#\", \"Gb\", \"SOLb\"],\n\t\t\t[\"G\", \"SOL\"],\n\t\t\t[\"G#\", \"SOL#\", \"Ab\", \"LAb\"],\n\t\t\t[\"A\", \"LA\"],\n\t\t\t[\"A#\", \"LA#\", \"Bb\", \"SIb\"],\n\t\t\t[\"B\", \"SI\"],\n\t\t];\n\n\t\tfor (let i = 0; i <= 127; i++) {\n\t\t\tthis.notes[i] = i;\n\t\t\tconst oct = Math.floor(i / 12) - 1;\n\n\t\t\tfor (const n of noteNames[i % 12]) {\n\t\t\t\tthis.notes[n + oct] = i;\n\t\t\t}\n\n\t\t\tif (oct === -1) {\n\t\t\t\tfor (const n of noteNames[i % 12]) {\n\t\t\t\t\tthis.plainNotes[n] = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse and play beep sequence\n\t */\n\tpublic beep(input: string): void {\n\t\tlet status: string = \"normal\";\n\t\tconst sequence: any[] = [];\n\t\tconst loops: any[] = [];\n\t\tlet note: number | undefined;\n\n\t\tconst parsed = input.split(\" \");\n\n\t\tfor (const t of parsed) {\n\t\t\tif (t === \"\") continue;\n\n\t\t\tswitch (status) {\n\t\t\t\tcase \"normal\":\n\t\t\t\t\tif (this.notes[t] !== undefined) {\n\t\t\t\t\t\t// Full note with octave (e.g., \"C4\")\n\t\t\t\t\t\tnote = this.notes[t];\n\t\t\t\t\t\tthis.currentOctave = Math.floor(note / 12);\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (note - A4_MIDI_NOTE),\n\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (this.plainNotes[t] !== undefined) {\n\t\t\t\t\t\t// Note without octave (e.g., \"C\")\n\t\t\t\t\t\tnote = this.plainNotes[t] + this.currentOctave * 12;\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (note - A4_MIDI_NOTE),\n\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if ([\"square\", \"sine\", \"saw\", \"noise\"].includes(t)) {\n\t\t\t\t\t\t// Waveform\n\t\t\t\t\t\tthis.currentWaveform = t;\n\t\t\t\t\t} else if ([\"tempo\", \"duration\", \"volume\", \"span\", \"loop\", \"to\"].includes(t)) {\n\t\t\t\t\t\t// Commands\n\t\t\t\t\t\tstatus = t;\n\t\t\t\t\t} else if (t === \"-\") {\n\t\t\t\t\t\t// Rest/silence\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\t\t\t\tvolume: 0,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (t === \"end\") {\n\t\t\t\t\t\t// End loop\n\t\t\t\t\t\tif (loops.length > 0 && sequence.length > 0) {\n\t\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\t\t\t\t\tvolume: 0,\n\t\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst lop = loops.splice(loops.length - 1, 1)[0];\n\t\t\t\t\t\t\tsequence[sequence.length - 1].loopto = lop.start;\n\t\t\t\t\t\t\tsequence[sequence.length - 1].repeats = lop.repeats;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"tempo\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst tempo = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(tempo) && tempo > 0) {\n\t\t\t\t\t\tthis.currentDuration = 60 / tempo;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"duration\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst duration = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(duration) && duration > 0) {\n\t\t\t\t\t\tthis.currentDuration = duration / 1000;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"volume\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst volume = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(volume)) {\n\t\t\t\t\t\tthis.currentVolume = volume / 100;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"span\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst span = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(span)) {\n\t\t\t\t\t\tthis.currentSpan = span / 100;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"loop\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tloops.push({\n\t\t\t\t\t\tstart: sequence.length,\n\t\t\t\t\t});\n\t\t\t\t\tconst repeats = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(repeats)) {\n\t\t\t\t\t\tloops[loops.length - 1].repeats = repeats;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"to\":\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tif (note !== undefined) {\n\t\t\t\t\t\tlet n: number | undefined;\n\n\t\t\t\t\t\tif (this.notes[t] !== undefined) {\n\t\t\t\t\t\t\tn = this.notes[t];\n\t\t\t\t\t\t} else if (this.plainNotes[t] !== undefined) {\n\t\t\t\t\t\t\tn = this.plainNotes[t] + this.currentOctave * 12;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (n !== undefined && n !== note) {\n\t\t\t\t\t\t\t// Generate slide from note to n\n\t\t\t\t\t\t\tconst step = n > note ? 1 : -1;\n\t\t\t\t\t\t\tfor (let i = note + step; step > 0 ? i <= n : i >= n; i += step) {\n\t\t\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (i - A4_MIDI_NOTE),\n\t\t\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnote = n;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Close any remaining loops\n\t\tif (loops.length > 0 && sequence.length > 0) {\n\t\t\tconst lop = loops.splice(loops.length - 1, 1)[0];\n\t\t\tsequence.push({\n\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\tvolume: 0,\n\t\t\t\tspan: this.currentSpan,\n\t\t\t\tduration: 0,\n\t\t\t\twaveform: this.currentWaveform,\n\t\t\t});\n\n\t\t\tsequence[sequence.length - 1].loopto = lop.start;\n\t\t\tsequence[sequence.length - 1].repeats = lop.repeats;\n\t\t}\n\n\t\tthis.audio.addBeeps(sequence);\n\t}\n}\n","export const AUDIO_WORKLET_CODE = `\nclass L8bAudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.beeps = [];\n this.last = 0;\n this.port.onmessage = (event) => {\n const data = JSON.parse(event.data);\n if (data.name === \"cancel_beeps\") {\n this.beeps = [];\n } else if (data.name === \"beep\") {\n const seq = data.sequence;\n // Link sequence notes together\n for (let i = 0; i < seq.length; i++) {\n const note = seq[i];\n if (i > 0) {\n seq[i - 1].next = note;\n }\n // Resolve loopto index to actual note reference\n if (note.loopto != null) {\n note.loopto = seq[note.loopto];\n }\n // Initialize phase and time\n note.phase = 0;\n note.time = 0;\n }\n // Add first note to beeps queue\n if (seq.length > 0) {\n this.beeps.push(seq[0]);\n }\n }\n };\n }\n\n process(inputs, outputs, parameters) {\n const output = outputs[0];\n \n for (let i = 0; i < output.length; i++) {\n const channel = output[i];\n \n if (i > 0) {\n // Copy first channel to other channels\n for (let j = 0; j < channel.length; j++) {\n channel[j] = output[0][j];\n }\n } else {\n // Generate audio for first channel\n for (let j = 0; j < channel.length; j++) {\n let sig = 0;\n \n for (let k = this.beeps.length - 1; k >= 0; k--) {\n const b = this.beeps[k];\n let volume = b.volume;\n \n if (b.time / b.duration > b.span) {\n volume = 0;\n }\n \n // Generate waveform\n switch (b.waveform) {\n case \"square\":\n sig += b.phase > 0.5 ? volume : -volume;\n break;\n case \"saw\":\n sig += (b.phase * 2 - 1) * volume;\n break;\n case \"noise\":\n sig += (Math.random() * 2 - 1) * volume;\n break;\n default: // sine\n sig += Math.sin(b.phase * Math.PI * 2) * volume;\n }\n \n b.phase = (b.phase + b.increment) % 1;\n b.time += 1;\n \n if (b.time >= b.duration) {\n b.time = 0;\n \n if (b.loopto != null) {\n if (b.repeats != null && b.repeats > 0) {\n if (b.loopcount == null) {\n b.loopcount = 0;\n }\n b.loopcount++;\n \n if (b.loopcount >= b.repeats) {\n b.loopcount = 0;\n if (b.next != null) {\n b.next.phase = b.phase;\n this.beeps[k] = b.next;\n } else {\n this.beeps.splice(k, 1);\n }\n } else {\n b.loopto.phase = b.phase;\n this.beeps[k] = b.loopto;\n }\n } else {\n b.loopto.phase = b.phase;\n this.beeps[k] = b.loopto;\n }\n } else if (b.next != null) {\n b.next.phase = b.phase;\n this.beeps[k] = b.next;\n } else {\n this.beeps.splice(k, 1);\n }\n }\n }\n \n this.last = this.last * 0.9 + sig * 0.1;\n channel[j] = this.last;\n }\n }\n }\n \n return true;\n }\n}\n\nregisterProcessor(\"l8b-audio-processor\", L8bAudioProcessor);\n`;\n","/**\n * Music - Music streaming and playback using HTML5 Audio\n * L8B Music class for LootiScript\n */\nexport class Music {\n\tpublic ready: number = 1;\n\tpublic name: string = \"\";\n\tpublic url: string;\n\tpublic tag: HTMLAudioElement;\n\tpublic playing: boolean = false;\n\tprivate audio: any;\n\n\tconstructor(audio: any, url: string) {\n\t\tthis.audio = audio;\n\t\tthis.url = url;\n\t\tthis.tag = new Audio(this.url);\n\t\tthis.ready = 1;\n\t}\n\n\t/**\n\t * Play music with volume and loop (HTML5 Audio implementation)\n\t */\n\tpublic play(volume: number = 1, loopit: boolean = false): any {\n\t\tthis.playing = true;\n\t\tthis.tag.loop = !!loopit;\n\t\tthis.tag.volume = Math.max(0, Math.min(1, volume));\n\n\t\tif (this.audio.isStarted()) {\n\t\t\tthis.tag.play();\n\t\t} else {\n\t\t\tthis.audio.addToWakeUpList(this);\n\t\t}\n\n\t\tthis.audio.addPlaying(this);\n\n\t\treturn {\n\t\t\tplay: () => {\n\t\t\t\treturn this.tag.play();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\tthis.playing = false;\n\t\t\t\tthis.tag.pause();\n\t\t\t\tthis.audio.removePlaying(this);\n\t\t\t},\n\t\t\tsetVolume: (v: number) => {\n\t\t\t\tthis.tag.volume = Math.max(0, Math.min(1, v));\n\t\t\t},\n\t\t\tgetPosition: () => {\n\t\t\t\treturn this.tag.currentTime;\n\t\t\t},\n\t\t\tgetDuration: () => {\n\t\t\t\treturn this.tag.duration;\n\t\t\t},\n\t\t\tsetPosition: (pos: number) => {\n\t\t\t\tthis.tag.pause();\n\t\t\t\tthis.tag.currentTime = Math.max(0, Math.min(this.tag.duration, pos));\n\t\t\t\tif (this.playing) {\n\t\t\t\t\tthis.tag.play();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wake up audio (for autoplay policy)\n\t */\n\tpublic wakeUp(): void {\n\t\tif (this.playing) {\n\t\t\tthis.tag.play();\n\t\t}\n\t}\n\n\t/**\n\t * Stop music\n\t */\n\tpublic stop(): void {\n\t\tthis.playing = false;\n\t\tthis.tag.pause();\n\t\tthis.audio.removePlaying(this);\n\t}\n}\n","/**\n * Sound - Sound effect playback\n * Handles loading and playing audio buffers\n */\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\n\nexport class Sound {\n\tpublic ready: number = 0;\n\tpublic buffer?: AudioBuffer;\n\tpublic name: string = \"\";\n\tpublic url: string;\n\tprivate audio: any;\n\n\tconstructor(audio: any, url: string | AudioBuffer) {\n\t\tthis.audio = audio;\n\n\t\tif (url instanceof AudioBuffer) {\n\t\t\tthis.buffer = url;\n\t\t\tthis.url = \"\";\n\t\t\tthis.ready = 1;\n\t\t} else {\n\t\t\tthis.url = url;\n\t\t\tthis.loadSound(url);\n\t\t}\n\t}\n\n\t/**\n\t * Load sound from URL\n\t */\n\tprivate loadSound(url: string): void {\n\t\tconst request = new XMLHttpRequest();\n\t\trequest.open(\"GET\", url, true);\n\t\trequest.responseType = \"arraybuffer\";\n\n\t\trequest.onload = () => {\n\t\t\tthis.audio.context.decodeAudioData(\n\t\t\t\trequest.response,\n\t\t\t\t(buffer: AudioBuffer) => {\n\t\t\t\t\tthis.buffer = buffer;\n\t\t\t\t\tthis.ready = 1;\n\t\t\t\t},\n\t\t\t\t(err: any) => {\n\t\t\t\t\treportRuntimeError(this.audio?.runtime?.listener, APIErrorCode.E7016, {\n\t\t\t\t\t\terror: `Audio decoding failed: ${String(err)}`,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\trequest.onerror = () => {\n\t\t\treportRuntimeError(this.audio?.runtime?.listener, APIErrorCode.E7016, {\n\t\t\t\terror: `Failed to load sound: ${url}`,\n\t\t\t});\n\t\t};\n\n\t\trequest.send();\n\t}\n\n\t/**\n\t * Play sound with volume, pitch, pan, and loop\n\t */\n\tpublic play(volume: number = 1, pitch: number = 1, pan: number = 0, loopit: boolean = false): any {\n\t\tif (!this.buffer)\n\t\t\treturn {\n\t\t\t\tstop: () => {},\n\t\t\t\tfinished: true,\n\t\t\t};\n\n\t\tconst context = this.audio.context;\n\n\t\t// Create source\n\t\tconst source = context.createBufferSource();\n\t\tsource.playbackRate.value = pitch;\n\t\tsource.buffer = this.buffer;\n\t\tif (loopit) source.loop = true;\n\n\t\t// Create gain node\n\t\tconst gain = context.createGain();\n\t\tgain.gain.value = volume;\n\n\t\t// Create panner\n\t\tconst panner: any = context.createPanner();\n\t\tpanner.panningModel = \"equalpower\";\n\t\tpanner.setPan = (p: number) => {\n\t\t\tpanner.setPosition(p, 0, 1 - Math.abs(p));\n\t\t};\n\t\tpanner.setPan(pan);\n\n\t\t// Connect nodes\n\t\tsource.connect(gain);\n\t\tgain.connect(panner);\n\t\tpanner.connect(context.destination);\n\n\t\t// Start playback\n\t\tsource.start();\n\n\t\t// Track playing sounds for looping\n\t\tlet playing: any = null;\n\t\tif (loopit) {\n\t\t\tplaying = {\n\t\t\t\tstop: () => {\n\t\t\t\t\tsource.stop();\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis.audio.addPlaying(playing);\n\t\t}\n\n\t\t// Return control interface\n\t\tconst res = {\n\t\t\tstop: () => {\n\t\t\t\tsource.stop();\n\t\t\t\tif (playing) this.audio.removePlaying(playing);\n\t\t\t\treturn 1;\n\t\t\t},\n\t\t\tsetVolume: (v: number) => {\n\t\t\t\tgain.gain.value = Math.max(0, Math.min(1, v));\n\t\t\t},\n\t\t\tsetPitch: (p: number) => {\n\t\t\t\tsource.playbackRate.value = Math.max(0.001, Math.min(1000, p));\n\t\t\t},\n\t\t\tsetPan: (p: number) => {\n\t\t\t\tpanner.setPan(Math.max(-1, Math.min(1, p)));\n\t\t\t},\n\t\t\tgetDuration: () => {\n\t\t\t\treturn source.buffer ? source.buffer.duration : 0;\n\t\t\t},\n\t\t\tfinished: false,\n\t\t};\n\n\t\tsource.onended = () => {\n\t\t\tres.finished = true;\n\t\t};\n\n\t\treturn res;\n\t}\n\n\t/**\n\t * Create MicroSound class for procedural sound generation\n\t */\n\tpublic static createSoundClass(audiocore: any): any {\n\t\treturn class MicroSound {\n\t\t\tpublic static classname = \"Sound\";\n\t\t\tpublic channels: number;\n\t\t\tpublic length: number;\n\t\t\tpublic sampleRate: number;\n\t\t\tprivate sound: Sound;\n\t\t\tprivate buffer: AudioBuffer;\n\n\t\t\tconstructor(channels: number, length: number, sampleRate: number = 44100) {\n\t\t\t\t// Validate parameters\n\t\t\t\tchannels = channels === 1 ? 1 : 2;\n\t\t\t\tif (!(length > 1 && length < 44100 * 1000)) {\n\t\t\t\t\tlength = 44100;\n\t\t\t\t}\n\t\t\t\tif (!(sampleRate >= 8000 && sampleRate <= 96000)) {\n\t\t\t\t\tsampleRate = 44100;\n\t\t\t\t}\n\n\t\t\t\tthis.channels = channels;\n\t\t\t\tthis.length = length;\n\t\t\t\tthis.sampleRate = sampleRate;\n\n\t\t\t\t// Create audio buffer\n\t\t\t\tthis.buffer = audiocore.context.createBuffer(channels, length, sampleRate);\n\t\t\t\tthis.sound = new Sound(audiocore, this.buffer);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Play the sound\n\t\t\t */\n\t\t\tpublic play(volume?: number, pitch?: number, pan?: number, loopit?: boolean): any {\n\t\t\t\treturn this.sound.play(volume, pitch, pan, loopit);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Write sample value to buffer\n\t\t\t */\n\t\t\tpublic write(channel: number, position: number, value: number): void {\n\t\t\t\tif (channel === 0) {\n\t\t\t\t\tconst ch1 = this.buffer.getChannelData(0);\n\t\t\t\t\tch1[position] = value;\n\t\t\t\t} else if (this.channels === 2) {\n\t\t\t\t\tconst ch2 = this.buffer.getChannelData(1);\n\t\t\t\t\tch2[position] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Read sample value from buffer\n\t\t\t */\n\t\t\tpublic read(channel: number, position: number): number {\n\t\t\t\tif (channel === 0) {\n\t\t\t\t\tconst ch1 = this.buffer.getChannelData(0);\n\t\t\t\t\treturn ch1[position];\n\t\t\t\t} else if (this.channels === 2) {\n\t\t\t\t\tconst ch2 = this.buffer.getChannelData(1);\n\t\t\t\t\treturn ch2[position];\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t};\n\t}\n}\n","/**\n * TileMap - Tile-based map implementation with sprite rendering support.\n */\n\nimport { APIErrorCode, createDiagnostic, formatForBrowser } from \"@al8b/diagnostics\";\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { MapData, ParsedTile, SpriteDictionary } from \"../data/types\";\nimport { drawTile, ensureCanvas, queueAnimatedTile, type RenderState, renderAnimatedTiles } from \"../drawing/renderer\";\nimport { normalizeRefForStorage, normalizeRefForUsage } from \"../shared/references\";\n\n/**\n * Parse a tile reference string into a cached ParsedTile object.\n * Input format: \"spriteName\" or \"spriteName:subX,subY\"\n */\nfunction parseTileRef(entry: string): ParsedTile {\n\tconst colonIdx = entry.indexOf(\":\");\n\tif (colonIdx === -1) {\n\t\treturn { spriteName: entry };\n\t}\n\tconst spriteName = entry.substring(0, colonIdx);\n\tconst coords = entry.substring(colonIdx + 1);\n\tconst commaIdx = coords.indexOf(\",\");\n\tif (commaIdx === -1) {\n\t\treturn { spriteName, subX: Number.parseInt(coords, 10) };\n\t}\n\treturn {\n\t\tspriteName,\n\t\tsubX: Number.parseInt(coords.substring(0, commaIdx), 10),\n\t\tsubY: Number.parseInt(coords.substring(commaIdx + 1), 10),\n\t};\n}\n\nexport class TileMap {\n\tpublic width: number;\n\tpublic height: number;\n\tpublic block_width: number;\n\tpublic block_height: number;\n\tpublic sprites: SpriteDictionary;\n\tpublic map: (string | null)[] = [];\n\tpublic ready = true;\n\tpublic needs_update = false;\n\tpublic name = \"\";\n\tprivate parsedMap: (ParsedTile | null)[] = [];\n\tprivate readonly renderState: RenderState = {\n\t\tcanvas: null,\n\t\tbuffer: null,\n\t\tanimated: [],\n\t};\n\n\tconstructor(\n\t\twidth: number,\n\t\theight: number,\n\t\tblock_width: number,\n\t\tblock_height: number,\n\t\tsprites?: Record<string, Sprite>,\n\t) {\n\t\t// Validate map dimensions to ensure positive, finite values\n\t\tif (width <= 0 || height <= 0 || !isFinite(width) || !isFinite(height)) {\n\t\t\tconst diagnostic = createDiagnostic(APIErrorCode.E7034, {\n\t\t\t\tdata: {\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst formatted = formatForBrowser(diagnostic);\n\t\t\tthrow new Error(formatted);\n\t\t}\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.block_width = block_width;\n\t\tthis.block_height = block_height;\n\t\tthis.sprites = sprites ?? {};\n\t\tthis.clear();\n\t}\n\n\tclear(): void {\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tthis.map[idx] = null;\n\t\t\t\tthis.parsedMap[idx] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(x: number, y: number, ref: string | null): void {\n\t\t// Validate tile coordinates are within map bounds\n\t\tif (x < 0 || y < 0 || x >= this.width || y >= this.height || !isFinite(x) || !isFinite(y)) {\n\t\t\t// Silent fail: TileMap lacks runtime reference for error reporting\n\t\t\t// Out-of-bounds access is ignored to prevent crashes during development\n\t\t\treturn;\n\t\t}\n\n\t\tlet normalized = ref;\n\t\tif (typeof normalized === \"string\") {\n\t\t\tnormalized = normalizeRefForStorage(normalized);\n\t\t}\n\t\tconst idx = x + y * this.width;\n\t\tthis.map[idx] = normalized;\n\t\tthis.parsedMap[idx] = normalized ? parseTileRef(normalized) : null;\n\t\tthis.needs_update = true;\n\t}\n\n\tget(x: number, y: number): string | number | null {\n\t\t// Validate tile coordinates are within map bounds\n\t\tif (x < 0 || y < 0 || x >= this.width || y >= this.height || !isFinite(x) || !isFinite(y)) {\n\t\t\t// Silent fail: TileMap lacks runtime reference for error reporting\n\t\t\t// Returns 0 for out-of-bounds access to maintain backward compatibility\n\t\t\treturn 0;\n\t\t}\n\t\tlet cell = this.map[x + y * this.width];\n\t\tif (typeof cell === \"string\") {\n\t\t\tcell = normalizeRefForUsage(cell);\n\t\t}\n\t\treturn cell || 0;\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\tif (this.renderState.canvas == null || this.needs_update) {\n\t\t\tthis.update();\n\t\t}\n\t\treturn this.renderState.canvas!;\n\t}\n\n\tdraw(context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number): void {\n\t\tif (this.renderState.animated.length > 0) {\n\t\t\tconst buffer = renderAnimatedTiles(this.renderState, this.block_width, this.block_height);\n\t\t\tcontext.drawImage(buffer, x, y, w, h);\n\t\t} else {\n\t\t\tcontext.drawImage(this.getCanvas(), x, y, w, h);\n\t\t}\n\t}\n\n\tupdate(): void {\n\t\tthis.needs_update = false;\n\t\tconst context = ensureCanvas(this.renderState, this.width, this.height, this.block_width, this.block_height);\n\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst index = i + (this.height - 1 - j) * this.width;\n\t\t\t\tconst parsed = this.parsedMap[index];\n\t\t\t\tif (!parsed) continue;\n\n\t\t\t\tconst sprite =\n\t\t\t\t\tthis.sprites[parsed.spriteName] || this.sprites[normalizeRefForUsage(parsed.spriteName)];\n\t\t\t\tif (!sprite || !sprite.frames[0]) continue;\n\n\t\t\t\tif (sprite.frames.length > 1) {\n\t\t\t\t\tqueueAnimatedTile(this.renderState, sprite, this.block_width, this.block_height, i, j, parsed);\n\t\t\t\t} else {\n\t\t\t\t\tdrawTile(context, sprite, this.block_width, this.block_height, i, j, parsed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tloadFile(url: string, loaded?: () => void): void {\n\t\tconst req = new XMLHttpRequest();\n\t\treq.onreadystatechange = () => {\n\t\t\tif (req.readyState === XMLHttpRequest.DONE && req.status === 200) {\n\t\t\t\tthis.load(req.responseText, this.sprites);\n\t\t\t\tthis.update();\n\t\t\t\tloaded?.();\n\t\t\t}\n\t\t};\n\t\treq.open(\"GET\", url);\n\t\treq.send();\n\t}\n\n\tload(data: string, sprites: Record<string, Sprite>): void {\n\t\tconst parsed: MapData = JSON.parse(data);\n\t\tthis.width = parsed.width;\n\t\tthis.height = parsed.height;\n\t\tthis.block_width = parsed.block_width;\n\t\tthis.block_height = parsed.block_height;\n\t\tthis.sprites = sprites ?? this.sprites;\n\n\t\tfor (let j = 0; j < parsed.height; j++) {\n\t\t\tfor (let i = 0; i < parsed.width; i++) {\n\t\t\t\tconst idx = i + j * parsed.width;\n\t\t\t\tconst value = parsed.data[idx];\n\t\t\t\tif (value > 0) {\n\t\t\t\t\tconst ref = parsed.sprites[value] as string;\n\t\t\t\t\tthis.map[idx] = ref;\n\t\t\t\t\tthis.parsedMap[idx] = parseTileRef(ref);\n\t\t\t\t} else {\n\t\t\t\t\tthis.map[idx] = null;\n\t\t\t\t\tthis.parsedMap[idx] = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.needs_update = true;\n\t}\n\n\tclone(): TileMap {\n\t\tconst duplicate = new TileMap(this.width, this.height, this.block_width, this.block_height, this.sprites);\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tduplicate.map[idx] = this.map[idx];\n\t\t\t\tduplicate.parsedMap[idx] = this.parsedMap[idx];\n\t\t\t}\n\t\t}\n\t\tduplicate.needs_update = true;\n\t\treturn duplicate;\n\t}\n\n\tcopyFrom(map: TileMap): TileMap {\n\t\tthis.width = map.width;\n\t\tthis.height = map.height;\n\t\tthis.block_width = map.block_width;\n\t\tthis.block_height = map.block_height;\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tthis.map[idx] = map.map[idx];\n\t\t\t\tthis.parsedMap[idx] = map.parsedMap[idx];\n\t\t\t}\n\t\t}\n\t\tthis.update();\n\t\treturn this;\n\t}\n}\n\nexport function LoadMap(url: string, sprites?: Record<string, Sprite>, loaded?: () => void): TileMap {\n\tconst map = new TileMap(1, 1, 1, 1, sprites);\n\tmap.ready = false;\n\n\tconst req = new XMLHttpRequest();\n\treq.onreadystatechange = () => {\n\t\tif (req.readyState === XMLHttpRequest.DONE) {\n\t\t\tmap.ready = true;\n\t\t\tif (req.status === 200) {\n\t\t\t\tUpdateMap(map, req.responseText, sprites);\n\t\t\t}\n\t\t\tmap.needs_update = true;\n\t\t\tloaded?.();\n\t\t}\n\t};\n\treq.open(\"GET\", url);\n\treq.send();\n\treturn map;\n}\n\nexport function UpdateMap(map: TileMap, data: string, sprites?: Record<string, Sprite>): TileMap {\n\tmap.load(data, sprites ?? map.sprites);\n\treturn map;\n}\n\nexport function SaveMap(map: TileMap): string {\n\tlet index = 1;\n\tconst list: Array<string | number> = [0];\n\tconst table: Record<string, number> = {};\n\n\tfor (let j = 0; j < map.height; j++) {\n\t\tfor (let i = 0; i < map.width; i++) {\n\t\t\tconst entry = map.map[i + j * map.width];\n\t\t\tif (entry && entry.length > 0 && table[entry] == null) {\n\t\t\t\tlist.push(entry);\n\t\t\t\ttable[entry] = index++;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst serialized: number[] = [];\n\tfor (let j = 0; j < map.height; j++) {\n\t\tfor (let i = 0; i < map.width; i++) {\n\t\t\tconst entry = map.map[i + j * map.width];\n\t\t\tserialized[i + j * map.width] = entry && entry.length > 0 ? table[entry] : 0;\n\t\t}\n\t}\n\n\tconst payload: MapData = {\n\t\twidth: map.width,\n\t\theight: map.height,\n\t\tblock_width: map.block_width,\n\t\tblock_height: map.block_height,\n\t\tsprites: list,\n\t\tdata: serialized,\n\t};\n\n\treturn JSON.stringify(payload);\n}\n","import { APIErrorCode, createDiagnostic, formatForBrowser } from \"@al8b/diagnostics\";\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { AnimatedTile, ParsedTile } from \"../data/types\";\n\nexport interface RenderState {\n\tcanvas: HTMLCanvasElement | null;\n\tbuffer: HTMLCanvasElement | null;\n\tanimated: AnimatedTile[];\n}\n\nexport const ensureCanvas = (\n\tstate: RenderState,\n\twidth: number,\n\theight: number,\n\tblockWidth: number,\n\tblockHeight: number,\n): CanvasRenderingContext2D => {\n\tif (!state.canvas) {\n\t\tstate.canvas = document.createElement(\"canvas\");\n\t}\n\tconst expectedWidth = width * blockWidth;\n\tconst expectedHeight = height * blockHeight;\n\tif (state.canvas.width !== expectedWidth || state.canvas.height !== expectedHeight) {\n\t\tstate.canvas.width = expectedWidth;\n\t\tstate.canvas.height = expectedHeight;\n\t}\n\tconst ctx = state.canvas.getContext(\"2d\");\n\tif (!ctx) {\n\t\tconst diagnostic = createDiagnostic(APIErrorCode.E7031);\n\t\tconst formatted = formatForBrowser(diagnostic);\n\t\tthrow new Error(formatted);\n\t}\n\tctx.clearRect(0, 0, state.canvas.width, state.canvas.height);\n\tstate.animated = [];\n\treturn ctx;\n};\n\nexport const drawTile = (\n\tctx: CanvasRenderingContext2D,\n\tsprite: Sprite,\n\tblockWidth: number,\n\tblockHeight: number,\n\tgridX: number,\n\tgridY: number,\n\tparsed: ParsedTile,\n): boolean => {\n\tconst canvas = sprite.frames[0].canvas;\n\tif (!canvas || canvas.width === 0 || canvas.height === 0) {\n\t\treturn false;\n\t}\n\tif (parsed.subX != null) {\n\t\tconst tx = parsed.subX * blockWidth;\n\t\tconst ty = (parsed.subY ?? 0) * blockHeight;\n\t\tctx.drawImage(\n\t\t\tcanvas,\n\t\t\ttx,\n\t\t\tty,\n\t\t\tblockWidth,\n\t\t\tblockHeight,\n\t\t\tblockWidth * gridX,\n\t\t\tblockHeight * gridY,\n\t\t\tblockWidth,\n\t\t\tblockHeight,\n\t\t);\n\t} else {\n\t\tctx.drawImage(canvas, blockWidth * gridX, blockHeight * gridY);\n\t}\n\treturn true;\n};\n\nexport const queueAnimatedTile = (\n\tstate: RenderState,\n\tsprite: Sprite,\n\tblockWidth: number,\n\tblockHeight: number,\n\tgridX: number,\n\tgridY: number,\n\tparsed: ParsedTile,\n): void => {\n\tconst tile: AnimatedTile = {\n\t\tx: blockWidth * gridX,\n\t\ty: blockHeight * gridY,\n\t\tw: blockWidth,\n\t\th: blockHeight,\n\t\tsprite,\n\t};\n\tif (parsed.subX != null) {\n\t\ttile.tx = parsed.subX * blockWidth;\n\t\ttile.ty = (parsed.subY ?? 0) * blockHeight;\n\t}\n\tstate.animated.push(tile);\n};\n\nexport const renderAnimatedTiles = (state: RenderState, blockWidth: number, blockHeight: number): HTMLCanvasElement => {\n\tconst time = performance.now();\n\tif (\n\t\t!state.buffer ||\n\t\tstate.buffer.width !== blockWidth * (state.canvas!.width / blockWidth) ||\n\t\tstate.buffer.height !== blockHeight * (state.canvas!.height / blockHeight)\n\t) {\n\t\tstate.buffer = document.createElement(\"canvas\");\n\t\tstate.buffer.width = state.canvas!.width;\n\t\tstate.buffer.height = state.canvas!.height;\n\t}\n\tconst bufferCtx = state.buffer.getContext(\"2d\")!;\n\tbufferCtx.clearRect(0, 0, state.buffer.width, state.buffer.height);\n\tbufferCtx.drawImage(state.canvas!, 0, 0);\n\tfor (const tile of state.animated) {\n\t\tconst len = tile.sprite.frames.length;\n\t\tconst frame = tile.sprite.frames[Math.floor((time / 1000) * tile.sprite.fps) % len]?.canvas;\n\t\tif (!frame) continue;\n\t\tif (tile.tx != null && tile.ty != null) {\n\t\t\tbufferCtx.drawImage(frame, tile.tx, tile.ty, blockWidth, blockHeight, tile.x, tile.y, blockWidth, blockHeight);\n\t\t} else {\n\t\t\tbufferCtx.drawImage(frame, tile.x, tile.y, blockWidth, blockHeight);\n\t\t}\n\t}\n\treturn state.buffer;\n};\n","// Convert forward slashes to dashes for safe storage in map data format\nexport const normalizeRefForStorage = (ref: string): string => ref.replace(/\\//g, \"-\");\n// Convert dashes back to forward slashes for sprite reference lookup\nexport const normalizeRefForUsage = (ref: string): string => ref.replace(/-/g, \"/\");\n","export const BLENDING_MODES: Record<string, GlobalCompositeOperation> = {\n\tnormal: \"source-over\",\n\tadditive: \"lighter\",\n};\n\nconst MODES = [\n\t\"source-over\",\n\t\"source-in\",\n\t\"source-out\",\n\t\"source-atop\",\n\t\"destination-over\",\n\t\"destination-in\",\n\t\"destination-out\",\n\t\"destination-atop\",\n\t\"lighter\",\n\t\"copy\",\n\t\"xor\",\n\t\"multiply\",\n\t\"screen\",\n\t\"overlay\",\n\t\"darken\",\n\t\"lighten\",\n\t\"color-dodge\",\n\t\"color-burn\",\n\t\"hard-light\",\n\t\"soft-light\",\n\t\"difference\",\n\t\"exclusion\",\n\t\"hue\",\n\t\"saturation\",\n\t\"color\",\n\t\"luminosity\",\n];\n\nfor (const mode of MODES) {\n\tBLENDING_MODES[mode] = mode as GlobalCompositeOperation;\n}\n","/**\n * Color management for Image class\n * Handles color setting, pixel operations, and gradients\n */\n\nexport function setColor(context: CanvasRenderingContext2D, color?: string): void {\n\tif (color == null) {\n\t\treturn;\n\t}\n\tif (typeof color === \"string\") {\n\t\tcontext.fillStyle = color;\n\t\tcontext.strokeStyle = color;\n\t}\n}\n\nexport function setLinearGradient(\n\tcontext: CanvasRenderingContext2D,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n\tc1: string,\n\tc2: string,\n): void {\n\tconst grd = context.createLinearGradient(x1, y1, x2, y2);\n\tgrd.addColorStop(0, c1);\n\tgrd.addColorStop(1, c2);\n\tcontext.fillStyle = grd;\n\tcontext.strokeStyle = grd;\n}\n\nexport function setRadialGradient(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tc1: string,\n\tc2: string,\n): void {\n\tconst grd = context.createRadialGradient(x, y, 0, x, y, radius);\n\tgrd.addColorStop(0, c1);\n\tgrd.addColorStop(1, c2);\n\tcontext.fillStyle = grd;\n\tcontext.strokeStyle = grd;\n}\n","/**\n * Context management for Image class\n * Handles canvas context initialization and state management\n */\n\nexport interface ImageContextState {\n\talpha: number;\n\tpixelated: number;\n\tline_width: number;\n\ttranslation_x: number;\n\ttranslation_y: number;\n\trotation: number;\n\tscale_x: number;\n\tscale_y: number;\n\timage_transform: boolean;\n\tanchor_x: number;\n\tanchor_y: number;\n\tobject_rotation: number;\n\tobject_scale_x: number;\n\tobject_scale_y: number;\n\tfont: string;\n}\n\nexport function createDefaultContextState(centered: boolean): ImageContextState {\n\tif (centered) {\n\t\treturn {\n\t\t\talpha: 1,\n\t\t\tpixelated: 1,\n\t\t\tline_width: 1,\n\t\t\ttranslation_x: 0, // Will be set to width/2\n\t\t\ttranslation_y: 0, // Will be set to height/2\n\t\t\trotation: 0,\n\t\t\tscale_x: 1,\n\t\t\tscale_y: -1,\n\t\t\timage_transform: true,\n\t\t\tanchor_x: 0,\n\t\t\tanchor_y: 0,\n\t\t\tobject_rotation: 0,\n\t\t\tobject_scale_x: 1,\n\t\t\tobject_scale_y: -1,\n\t\t\tfont: \"BitCell\",\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\talpha: 1,\n\t\t\tpixelated: 1,\n\t\t\tline_width: 1,\n\t\t\ttranslation_x: 0,\n\t\t\ttranslation_y: 0,\n\t\t\trotation: 0,\n\t\t\tscale_x: 1,\n\t\t\tscale_y: 1,\n\t\t\timage_transform: false,\n\t\t\tanchor_x: -1,\n\t\t\tanchor_y: 1,\n\t\t\tobject_rotation: 0,\n\t\t\tobject_scale_x: 1,\n\t\t\tobject_scale_y: 1,\n\t\t\tfont: \"BitCell\",\n\t\t};\n\t}\n}\n\nexport function updateImageTransform(state: ImageContextState): void {\n\tstate.image_transform =\n\t\tstate.translation_x !== 0 ||\n\t\tstate.translation_y !== 0 ||\n\t\tstate.scale_x !== 1 ||\n\t\tstate.scale_y !== 1 ||\n\t\tstate.rotation !== 0;\n}\n","/**\n * Drawing operations for Image class\n * Handles all drawing primitives (rectangles, circles, lines, etc.)\n */\n\nimport type { ImageContextState } from \"./context\";\n\nexport function initDrawOp(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tobject_transform = true,\n): boolean {\n\tlet res = false;\n\n\tif (state.image_transform) {\n\t\tcontext.save();\n\t\tres = true;\n\t\tcontext.translate(state.translation_x, state.translation_y);\n\t\tcontext.scale(state.scale_x, state.scale_y);\n\t\tcontext.rotate((state.rotation / 180) * Math.PI);\n\t\tcontext.translate(x, y);\n\t}\n\n\tif (object_transform && (state.object_rotation !== 0 || state.object_scale_x !== 1 || state.object_scale_y !== 1)) {\n\t\tif (!res) {\n\t\t\tcontext.save();\n\t\t\tres = true;\n\t\t\tcontext.translate(x, y);\n\t\t}\n\t\tif (state.object_rotation !== 0) {\n\t\t\tcontext.rotate((state.object_rotation / 180) * Math.PI);\n\t\t}\n\t\tif (state.object_scale_x !== 1 || state.object_scale_y !== 1) {\n\t\t\tcontext.scale(state.object_scale_x, state.object_scale_y);\n\t\t}\n\t}\n\n\treturn res;\n}\n\nexport function closeDrawOp(context: CanvasRenderingContext2D): void {\n\tcontext.restore();\n}\n\nexport function fillRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.fillRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.fillRect(x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function fillRoundRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tround: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tif (initDrawOp(context, state, x, y)) {\n\t\t(context as any).fillRoundRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h, round);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\t(context as any).fillRoundRect(\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t\tround,\n\t\t);\n\t}\n}\n\nexport function fillRound(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tw = Math.abs(w);\n\th = Math.abs(h);\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse((-state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.fill();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.fill();\n\t}\n}\n\nexport function drawRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.strokeRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.strokeRect(x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function drawRoundRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tround: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tif (initDrawOp(context, state, x, y)) {\n\t\t(context as any).strokeRoundRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h, round);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\t(context as any).strokeRoundRect(\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t\tround,\n\t\t);\n\t}\n}\n\nexport function drawRound(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tw = Math.abs(w);\n\th = Math.abs(h);\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.stroke();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.stroke();\n\t}\n}\n\nexport function drawLine(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(x1, y1);\n\tcontext.lineTo(x2, y2);\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n","/**\n * Font management for Image class\n * Handles font loading and readiness checking\n */\n\n// Font cache to track loaded fonts\nconst loadedFonts = new Set<string>();\nconst loadingFonts = new Map<string, Promise<void>>();\n\n/**\n * Load a font for use in the image\n * In a full implementation, this would integrate with a font loading system\n */\nexport function loadFont(font: string): Promise<void> | void {\n\tif (!font) {\n\t\treturn;\n\t}\n\n\t// If already loaded, return immediately\n\tif (loadedFonts.has(font)) {\n\t\treturn Promise.resolve();\n\t}\n\n\t// If currently loading, return existing promise\n\tif (loadingFonts.has(font)) {\n\t\treturn loadingFonts.get(font);\n\t}\n\n\t// Check if font is available via CSS Font Loading API\n\tif (typeof document !== \"undefined\" && \"fonts\" in document) {\n\t\tconst promise = document.fonts\n\t\t\t.load(`12pt ${font}`)\n\t\t\t.then(() => {\n\t\t\t\tloadedFonts.add(font);\n\t\t\t\tloadingFonts.delete(font);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Font loading failed, but we'll mark it as loaded anyway\n\t\t\t\tloadedFonts.add(font);\n\t\t\t\tloadingFonts.delete(font);\n\t\t\t});\n\n\t\tloadingFonts.set(font, promise);\n\t\treturn promise;\n\t}\n\n\t// Fallback: assume font is available\n\tloadedFonts.add(font);\n\treturn Promise.resolve();\n}\n\n/**\n * Check if a font is ready to use\n */\nexport function isFontReady(font: string): boolean {\n\tif (!font) {\n\t\treturn true;\n\t}\n\n\t// Check if font is in loaded set\n\tif (loadedFonts.has(font)) {\n\t\treturn true;\n\t}\n\n\t// Check via CSS Font Loading API\n\tif (typeof document !== \"undefined\" && \"fonts\" in document) {\n\t\treturn document.fonts.check(`12pt ${font}`);\n\t}\n\n\t// Fallback: assume font is ready\n\treturn true;\n}\n\n/**\n * Clear font cache (useful for testing)\n */\nexport function clearFontCache(): void {\n\tloadedFonts.clear();\n\tloadingFonts.clear();\n}\n","/**\n * Map rendering for Image class\n * Handles drawing map objects onto the canvas\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport interface MapSource {\n\tready?: boolean | number;\n\tdraw?: (context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number) => void;\n}\n\nconst resolveStringMap = (name: string): MapSource | null => {\n\tconst playerRuntime = (globalThis as any)?.player?.runtime;\n\tif (!playerRuntime) {\n\t\treturn null;\n\t}\n\n\t// Resolved maps are stored under runtime.maps; fall back to\n\t// screen.runtime.maps if provided by host environments.\n\tconst directMaps = playerRuntime.maps as Record<string, MapSource> | undefined;\n\tif (directMaps && directMaps[name]) {\n\t\treturn directMaps[name];\n\t}\n\n\tconst screenMaps = playerRuntime.screen?.runtime?.maps as Record<string, MapSource> | undefined;\n\tif (screenMaps && screenMaps[name]) {\n\t\treturn screenMaps[name];\n\t}\n\n\treturn null;\n};\n\nexport function drawMap(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tmap: MapSource | string,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tconst resolvedMap: MapSource | null = typeof map === \"string\" ? resolveStringMap(map) : (map ?? null);\n\n\tif (!resolvedMap || !resolvedMap.ready || !resolvedMap.draw) {\n\t\treturn;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tresolvedMap.draw(context, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tresolvedMap.draw(context, x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n","/**\n * Pixel-level operations for Image class\n * Handles individual pixel reading and writing\n */\n\nexport interface RGBColor {\n\tR: number;\n\tG: number;\n\tB: number;\n}\n\nexport interface RGBAColor extends RGBColor {\n\tA: number;\n}\n\nlet pixelDataCache: ImageData | null = null;\n\nexport function setRGB(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tr: number | RGBColor,\n\tg?: number,\n\tb?: number,\n): void {\n\tif (pixelDataCache == null) {\n\t\tpixelDataCache = context.createImageData(1, 1);\n\t}\n\n\tif (typeof r === \"object\") {\n\t\tpixelDataCache.data[0] = r.R;\n\t\tpixelDataCache.data[1] = r.G;\n\t\tpixelDataCache.data[2] = r.B;\n\t} else {\n\t\tpixelDataCache.data[0] = r;\n\t\tpixelDataCache.data[1] = g || 0;\n\t\tpixelDataCache.data[2] = b || 0;\n\t}\n\tpixelDataCache.data[3] = 255;\n\n\tcontext.putImageData(pixelDataCache, x, y);\n}\n\nexport function setRGBA(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tr: number | RGBAColor,\n\tg?: number,\n\tb?: number,\n\ta?: number,\n): void {\n\tif (pixelDataCache == null) {\n\t\tpixelDataCache = context.createImageData(1, 1);\n\t}\n\n\tif (typeof r === \"object\") {\n\t\tpixelDataCache.data[0] = r.R;\n\t\tpixelDataCache.data[1] = r.G;\n\t\tpixelDataCache.data[2] = r.B;\n\t\tpixelDataCache.data[3] = r.A != null ? r.A : 255;\n\t} else {\n\t\tpixelDataCache.data[0] = r;\n\t\tpixelDataCache.data[1] = g || 0;\n\t\tpixelDataCache.data[2] = b || 0;\n\t\tpixelDataCache.data[3] = a ?? 255;\n\t}\n\n\tcontext.putImageData(pixelDataCache, x, y);\n}\n\nexport function getRGB(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tresult: RGBColor = {\n\t\tR: 0,\n\t\tG: 0,\n\t\tB: 0,\n\t},\n): RGBColor {\n\tconst d = context.getImageData(x, y, 1, 1);\n\tresult.R = d.data[0];\n\tresult.G = d.data[1];\n\tresult.B = d.data[2];\n\treturn result;\n}\n\nexport function getRGBA(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tresult: RGBAColor = {\n\t\tR: 0,\n\t\tG: 0,\n\t\tB: 0,\n\t\tA: 255,\n\t},\n): RGBAColor {\n\tconst d = context.getImageData(x, y, 1, 1);\n\tresult.R = d.data[0];\n\tresult.G = d.data[1];\n\tresult.B = d.data[2];\n\tresult.A = d.data[3];\n\treturn result;\n}\n","/**\n * Advanced shape drawing operations\n * Handles polygons, polylines, curves, and arcs\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport function drawPolyline(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawPolygon(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.closePath();\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function fillPolygon(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.fill();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawQuadCurve(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tlet index = 2;\n\twhile (index <= args.length - 4) {\n\t\tcontext.quadraticCurveTo(args[index], args[index + 1], args[index + 2], args[index + 3]);\n\t\tindex += 4;\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawBezierCurve(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tlet index = 2;\n\twhile (index <= args.length - 6) {\n\t\tcontext.bezierCurveTo(\n\t\t\targs[index],\n\t\t\targs[index + 1],\n\t\t\targs[index + 2],\n\t\t\targs[index + 3],\n\t\t\targs[index + 4],\n\t\t\targs[index + 5],\n\t\t);\n\t\tindex += 6;\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawArc(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tangle1: number,\n\tangle2: number,\n\tccw: boolean,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.arc(0, 0, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.stroke();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.arc(x, y, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.stroke();\n\t}\n}\n\nexport function fillArc(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tangle1: number,\n\tangle2: number,\n\tccw: boolean,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.arc(0, 0, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.fill();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.arc(x, y, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.fill();\n\t}\n}\n","/**\n * Sprite and image rendering for Image class\n * Handles drawing sprites and images onto the canvas\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport interface SpriteSource {\n\tframes?: Array<{\n\t\tcanvas: HTMLCanvasElement;\n\t}>;\n\tcanvas?: HTMLCanvasElement;\n\timage?: HTMLImageElement;\n\tready?: boolean | number;\n\tfps?: number;\n\tanimation_start?: number;\n}\n\nexport function getSpriteFrame(sprite: SpriteSource | string): HTMLCanvasElement | null {\n\t// Handle Image instances\n\tif (typeof sprite === \"object\" && \"canvas\" in sprite && !(\"frames\" in sprite)) {\n\t\treturn sprite.canvas || (sprite.image as any) || null;\n\t}\n\n\t// Handle Sprite instances\n\tif (typeof sprite === \"object\" && sprite.frames && sprite.frames.length > 0) {\n\t\tif (!sprite.ready) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (sprite.frames.length > 1) {\n\t\t\t// Initialize animation_start lazily on first use to ensure animation starts from frame 0\n\t\t\t// This ensures smooth sequential animation: 0->1->2->...->N->0->1->...\n\t\t\tif (!sprite.animation_start || sprite.animation_start === 0) {\n\t\t\t\tsprite.animation_start = Date.now();\n\t\t\t}\n\t\t\tconst dt = 1000 / (sprite.fps || 5);\n\t\t\tconst frame = Math.floor((Date.now() - sprite.animation_start) / dt) % sprite.frames.length;\n\t\t\tif (frame >= 0 && frame < sprite.frames.length) {\n\t\t\t\treturn sprite.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn sprite.frames[0].canvas;\n\t\t}\n\t\treturn sprite.frames[0].canvas;\n\t}\n\n\treturn null;\n}\n\nexport function drawSprite(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tsprite: SpriteSource | string,\n\tx: number,\n\ty: number,\n\tw?: number,\n\th?: number,\n): void {\n\tconst canvas = getSpriteFrame(sprite);\n\tif (canvas == null) {\n\t\treturn;\n\t}\n\n\tif (w == null) {\n\t\tw = canvas.width;\n\t}\n\tif (!h) {\n\t\th = (w / canvas.width) * canvas.height;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.drawImage(canvas, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.drawImage(canvas, x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function drawSpritePart(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tsprite: SpriteSource | string,\n\tsx: number,\n\tsy: number,\n\tsw: number,\n\tsh: number,\n\tx: number,\n\ty: number,\n\tw?: number,\n\th?: number,\n): void {\n\tconst canvas = getSpriteFrame(sprite);\n\tif (canvas == null) {\n\t\treturn;\n\t}\n\n\t// Image class uses w = canvas.width (Screen uses w = sw)\n\tif (w == null) {\n\t\tw = canvas.width;\n\t}\n\tif (!h) {\n\t\th = (w / sw) * sh;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.drawImage(canvas, sx, sy, sw, sh, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.drawImage(\n\t\t\tcanvas,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tsw,\n\t\t\tsh,\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t);\n\t}\n}\n","/**\n * Text rendering operations for Image class\n * Handles text drawing, measurement, and font management\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport function textWidth(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tsize: number,\n): number {\n\tcontext.font = `${size}pt ${state.font}`;\n\treturn context.measureText(text).width;\n}\n\nexport function drawText(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tx: number,\n\ty: number,\n\tsize: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.font = `${size}pt ${state.font}`;\n\tcontext.textAlign = \"center\";\n\tcontext.textBaseline = \"middle\";\n\n\tconst w = context.measureText(text).width;\n\tconst h = size;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.fillText(text, 0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.fillText(text, x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2);\n\t}\n}\n\nexport function drawTextOutline(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tx: number,\n\ty: number,\n\tsize: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.font = `${size}pt ${state.font}`;\n\tcontext.lineWidth = state.line_width;\n\tcontext.textAlign = \"center\";\n\tcontext.textBaseline = \"middle\";\n\n\tconst w = context.measureText(text).width;\n\tconst h = size;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.strokeText(text, 0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.strokeText(text, x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2);\n\t}\n}\n","/**\n * Transform operations for Image class\n * Handles translation, rotation, scaling, and anchoring\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { updateImageTransform } from \"./context\";\n\nexport function setTranslation(state: ImageContextState, translation_x: number, translation_y: number): void {\n\tstate.translation_x = translation_x;\n\tstate.translation_y = translation_y;\n\n\tif (!isFinite(state.translation_x)) {\n\t\tstate.translation_x = 0;\n\t}\n\tif (!isFinite(state.translation_y)) {\n\t\tstate.translation_y = 0;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setScale(state: ImageContextState, scale_x: number, scale_y: number): void {\n\tstate.scale_x = scale_x;\n\tstate.scale_y = scale_y;\n\n\tif (!isFinite(state.scale_x) || state.scale_x === 0) {\n\t\tstate.scale_x = 1;\n\t}\n\tif (!isFinite(state.scale_y) || state.scale_y === 0) {\n\t\tstate.scale_y = 1;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setRotation(state: ImageContextState, rotation: number): void {\n\tstate.rotation = rotation;\n\n\tif (!isFinite(state.rotation)) {\n\t\tstate.rotation = 0;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setDrawAnchor(state: ImageContextState, anchor_x: number, anchor_y: number): void {\n\tstate.anchor_x = anchor_x;\n\tstate.anchor_y = anchor_y;\n\n\tif (typeof state.anchor_x !== \"number\") {\n\t\tstate.anchor_x = 0;\n\t}\n\tif (typeof state.anchor_y !== \"number\") {\n\t\tstate.anchor_y = 0;\n\t}\n}\n\nexport function setDrawRotation(state: ImageContextState, object_rotation: number): void {\n\tstate.object_rotation = object_rotation;\n}\n\nexport function setDrawScale(state: ImageContextState, object_scale_x: number, object_scale_y: number): void {\n\tstate.object_scale_x = object_scale_x;\n\tstate.object_scale_y = object_scale_y;\n}\n","/**\n * Image - Canvas-based image class for game graphics\n *\n * Provides a canvas wrapper for image manipulation and drawing operations.\n */\n\nimport { BLENDING_MODES } from \"../blending\";\nimport * as ColorOps from \"./color\";\nimport { createDefaultContextState, type ImageContextState } from \"./context\";\nimport * as DrawingOps from \"./drawing\";\nimport * as FontOps from \"./font\";\nimport * as MapRenderingOps from \"./map-rendering\";\nimport * as PixelOps from \"./pixel\";\nimport * as ShapeOps from \"./shapes\";\nimport * as SpriteRenderingOps from \"./sprite-rendering\";\nimport * as TextOps from \"./text\";\nimport * as TransformOps from \"./transform\";\n\n/**\n * For variadic shape methods, the last argument may optionally be a color string.\n * This helper splits the args into point pairs and an optional color.\n */\nfunction splitColorArg(args: any[]): { points: any[]; color: string | undefined } {\n\tif (args.length > 0 && args.length % 2 === 1 && typeof args[args.length - 1] === \"string\") {\n\t\treturn { points: args.slice(0, -1), color: args[args.length - 1] };\n\t}\n\treturn { points: args, color: undefined };\n}\n\nexport class Image {\n\tprivate _canvas!: HTMLCanvasElement;\n\tprivate _context: CanvasRenderingContext2D | null = null;\n\tprivate _image: HTMLImageElement | null = null;\n\tprivate _state!: ImageContextState;\n\tprivate _centered: boolean;\n\n\tpublic width: number;\n\tpublic height: number;\n\n\tconstructor(widthOrImage: number | HTMLImageElement | HTMLCanvasElement, height?: number, centered: boolean = false) {\n\t\tthis._centered = centered;\n\n\t\tif (typeof widthOrImage === \"object\" && \"naturalWidth\" in widthOrImage) {\n\t\t\t// HTMLImageElement\n\t\t\tthis._image = widthOrImage as HTMLImageElement;\n\t\t\tthis.width = this._image.width;\n\t\t\tthis.height = this._image.height;\n\t\t} else if (typeof widthOrImage === \"object\" && \"getContext\" in widthOrImage) {\n\t\t\t// HTMLCanvasElement\n\t\t\tthis._canvas = widthOrImage as HTMLCanvasElement;\n\t\t\tthis.width = this._canvas.width;\n\t\t\tthis.height = this._canvas.height;\n\t\t} else {\n\t\t\t// Number\n\t\t\tthis._canvas = document.createElement(\"canvas\");\n\t\t\tthis.width = Math.round(widthOrImage as number);\n\t\t\tthis.height = Math.round(height || (widthOrImage as number));\n\t\t\tthis._canvas.width = this.width;\n\t\t\tthis._canvas.height = this.height;\n\t\t}\n\t}\n\n\t/**\n\t * Initialize or get the canvas context\n\t * Matches msImage initContext behavior exactly\n\t */\n\tinitContext(): CanvasRenderingContext2D {\n\t\t// Return early if context already exists (same as msImage line 68)\n\t\tif (this._context) {\n\t\t\treturn this._context;\n\t\t}\n\n\t\t// Convert image to canvas if needed (same as msImage lines 69-75)\n\t\tif (!this._canvas && this._image) {\n\t\t\tthis._canvas = document.createElement(\"canvas\");\n\t\t\tthis._canvas.width = this._image.width;\n\t\t\tthis._canvas.height = this._image.height;\n\t\t\tthis._context = this._canvas.getContext(\"2d\")!;\n\t\t\tthis._context.drawImage(this._image, 0, 0);\n\t\t\tthis._image = null;\n\t\t}\n\n\t\t// Always get fresh context (same as msImage line 80)\n\t\t// This ensures no leftover transforms from previous operations\n\t\tthis._context = this._canvas.getContext(\"2d\")!;\n\t\tif (this._context) {\n\t\t\tthis._context.lineCap = \"round\";\n\t\t}\n\n\t\t// Initialize state (same as msImage lines 77-106)\n\t\tif (!this._state) {\n\t\t\tthis._state = createDefaultContextState(this._centered);\n\t\t\tif (this._centered) {\n\t\t\t\tthis._state.translation_x = this.width / 2;\n\t\t\t\tthis._state.translation_y = this.height / 2;\n\t\t\t}\n\t\t}\n\n\t\treturn this._context;\n\t}\n\n\t/**\n\t * Get the canvas element\n\t */\n\tget canvas(): HTMLCanvasElement {\n\t\tthis.initContext();\n\t\treturn this._canvas;\n\t}\n\n\t/**\n\t * Get the image element (if still available)\n\t */\n\tget image(): HTMLImageElement | null {\n\t\treturn this._image;\n\t}\n\n\t/**\n\t * Get the rendering context\n\t */\n\tget context(): CanvasRenderingContext2D | null {\n\t\treturn this._context;\n\t}\n\n\t// ===== PIXEL OPERATIONS =====\n\n\tsetRGB(x: number, y: number, r: number | PixelOps.RGBColor, g?: number, b?: number): void {\n\t\tthis.initContext();\n\t\tPixelOps.setRGB(this._context!, x, y, r, g, b);\n\t}\n\n\tsetRGBA(x: number, y: number, r: number | PixelOps.RGBAColor, g?: number, b?: number, a?: number): void {\n\t\tthis.initContext();\n\t\tPixelOps.setRGBA(this._context!, x, y, r, g, b, a);\n\t}\n\n\tgetRGB(x: number, y: number, result?: PixelOps.RGBColor): PixelOps.RGBColor {\n\t\tthis.initContext();\n\t\treturn PixelOps.getRGB(this._context!, x, y, result);\n\t}\n\n\tgetRGBA(x: number, y: number, result?: PixelOps.RGBAColor): PixelOps.RGBAColor {\n\t\tthis.initContext();\n\t\treturn PixelOps.getRGBA(this._context!, x, y, result);\n\t}\n\n\t// ===== CANVAS OPERATIONS =====\n\n\tclear(color?: string): void {\n\t\tthis.initContext();\n\t\tconst c = this._context!.fillStyle;\n\t\tconst s = this._context!.strokeStyle;\n\t\tconst blending_save = this._context!.globalCompositeOperation;\n\n\t\tthis._context!.globalAlpha = 1;\n\t\tthis._context!.globalCompositeOperation = \"source-over\";\n\n\t\tif (color != null) {\n\t\t\tthis.setColor(color);\n\t\t} else {\n\t\t\tthis._context!.fillStyle = \"#000\";\n\t\t}\n\n\t\tthis._context!.fillRect(0, 0, this.width, this.height);\n\t\tthis._context!.fillStyle = c;\n\t\tthis._context!.strokeStyle = s;\n\t\tthis._context!.globalCompositeOperation = blending_save;\n\t}\n\n\t// ===== COLOR OPERATIONS =====\n\n\tsetColor(color?: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setColor(this._context!, color);\n\t}\n\n\tsetAlpha(alpha: number): void {\n\t\tthis.initContext();\n\t\tthis._state.alpha = alpha;\n\t}\n\n\tsetPixelated(pixelated: number): void {\n\t\tthis.initContext();\n\t\tthis._state.pixelated = pixelated;\n\t}\n\n\tsetBlending(blending?: string): void {\n\t\tthis.initContext();\n\t\tconst mode = BLENDING_MODES[blending || \"normal\"] || \"source-over\";\n\t\tthis._context!.globalCompositeOperation = mode;\n\t}\n\n\tsetLineWidth(line_width: number): void {\n\t\tthis.initContext();\n\t\tthis._state.line_width = line_width;\n\t}\n\n\tsetLineDash(dash: number[] | any): void {\n\t\tthis.initContext();\n\t\tif (!Array.isArray(dash)) {\n\t\t\tthis._context!.setLineDash([]);\n\t\t} else {\n\t\t\tthis._context!.setLineDash(dash);\n\t\t}\n\t}\n\n\tsetLinearGradient(x1: number, y1: number, x2: number, y2: number, c1: string, c2: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setLinearGradient(this._context!, x1, y1, x2, y2, c1, c2);\n\t}\n\n\tsetRadialGradient(x: number, y: number, radius: number, c1: string, c2: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setRadialGradient(this._context!, x, y, radius, c1, c2);\n\t}\n\n\t// ===== FONT OPERATIONS =====\n\n\tsetFont(font?: string): void {\n\t\tthis.initContext();\n\t\tthis._state.font = font || \"Verdana\";\n\t\tthis.loadFont(this._state.font);\n\t}\n\n\tloadFont(font: string): Promise<void> | void {\n\t\treturn FontOps.loadFont(font);\n\t}\n\n\tisFontReady(font?: string): boolean {\n\t\treturn FontOps.isFontReady(font || this._state?.font || \"Verdana\");\n\t}\n\n\t// ===== TRANSFORM OPERATIONS =====\n\n\tsetTranslation(translation_x: number, translation_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setTranslation(this._state, translation_x, translation_y);\n\t}\n\n\tsetScale(scale_x: number, scale_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setScale(this._state, scale_x, scale_y);\n\t}\n\n\tsetRotation(rotation: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setRotation(this._state, rotation);\n\t}\n\n\tsetDrawAnchor(anchor_x: number, anchor_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawAnchor(this._state, anchor_x, anchor_y);\n\t}\n\n\tsetDrawRotation(object_rotation: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawRotation(this._state, object_rotation);\n\t}\n\n\tsetDrawScale(object_scale_x: number, object_scale_y: number = object_scale_x): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawScale(this._state, object_scale_x, object_scale_y);\n\t}\n\n\t// ===== DRAWING OPERATIONS =====\n\n\tfillRect(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRect(this._context!, this._state, x, y, w, h);\n\t}\n\n\tfillRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRoundRect(this._context!, this._state, x, y, w, h, round);\n\t}\n\n\tfillRound(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRound(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawRect(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRect(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRoundRect(this._context!, this._state, x, y, w, h, round);\n\t}\n\n\tdrawRound(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRound(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawLine(x1: number, y1: number, x2: number, y2: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawLine(this._context!, this._state, x1, y1, x2, y2);\n\t}\n\n\t// ===== SHAPE OPERATIONS =====\n\n\tdrawPolyline(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawPolyline(this._context!, this._state, points);\n\t}\n\n\tdrawPolygon(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawPolygon(this._context!, this._state, points);\n\t}\n\n\tfillPolygon(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.fillPolygon(this._context!, this._state, points);\n\t}\n\n\tdrawQuadCurve(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawQuadCurve(this._context!, this._state, points);\n\t}\n\n\tdrawBezierCurve(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawBezierCurve(this._context!, this._state, points);\n\t}\n\n\tdrawArc(x: number, y: number, radius: number, angle1: number, angle2: number, ccw: boolean, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tShapeOps.drawArc(this._context!, this._state, x, y, radius, angle1, angle2, ccw);\n\t}\n\n\tfillArc(x: number, y: number, radius: number, angle1: number, angle2: number, ccw: boolean, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tShapeOps.fillArc(this._context!, this._state, x, y, radius, angle1, angle2, ccw);\n\t}\n\n\t// ===== TEXT OPERATIONS =====\n\n\ttextWidth(text: string, size: number): number {\n\t\tthis.initContext();\n\t\treturn TextOps.textWidth(this._context!, this._state, text, size);\n\t}\n\n\tdrawText(text: string, x: number, y: number, size: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tTextOps.drawText(this._context!, this._state, text, x, y, size);\n\t}\n\n\tdrawTextOutline(text: string, x: number, y: number, size: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tTextOps.drawTextOutline(this._context!, this._state, text, x, y, size);\n\t}\n\n\t// ===== SPRITE RENDERING =====\n\n\tdrawSprite(sprite: SpriteRenderingOps.SpriteSource | string, x: number, y: number, w?: number, h?: number): void {\n\t\tthis.initContext();\n\t\tSpriteRenderingOps.drawSprite(this._context!, this._state, sprite, x, y, w, h);\n\t}\n\n\tdrawImage(sprite: SpriteRenderingOps.SpriteSource | string, x: number, y: number, w?: number, h?: number): void {\n\t\tthis.drawSprite(sprite, x, y, w, h);\n\t}\n\n\tdrawSpritePart(\n\t\tsprite: SpriteRenderingOps.SpriteSource | string,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tthis.initContext();\n\t\tSpriteRenderingOps.drawSpritePart(this._context!, this._state, sprite, sx, sy, sw, sh, x, y, w, h);\n\t}\n\n\tdrawImagePart(\n\t\tsprite: SpriteRenderingOps.SpriteSource | string,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tthis.drawSpritePart(sprite, sx, sy, sw, sh, x, y, w, h);\n\t}\n\n\t// ===== MAP RENDERING =====\n\n\tdrawMap(map: MapRenderingOps.MapSource | string, x: number, y: number, w: number, h: number): void {\n\t\tthis.initContext();\n\t\tMapRenderingOps.drawMap(this._context!, this._state, map, x, y, w, h);\n\t}\n}\n","/**\n * Sprite - Animated sprite class for game graphics\n *\n * Provides sprite animation support with multiple frames.\n */\n\nimport { Image } from \"@al8b/image\";\n\nexport interface SpriteProperties {\n\tframes?: number;\n\tfps?: number;\n}\n\nexport class Sprite {\n\tpublic name: string = \"\";\n\tpublic frames: Image[] = [];\n\tpublic animation_start: number = 0;\n\tpublic fps: number = 5;\n\tpublic ready: number = 0;\n\tpublic width: number;\n\tpublic height: number;\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.frames = [];\n\t\tthis.animation_start = 0;\n\t\tthis.fps = 5;\n\n\t\tif (this.width > 0 && this.height > 0) {\n\t\t\tthis.frames.push(new Image(this.width, this.height));\n\t\t\tthis.ready = 1;\n\t\t}\n\t}\n\n\t/**\n\t * Set animation frames per second\n\t * Preserves current animation position when changing FPS\n\t */\n\tsetFPS(fps: number): number {\n\t\tconst dt = 1000 / this.fps;\n\t\tconst frame = ((Date.now() - this.animation_start) / dt) % this.frames.length;\n\t\tthis.fps = fps;\n\t\tconst newDt = 1000 / fps;\n\t\tthis.animation_start = Date.now() - frame * newDt;\n\t\treturn fps;\n\t}\n\n\t/**\n\t * Set the current animation frame\n\t */\n\tsetFrame(frame: number): void {\n\t\tthis.animation_start = Date.now() - (1000 / this.fps) * frame;\n\t}\n\n\t/**\n\t * Get the current animation frame index\n\t */\n\tgetFrame(): number {\n\t\tconst dt = 1000 / this.fps;\n\t\treturn Math.floor((Date.now() - this.animation_start) / dt) % this.frames.length;\n\t}\n\n\t/**\n\t * Get the canvas of the current frame\n\t */\n\tgetCurrentFrameCanvas(): HTMLCanvasElement | null {\n\t\tif (!this.ready || this.frames.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.frames.length > 1) {\n\t\t\tif (this.animation_start === 0) {\n\t\t\t\tthis.animation_start = Date.now();\n\t\t\t}\n\t\t\tconst frame = this.getFrame();\n\t\t\tif (frame >= 0 && frame < this.frames.length) {\n\t\t\t\treturn this.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn this.frames[0].canvas;\n\t\t}\n\n\t\treturn this.frames[0].canvas;\n\t}\n}\n\n/**\n * Resolve the actual number of animation frames for a spritesheet image.\n *\n * Strategy: if the image height is an exact multiple of its width (square frames),\n * cap the requested frame count to the available rows. Otherwise trust the caller.\n *\n * @param imgWidth - Natural width of the loaded image\n * @param imgHeight - Natural height of the loaded image\n * @param requested - Frame count requested via SpriteProperties (defaults to 1)\n */\nfunction resolveFrameCount(imgWidth: number, imgHeight: number, requested: number): number {\n\tif (imgWidth > 0 && imgHeight % imgWidth === 0) {\n\t\tconst available = imgHeight / imgWidth;\n\t\treturn Math.min(requested, available);\n\t}\n\treturn requested;\n}\n\n/**\n * Load a sprite from a URL\n * Supports multi-frame spritesheets (vertical stacking)\n */\nexport function LoadSprite(url: string, properties?: SpriteProperties, loaded?: () => void): Sprite {\n\tconst sprite = new Sprite(0, 0);\n\tsprite.ready = 0;\n\n\tconst img = new window.Image();\n\tif (location.protocol !== \"file:\") {\n\t\timg.crossOrigin = \"Anonymous\";\n\t}\n\timg.src = url;\n\n\timg.onload = () => {\n\t\tsprite.ready = 1;\n\n\t\tif (img.width > 0 && img.height > 0) {\n\t\t\tif (properties?.fps) {\n\t\t\t\tsprite.fps = properties.fps;\n\t\t\t}\n\n\t\t\tsprite.width = img.width;\n\t\t\tconst numframes = resolveFrameCount(img.width, img.height, properties?.frames ?? 1);\n\t\t\tsprite.height = Math.round(img.height / numframes);\n\t\t\tsprite.frames = [];\n\n\t\t\tfor (let i = 0; i < numframes; i++) {\n\t\t\t\tconst frame = new Image(sprite.width, sprite.height);\n\t\t\t\tframe.initContext();\n\t\t\t\tconst ctx = frame.context!;\n\t\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\t\tctx.drawImage(img, 0, -i * sprite.height);\n\t\t\t\tsprite.frames.push(frame);\n\t\t\t}\n\t\t\tsprite.ready = 1;\n\t\t}\n\n\t\tif (loaded) {\n\t\t\tloaded();\n\t\t}\n\t};\n\n\timg.onerror = () => {\n\t\tsprite.ready = 1;\n\t};\n\n\treturn sprite;\n}\n\n/**\n * Update a sprite from an image element\n * Supports multi-frame spritesheets (vertical stacking)\n */\nexport function UpdateSprite(sprite: Sprite, img: HTMLImageElement, properties?: SpriteProperties): void {\n\tif (img.width > 0 && img.height > 0) {\n\t\tif (properties?.fps) {\n\t\t\tsprite.fps = properties.fps;\n\t\t}\n\t\tsprite.width = img.width;\n\t\tconst numframes = resolveFrameCount(img.width, img.height, properties?.frames ?? 1);\n\t\tsprite.height = Math.round(img.height / numframes);\n\t\tsprite.frames = [];\n\n\t\tfor (let i = 0; i < numframes; i++) {\n\t\t\tconst frame = new Image(sprite.width, sprite.height);\n\t\t\tframe.initContext();\n\t\t\tconst ctx = frame.context!;\n\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\tctx.drawImage(img, 0, -i * sprite.height);\n\t\t\tsprite.frames.push(frame);\n\t\t}\n\t\tsprite.ready = 1;\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 * 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","/**\n * PlayerService - Controls player UX from LootiScript\n *\n * Provides game scripts with the ability to control the player lifecycle\n * (quit, pause, resume, exit), adjust performance (fps, update_rate),\n * and communicate with the host application (postMessage).\n */\n\nimport type { PlayerDelegate } from \"./types\";\n\nexport class PlayerService {\n\tprivate delegate: PlayerDelegate;\n\tprivate interfaceCache: Record<string, any> | null = null;\n\n\tconstructor(delegate: PlayerDelegate) {\n\t\tthis.delegate = delegate;\n\t}\n\n\t/**\n\t * Get interface for game code (LootiScript `player.*`)\n\t */\n\tgetInterface(): Record<string, any> {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\n\t\tconst iface: Record<string, any> = {\n\t\t\tpause: () => this.delegate.pause(),\n\t\t\tresume: () => this.delegate.resume(),\n\t\t\tpostMessage: (message: any) => this.delegate.postMessage(message),\n\t\t\tsetFps: (fps: number) => {\n\t\t\t\tif (typeof fps === \"number\" && isFinite(fps) && fps > 0) {\n\t\t\t\t\tthis.delegate.setUpdateRate(fps);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\tObject.defineProperty(iface, \"fps\", {\n\t\t\tget: () => this.delegate.getFps(),\n\t\t\tenumerable: true,\n\t\t});\n\n\t\tObject.defineProperty(iface, \"update_rate\", {\n\t\t\tget: () => this.delegate.getUpdateRate(),\n\t\t\tset: (value: number) => {\n\t\t\t\tif (typeof value === \"number\" && isFinite(value) && value > 0) {\n\t\t\t\t\tthis.delegate.setUpdateRate(value);\n\t\t\t\t}\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t});\n\n\t\tthis.interfaceCache = iface;\n\t\treturn this.interfaceCache;\n\t}\n}\n","/**\n * Constants for Scene Management System\n */\n\nexport const DEFAULT_PATH = \"/\";\nexport const PATH_SEPARATOR = \"/\";\nexport const PARAM_PATTERN = /:(\\w+)/g;\nexport const PARAM_REPLACEMENT = \"([^/]+)\";\n","/**\n * Utility functions for Scene Management System\n */\n\n/**\n * Check if code is running in browser environment\n */\nexport function isBrowser(): boolean {\n\treturn typeof window !== \"undefined\";\n}\n\n/**\n * Safely execute a function with error handling\n */\nexport function safeExecute<T>(\n\tfn: () => T,\n\terrorHandler: (error: unknown, context?: string) => void,\n\tcontext?: string,\n): T | undefined {\n\ttry {\n\t\treturn fn();\n\t} catch (error) {\n\t\terrorHandler(error, context);\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Check if a value is a valid non-empty string\n */\nexport function isValidString(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * Check if a value is a valid object\n */\nexport function isValidObject(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/**\n * Normalize path by removing query string, hash, and ensuring leading slash\n */\nexport function normalizeScenePath(path: string): string {\n\tconst cleanPath = path.split(\"?\")[0].split(\"#\")[0];\n\treturn cleanPath.startsWith(\"/\") ? cleanPath : `/${cleanPath}`;\n}\n","import { PARAM_PATTERN, PARAM_REPLACEMENT } from \"./constants\";\nimport type { RouteDefinition } from \"./types\";\nimport { isValidString } from \"./utils\";\n\nexport class RouteManager {\n\tprivate routes: RouteDefinition[] = [];\n\n\t/**\n\t * Register a route\n\t * @param path Path pattern (e.g. \"/player/:id\")\n\t * @param sceneName Name of the scene to map to\n\t */\n\tregister(path: string, sceneName: string): void {\n\t\tif (!this.validateRouteInputs(path, sceneName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { regex, keys } = this.parsePath(path);\n\t\tthis.routes.push({\n\t\t\tpath,\n\t\t\tsceneName,\n\t\t\tregex,\n\t\t\tkeys,\n\t\t});\n\t}\n\n\t/**\n\t * Validate route registration inputs\n\t */\n\tprivate validateRouteInputs(path: unknown, sceneName: unknown): path is string {\n\t\tif (!isValidString(path)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isValidString(sceneName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Match a path to a route\n\t * @param path Path to match against registered routes\n\t * @returns Route match with scene name and params, or null if no match\n\t */\n\tmatch(path: string): {\n\t\tsceneName: string;\n\t\tparams: Record<string, string>;\n\t} | null {\n\t\tif (!isValidString(path)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (const route of this.routes) {\n\t\t\tconst match = this.tryMatchRoute(route, path);\n\t\t\tif (match) {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Try to match a single route against a path\n\t */\n\tprivate tryMatchRoute(\n\t\troute: RouteDefinition,\n\t\tpath: string,\n\t): {\n\t\tsceneName: string;\n\t\tparams: Record<string, string>;\n\t} | null {\n\t\tconst regexMatch = route.regex.exec(path);\n\t\tif (!regexMatch) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst params = this.extractParams(route.keys, regexMatch);\n\t\treturn {\n\t\t\tsceneName: route.sceneName,\n\t\t\tparams,\n\t\t};\n\t}\n\n\t/**\n\t * Extract route parameters from regex match\n\t */\n\tprivate extractParams(keys: string[], match: RegExpExecArray): Record<string, string> {\n\t\tconst params: Record<string, string> = {};\n\t\tkeys.forEach((key, index) => {\n\t\t\tparams[key] = match[index + 1];\n\t\t});\n\t\treturn params;\n\t}\n\n\t/**\n\t * Parse path pattern to regex\n\t * Converts route patterns like \"/player/:id\" to regex\n\t */\n\tprivate parsePath(path: string): {\n\t\tregex: RegExp;\n\t\tkeys: string[];\n\t} {\n\t\tconst keys: string[] = [];\n\t\tconst pattern = path\n\t\t\t.replace(PARAM_PATTERN, (_, key) => {\n\t\t\t\tkeys.push(key);\n\t\t\t\treturn PARAM_REPLACEMENT;\n\t\t\t})\n\t\t\t.replace(/\\//g, \"\\\\/\");\n\n\t\treturn {\n\t\t\tregex: new RegExp(`^${pattern}$`),\n\t\t\tkeys,\n\t\t};\n\t}\n\n\t/**\n\t * Clear all routes\n\t */\n\tclear(): void {\n\t\tthis.routes = [];\n\t}\n}\n","import { DEFAULT_PATH } from \"./constants\";\nimport type { RouteManager } from \"./route-manager\";\nimport type { SceneManager } from \"./scene-manager\";\nimport type { RouterState } from \"./types\";\nimport { isBrowser, normalizeScenePath } from \"./utils\";\n\nexport class Router {\n\tprivate routeManager: RouteManager;\n\tprivate sceneManager: SceneManager;\n\tprivate state: RouterState = {\n\t\tpath: DEFAULT_PATH,\n\t\tparams: {},\n\t\tsceneName: null,\n\t};\n\n\tconstructor(routeManager: RouteManager, sceneManager: SceneManager) {\n\t\tthis.routeManager = routeManager;\n\t\tthis.sceneManager = sceneManager;\n\t\tthis.setupPopStateListener();\n\t}\n\n\t/**\n\t * Setup browser history listener\n\t */\n\tprivate setupPopStateListener(): void {\n\t\tif (isBrowser()) {\n\t\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\t\tthis.handlePathChange(window.location.pathname);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Navigate to a path (adds to browser history)\n\t * @param path Path to navigate to (e.g., \"/player/42\")\n\t */\n\tpush(path: string): void {\n\t\tif (!this.validatePath(path)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedPath = normalizeScenePath(path);\n\t\tif (normalizedPath === this.state.path) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.updateBrowserHistory(normalizedPath, \"push\");\n\t\tthis.handlePathChange(normalizedPath);\n\t}\n\n\t/**\n\t * Replace current path (doesn't add to browser history)\n\t * @param path Path to navigate to (e.g., \"/player/42\")\n\t */\n\treplace(path: string): void {\n\t\tif (!this.validatePath(path)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedPath = normalizeScenePath(path);\n\t\tthis.updateBrowserHistory(normalizedPath, \"replace\");\n\t\tthis.handlePathChange(normalizedPath);\n\t}\n\n\t/**\n\t * Go back in browser history\n\t */\n\tback(): void {\n\t\tif (isBrowser()) {\n\t\t\twindow.history.back();\n\t\t}\n\t}\n\n\t/**\n\t * Get current state (returns a copy to prevent mutation)\n\t */\n\tgetState(): RouterState {\n\t\treturn {\n\t\t\t...this.state,\n\t\t};\n\t}\n\n\t/**\n\t * Validate path input\n\t */\n\tprivate validatePath(path: unknown): path is string {\n\t\tif (!path || typeof path !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Update browser history\n\t */\n\tprivate updateBrowserHistory(path: string, method: \"push\" | \"replace\"): void {\n\t\tif (!isBrowser()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"push\") {\n\t\t\twindow.history.pushState({}, \"\", path);\n\t\t} else {\n\t\t\twindow.history.replaceState({}, \"\", path);\n\t\t}\n\t}\n\n\t/**\n\t * Handle path change\n\t * @param path Path to match against routes\n\t */\n\tprivate handlePathChange(path: string): void {\n\t\tconst normalizedPath = normalizeScenePath(path);\n\t\tconst match = this.routeManager.match(normalizedPath);\n\n\t\tif (match) {\n\t\t\tthis.updateStateWithMatch(normalizedPath, match);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleNoRouteMatch(normalizedPath);\n\t}\n\n\t/**\n\t * Update state when route matches\n\t */\n\tprivate updateStateWithMatch(\n\t\tpath: string,\n\t\tmatch: {\n\t\t\tsceneName: string;\n\t\t\tparams: Record<string, string>;\n\t\t},\n\t): void {\n\t\tthis.state = {\n\t\t\tpath,\n\t\t\tparams: match.params,\n\t\t\tsceneName: match.sceneName,\n\t\t};\n\t\tthis.sceneManager.setActiveScene(match.sceneName, match.params);\n\t}\n\n\t/**\n\t * Handle case when no route matches\n\t */\n\tprivate handleNoRouteMatch(path: string): void {\n\t\tif (!this.sceneManager.hasActiveScene()) {\n\t\t\tthis.activateFirstAvailableScene(path);\n\t\t}\n\t}\n\n\t/**\n\t * Activate first available scene as fallback\n\t */\n\tprivate activateFirstAvailableScene(path: string): void {\n\t\tconst availableScenes = this.sceneManager.registry.getNames();\n\n\t\tif (availableScenes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst firstScene = availableScenes[0];\n\t\tthis.state = {\n\t\t\tpath,\n\t\t\tparams: {},\n\t\t\tsceneName: firstScene,\n\t\t};\n\t\tthis.sceneManager.setActiveScene(firstScene, {});\n\t}\n\n\t/**\n\t * Initialize router with current window path\n\t * Should be called after routes are registered but before game loop starts\n\t */\n\tinit(): void {\n\t\tconst initialPath = isBrowser() ? window.location.pathname : DEFAULT_PATH;\n\n\t\tthis.handlePathChange(initialPath);\n\t\tthis.ensureActiveScene();\n\t}\n\n\t/**\n\t * Ensure at least one scene is active after initialization\n\t */\n\tprivate ensureActiveScene(): void {\n\t\tif (this.sceneManager.hasActiveScene()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst availableScenes = this.sceneManager.registry.getNames();\n\n\t\tif (availableScenes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst firstScene = availableScenes[0];\n\t\tthis.state = {\n\t\t\tpath: this.state.path,\n\t\t\tparams: {},\n\t\t\tsceneName: firstScene,\n\t\t};\n\t\tthis.sceneManager.setActiveScene(firstScene, {});\n\t}\n\n\t/**\n\t * Get public API interface for VM\n\t * This is what gets exposed to lootiscript as `router`\n\t * Note: VM may not support getters properly, so we use both functions and properties\n\t */\n\tgetInterface(): any {\n\t\tconst routerInterface: any = {\n\t\t\tpush: (path: string) => this.push(path),\n\t\t\treplace: (path: string) => this.replace(path),\n\t\t\tback: () => this.back(),\n\t\t\t// Provide function accessors for VM compatibility (getters may not work in VM)\n\t\t\tgetPath: () => this.state.path,\n\t\t\tgetParams: () => this.state.params,\n\t\t\tgetSceneName: () => this.state.sceneName,\n\t\t};\n\n\t\t// Define dynamic properties that always return current state\n\t\t// Using Object.defineProperty for better VM compatibility than class getters\n\t\tObject.defineProperty(routerInterface, \"path\", {\n\t\t\tget: () => this.state.path,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t\tObject.defineProperty(routerInterface, \"params\", {\n\t\t\tget: () => this.state.params,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t\tObject.defineProperty(routerInterface, \"sceneName\", {\n\t\t\tget: () => this.state.sceneName,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\n\t\treturn routerInterface;\n\t}\n}\n","import type { SceneDefinition } from \"./types\";\n\nexport class SceneRegistry {\n\tprivate scenes: Map<string, SceneDefinition> = new Map();\n\n\t/**\n\t * Register a new scene\n\t */\n\tregister(name: string, definition: SceneDefinition): void {\n\t\tthis.scenes.set(name, definition);\n\t}\n\n\t/**\n\t * Get a scene definition\n\t */\n\tget(name: string): SceneDefinition | undefined {\n\t\treturn this.scenes.get(name);\n\t}\n\n\t/**\n\t * Check if scene exists\n\t */\n\thas(name: string): boolean {\n\t\treturn this.scenes.has(name);\n\t}\n\n\t/**\n\t * Get all registered scene names\n\t */\n\tgetNames(): string[] {\n\t\treturn Array.from(this.scenes.keys());\n\t}\n\n\t/**\n\t * Clear all scenes\n\t */\n\tclear(): void {\n\t\tthis.scenes.clear();\n\t}\n}\n","/**\n * Custom error classes for Scene Management System\n */\n\nexport class SceneError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly context?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SceneError\";\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n}\n\nexport class SceneNotFoundError extends SceneError {\n\tconstructor(sceneName: string, availableScenes: string[] = []) {\n\t\tsuper(`Scene not found: ${sceneName}`, {\n\t\t\tsceneName,\n\t\t\tavailableScenes,\n\t\t});\n\t\tthis.name = \"SceneNotFoundError\";\n\t}\n}\n\nexport class InvalidPathError extends SceneError {\n\tconstructor(path: unknown) {\n\t\tsuper(`Invalid path: ${path}`, {\n\t\t\tpath,\n\t\t});\n\t\tthis.name = \"InvalidPathError\";\n\t}\n}\n\nexport class InvalidSceneDefinitionError extends SceneError {\n\tconstructor(sceneName: string) {\n\t\tsuper(`Invalid scene definition for '${sceneName}'`, {\n\t\t\tsceneName,\n\t\t});\n\t\tthis.name = \"InvalidSceneDefinitionError\";\n\t}\n}\n","import { RouteManager } from \"./route-manager\";\nimport { Router } from \"./router\";\nimport { SceneRegistry } from \"./scene-registry\";\nimport { SceneNotFoundError } from \"./errors\";\nimport type { SceneDefinition } from \"./types\";\nimport { isValidObject, isValidString, safeExecute } from \"./utils\";\n\nexport class SceneManager {\n\tpublic readonly registry: SceneRegistry;\n\tpublic readonly routeManager: RouteManager;\n\tpublic readonly router: Router;\n\n\tprivate activeSceneName: string | null = null;\n\tprivate activeScene: SceneDefinition | null = null;\n\tprivate onError: ((error: unknown) => void) | undefined;\n\n\tconstructor(onError?: (error: unknown) => void) {\n\t\tthis.registry = new SceneRegistry();\n\t\tthis.routeManager = new RouteManager();\n\t\tthis.onError = onError;\n\t\t// Router needs reference to this manager, so we create it last\n\t\tthis.router = new Router(this.routeManager, this);\n\t}\n\n\t/**\n\t * Register a scene\n\t * @param name Unique name for the scene\n\t * @param definition Scene definition object with lifecycle methods\n\t */\n\tregisterScene(name: string, definition: SceneDefinition): void {\n\t\tif (!this.validateSceneRegistration(name, definition)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.registry.register(name, definition);\n\t}\n\n\t/**\n\t * Validate scene registration inputs\n\t */\n\tprivate validateSceneRegistration(name: unknown, definition: unknown): definition is SceneDefinition {\n\t\tif (!isValidString(name)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isValidObject(definition)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Register a route\n\t */\n\tregisterRoute(path: string, sceneName: string): void {\n\t\tthis.routeManager.register(path, sceneName);\n\t}\n\n\t/**\n\t * Set active scene\n\t * @param name Name of the scene to activate\n\t * @param params Route parameters to pass to onEnter\n\t */\n\tsetActiveScene(name: string, params: Record<string, string> = {}): void {\n\t\tconst newScene = this.registry.get(name);\n\n\t\tif (!newScene) {\n\t\t\tthis.handleSceneNotFound(name);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isSameScene(name, newScene)) {\n\t\t\tthis.handleSameSceneActivation(newScene, name, params);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.transitionToScene(name, newScene, params);\n\t}\n\n\t/**\n\t * Handle scene not found error\n\t */\n\tprivate handleSceneNotFound(name: string): void {\n\t\tconst availableScenes = this.registry.getNames();\n\t\tconst error = new SceneNotFoundError(name, availableScenes);\n\t\tif (this.onError) {\n\t\t\tthis.onError(error);\n\t\t} else {\n\t\t\tconsole.error(error.message);\n\t\t}\n\t}\n\n\t/**\n\t * Check if scene is already active\n\t */\n\tprivate isSameScene(name: string, scene: SceneDefinition): boolean {\n\t\treturn this.activeSceneName === name && this.activeScene === scene;\n\t}\n\n\t/**\n\t * Handle activation of already active scene\n\t */\n\tprivate handleSameSceneActivation(scene: SceneDefinition, _name: string, params: Record<string, string>): void {\n\t\tif (scene.onEnter) {\n\t\t\tsafeExecute(\n\t\t\t\t() => scene.onEnter?.(params),\n\t\t\t\t(error) => {\n\t\t\t\t\tif (this.onError) {\n\t\t\t\t\t\tthis.onError(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(\"Scene onEnter error:\", error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Transition from current scene to new scene\n\t */\n\tprivate transitionToScene(name: string, newScene: SceneDefinition, params: Record<string, string>): void {\n\t\tthis.leaveCurrentScene();\n\t\tthis.activateNewScene(name, newScene, params);\n\t}\n\n\t/**\n\t * Leave current scene\n\t */\n\tprivate leaveCurrentScene(): void {\n\t\tif (!this.activeScene?.onLeave) {\n\t\t\treturn;\n\t\t}\n\n\t\tsafeExecute(\n\t\t\t() => this.activeScene?.onLeave?.(),\n\t\t\t(error) => {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\tthis.onError(error);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Scene onLeave error:\", error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Activate new scene\n\t */\n\tprivate activateNewScene(name: string, scene: SceneDefinition, params: Record<string, string>): void {\n\t\tthis.activeSceneName = name;\n\t\tthis.activeScene = scene;\n\n\t\tthis.initializeSceneIfNeeded(name, scene);\n\t\tthis.enterScene(name, scene, params);\n\t}\n\n\t/**\n\t * Initialize scene if not already initialized\n\t */\n\tprivate initializeSceneIfNeeded(_name: string, scene: SceneDefinition): void {\n\t\tif (!scene.init || scene._initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tsafeExecute(\n\t\t\t() => {\n\t\t\t\tscene.init?.();\n\t\t\t\tscene._initialized = true;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\tthis.onError(error);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Scene init error:\", error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Enter scene (call onEnter lifecycle method)\n\t */\n\tprivate enterScene(_name: string, scene: SceneDefinition, params: Record<string, string>): void {\n\t\tif (!scene.onEnter) {\n\t\t\treturn;\n\t\t}\n\n\t\tsafeExecute(\n\t\t\t() => scene.onEnter?.(params),\n\t\t\t(error) => {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\tthis.onError(error);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Scene onEnter error:\", error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Update active scene (called every frame)\n\t */\n\tupdate(): void {\n\t\tif (!this.activeScene?.update) {\n\t\t\treturn;\n\t\t}\n\n\t\tsafeExecute(\n\t\t\t() => this.activeScene?.update?.(),\n\t\t\t(error) => {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\tthis.onError(error);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Scene update error:\", error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Draw active scene (called every frame)\n\t */\n\tdraw(): void {\n\t\tif (!this.activeScene) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.activeScene.draw) {\n\t\t\treturn;\n\t\t}\n\n\t\tsafeExecute(\n\t\t\t() => this.activeScene?.draw?.(),\n\t\t\t(error) => {\n\t\t\t\tif (this.onError) {\n\t\t\t\t\tthis.onError(error);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Scene draw error:\", error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Check if there is an active scene\n\t */\n\thasActiveScene(): boolean {\n\t\treturn this.activeScene !== null;\n\t}\n\n\t/**\n\t * Get current active scene name\n\t * @returns Name of currently active scene, or null if none\n\t */\n\tgetCurrentSceneName(): string | null {\n\t\treturn this.activeSceneName;\n\t}\n\n\t/**\n\t * Get current active scene definition\n\t * @returns Currently active scene definition, or null if none\n\t */\n\tgetCurrentScene(): SceneDefinition | null {\n\t\treturn this.activeScene;\n\t}\n\n\tprivate interfaceCache: any = null;\n\n\t/**\n\t * Get public API interface for VM\n\t */\n\tgetInterface(): any {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\t\tthis.interfaceCache = {\n\t\t\tregister: (name: string, def: any) => this.registerScene(name, def),\n\t\t\troute: (path: string, sceneName: string) => this.registerRoute(path, sceneName),\n\t\t\tgoto: (name: string, params: any) => this.setActiveScene(name, params),\n\t\t\tcurrent: () => this.activeSceneName,\n\t\t};\n\t\treturn this.interfaceCache;\n\t}\n}\n","/**\n * Sprite rendering for Screen class\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { PrimitiveScreen } from \"./primitives-screen\";\n\nexport class SpriteScreen extends PrimitiveScreen {\n\t// Cache imageSmoothingEnabled — only set when pixelated flag changes\n\tprivate _lastImageSmoothing = true;\n\n\t// Cache frame time once per draw frame instead of per-sprite\n\tprotected _frameTime = 0;\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\toverride initDraw(): void {\n\t\tsuper.initDraw();\n\t\tthis._frameTime = performance.now();\n\t}\n\n\t/**\n\t * Set imageSmoothingEnabled only when it actually changes\n\t */\n\tprotected setImageSmoothing(): void {\n\t\tconst smooth = !this.pixelated;\n\t\tif (smooth !== this._lastImageSmoothing) {\n\t\t\tthis.context.imageSmoothingEnabled = smooth;\n\t\t\tthis._lastImageSmoothing = smooth;\n\t\t}\n\t}\n\n\t/**\n\t * Get the canvas for the current sprite frame\n\t */\n\tprotected getSpriteFrame(sprite: Sprite | string | any): HTMLCanvasElement | null {\n\t\tlet frame: number | null = null;\n\n\t\t// Handle string sprite name\n\t\tif (typeof sprite === \"string\") {\n\t\t\tconst spriteName = sprite;\n\t\t\tlet spriteObj: Sprite | null = null;\n\n\t\t\tif (this.runtime && this.runtime.sprites) {\n\t\t\t\tspriteObj = this.runtime.sprites[sprite];\n\t\t\t}\n\n\t\t\t// Handle \"sprite.frame\" format (e.g., \"player.0\")\n\t\t\tif (!spriteObj) {\n\t\t\t\tconst parts = sprite.split(\".\");\n\t\t\t\tif (parts.length > 1 && this.runtime && this.runtime.sprites) {\n\t\t\t\t\tspriteObj = this.runtime.sprites[parts[0]];\n\t\t\t\t\tframe = Number.parseInt(parts[1]) || 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Report sprite not found error\n\t\t\tif (!spriteObj) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7004, { spriteName });\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tsprite = spriteObj;\n\t\t}\n\t\t// Handle Image instances - check for objects with canvas but no frames\n\t\telse if (sprite && typeof sprite === \"object\" && (sprite as any).canvas && !(sprite as any).frames) {\n\t\t\treturn (sprite as any).canvas || (sprite as any).image || null;\n\t\t}\n\n\t\t// Validate sprite object\n\t\tif (!sprite || !(sprite as Sprite).ready) {\n\t\t\tconst spriteName = typeof sprite === \"string\" ? sprite : \"unknown\";\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7005, { spriteName });\n\t\t\treturn null;\n\t\t}\n\n\t\tconst spriteObj = sprite as Sprite;\n\n\t\t// Handle multi-frame sprites — use cached _frameTime instead of Date.now() per call\n\t\tif (spriteObj.frames && spriteObj.frames.length > 1) {\n\t\t\tif (frame === null) {\n\t\t\t\tif (spriteObj.animation_start === 0) {\n\t\t\t\t\tspriteObj.animation_start = this._frameTime;\n\t\t\t\t}\n\t\t\t\tconst dt = 1000 / spriteObj.fps;\n\t\t\t\tframe = Math.floor((this._frameTime - spriteObj.animation_start) / dt) % spriteObj.frames.length;\n\t\t\t}\n\t\t\tif (frame >= 0 && frame < spriteObj.frames.length) {\n\t\t\t\treturn spriteObj.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\t\t// Handle single-frame sprites\n\t\telse if (spriteObj.frames && spriteObj.frames[0]) {\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Draw a sprite\n\t */\n\tdrawSprite(sprite: Sprite | string | any, x: number, y: number, w?: number, h?: number): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = canvas.width;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / canvas.width) * canvas.height;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\t// Only when no screen/object transforms are active (simple AABB check)\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(canvas, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(canvas, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a portion of a sprite\n\t */\n\tdrawSpritePart(\n\t\tsprite: Sprite | string | any,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = sw;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / sw) * sh;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\t-w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\tx - w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-y - h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a map\n\t */\n\tdrawMap(map: Map | string, x: number, y: number, w: number, h: number): void {\n\t\tlet mapObj: Map | null = null;\n\n\t\tif (typeof map === \"string\") {\n\t\t\tif (this.runtime && this.runtime.maps) {\n\t\t\t\tmapObj = this.runtime.maps[map];\n\t\t\t}\n\t\t} else {\n\t\t\tmapObj = map;\n\t\t}\n\n\t\tif (!(mapObj && mapObj.ready)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tmapObj.draw(this.context, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tmapObj.draw(this.context, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n}\n","import { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { BaseScreen } from \"../core/base-screen\";\n\n/**\n * Adds primitive shape drawing APIs on top of BaseScreen.\n */\nexport class PrimitiveScreen extends BaseScreen {\n\tfillRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\t// Validate drawing context\n\t\tif (!this.context) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7092, {});\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate drawing parameters\n\t\tif (!isFinite(x) || !isFinite(y) || !isFinite(w) || !isFinite(h) || w <= 0 || h <= 0) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7093, { error: `Invalid parameters: x=${x}, y=${y}, w=${w}, h=${h}` });\n\t\t\treturn;\n\t\t}\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tfillRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tdrawRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tdrawRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tdrawLine(x1: number, y1: number, x2: number, y2: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(x1, -y1);\n\t\tthis.context.lineTo(x2, -y2);\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.closePath();\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolyline(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawQuadCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 4) {\n\t\t\tthis.context.quadraticCurveTo(points[index], -points[index + 1], points[index + 2], -points[index + 3]);\n\t\t\tindex += 4;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawBezierCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 6) {\n\t\t\tthis.context.bezierCurveTo(\n\t\t\t\tpoints[index],\n\t\t\t\t-points[index + 1],\n\t\t\t\tpoints[index + 2],\n\t\t\t\t-points[index + 3],\n\t\t\t\tpoints[index + 4],\n\t\t\t\t-points[index + 5],\n\t\t\t);\n\t\t\tindex += 6;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tfillArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tprivate extractPoints(args: any[]): {\n\t\tcolor?: string | number;\n\t\tpoints?: number[];\n\t} {\n\t\tlet color: string | number | undefined;\n\t\tlet points: number[] | undefined;\n\n\t\tif (args.length > 0 && args.length % 2 === 1 && typeof args[args.length - 1] === \"string\") {\n\t\t\tcolor = args[args.length - 1];\n\t\t\tpoints = args.slice(0, -1);\n\t\t} else if (Array.isArray(args[0])) {\n\t\t\tif (args[1] && typeof args[1] === \"string\") {\n\t\t\t\tcolor = args[1];\n\t\t\t}\n\t\t\tpoints = args[0];\n\t\t} else {\n\t\t\tpoints = args as number[];\n\t\t}\n\n\t\treturn {\n\t\t\tcolor,\n\t\t\tpoints,\n\t\t};\n\t}\n}\n","import { APIErrorCode, createDiagnostic, formatForBrowser, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { ZBuffer } from \"../tri\";\nimport type { ScreenInterface, ScreenOptions } from \"../types\";\n\n/**\n * BaseScreen encapsulates canvas/context management plus shared drawing state.\n * Feature-specific behaviors (primitives, sprites, text, triangles) extend this class.\n */\nexport class BaseScreen {\n\tprotected canvas: HTMLCanvasElement;\n\tprotected context!: CanvasRenderingContext2D;\n\tprotected runtime: any;\n\n\tpublic width!: number;\n\tpublic height!: number;\n\n\t// Drawing state\n\tprotected alpha = 1;\n\tprotected pixelated = 1;\n\tprotected line_width = 1;\n\tprotected font = \"BitCell\";\n\n\t// Transformations\n\tprotected translation_x = 0;\n\tprotected translation_y = 0;\n\tprotected rotation = 0;\n\tprotected scale_x = 1;\n\tprotected scale_y = 1;\n\tprotected screen_transform = false;\n\n\t// Object transformations\n\tprotected object_rotation = 0;\n\tprotected object_scale_x = 1;\n\tprotected object_scale_y = 1;\n\tprotected anchor_x = 0;\n\tprotected anchor_y = 0;\n\n\t// Blending + font caches\n\tprotected blending: Record<string, string> = {};\n\tprotected font_load_requested: Record<string, boolean> = {};\n\tprotected font_loaded: Record<string, boolean> = {};\n\n\t// Interface cache\n\tprotected interfaceCache: ScreenInterface | null = null;\n\n\t// Cursor management\n\tprotected cursor: string = \"default\";\n\tprotected cursor_visibility: string = \"auto\";\n\tprotected last_mouse_move: number = Date.now();\n\n\t// 3D helper\n\tprotected zBuffer: ZBuffer;\n\n\tconstructor(options: ScreenOptions = {}) {\n\t\tthis.runtime = options.runtime;\n\n\t\tif (options.canvas) {\n\t\t\tthis.canvas = options.canvas;\n\t\t\tif (this.canvas.width === 0 || this.canvas.height === 0) {\n\t\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\t\tthis.canvas.height = options.height || 1920;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.canvas = document.createElement(\"canvas\");\n\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\tthis.canvas.height = options.height || 1920;\n\t\t}\n\n\t\tthis.initContext();\n\n\t\tthis.blending = {\n\t\t\tnormal: \"source-over\",\n\t\t\tadditive: \"lighter\",\n\t\t};\n\n\t\tconst blendModes = [\n\t\t\t\"source-over\",\n\t\t\t\"source-in\",\n\t\t\t\"source-out\",\n\t\t\t\"source-atop\",\n\t\t\t\"destination-over\",\n\t\t\t\"destination-in\",\n\t\t\t\"destination-out\",\n\t\t\t\"destination-atop\",\n\t\t\t\"lighter\",\n\t\t\t\"copy\",\n\t\t\t\"xor\",\n\t\t\t\"multiply\",\n\t\t\t\"screen\",\n\t\t\t\"overlay\",\n\t\t\t\"darken\",\n\t\t\t\"lighten\",\n\t\t\t\"color-dodge\",\n\t\t\t\"color-burn\",\n\t\t\t\"hard-light\",\n\t\t\t\"soft-light\",\n\t\t\t\"difference\",\n\t\t\t\"exclusion\",\n\t\t\t\"hue\",\n\t\t\t\"saturation\",\n\t\t\t\"color\",\n\t\t\t\"luminosity\",\n\t\t];\n\n\t\tfor (const mode of blendModes) {\n\t\t\tthis.blending[mode] = mode;\n\t\t}\n\n\t\tthis.loadFont(this.font);\n\t\tthis.zBuffer = new ZBuffer(this.canvas.width, this.canvas.height);\n\n\t\tthis.cursor = \"default\";\n\n\t\tthis.canvas.addEventListener(\"mousemove\", () => {\n\t\t\tthis.last_mouse_move = Date.now();\n\t\t\tif (this.cursor !== \"default\" && this.cursor_visibility === \"auto\") {\n\t\t\t\tthis.cursor = \"default\";\n\t\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t\t}\n\t\t});\n\n\t\t// When the context is lost and then restored, base transform needs to be reinstated\n\t\tthis.canvas.addEventListener(\"contextrestored\", () => {\n\t\t\tthis.initContext();\n\t\t});\n\n\t\tsetInterval(() => this.checkMouseCursor(), 1000);\n\t\tthis.cursor_visibility = \"auto\";\n\t}\n\n\tprotected initContext(): void {\n\t\tconst ctx = this.canvas.getContext(\"2d\", {\n\t\t\talpha: false,\n\t\t});\n\t\tif (!ctx) {\n\t\t\tconst diagnostic = createDiagnostic(APIErrorCode.E7001);\n\t\t\tconst formatted = formatForBrowser(diagnostic);\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7001, {});\n\n\t\t\tthrow new Error(formatted);\n\t\t}\n\n\t\tif (ctx !== this.context) {\n\t\t\tthis.context = ctx;\n\t\t} else {\n\t\t\tthis.context.restore();\n\t\t}\n\n\t\tthis.context.save();\n\t\tthis.context.translate(this.canvas.width / 2, this.canvas.height / 2);\n\n\t\t// Calculate ratio: Math.min(canvas.width/200, canvas.height/200)\n\t\tconst ratio = Math.min(this.canvas.width / 200, this.canvas.height / 200);\n\t\tthis.context.scale(ratio, ratio);\n\n\t\t// Set logical width/height\n\t\tthis.width = this.canvas.width / ratio;\n\t\tthis.height = this.canvas.height / ratio;\n\t\tthis.context.lineCap = \"round\";\n\t}\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\tinitDraw(): void {\n\t\tthis.alpha = 1;\n\t\tthis.line_width = 1;\n\t\t// Note: Supersampling not implemented in l8b\n\t\t// If needed, add: if (this.supersampling != this.previous_supersampling) { this.resize(); this.previous_supersampling = this.supersampling; }\n\t}\n\n\t/**\n\t * Update interface dimensions (called before each draw frame)\n\t */\n\tupdateInterface(): void {\n\t\t// Update interface cache if it exists\n\t\tif (this.interfaceCache) {\n\t\t\tthis.interfaceCache.width = this.width;\n\t\t\tthis.interfaceCache.height = this.height;\n\t\t}\n\t}\n\n\tclear(color?: string): void {\n\t\tthis.context.globalAlpha = 1;\n\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\tthis.context.fillStyle = color || \"#000\";\n\t\tthis.context.strokeStyle = color || \"#000\";\n\t\tthis.context.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n\t\tthis.zBuffer.clear();\n\t}\n\n\tsetColor(color: string | number): void {\n\t\tif (!color) return;\n\n\t\tif (!Number.isNaN(Number.parseInt(String(color)))) {\n\t\t\tconst num = Number.parseInt(String(color));\n\t\t\tconst r = ((Math.floor(num / 100) % 10) / 9) * 255;\n\t\t\tconst g = ((Math.floor(num / 10) % 10) / 9) * 255;\n\t\t\tconst b = ((num % 10) / 9) * 255;\n\t\t\tconst c = 0xff000000 + (r << 16) + (g << 8) + b;\n\t\t\tconst hex = \"#\" + c.toString(16).substring(2, 8);\n\t\t\tthis.context.fillStyle = hex;\n\t\t\tthis.context.strokeStyle = hex;\n\t\t} else if (typeof color === \"string\") {\n\t\t\t// Validate color format\n\t\t\tconst isValidColor =\n\t\t\t\t/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(color) ||\n\t\t\t\t/^rgb\\(|^rgba\\(|^hsl\\(|^hsla\\(/.test(color) ||\n\t\t\t\t/^(red|green|blue|yellow|cyan|magenta|black|white|gray|grey|orange|pink|purple|brown|transparent)$/i.test(color);\n\n\t\t\tif (!isValidColor) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7003, { color });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.context.fillStyle = color;\n\t\t\tthis.context.strokeStyle = color;\n\t\t}\n\t}\n\n\tsetAlpha(alpha: number): void {\n\t\tthis.alpha = alpha;\n\t}\n\n\tsetPixelated(pixelated: number): void {\n\t\tthis.pixelated = pixelated;\n\t}\n\n\tsetBlending(blending: string): void {\n\t\tconst blend = this.blending[blending || \"normal\"];\n\n\t\tif (!blend) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7007, { blendMode: blending });\n\t\t\t// Fallback to normal blend mode\n\t\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalCompositeOperation = blend as GlobalCompositeOperation;\n\t}\n\n\tsetLineWidth(width: number): void {\n\t\tthis.line_width = width;\n\t}\n\n\tsetLineDash(dash: number[] | null): void {\n\t\tif (!Array.isArray(dash)) {\n\t\t\tthis.context.setLineDash([]);\n\t\t} else {\n\t\t\tthis.context.setLineDash(dash);\n\t\t}\n\t}\n\n\tsetLinearGradient(x1: number, y1: number, x2: number, y2: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createLinearGradient(x1, -y1, x2, -y2);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetRadialGradient(x: number, y: number, radius: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createRadialGradient(x, -y, 0, x, -y, radius);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetFont(font: string): void {\n\t\tthis.font = font || \"Verdana\";\n\t\tthis.loadFont(this.font);\n\t}\n\n\tloadFont(font: string = \"BitCell\"): void {\n\t\tif (this.font_load_requested[font]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.font_load_requested[font] = true;\n\t\ttry {\n\t\t\tdocument.fonts?.load?.(`16pt ${font}`).catch(() => {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7006, { font });\n\t\t\t});\n\t\t} catch {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7006, { font });\n\t\t}\n\t}\n\n\tisFontReady(font: string = this.font): number {\n\t\tif (this.font_loaded[font]) {\n\t\t\treturn 1;\n\t\t}\n\n\t\ttry {\n\t\t\tconst ready = document.fonts?.check?.(`16pt ${font}`) ?? true;\n\t\t\tif (ready) {\n\t\t\t\tthis.font_loaded[font] = true;\n\t\t\t}\n\t\t\treturn ready ? 1 : 0;\n\t\t} catch {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tsetTranslation(tx: number, ty: number): void {\n\t\tthis.translation_x = isFinite(tx) ? tx : 0;\n\t\tthis.translation_y = isFinite(ty) ? ty : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetScale(x: number, y: number): void {\n\t\tthis.scale_x = isFinite(x) && x !== 0 ? x : 1;\n\t\tthis.scale_y = isFinite(y) && y !== 0 ? y : 1;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetRotation(rotation: number): void {\n\t\tthis.rotation = isFinite(rotation) ? rotation : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tprotected updateScreenTransform(): void {\n\t\tthis.screen_transform =\n\t\t\tthis.translation_x !== 0 ||\n\t\t\tthis.translation_y !== 0 ||\n\t\t\tthis.scale_x !== 1 ||\n\t\t\tthis.scale_y !== 1 ||\n\t\t\tthis.rotation !== 0;\n\t}\n\n\tsetDrawAnchor(ax: number, ay: number): void {\n\t\tthis.anchor_x = typeof ax === \"number\" ? ax : 0;\n\t\tthis.anchor_y = typeof ay === \"number\" ? ay : 0;\n\t}\n\n\tsetDrawRotation(rotation: number): void {\n\t\tthis.object_rotation = rotation;\n\t}\n\n\tsetDrawScale(x: number, y: number = x): void {\n\t\tthis.object_scale_x = x;\n\t\tthis.object_scale_y = y;\n\t}\n\n\tprotected initDrawOp(x: number, y: number, object_transform: boolean = true): boolean {\n\t\tlet res = false;\n\n\t\tif (this.screen_transform) {\n\t\t\tthis.context.save();\n\t\t\tres = true;\n\t\t\tthis.context.translate(this.translation_x, -this.translation_y);\n\t\t\tthis.context.scale(this.scale_x, this.scale_y);\n\t\t\tthis.context.rotate((-this.rotation / 180) * Math.PI);\n\t\t\tthis.context.translate(x, y);\n\t\t}\n\n\t\tif (object_transform && (this.object_rotation !== 0 || this.object_scale_x !== 1 || this.object_scale_y !== 1)) {\n\t\t\tif (!res) {\n\t\t\t\tthis.context.save();\n\t\t\t\tres = true;\n\t\t\t\tthis.context.translate(x, y);\n\t\t\t}\n\n\t\t\tif (this.object_rotation !== 0) {\n\t\t\t\tthis.context.rotate((-this.object_rotation / 180) * Math.PI);\n\t\t\t}\n\n\t\t\tif (this.object_scale_x !== 1 || this.object_scale_y !== 1) {\n\t\t\t\tthis.context.scale(this.object_scale_x, this.object_scale_y);\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tprotected closeDrawOp(): void {\n\t\tthis.context.restore();\n\t}\n\n\t/**\n\t * Check mouse cursor visibility\n\t * Auto-hides cursor after 4 seconds of inactivity\n\t */\n\tprotected checkMouseCursor(): void {\n\t\tif (Date.now() > this.last_mouse_move + 4000 && this.cursor_visibility === \"auto\") {\n\t\t\tif (this.cursor !== \"none\") {\n\t\t\t\tthis.cursor = \"none\";\n\t\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set cursor visibility\n\t */\n\tsetCursorVisible(visible: boolean): void {\n\t\tthis.cursor_visibility = visible ? \"default\" : \"none\";\n\t\tif (visible) {\n\t\t\tthis.cursor = \"default\";\n\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t} else {\n\t\t\tthis.cursor = \"none\";\n\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t}\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\treturn this.canvas;\n\t}\n\n\tgetContext(): CanvasRenderingContext2D {\n\t\treturn this.context;\n\t}\n\n\tresize(width?: number, height?: number): void {\n\t\tif (width && height) {\n\t\t\t// Validate dimensions\n\t\t\tif (width <= 0 || height <= 0 || !isFinite(width) || !isFinite(height)) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7002, { width, height });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.canvas.width = width;\n\t\t\tthis.canvas.height = height;\n\t\t\tthis.initContext();\n\t\t\tthis.zBuffer.resize(width, height);\n\t\t\t// Update interface cache immediately after resize\n\t\t\tthis.updateInterface();\n\t\t}\n\t}\n}\n","/**\n * TTRI - Textured Triangle Rendering (Software Rasterization)\n *\n * Based on TIC-80's ttri implementation for 3D-style graphics.\n * This is NOT a 3D engine - it's pure 2D pixel manipulation using Canvas 2D API.\n *\n * How it works:\n * 1. Use getImageData() to get pixel buffer\n * 2. Rasterize triangle pixel-by-pixel (barycentric coordinates)\n * 3. Interpolate UV texture coordinates (perspective-correct with 1/z)\n * 4. Sample texture and write to pixel buffer\n * 5. Use putImageData() to update canvas\n *\n * This is software rendering like Doom, Quake software mode, and PlayStation 1.\n * No WebGL, no GPU - just CPU pixel manipulation.\n */\n\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nexport interface Vec2 {\n\tx: number;\n\ty: number;\n}\n\nexport interface Vec3 {\n\tx: number;\n\ty: number;\n\tz: number;\n}\n\nexport interface TexVert {\n\tx: number;\n\ty: number;\n\tu: number;\n\tv: number;\n\tz: number;\n}\n\nexport type TextureSource = \"tiles\" | \"map\" | \"screen\";\n\nexport interface TriangleData {\n\tcontext: CanvasRenderingContext2D;\n\twidth: number;\n\theight: number;\n\truntime?: any;\n\tpixelated: boolean;\n}\n\n/**\n * Z-Buffer for depth testing\n */\nexport class ZBuffer {\n\tprivate buffer: Float32Array;\n\tprivate width: number;\n\tprivate height: number;\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.buffer = new Float32Array(width * height);\n\t}\n\n\tclear(): void {\n\t\tthis.buffer.fill(0);\n\t}\n\n\tget(x: number, y: number): number {\n\t\treturn this.buffer[y * this.width + x] || 0;\n\t}\n\n\tset(x: number, y: number, z: number): void {\n\t\tthis.buffer[y * this.width + x] = z;\n\t}\n\n\tresize(width: number, height: number): void {\n\t\tif (this.width !== width || this.height !== height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.buffer = new Float32Array(width * height);\n\t\t}\n\t}\n}\n\n/**\n * Edge function for triangle rasterization\n */\nfunction edgeFn(a: Vec2, b: Vec2, c: Vec2): number {\n\treturn (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/**\n * Get pixel from sprite/image\n */\nfunction getSpritePixel(\n\tsprite: Sprite | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Resolve sprite canvas from object or runtime registry\n\tlet canvas: HTMLCanvasElement | null = null;\n\n\tif (sprite && typeof sprite === \"object\" && sprite.canvas) {\n\t\tcanvas = sprite.canvas;\n\t} else if (typeof sprite === \"string\" && runtime?.sprites) {\n\t\tconst spriteObj = runtime.sprites[sprite];\n\t\tif (spriteObj?.frames?.[0]?.canvas) {\n\t\t\tcanvas = spriteObj.frames[0].canvas;\n\t\t}\n\t}\n\n\tif (!canvas) return null;\n\n\t// Apply texture coordinate wrapping (repeat mode)\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Sample pixel color from sprite canvas\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get pixel from map\n */\nfunction getMapPixel(\n\tmap: Map | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Get map object\n\tlet mapObj: any = null;\n\n\tif (map && typeof map === \"object\" && map.getCanvas) {\n\t\tmapObj = map;\n\t} else if (typeof map === \"string\" && runtime?.maps) {\n\t\tmapObj = runtime.maps[map];\n\t}\n\n\tif (!mapObj) return null;\n\n\t// Get canvas from map\n\tconst canvas = mapObj.getCanvas ? mapObj.getCanvas() : mapObj.canvas;\n\tif (!canvas) return null;\n\n\t// Wrap texture coordinates\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Get pixel data\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Draw textured triangle with perspective correction\n */\nexport function drawTexturedTriangle(\n\tdata: TriangleData,\n\tv0: TexVert,\n\tv1: TexVert,\n\tv2: TexVert,\n\ttexture: Sprite | Map | string | any,\n\ttextureSource: TextureSource = \"tiles\",\n\tzBuffer?: ZBuffer,\n\tuseDepth: boolean = false,\n): void {\n\tconst { context, width, height, runtime, pixelated } = data;\n\n\t// Get bounding box\n\tconst minX = Math.max(0, Math.floor(Math.min(v0.x, v1.x, v2.x)));\n\tconst minY = Math.max(0, Math.floor(Math.min(v0.y, v1.y, v2.y)));\n\tconst maxX = Math.min(width, Math.ceil(Math.max(v0.x, v1.x, v2.x)));\n\tconst maxY = Math.min(height, Math.ceil(Math.max(v0.y, v1.y, v2.y)));\n\n\tif (minX >= maxX || minY >= maxY) return;\n\n\t// Calculate triangle area\n\tconst area = edgeFn(v0, v1, v2);\n\tif (Math.abs(area) < 0.001) return;\n\n\t// Backface culling\n\tif (area < 0) return;\n\n\t// Prepare perspective-correct interpolation\n\tconst useZ = useDepth && v0.z > 0 && v1.z > 0 && v2.z > 0;\n\n\tlet w0 = 1,\n\t\tw1 = 1,\n\t\tw2 = 1;\n\tlet u0 = v0.u,\n\t\tu1 = v1.u,\n\t\tu2 = v2.u;\n\tlet v0v = v0.v,\n\t\tv1v = v1.v,\n\t\tv2v = v2.v;\n\n\tif (useZ) {\n\t\tw0 = 1 / v0.z;\n\t\tw1 = 1 / v1.z;\n\t\tw2 = 1 / v2.z;\n\t\tu0 *= w0;\n\t\tu1 *= w1;\n\t\tu2 *= w2;\n\t\tv0v *= w0;\n\t\tv1v *= w1;\n\t\tv2v *= w2;\n\t}\n\n\t// Get image data for fast pixel manipulation\n\tconst imageData = context.getImageData(minX, minY, maxX - minX, maxY - minY);\n\tconst pixels = imageData.data;\n\n\t// Rasterize\n\tfor (let y = minY; y < maxY; y++) {\n\t\tfor (let x = minX; x < maxX; x++) {\n\t\t\tconst p = {\n\t\t\t\tx: x + 0.5,\n\t\t\t\ty: y + 0.5,\n\t\t\t};\n\n\t\t\t// Calculate barycentric coordinates\n\t\t\tconst w0b = edgeFn(v1, v2, p);\n\t\t\tconst w1b = edgeFn(v2, v0, p);\n\t\t\tconst w2b = edgeFn(v0, v1, p);\n\n\t\t\t// Check if point is inside triangle\n\t\t\tif (w0b >= 0 && w1b >= 0 && w2b >= 0) {\n\t\t\t\t// Normalize barycentric coordinates\n\t\t\t\tconst bary0 = w0b / area;\n\t\t\t\tconst bary1 = w1b / area;\n\t\t\t\tconst bary2 = w2b / area;\n\n\t\t\t\t// Depth test\n\t\t\t\tif (useZ && zBuffer) {\n\t\t\t\t\tconst z = bary0 * v0.z + bary1 * v1.z + bary2 * v2.z;\n\t\t\t\t\tconst currentZ = zBuffer.get(x, y);\n\t\t\t\t\tif (currentZ > 0 && currentZ >= z) continue;\n\t\t\t\t\tzBuffer.set(x, y, z);\n\t\t\t\t}\n\n\t\t\t\t// Interpolate texture coordinates\n\t\t\t\tlet u: number, v: number;\n\n\t\t\t\tif (useZ) {\n\t\t\t\t\tconst w = bary0 * w0 + bary1 * w1 + bary2 * w2;\n\t\t\t\t\tu = (bary0 * u0 + bary1 * u1 + bary2 * u2) / w;\n\t\t\t\t\tv = (bary0 * v0v + bary1 * v1v + bary2 * v2v) / w;\n\t\t\t\t} else {\n\t\t\t\t\tu = bary0 * v0.u + bary1 * v1.u + bary2 * v2.u;\n\t\t\t\t\tv = bary0 * v0.v + bary1 * v1.v + bary2 * v2.v;\n\t\t\t\t}\n\n\t\t\t\t// Sample texture\n\t\t\t\tlet pixel: {\n\t\t\t\t\tr: number;\n\t\t\t\t\tg: number;\n\t\t\t\t\tb: number;\n\t\t\t\t\ta: number;\n\t\t\t\t} | null = null;\n\n\t\t\t\tif (textureSource === \"map\") {\n\t\t\t\t\tpixel = getMapPixel(texture, u, v, runtime);\n\t\t\t\t} else {\n\t\t\t\t\tpixel = getSpritePixel(texture, u, v, runtime);\n\t\t\t\t}\n\n\t\t\t\t// Draw pixel\n\t\t\t\tif (pixel && pixel.a > 0) {\n\t\t\t\t\tconst idx = ((y - minY) * (maxX - minX) + (x - minX)) * 4;\n\t\t\t\t\tpixels[idx] = pixel.r;\n\t\t\t\t\tpixels[idx + 1] = pixel.g;\n\t\t\t\t\tpixels[idx + 2] = pixel.b;\n\t\t\t\t\tpixels[idx + 3] = pixel.a;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Put image data back\n\tcontext.imageSmoothingEnabled = !pixelated;\n\tcontext.putImageData(imageData, minX, minY);\n}\n\n/**\n * Draw solid color triangle\n */\nexport function drawTriangle(context: CanvasRenderingContext2D, v0: Vec2, v1: Vec2, v2: Vec2, color: string): void {\n\tcontext.fillStyle = color;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.fill();\n}\n\n/**\n * Draw triangle outline\n */\nexport function drawTriangleOutline(\n\tcontext: CanvasRenderingContext2D,\n\tv0: Vec2,\n\tv1: Vec2,\n\tv2: Vec2,\n\tcolor: string,\n\tlineWidth: number = 1,\n): void {\n\tcontext.strokeStyle = color;\n\tcontext.lineWidth = lineWidth;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.stroke();\n}\n","import { SpriteScreen } from \"./sprite-screen\";\n\nexport class TextScreen extends SpriteScreen {\n\t// Font string cache — avoid rebuilding template string every draw call\n\tprivate _cachedFontSize = -1;\n\tprivate _cachedFontName = \"\";\n\tprivate _cachedFontString = \"\";\n\n\tprivate getFontString(size: number): string {\n\t\tif (size !== this._cachedFontSize || this.font !== this._cachedFontName) {\n\t\t\tthis._cachedFontSize = size;\n\t\t\tthis._cachedFontName = this.font;\n\t\t\tthis._cachedFontString = `${size}pt ${this.font}`;\n\t\t}\n\t\treturn this._cachedFontString;\n\t}\n\n\ttextWidth(text: string, size: number): number {\n\t\tthis.context.font = this.getFontString(size);\n\t\treturn this.context.measureText(text).width;\n\t}\n\n\tdrawText(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n\n\tdrawTextOutline(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.lineWidth = this.line_width;\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { TextScreen } from \"../drawing/text-screen\";\nimport { drawTexturedTriangle, drawTriangle, drawTriangleOutline, type TextureSource, type TriangleData } from \"./ttri\";\n\nexport class TriangleScreen extends TextScreen {\n\ttri(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangle(this.context, v0, v1, v2, this.context.fillStyle as string);\n\t}\n\n\ttrib(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangleOutline(this.context, v0, v1, v2, this.context.strokeStyle as string, this.line_width);\n\t}\n\n\tttri(\n\t\tx1: number,\n\t\ty1: number,\n\t\tx2: number,\n\t\ty2: number,\n\t\tx3: number,\n\t\ty3: number,\n\t\tu1: number,\n\t\tv1: number,\n\t\tu2: number,\n\t\tv2: number,\n\t\tu3: number,\n\t\tv3: number,\n\t\ttexture: Sprite | Map | string,\n\t\ttextureSource: TextureSource = \"tiles\",\n\t\tz1: number = 1,\n\t\tz2: number = 1,\n\t\tz3: number = 1,\n\t\tuseDepth: boolean = false,\n\t): void {\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst canvasWidth = this.canvas.width;\n\t\tconst canvasHeight = this.canvas.height;\n\t\tconst ratio = Math.min(canvasWidth / 200, canvasHeight / 200);\n\n\t\tconst toCanvasX = (x: number) => canvasWidth / 2 + x * ratio;\n\t\tconst toCanvasY = (y: number) => canvasHeight / 2 - y * ratio;\n\n\t\tconst data: TriangleData = {\n\t\t\tcontext: this.context,\n\t\t\twidth: canvasWidth,\n\t\t\theight: canvasHeight,\n\t\t\truntime: this.runtime,\n\t\t\tpixelated: this.pixelated === 1,\n\t\t};\n\n\t\tdrawTexturedTriangle(\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tx: toCanvasX(x1),\n\t\t\t\ty: toCanvasY(y1),\n\t\t\t\tu: u1,\n\t\t\t\tv: v1,\n\t\t\t\tz: z1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x2),\n\t\t\t\ty: toCanvasY(y2),\n\t\t\t\tu: u2,\n\t\t\t\tv: v2,\n\t\t\t\tz: z2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x3),\n\t\t\t\ty: toCanvasY(y3),\n\t\t\t\tu: u3,\n\t\t\t\tv: v3,\n\t\t\t\tz: z3,\n\t\t\t},\n\t\t\ttexture,\n\t\t\ttextureSource,\n\t\t\tthis.zBuffer,\n\t\t\tuseDepth,\n\t\t);\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { TextureSource } from \"../tri\";\nimport { TriangleScreen } from \"../tri/triangle-screen\";\nimport type { ScreenInterface } from \"../types\";\n\nexport class Screen extends TriangleScreen {\n\tgetInterface(): ScreenInterface {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\n\t\tconst screen = this;\n\t\tthis.interfaceCache = {\n\t\t\twidth: screen.width,\n\t\t\theight: screen.height,\n\t\t\tclear: (color?: string) => screen.clear(color),\n\t\t\tsetColor: (color: string | number) => screen.setColor(color),\n\t\t\tsetAlpha: (alpha: number) => screen.setAlpha(alpha),\n\t\t\tsetPixelated: (pixelated: number) => screen.setPixelated(pixelated),\n\t\t\tsetBlending: (blending: string) => screen.setBlending(blending),\n\t\t\tsetLinearGradient: (x1: number, y1: number, x2: number, y2: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setLinearGradient(x1, y1, x2, y2, c1, c2),\n\t\t\tsetRadialGradient: (x: number, y: number, radius: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setRadialGradient(x, y, radius, c1, c2),\n\t\t\tsetFont: (font: string) => screen.setFont(font),\n\t\t\tsetTranslation: (tx: number, ty: number) => screen.setTranslation(tx, ty),\n\t\t\tsetScale: (x: number, y: number) => screen.setScale(x, y),\n\t\t\tsetRotation: (rotation: number) => screen.setRotation(rotation),\n\t\t\tsetDrawAnchor: (ax: number, ay: number) => screen.setDrawAnchor(ax, ay),\n\t\t\tsetDrawRotation: (rotation: number) => screen.setDrawRotation(rotation),\n\t\t\tsetDrawScale: (x: number, y?: number) => screen.setDrawScale(x, y),\n\t\t\tfillRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRect(x, y, w, h, c),\n\t\t\tfillRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.fillRoundRect(x, y, w, h, r, c),\n\t\t\tfillRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRound(x, y, w, h, c),\n\t\t\tdrawRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRect(x, y, w, h, c),\n\t\t\tdrawRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.drawRoundRect(x, y, w, h, r, c),\n\t\t\tdrawRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRound(x, y, w, h, c),\n\t\t\tdrawSprite: (sprite: Sprite | string, x: number, y: number, w?: number, h?: number) =>\n\t\t\t\tscreen.drawSprite(sprite, x, y, w, h),\n\t\t\tdrawSpritePart: (\n\t\t\t\tsprite: Sprite | string,\n\t\t\t\tsx: number,\n\t\t\t\tsy: number,\n\t\t\t\tsw: number,\n\t\t\t\tsh: number,\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tw?: number,\n\t\t\t\th?: number,\n\t\t\t) => screen.drawSpritePart(sprite, sx, sy, sw, sh, x, y, w, h),\n\t\t\tdrawMap: (map: Map | string, x: number, y: number, w: number, h: number) => screen.drawMap(map, x, y, w, h),\n\t\t\tdrawText: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawText(text, x, y, size, color),\n\t\t\tdrawTextOutline: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawTextOutline(text, x, y, size, color),\n\t\t\ttextWidth: (text: string, size: number) => screen.textWidth(text, size),\n\t\t\tsetLineWidth: (width: number) => screen.setLineWidth(width),\n\t\t\tsetLineDash: (dash: number[] | null) => screen.setLineDash(dash),\n\t\t\tdrawLine: (x1: number, y1: number, x2: number, y2: number, color?: string | number) =>\n\t\t\t\tscreen.drawLine(x1, y1, x2, y2, color),\n\t\t\tdrawPolygon: (...args: any[]) => screen.drawPolygon(args),\n\t\t\tdrawPolyline: (...args: any[]) => screen.drawPolyline(args),\n\t\t\tfillPolygon: (...args: any[]) => screen.fillPolygon(args),\n\t\t\tdrawQuadCurve: (...args: any[]) => screen.drawQuadCurve(args),\n\t\t\tdrawBezierCurve: (...args: any[]) => screen.drawBezierCurve(args),\n\t\t\tdrawArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.drawArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tfillArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.fillArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tsetCursorVisible: (visible: boolean) => screen.setCursorVisible(visible),\n\t\t\tloadFont: (font: string) => screen.loadFont(font),\n\t\t\tisFontReady: (font?: string) => screen.isFontReady(font),\n\t\t\ttri: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.tri(x1, y1, x2, y2, x3, y3, color),\n\t\t\ttrib: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.trib(x1, y1, x2, y2, x3, y3, color),\n\t\t\tttri: (\n\t\t\t\tx1: number,\n\t\t\t\ty1: number,\n\t\t\t\tx2: number,\n\t\t\t\ty2: number,\n\t\t\t\tx3: number,\n\t\t\t\ty3: number,\n\t\t\t\tu1: number,\n\t\t\t\tv1: number,\n\t\t\t\tu2: number,\n\t\t\t\tv2: number,\n\t\t\t\tu3: number,\n\t\t\t\tv3: number,\n\t\t\t\ttexture: Sprite | Map | string,\n\t\t\t\ttextureSource?: TextureSource,\n\t\t\t\tz1?: number,\n\t\t\t\tz2?: number,\n\t\t\t\tz3?: number,\n\t\t\t\tuseDepth?: boolean,\n\t\t\t) => screen.ttri(x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, texture, textureSource, z1, z2, z3, useDepth),\n\t\t};\n\n\t\treturn this.interfaceCache;\n\t}\n}\n\nexport default Screen;\n","/**\n * TimeMachine - Main time machine controller\n *\n * Responsibilities:\n * - Coordinate recording and playback\n * - Handle commands\n * - Manage state\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { DEFAULT_LOOP_BUFFER_FRAMES, DEFAULT_RECORD_BUFFER_FRAMES } from \"../constants\";\nimport { StatePlayer } from \"../playback\";\nimport { StateRecorder } from \"../recording\";\nimport type { TimeMachineMessage, TimeMachineStatus } from \"../types\";\n\nexport interface TimeMachineRuntime {\n\tvm?: {\n\t\tcontext?: {\n\t\t\tglobal?: any;\n\t\t};\n\t};\n\tupdateCall?: () => void;\n\tdrawCall?: () => void;\n}\n\nexport class TimeMachine {\n\tprivate runtime: TimeMachineRuntime;\n\tprivate recorder: StateRecorder;\n\tprivate player: StatePlayer;\n\tprivate recording = false;\n\tprivate replayPosition = 0;\n\tprivate statusCallback?: (status: TimeMachineStatus) => void;\n\n\tconstructor(runtime: TimeMachineRuntime) {\n\t\tthis.runtime = runtime;\n\t\tthis.recorder = new StateRecorder(DEFAULT_RECORD_BUFFER_FRAMES);\n\t\tthis.player = new StatePlayer(DEFAULT_LOOP_BUFFER_FRAMES);\n\n\t\t// Configure which objects should be excluded from state recording\n\t\tthis.setupExclusions();\n\t}\n\n\t/**\n\t * Setup objects to exclude from recording\n\t */\n\tprivate setupExclusions(): void {\n\t\tconst excluded: any[] = [];\n\n\t\tif (this.runtime.vm?.context?.global) {\n\t\t\tconst global = this.runtime.vm.context.global;\n\n\t\t\t// Exclude system APIs and non-serializable objects from recording\n\t\t\tif (global.random) excluded.push(global.random);\n\t\t\tif (global.screen) excluded.push(global.screen);\n\t\t\tif (global.audio) excluded.push(global.audio);\n\t\t\tif (global.keyboard) excluded.push(global.keyboard);\n\t\t\tif (global.mouse) excluded.push(global.mouse);\n\t\t\tif (global.touch) excluded.push(global.touch);\n\t\t\tif (global.gamepad) excluded.push(global.gamepad);\n\t\t\tif (global.system) excluded.push(global.system);\n\t\t\tif (global.storage) excluded.push(global.storage);\n\t\t\tif (global.host) excluded.push(global.host);\n\t\t\tif (global.session) excluded.push(global.session);\n\t\t\tif (global.memory) excluded.push(global.memory);\n\t\t}\n\n\t\tthis.recorder.setExcluded(excluded);\n\t}\n\n\t/**\n\t * Step function - call each frame\n\t */\n\tstep(): void {\n\t\tif (!this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Apply replay position changes and update loop if active\n\t\t\tif (this.replayPosition !== 0) {\n\t\t\t\tthis.recorder.trimTo(this.replayPosition);\n\t\t\t\tif (this.player.isLooping()) {\n\t\t\t\t\tthis.player.startLoop(this.recorder.getLength(), () => this.loopCallback());\n\t\t\t\t}\n\t\t\t\tthis.replayPosition = 0;\n\t\t\t}\n\n\t\t\t// Capture current global state snapshot for time travel\n\t\t\tif (this.runtime.vm?.context?.global) {\n\t\t\t\tthis.recorder.record(this.runtime.vm.context.global);\n\t\t\t}\n\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\treportRuntimeError((this.runtime as any)?.listener, APIErrorCode.E7082, { error: String(err) });\n\t\t}\n\t}\n\n\t/**\n\t * Handle incoming messages\n\t */\n\tmessageReceived(data: TimeMachineMessage): void {\n\t\tswitch (data.command) {\n\t\t\tcase \"start_recording\":\n\t\t\t\tthis.startRecording();\n\t\t\t\tbreak;\n\n\t\t\tcase \"stop_recording\":\n\t\t\t\tthis.stopRecording();\n\t\t\t\tbreak;\n\n\t\t\tcase \"step_backward\":\n\t\t\t\tthis.stepBackward();\n\t\t\t\tbreak;\n\n\t\t\tcase \"step_forward\":\n\t\t\t\tthis.stepForward();\n\t\t\t\tbreak;\n\n\t\t\tcase \"replay_position\":\n\t\t\t\tif (data.position != null) {\n\t\t\t\t\tthis.setReplayPosition(data.position);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"start_looping\":\n\t\t\t\tthis.startLooping();\n\t\t\t\tbreak;\n\n\t\t\tcase \"stop_looping\":\n\t\t\t\tthis.stopLooping();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Start recording\n\t */\n\tprivate startRecording(): void {\n\t\tif (this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.recording = true;\n\t\t\tthis.recorder.clear();\n\t\t\tthis.replayPosition = 0;\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\tthis.recording = false;\n\t\t\treportRuntimeError((this.runtime as any)?.listener, APIErrorCode.E7083, { error: String(err) });\n\t\t}\n\t}\n\n\t/**\n\t * Stop recording\n\t */\n\tprivate stopRecording(): void {\n\t\tif (!this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.recording = false;\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\treportRuntimeError((this.runtime as any)?.listener, APIErrorCode.E7083, { error: String(err) });\n\t\t}\n\t}\n\n\t/**\n\t * Step backward in time\n\t */\n\tprivate stepBackward(): void {\n\t\tif (this.replayPosition + 1 >= this.recorder.getLength()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stopLooping();\n\t\tthis.replayPosition++;\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Step forward in time\n\t */\n\tprivate stepForward(): void {\n\t\tif (this.replayPosition <= 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stopLooping();\n\t\tthis.replayPosition--;\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Set replay position\n\t */\n\tprivate setReplayPosition(position: number): void {\n\t\t// Validate time value is finite and non-negative\n\t\tif (!isFinite(position) || position < 0) {\n\t\t\treportRuntimeError((this.runtime as any)?.listener, APIErrorCode.E7081, { value: String(position) });\n\t\t\treturn;\n\t\t}\n\n\t\tconst pos = Math.round(position);\n\t\tthis.replayPosition = Math.max(2, Math.min(this.recorder.getLength() - 1, pos));\n\n\t\tif (this.player.isLooping()) {\n\t\t\tthis.player.startLoop(this.replayPosition, () => this.loopCallback());\n\t\t}\n\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Start looping\n\t */\n\tprivate startLooping(): void {\n\t\tif (this.recorder.getLength() === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.recording = false;\n\t\tconst position = Math.max(this.replayPosition, 1);\n\t\tthis.player.startLoop(position, () => this.loopCallback());\n\t}\n\n\t/**\n\t * Stop looping\n\t */\n\tprivate stopLooping(): void {\n\t\tif (!this.player.isLooping()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.replayPosition = this.player.stopLoop();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Replay state at current position\n\t */\n\tprivate replay(skipDraw = false): void {\n\t\tif (this.replayPosition >= this.recorder.getLength()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst snapshot = this.recorder.getState(this.replayPosition);\n\t\tif (snapshot && this.runtime.vm?.context?.global) {\n\t\t\tthis.player.restoreState(this.runtime.vm.context.global, snapshot);\n\t\t}\n\n\t\tif (!skipDraw) {\n\t\t\tthis.runtime.drawCall?.();\n\t\t}\n\t}\n\n\t/**\n\t * Loop callback\n\t */\n\tprivate loopCallback(): void {\n\t\tconst position = this.player.updateLoop();\n\t\tif (position !== null) {\n\t\t\tthis.replayPosition = position;\n\t\t\tthis.replay(true);\n\t\t\tthis.runtime.updateCall?.();\n\t\t\tthis.runtime.drawCall?.();\n\t\t}\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Send status update\n\t */\n\tprivate sendStatus(): void {\n\t\tif (this.statusCallback) {\n\t\t\tthis.statusCallback({\n\t\t\t\trecording: this.recording,\n\t\t\t\tlooping: this.player.isLooping(),\n\t\t\t\tposition: this.replayPosition,\n\t\t\t\tlength: this.recorder.getLength(),\n\t\t\t\tmax: this.recorder.getMaxLength(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Advance the loop playback by one tick.\n\t * Call once per real game frame (from the orchestrator's watch-step hook).\n\t * No-op when not looping.\n\t */\n\tloopStep(): void {\n\t\tif (this.player.isLooping()) {\n\t\t\tthis.player.executeCallback();\n\t\t}\n\t}\n\n\t/**\n\t * Set status callback\n\t */\n\tonStatus(callback: (status: TimeMachineStatus) => void): void {\n\t\tthis.statusCallback = callback;\n\t}\n\n\t/**\n\t * Check if recording\n\t */\n\tisRecording(): boolean {\n\t\treturn this.recording;\n\t}\n\n\t/**\n\t * Check if looping\n\t */\n\tisLooping(): boolean {\n\t\treturn this.player.isLooping();\n\t}\n}\n","/** Default recording buffer: 30 seconds at 60fps (1800 frames) */\nexport const DEFAULT_RECORD_BUFFER_FRAMES = 60 * 30;\n\n/** Default loop playback buffer: 4 seconds at 60fps (240 frames) */\nexport const DEFAULT_LOOP_BUFFER_FRAMES = 60 * 4;\n","/**\n * Deep copy a value, optionally skipping excluded references.\n *\n * @param value - The value to deep copy\n * @param excluded - Optional array of object references to skip (replaced with null)\n */\nexport function deepCopy(value: any, excluded?: any[]): any {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (excluded && excluded.includes(value)) {\n\t\treturn null;\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\tconst result: any[] = [];\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tresult[i] = deepCopy(value[i], excluded);\n\t\t}\n\t\treturn result;\n\t}\n\n\tif (typeof value === \"object\") {\n\t\tconst result: any = {};\n\t\tfor (const key in value) {\n\t\t\tif (Object.hasOwn(value, key)) {\n\t\t\t\tresult[key] = deepCopy(value[key], excluded);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t// Non-serializable types: return null when filtering, passthrough otherwise\n\treturn excluded ? null : value;\n}\n","/**\n * StatePlayer - Handles replay and loop playback\n *\n * Responsibilities:\n * - Restore state snapshots\n * - Manage loop playback\n * - Control playback position\n */\nimport { DEFAULT_LOOP_BUFFER_FRAMES } from \"../constants\";\nimport { deepCopy } from \"../utils\";\n\nimport type { StateSnapshot } from \"../types\";\n\nexport class StatePlayer {\n\tprivate looping = false;\n\tprivate loopStart = 0;\n\tprivate loopIndex = 0;\n\tprivate loopLength: number;\n\tprivate loopCallback: (() => void) | null = null;\n\n\tconstructor(loopLength = DEFAULT_LOOP_BUFFER_FRAMES) {\n\t\tthis.loopLength = loopLength;\n\t}\n\n\t/**\n\t * Check if currently looping\n\t */\n\tisLooping(): boolean {\n\t\treturn this.looping;\n\t}\n\n\t/**\n\t * Start loop playback\n\t */\n\tstartLoop(position: number, callback: () => void): void {\n\t\tthis.looping = true;\n\t\tthis.loopStart = Math.max(position, 1);\n\t\tthis.loopIndex = 0;\n\t\tthis.loopCallback = callback;\n\t}\n\n\t/**\n\t * Stop loop playback\n\t */\n\tstopLoop(): number {\n\t\tthis.looping = false;\n\t\tthis.loopCallback = null;\n\t\treturn this.loopStart;\n\t}\n\n\t/**\n\t * Update loop (call each frame)\n\t * Returns position to replay, or null if not looping\n\t */\n\tupdateLoop(): number | null {\n\t\tif (!this.looping) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.loopIndex === 0) {\n\t\t\tthis.loopIndex++;\n\t\t\treturn this.loopStart;\n\t\t}\n\n\t\tthis.loopIndex++;\n\t\tif (this.loopIndex > this.loopLength) {\n\t\t\tthis.loopIndex = 0;\n\t\t}\n\n\t\treturn this.loopStart - this.loopIndex;\n\t}\n\n\t/**\n\t * Execute loop callback\n\t */\n\texecuteCallback(): void {\n\t\tif (this.loopCallback) {\n\t\t\tthis.loopCallback();\n\t\t}\n\t}\n\n\t/**\n\t * Restore state to target object\n\t */\n\trestoreState(target: any, snapshot: StateSnapshot): void {\n\t\tif (!snapshot || !target) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all existing properties except protected system APIs\n\t\tfor (const key in target) {\n\t\t\tif (Object.hasOwn(target, key) && !this.isProtectedKey(key)) {\n\t\t\t\tdelete target[key];\n\t\t\t}\n\t\t}\n\n\t\t// Apply snapshot properties to target object via deep copy\n\t\tfor (const key in snapshot) {\n\t\t\tif (Object.hasOwn(snapshot, key)) {\n\t\t\t\ttarget[key] = deepCopy(snapshot[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if key should be protected from restoration\n\t */\n\tprivate isProtectedKey(key: string): boolean {\n\t\t// Prevent system APIs and runtime objects from being overwritten during restore\n\t\tconst protected_keys = [\n\t\t\t\"screen\",\n\t\t\t\"audio\",\n\t\t\t\"keyboard\",\n\t\t\t\"mouse\",\n\t\t\t\"touch\",\n\t\t\t\"gamepad\",\n\t\t\t\"system\",\n\t\t\t\"storage\",\n\t\t\t\"sprites\",\n\t\t\t\"maps\",\n\t\t\t\"sounds\",\n\t\t\t\"music\",\n\t\t\t\"assets\",\n\t\t\t\"host\",\n\t\t\t\"session\",\n\t\t\t\"memory\",\n\t\t];\n\t\treturn protected_keys.includes(key);\n\t}\n\n}\n","/**\n * StateRecorder - Records game state history\n *\n * Responsibilities:\n * - Capture state snapshots\n * - Manage circular buffer\n * - Exclude non-serializable objects\n */\nimport { DEFAULT_RECORD_BUFFER_FRAMES } from \"../constants\";\nimport { deepCopy } from \"../utils\";\n\nimport type { StateSnapshot } from \"../types\";\n\nexport class StateRecorder {\n\tprivate history: StateSnapshot[] = [];\n\tprivate recordIndex = 0;\n\tprivate recordLength = 0;\n\tprivate maxLength: number;\n\tprivate excluded: any[] = [];\n\n\tconstructor(maxLength = DEFAULT_RECORD_BUFFER_FRAMES) {\n\t\tthis.maxLength = maxLength;\n\t}\n\n\t/**\n\t * Set objects to exclude from serialization\n\t */\n\tsetExcluded(excluded: any[]): void {\n\t\tthis.excluded = excluded;\n\t}\n\n\t/**\n\t * Record a state snapshot\n\t */\n\trecord(state: any): void {\n\t\tconst snapshot = this.makeStorableState(state);\n\t\tthis.history[this.recordIndex++] = snapshot;\n\t\tthis.recordLength = Math.min(this.recordLength + 1, this.maxLength);\n\n\t\tif (this.recordIndex >= this.maxLength) {\n\t\t\tthis.recordIndex = 0;\n\t\t}\n\t}\n\n\t/**\n\t * Get state at specific position (0 = most recent)\n\t */\n\tgetState(position: number): StateSnapshot | null {\n\t\tif (position >= this.recordLength) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst index = (this.recordIndex - position - 1 + this.maxLength) % this.maxLength;\n\t\treturn this.history[index];\n\t}\n\n\t/**\n\t * Get current record length\n\t */\n\tgetLength(): number {\n\t\treturn this.recordLength;\n\t}\n\n\t/**\n\t * Get maximum record length\n\t */\n\tgetMaxLength(): number {\n\t\treturn this.maxLength;\n\t}\n\n\t/**\n\t * Clear all recorded history\n\t */\n\tclear(): void {\n\t\tthis.history = [];\n\t\tthis.recordIndex = 0;\n\t\tthis.recordLength = 0;\n\t}\n\n\t/**\n\t * Trim history to specific position\n\t */\n\ttrimTo(position: number): void {\n\t\tif (position >= this.recordLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst histo: StateSnapshot[] = [];\n\t\tconst start = this.recordLength;\n\t\tconst end = position + 1;\n\n\t\tfor (let i = start; i >= end; i--) {\n\t\t\tconst index = (this.recordIndex - i + this.maxLength) % this.maxLength;\n\t\t\thisto.push(this.history[index]);\n\t\t}\n\n\t\tthis.history = histo;\n\t\tthis.recordIndex = this.history.length;\n\t\tthis.recordLength = this.history.length;\n\t}\n\n\tprivate makeStorableState(value: any): any {\n\t\treturn deepCopy(value, this.excluded);\n\t}\n}\n","/**\n * JSON utilities for LootiScript\n *\n * Provides JSON encoding and decoding.\n */\n\nexport const JSONLib = {\n\t/**\n\t * Encode a value to JSON string\n\t */\n\tencode: (value: any): string => {\n\t\ttry {\n\t\t\treturn JSON.stringify(value);\n\t\t} catch (error) {\n\t\t\treturn \"\";\n\t\t}\n\t},\n\n\t/**\n\t * Decode a JSON string to value\n\t */\n\tdecode: (json: string): any => {\n\t\ttry {\n\t\t\treturn JSON.parse(json);\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\t/**\n\t * Pretty-print JSON with indentation\n\t */\n\tpretty: (value: any, indent: number = 2): string => {\n\t\ttry {\n\t\t\treturn JSON.stringify(value, null, indent);\n\t\t} catch (error) {\n\t\t\treturn \"\";\n\t\t}\n\t},\n};\n","/**\n * List (Array) utilities for LootiScript\n *\n * Provides functional programming helpers and array manipulation.\n */\n\nexport const ListLib = {\n\t// Functional programming methods (map, filter, reduce, etc.)\n\tmap: <T, R>(arr: T[], fn: (item: T, index: number) => R): R[] => arr.map(fn),\n\n\tfilter: <T>(arr: T[], fn: (item: T, index: number) => boolean): T[] => arr.filter(fn),\n\n\treduce: <T, R>(arr: T[], fn: (acc: R, item: T, index: number) => R, initial: R): R => arr.reduce(fn, initial),\n\n\tfind: <T>(arr: T[], fn: (item: T, index: number) => boolean): T | null => arr.find(fn) ?? null,\n\n\tfindIndex: <T>(arr: T[], fn: (item: T, index: number) => boolean): number => arr.findIndex(fn),\n\n\tsome: <T>(arr: T[], fn: (item: T, index: number) => boolean): boolean => arr.some(fn),\n\n\tevery: <T>(arr: T[], fn: (item: T, index: number) => boolean): boolean => arr.every(fn),\n\n\t// Array manipulation methods (non-mutating, returns new arrays)\n\treverse: <T>(arr: T[]): T[] => arr.slice().reverse(),\n\n\tsort: <T>(arr: T[], fn?: (a: T, b: T) => number): T[] => arr.slice().sort(fn),\n\n\tslice: <T>(arr: T[], start: number, end?: number): T[] => arr.slice(start, end),\n\n\tconcat: <T>(...arrays: T[][]): T[] => ([] as T[]).concat(...arrays),\n\n\tflat: <T>(arr: T[], depth: number = 1): unknown[] => arr.flat(depth),\n\n\tflatMap: <T>(arr: T[], fn: (item: T, index: number) => unknown): unknown[] => arr.flatMap(fn),\n\n\t// Search and lookup methods\n\tindexOf: <T>(arr: T[], item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex),\n\n\tlastIndexOf: <T>(arr: T[], item: T, fromIndex?: number): number => arr.lastIndexOf(item, fromIndex),\n\n\tincludes: <T>(arr: T[], item: T, fromIndex?: number): boolean => arr.includes(item, fromIndex),\n\n\t// Array length accessor\n\tlength: <T>(arr: T[]): number => arr.length,\n\n\t// Element access methods (first, last, at)\n\tfirst: <T>(arr: T[]): T | null => arr[0] ?? null,\n\n\tlast: <T>(arr: T[]): T | null => arr[arr.length - 1] ?? null,\n\n\tat: <T>(arr: T[], index: number): T | null => {\n\t\t// Support negative indices (Python-style)\n\t\tconst normalized = index < 0 ? arr.length + index : index;\n\t\treturn arr[normalized] ?? null;\n\t},\n\n\t// Array mutation methods (modifies original array and returns it)\n\tpush: <T>(arr: T[], ...items: T[]): T[] => {\n\t\tarr.push(...items);\n\t\treturn arr;\n\t},\n\n\tpop: <T>(arr: T[]): T | null => arr.pop() ?? null,\n\n\tshift: <T>(arr: T[]): T | null => arr.shift() ?? null,\n\n\tunshift: <T>(arr: T[], ...items: T[]): T[] => {\n\t\tarr.unshift(...items);\n\t\treturn arr;\n\t},\n\n\tsplice: <T>(arr: T[], start: number, deleteCount?: number, ...items: T[]): T[] =>\n\t\tarr.splice(start, deleteCount ?? arr.length - start, ...items),\n\n\t/** Fills arr in-place (matches native Array.prototype.fill behaviour). */\n\tfill: <T>(arr: T[], value: T, start?: number, end?: number): T[] => arr.fill(value, start, end),\n\n\tjoin: <T>(arr: T[], separator: string = \",\"): string => arr.join(separator),\n\n\tunique: <T>(arr: T[]): T[] => [...new Set(arr)],\n\n\tshuffle: <T>(arr: T[]): T[] => {\n\t\tconst result = [...arr];\n\t\tfor (let i = result.length - 1; i > 0; i--) {\n\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t[result[i], result[j]] = [result[j], result[i]];\n\t\t}\n\t\treturn result;\n\t},\n\n\tchunk: <T>(arr: T[], size: number): T[][] => {\n\t\tconst result: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) {\n\t\t\tresult.push(arr.slice(i, i + size));\n\t\t}\n\t\treturn result;\n\t},\n\n\tsum: (arr: number[]): number => {\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tsum += arr[i];\n\t\t}\n\t\treturn sum;\n\t},\n\n\taverage: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tsum += arr[i];\n\t\t}\n\t\treturn sum / arr.length;\n\t},\n\n\tmin: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet min = arr[0];\n\t\tfor (let i = 1; i < arr.length; i++) {\n\t\t\tif (arr[i] < min) min = arr[i];\n\t\t}\n\t\treturn min;\n\t},\n\n\tmax: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet max = arr[0];\n\t\tfor (let i = 1; i < arr.length; i++) {\n\t\t\tif (arr[i] > max) max = arr[i];\n\t\t}\n\t\treturn max;\n\t},\n};\n","/**\n * Math utilities for LootiScript\n *\n * Provides mathematical functions and game-specific helpers.\n */\n\nexport const MathLib = {\n\t// Basic mathematical operations\n\tabs: (x: number): number => Math.abs(x),\n\tsqrt: (x: number): number => Math.sqrt(x),\n\tfloor: (x: number): number => Math.floor(x),\n\tceil: (x: number): number => Math.ceil(x),\n\tround: (x: number): number => Math.round(x),\n\n\t// Minimum and maximum value selection\n\tmin: (...args: number[]): number => Math.min(...args),\n\tmax: (...args: number[]): number => Math.max(...args),\n\n\t// Exponential and logarithmic functions\n\tpow: (base: number, exp: number): number => base ** exp,\n\texp: (x: number): number => Math.exp(x),\n\tlog: (x: number): number => Math.log(x),\n\tlog10: (x: number): number => Math.log10(x),\n\n\t// Trigonometric functions (all angles in radians)\n\tsin: (x: number): number => Math.sin(x),\n\tcos: (x: number): number => Math.cos(x),\n\ttan: (x: number): number => Math.tan(x),\n\tasin: (x: number): number => Math.asin(x),\n\tacos: (x: number): number => Math.acos(x),\n\tatan: (x: number): number => Math.atan(x),\n\tatan2: (y: number, x: number): number => Math.atan2(y, x),\n\n\t// Random number generation\n\trandom: (): number => Math.random(),\n\trandomInt: (min: number, max: number): number => Math.floor(Math.random() * (max - min + 1)) + min,\n\trandomFloat: (min: number, max: number): number => Math.random() * (max - min) + min,\n\n\t// Mathematical constants\n\tPI: Math.PI,\n\tE: Math.E,\n\n\t// Game development utility functions\n\tclamp: (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max),\n\n\tlerp: (a: number, b: number, t: number): number => a + (b - a) * t,\n\n\tdistance: (x1: number, y1: number, x2: number, y2: number): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2),\n\n\tdistance3D: (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number): number =>\n\t\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2),\n\n\tangleBetween: (x1: number, y1: number, x2: number, y2: number): number => Math.atan2(y2 - y1, x2 - x1),\n\n\t// Angle unit conversion utilities\n\tdegToRad: (degrees: number): number => degrees * (Math.PI / 180),\n\tradToDeg: (radians: number): number => radians * (180 / Math.PI),\n\n\t// Sign and comparison utilities\n\tsign: (x: number): number => Math.sign(x),\n\n\t// Euclidean modulo (handles negative numbers correctly)\n\tmod: (n: number, m: number): number => ((n % m) + m) % m,\n};\n","/**\n * String utilities for LootiScript\n *\n * Provides string manipulation and parsing functions.\n */\n\nexport const StringLib = {\n\t// String splitting and array joining methods\n\tsplit: (str: string, separator: string = \"\"): string[] => str.split(separator),\n\n\tjoin: (arr: string[], separator: string = \"\"): string => arr.join(separator),\n\n\t// Whitespace trimming methods\n\ttrim: (str: string): string => str.trim(),\n\ttrimStart: (str: string): string => str.trimStart(),\n\ttrimEnd: (str: string): string => str.trimEnd(),\n\n\t// String replacement methods\n\treplace: (str: string, search: string, replacement: string): string => str.replace(search, replacement),\n\n\treplaceAll: (str: string, search: string, replacement: string): string => str.split(search).join(replacement),\n\n\t// String content checking methods\n\tstartsWith: (str: string, prefix: string): boolean => str.startsWith(prefix),\n\n\tendsWith: (str: string, suffix: string): boolean => str.endsWith(suffix),\n\n\tcontains: (str: string, search: string): boolean => str.includes(search),\n\n\t// Case transformation methods\n\ttoLowerCase: (str: string): string => str.toLowerCase(),\n\ttoUpperCase: (str: string): string => str.toUpperCase(),\n\n\t// Character access and code point methods\n\tcharAt: (str: string, index: number): string => str.charAt(index),\n\tcharCodeAt: (str: string, index: number): number => str.charCodeAt(index),\n\tfromCharCode: (...codes: number[]): string => String.fromCharCode(...codes),\n\n\t// Substring extraction methods\n\tsubstring: (str: string, start: number, end?: number): string => str.substring(start, end),\n\n\tslice: (str: string, start: number, end?: number): string => str.slice(start, end),\n\n\t// String search methods\n\tindexOf: (str: string, search: string, fromIndex?: number): number => str.indexOf(search, fromIndex),\n\n\tlastIndexOf: (str: string, search: string, fromIndex?: number): number => str.lastIndexOf(search, fromIndex),\n\n\t// String padding and repetition methods\n\trepeat: (str: string, count: number): string => str.repeat(count),\n\n\tpadStart: (str: string, length: number, pad: string = \" \"): string => str.padStart(length, pad),\n\n\tpadEnd: (str: string, length: number, pad: string = \" \"): string => str.padEnd(length, pad),\n\n\t// String length accessor\n\tlength: (str: string): number => str.length,\n\n\t// String to number parsing methods\n\tparseInt: (str: string, radix?: number): number => {\n\t\tconst result = Number.parseInt(str, radix);\n\t\treturn isNaN(result) ? 0 : result;\n\t},\n\n\tparseFloat: (str: string): number => {\n\t\tconst result = Number.parseFloat(str);\n\t\treturn isNaN(result) ? 0 : result;\n\t},\n\n\t// String formatting and templating methods\n\tformat: (template: string, ...args: any[]): string => {\n\t\treturn template.replace(/{(\\d+)}/g, (match, index) => {\n\t\t\tconst argIndex = Number.parseInt(index);\n\t\t\treturn typeof args[argIndex] !== \"undefined\" ? String(args[argIndex]) : match;\n\t\t});\n\t},\n};\n","/**\n * Random - Pseudorandom number generator for LootiScript\n *\n * Uses linear congruential generator (LCG) algorithm for deterministic randomness.\n */\n\n/**\n * Pseudorandom number generator using LCG (Linear Congruential Generator)\n */\nexport class Random {\n\tprivate _seed: number;\n\tprivate readonly a: number = 13971;\n\tprivate readonly b: number = 12345;\n\tprivate readonly size: number = 1 << 30;\n\tprivate readonly mask: number;\n\tprivate readonly norm: number;\n\n\tconstructor(_seed?: number, hash: boolean = true) {\n\t\tthis._seed = _seed != null ? _seed : Math.random();\n\t\tif (this._seed === 0) {\n\t\t\tthis._seed = Math.random();\n\t\t}\n\t\tif (this._seed < 1) {\n\t\t\tthis._seed *= 1 << 30;\n\t\t}\n\t\tthis.mask = this.size - 1;\n\t\tthis.norm = 1 / this.size;\n\n\t\tif (hash) {\n\t\t\tthis.nextSeed();\n\t\t\tthis.nextSeed();\n\t\t\tthis.nextSeed();\n\t\t}\n\t}\n\n\t/**\n\t * Generate next random number [0, 1)\n\t */\n\tnext(): number {\n\t\tthis._seed = (this._seed * this.a + this.b) & this.mask;\n\t\treturn this._seed * this.norm;\n\t}\n\n\t/**\n\t * Generate random integer [0, num)\n\t */\n\tnextInt(num: number): number {\n\t\treturn Math.floor(this.next() * num);\n\t}\n\n\t/**\n\t * Advance to next seed state\n\t */\n\tnextSeed(): number {\n\t\treturn (this._seed = (this._seed * this.a + this.b) & this.mask);\n\t}\n\n\t/**\n\t * Set seed value\n\t */\n\tseed(_seed?: number): number {\n\t\tthis._seed = _seed != null ? _seed : Math.random();\n\t\tif (this._seed < 1) {\n\t\t\tthis._seed *= 1 << 30;\n\t\t}\n\t\tthis.nextSeed();\n\t\tthis.nextSeed();\n\t\treturn this.nextSeed();\n\t}\n\n\t/**\n\t * Clone random generator with optional new seed\n\t */\n\tclone(seed?: number): Random {\n\t\tif (seed != null) {\n\t\t\treturn new Random(seed);\n\t\t} else {\n\t\t\treturn new Random(this._seed, false);\n\t\t}\n\t}\n}\n","/**\n * Token - Represents a token in the LootiScript lexer\n *\n * Basic unit of lexical analysis.\n */\n\nexport interface Tokenizer {\n\tline: number;\n\tcolumn: number;\n\ttoken_start: number;\n\tindex: number;\n\tinput: string;\n\tfilename: string;\n}\n\n/**\n * Token class representing lexical tokens in LootiScript\n */\nexport class Token {\n\ttokenizer: Tokenizer;\n\ttype: number;\n\tvalue: string | number;\n\tstring_value?: string;\n\tline: number;\n\tcolumn: number;\n\tstart: number;\n\tlength: number;\n\tindex: number;\n\treserved_keyword?: boolean;\n\tis_binary_operator: boolean;\n\n\tconstructor(tokenizer: Tokenizer, type: number, value: string | number, string_value?: string) {\n\t\tthis.tokenizer = tokenizer;\n\t\tthis.type = type;\n\t\tthis.value = value;\n\t\tthis.string_value = string_value;\n\t\tthis.line = tokenizer.line;\n\t\tthis.column = tokenizer.column;\n\t\tthis.start = tokenizer.token_start;\n\t\tthis.length = tokenizer.index - this.start;\n\t\tthis.index = tokenizer.index;\n\n\t\tif (this.type === Token.TYPE_IDENTIFIER && Object.hasOwn(Token.predefined, String(this.value))) {\n\t\t\tthis.type = Token.predefined[String(this.value)];\n\t\t\tthis.reserved_keyword = true;\n\t\t}\n\n\t\tthis.is_binary_operator =\n\t\t\t(this.type >= 30 && this.type <= 39) || (this.type >= 200 && this.type <= 201) || (this.type >= 2 && this.type <= 7);\n\t}\n\n\ttoString(): string {\n\t\treturn String(this.value) + \" : \" + this.type;\n\t}\n\n\t// Token type constants\n\tstatic readonly TYPE_EQUALS = 1;\n\tstatic readonly TYPE_DOUBLE_EQUALS = 2;\n\tstatic readonly TYPE_GREATER = 3;\n\tstatic readonly TYPE_GREATER_OR_EQUALS = 4;\n\tstatic readonly TYPE_LOWER = 5;\n\tstatic readonly TYPE_LOWER_OR_EQUALS = 6;\n\tstatic readonly TYPE_UNEQUALS = 7;\n\tstatic readonly TYPE_IDENTIFIER = 10;\n\tstatic readonly TYPE_NUMBER = 11;\n\tstatic readonly TYPE_STRING = 12;\n\tstatic readonly TYPE_OPEN_BRACE = 20;\n\tstatic readonly TYPE_CLOSED_BRACE = 21;\n\t// TYPE_OPEN_CURLY_BRACE = 22\n\t// TYPE_CLOSED_CURLY_BRACE = 23\n\tstatic readonly TYPE_OPEN_BRACKET = 24;\n\tstatic readonly TYPE_CLOSED_BRACKET = 25;\n\tstatic readonly TYPE_COMMA = 26;\n\tstatic readonly TYPE_DOT = 27;\n\tstatic readonly TYPE_COLON = 28; // NEW: Colon for types\n\tstatic readonly TYPE_PLUS = 30;\n\tstatic readonly TYPE_MINUS = 31;\n\tstatic readonly TYPE_MULTIPLY = 32;\n\tstatic readonly TYPE_DIVIDE = 33;\n\tstatic readonly TYPE_POWER = 34;\n\tstatic readonly TYPE_MODULO = 35;\n\tstatic readonly TYPE_BINARY_AND = 36;\n\tstatic readonly TYPE_BINARY_OR = 37;\n\tstatic readonly TYPE_SHIFT_LEFT = 38;\n\tstatic readonly TYPE_SHIFT_RIGHT = 39;\n\tstatic readonly TYPE_PLUS_EQUALS = 40;\n\tstatic readonly TYPE_MINUS_EQUALS = 41;\n\tstatic readonly TYPE_MULTIPLY_EQUALS = 42;\n\tstatic readonly TYPE_DIVIDE_EQUALS = 43;\n\tstatic readonly TYPE_MODULO_EQUALS = 44;\n\tstatic readonly TYPE_AND_EQUALS = 45;\n\tstatic readonly TYPE_OR_EQUALS = 46;\n\tstatic readonly TYPE_RETURN = 100;\n\tstatic readonly TYPE_BREAK = 101;\n\tstatic readonly TYPE_CONTINUE = 102;\n\tstatic readonly TYPE_FUNCTION = 103;\n\tstatic readonly TYPE_IF = 104;\n\tstatic readonly TYPE_THEN = 105;\n\tstatic readonly TYPE_ELSE = 106;\n\tstatic readonly TYPE_ELSIF = 107;\n\tstatic readonly TYPE_END = 108;\n\tstatic readonly TYPE_FOR = 109;\n\tstatic readonly TYPE_TO = 110;\n\tstatic readonly TYPE_BY = 111;\n\tstatic readonly TYPE_IN = 112;\n\tstatic readonly TYPE_WHILE = 113;\n\tstatic readonly TYPE_OBJECT = 114;\n\tstatic readonly TYPE_CLASS = 115;\n\tstatic readonly TYPE_EXTENDS = 116;\n\tstatic readonly TYPE_NEW = 117;\n\tstatic readonly TYPE_ARROW = 118;\n\tstatic readonly TYPE_TEMPLATE = 119; // NEW: Template string `...`\n\tstatic readonly TYPE_AFTER = 61;\n\tstatic readonly TYPE_EVERY = 62;\n\tstatic readonly TYPE_DO = 63;\n\tstatic readonly TYPE_SLEEP = 64;\n\tstatic readonly TYPE_LOCAL = 70;\n\tstatic readonly TYPE_AND = 200;\n\tstatic readonly TYPE_OR = 201;\n\tstatic readonly TYPE_NOT = 202;\n\tstatic readonly TYPE_ERROR = 404;\n\tstatic readonly TYPE_DELETE = 403;\n\n\t// Predefined keyword mapping\n\tstatic readonly predefined: Record<string, number> = {\n\t\treturn: Token.TYPE_RETURN,\n\t\tbreak: Token.TYPE_BREAK,\n\t\tcontinue: Token.TYPE_CONTINUE,\n\t\tfunction: Token.TYPE_FUNCTION,\n\t\tfor: Token.TYPE_FOR,\n\t\tto: Token.TYPE_TO,\n\t\tby: Token.TYPE_BY,\n\t\tin: Token.TYPE_IN,\n\t\twhile: Token.TYPE_WHILE,\n\t\tif: Token.TYPE_IF,\n\t\tthen: Token.TYPE_THEN,\n\t\telse: Token.TYPE_ELSE,\n\t\telsif: Token.TYPE_ELSIF,\n\t\tend: Token.TYPE_END,\n\t\tobject: Token.TYPE_OBJECT,\n\t\tclass: Token.TYPE_CLASS,\n\t\textends: Token.TYPE_EXTENDS,\n\t\tnew: Token.TYPE_NEW,\n\t\tand: Token.TYPE_AND,\n\t\tor: Token.TYPE_OR,\n\t\tnot: Token.TYPE_NOT,\n\t\tafter: Token.TYPE_AFTER,\n\t\tevery: Token.TYPE_EVERY,\n\t\tdo: Token.TYPE_DO,\n\t\tsleep: Token.TYPE_SLEEP,\n\t\tdelete: Token.TYPE_DELETE,\n\t\tlocal: Token.TYPE_LOCAL,\n\t\tvar: Token.TYPE_LOCAL, // Alias\n\t\tlet: Token.TYPE_LOCAL, // Alias\n\t};\n}\n","/**\n * Tokenizer - Lexical analyzer for LootiScript\n *\n * Breaks source code into tokens for parsing.\n */\n\nimport { type Tokenizer as ITokenizer, Token } from \"./token\";\n\n/**\n * Tokenizer class for tokenizing LootiScript source code\n */\nexport class Tokenizer implements ITokenizer {\n\tinput: string;\n\tfilename: string;\n\tindex: number = 0;\n\tline: number = 1;\n\tcolumn: number = 0;\n\tlast_column: number = 0;\n\tbuffer: Token[] = [];\n\ttoken_start: number = 0;\n\tchars: Record<string, number> = {};\n\tdoubles: Record<string, [number, number]> = {};\n\tshifts: Record<string, number> = {};\n\tletter_regex: RegExp = /^\\p{L}/u;\n\n\tconstructor(input: string, filename: string) {\n\t\tthis.input = input;\n\t\tthis.filename = filename;\n\n\t\t// Initialize single character tokens\n\t\tthis.chars[\"(\"] = Token.TYPE_OPEN_BRACE;\n\t\tthis.chars[\")\"] = Token.TYPE_CLOSED_BRACE;\n\t\tthis.chars[\"[\"] = Token.TYPE_OPEN_BRACKET;\n\t\tthis.chars[\"]\"] = Token.TYPE_CLOSED_BRACKET;\n\t\tthis.chars[\"{\"] = 22; // TYPE_OPEN_CURLY_BRACE (not defined in Token)\n\t\tthis.chars[\"}\"] = 23; // TYPE_CLOSED_CURLY_BRACE (not defined in Token)\n\t\tthis.chars[\"^\"] = Token.TYPE_POWER;\n\t\tthis.chars[\",\"] = Token.TYPE_COMMA;\n\t\tthis.chars[\".\"] = Token.TYPE_DOT;\n\t\tthis.chars[\":\"] = Token.TYPE_COLON;\n\n\t\t// Initialize double character tokens (single + equals)\n\t\tthis.doubles[\">\"] = [Token.TYPE_GREATER, Token.TYPE_GREATER_OR_EQUALS];\n\t\tthis.doubles[\"<\"] = [Token.TYPE_LOWER, Token.TYPE_LOWER_OR_EQUALS];\n\t\tthis.doubles[\"=\"] = [Token.TYPE_EQUALS, Token.TYPE_DOUBLE_EQUALS];\n\t\tthis.doubles[\"+\"] = [Token.TYPE_PLUS, Token.TYPE_PLUS_EQUALS];\n\t\tthis.doubles[\"-\"] = [Token.TYPE_MINUS, Token.TYPE_MINUS_EQUALS];\n\t\tthis.doubles[\"*\"] = [Token.TYPE_MULTIPLY, Token.TYPE_MULTIPLY_EQUALS];\n\t\tthis.doubles[\"/\"] = [Token.TYPE_DIVIDE, Token.TYPE_DIVIDE_EQUALS];\n\t\tthis.doubles[\"%\"] = [Token.TYPE_MODULO, Token.TYPE_MODULO_EQUALS];\n\t\tthis.doubles[\"&\"] = [Token.TYPE_BINARY_AND, Token.TYPE_AND_EQUALS];\n\t\tthis.doubles[\"|\"] = [Token.TYPE_BINARY_OR, Token.TYPE_OR_EQUALS];\n\n\t\t// Initialize shift operators\n\t\tthis.shifts[\"<\"] = Token.TYPE_SHIFT_LEFT;\n\t\tthis.shifts[\">\"] = Token.TYPE_SHIFT_RIGHT;\n\t}\n\n\tpushBack(token: Token): Token {\n\t\tthis.buffer.splice(0, 0, token);\n\t\treturn token;\n\t}\n\n\t/**\n\t * Peek at next token without consuming it\n\t */\n\tpeek(): Token | null {\n\t\tif (this.buffer.length > 0) {\n\t\t\treturn this.buffer[0];\n\t\t}\n\t\tconst token = this.next();\n\t\tif (token) {\n\t\t\tthis.pushBack(token);\n\t\t}\n\t\treturn token;\n\t}\n\n\tfinished(): boolean {\n\t\treturn this.index >= this.input.length && this.buffer.length === 0;\n\t}\n\n\tnextChar(ignore_comments: boolean = false): string {\n\t\tlet c: string;\n\t\tlet endseq: number;\n\t\tc = this.input.charAt(this.index++);\n\n\t\tif (c === \"\\n\") {\n\t\t\tthis.line += 1;\n\t\t\tthis.last_column = this.column;\n\t\t\tthis.column = 0;\n\t\t} else if (c === \"/\" && !ignore_comments) {\n\t\t\tif (this.input.charAt(this.index) === \"/\") {\n\t\t\t\t// Single line comment\n\t\t\t\twhile (true) {\n\t\t\t\t\tc = this.input.charAt(this.index++);\n\t\t\t\t\tif (c === \"\\n\" || this.index >= this.input.length) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.line += 1;\n\t\t\t\tthis.last_column = this.column;\n\t\t\t\tthis.column = 0;\n\t\t\t\treturn this.nextChar();\n\t\t\t} else if (this.input.charAt(this.index) === \"*\") {\n\t\t\t\t// Multi-line comment\n\t\t\t\tendseq = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\tc = this.input.charAt(this.index++);\n\t\t\t\t\tif (c === \"\\n\") {\n\t\t\t\t\t\tthis.line += 1;\n\t\t\t\t\t\tthis.last_column = this.column;\n\t\t\t\t\t\tthis.column = 0;\n\t\t\t\t\t\tendseq = 0;\n\t\t\t\t\t} else if (c === \"*\") {\n\t\t\t\t\t\tendseq = 1;\n\t\t\t\t\t} else if (c === \"/\" && endseq === 1) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendseq = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.index >= this.input.length) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.nextChar();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.column += 1;\n\t\t}\n\t\treturn c;\n\t}\n\n\trewind(): void {\n\t\tthis.index -= 1;\n\t\tthis.column -= 1;\n\t\tif (this.input.charAt(this.index) === \"\\n\") {\n\t\t\tthis.line -= 1;\n\t\t\tthis.column = this.last_column;\n\t\t}\n\t}\n\n\tnext(): Token | null {\n\t\tlet c: string;\n\t\tlet code: number;\n\n\t\tif (this.buffer.length > 0) {\n\t\t\treturn this.buffer.splice(0, 1)[0];\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\t\t\tif (code > 32 && code !== 160) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.token_start = this.index - 1;\n\n\t\tif (this.doubles[c] != null) {\n\t\t\treturn this.parseDouble(c, this.doubles[c]);\n\t\t}\n\n\t\tif (this.chars[c] != null) {\n\t\t\treturn new Token(this, this.chars[c], c);\n\t\t}\n\n\t\tif (c === \"!\") {\n\t\t\treturn this.parseUnequals(c);\n\t\t} else if (code >= 48 && code <= 57) {\n\t\t\treturn this.parseNumber(c);\n\t\t} else if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122) || code === 95 || this.letter_regex.test(c)) {\n\t\t\treturn this.parseIdentifier(c);\n\t\t} else if (c === '\"') {\n\t\t\treturn this.parseString(c, '\"');\n\t\t} else if (c === \"'\") {\n\t\t\treturn this.parseString(c, \"'\");\n\t\t} else if (c === \"`\") {\n\t\t\treturn this.parseString(c, \"`\");\n\t\t} else {\n\t\t\treturn this.error(\"Syntax Error\");\n\t\t}\n\t}\n\n\tchangeNumberToIdentifier(): Token[] | Token | undefined {\n\t\tlet i: number;\n\t\tlet token: Token | null;\n\t\tlet v: string[];\n\t\tconst results: Token[] = [];\n\n\t\ttoken = this.next();\n\t\tif (token != null && token.type === Token.TYPE_NUMBER) {\n\t\t\tv = (token.string_value || String(token.value)).split(\".\");\n\t\t\tfor (i = v.length - 1; i >= 0; i--) {\n\t\t\t\tif (v[i].length > 0) {\n\t\t\t\t\tthis.pushBack(new Token(this, Token.TYPE_IDENTIFIER, v[i]));\n\t\t\t\t}\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tresults.push(this.pushBack(new Token(this, Token.TYPE_DOT, \".\")));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn results;\n\t\t} else if (token != null && token.type === Token.TYPE_STRING) {\n\t\t\treturn this.pushBack(new Token(this, Token.TYPE_IDENTIFIER, token.value));\n\t\t} else {\n\t\t\treturn token ? this.pushBack(token) : undefined;\n\t\t}\n\t}\n\n\tparseDouble(c: string, d?: [number, number]): Token {\n\t\tconst c2: string = this.input.charAt(this.index);\n\n\t\t// Check for arrow function =>\n\t\tif (c === \"=\" && c2 === \">\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, Token.TYPE_ARROW, \"=>\");\n\t\t}\n\n\t\t// Check for shift operators (<<, >>)\n\t\tif (this.shifts[c] != null && this.index < this.input.length && c2 === c) {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, this.shifts[c], c + c);\n\t\t}\n\n\t\t// Check for assignment operators (+=, -=, etc.)\n\t\tif (d && this.index < this.input.length && c2 === \"=\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, d[1], c + \"=\");\n\t\t}\n\n\t\t// Return single character token\n\t\treturn new Token(this, d ? d[0] : this.chars[c], c);\n\t}\n\n\tparseUnequals(_c: string): Token {\n\t\tif (this.index < this.input.length && this.input.charAt(this.index) === \"=\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, Token.TYPE_UNEQUALS, \"!=\");\n\t\t} else {\n\t\t\treturn this.error(\"Expected inequality !=\");\n\t\t}\n\t}\n\n\tparseIdentifier(s: string): Token {\n\t\tlet c: string;\n\t\tlet code: number;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_IDENTIFIER, s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\t\t\tif (\n\t\t\t\t(code >= 65 && code <= 90) ||\n\t\t\t\t(code >= 97 && code <= 122) ||\n\t\t\t\tcode === 95 ||\n\t\t\t\t(code >= 48 && code <= 57) ||\n\t\t\t\tthis.letter_regex.test(c)\n\t\t\t) {\n\t\t\t\ts += c;\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_IDENTIFIER, s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseNumber(s: string): Token {\n\t\tlet c: string;\n\t\tlet code: number;\n\t\tlet exp: boolean = false;\n\t\tlet pointed: boolean = false;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseFloat(s), s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\n\t\t\tif (c === \".\" && !pointed && !exp) {\n\t\t\t\tpointed = true;\n\t\t\t\ts += c;\n\t\t\t} else if (code >= 48 && code <= 57) {\n\t\t\t\ts += c;\n\t\t\t} else if ((c === \"e\" || c === \"E\") && !exp && this.index < this.input.length) {\n\t\t\t\texp = true;\n\t\t\t\ts += c;\n\t\t\t\tc = this.nextChar();\n\t\t\t\tif (c === \"+\" || c === \"-\") {\n\t\t\t\t\ts += c;\n\t\t\t\t} else {\n\t\t\t\t\tthis.rewind();\n\t\t\t\t}\n\t\t\t} else if ((c === \"x\" || c === \"X\") && s === \"0\") {\n\t\t\t\treturn this.parseHexNumber(\"0x\");\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseFloat(s), s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseHexNumber(s: string): Token {\n\t\tlet c: string;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseInt(s), s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tif (/[a-fA-F0-9]/.test(c)) {\n\t\t\t\ts += c;\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseInt(s), s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseString(s: string, close: string): Token {\n\t\tlet c: string;\n\t\tlet count_close: number = 0;\n\t\tlet n: string;\n\n\t\tif (close == null) {\n\t\t\tclose = '\"';\n\t\t}\n\n\t\tif (close === '\"') {\n\t\t\t// Check for triple-quoted string\n\t\t\tif (\n\t\t\t\tthis.input.charAt(this.index) === '\"' &&\n\t\t\t\tthis.input.charAt(this.index + 1) === '\"' &&\n\t\t\t\tthis.input.charAt(this.index + 2) !== '\"'\n\t\t\t) {\n\t\t\t\tclose = '\"\"\"';\n\t\t\t\tthis.nextChar(true);\n\t\t\t\tthis.nextChar(true);\n\t\t\t}\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn this.error(\"Unclosed string value\");\n\t\t\t}\n\t\t\tc = this.nextChar(true);\n\n\t\t\tif (c === \"\\\\\") {\n\t\t\t\tn = this.nextChar(true);\n\t\t\t\tswitch (n) {\n\t\t\t\t\tcase \"n\":\n\t\t\t\t\t\ts += \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"\\\\\":\n\t\t\t\t\t\ts += \"\\\\\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase close:\n\t\t\t\t\t\ts += close;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ts += \"\\\\\" + n;\n\t\t\t\t}\n\t\t\t} else if (c === close) {\n\t\t\t\tn = this.nextChar(true);\n\t\t\t\tif (n === close) {\n\t\t\t\t\ts += c;\n\t\t\t\t} else {\n\t\t\t\t\tthis.rewind();\n\t\t\t\t\ts += c;\n\t\t\t\t\treturn new Token(this, close === \"`\" ? Token.TYPE_TEMPLATE : Token.TYPE_STRING, s.substring(1, s.length - 1));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (close === '\"\"\"' && c === '\"') {\n\t\t\t\t\tcount_close += 1;\n\t\t\t\t\tif (count_close === 3) {\n\t\t\t\t\t\treturn new Token(this, Token.TYPE_STRING, s.substring(1, s.length - 2));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcount_close = 0;\n\t\t\t\t}\n\t\t\t\ts += c;\n\t\t\t}\n\t\t}\n\t}\n\n\terror(s: string): never {\n\t\tthrow new Error(s);\n\t}\n}\n","/**\n * Parser - Parser for LootiScript\n *\n * Transforms tokens into an Abstract Syntax Tree (AST).\n */\n\nimport { SyntaxErrorCode as ErrorCode } from \"@al8b/diagnostics\";\nimport {\n\tAfter,\n\tAssignment,\n\tBraced,\n\tBreak,\n\tCondition,\n\tContinue,\n\tCreateClass,\n\tCreateObject,\n\tDelete,\n\tDo,\n\tEvery,\n\tField,\n\tFor,\n\tForIn,\n\tFunction,\n\ttype FunctionArg,\n\tFunctionCall,\n\tNegate,\n\tNewCall,\n\tNot,\n\tOperation,\n\tProgram,\n\tReturn,\n\tSelfAssignment,\n\tSleep,\n\ttype Statement,\n\tValue,\n\tVariable,\n\tWhile,\n} from \"./program\";\nimport { Token } from \"./token\";\nimport { Tokenizer } from \"./tokenizer\";\n\n/**\n * Base error class for LootiScript errors\n */\nexport class LootiScriptError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic file: string,\n\t\tpublic line: number,\n\t\tpublic column: number,\n\t\tpublic stackTrace?: any[],\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"LootiScriptError\";\n\t}\n\n\ttoString(): string {\n\t\tlet msg = `${this.name}: ${this.message}\\n`;\n\t\tmsg += ` at ${this.file}:${this.line}:${this.column}\\n`;\n\t\treturn msg;\n\t}\n}\n\n/**\n * Syntax error during parsing\n */\nexport class LootiSyntaxError extends LootiScriptError {\n\tconstructor(\n\t\tmessage: string,\n\t\tfile: string,\n\t\tline: number,\n\t\tcolumn: number,\n\t\tpublic context?: string,\n\t\tpublic code?: string,\n\t\tpublic suggestions?: string[],\n\t\tpublic related?: {\n\t\t\tfile: string;\n\t\t\tline: number;\n\t\t\tcolumn: number;\n\t\t\tmessage: string;\n\t\t},\n\t) {\n\t\tsuper(message, file, line, column);\n\t\tthis.name = \"SyntaxError\";\n\t}\n\n\ttoString(): string {\n\t\tlet msg = \"\";\n\t\tif (this.code) {\n\t\t\tmsg += `[${this.code}] `;\n\t\t}\n\t\tmsg += `${this.name}: ${this.message}\\n`;\n\t\tmsg += ` at ${this.file}:${this.line}:${this.column}\\n`;\n\t\tif (this.context) {\n\t\t\tmsg += `\\n${this.context}\\n`;\n\t\t}\n\t\treturn msg;\n\t}\n}\n\n/**\n * Helper to format source context around an error\n */\nexport function formatSourceContext(\n\tsource: string,\n\tline: number,\n\tcolumn: number,\n\tcontextLines: number = 3,\n\terrorLength: number = 1,\n): string {\n\tconst lines = source.split(\"\\n\");\n\tconst startLine = Math.max(0, line - contextLines - 1);\n\tconst endLine = Math.min(lines.length - 1, line + contextLines - 1);\n\n\tlet context = \"\\nSource context:\\n\";\n\n\tfor (let i = startLine; i <= endLine; i++) {\n\t\tconst lineNum = i + 1;\n\t\tconst prefix = lineNum === line ? \">\" : \" \";\n\t\tconst lineNumStr = String(lineNum).padStart(4, \" \");\n\t\tconst lineContent = lines[i] || \"\";\n\n\t\tcontext += `${prefix} ${lineNumStr} | ${lineContent}\\n`;\n\n\t\tif (lineNum === line) {\n\t\t\tconst baseOffset = 8;\n\t\t\tconst pointer = \" \".repeat(baseOffset + Math.max(0, column - 1)) + \"^\".repeat(Math.max(1, errorLength));\n\t\t\tcontext += `${pointer}\\n`;\n\t\t}\n\t}\n\n\treturn context;\n}\n\n/**\n * Parser for LootiScript\n * Converts tokens into AST structures\n */\nexport class Parser {\n\tinput: string;\n\tfilename: string;\n\ttokenizer: Tokenizer;\n\tprogram: Program;\n\tcurrent_block: Statement[];\n\tcurrent: Token;\n\tverbose: boolean;\n\tnesting: number;\n\tobject_nesting: number;\n\tnot_terminated: Token[];\n\t// Track function names and their start locations for better error messages\n\tfunction_stack: Array<{\n\t\tname: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t\ttoken: Token;\n\t}>;\n\tapi_reserved: Record<string, boolean>;\n\twarnings: Array<{\n\t\ttype: string;\n\t\tidentifier?: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t}>;\n\tunexpected_eof?: boolean;\n\terror_info?: {\n\t\terror: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t\tcontext?: string;\n\t\tcode?: string;\n\t\tsuggestions?: string[];\n\t\trelated?: {\n\t\t\tfile: string;\n\t\t\tline: number;\n\t\t\tcolumn: number;\n\t\t\tmessage: string;\n\t\t};\n\t};\n\tlast_function_call?: FunctionCall;\n\tstatic multipliers: Record<string, number> = {\n\t\tmillisecond: 1,\n\t\tmilliseconds: 1,\n\t\tsecond: 1000,\n\t\tseconds: 1000,\n\t\tminute: 60000,\n\t\tminutes: 60000,\n\t\thour: 60000 * 60,\n\t\thours: 60000 * 60,\n\t\tday: 60000 * 60 * 24,\n\t\tdays: 60000 * 60 * 24,\n\t};\n\n\tconstructor(input: string, filename: string = \"\") {\n\t\tthis.input = input;\n\t\tthis.filename = filename;\n\t\tif (/^\\s*\\/\\/\\s*javascript\\s*\\n/.test(this.input)) {\n\t\t\tthis.input = 'system.javascript(\"\"\"\\n\\n' + this.input.replace(/\\\\/g, \"\\\\\\\\\") + '\\n\\n\"\"\")';\n\t\t}\n\t\tthis.tokenizer = new Tokenizer(this.input, this.filename);\n\t\tthis.program = new Program();\n\t\tthis.current_block = [];\n\t\t// Initialize with a dummy token (will be replaced by first nextToken call)\n\t\tthis.current = {\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\ttokenizer: this.tokenizer,\n\t\t\ttype: 0,\n\t\t\tvalue: \"\",\n\t\t\tstart: 0,\n\t\t\tlength: 0,\n\t\t\tindex: 0,\n\t\t\tis_binary_operator: false,\n\t\t} as Token;\n\t\tthis.verbose = false;\n\t\tthis.nesting = 0;\n\t\tthis.object_nesting = 0;\n\t\tthis.not_terminated = [];\n\t\tthis.function_stack = [];\n\t\tthis.api_reserved = {\n\t\t\tscreen: true,\n\t\t\taudio: true,\n\t\t\tkeyboard: true,\n\t\t\tgamepad: true,\n\t\t\tsprites: true,\n\t\t\tsounds: true,\n\t\t\tmusic: true,\n\t\t\tassets: true,\n\t\t\tasset_manager: true,\n\t\t\tmaps: true,\n\t\t\ttouch: true,\n\t\t\tmouse: true,\n\t\t\tfonts: true,\n\t\t\tSound: true,\n\t\t\tImage: true,\n\t\t\tSprite: true,\n\t\t\tMap: true,\n\t\t\tsystem: true,\n\t\t\tstorage: true,\n\t\t\tprint: true,\n\t\t\trandom: true,\n\t\t\tFunction: true,\n\t\t\tList: true,\n\t\t\tObject: true,\n\t\t\tString: true,\n\t\t\tNumber: true,\n\t\t\tscenes: true,\n\t\t\tscene: true,\n\t\t\troute: true,\n\t\t\trouter: true,\n\t\t};\n\t\tthis.warnings = [];\n\t}\n\n\tnextToken(): Token {\n\t\tconst token = this.tokenizer.next();\n\t\tif (token == null) {\n\t\t\tthis.unexpected_eof = true;\n\t\t\tthrow \"Unexpected end of file\";\n\t\t}\n\t\treturn (this.current = token);\n\t}\n\n\tnextTokenOptional(): Token | null {\n\t\tconst token = this.tokenizer.next();\n\t\tif (token != null) {\n\t\t\tthis.current = token;\n\t\t}\n\t\treturn token;\n\t}\n\n\tparse():\n\t\t| Parser\n\t\t| {\n\t\t\t\terror: string;\n\t\t\t\tline: number;\n\t\t\t\tcolumn: number;\n\t\t } {\n\t\tlet err: any;\n\t\tlet expression: Statement | null;\n\t\tlet nt: Token;\n\t\tlet token: Token | null;\n\t\ttry {\n\t\t\tthis.warnings = [];\n\t\t\twhile (true) {\n\t\t\t\texpression = this.parseLine();\n\t\t\t\tif (expression == null && !this.tokenizer.finished()) {\n\t\t\t\t\ttoken = this.tokenizer.next();\n\t\t\t\t\tif (token != null && token.reserved_keyword) {\n\t\t\t\t\t\tif (token.value === \"end\") {\n\t\t\t\t\t\t\t// Enhanced error for too many 'end'\n\t\t\t\t\t\t\tconst context = formatSourceContext(\n\t\t\t\t\t\t\t\tthis.input,\n\t\t\t\t\t\t\t\ttoken.line,\n\t\t\t\t\t\t\t\ttoken.column,\n\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t3, // \"end\" length\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst suggestions = [\n\t\t\t\t\t\t\t\t\"Remove this extra 'end' statement\",\n\t\t\t\t\t\t\t\t\"Check if you're missing an opening statement (if, for, while, function)\",\n\t\t\t\t\t\t\t\t\"Verify all blocks are properly matched\",\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\treturn (this.error_info = {\n\t\t\t\t\t\t\t\terror: \"Too many 'end' statements - no matching opening statement found\",\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\tcontext: context,\n\t\t\t\t\t\t\t\tcode: ErrorCode.E1002,\n\t\t\t\t\t\t\t\tsuggestions: suggestions,\n\t\t\t\t\t\t\t}) as any;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.error(`Misuse of reserved keyword: '${token.value}'`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error(\"Unexpected data\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (expression === null) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.current_block.push(expression);\n\t\t\t\tthis.program.add(expression);\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.info(expression);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t} catch (error1) {\n\t\t\terr = error1;\n\n\t\t\t// Handle LootiSyntaxError (already formatted)\n\t\t\tif (err instanceof LootiSyntaxError) {\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: err.message,\n\t\t\t\t\tline: err.line,\n\t\t\t\t\tcolumn: err.column,\n\t\t\t\t\tcontext: err.context,\n\t\t\t\t}) as any;\n\t\t\t}\n\n\t\t\tif (this.not_terminated.length > 0 && err === \"Unexpected end of file\") {\n\t\t\t\tnt = this.not_terminated[this.not_terminated.length - 1];\n\n\t\t\t\t// Try to get function name if this is a function\n\t\t\t\tlet functionName: string | null = null;\n\t\t\t\tlet functionStartLine: number | null = null;\n\t\t\t\tlet functionStartColumn: number | null = null;\n\n\t\t\t\tif (nt.value === \"function\") {\n\t\t\t\t\t// Look for function name in function_stack\n\t\t\t\t\tfor (let i = this.function_stack.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst func = this.function_stack[i];\n\t\t\t\t\t\tif (func.token === nt) {\n\t\t\t\t\t\t\tfunctionName = func.name;\n\t\t\t\t\t\t\tfunctionStartLine = func.line;\n\t\t\t\t\t\t\tfunctionStartColumn = func.column;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst errorLength = typeof nt.value === \"string\" ? nt.value.length : 1;\n\t\t\t\tconst context = formatSourceContext(nt.tokenizer.input, nt.line, nt.column, 3, errorLength);\n\n\t\t\t\t// Build enhanced error message\n\t\t\t\tlet errorMessage: string;\n\t\t\t\tlet suggestions: string[] = [];\n\t\t\t\tlet related: any;\n\n\t\t\t\tif (nt.value === \"function\" && functionName) {\n\t\t\t\t\terrorMessage = `Function '${functionName}' started at line ${functionStartLine} is not closed`;\n\t\t\t\t\tsuggestions = [\n\t\t\t\t\t\t`Add 'end' after the last statement to close function '${functionName}'`,\n\t\t\t\t\t\t`Check if you have an extra 'end' statement somewhere`,\n\t\t\t\t\t\t`Verify all nested blocks (if, for, while) are properly closed`,\n\t\t\t\t\t];\n\t\t\t\t\trelated = {\n\t\t\t\t\t\tfile: this.filename,\n\t\t\t\t\t\tline: functionStartLine!,\n\t\t\t\t\t\tcolumn: functionStartColumn!,\n\t\t\t\t\t\tmessage: `Function '${functionName}' started here`,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = `Unterminated '${nt.value}' ; no matching 'end' found`;\n\t\t\t\t\tsuggestions = [\n\t\t\t\t\t\t`Add 'end' to close the '${nt.value}' statement`,\n\t\t\t\t\t\t`Check if you have nested blocks that need to be closed first`,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: errorMessage,\n\t\t\t\t\tline: nt.line,\n\t\t\t\t\tcolumn: nt.column,\n\t\t\t\t\tcontext: context,\n\t\t\t\t\tcode: ErrorCode.E1001,\n\t\t\t\t\tsuggestions: suggestions,\n\t\t\t\t\trelated: related,\n\t\t\t\t}) as any;\n\t\t\t} else {\n\t\t\t\t// Enhanced error with context for other errors\n\t\t\t\tconst context = formatSourceContext(this.input, this.current.line, this.current.column, 3, 1);\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: typeof err === \"string\" ? err : err.message || String(err),\n\t\t\t\t\tline: this.current.line,\n\t\t\t\t\tcolumn: this.current.column,\n\t\t\t\t\tcontext: context,\n\t\t\t\t\tcode: ErrorCode.E1004,\n\t\t\t\t}) as any;\n\t\t\t}\n\t\t}\n\t}\n\n\tparseLine(): Statement | null {\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_RETURN:\n\t\t\t\treturn new Return(token, this.parseExpression());\n\t\t\tcase Token.TYPE_BREAK:\n\t\t\t\treturn new Break(token);\n\t\t\tcase Token.TYPE_CONTINUE:\n\t\t\t\treturn new Continue(token);\n\t\t\tcase Token.TYPE_LOCAL:\n\t\t\t\treturn this.parseLocalAssignment(token);\n\t\t\tdefault:\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\treturn this.parseExpression();\n\t\t}\n\t}\n\n\tparseExpression(filter?: string | null, first_function_call: boolean = false): Statement | null {\n\t\tlet access: Statement | null;\n\t\tlet expression: Statement | null;\n\t\texpression = this.parseExpressionStart();\n\t\tif (expression == null) {\n\t\t\treturn null;\n\t\t}\n\t\twhile (true) {\n\t\t\taccess = this.parseExpressionSuffix(expression, filter);\n\t\t\tif (access == null) {\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tif (first_function_call && access instanceof FunctionCall) {\n\t\t\t\treturn access;\n\t\t\t}\n\t\t\texpression = access;\n\t\t}\n\t}\n\n\tassertExpression(filter?: string | null, first_function_call: boolean = false): Statement {\n\t\tconst exp = this.parseExpression(filter, first_function_call);\n\t\tif (exp == null) {\n\t\t\tthrow \"Expression expected\";\n\t\t}\n\t\treturn exp;\n\t}\n\n\tparseExpressionSuffix(expression: Statement, filter?: string | null): Statement | null {\n\t\tlet field: Statement;\n\t\tlet identifier: Token;\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn filter === \"self\" ? expression : null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_DOT:\n\t\t\t\tif (expression instanceof Value && expression.type === Value.TYPE_NUMBER) {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.changeNumberToIdentifier();\n\t\t\t\t\tidentifier = this.assertBroadIdentifier(\"Expected identifier\");\n\t\t\t\t\treturn Program.CreateFieldAccess(\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\texpression,\n\t\t\t\t\t\tnew Value(identifier, Value.TYPE_STRING, identifier.value as string),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase Token.TYPE_OPEN_BRACKET:\n\t\t\t\tfield = this.assertExpression();\n\t\t\t\tthis.assert(Token.TYPE_CLOSED_BRACKET, \"Expected ']'\");\n\t\t\t\treturn Program.CreateFieldAccess(token, expression, field);\n\t\t\tcase Token.TYPE_OPEN_BRACE:\n\t\t\t\treturn this.parseFunctionCall(token, expression);\n\t\t\tcase Token.TYPE_EQUALS:\n\t\t\t\treturn this.parseAssignment(token, expression);\n\t\t\tcase Token.TYPE_PLUS_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MINUS_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MULTIPLY_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_DIVIDE_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MODULO_EQUALS:\n\t\t\tcase Token.TYPE_AND_EQUALS:\n\t\t\tcase Token.TYPE_OR_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tdefault:\n\t\t\t\tif (filter === \"self\") {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn expression;\n\t\t\t\t} else if (token.is_binary_operator && filter !== \"noop\") {\n\t\t\t\t\treturn this.parseBinaryOperation(token, expression);\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t}\n\t}\n\n\tparseExpressionStart(): Statement | null {\n\t\tlet next: Token;\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_IDENTIFIER: // variable name\n\t\t\t\treturn new Variable(token, token.value as string);\n\t\t\tcase Token.TYPE_NUMBER:\n\t\t\t\treturn this.parseNumberExpression(token);\n\t\t\tcase Token.TYPE_PLUS:\n\t\t\t\treturn this.assertExpression();\n\t\t\tcase Token.TYPE_MINUS:\n\t\t\t\treturn this.parseExpressionSuffix(new Negate(token, this.assertExpression(\"noop\")), \"self\");\n\t\t\tcase Token.TYPE_NOT:\n\t\t\t\treturn this.parseExpressionSuffix(new Not(token, this.assertExpression(\"noop\")), \"self\");\n\t\t\tcase Token.TYPE_STRING:\n\t\t\t\treturn this.parseStringExpression(token);\n\t\t\tcase Token.TYPE_TEMPLATE:\n\t\t\t\treturn this.parseTemplate(token);\n\t\t\tcase Token.TYPE_IF:\n\t\t\t\treturn this.parseIf(token);\n\t\t\tcase Token.TYPE_FOR:\n\t\t\t\treturn this.parseFor(token);\n\t\t\tcase Token.TYPE_WHILE:\n\t\t\t\treturn this.parseWhile(token);\n\t\t\tcase Token.TYPE_OPEN_BRACE:\n\t\t\t\treturn this.parseBracedExpression(token);\n\t\t\tcase Token.TYPE_OPEN_BRACKET:\n\t\t\t\treturn this.parseArray(token);\n\t\t\tcase Token.TYPE_FUNCTION:\n\t\t\t\treturn this.parseFunction(token);\n\t\t\tcase Token.TYPE_OBJECT:\n\t\t\t\treturn this.parseObject(token);\n\t\t\tcase Token.TYPE_CLASS:\n\t\t\t\treturn this.parseClass(token);\n\t\t\tcase Token.TYPE_NEW:\n\t\t\t\treturn this.parseNew(token);\n\t\t\tcase Token.TYPE_DOT:\n\t\t\t\tnext = this.assert(Token.TYPE_NUMBER, \"malformed number\");\n\t\t\t\tif (!Number.isInteger(next.value as number)) {\n\t\t\t\t\tthrow \"malformed number\";\n\t\t\t\t}\n\t\t\t\treturn new Value(token, Value.TYPE_NUMBER, Number.parseFloat(`.${next.string_value}`));\n\t\t\tcase Token.TYPE_AFTER:\n\t\t\t\treturn this.parseAfter(token);\n\t\t\tcase Token.TYPE_EVERY:\n\t\t\t\treturn this.parseEvery(token);\n\t\t\tcase Token.TYPE_DO:\n\t\t\t\treturn this.parseDo(token);\n\t\t\tcase Token.TYPE_SLEEP:\n\t\t\t\treturn this.parseSleep(token);\n\t\t\tcase Token.TYPE_DELETE:\n\t\t\t\treturn this.parseDelete(token);\n\t\t\tdefault:\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tparseNumberExpression(number: Token): Value {\n\t\treturn new Value(number, Value.TYPE_NUMBER, number.value as number);\n\t}\n\n\tparseStringExpression(string: Token): Value {\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token != null) {\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t}\n\t\treturn new Value(string, Value.TYPE_STRING, string.value as string);\n\t}\n\n\tparseArray(bracket: Token): Value {\n\t\tconst res: Statement[] = [];\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_CLOSED_BRACKET) {\n\t\t\t\treturn new Value(bracket, Value.TYPE_ARRAY, res);\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\t// Skip comma\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tres.push(this.assertExpression());\n\t\t\t}\n\t\t}\n\t}\n\n\tparseBinaryOperation(operation: Token, term1: Statement): Statement {\n\t\tconst ops: Array<{\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t}> = [\n\t\t\t{\n\t\t\t\ttoken: operation,\n\t\t\t\toperation: operation.value as string,\n\t\t\t},\n\t\t];\n\t\tconst terms: Statement[] = [term1];\n\t\tterms.push(this.assertExpression(\"noop\"));\n\t\twhile (true) {\n\t\t\tconst token = this.nextTokenOptional();\n\t\t\tif (token == null) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!token.is_binary_operator) {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push({\n\t\t\t\ttoken: token,\n\t\t\t\toperation: token.value as string,\n\t\t\t});\n\t\t\tterms.push(this.assertExpression(\"noop\"));\n\t\t}\n\t\treturn Program.BuildOperations(ops, terms);\n\t}\n\n\tparseAssignment(token: Token, expression: Statement): Assignment {\n\t\tlet res: Assignment;\n\t\tif (!(expression instanceof Variable || expression instanceof Field)) {\n\t\t\tthrow \"Expected variable identifier or property\";\n\t\t}\n\t\tif (this.object_nesting === 0 && expression instanceof Variable && this.api_reserved[expression.identifier]) {\n\t\t\tthis.warnings.push({\n\t\t\t\ttype: \"assigning_api_variable\",\n\t\t\t\tidentifier: expression.identifier,\n\t\t\t\tline: token.line,\n\t\t\t\tcolumn: token.column,\n\t\t\t});\n\t\t}\n\n\t\t// Peek ahead to see if we're assigning a function\n\t\tconst peekToken = this.tokenizer.peek();\n\t\tlet functionName: string | null = null;\n\n\t\tif (expression instanceof Variable) {\n\t\t\tfunctionName = expression.identifier;\n\t\t}\n\n\t\t// If next token is 'function', we're assigning a named function\n\t\t// Store the function name so parseFunction can use it\n\t\tif (peekToken && peekToken.type === Token.TYPE_FUNCTION && functionName) {\n\t\t\t// We'll update function_stack in parseFunction after it's created\n\t\t}\n\n\t\tconst assignedValue = this.assertExpression();\n\n\t\t// If assigned value is a function and we have a name, update function_stack\n\t\t// Find the most recently added function (should be the one we just parsed)\n\t\tif (assignedValue instanceof Function && functionName && this.function_stack.length > 0) {\n\t\t\t// Find function that matches the function token\n\t\t\tconst funcToken = (assignedValue as any).token;\n\t\t\tfor (let i = this.function_stack.length - 1; i >= 0; i--) {\n\t\t\t\tconst func = this.function_stack[i];\n\t\t\t\tif (func.token === funcToken && func.name === \"anonymous\") {\n\t\t\t\t\tfunc.name = functionName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (expression instanceof Field) {\n\t\t\tthis.object_nesting += 1;\n\t\t\tres = new Assignment(token, expression, assignedValue, false);\n\t\t\tthis.object_nesting -= 1;\n\t\t} else {\n\t\t\tres = new Assignment(token, expression, assignedValue, false);\n\t\t}\n\t\treturn res;\n\t}\n\n\tparseSelfAssignment(token: Token, expression: Statement, operation: number): SelfAssignment {\n\t\tif (!(expression instanceof Variable || expression instanceof Field)) {\n\t\t\tthrow \"Expected variable identifier or property\";\n\t\t}\n\t\t// Convert operation type number to string representation\n\t\tlet opStr: string;\n\t\tif (operation === Token.TYPE_PLUS_EQUALS) {\n\t\t\topStr = \"+=\";\n\t\t} else if (operation === Token.TYPE_MINUS_EQUALS) {\n\t\t\topStr = \"-=\";\n\t\t} else if (operation === Token.TYPE_MULTIPLY_EQUALS) {\n\t\t\topStr = \"*=\";\n\t\t} else if (operation === Token.TYPE_DIVIDE_EQUALS) {\n\t\t\topStr = \"/=\";\n\t\t} else if (operation === Token.TYPE_MODULO_EQUALS) {\n\t\t\topStr = \"%=\";\n\t\t} else if (operation === Token.TYPE_AND_EQUALS) {\n\t\t\topStr = \"&=\";\n\t\t} else if (operation === Token.TYPE_OR_EQUALS) {\n\t\t\topStr = \"|=\";\n\t\t} else {\n\t\t\topStr = String(operation);\n\t\t}\n\t\treturn new SelfAssignment(token, expression, opStr, this.assertExpression());\n\t}\n\n\tparseLocalAssignment(local: Token): Assignment {\n\t\tconst identifier = this.assert(Token.TYPE_IDENTIFIER, \"Expected identifier\");\n\t\tthis.parseOptionalType();\n\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\treturn new Assignment(local, new Variable(identifier, identifier.value as string), this.assertExpression(), true);\n\t}\n\n\tparseBracedExpression(open: Token): Statement {\n\t\t// Check for empty arrow function () => ...\n\t\tif (this.current.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\tconst close = this.nextToken(); // consume )\n\t\t\tconst next = this.nextToken();\n\t\t\tif (next.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(next, []);\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(next);\n\t\t\tthis.current = close;\n\t\t\treturn this.error(\"Unexpected ')'\") as Statement;\n\t\t}\n\n\t\tconst expression = this.assertExpression();\n\t\tthis.parseOptionalType();\n\t\tconst token = this.nextToken();\n\n\t\t// Check for single arg arrow function (arg) => ...\n\t\tif (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\tconst next = this.nextToken();\n\t\t\tif (next.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(next, [expression]);\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(next);\n\t\t\tthis.current = token;\n\t\t\treturn new Braced(open, expression);\n\t\t}\n\t\t// Check for multi arg arrow function (arg1, arg2) => ...\n\t\telse if (token.type === Token.TYPE_COMMA) {\n\t\t\tconst args: Statement[] = [expression];\n\t\t\twhile (true) {\n\t\t\t\targs.push(this.assertExpression());\n\t\t\t\tthis.parseOptionalType();\n\t\t\t\tconst next = this.nextToken();\n\t\t\t\tif (next.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (next.type !== Token.TYPE_COMMA) {\n\t\t\t\t\treturn this.error(\"Expected ',' or ')'\") as Statement;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst arrow = this.nextToken();\n\t\t\tif (arrow.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(arrow, args);\n\t\t\t}\n\t\t\treturn this.error(\"Expected '=>' after parameter list\") as Statement;\n\t\t} else {\n\t\t\treturn this.error(\"missing closing parenthese\") as Braced;\n\t\t}\n\t}\n\tparseArrowFunction(arrow: Token, args: Statement[]): Function {\n\t\tconst funcArgs: FunctionArg[] = [];\n\t\tfor (const arg of args) {\n\t\t\tif (arg instanceof Variable) {\n\t\t\t\t// Check for type annotation if the variable was parsed with one?\n\t\t\t\t// Actually, parseExpression doesn't parse types.\n\t\t\t\t// So (x: int) => ... would fail in parseExpression because : is unexpected.\n\t\t\t\t// We need to handle types inside parseBracedExpression or here?\n\t\t\t\t// If we use (x: int), parseExpression stops at :?\n\t\t\t\t// No, parseExpression expects operators. : is not an operator.\n\t\t\t\t// So parseExpression returns 'x', and next token is ':'.\n\t\t\t\t// We need to handle that here!\n\n\t\t\t\tfuncArgs.push({\n\t\t\t\t\tname: arg.identifier,\n\t\t\t\t\tdefault: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthrow this.error(\"Invalid argument in arrow function\");\n\t\t\t}\n\t\t}\n\n\t\tconst sequence: Statement[] = [];\n\t\t// Parse single statement/expression body\n\t\tconst body = this.parseLine();\n\t\tif (body) {\n\t\t\t// If it's an expression (not a control flow statement), wrap in Return\n\t\t\tif (\n\t\t\t\tbody instanceof Value ||\n\t\t\t\tbody instanceof Variable ||\n\t\t\t\tbody instanceof Operation ||\n\t\t\t\tbody instanceof FunctionCall ||\n\t\t\t\tbody instanceof Assignment ||\n\t\t\t\tbody instanceof Braced\n\t\t\t) {\n\t\t\t\tsequence.push(new Return(arrow, body));\n\t\t\t} else {\n\t\t\t\tsequence.push(body);\n\t\t\t}\n\t\t}\n\n\t\treturn new Function(arrow, funcArgs, sequence, arrow);\n\t}\n\n\tparseFunctionCall(brace_token: Token, expression: Statement): FunctionCall {\n\t\tconst args: Statement[] = [];\n\t\tthis.last_function_call = new FunctionCall(brace_token, expression, args);\n\t\twhile (true) {\n\t\t\tconst token = this.nextTokenOptional();\n\t\t\tif (token == null) {\n\t\t\t\treturn this.error(\"missing closing parenthese\") as FunctionCall;\n\t\t\t} else if (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\treturn new FunctionCall(token, expression, args);\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\t// Skip comma\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\targs.push(this.assertExpression());\n\t\t\t}\n\t\t}\n\t}\n\n\taddTerminable(token: Token): number {\n\t\treturn this.not_terminated.push(token);\n\t}\n\n\tendTerminable(): void {\n\t\tif (this.not_terminated.length > 0) {\n\t\t\tthis.not_terminated.splice(this.not_terminated.length - 1, 1);\n\t\t}\n\t}\n\n\tparseFunction(funk: Token): Function {\n\t\tlet line: Statement | null;\n\t\tconst args = this.parseFunctionArgs();\n\t\tconst sequence: Statement[] = [];\n\t\tthis.nesting += 1;\n\n\t\t// Track this function (name will be set later if it's an assignment)\n\t\tconst funcInfo = {\n\t\t\tname: \"anonymous\",\n\t\t\tline: funk.line,\n\t\t\tcolumn: funk.column,\n\t\t\ttoken: funk,\n\t\t};\n\t\tthis.function_stack.push(funcInfo);\n\t\tthis.addTerminable(funk);\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst token = this.nextToken();\n\t\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\t\tthis.nesting -= 1;\n\t\t\t\t\tthis.endTerminable();\n\t\t\t\t\tthis.function_stack.pop();\n\t\t\t\t\treturn new Function(funk, args, sequence, token);\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\tline = this.parseLine();\n\t\t\t\t\tif (line != null) {\n\t\t\t\t\t\tsequence.push(line);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error(\"Unexpected data while parsing function\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Remove from stack on error\n\t\t\tif (this.function_stack.length > 0 && this.function_stack[this.function_stack.length - 1].token === funk) {\n\t\t\t\tthis.function_stack.pop();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tparseFunctionArgs(): FunctionArg[] {\n\t\tconst args: FunctionArg[] = [];\n\t\tlet last: string | null = null;\n\t\tlet token = this.nextToken();\n\t\tif (token.type !== Token.TYPE_OPEN_BRACE) {\n\t\t\treturn this.error(\"Expected opening parenthese\") as FunctionArg[];\n\t\t}\n\t\twhile (true) {\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\treturn args;\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\tlast = null;\n\t\t\t} else if (token.type === Token.TYPE_EQUALS && last === \"argument\") {\n\t\t\t\t// Set default value for the last argument\n\t\t\t\tconst defaultExpr = this.assertExpression();\n\t\t\t\tif (args.length > 0) {\n\t\t\t\t\targs[args.length - 1].default = defaultExpr;\n\t\t\t\t}\n\t\t\t} else if (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\tlast = \"argument\";\n\t\t\t\targs.push({\n\t\t\t\t\tname: token.value as string,\n\t\t\t\t});\n\t\t\t\tthis.parseOptionalType();\n\t\t\t} else {\n\t\t\t\treturn this.error(\"Unexpected token\") as FunctionArg[];\n\t\t\t}\n\t\t}\n\t}\n\n\twarningAssignmentCondition(expression: Statement): void {\n\t\tif (expression instanceof Assignment) {\n\t\t\tthis.warnings.push({\n\t\t\t\ttype: \"assignment_as_condition\",\n\t\t\t\tline: expression.token.line,\n\t\t\t\tcolumn: expression.token.column,\n\t\t\t});\n\t\t}\n\t}\n\n\tparseIf(iftoken: Token): Condition {\n\t\tlet line: Statement;\n\t\tlet token: Token;\n\t\tconst chain: Array<{\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t}> = [];\n\t\tlet current: {\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t} = {\n\t\t\tcondition: this.assertExpression(),\n\t\t\tsequence: [],\n\t\t};\n\t\tthis.addTerminable(iftoken);\n\t\tthis.warningAssignmentCondition(current.condition);\n\t\ttoken = this.nextToken();\n\t\tif (token.type !== Token.TYPE_THEN) {\n\t\t\treturn this.error(\"Expected 'then'\") as Condition;\n\t\t}\n\t\twhile (true) {\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_ELSIF) {\n\t\t\t\tchain.push(current);\n\t\t\t\tcurrent = {\n\t\t\t\t\tcondition: this.assertExpression(),\n\t\t\t\t\tsequence: [],\n\t\t\t\t};\n\t\t\t\tthis.warningAssignmentCondition(current.condition);\n\t\t\t\tthis.assert(Token.TYPE_THEN, \"Expected 'then'\");\n\t\t\t} else if (token.type === Token.TYPE_ELSE) {\n\t\t\t\tcurrent.else = [];\n\t\t\t} else if (token.type === Token.TYPE_END) {\n\t\t\t\tchain.push(current);\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new Condition(iftoken, chain);\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tconst parsedLine = this.parseLine();\n\t\t\t\tif (parsedLine == null) {\n\t\t\t\t\tthrow Error(\"Unexpected data while parsing if\");\n\t\t\t\t}\n\t\t\t\tline = parsedLine;\n\t\t\t\tif (current.else != null) {\n\t\t\t\t\tcurrent.else.push(line);\n\t\t\t\t} else {\n\t\t\t\t\tcurrent.sequence.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tassert(type: number, error: string): Token {\n\t\tconst token = this.nextToken();\n\t\tif (token.type !== type) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn token;\n\t}\n\n\tassertBroadIdentifier(error: string): Token {\n\t\tconst token = this.nextToken();\n\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t}\n\t\tif (token.type !== Token.TYPE_IDENTIFIER) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn token;\n\t}\n\n\t/**\n\t * Throw enhanced error with source context\n\t */\n\terror(text: string): never {\n\t\tconst token = this.current;\n\t\tconst context = formatSourceContext(token.tokenizer.input, token.line, token.column, 2);\n\n\t\tthrow new LootiSyntaxError(text, token.tokenizer.filename, token.line, token.column, context);\n\t}\n\n\t/**\n\t * Parse optional type annotation (e.g. : string)\n\t * Currently just consumes the tokens without storing type info\n\t */\n\tparseOptionalType(): void {\n\t\tlet token = this.nextTokenOptional();\n\t\tif (token == null) return;\n\n\t\tif (token.type === Token.TYPE_COLON) {\n\t\t\t// Consume type identifier\n\t\t\tthis.assert(Token.TYPE_IDENTIFIER, \"Expected type identifier\");\n\n\t\t\t// Handle array types: number[] or number[][]\n\t\t\twhile (true) {\n\t\t\t\ttoken = this.nextTokenOptional();\n\t\t\t\tif (token && (token as any).type === Token.TYPE_OPEN_BRACKET) {\n\t\t\t\t\tthis.assert(Token.TYPE_CLOSED_BRACKET, \"Expected ']'\");\n\t\t\t\t} else {\n\t\t\t\t\tif (token) this.tokenizer.pushBack(token);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t}\n\t}\n\n\tparseFor(fortoken: Token): For | ForIn {\n\t\tlet list: Statement;\n\t\tlet range_by: Statement | null;\n\t\tlet range_from: Statement;\n\t\tlet range_to: Statement;\n\t\tlet token: Token;\n\t\tconst iterator = this.assertExpression();\n\t\tif (iterator instanceof Assignment) {\n\t\t\trange_from = iterator.expression;\n\t\t\tconst iter = iterator.field;\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type !== Token.TYPE_TO) {\n\t\t\t\treturn this.error(\"Expected 'to'\") as For;\n\t\t\t}\n\t\t\trange_to = this.assertExpression();\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_BY) {\n\t\t\t\trange_by = this.assertExpression();\n\t\t\t} else {\n\t\t\t\trange_by = null;\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t}\n\t\t\tif (iter instanceof Variable) {\n\t\t\t\treturn new For(fortoken, iter.identifier, range_from, range_to, range_by, this.parseSequence(fortoken));\n\t\t\t}\n\t\t\treturn this.error(\"Malformed for loop\") as For;\n\t\t} else if (iterator instanceof Variable) {\n\t\t\tthis.assert(Token.TYPE_IN, \"Error expected keyword 'in'\");\n\t\t\tlist = this.assertExpression();\n\t\t\treturn new ForIn(fortoken, iterator.identifier, list, this.parseSequence(fortoken));\n\t\t} else {\n\t\t\treturn this.error(\"Malformed for loop\") as For;\n\t\t}\n\t}\n\n\tparseWhile(whiletoken: Token): While {\n\t\tconst condition = this.assertExpression();\n\t\treturn new While(whiletoken, condition, this.parseSequence(whiletoken));\n\t}\n\n\tparseSequence(start_token: Token | null): Statement[] {\n\t\tlet line: Statement | null;\n\t\tconst sequence: Statement[] = [];\n\t\tif (start_token != null) {\n\t\t\tthis.addTerminable(start_token);\n\t\t}\n\t\tthis.nesting += 1;\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tif (start_token != null) {\n\t\t\t\t\tthis.endTerminable();\n\t\t\t\t}\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\treturn sequence;\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tline = this.parseLine();\n\t\t\t\tif (line == null) {\n\t\t\t\t\tthrow this.error(\"Unexpected data\");\n\t\t\t\t}\n\t\t\t\tsequence.push(line);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseObject(object: Token): CreateObject {\n\t\tlet exp: Statement;\n\t\tconst fields: Array<{\n\t\t\tfield: string | number | null;\n\t\t\tvalue: Statement;\n\t\t}> = [];\n\t\tthis.nesting += 1;\n\t\tthis.object_nesting += 1;\n\t\tthis.addTerminable(object);\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.object_nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new CreateObject(object, fields);\n\t\t\t} else {\n\t\t\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_STRING) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\t\t\t\texp = this.assertExpression();\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tfield: token.value as string,\n\t\t\t\t\t\tvalue: exp,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.error(\"Malformed object\") as CreateObject;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tparseClass(object: Token): CreateClass {\n\t\tlet exp: Statement;\n\t\tlet ext: Statement | null = null;\n\t\tconst fields: Array<{\n\t\t\tfield: string | number;\n\t\t\tvalue: Statement;\n\t\t}> = [];\n\t\tthis.nesting += 1;\n\t\tthis.object_nesting += 1;\n\t\tthis.addTerminable(object);\n\t\tlet token = this.nextToken();\n\t\tif (token.type === Token.TYPE_EXTENDS) {\n\t\t\text = this.assertExpression();\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t\twhile (true) {\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.object_nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new CreateClass(object, ext, fields);\n\t\t\t} else {\n\t\t\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_STRING) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\t\t\t\texp = this.assertExpression();\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tfield: token.value as string,\n\t\t\t\t\t\tvalue: exp,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.error(\"Malformed object\") as CreateClass;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t}\n\n\tparseNew(token: Token): NewCall {\n\t\tconst exp = this.assertExpression(null, true);\n\t\treturn new NewCall(token, exp);\n\t}\n\n\tprivate tryParseMultiplier(): { multiplier: number | null; token: Token } {\n\t\tlet multiplier: number | null = null;\n\t\tlet token = this.nextToken();\n\t\tif (token.type === Token.TYPE_IDENTIFIER && Parser.multipliers[token.value as string]) {\n\t\t\tmultiplier = Parser.multipliers[token.value as string];\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t\treturn { multiplier, token };\n\t}\n\n\tprivate parseBlock(keyword: string): { sequence: Statement[]; endToken: Token } {\n\t\tconst sequence: Statement[] = [];\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn { sequence, endToken: token };\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t\tconst line = this.parseLine();\n\t\t\tif (line != null) {\n\t\t\t\tsequence.push(line);\n\t\t\t} else {\n\t\t\t\tthis.error(`Unexpected data while parsing ${keyword}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseAfter(after: Token): After {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(after);\n\t\tconst delay = this.assertExpression();\n\t\tconst { multiplier, token } = this.tryParseMultiplier();\n\t\tif (token == null || token.type !== Token.TYPE_DO) {\n\t\t\treturn this.error(\"Expected keyword 'do'\") as After;\n\t\t}\n\t\tconst { sequence, endToken } = this.parseBlock(\"after\");\n\t\treturn new After(after, delay, sequence, endToken, multiplier);\n\t}\n\n\tparseEvery(every: Token): Every {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(every);\n\t\tconst delay = this.assertExpression();\n\t\tconst { multiplier, token } = this.tryParseMultiplier();\n\t\tif (token == null || token.type !== Token.TYPE_DO) {\n\t\t\treturn this.error(\"Expected keyword 'do'\") as Every;\n\t\t}\n\t\tconst { sequence, endToken } = this.parseBlock(\"every\");\n\t\treturn new Every(every, delay, sequence, endToken, multiplier);\n\t}\n\n\tparseDo(do_token: Token): Do {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(do_token);\n\t\tconst { sequence, endToken } = this.parseBlock(\"do\");\n\t\treturn new Do(do_token, sequence, endToken);\n\t}\n\n\tparseSleep(sleep: Token): Sleep {\n\t\tlet multiplier: number | null = null;\n\t\tconst delay = this.assertExpression();\n\t\tconst token = this.nextToken();\n\t\tif (token != null) {\n\t\t\tif (token.type === Token.TYPE_IDENTIFIER && Parser.multipliers[token.value as string]) {\n\t\t\t\tmultiplier = Parser.multipliers[token.value as string];\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t}\n\t\t}\n\t\treturn new Sleep(sleep, delay, multiplier);\n\t}\n\n\tparseDelete(del: Token): Delete {\n\t\tconst v = this.parseExpression();\n\t\tif (v == null || !(v instanceof Variable || v instanceof Field)) {\n\t\t\treturn this.error(\"expecting variable name or property access after keyword `delete`\") as Delete;\n\t\t} else {\n\t\t\treturn new Delete(del, v);\n\t\t}\n\t}\n\tparseTemplate(token: Token): Statement {\n\t\tconst raw = token.value as string;\n\t\tlet current = 0;\n\t\tconst parts: Statement[] = [];\n\n\t\twhile (current < raw.length) {\n\t\t\tconst start = raw.indexOf(\"${\", current);\n\t\t\tif (start === -1) {\n\t\t\t\t// No more interpolation, add remaining string\n\t\t\t\tif (current < raw.length) {\n\t\t\t\t\tparts.push(new Value(token, Value.TYPE_STRING, raw.substring(current)));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Add string part before ${\n\t\t\tif (start > current) {\n\t\t\t\tparts.push(new Value(token, Value.TYPE_STRING, raw.substring(current, start)));\n\t\t\t}\n\n\t\t\t// Find matching }\n\t\t\tlet depth = 1;\n\t\t\tlet end = start + 2;\n\t\t\tlet inString = false;\n\t\t\tlet stringChar = \"\";\n\n\t\t\twhile (end < raw.length && depth > 0) {\n\t\t\t\tconst char = raw[end];\n\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (char === stringChar && raw[end - 1] !== \"\\\\\") {\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (char === '\"' || char === \"'\" || char === \"`\") {\n\t\t\t\t\t\tinString = true;\n\t\t\t\t\t\tstringChar = char;\n\t\t\t\t\t} else if (char === \"{\") {\n\t\t\t\t\t\tdepth++;\n\t\t\t\t\t} else if (char === \"}\") {\n\t\t\t\t\t\tdepth--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (depth > 0) end++;\n\t\t\t}\n\n\t\t\tif (depth > 0) {\n\t\t\t\tthrow this.error(\"Unclosed template interpolation\");\n\t\t\t}\n\n\t\t\t// Extract expression source\n\t\t\tconst exprSource = raw.substring(start + 2, end);\n\n\t\t\t// Parse expression using a new Parser instance\n\t\t\tconst subParser = new (this.constructor as any)(exprSource, token.tokenizer.filename);\n\t\t\tconst expr = subParser.parseExpression();\n\n\t\t\tif (expr) {\n\t\t\t\tparts.push(expr);\n\t\t\t}\n\n\t\t\tcurrent = end + 1;\n\t\t}\n\n\t\tif (parts.length === 0) {\n\t\t\treturn new Value(token, Value.TYPE_STRING, \"\");\n\t\t}\n\n\t\t// Combine parts with +\n\t\tlet result = parts[0];\n\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\tresult = new Operation(token, \"+\", result, parts[i]);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","/**\n * Routine - VM bytecode routine and opcodes for LootiScript\n *\n * Represents compiled bytecode ready for execution.\n */\n\nimport type { InlineCache } from \"./inline-cache\";\n\n// Forward declarations for circular dependencies\ndeclare class Transpiler {\n\ttranspile(routine: Routine): void;\n}\n\ndeclare class Compiler {\n\tstatic predefined_unary_functions: Record<string, any>;\n\tstatic predefined_binary_functions: Record<string, any>;\n}\n\n/**\n * OPCODES class - Maps opcode names to numeric codes\n */\nclass OPCODES_CLASS {\n\tprivate table: Record<string | number, string | number> = {};\n\n\tset(op: string, code: number): number {\n\t\tthis[op as keyof this] = code as any;\n\t\tthis[code] = op;\n\t\tthis.table[op] = code;\n\t\tthis.table[code] = op;\n\t\treturn code;\n\t}\n\n\t// Opcode constants\n\treadonly TYPE = 1;\n\treadonly VARIABLE_TYPE = 2;\n\treadonly PROPERTY_TYPE = 3;\n\treadonly LOAD_IMPORT = 4;\n\treadonly LOAD_THIS = 5;\n\treadonly LOAD_GLOBAL = 6;\n\treadonly LOAD_VALUE = 10;\n\treadonly LOAD_LOCAL = 11;\n\treadonly LOAD_VARIABLE = 12;\n\treadonly LOAD_LOCAL_OBJECT = 13;\n\treadonly LOAD_VARIABLE_OBJECT = 14;\n\treadonly POP = 15;\n\treadonly LOAD_PROPERTY = 16;\n\treadonly LOAD_PROPERTY_OBJECT = 17;\n\treadonly CREATE_OBJECT = 18;\n\treadonly MAKE_OBJECT = 19;\n\treadonly CREATE_ARRAY = 20;\n\treadonly STORE_LOCAL = 21;\n\treadonly STORE_VARIABLE = 23;\n\treadonly CREATE_PROPERTY = 24;\n\treadonly STORE_PROPERTY = 25;\n\treadonly DELETE = 26;\n\treadonly UPDATE_CLASS = 27;\n\treadonly CREATE_CLASS = 28;\n\treadonly NEW_CALL = 29;\n\treadonly ADD = 30;\n\treadonly SUB = 31;\n\treadonly MUL = 32;\n\treadonly DIV = 33;\n\treadonly MODULO = 34;\n\treadonly BINARY_AND = 35;\n\treadonly BINARY_OR = 36;\n\treadonly SHIFT_LEFT = 37;\n\treadonly SHIFT_RIGHT = 38;\n\treadonly NEGATE = 39;\n\treadonly EQ = 40;\n\treadonly NEQ = 41;\n\treadonly LT = 42;\n\treadonly GT = 43;\n\treadonly LTE = 44;\n\treadonly GTE = 45;\n\treadonly NOT = 50;\n\treadonly LOAD_PROPERTY_ATOP = 68;\n\treadonly JUMP = 80;\n\treadonly JUMPY = 81;\n\treadonly JUMPN = 82;\n\treadonly JUMPY_NOPOP = 83;\n\treadonly JUMPN_NOPOP = 84;\n\treadonly LOAD_ROUTINE = 89;\n\treadonly FUNCTION_CALL = 90;\n\treadonly FUNCTION_APPLY_VARIABLE = 91;\n\treadonly FUNCTION_APPLY_PROPERTY = 92;\n\treadonly SUPER_CALL = 93;\n\treadonly RETURN = 94;\n\treadonly FORLOOP_INIT = 95;\n\treadonly FORLOOP_CONTROL = 96;\n\treadonly FORIN_INIT = 97;\n\treadonly FORIN_CONTROL = 98;\n\treadonly UNARY_OP = 100;\n\treadonly BINARY_OP = 101;\n\treadonly COMPILED = 200;\n\treadonly AFTER = 110;\n\treadonly EVERY = 111;\n\treadonly DO = 112;\n\treadonly SLEEP = 113;\n\n\t/**\n\t * Fused opcodes - Performance optimization\n\t *\n\t * Combines common operation pairs into single opcodes to reduce\n\t * instruction dispatch overhead and improve cache locality.\n\t * Typical performance gain: 15-30% for hot paths.\n\t */\n\treadonly LOAD_VAR_CALL = 120;\n\treadonly LOAD_PROP_CALL = 121;\n\treadonly LOAD_CONST_ADD = 122;\n\treadonly LOAD_CONST_SUB = 123;\n\treadonly LOAD_CONST_MUL = 124;\n\treadonly LOAD_LOCAL_ADD = 125;\n\treadonly LOAD_LOCAL_SUB = 126;\n\treadonly LOAD_LOCAL_MUL = 127;\n\treadonly LOAD_CONST_DIV = 128;\n\treadonly LOAD_LOCAL_LT = 129;\n\treadonly LOAD_LOCAL_GT = 130;\n\treadonly LOAD_LOCAL_EQ = 131;\n\n\tconstructor() {\n\t\tthis.set(\"TYPE\", 1);\n\t\tthis.set(\"VARIABLE_TYPE\", 2);\n\t\tthis.set(\"PROPERTY_TYPE\", 3);\n\t\tthis.set(\"LOAD_IMPORT\", 4);\n\t\tthis.set(\"LOAD_THIS\", 5);\n\t\tthis.set(\"LOAD_GLOBAL\", 6);\n\t\tthis.set(\"LOAD_VALUE\", 10);\n\t\tthis.set(\"LOAD_LOCAL\", 11);\n\t\tthis.set(\"LOAD_VARIABLE\", 12);\n\t\tthis.set(\"LOAD_LOCAL_OBJECT\", 13);\n\t\tthis.set(\"LOAD_VARIABLE_OBJECT\", 14);\n\t\tthis.set(\"POP\", 15);\n\t\tthis.set(\"LOAD_PROPERTY\", 16);\n\t\tthis.set(\"LOAD_PROPERTY_OBJECT\", 17);\n\t\tthis.set(\"CREATE_OBJECT\", 18);\n\t\tthis.set(\"MAKE_OBJECT\", 19);\n\t\tthis.set(\"CREATE_ARRAY\", 20);\n\t\tthis.set(\"STORE_LOCAL\", 21);\n\t\tthis.set(\"STORE_VARIABLE\", 23);\n\t\tthis.set(\"CREATE_PROPERTY\", 24);\n\t\tthis.set(\"STORE_PROPERTY\", 25);\n\t\tthis.set(\"DELETE\", 26);\n\t\tthis.set(\"UPDATE_CLASS\", 27);\n\t\tthis.set(\"CREATE_CLASS\", 28);\n\t\tthis.set(\"NEW_CALL\", 29);\n\t\tthis.set(\"ADD\", 30);\n\t\tthis.set(\"SUB\", 31);\n\t\tthis.set(\"MUL\", 32);\n\t\tthis.set(\"DIV\", 33);\n\t\tthis.set(\"MODULO\", 34);\n\t\tthis.set(\"BINARY_AND\", 35);\n\t\tthis.set(\"BINARY_OR\", 36);\n\t\tthis.set(\"SHIFT_LEFT\", 37);\n\t\tthis.set(\"SHIFT_RIGHT\", 38);\n\t\tthis.set(\"NEGATE\", 39);\n\t\tthis.set(\"EQ\", 40);\n\t\tthis.set(\"NEQ\", 41);\n\t\tthis.set(\"LT\", 42);\n\t\tthis.set(\"GT\", 43);\n\t\tthis.set(\"LTE\", 44);\n\t\tthis.set(\"GTE\", 45);\n\t\tthis.set(\"NOT\", 50);\n\t\tthis.set(\"LOAD_PROPERTY_ATOP\", 68);\n\t\tthis.set(\"JUMP\", 80);\n\t\tthis.set(\"JUMPY\", 81);\n\t\tthis.set(\"JUMPN\", 82);\n\t\tthis.set(\"JUMPY_NOPOP\", 83);\n\t\tthis.set(\"JUMPN_NOPOP\", 84);\n\t\tthis.set(\"LOAD_ROUTINE\", 89);\n\t\tthis.set(\"FUNCTION_CALL\", 90);\n\t\tthis.set(\"FUNCTION_APPLY_VARIABLE\", 91);\n\t\tthis.set(\"FUNCTION_APPLY_PROPERTY\", 92);\n\t\tthis.set(\"SUPER_CALL\", 93);\n\t\tthis.set(\"RETURN\", 94);\n\t\tthis.set(\"FORLOOP_INIT\", 95);\n\t\tthis.set(\"FORLOOP_CONTROL\", 96);\n\t\tthis.set(\"FORIN_INIT\", 97);\n\t\tthis.set(\"FORIN_CONTROL\", 98);\n\t\tthis.set(\"UNARY_OP\", 100);\n\t\tthis.set(\"BINARY_OP\", 101);\n\t\tthis.set(\"COMPILED\", 200);\n\t\tthis.set(\"AFTER\", 110);\n\t\tthis.set(\"EVERY\", 111);\n\t\tthis.set(\"DO\", 112);\n\t\tthis.set(\"SLEEP\", 113);\n\t\t// Fused opcodes - combine frequent operation pairs for performance\n\t\tthis.set(\"LOAD_VAR_CALL\", 120); // LOAD_VARIABLE + FUNCTION_CALL\n\t\tthis.set(\"LOAD_PROP_CALL\", 121); // LOAD_PROPERTY + FUNCTION_CALL\n\t\tthis.set(\"LOAD_CONST_ADD\", 122); // LOAD_VALUE + ADD\n\t\tthis.set(\"LOAD_CONST_SUB\", 123); // LOAD_VALUE + SUB\n\t\tthis.set(\"LOAD_CONST_MUL\", 124); // LOAD_VALUE + MUL\n\t\tthis.set(\"LOAD_LOCAL_ADD\", 125); // LOAD_LOCAL + ADD\n\t\tthis.set(\"LOAD_LOCAL_SUB\", 126); // LOAD_LOCAL + SUB\n\t\tthis.set(\"LOAD_LOCAL_MUL\", 127); // LOAD_LOCAL + MUL\n\t\tthis.set(\"LOAD_CONST_DIV\", 128); // LOAD_VALUE + DIV\n\t\tthis.set(\"LOAD_LOCAL_LT\", 129); // LOAD_LOCAL + LT\n\t\tthis.set(\"LOAD_LOCAL_GT\", 130); // LOAD_LOCAL + GT\n\t\tthis.set(\"LOAD_LOCAL_EQ\", 131); // LOAD_LOCAL + EQ\n\t}\n\n\t[key: string | number]: any;\n}\n\n/**\n * Global OPCODES instance\n */\nexport const OPCODES = new OPCODES_CLASS();\n\n/**\n * Routine - VM bytecode routine representing compiled LootiScript code\n */\nexport class Routine {\n\tnum_args: number;\n\tops: number[];\n\topcodes: number[];\n\targ1: any[];\n\tref: any[];\n\tlabel_count: number;\n\tlabels: Record<string, number>;\n\ttranspile: boolean;\n\timport_refs: any[];\n\timport_values: any[];\n\timport_self: number;\n\tlocals_size?: number;\n\tuses_arguments?: boolean;\n\tas_function?: Function;\n\tobject?: any;\n\tcallback?: Function | null;\n\n\t/**\n\t * Inline caches mapped by opcode index\n\t *\n\t * Caches property lookups and method calls to avoid repeated\n\t * hash table lookups. Significantly improves performance for\n\t * hot code paths with stable object shapes.\n\t */\n\tics: Record<number, InlineCache>;\n\n\tconstructor(num_args: number = 0) {\n\t\tthis.num_args = num_args;\n\t\tthis.ops = [];\n\t\tthis.opcodes = [];\n\t\tthis.arg1 = [];\n\t\tthis.ref = [];\n\t\tthis.label_count = 0;\n\t\tthis.labels = {};\n\t\tthis.transpile = false;\n\t\tthis.import_refs = [];\n\t\tthis.import_values = [];\n\t\tthis.import_self = -1;\n\t\tthis.ics = {};\n\t}\n\n\tclone(): Routine {\n\t\tconst r = new Routine(this.num_args);\n\t\tr.opcodes = this.opcodes;\n\t\tr.arg1 = this.arg1;\n\t\tr.ref = this.ref;\n\t\tr.locals_size = this.locals_size;\n\t\tr.uses_arguments = this.uses_arguments;\n\t\t// Inline caches are not cloned - each routine instance starts with\n\t\t// fresh caches to avoid polluting new instances with stale cache data\n\t\treturn r;\n\t}\n\n\tcreateLabel(str: string = \"label\"): string {\n\t\treturn \":\" + str + \"_\" + this.label_count++;\n\t}\n\n\tsetLabel(name: string): number {\n\t\treturn (this.labels[name] = this.opcodes.length);\n\t}\n\n\toptimize(): void {\n\t\tif (this.transpile) {\n\t\t\tnew Transpiler().transpile(this);\n\t\t}\n\t}\n\n\tremoveable(index: number): boolean {\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value === index) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tremove(index: number): boolean {\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value === index) {\n\t\t\t\treturn false;\n\t\t\t} else if (value > index) {\n\t\t\t\tthis.labels[label] -= 1;\n\t\t\t}\n\t\t}\n\t\tthis.opcodes.splice(index, 1);\n\t\tthis.arg1.splice(index, 1);\n\t\tthis.ref.splice(index, 1);\n\t\treturn true;\n\t}\n\n\tresolveLabels(): void {\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tconst opcode = this.opcodes[i];\n\t\t\tif (\n\t\t\t\topcode === OPCODES.JUMP ||\n\t\t\t\topcode === OPCODES.JUMPY ||\n\t\t\t\topcode === OPCODES.JUMPN ||\n\t\t\t\topcode === OPCODES.JUMPY_NOPOP ||\n\t\t\t\topcode === OPCODES.JUMPN_NOPOP\n\t\t\t) {\n\t\t\t\tif (this.labels[this.arg1[i]]) {\n\t\t\t\t\tthis.arg1[i] = this.labels[this.arg1[i] as string];\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\topcode === OPCODES.FORLOOP_CONTROL ||\n\t\t\t\topcode === OPCODES.FORLOOP_INIT ||\n\t\t\t\topcode === OPCODES.FORIN_CONTROL ||\n\t\t\t\topcode === OPCODES.FORIN_INIT\n\t\t\t) {\n\t\t\t\tconst args = this.arg1[i] as any[];\n\t\t\t\tif (args && this.labels[args[1]]) {\n\t\t\t\t\targs[1] = this.labels[args[1]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tOP(code: number, ref: any, v1: any = 0): number {\n\t\tthis.opcodes.push(code);\n\t\tthis.arg1.push(v1);\n\t\treturn this.ref.push(ref);\n\t}\n\n\tOP_INSERT(code: number, ref: any, v1: any = 0, index: number): void {\n\t\tthis.opcodes.splice(index, 0, code);\n\t\tthis.arg1.splice(index, 0, v1);\n\t\tthis.ref.splice(index, 0, ref);\n\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value >= index) {\n\t\t\t\tthis.labels[label] += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tTYPE(ref: any): number {\n\t\treturn this.OP(OPCODES.TYPE, ref);\n\t}\n\n\tVARIABLE_TYPE(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.VARIABLE_TYPE, ref, variable);\n\t}\n\n\tPROPERTY_TYPE(ref: any): number {\n\t\treturn this.OP(OPCODES.PROPERTY_TYPE, ref);\n\t}\n\n\tLOAD_THIS(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_THIS, ref);\n\t}\n\n\tLOAD_GLOBAL(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_GLOBAL, ref);\n\t}\n\n\tLOAD_VALUE(value: any, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VALUE, ref, value);\n\t}\n\n\tLOAD_LOCAL(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_LOCAL, ref, index);\n\t}\n\n\tLOAD_VARIABLE(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VARIABLE, ref, variable);\n\t}\n\n\tLOAD_LOCAL_OBJECT(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_LOCAL_OBJECT, ref, index);\n\t}\n\n\tLOAD_VARIABLE_OBJECT(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VARIABLE_OBJECT, ref, variable);\n\t}\n\n\tPOP(ref: any): number {\n\t\treturn this.OP(OPCODES.POP, ref);\n\t}\n\n\tLOAD_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY, ref);\n\t}\n\n\tLOAD_PROPERTY_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY_OBJECT, ref);\n\t}\n\n\tCREATE_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_OBJECT, ref);\n\t}\n\n\tMAKE_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.MAKE_OBJECT, ref);\n\t}\n\n\tCREATE_ARRAY(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_ARRAY, ref);\n\t}\n\n\tCREATE_CLASS(parent_var: number | string, ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_CLASS, ref, parent_var);\n\t}\n\n\tUPDATE_CLASS(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.UPDATE_CLASS, ref, variable);\n\t}\n\n\tNEW_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.NEW_CALL, ref, args);\n\t}\n\n\tADD(ref: any, self: number = 0): number {\n\t\treturn this.OP(OPCODES.ADD, ref, self);\n\t}\n\n\tSUB(ref: any, self: number = 0): number {\n\t\treturn this.OP(OPCODES.SUB, ref, self);\n\t}\n\n\tMUL(ref: any): number {\n\t\treturn this.OP(OPCODES.MUL, ref);\n\t}\n\n\tDIV(ref: any): number {\n\t\treturn this.OP(OPCODES.DIV, ref);\n\t}\n\n\tMODULO(ref: any): number {\n\t\treturn this.OP(OPCODES.MODULO, ref);\n\t}\n\n\tBINARY_AND(ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_AND, ref);\n\t}\n\n\tBINARY_OR(ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_OR, ref);\n\t}\n\n\tSHIFT_LEFT(ref: any): number {\n\t\treturn this.OP(OPCODES.SHIFT_LEFT, ref);\n\t}\n\n\tSHIFT_RIGHT(ref: any): number {\n\t\treturn this.OP(OPCODES.SHIFT_RIGHT, ref);\n\t}\n\n\tNEGATE(ref: any): number {\n\t\treturn this.OP(OPCODES.NEGATE, ref);\n\t}\n\n\tLOAD_PROPERTY_ATOP(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY_ATOP, ref);\n\t}\n\n\tEQ(ref: any): number {\n\t\treturn this.OP(OPCODES.EQ, ref);\n\t}\n\n\tNEQ(ref: any): number {\n\t\treturn this.OP(OPCODES.NEQ, ref);\n\t}\n\n\tLT(ref: any): number {\n\t\treturn this.OP(OPCODES.LT, ref);\n\t}\n\n\tGT(ref: any): number {\n\t\treturn this.OP(OPCODES.GT, ref);\n\t}\n\n\tLTE(ref: any): number {\n\t\treturn this.OP(OPCODES.LTE, ref);\n\t}\n\n\tGTE(ref: any): number {\n\t\treturn this.OP(OPCODES.GTE, ref);\n\t}\n\n\tNOT(ref: any): number {\n\t\treturn this.OP(OPCODES.NOT, ref);\n\t}\n\n\tFORLOOP_INIT(iterator: number | any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORLOOP_INIT, ref, iterator);\n\t}\n\n\tFORLOOP_CONTROL(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORLOOP_CONTROL, ref, args);\n\t}\n\n\tFORIN_INIT(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORIN_INIT, ref, args);\n\t}\n\n\tFORIN_CONTROL(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORIN_CONTROL, ref, args);\n\t}\n\n\tJUMP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMP, ref, index);\n\t}\n\n\tJUMPY(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPY, ref, index);\n\t}\n\n\tJUMPN(index: string | number, ref?: any): number {\n\t\treturn this.OP(OPCODES.JUMPN, ref, index);\n\t}\n\n\tJUMPY_NOPOP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPY_NOPOP, ref, index);\n\t}\n\n\tJUMPN_NOPOP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPN_NOPOP, ref, index);\n\t}\n\n\tSTORE_LOCAL(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_LOCAL, ref, index);\n\t}\n\n\tSTORE_VARIABLE(field: string, ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_VARIABLE, ref, field);\n\t}\n\n\tCREATE_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_PROPERTY, ref);\n\t}\n\n\tSTORE_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_PROPERTY, ref);\n\t}\n\n\tLOAD_ROUTINE(value: any, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_ROUTINE, ref, value);\n\t}\n\n\tFUNCTION_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_CALL, ref, args);\n\t}\n\n\tFUNCTION_APPLY_VARIABLE(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_APPLY_VARIABLE, ref, args);\n\t}\n\n\tFUNCTION_APPLY_PROPERTY(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_APPLY_PROPERTY, ref, args);\n\t}\n\n\tSUPER_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.SUPER_CALL, ref, args);\n\t}\n\n\tRETURN(ref: any): number {\n\t\treturn this.OP(OPCODES.RETURN, ref);\n\t}\n\n\tAFTER(ref: any): number {\n\t\treturn this.OP(OPCODES.AFTER, ref);\n\t}\n\n\tEVERY(ref: any): number {\n\t\treturn this.OP(OPCODES.EVERY, ref);\n\t}\n\n\tDO(ref: any): number {\n\t\treturn this.OP(OPCODES.DO, ref);\n\t}\n\n\tSLEEP(ref: any): number {\n\t\treturn this.OP(OPCODES.SLEEP, ref);\n\t}\n\n\tDELETE(ref: any): number {\n\t\treturn this.OP(OPCODES.DELETE, ref);\n\t}\n\n\tUNARY_OP(f: any, ref: any): number {\n\t\treturn this.OP(OPCODES.UNARY_OP, ref, f);\n\t}\n\n\tBINARY_OP(f: any, ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_OP, ref, f);\n\t}\n\n\ttoString(): string {\n\t\tlet s = \"\";\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tconst op = this.opcodes[i];\n\t\t\ts += OPCODES[op];\n\t\t\tif (this.arg1[i] != null) {\n\t\t\t\ts += ` ${this.arg1[i]}`;\n\t\t\t}\n\t\t\ts += \"\\n\";\n\t\t}\n\t\treturn s;\n\t}\n\n\texportArg(arg: any): any {\n\t\tif (arg == null) {\n\t\t\treturn 0;\n\t\t} else if (arg instanceof Routine) {\n\t\t\treturn arg.export();\n\t\t} else if (typeof arg === \"function\") {\n\t\t\treturn (arg as any).name;\n\t\t} else {\n\t\t\treturn arg;\n\t\t}\n\t}\n\n\texport(): {\n\t\tnum_args: number;\n\t\tops: number[];\n\t\targs: any[];\n\t\timport_refs: any[];\n\t\timport_values: any[];\n\t\timport_self: number;\n\t\tlocals_size?: number;\n\t} {\n\t\tconst args: any[] = [];\n\t\tfor (let i = 0; i < this.arg1.length; i++) {\n\t\t\targs[i] = this.exportArg(this.arg1[i]);\n\t\t}\n\t\treturn {\n\t\t\tnum_args: this.num_args,\n\t\t\tops: this.opcodes,\n\t\t\targs: args,\n\t\t\timport_refs: this.import_refs,\n\t\t\timport_values: this.import_values,\n\t\t\timport_self: this.import_self,\n\t\t\tlocals_size: this.locals_size,\n\t\t};\n\t}\n\n\timport(src: {\n\t\tnum_args: number;\n\t\tops: number[];\n\t\targs: any[];\n\t\timport_refs: any[];\n\t\timport_values: any[];\n\t\timport_self: number;\n\t\tlocals_size?: number;\n\t}): Routine {\n\t\tthis.num_args = src.num_args;\n\t\tthis.opcodes = src.ops;\n\t\tthis.arg1 = src.args;\n\t\tthis.import_refs = src.import_refs;\n\t\tthis.import_values = src.import_values;\n\t\tthis.import_self = src.import_self;\n\t\tthis.locals_size = src.locals_size;\n\n\t\tconst token = {\n\t\t\tline: 0,\n\t\t\tcolumn: 0,\n\t\t\tstart: 0,\n\t\t\tlength: 0,\n\t\t\tindex: 0,\n\t\t\ttokenizer: {\n\t\t\t\tfilename: \"filename\",\n\t\t\t\tinput: \"\",\n\t\t\t},\n\t\t} as any;\n\t\tconst ref = {\n\t\t\texpression: {\n\t\t\t\ttoken: token,\n\t\t\t},\n\t\t\ttoken: token,\n\t\t};\n\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tif (this.opcodes[i] === 100) {\n\t\t\t\tthis.arg1[i] = (Compiler as any).predefined_unary_functions[this.arg1[i]];\n\t\t\t} else if (this.opcodes[i] === 101) {\n\t\t\t\tthis.arg1[i] = (Compiler as any).predefined_binary_functions[this.arg1[i]];\n\t\t\t} else if (typeof this.arg1[i] === \"object\" && !Array.isArray(this.arg1[i])) {\n\t\t\t\tthis.arg1[i] = new Routine(0).import(this.arg1[i]);\n\t\t\t}\n\t\t\tthis.ref[i] = ref;\n\t\t}\n\t\treturn this;\n\t}\n}\n","/**\n * Program - AST structures for LootiScript\n *\n * Abstract Syntax Tree node definitions for the language.\n */\n\nimport { Routine } from \"./routine\";\nimport type { Token } from \"./token\";\n\n/**\n * Base class for all AST expressions\n */\nexport class Expression {\n\tnowarning?: boolean;\n\tnopop?: boolean;\n\tconstructor() {}\n}\n\n/**\n * Type alias for all AST node types\n */\nexport type Statement =\n\t| Assignment\n\t| SelfAssignment\n\t| Value\n\t| Variable\n\t| Field\n\t| Operation\n\t| Negate\n\t| Not\n\t| Braced\n\t| Return\n\t| Condition\n\t| For\n\t| ForIn\n\t| While\n\t| Break\n\t| Continue\n\t| Function\n\t| FunctionCall\n\t| CreateObject\n\t| CreateClass\n\t| NewCall\n\t| After\n\t| Every\n\t| Do\n\t| Sleep\n\t| Delete;\n\n/**\n * Main Program class containing all statements\n */\nexport class Program {\n\tstatements: Statement[] = [];\n\n\t// Static references (will be assigned after class declarations)\n\tstatic Field: typeof Field;\n\tstatic Variable: typeof Variable;\n\tstatic Assignment: typeof Assignment;\n\n\tconstructor() {\n\t\tthis.statements = [];\n\t}\n\n\tadd(statement: Statement): number {\n\t\treturn this.statements.push(statement);\n\t}\n\n\tisAssignment(): boolean {\n\t\treturn this.statements.length > 0 && this.statements[this.statements.length - 1] instanceof Assignment;\n\t}\n\n\t/**\n\t * Convert value to string representation\n\t */\n\tstatic toString(value: any, nesting: number = 0): string {\n\t\tlet i: number;\n\t\tlet key: string;\n\t\tlet pref: string;\n\t\tlet s: string;\n\t\tlet v: any;\n\n\t\tif (value instanceof Routine) {\n\t\t\tif (nesting === 0) {\n\t\t\t\treturn (value as any).source || \"[function]\";\n\t\t\t} else {\n\t\t\t\treturn \"[function]\";\n\t\t\t}\n\t\t} else if (typeof value === \"function\") {\n\t\t\treturn \"[native function]\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn `\"${value}\"`;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tif (nesting >= 1) {\n\t\t\t\treturn \"[list]\";\n\t\t\t}\n\t\t\ts = \"[\";\n\t\t\tfor (i = 0; i < value.length; i++) {\n\t\t\t\tv = value[i];\n\t\t\t\ts += Program.toString(v, nesting + 1) + (i < value.length - 1 ? \",\" : \"\");\n\t\t\t}\n\t\t\treturn s + \"]\";\n\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\tif (nesting >= 1) {\n\t\t\t\treturn \"[object]\";\n\t\t\t}\n\t\t\ts = \"object\\n\";\n\t\t\tpref = \"\";\n\t\t\tfor (i = 1; i <= nesting; i++) {\n\t\t\t\tpref += \" \";\n\t\t\t}\n\t\t\tfor (key in value) {\n\t\t\t\tv = value[key];\n\t\t\t\ts += pref + ` ${key} = ${Program.toString(v, nesting + 1)}\\n`;\n\t\t\t}\n\t\t\treturn s + pref + \"end\";\n\t\t}\n\t\treturn value || 0;\n\t}\n\n\t/**\n\t * Operator precedence table\n\t */\n\tstatic readonly Precedence: Record<string | number, number> = {\n\t\t\"^\": 21,\n\t\t\"/\": 20,\n\t\t\"*\": 19,\n\t\t\"%\": 18,\n\t\t\"+\": 17,\n\t\t\"-\": 17,\n\t\t\"<\": 16,\n\t\t\"<=\": 15,\n\t\t\">\": 14,\n\t\t\">=\": 13,\n\t\t\"==\": 12,\n\t\t\"!=\": 11,\n\t\t\"<<\": 10,\n\t\t\">>\": 9,\n\t\t\"&\": 8,\n\t\t\"|\": 7,\n\t\tand: 6,\n\t\tor: 5,\n\t};\n\n\t/**\n\t * Create field access expression\n\t */\n\tstatic CreateFieldAccess(token: Token, expression: Statement, field: Statement): Field {\n\t\tif (expression instanceof Field) {\n\t\t\texpression.appendField(field);\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn new Field(token, expression, [field]);\n\t\t}\n\t}\n\n\t/**\n\t * Build operation tree from operators and terms\n\t */\n\tstatic BuildOperations(\n\t\tops: Array<{\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t}>,\n\t\tterms: Statement[],\n\t): Operation {\n\t\tlet i: number;\n\t\tlet o: Operation;\n\t\tlet o1: {\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t};\n\t\tlet o2: {\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t};\n\t\tlet t1: Statement;\n\t\tlet t2: Statement;\n\n\t\twhile (ops.length > 1) {\n\t\t\ti = 0;\n\t\t\twhile (i < ops.length - 1) {\n\t\t\t\to1 = ops[i];\n\t\t\t\to2 = ops[i + 1];\n\t\t\t\tif (Program.Precedence[o2.operation] <= Program.Precedence[o1.operation]) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tt1 = terms[i];\n\t\t\tt2 = terms[i + 1];\n\t\t\to = new Operation(ops[i].token, ops[i].operation, t1, t2);\n\t\t\tterms.splice(i, 2, o);\n\t\t\tops.splice(i, 1);\n\t\t}\n\t\treturn new Operation(ops[0].token, ops[0].operation, terms[0], terms[1]);\n\t}\n}\n\n/**\n * Assignment statement\n */\nexport class Assignment extends Expression {\n\ttoken: Token;\n\tfield: Statement | null;\n\texpression: Statement;\n\tlocal: boolean;\n\n\tconstructor(token: Token, field: Statement | null, expression: Statement, local: boolean) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t\tthis.expression = expression;\n\t\tthis.local = local;\n\t}\n}\n\n/**\n * Self-assignment statement (e.g., +=, -=)\n */\nexport class SelfAssignment extends Expression {\n\ttoken: Token;\n\tfield: Statement | null;\n\toperation: string;\n\texpression: Statement;\n\n\tconstructor(token: Token, field: Statement | null, operation: string, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t\tthis.operation = operation;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Value literal (number, string, array, object, function, class)\n */\nexport class Value extends Expression {\n\ttoken: Token;\n\ttype: number;\n\tvalue: any;\n\n\tstatic readonly TYPE_NUMBER = 1;\n\tstatic readonly TYPE_STRING = 2;\n\tstatic readonly TYPE_ARRAY = 3;\n\tstatic readonly TYPE_OBJECT = 4;\n\tstatic readonly TYPE_FUNCTION = 5;\n\tstatic readonly TYPE_CLASS = 6;\n\n\tconstructor(token: Token, type: number, value: any) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.type = type;\n\t\tthis.value = value;\n\t}\n}\n\n/**\n * Variable reference\n */\nexport class Variable extends Expression {\n\ttoken: Token;\n\tidentifier: string;\n\n\tconstructor(token: Token, identifier: string) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.identifier = identifier;\n\t}\n}\n\n/**\n * Field/property access\n */\nexport class Field extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\tchain: Statement[];\n\n\tconstructor(token: Token, expression: Statement, chain: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tthis.chain = chain;\n\t\tthis.token = expression instanceof Expression ? (expression as any).token : token;\n\t}\n\n\tappendField(field: Statement): number {\n\t\treturn this.chain.push(field);\n\t}\n}\n\n/**\n * Binary operation\n */\nexport class Operation extends Expression {\n\ttoken: Token;\n\toperation: string;\n\tterm1: Statement;\n\tterm2: Statement;\n\n\tconstructor(token: Token, operation: string, term1: Statement, term2: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.operation = operation;\n\t\tthis.term1 = term1;\n\t\tthis.term2 = term2;\n\t}\n}\n\n/**\n * Negate operation (-expression)\n */\nexport class Negate extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Not operation (not expression)\n */\nexport class Not extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Braced expression ((expression))\n */\nexport class Braced extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Return statement\n */\nexport class Return extends Expression {\n\ttoken: Token;\n\texpression: Statement | null;\n\n\tconstructor(token: Token, expression: Statement | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Conditional statement chain (if-then-else-elsif)\n */\nexport class Condition extends Expression {\n\ttoken: Token;\n\tchain: Array<{\n\t\tcondition: Statement;\n\t\tsequence: Statement[];\n\t\telse?: Statement[];\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\tchain: Array<{\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.chain = chain;\n\t}\n}\n\n/**\n * For loop statement\n */\nexport class For extends Expression {\n\ttoken: Token;\n\titerator: string;\n\trange_from: Statement;\n\trange_to: Statement;\n\trange_by: Statement | null;\n\tsequence: Statement[];\n\n\tconstructor(\n\t\ttoken: Token,\n\t\titerator: string,\n\t\trange_from: Statement,\n\t\trange_to: Statement,\n\t\trange_by: Statement | null,\n\t\tsequence: Statement[],\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.iterator = iterator;\n\t\tthis.range_from = range_from;\n\t\tthis.range_to = range_to;\n\t\tthis.range_by = range_by;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * For-in loop statement\n */\nexport class ForIn extends Expression {\n\ttoken: Token;\n\titerator: string;\n\tlist: Statement;\n\tsequence: Statement[];\n\n\tconstructor(token: Token, iterator: string, list: Statement, sequence: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.iterator = iterator;\n\t\tthis.list = list;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * While loop statement\n */\nexport class While extends Expression {\n\ttoken: Token;\n\tcondition: Statement;\n\tsequence: Statement[];\n\n\tconstructor(token: Token, condition: Statement, sequence: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.condition = condition;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * Break statement\n */\nexport class Break extends Expression {\n\ttoken: Token;\n\tnopop: boolean = true;\n\n\tconstructor(token: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.nopop = true;\n\t}\n}\n\n/**\n * Continue statement\n */\nexport class Continue extends Expression {\n\ttoken: Token;\n\tnopop: boolean = true;\n\n\tconstructor(token: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.nopop = true;\n\t}\n}\n\n/**\n * Function argument with optional default value\n */\nexport interface FunctionArg {\n\tname: string;\n\tdefault?: Statement;\n}\n\n/**\n * Function definition\n */\nexport class Function extends Expression {\n\ttoken: Token;\n\targs: FunctionArg[];\n\tsequence: Statement[];\n\tsource: string;\n\n\tconstructor(token: Token, args: FunctionArg[], sequence: Statement[], end: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.args = args;\n\t\tthis.sequence = sequence;\n\t\tthis.source = \"function\" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Function call\n */\nexport class FunctionCall extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\targs: Statement[];\n\n\tconstructor(token: Token, expression: Statement, args: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tthis.args = args;\n\t}\n}\n\n/**\n * Object literal creation\n */\nexport class CreateObject extends Expression {\n\ttoken: Token;\n\tfields: Array<{\n\t\tfield: string | number | null;\n\t\tvalue: Statement;\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\tfields: Array<{\n\t\t\tfield: string | number | null;\n\t\t\tvalue: Statement;\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.fields = fields;\n\t}\n}\n\n/**\n * Class definition\n */\nexport class CreateClass extends Expression {\n\ttoken: Token;\n\text: Statement | null;\n\tfields: Array<{\n\t\tfield: string | number;\n\t\tvalue: Statement;\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\text: Statement | null,\n\t\tfields: Array<{\n\t\t\tfield: string | number;\n\t\t\tvalue: Statement;\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.ext = ext;\n\t\tthis.fields = fields;\n\t}\n}\n\n/**\n * New call (constructor invocation)\n */\nexport class NewCall extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tif (!(this.expression instanceof FunctionCall)) {\n\t\t\tthis.expression = new FunctionCall(this.token, this.expression, []);\n\t\t}\n\t}\n}\n\n/**\n * After statement (delayed execution)\n */\nexport class After extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tsequence: Statement[];\n\tmultiplier: number | null;\n\tsource: string;\n\n\tconstructor(token: Token, delay: Statement, sequence: Statement[], end: Token, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.sequence = sequence;\n\t\tthis.multiplier = multiplier;\n\t\tthis.source = \"after \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Every statement (periodic execution)\n */\nexport class Every extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tsequence: Statement[];\n\tmultiplier: number | null;\n\tsource: string;\n\n\tconstructor(token: Token, delay: Statement, sequence: Statement[], end: Token, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.sequence = sequence;\n\t\tthis.multiplier = multiplier;\n\t\tthis.source = \"every \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Do statement (immediate async execution)\n */\nexport class Do extends Expression {\n\ttoken: Token;\n\tsequence: Statement[];\n\tsource: string;\n\n\tconstructor(token: Token, sequence: Statement[], end: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.sequence = sequence;\n\t\tthis.source = \"do \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Sleep statement\n */\nexport class Sleep extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tmultiplier: number | null;\n\n\tconstructor(token: Token, delay: Statement, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.multiplier = multiplier;\n\t}\n}\n\n/**\n * Delete statement\n */\nexport class Delete extends Expression {\n\ttoken: Token;\n\tfield: Statement;\n\n\tconstructor(token: Token, field: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t}\n}\n\n// Static references - placed at end to avoid \"used before declaration\" errors\nProgram.Field = Field;\nProgram.Variable = Variable;\nProgram.Assignment = Assignment;\n","/**\n * Function Bridge - Converts between LootiScript routines and JavaScript functions\n *\n * Allows LootiScript functions to be called from JavaScript code\n * (e.g., scene lifecycle callbacks, event handlers).\n */\n\nimport type { RuntimeContext } from \"./processor-types\";\nimport { Routine } from \"./routine\";\n\n/**\n * Convert a LootiScript routine to a JavaScript function\n */\nexport function routineAsFunction(runner: any, routine: Routine, context: RuntimeContext): Function {\n\t// Lazy import to avoid circular dependency at module load time\n\tconst ProcessorClass = runner.main_thread.processor.constructor;\n\tconst proc = new ProcessorClass(runner);\n\n\treturn function (this: any) {\n\t\tconst count = Math.min(routine.num_args, arguments.length);\n\t\tproc.load(routine);\n\t\tfor (let i = 0; i <= count - 1; i += 1) {\n\t\t\tproc.stack[++proc.stack_index] = arguments[i] || 0;\n\t\t}\n\t\tproc.stack[++proc.stack_index] = arguments.length;\n\t\tif (routine.uses_arguments) {\n\t\t\tconst a = [...arguments];\n\t\t\tfor (let i = 0; i <= a.length - 1; i += 1) {\n\t\t\t\tif (a[i] == null) {\n\t\t\t\t\ta[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tproc.stack[++proc.stack_index] = a;\n\t\t}\n\t\treturn proc.run(context);\n\t};\n}\n\n/**\n * Convert a LootiScript routine to a JavaScript function that binds `this`\n */\nexport function routineAsApplicableFunction(runner: any, routine: Routine, context: RuntimeContext): Function {\n\tconst ProcessorClass = runner.main_thread.processor.constructor;\n\tconst proc = new ProcessorClass(runner);\n\n\treturn function (this: any) {\n\t\tconst count = routine.num_args;\n\t\tproc.load(routine);\n\t\tproc.object = this;\n\t\tfor (let i = 0; i <= count - 1; i += 1) {\n\t\t\tproc.stack[++proc.stack_index] = arguments[i] || 0;\n\t\t}\n\t\tproc.stack[++proc.stack_index] = arguments.length;\n\t\tif (routine.uses_arguments) {\n\t\t\tconst a: any[] = [...arguments];\n\t\t\tfor (let i = 0; i <= a.length - 1; i += 1) {\n\t\t\t\tif (a[i] == null) {\n\t\t\t\t\ta[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tproc.stack[++proc.stack_index] = a;\n\t\t}\n\t\tproc.run(context);\n\t\treturn proc.stack[0];\n\t};\n}\n\n/**\n * Convert a LootiScript argument to a native JavaScript value\n */\nexport function argToNative(runner: any, arg: any, context: RuntimeContext): any {\n\tif (arg instanceof Routine) {\n\t\treturn routineAsFunction(runner, arg, context);\n\t}\n\treturn arg != null ? arg : 0;\n}\n","/**\n * Inline Cache interfaces and structures\n *\n * Inline caches optimize property access by caching object shapes and property offsets.\n * This reduces property lookup time from O(n) hash table lookups to O(1) direct access\n * when the same object shape is accessed repeatedly.\n */\n\nexport const IC_STATE = {\n\tUNINITIALIZED: 0,\n\tMONOMORPHIC: 1,\n\tPOLYMORPHIC: 2,\n\tMEGAMORPHIC: 3,\n};\n\nexport interface InlineCache {\n\tstate: number;\n\thits: number;\n\tmisses: number;\n\tproperty: string | number;\n\n\t/**\n\t * Monomorphic cache - Single object shape optimization\n\t *\n\t * When property access consistently uses the same object shape,\n\t * we cache the shape and offset for O(1) lookup instead of O(n) hash lookup.\n\t * This is the fastest cache state and handles the majority of property accesses.\n\t */\n\tshape?: any; // The cached object shape/class/constructor\n\toffset?: number | string; // The pre-resolved property key or array index\n\n\t/**\n\t * Polymorphic cache - Multiple object shapes (2-4 shapes)\n\t *\n\t * When property access uses a small set of different shapes,\n\t * we maintain parallel arrays for quick linear search.\n\t * This provides good performance when dealing with a few different object types.\n\t */\n\tshapes?: any[];\n\toffsets?: any[];\n}\n\n/**\n * Global metrics for inline cache performance tracking\n *\n * Tracks cache hit/miss rates and invalidation counts across all inline caches\n * for performance analysis and optimization.\n */\nexport class ICMetrics {\n\tstatic hits = 0;\n\tstatic misses = 0;\n\tstatic invalidations = 0;\n}\n","/**\n * Memory Pool - Reusable object and array pools for the VM\n *\n * Reduces GC pressure by recycling arrays and objects\n * during bytecode execution.\n */\n\nconst MAX_POOL_SIZE = 1000;\n\nconst arrayPool: any[][] = [];\nconst objectPool: any[] = [];\n\n/**\n * Get an array from the pool or create new\n */\nexport function getPooledArray(): any[] {\n\tif (arrayPool.length > 0) {\n\t\tconst arr = arrayPool.pop()!;\n\t\tarr.length = 0;\n\t\treturn arr;\n\t}\n\treturn [];\n}\n\n/**\n * Recycle array to pool\n */\nexport function recycleArray(arr: any[]): void {\n\tif (arrayPool.length < MAX_POOL_SIZE) {\n\t\tarrayPool.push(arr);\n\t}\n}\n\n/**\n * Get object from pool or create new\n */\nexport function getPooledObject(): any {\n\tif (objectPool.length > 0) {\n\t\treturn objectPool.pop();\n\t}\n\treturn {};\n}\n\n/**\n * Recycle object to pool (clears own enumerable properties)\n * Uses for...in + delete directly to avoid Object.keys() intermediate array allocation\n */\nexport function recycleObject(obj: any): void {\n\tif (objectPool.length < MAX_POOL_SIZE) {\n\t\tfor (const key in obj) {\n\t\t\tdelete obj[key];\n\t\t}\n\t\tobjectPool.push(obj);\n\t}\n}\n","/**\n * Arithmetic and bitwise operator implementations for LootiScript.\n *\n * These are standalone functions extracted from the Processor class so\n * the hot `run()` dispatch loop stays focused on opcode execution.\n * Each operator follows the LootiScript operator-overloading protocol:\n * look up the operator symbol (\"+\", \"-\", …) on the value or its prototype\n * chain, then invoke it via the applicable-function bridge.\n *\n * Calling convention:\n * operatorXxx(runner, context, a, b[, self])\n * - runner – the Runner instance (needed by the routine-as-function bridge)\n * - context – the current VMContext / RuntimeContext\n * - a, b – the operands\n * - self – the opcode's arg1 slot (used by add/sub as a \"self\" hint)\n *\n * @module lootiscript/processor-operators\n */\n\nimport { routineAsApplicableFunction as _routineAsApplicableFunction } from \"./function-bridge\";\nimport { Routine } from \"./routine\";\nimport type { RuntimeContext } from \"./processor-types\";\n\n// ─── Internal helpers ─────────────────────────────────────────────────────\n\n/**\n * If `f` is a Routine, lazily cache its JS wrapper on `f.as_function` and\n * return it. If `f` is already a native JS function, return it unchanged.\n * Returns `null` for anything else.\n */\nfunction resolveCallable(\n\trunner: any,\n\tf: any,\n\tcontext: RuntimeContext,\n): ((...args: any[]) => any) | null {\n\tif (f instanceof Routine) {\n\t\tif (f.as_function == null) {\n\t\t\tf.as_function = _routineAsApplicableFunction(runner, f, context);\n\t\t}\n\t\treturn f.as_function as (...args: any[]) => any;\n\t}\n\tif (typeof f === \"function\") return f as (...args: any[]) => any;\n\treturn null;\n}\n\n/**\n * Shared dispatch logic for binary operators.\n *\n * 1. Determine the target object based on operand type\n * 2. Optionally short-circuit numeric strings with a native JS operation\n * 3. Walk the class chain looking for the operator symbol\n * 4. Fall back to the Object prototype\n * 5. Resolve and invoke\n */\nfunction dispatchBinaryOp(\n\trunner: any,\n\tcontext: RuntimeContext,\n\top: string,\n\ta: any,\n\tb: any,\n\tself: number | undefined,\n\tnativeStringOp?: (a: any, b: any) => number,\n): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (nativeStringOp && isFinite(a as any)) {\n\t\t\tconst r = nativeStringOp(a, b);\n\t\t\treturn isFinite(r) ? r : 0;\n\t\t}\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[op];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[op];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[op];\n\t}\n\tif (f != null) {\n\t\tconst fn = resolveCallable(runner, f, context);\n\t\tif (fn) return fn.call(context.global, a, b, self);\n\t}\n\treturn 0;\n}\n\n// ─── Operator implementations ──────────────────────────────────────────────\n\nexport function operatorAdd(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"+\", a, b, self);\n}\n\nexport function operatorSub(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"-\", a, b, self, (a, b) => a - b);\n}\n\nexport function operatorMul(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"*\", a, b, self, (a, b) => a * b);\n}\n\nexport function operatorDiv(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"/\", a, b, self, (a, b) => a / b);\n}\n\nexport function operatorBand(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"&\", a, b, self, (a, b) => a & b);\n}\n\nexport function operatorBor(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"|\", a, b, self, (a, b) => a | b);\n}\n\nexport function operatorModulo(runner: any, context: RuntimeContext, a: any, b: any): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (isFinite(a as any)) {\n\t\t\tconst r = (a as any) % b;\n\t\t\treturn isFinite(r) ? r : 0;\n\t\t}\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[\"%\"];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[\"%\"];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[\"%\"];\n\t}\n\t// modulo only dispatches Routine operators, not native functions\n\tif (f != null && f instanceof Routine) {\n\t\tif (f.as_function == null) {\n\t\t\tf.as_function = _routineAsApplicableFunction(runner, f, context);\n\t\t}\n\t\tf = f.as_function;\n\t\treturn f.call(context.global, a, b);\n\t}\n\treturn 0;\n}\n\nexport function operatorNegate(runner: any, context: RuntimeContext, a: any): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (isFinite(a as any)) return -(a as any);\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[\"-\"];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[\"-\"];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[\"-\"];\n\t}\n\tif (f != null) {\n\t\tconst fn = resolveCallable(runner, f, context);\n\t\tif (fn) return fn.call(context.global, 0, a);\n\t}\n\treturn 0;\n}\n","/**\n * Processor - VM runtime execution engine for LootiScript\n *\n * Executes bytecode instructions in the virtual machine.\n * Manages the stack, call stack, and local variables.\n * Implements the core fetch-decode-execute loop.\n *\n * Responsibilities:\n * - Execute bytecode instructions\n * - Manage execution stack and memory\n * - Handle function calls and returns\n * - Implement inline caching for property access\n * - Generate stack traces for errors\n *\n * @module lootiscript/processor\n */\n\nimport type { CallFrame } from \"@al8b/diagnostics\";\nimport {\n\troutineAsFunction as _routineAsFunction,\n\troutineAsApplicableFunction as _routineAsApplicableFunction,\n\targToNative as _argToNative,\n} from \"./function-bridge\";\nimport { IC_STATE, type InlineCache } from \"./inline-cache\";\nimport {\n\tgetPooledArray,\n\tgetPooledObject,\n\trecycleArray as poolRecycleArray,\n\trecycleObject as poolRecycleObject,\n} from \"./memory-pool\";\nimport {\n\toperatorAdd,\n\toperatorBand,\n\toperatorBor,\n\toperatorDiv,\n\toperatorModulo,\n\toperatorMul,\n\toperatorNegate,\n\toperatorSub,\n} from \"./processor-operators\";\n// Re-export runtime types so existing imports from \"./processor\" keep working.\nexport type { RuntimeClass, RuntimeContext, RuntimeGlobal, RuntimeValue } from \"./processor-types\";\nimport type { RuntimeContext, RuntimeGlobal, RuntimeValue } from \"./processor-types\";\nimport { Routine } from \"./routine\";\n\n/**\n * Processor - Executes LootiScript bytecode\n *\n * The heart of the VM. It maintains the state of execution (stack, locals, instruction pointer)\n * and executes opcodes sequentially. It also handles the complexity of\n * function calls, including arguments passing and scope management.\n */\nexport class Processor {\n\trunner: any; // Runner instance\n\troutine!: Routine;\n\tlocals: any[];\n\tstack: any[];\n\tcall_stack: any[];\n\tcall_stack_frames: CallFrame[]; // NEW: Stack trace frames\n\tlog: boolean;\n\ttime_limit: number;\n\tdone: boolean;\n\tlocal_index: number;\n\tstack_index: number;\n\top_index: number;\n\tcall_stack_index: number;\n\tglobal: any;\n\tobject: any;\n\tlocals_offset: number;\n\tcall_super: any;\n\tcall_supername: string;\n\n\t// Profiling metrics\n\tmetrics: {\n\t\tops: number;\n\t\tallocations: number;\n\t\tcacheHits: number;\n\t\tcacheMisses: number;\n\t};\n\tprofilingEnabled: boolean;\n\n\t// Reusable argv array for native function calls with >3 args\n\t// Avoids allocating a new array per call — just reset length\n\tprivate _argv: any[] = [];\n\n\tconstructor(runner: any) {\n\t\tthis.runner = runner;\n\t\tthis.locals = [];\n\t\tthis.stack = [];\n\t\tthis.call_stack = [];\n\t\tthis.call_stack_frames = []; // NEW: Initialize stack frames\n\t\tthis.log = false;\n\t\tthis.time_limit = Number.POSITIVE_INFINITY;\n\t\tthis.done = true;\n\t\tthis.local_index = 0;\n\t\tthis.stack_index = -1;\n\t\tthis.op_index = 0;\n\t\tthis.call_stack_index = 0;\n\t\tthis.global = null;\n\t\tthis.object = null;\n\t\tthis.locals_offset = 0;\n\t\tthis.call_super = null;\n\t\tthis.call_supername = \"\";\n\n\t\tthis.metrics = {\n\t\t\tops: 0,\n\t\t\tallocations: 0,\n\t\t\tcacheHits: 0,\n\t\t\tcacheMisses: 0,\n\t\t};\n\t\tthis.profilingEnabled = false;\n\t}\n\n\tprivate reportNativeError(error: unknown): void {\n\t\tif (typeof this.runner?.reportNativeError === \"function\") {\n\t\t\tthis.runner.reportNativeError(error);\n\t\t} else {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\tgetArray(): any[] {\n\t\treturn getPooledArray();\n\t}\n\n\trecycleArray(arr: any[]): void {\n\t\tpoolRecycleArray(arr);\n\t}\n\n\tgetObject(): any {\n\t\treturn getPooledObject();\n\t}\n\n\trecycleObject(obj: any): void {\n\t\tpoolRecycleObject(obj);\n\t}\n\n\tload(routine: Routine): void {\n\t\tthis.routine = routine;\n\t\tthis.resetState();\n\t}\n\n\tresetState(): void {\n\t\tthis.local_index = 0;\n\t\tthis.stack_index = -1;\n\t\tthis.op_index = 0;\n\t\tthis.call_stack_index = 0;\n\t\tthis.call_stack_frames = []; // NEW: Reset stack frames\n\t\tthis.global = null;\n\t\tthis.object = this.routine.object || null;\n\t\tthis.locals_offset = 0;\n\t\tthis.call_super = null;\n\t\tthis.call_supername = \"\";\n\t\tthis.done = false;\n\t}\n\n\t/**\n\t * Generate stack trace from call frames\n\t *\n\t * Reconstructs the call stack for error reporting.\n\t * Converts internal CallFrame objects into a readable list.\n\t *\n\t * @returns {CallFrame[]} Array of stack frames (most recent first)\n\t */\n\tgenerateStackTrace(): CallFrame[] {\n\t\treturn [...this.call_stack_frames].reverse();\n\t}\n\n\t/**\n\t * Format stack trace as string\n\t */\n\tformatStackTrace(): string {\n\t\tconst frames = this.generateStackTrace();\n\t\tif (frames.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn frames.map((frame) => ` at ${frame.functionName} (${frame.file}:${frame.line}:${frame.column})`).join(\"\\n\");\n\t}\n\n\tresolveParentClass(obj: RuntimeValue, global: RuntimeGlobal): void {\n\t\tif (obj.class != null && typeof obj.class === \"string\") {\n\t\t\tif (global[obj.class] != null) {\n\t\t\t\tobj.class = global[obj.class];\n\t\t\t\tif (typeof obj.class !== \"string\") {\n\t\t\t\t\treturn this.resolveParentClass(obj.class as RuntimeValue, global);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (obj.class != null && typeof obj.class !== \"string\") {\n\t\t\treturn this.resolveParentClass(obj.class as RuntimeValue, global);\n\t\t}\n\t}\n\n\tapplyFunction(_args: any): void {}\n\n\t/**\n\t * Inline Cache Handler for Property Access\n\t *\n\t * Optimizes property access by caching the shape/structure of objects.\n\t *\n\t * States:\n\t * - UNINITIALIZED: First access\n\t * - MONOMORPHIC: Optimized for single object shape (fastest)\n\t * - POLYMORPHIC: Optimized for few object shapes (2-4)\n\t * - MEGAMORPHIC: Fallback for many shapes (slowest)\n\t *\n\t * @param {any} obj - The object to access\n\t * @param {string} prop - The property name\n\t * @param {InlineCache} ic - The inline cache slot associated with this instruction\n\t * @returns {any} The property value\n\t */\n\tresolvePropertyIC(obj: any, prop: string, ic: InlineCache): any {\n\t\tif (obj == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check cache state\n\t\tif (ic.state === IC_STATE.MONOMORPHIC) {\n\t\t\t// Fast path: check if object shape matches cached shape\n\t\t\t// Note: In JS engines, objects don't expose shape IDs easily.\n\t\t\t// We use constructor/class as a proxy for shape.\n\t\t\tconst shape = obj.class || obj.constructor;\n\n\t\t\tif (shape === ic.shape) {\n\t\t\t\tic.hits++;\n\t\t\t\t// In a real VM we'd use offset, here we just return the access\n\t\t\t\t// since we can't easily get property offsets in JS objects\n\t\t\t\treturn obj[prop];\n\t\t\t} else {\n\t\t\t\tic.misses++;\n\t\t\t\t// Transition to polymorphic or update monomorphic\n\t\t\t\tic.state = IC_STATE.POLYMORPHIC;\n\t\t\t\tic.shapes = [ic.shape, shape];\n\t\t\t\tic.offsets = [0, 0]; // Placeholder\n\t\t\t}\n\t\t} else if (ic.state === IC_STATE.POLYMORPHIC) {\n\t\t\t// Linear scan of small polymorphic cache\n\t\t\tconst shape = obj.class || obj.constructor;\n\t\t\tif (ic.shapes && ic.shapes.length < 4) {\n\t\t\t\tfor (let i = 0; i < ic.shapes.length; i++) {\n\t\t\t\t\tif (ic.shapes[i] === shape) {\n\t\t\t\t\t\tic.hits++;\n\t\t\t\t\t\treturn obj[prop];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Add new shape\n\t\t\t\tic.shapes.push(shape);\n\t\t\t\tic.misses++;\n\t\t\t} else {\n\t\t\t\t// Too many shapes, go megamorphic\n\t\t\t\tic.state = IC_STATE.MEGAMORPHIC;\n\t\t\t}\n\t\t}\n\n\t\t// Uninitialized or Megamorphic fallback\n\t\tif (ic.state === IC_STATE.UNINITIALIZED) {\n\t\t\tic.state = IC_STATE.MONOMORPHIC;\n\t\t\tic.shape = obj.class || obj.constructor;\n\t\t\tic.property = prop;\n\t\t\tic.hits = 1; // Count initialization as a hit for tracking\n\t\t}\n\n\t\treturn obj[prop];\n\t}\n\n\troutineAsFunction(routine: Routine, context: RuntimeContext): Function {\n\t\treturn _routineAsFunction(this.runner, routine, context);\n\t}\n\n\troutineAsApplicableFunction(routine: Routine, context: RuntimeContext): Function {\n\t\treturn _routineAsApplicableFunction(this.runner, routine, context);\n\t}\n\n\targToNative(arg: any, context: RuntimeContext): any {\n\t\treturn _argToNative(this.runner, arg, context);\n\t}\n\n\t/**\n\t * Main execution loop\n\t *\n\t * The core fetch-decode-execute loop of the VM.\n\t * Iterates through opcodes and performs corresponding actions.\n\t *\n\t * Performance Note:\n\t * This method is the hottest path in the engine.\n\t * It uses a giant switch statement for opcode dispatch which is generally\n\t * the fastest approach in JavaScript engines.\n\t *\n\t * @param {any} context - The execution context (global scope)\n\t * @returns {any} The result of the last executed statement\n\t */\n\trun(context: any): any {\n\t\tlet a,\n\t\t\targ1,\n\t\t\targs,\n\t\t\targv,\n\t\t\tb,\n\t\t\tc,\n\t\t\tcall_stack,\n\t\t\tcall_stack_index,\n\t\t\tcall_super,\n\t\t\tcall_supername,\n\t\t\tcon,\n\t\t\tcs,\n\t\t\terr,\n\t\t\tf,\n\t\t\tfc,\n\t\t\tfield,\n\t\t\tglobal,\n\t\t\ti,\n\t\t\ti1,\n\t\t\ti2,\n\t\t\tid,\n\t\t\tindex,\n\t\t\tir,\n\t\t\titer,\n\t\t\titerator,\n\t\t\tj,\n\t\t\tk,\n\t\t\tkey,\n\t\t\tl,\n\t\t\tlen,\n\t\t\tlength,\n\t\t\tlocal_index,\n\t\t\tlocals,\n\t\t\tlocals_offset,\n\t\t\tloop_by,\n\t\t\tloop_to,\n\t\t\tm,\n\t\t\tn,\n\t\t\tname,\n\t\t\to,\n\t\t\tobj,\n\t\t\tobject,\n\t\t\top_count,\n\t\t\top_index,\n\t\t\topcodes,\n\t\t\tp,\n\t\t\tparent,\n\t\t\tq,\n\t\t\tr,\n\t\t\trc,\n\t\t\tref,\n\t\t\t// ref1, // unused\n\t\t\t// ref10, // unused\n\t\t\tref11,\n\t\t\tref12,\n\t\t\t// ref13, // unused\n\t\t\tref14,\n\t\t\tref2,\n\t\t\tref3,\n\t\t\t// ref4, // unused\n\t\t\tref5,\n\t\t\tref6,\n\t\t\t// ref7, // unused\n\t\t\tref8,\n\t\t\tref9,\n\t\t\tres,\n\t\t\trestore_op_index,\n\t\t\troutine,\n\t\t\ts,\n\t\t\tsleep_time,\n\t\t\tsrc,\n\t\t\tstack,\n\t\t\tstack_index,\n\t\t\tsup,\n\t\t\tt,\n\t\t\ttoken,\n\t\t\tu,\n\t\t\tv,\n\t\t\tvalue,\n\t\t\tw;\n\t\troutine = this.routine;\n\t\topcodes = this.routine.opcodes;\n\t\targ1 = this.routine.arg1;\n\t\tlength = opcodes.length;\n\t\top_index = this.op_index;\n\t\tstack = this.stack;\n\t\tstack_index = this.stack_index;\n\t\tlocals = this.locals;\n\t\tlocal_index = this.local_index;\n\t\tglobal = this.global || context.global;\n\t\tobject = this.object || global;\n\t\tcall_stack = this.call_stack;\n\t\tcall_stack_index = this.call_stack_index;\n\t\tcall_super = this.call_super || global;\n\t\tcall_supername = this.call_supername || \"\";\n\t\tlocals_offset = this.locals_offset;\n\t\top_count = 0;\n\t\trestore_op_index = -1;\n\n\t\t// Local cache of profiling state for performance\n\t\tconst profiling = this.profilingEnabled;\n\n\t\twhile (op_index < length) {\n\t\t\tif (profiling) {\n\t\t\t\tthis.metrics.ops++;\n\t\t\t}\n\t\t\tswitch (opcodes[op_index]) {\n\t\t\t\tcase 1: // OPCODE_TYPE\n\t\t\t\t\tv = stack[stack_index];\n\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\tstack[stack_index] = \"number\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\tstack[stack_index] = \"string\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\tstack[stack_index] = \"function\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"list\";\n\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"function\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"object\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: // OPCODE_TYPE_VARIABLE\n\t\t\t\t\tv = object[arg1[op_index]];\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[arg1[op_index]];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"number\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"string\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"function\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"list\";\n\t\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"function\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"object\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3: // OPCODE_TYPE_PROPERTY\n\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]];\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tstack[--stack_index] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"number\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"string\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"function\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"list\";\n\t\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"function\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"object\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4: // OPCODE_LOAD_IMPORT\n\t\t\t\t\tstack[++stack_index] = routine.import_values[arg1[op_index++]];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5: // OPCODE_LOAD_THIS\n\t\t\t\t\tstack[++stack_index] = object;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6: // OPCODE_LOAD_GLOBAL\n\t\t\t\t\tstack[++stack_index] = global;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 10: // CODE_LOAD_VALUE\n\t\t\t\t\tstack[++stack_index] = arg1[op_index++];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 11: // OPCODE_LOAD_LOCAL\n\t\t\t\t\tstack[++stack_index] = locals[locals_offset + arg1[op_index++]];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 12: // OPCODE_LOAD_VARIABLE\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tv = object[name];\n\t\t\t\t\tif (v == null && object.class != null) {\n\t\t\t\t\t\tobj = object;\n\t\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null && !routine.ref[op_index].nowarning) {\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.using_undefined_variable[id]) {\n\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v != null ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // OPCODE_LOAD_LOCAL_OBJECT\n\t\t\t\t\to = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tif (typeof o !== \"object\") {\n\t\t\t\t\t\to = locals[locals_offset + arg1[op_index]] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: token.value,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = o;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 14: // OPCODE_LOAD_VARIABLE_OBJECT\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tobj = object;\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null && global[name] != null) {\n\t\t\t\t\t\tobj = global;\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null || typeof v !== \"object\") {\n\t\t\t\t\t\tv = obj[name] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: arg1[op_index],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 15: // OPCODE_POP\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 16: {\n\t\t\t\t\t// OPCODE_LOAD_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\n\t\t\t\t\t// Inline Cache Check\n\t\t\t\t\tlet ic = routine.ics[op_index];\n\t\t\t\t\tif (!ic) {\n\t\t\t\t\t\tic = routine.ics[op_index] = {\n\t\t\t\t\t\t\tstate: IC_STATE.UNINITIALIZED,\n\t\t\t\t\t\t\thits: 0,\n\t\t\t\t\t\t\tmisses: 0,\n\t\t\t\t\t\t\tproperty: name,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tv = this.resolvePropertyIC(obj, name, ic);\n\n\t\t\t\t\t// Fallback logic if IC didn't fully resolve prototype chain\n\t\t\t\t\tif (v == null && obj.class != null) {\n\t\t\t\t\t\tlet curr = obj;\n\t\t\t\t\t\twhile (v == null && curr.class != null) {\n\t\t\t\t\t\t\tcurr = curr.class;\n\t\t\t\t\t\t\tv = curr[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[--stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 17: // OPCODE_LOAD_PROPERTY_OBJECT\n\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]];\n\t\t\t\t\tif (typeof v !== \"object\") {\n\t\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: stack[stack_index],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[--stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 18: // OPCODE_CREATE_OBJECT\n\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = this.getObject();\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 19: // OPCODE_MAKE_OBJECT\n\t\t\t\t\tif (typeof stack[stack_index] !== \"object\") {\n\t\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[stack_index] = this.getObject();\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 20: // OPCODE_CREATE_ARRAY\n\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = this.getArray();\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 21: // OPCODE_STORE_LOCAL\n\t\t\t\t\tlocals[locals_offset + arg1[op_index]] = stack[stack_index];\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 22: // OPCODE_STORE_LOCAL_POP\n\t\t\t\t\tlocals[locals_offset + arg1[op_index]] = stack[stack_index--];\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 23: // OPCODE_STORE_VARIABLE\n\t\t\t\t\tobject[arg1[op_index++]] = stack[stack_index];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 24: // OPCODE_CREATE_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 2];\n\t\t\t\t\tfield = stack[stack_index - 1];\n\t\t\t\t\tobj[field] = stack[stack_index];\n\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 25: // OPCODE_STORE_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 2];\n\t\t\t\t\tfield = stack[stack_index - 1];\n\t\t\t\t\tstack[stack_index - 2] = obj[field] = stack[stack_index];\n\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 26: // OPCODE_DELETE\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tfield = stack[stack_index];\n\t\t\t\t\tdelete obj[field];\n\t\t\t\t\tstack[(stack_index -= 1)] = 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 27: // OPCODE_UPDATE_CLASS\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tif (object[name] != null && typeof object[name] === \"object\") {\n\t\t\t\t\t\tobj = object[name];\n\t\t\t\t\t\tsrc = stack[stack_index];\n\t\t\t\t\t\tfor (key in src) {\n\t\t\t\t\t\t\tvalue = src[key];\n\t\t\t\t\t\t\tobj[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobject[name] = stack[stack_index];\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 28: // OPCODE_CREATE_CLASS\n\t\t\t\t\tres = {} as any;\n\t\t\t\t\tparent = stack[stack_index];\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\t(res as any).class = parent;\n\t\t\t\t\t} else if (arg1[op_index]) {\n\t\t\t\t\t\t(res as any).class = arg1[op_index];\n\t\t\t\t\t}\n\t\t\t\t\tstack[stack_index] = res;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 29: // OPCODE_NEW_CALL\n\t\t\t\t\tc = stack[stack_index];\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (typeof c === \"function\") {\n\t\t\t\t\t\ta = [];\n\t\t\t\t\t\tfor (i = j = 0, ref = args - 1; j <= ref; i = j += 1) {\n\t\t\t\t\t\t\ta.push(stack[stack_index - args + i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t// NEW CALL is followed by a POP (to get rid of constructor return value)\n\t\t\t\t\t\tstack[stack_index - 1] = new c(...a);\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.resolveParentClass(c, global);\n\t\t\t\t\t\tres = {\n\t\t\t\t\t\t\tclass: c,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcon = c.constructor;\n\t\t\t\t\t\twhile (!con && c.class != null) {\n\t\t\t\t\t\t\tc = c.class;\n\t\t\t\t\t\t\tcon = c.constructor;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (con != null && con instanceof Routine) {\n\t\t\t\t\t\t\tstack[stack_index - args - 1] = res;\n\t\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\t\troutine = con;\n\t\t\t\t\t\t\topcodes = con.opcodes;\n\t\t\t\t\t\t\targ1 = con.arg1;\n\t\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\t\tobject = res;\n\t\t\t\t\t\t\tcall_super = c;\n\t\t\t\t\t\t\tcall_supername = \"constructor\";\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (args < con.num_args) {\n\t\t\t\t\t\t\t\tfor (i = k = args + 1, ref2 = con.num_args; k <= ref2; i = k += 1) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (args > con.num_args) {\n\t\t\t\t\t\t\t\tstack_index -= args - con.num_args;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\tstack[stack_index - 1] = res;\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 30: // OPCODE_ADD\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta += b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) || typeof b === \"string\" ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, a, b, arg1[op_index]);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 31: // OPCODE_SUB\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta -= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, a, b, arg1[op_index]);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32: // OPCODE_MUL\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta *= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 33: // OPCODE_DIV\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta /= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorDiv(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 34: // OPCODE_MODULO\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\" && typeof b === \"number\") {\n\t\t\t\t\t\ta %= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorModulo(this.runner, context, a, b);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 35: // OPCODE_BINARY_AND\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta &= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorBand(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 36: // OPCODE_BINARY_OR\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta |= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorBor(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // OPCODE_SHIFT_LEFT\n\t\t\t\t\tv = stack[stack_index - 1] << stack[stack_index];\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // OPCODE_SHIFT_RIGHT\n\t\t\t\t\tv = stack[stack_index - 1] >> stack[stack_index];\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39: // OPCODE_NEGATE\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\tstack[stack_index] = -a;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorNegate(this.runner, context, a);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 50: // OPCODE_NOT\n\t\t\t\t\tstack[stack_index] = stack[stack_index] ? 0 : 1;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 68: // OPCODE_LOAD_PROPERTY_ATOP\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 40: // OPCODE_EQ\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index] === stack[stack_index - 1] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 41: // OPCODE_NEQ\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index] !== stack[stack_index - 1] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 42: // OPCODE_LT\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] < stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 43: // OPCODE_GT\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] > stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 44: // OPCODE_LTE\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] <= stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 45: // OPCODE_GTE\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] >= stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 95: // FORLOOP_INIT\n\t\t\t\t\t// fix loop_by if not set\n\t\t\t\t\titer = arg1[op_index][0];\n\t\t\t\t\tloop_to = locals[locals_offset + iter + 1] = stack[stack_index - 1];\n\t\t\t\t\tloop_by = stack[stack_index];\n\t\t\t\t\titerator = locals[locals_offset + iter];\n\t\t\t\t\tstack[--stack_index] = 0; // unload 2 values and load default value\n\t\t\t\t\tif (loop_by === 0) {\n\t\t\t\t\t\tlocals[locals_offset + iter + 2] = loop_to > iterator ? 1 : -1;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocals[locals_offset + iter + 2] = loop_by;\n\t\t\t\t\t\tif ((loop_by > 0 && iterator > loop_to) || (loop_by < 0 && iterator < loop_to)) {\n\t\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 96: // FORLOOP_CONTROL\n\t\t\t\t\titer = arg1[op_index][0];\n\t\t\t\t\tloop_by = locals[locals_offset + iter + 2];\n\t\t\t\t\tloop_to = locals[locals_offset + iter + 1];\n\t\t\t\t\titerator = locals[locals_offset + iter];\n\t\t\t\t\titerator += loop_by;\n\t\t\t\t\tif ((loop_by > 0 && iterator > loop_to) || (loop_by < 0 && iterator < loop_to)) {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocals[locals_offset + iter] = iterator;\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t}\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 97: // FORIN_INIT\n\t\t\t\t\tv = stack[stack_index];\n\t\t\t\t\tstack[stack_index] = 0; // default result\n\t\t\t\t\titerator = arg1[op_index][0];\n\t\t\t\t\tif (typeof v === \"object\") {\n\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\tlocals[locals_offset + iterator + 1] = v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = Object.keys(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === \"string\") {\n\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = v.split(\"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = [];\n\t\t\t\t\t}\n\t\t\t\t\tif (v.length === 0) {\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = v[0];\n\t\t\t\t\t\t// value could be undefined if the array is sparse\n\t\t\t\t\t\tlocals[locals_offset + arg1[op_index][0]] = value != null ? value : 0;\n\t\t\t\t\t\tlocals[locals_offset + iterator + 2] = 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 98: // FORIN_CONTROL\n\t\t\t\t\titerator = arg1[op_index][0];\n\t\t\t\t\tindex = locals[locals_offset + iterator + 2] += 1;\n\t\t\t\t\tv = locals[locals_offset + iterator + 1];\n\t\t\t\t\tif (index < v.length) {\n\t\t\t\t\t\tvalue = v[index];\n\t\t\t\t\t\t// value could be undefined if the array is sparse\n\t\t\t\t\t\tlocals[locals_offset + iterator] = value != null ? value : 0;\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 80: // OPCODE_JUMP\n\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 81: // OPCODE_JUMPY\n\t\t\t\t\tif (stack[stack_index--]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 82: // OPCODE_JUMPN\n\t\t\t\t\tif (!stack[stack_index--]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 83: // OPCODE_JUMPY_NOPOP\n\t\t\t\t\tif (stack[stack_index]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 84: // OPCODE_JUMPN_NOPOP\n\t\t\t\t\tif (!stack[stack_index]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 89: // OPCODE_LOAD_ROUTINE\n\t\t\t\t\tr = arg1[op_index++];\n\t\t\t\t\trc = r.clone();\n\t\t\t\t\tref3 = r.import_refs;\n\t\t\t\t\tfor (l = 0, len = ref3.length; l < len; l++) {\n\t\t\t\t\t\tir = ref3[l];\n\t\t\t\t\t\tif (ir === r.import_self) {\n\t\t\t\t\t\t\trc.import_values.push(rc);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trc.import_values.push(locals[locals_offset + ir]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trc.object = object;\n\t\t\t\t\tstack[++stack_index] = rc;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 90: // OPCODE_FUNCTION_CALL\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tf = stack[stack_index];\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 1] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = n = 0, ref6 = args - 1; n <= ref6; i = n += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 91: // OPCODE_FUNCTION_APPLY_VARIABLE\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tsup = obj = object;\n\t\t\t\t\tf = obj[name];\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\t\tf = sup[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\t\tf = global.Object[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\t\tf = global[name];\n\t\t\t\t\t\t\tsup = global;\n\t\t\t\t\t\t\tobj = global;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index -= 1;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = obj;\n\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\tcall_supername = name;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = p = args + 1, ref8 = f.num_args; p <= ref8; i = p += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj, this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = q = 0, ref9 = args - 1; q <= ref9; i = q += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(obj, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 92: // OPCODE_FUNCTION_APPLY_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tsup = obj;\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tf = obj[name];\n\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\tf = sup[name];\n\t\t\t\t\t}\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\tif (obj instanceof Routine) {\n\t\t\t\t\t\t\tf = global.Function[name];\n\t\t\t\t\t\t} else if (typeof obj === \"string\") {\n\t\t\t\t\t\t\tf = global.String[name];\n\t\t\t\t\t\t} else if (typeof obj === \"number\") {\n\t\t\t\t\t\t\tf = global.Number[name];\n\t\t\t\t\t\t} else if (Array.isArray(obj)) {\n\t\t\t\t\t\t\tf = global.List[name];\n\t\t\t\t\t\t} else if (typeof obj === \"object\") {\n\t\t\t\t\t\t\tf = global.Object[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = obj;\n\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\tcall_supername = name;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = s = args + 1, ref11 = f.num_args; s <= ref11; i = s += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj, this.argToNative(stack[stack_index - 2], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 4], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 4] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args + 1;\n\t\t\t\t\t\t\t\tfor (i = u = 0, ref12 = args - 1; u <= ref12; i = u += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(obj, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args + 1;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 93: // OPCODE_SUPER_CALL\n\t\t\t\t\tif (call_super != null && call_supername != null) {\n\t\t\t\t\t\tsup = call_super;\n\t\t\t\t\t\tf = null;\n\t\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\t\tf = sup[call_supername];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f != null && f instanceof Routine) {\n\t\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\t\tfor (i = w = args + 1, ref14 = f.num_args; w <= ref14; i = w += 1) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 94: // OPCODE_RETURN\n\t\t\t\t\tlocal_index -= arg1[op_index];\n\t\t\t\t\tif (call_stack_index <= 0) {\n\t\t\t\t\t\top_index = length;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcs = call_stack[--call_stack_index];\n\t\t\t\t\t\tobject = cs.object;\n\t\t\t\t\t\tcall_super = cs.super;\n\t\t\t\t\t\tcall_supername = cs.supername;\n\t\t\t\t\t\troutine = cs.routine;\n\t\t\t\t\t\top_index = cs.op_index;\n\t\t\t\t\t\topcodes = routine.opcodes;\n\t\t\t\t\t\targ1 = routine.arg1;\n\t\t\t\t\t\tlocals_offset -= routine.locals_size;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 100: // OPCODE_UNARY_FUNC\n\t\t\t\t\tv = arg1[op_index](stack[stack_index]);\n\t\t\t\t\tstack[stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 101: // OPCODE_BINARY_FUNC\n\t\t\t\t\tv = arg1[op_index](stack[stack_index - 1], stack[stack_index]);\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 110: // OPCODE_AFTER\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index - 1], stack[stack_index], false);\n\t\t\t\t\tstack[--stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 111: // OPCODE_EVERY\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index - 1], stack[stack_index], true);\n\t\t\t\t\tstack[--stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 112: // OPCODE_DO\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index], 0, false);\n\t\t\t\t\tstack[stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 113: // OPCODE_SLEEP\n\t\t\t\t\tsleep_time = isFinite(stack[stack_index]) ? stack[stack_index] : 0;\n\t\t\t\t\tthis.runner.sleep(sleep_time);\n\t\t\t\t\top_index += 1;\n\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\top_index = length; // stop the thread\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Fused Opcodes\n\t\t\t\tcase 120: // LOAD_VAR_CALL\n\t\t\t\t\t// { name: string, args: number }\n\t\t\t\t\tname = arg1[op_index].name;\n\t\t\t\t\targs = arg1[op_index].args;\n\n\t\t\t\t\t// Load Variable Logic\n\t\t\t\t\tv = object[name];\n\t\t\t\t\tif (v == null && object.class != null) {\n\t\t\t\t\t\tobj = object;\n\t\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check for warning (using undefined variable)\n\t\t\t\t\tif (v == null && !routine.ref[op_index].nowarning) {\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.using_undefined_variable[id]) {\n\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tf = v != null ? v : 0;\n\n\t\t\t\t\t// Function Call Logic\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[++stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index], context));\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args - 1; // Point to first arg\n\t\t\t\t\t\t\t\tfor (i = 0; i < args; i++) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Not a function\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[++stack_index] = f != null ? f : 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 121: // LOAD_PROP_CALL\n\t\t\t\t\t// args: number\n\t\t\t\t\targs = arg1[op_index];\n\n\t\t\t\t\t// LOAD_PROPERTY logic\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tf = v;\n\t\t\t\t\tstack[--stack_index] = f; // Replace name with function on stack\n\n\t\t\t\t\t// FUNCTION_CALL logic (simplified duplication for fusion)\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index--; // Pop function\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 1] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = 0; i < args; i++) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 122: // LOAD_CONST_ADD\n\t\t\t\t\t// arg1[op_index] is the constant value\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb += a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to full add logic for non-numbers\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 123: // LOAD_CONST_SUB\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb -= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 124: // LOAD_CONST_MUL\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb *= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 125: // LOAD_LOCAL_ADD\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb += a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 126: // LOAD_LOCAL_SUB\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb -= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 127: // LOAD_LOCAL_MUL\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb *= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 128: // LOAD_CONST_DIV\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb /= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorDiv(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 129: // LOAD_LOCAL_LT\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] < a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 130: // LOAD_LOCAL_GT\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] > a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 131: // LOAD_LOCAL_EQ\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] === a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 200: // COMPILED\n\t\t\t\t\tstack_index = arg1[op_index](stack, stack_index, locals, locals_offset, object, global);\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow `Unsupported operation: ${opcodes[op_index]}`;\n\t\t\t}\n\t\t}\n\t\tif (restore_op_index >= 0) {\n\t\t\tthis.op_index = restore_op_index;\n\t\t\tthis.routine = routine;\n\t\t\tthis.stack_index = stack_index;\n\t\t\tthis.local_index = local_index;\n\t\t\tthis.object = object;\n\t\t\tthis.call_stack_index = call_stack_index;\n\t\t\tthis.call_super = call_super;\n\t\t\tthis.call_supername = call_supername;\n\t\t\tthis.locals_offset = locals_offset;\n\t\t\tthis.done = false;\n\t\t} else {\n\t\t\tthis.op_index = 0;\n\t\t\tthis.done = true;\n\t\t\tif (this.routine.callback != null) {\n\t\t\t\tthis.routine.callback(stack[stack_index]);\n\t\t\t\tthis.routine.callback = null;\n\t\t\t}\n\t\t}\n\t\t// console.info \"\"\"stack_index: #{stack_index}\"\"\"\n\t\t// console.info stack\n\t\tif (this.log) {\n\t\t\tconsole.info(\"total operations: \" + op_count);\n\t\t\tconsole.info(`stack_index: ${stack_index}`);\n\t\t\tconsole.info(`result: ${stack[stack_index]}`);\n\t\t}\n\t\treturn stack[stack_index];\n\t}\n}\n","/**\n * Compiler - Compiles AST to bytecode\n *\n * Transforms parsed AST into executable bytecode for the VM.\n * Handles optimization, label resolution, and scope management.\n *\n * Responsibilities:\n * - Traverse AST and generate opcodes\n * - Manage local variable scope and allocation\n * - Resolve control flow labels (break/continue)\n * - Perform peephole optimizations (opcode fusion)\n *\n * @module lootiscript/compiler\n */\n\nimport {\n\tAfter,\n\tAssignment,\n\tBraced,\n\tBreak,\n\tCondition,\n\tContinue,\n\tCreateClass,\n\tCreateObject,\n\tDelete,\n\tDo,\n\tEvery,\n\tField,\n\tFor,\n\tForIn,\n\tFunction,\n\tFunctionCall,\n\tNegate,\n\tNewCall,\n\tNot,\n\tOperation,\n\ttype Program,\n\tReturn,\n\tSelfAssignment,\n\tSleep,\n\ttype Statement,\n\tValue,\n\tVariable,\n\tWhile,\n} from \"./program\";\nimport { OPCODES, Routine } from \"./routine\";\nimport { Processor } from \"./processor\";\n\n/**\n * Compiler - Compiles LootiScript AST to bytecode\n *\n * The compiler works in a single pass for code generation, followed by\n * optimization passes for label resolution and opcode fusion.\n *\n * @example\n * const compiler = new Compiler(programAst);\n * const routine = compiler.routine;\n */\nexport class Compiler {\n\tprogram: Program;\n\tcode_saves: any[];\n\tcode: string[];\n\troutine: Routine;\n\tlocals: Locals;\n\tcount: number;\n\tbreak_label: string | null;\n\tcontinue_label: string | null;\n\tprocessor?: Processor;\n\n\tconstructor(program: Program) {\n\t\tlet i: number, j: number, len: number, ref: Statement[], s: Statement;\n\t\tthis.program = program;\n\t\tthis.code_saves = [];\n\t\tthis.code = [\"\"];\n\t\tthis.routine = new Routine(0);\n\t\tthis.locals = new Locals(this);\n\t\tthis.count = 0;\n\t\tthis.break_label = null;\n\t\tthis.continue_label = null;\n\t\tref = this.program.statements;\n\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\ts = ref[i];\n\t\t\tthis.compile(s);\n\t\t\tif (i < this.program.statements.length - 1) {\n\t\t\t\tthis.routine.POP(s);\n\t\t\t}\n\n\t\t\t// OPTIMIZATION: Dead Code Elimination\n\t\t\t// Stop compiling after return, break, or continue statements\n\t\t\tif (s instanceof Return || s instanceof Break || s instanceof Continue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.routine.optimize();\n\t\tthis.routine.resolveLabels();\n\t\tthis.optimizeFusedOpcodes();\n\t\tthis.count += this.routine.opcodes.length;\n\t\tthis.routine.locals_size = this.locals.max_index;\n\t}\n\n\t/**\n\t * Optimize bytecode by fusing common opcode patterns\n\t *\n\t * Performs peephole optimization by combining adjacent opcodes into\n\t * more efficient fused instructions. This reduces opcode dispatch overhead\n\t * and improves execution performance.\n\t *\n\t * Optimization patterns:\n\t * - LOAD_VARIABLE + FUNCTION_CALL -> LOAD_VAR_CALL\n\t * - LOAD_PROPERTY + FUNCTION_CALL -> LOAD_PROP_CALL\n\t * - LOAD_VALUE (number) + ADD -> LOAD_CONST_ADD\n\t *\n\t * @remarks\n\t * This method modifies the routine's opcode array in place.\n\t * Should be called after label resolution.\n\t */\n\toptimizeFusedOpcodes(): void {\n\t\tconst ops = this.routine.opcodes;\n\t\tconst args = this.routine.arg1;\n\t\tconst refs = this.routine.ref;\n\t\tlet i = 0;\n\n\t\twhile (i < ops.length - 1) {\n\t\t\t// Fusion: LOAD_VARIABLE + FUNCTION_CALL -> LOAD_VAR_CALL\n\t\t\tif (ops[i] === OPCODES.LOAD_VARIABLE && ops[i + 1] === OPCODES.FUNCTION_CALL) {\n\t\t\t\tconst varName = args[i];\n\t\t\t\tconst numArgs = args[i + 1];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_VAR_CALL;\n\t\t\t\targs[i] = {\n\t\t\t\t\tname: varName,\n\t\t\t\t\targs: numArgs,\n\t\t\t\t};\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_PROPERTY + FUNCTION_CALL -> LOAD_PROP_CALL\n\t\t\tif (ops[i] === OPCODES.LOAD_PROPERTY && ops[i + 1] === OPCODES.FUNCTION_CALL) {\n\t\t\t\tconst numArgs = args[i + 1];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_PROP_CALL;\n\t\t\t\targs[i] = numArgs;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + ADD -> LOAD_CONST_ADD\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.ADD) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_ADD;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + SUB -> LOAD_CONST_SUB\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.SUB) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_SUB;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + MUL -> LOAD_CONST_MUL\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.MUL) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_MUL;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + ADD -> LOAD_LOCAL_ADD\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.ADD) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_ADD;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + SUB -> LOAD_LOCAL_SUB\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.SUB) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_SUB;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + MUL -> LOAD_LOCAL_MUL\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.MUL) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_MUL;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + DIV -> LOAD_CONST_DIV\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.DIV) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_DIV;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + LT -> LOAD_LOCAL_LT\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.LT) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_LT;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + GT -> LOAD_LOCAL_GT\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.GT) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_GT;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + EQ -> LOAD_LOCAL_EQ\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.EQ) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_EQ;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n\t * Main compile method - dispatches to appropriate compile method based on statement type\n\t *\n\t * Acts as the central dispatcher for the compilation process.\n\t * Recursively calls specific compile methods for each AST node type.\n\t *\n\t * @param {Statement} statement - The AST node to compile\n\t * @throws {string} If the statement type is not implemented\n\t */\n\tcompile(statement: Statement): void {\n\t\tif (statement instanceof Value) {\n\t\t\tthis.compileValue(statement);\n\t\t} else if (statement instanceof Operation) {\n\t\t\tthis.compileOperation(statement);\n\t\t} else if (statement instanceof Assignment) {\n\t\t\tthis.compileAssignment(statement);\n\t\t} else if (statement instanceof Variable) {\n\t\t\tthis.compileVariable(statement);\n\t\t} else if (statement instanceof Function) {\n\t\t\tthis.compileFunction(statement);\n\t\t} else if (statement instanceof FunctionCall) {\n\t\t\tthis.compileFunctionCall(statement);\n\t\t} else if (statement instanceof While) {\n\t\t\tthis.compileWhile(statement);\n\t\t} else if (statement instanceof SelfAssignment) {\n\t\t\tthis.compileSelfAssignment(statement);\n\t\t} else if (statement instanceof Braced) {\n\t\t\tthis.compileBraced(statement);\n\t\t} else if (statement instanceof CreateObject) {\n\t\t\tthis.compileCreateObject(statement);\n\t\t} else if (statement instanceof Field) {\n\t\t\tthis.compileField(statement);\n\t\t} else if (statement instanceof Negate) {\n\t\t\tthis.compileNegate(statement);\n\t\t} else if (statement instanceof For) {\n\t\t\tthis.compileFor(statement);\n\t\t} else if (statement instanceof ForIn) {\n\t\t\tthis.compileForIn(statement);\n\t\t} else if (statement instanceof Not) {\n\t\t\tthis.compileNot(statement);\n\t\t} else if (statement instanceof Return) {\n\t\t\tthis.compileReturn(statement);\n\t\t} else if (statement instanceof Condition) {\n\t\t\tthis.compileCondition(statement);\n\t\t} else if (statement instanceof Break) {\n\t\t\tthis.compileBreak(statement);\n\t\t} else if (statement instanceof Continue) {\n\t\t\tthis.compileContinue(statement);\n\t\t} else if (statement instanceof CreateClass) {\n\t\t\tthis.compileCreateClass(statement);\n\t\t} else if (statement instanceof NewCall) {\n\t\t\tthis.compileNewCall(statement);\n\t\t} else if (statement instanceof After) {\n\t\t\tthis.compileAfter(statement);\n\t\t} else if (statement instanceof Every) {\n\t\t\tthis.compileEvery(statement);\n\t\t} else if (statement instanceof Do) {\n\t\t\tthis.compileDo(statement);\n\t\t} else if (statement instanceof Sleep) {\n\t\t\tthis.compileSleep(statement);\n\t\t} else if (statement instanceof Delete) {\n\t\t\tthis.compileDelete(statement);\n\t\t} else {\n\t\t\tconsole.info(statement);\n\t\t\tthrow \"Not implemented\";\n\t\t}\n\t}\n\n\t/**\n\t * Compile assignment statement\n\t *\n\t * Handles variable assignment, property assignment, and local variable declaration.\n\t * Manages the complexity of assigning to:\n\t * - Local variables (optimized access)\n\t * - Global variables\n\t * - Object properties\n\t * - \"this\" context\n\t *\n\t * @param {Assignment} statement - The assignment AST node\n\t */\n\tcompileAssignment(statement: Assignment): void {\n\t\tlet arg_index: number, f: Field, i: number, index: number, j: number, ref: number;\n\t\tif (statement.local) {\n\t\t\tif (statement.field instanceof Variable) {\n\t\t\t\tif (statement.expression instanceof Function) {\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // register function locally first\n\t\t\t\t\tthis.compile(statement.expression); // then compile function which may refer to itself\n\t\t\t\t\tthis.routine.arg1[this.routine.arg1.length - 1].import_self = index;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else if (\n\t\t\t\t\tstatement.expression instanceof After ||\n\t\t\t\t\tstatement.expression instanceof Do ||\n\t\t\t\t\tstatement.expression instanceof Every\n\t\t\t\t) {\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // register thread locally first\n\t\t\t\t\targ_index = this.routine.arg1.length; // thread main routine will land here\n\t\t\t\t\tthis.compile(statement.expression); // then compile function which may refer to itself\n\t\t\t\t\tthis.routine.arg1[arg_index].import_self = index;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(statement.expression); // first compile expression which may refer to another local with same name\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // then register a local for that name\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow \"illegal\";\n\t\t\t}\n\t\t} else {\n\t\t\tif (statement.field instanceof Variable) {\n\t\t\t\tif (this.locals.get(statement.field.identifier) != null) {\n\t\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t\tindex = this.locals.get(statement.field.identifier)!;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else if (statement.expression instanceof CreateClass) {\n\t\t\t\t\tthis.compileUpdateClass(statement.expression, statement.field.identifier);\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t\tthis.routine.STORE_VARIABLE(statement.field.identifier, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tf = statement.field as Field;\n\t\t\t\tif (f.expression instanceof Variable) {\n\t\t\t\t\tif (f.expression.identifier === \"this\") {\n\t\t\t\t\t\tthis.routine.LOAD_THIS(f);\n\t\t\t\t\t} else if (this.locals.get(f.expression.identifier) != null) {\n\t\t\t\t\t\tindex = this.locals.get(f.expression.identifier)!;\n\t\t\t\t\t\tthis.routine.LOAD_LOCAL_OBJECT(index, f.expression);\n\t\t\t\t\t} else if (f.expression.identifier === \"global\") {\n\t\t\t\t\t\tthis.routine.LOAD_GLOBAL(f);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.routine.LOAD_VARIABLE_OBJECT(f.expression.identifier, statement);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(f.expression);\n\t\t\t\t\tthis.routine.MAKE_OBJECT(statement);\n\t\t\t\t}\n\t\t\t\tfor (i = j = 0, ref = f.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.compile(f.chain[i]);\n\t\t\t\t\tthis.routine.LOAD_PROPERTY_OBJECT(f.chain[i]);\n\t\t\t\t}\n\t\t\t\tthis.compile(f.chain[f.chain.length - 1]);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\tthis.routine.STORE_PROPERTY(statement);\n\t\t\t}\n\t\t}\n\t}\n\n\tcompileSelfAssignment(statement: SelfAssignment): void {\n\t\tlet f: Field, i: number, index: number, j: number, op: string, ref: number;\n\t\tswitch (statement.operation) {\n\t\t\tcase \"+=\":\n\t\t\t\top = \"ADD\";\n\t\t\t\tbreak;\n\t\t\tcase \"-=\":\n\t\t\t\top = \"SUB\";\n\t\t\t\tbreak;\n\t\t\tcase \"*=\":\n\t\t\t\top = \"MUL\";\n\t\t\t\tbreak;\n\t\t\tcase \"/=\":\n\t\t\t\top = \"DIV\";\n\t\t\t\tbreak;\n\t\t\tcase \"%=\":\n\t\t\t\top = \"MODULO\";\n\t\t\t\tbreak;\n\t\t\tcase \"&=\":\n\t\t\t\top = \"BINARY_AND\";\n\t\t\t\tbreak;\n\t\t\tcase \"|=\":\n\t\t\t\top = \"BINARY_OR\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Unknown self-assignment operation: \" + statement.operation;\n\t\t}\n\t\tif (statement.field instanceof Variable) {\n\t\t\tif (this.locals.get(statement.field.identifier) != null) {\n\t\t\t\tindex = this.locals.get(statement.field.identifier)!;\n\t\t\t\tthis.routine.LOAD_LOCAL(index, statement);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t(this.routine as any)[op](statement);\n\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t} else {\n\t\t\t\tthis.routine.LOAD_VARIABLE(statement.field.identifier, statement);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t(this.routine as any)[op](statement);\n\t\t\t\tthis.routine.STORE_VARIABLE(statement.field.identifier, statement);\n\t\t\t}\n\t\t} else {\n\t\t\tf = statement.field as Field;\n\t\t\tif (f.expression instanceof Variable) {\n\t\t\t\tif (f.expression.identifier === \"this\") {\n\t\t\t\t\tthis.routine.LOAD_THIS(f);\n\t\t\t\t} else if (this.locals.get(f.expression.identifier) != null) {\n\t\t\t\t\tindex = this.locals.get(f.expression.identifier)!;\n\t\t\t\t\tthis.routine.LOAD_LOCAL_OBJECT(index, statement);\n\t\t\t\t} else if (f.expression.identifier === \"global\") {\n\t\t\t\t\tthis.routine.LOAD_GLOBAL(f);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VARIABLE_OBJECT(f.expression.identifier, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.compile(f.expression);\n\t\t\t\tthis.routine.MAKE_OBJECT(statement);\n\t\t\t}\n\t\t\tfor (i = j = 0, ref = f.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\t\tthis.compile(f.chain[i]);\n\t\t\t\tthis.routine.LOAD_PROPERTY_OBJECT(f.chain[i]);\n\t\t\t}\n\t\t\tthis.compile(f.chain[f.chain.length - 1]);\n\t\t\tthis.routine.LOAD_PROPERTY_ATOP(statement);\n\t\t\tthis.compile(statement.expression);\n\t\t\t(this.routine as any)[op](statement);\n\t\t\tthis.routine.STORE_PROPERTY(statement);\n\t\t}\n\t}\n\n\t/**\n\t * Compile binary or unary operation\n\t *\n\t * Generates opcodes for mathematical and logical operations.\n\t * Handles short-circuit evaluation for 'and'/'or' operators.\n\t *\n\t * @param {Operation} op - The operation AST node\n\t */\n\tcompileOperation(op: Operation): void {\n\t\tlet jump: string, ref: string, ref1: string;\n\t\tif (\n\t\t\t(ref = op.operation) === \"+\" ||\n\t\t\tref === \"-\" ||\n\t\t\tref === \"*\" ||\n\t\t\tref === \"/\" ||\n\t\t\tref === \"%\" ||\n\t\t\tref === \"&\" ||\n\t\t\tref === \"|\" ||\n\t\t\tref === \"<<\" ||\n\t\t\tref === \">>\"\n\t\t) {\n\t\t\t// OPTIMIZATION: Constant Folding\n\t\t\t// If both operands are constant values, compute the result at compile time\n\t\t\tif (\n\t\t\t\top.term1 instanceof Value &&\n\t\t\t\top.term1.type === Value.TYPE_NUMBER &&\n\t\t\t\top.term2 instanceof Value &&\n\t\t\t\top.term2.type === Value.TYPE_NUMBER\n\t\t\t) {\n\t\t\t\tlet result: number;\n\t\t\t\tconst v1 = op.term1.value as number;\n\t\t\t\tconst v2 = op.term2.value as number;\n\n\t\t\t\tswitch (op.operation) {\n\t\t\t\t\tcase \"+\":\n\t\t\t\t\t\tresult = v1 + v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"-\":\n\t\t\t\t\t\tresult = v1 - v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"*\":\n\t\t\t\t\t\tresult = v1 * v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"/\":\n\t\t\t\t\t\tresult = v1 / v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"%\":\n\t\t\t\t\t\tresult = v1 % v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"&\":\n\t\t\t\t\t\tresult = v1 & v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"|\":\n\t\t\t\t\t\tresult = v1 | v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<<\":\n\t\t\t\t\t\tresult = v1 << v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">>\":\n\t\t\t\t\t\tresult = v1 >> v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tresult = 0;\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE(result, op);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase \"+\":\n\t\t\t\t\tthis.routine.ADD(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\tthis.routine.SUB(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"*\":\n\t\t\t\t\tthis.routine.MUL(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\":\n\t\t\t\t\tthis.routine.DIV(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%\":\n\t\t\t\t\tthis.routine.MODULO(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"&\":\n\t\t\t\t\tthis.routine.BINARY_AND(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"|\":\n\t\t\t\t\tthis.routine.BINARY_OR(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<<\":\n\t\t\t\t\tthis.routine.SHIFT_LEFT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">>\":\n\t\t\t\t\tthis.routine.SHIFT_RIGHT(op);\n\t\t\t}\n\t\t} else if (\n\t\t\t(ref1 = op.operation) === \"==\" ||\n\t\t\tref1 === \"!=\" ||\n\t\t\tref1 === \"<\" ||\n\t\t\tref1 === \">\" ||\n\t\t\tref1 === \"<=\" ||\n\t\t\tref1 === \">=\"\n\t\t) {\n\t\t\t// OPTIMIZATION: Constant Folding for comparisons\n\t\t\tif (\n\t\t\t\top.term1 instanceof Value &&\n\t\t\t\top.term1.type === Value.TYPE_NUMBER &&\n\t\t\t\top.term2 instanceof Value &&\n\t\t\t\top.term2.type === Value.TYPE_NUMBER\n\t\t\t) {\n\t\t\t\tconst v1 = op.term1.value as number;\n\t\t\t\tconst v2 = op.term2.value as number;\n\t\t\t\tlet result: number;\n\t\t\t\tswitch (op.operation) {\n\t\t\t\t\tcase \"==\":\n\t\t\t\t\t\tresult = v1 === v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!=\":\n\t\t\t\t\t\tresult = v1 !== v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<\":\n\t\t\t\t\t\tresult = v1 < v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">\":\n\t\t\t\t\t\tresult = v1 > v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<=\":\n\t\t\t\t\t\tresult = v1 <= v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">=\":\n\t\t\t\t\t\tresult = v1 >= v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tresult = 0;\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE(result, op);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase \"==\":\n\t\t\t\t\tthis.routine.EQ(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"!=\":\n\t\t\t\t\tthis.routine.NEQ(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\":\n\t\t\t\t\tthis.routine.LT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">\":\n\t\t\t\t\tthis.routine.GT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<=\":\n\t\t\t\t\tthis.routine.LTE(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">=\":\n\t\t\t\t\tthis.routine.GTE(op);\n\t\t\t}\n\t\t} else if (op.operation === \"and\") {\n\t\t\tjump = this.routine.createLabel(\"and\");\n\t\t\top.term1.nowarning = true;\n\t\t\top.term2.nowarning = true;\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.routine.JUMPN_NOPOP(jump, op);\n\t\t\tthis.routine.POP(op);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.setLabel(jump);\n\t\t} else if (op.operation === \"or\") {\n\t\t\tjump = this.routine.createLabel(\"or\");\n\t\t\top.term1.nowarning = true;\n\t\t\top.term2.nowarning = true;\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.routine.JUMPY_NOPOP(jump, op);\n\t\t\tthis.routine.POP(op);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.setLabel(jump);\n\t\t} else if (op.operation === \"^\") {\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.BINARY_OP(Compiler.predefined_binary_functions.pow, op);\n\t\t}\n\t}\n\n\tcompileBraced(expression: Braced): void {\n\t\tthis.compile(expression.expression);\n\t}\n\n\tcompileNegate(expression: Negate): void {\n\t\tif (expression.expression instanceof Value && expression.expression.type === Value.TYPE_NUMBER) {\n\t\t\tthis.routine.LOAD_VALUE(-expression.expression.value, expression);\n\t\t} else {\n\t\t\tthis.compile(expression.expression);\n\t\t\tthis.routine.NEGATE(expression);\n\t\t}\n\t}\n\n\tcompileNot(expression: Not): void {\n\t\t// OPTIMIZATION: Constant Folding for NOT\n\t\tif (expression.expression instanceof Value && expression.expression.type === Value.TYPE_NUMBER) {\n\t\t\tthis.routine.LOAD_VALUE(expression.expression.value ? 0 : 1, expression);\n\t\t\treturn;\n\t\t}\n\t\texpression.expression.nowarning = true;\n\t\tthis.compile(expression.expression);\n\t\tthis.routine.NOT(expression);\n\t}\n\n\tcompileValue(value: Value): void {\n\t\tlet i: number, j: number, ref: number;\n\t\tswitch (value.type) {\n\t\t\tcase Value.TYPE_NUMBER:\n\t\t\t\tthis.routine.LOAD_VALUE(value.value, value);\n\t\t\t\tbreak;\n\t\t\tcase Value.TYPE_STRING:\n\t\t\t\tthis.routine.LOAD_VALUE(value.value, value);\n\t\t\t\tbreak;\n\t\t\tcase Value.TYPE_ARRAY:\n\t\t\t\tthis.routine.CREATE_ARRAY(value);\n\t\t\t\tfor (i = j = 0, ref = (value.value as Statement[]).length - 1; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.routine.LOAD_VALUE(i, value);\n\t\t\t\t\tthis.compile((value.value as Statement[])[i]);\n\t\t\t\t\tthis.routine.CREATE_PROPERTY(value);\n\t\t\t\t}\n\t\t}\n\t}\n\n\tcompileVariable(variable: Variable): void {\n\t\tlet index: number, v: string;\n\t\tv = variable.identifier;\n\t\tif (v === \"this\") {\n\t\t\tthis.routine.LOAD_THIS(variable);\n\t\t} else if (v === \"global\") {\n\t\t\tthis.routine.LOAD_GLOBAL(variable);\n\t\t} else if (Compiler.predefined_values[v] != null) {\n\t\t\tthis.routine.LOAD_VALUE(Compiler.predefined_values[v], variable);\n\t\t} else if (this.locals.get(v) != null) {\n\t\t\tindex = this.locals.get(v)!;\n\t\t\tthis.routine.LOAD_LOCAL(index, variable);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VARIABLE(v, variable);\n\t\t}\n\t}\n\n\tcompileField(field: Field): void {\n\t\tvar c: Statement,\n\t\t\ti: number,\n\t\t\tid: string,\n\t\t\tindex: number,\n\t\t\tj: number,\n\t\t\tk: number,\n\t\t\tlen: number,\n\t\t\tref: number,\n\t\t\tref1: Statement[];\n\t\tif (\n\t\t\t(field.expression as Variable).identifier === \"keyboard\" ||\n\t\t\t(field.expression as Variable).identifier === \"gamepad\"\n\t\t) {\n\t\t\tfield.nowarning = true;\n\t\t}\n\t\tc = field.chain[field.chain.length - 1];\n\t\tif (c instanceof Value && c.value === \"type\") {\n\t\t\tif (field.chain.length === 1) {\n\t\t\t\tif (field.expression instanceof Variable) {\n\t\t\t\t\t// variable.type\n\t\t\t\t\tid = field.expression.identifier;\n\t\t\t\t\tif (this.locals.get(id) != null) {\n\t\t\t\t\t\tindex = this.locals.get(id)!;\n\t\t\t\t\t\tthis.routine.LOAD_LOCAL(index, field);\n\t\t\t\t\t\tthis.routine.TYPE(field);\n\t\t\t\t\t} else if (Compiler.predefined_values[id] != null) {\n\t\t\t\t\t\tthis.routine.LOAD_VALUE(\"number\", field);\n\t\t\t\t\t} else if (Compiler.predefined_unary_functions[id] != null || Compiler.predefined_binary_functions[id]) {\n\t\t\t\t\t\tthis.routine.LOAD_VALUE(\"function\", field);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.routine.VARIABLE_TYPE(id, field.expression);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(field.expression);\n\t\t\t\t\tthis.routine.TYPE(field);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.compile(field.expression);\n\t\t\t\tfor (i = j = 0, ref = field.chain.length - 3; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.compile(field.chain[i]);\n\t\t\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t\t\t}\n\t\t\t\tthis.compile(field.chain[field.chain.length - 2]);\n\t\t\t\tthis.routine.PROPERTY_TYPE(field.expression);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.compile(field.expression);\n\t\t\tref1 = field.chain;\n\t\t\tfor (k = 0, len = ref1.length; k < len; k++) {\n\t\t\t\tc = ref1[k];\n\t\t\t\tthis.compile(c);\n\t\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t\t}\n\t\t}\n\t}\n\n\tcompileFieldParent(field: Field): void {\n\t\tvar c: Statement, i: number, j: number, ref: number;\n\t\tthis.compile(field.expression);\n\t\tfor (i = j = 0, ref = field.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\tc = field.chain[i];\n\t\t\tthis.compile(c);\n\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t}\n\t}\n\n\tcompileFunctionCall(call: FunctionCall): void {\n\t\tvar a, funk, i, index, j, k, l, len, len1, len2, len3, len4, m, n, ref, ref1, ref2, ref3, ref4;\n\t\tif (call.expression instanceof Field) {\n\t\t\tref = call.args;\n\t\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\t\ta = ref[i];\n\t\t\t\tthis.compile(a);\n\t\t\t}\n\t\t\tthis.compileFieldParent(call.expression as Field);\n\t\t\tthis.compile((call.expression as Field).chain[(call.expression as Field).chain.length - 1]);\n\t\t\tthis.routine.FUNCTION_APPLY_PROPERTY(call.args.length, call);\n\t\t} else if (call.expression instanceof Variable) {\n\t\t\tif (Compiler.predefined_unary_functions[(call.expression as Variable).identifier] != null) {\n\t\t\t\tfunk = Compiler.predefined_unary_functions[(call.expression as Variable).identifier];\n\t\t\t\tif (call.args.length > 0) {\n\t\t\t\t\tthis.compile(call.args[0]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tthis.routine.UNARY_OP(funk, call);\n\t\t\t} else if (Compiler.predefined_binary_functions[(call.expression as Variable).identifier] != null) {\n\t\t\t\tfunk = Compiler.predefined_binary_functions[(call.expression as Variable).identifier];\n\t\t\t\tif (call.args.length > 0) {\n\t\t\t\t\tthis.compile(call.args[0]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tif (call.args.length > 1) {\n\t\t\t\t\tthis.compile(call.args[1]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tthis.routine.BINARY_OP(funk, call);\n\t\t\t} else if ((call.expression as Variable).identifier === \"super\") {\n\t\t\t\tref1 = call.args;\n\t\t\t\tfor (i = k = 0, len1 = ref1.length; k < len1; i = ++k) {\n\t\t\t\t\ta = ref1[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tthis.routine.SUPER_CALL(call.args.length, call);\n\t\t\t} else if (this.locals.get((call.expression as Variable).identifier) != null) {\n\t\t\t\tref2 = call.args;\n\t\t\t\tfor (i = l = 0, len2 = ref2.length; l < len2; i = ++l) {\n\t\t\t\t\ta = ref2[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tindex = this.locals.get((call.expression as Variable).identifier)!;\n\t\t\t\tthis.routine.LOAD_LOCAL(index, call);\n\t\t\t\tthis.routine.FUNCTION_CALL(call.args.length, call);\n\t\t\t} else {\n\t\t\t\tref3 = call.args;\n\t\t\t\tfor (i = m = 0, len3 = ref3.length; m < len3; i = ++m) {\n\t\t\t\t\ta = ref3[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE((call.expression as Variable).identifier, call);\n\t\t\t\tthis.routine.FUNCTION_APPLY_VARIABLE(call.args.length, call);\n\t\t\t}\n\t\t} else {\n\t\t\tref4 = call.args;\n\t\t\tfor (n = 0, len4 = ref4.length; n < len4; n++) {\n\t\t\t\ta = ref4[n];\n\t\t\t\tthis.compile(a);\n\t\t\t}\n\t\t\tthis.compile(call.expression);\n\t\t\tthis.routine.FUNCTION_CALL(call.args.length, call);\n\t\t}\n\t}\n\n\t/**\n\t * Compile 'for' loop\n\t *\n\t * Generates bytecode for numeric range loops.\n\t * Structure:\n\t * 1. Initialize iterator and bounds\n\t * 2. Loop start label\n\t * 3. Check condition (jump to end if false)\n\t * 4. Execute body\n\t * 5. Increment iterator\n\t * 6. Jump to start\n\t *\n\t * @param {For} forloop - The for loop AST node\n\t */\n\tcompileFor(forloop: For): void {\n\t\t// OPTIMIZATION: Loop Unrolling\n\t\t// If the loop has constant bounds and is small (≤ 5 iterations), unroll it\n\t\tif (\n\t\t\tforloop.range_from instanceof Value &&\n\t\t\tforloop.range_from.type === Value.TYPE_NUMBER &&\n\t\t\tforloop.range_to instanceof Value &&\n\t\t\tforloop.range_to.type === Value.TYPE_NUMBER &&\n\t\t\t(forloop.range_by == null || (forloop.range_by instanceof Value && forloop.range_by.type === Value.TYPE_NUMBER))\n\t\t) {\n\t\t\tconst from = forloop.range_from.value as number;\n\t\t\tconst to = forloop.range_to.value as number;\n\t\t\tconst step = forloop.range_by instanceof Value ? (forloop.range_by.value as number) : 1;\n\n\t\t\t// Calculate iteration count\n\t\t\tlet iterations = 0;\n\t\t\tif (step > 0 && to >= from) {\n\t\t\t\titerations = Math.floor((to - from) / step) + 1;\n\t\t\t} else if (step < 0 && to <= from) {\n\t\t\t\titerations = Math.floor((from - to) / Math.abs(step)) + 1;\n\t\t\t}\n\n\t\t\t// Only unroll if iterations are small (≤ 5)\n\t\t\tif (iterations > 0 && iterations <= 5) {\n\t\t\t\tconst iterator = this.locals.register(forloop.iterator);\n\t\t\t\tthis.locals.push();\n\n\t\t\t\tfor (let i = 0; i < iterations; i++) {\n\t\t\t\t\tconst iterValue = from + i * step;\n\t\t\t\t\t// Set iterator value\n\t\t\t\t\tthis.routine.LOAD_VALUE(iterValue, forloop);\n\t\t\t\t\tthis.routine.STORE_LOCAL(iterator, forloop);\n\t\t\t\t\tthis.routine.POP(forloop);\n\n\t\t\t\t\t// Compile loop body\n\t\t\t\t\tthis.compileSequence(forloop.sequence);\n\t\t\t\t}\n\n\t\t\t\tthis.locals.pop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Standard loop compilation (not unrolled)\n\t\tvar for_continue: string,\n\t\t\tfor_end: string,\n\t\t\tfor_start: string,\n\t\t\titerator: number,\n\t\t\tsave_break: string | null,\n\t\t\tsave_continue: string | null;\n\t\titerator = this.locals.register(forloop.iterator);\n\t\tthis.locals.allocate(); // range_to\n\t\tthis.locals.allocate(); // step\n\t\tthis.compile(forloop.range_from);\n\t\tthis.routine.STORE_LOCAL(iterator, forloop);\n\t\tthis.routine.POP(forloop);\n\t\tthis.compile(forloop.range_to);\n\t\tif (forloop.range_by != null) {\n\t\t\tthis.compile(forloop.range_by);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, forloop);\n\t\t}\n\t\tfor_start = this.routine.createLabel(\"for_start\");\n\t\tfor_continue = this.routine.createLabel(\"for_continue\");\n\t\tfor_end = this.routine.createLabel(\"for_end\");\n\t\tthis.routine.FORLOOP_INIT([iterator, for_end], forloop);\n\t\tthis.routine.setLabel(for_start);\n\t\tthis.locals.push();\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = for_end;\n\t\tthis.continue_label = for_continue;\n\t\tthis.compileSequence(forloop.sequence);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(for_continue);\n\t\tthis.routine.FORLOOP_CONTROL([iterator, for_start], forloop);\n\t\tthis.routine.setLabel(for_end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileForIn(forloop: ForIn): void {\n\t\tvar for_continue: string,\n\t\t\tfor_end: string,\n\t\t\tfor_start: string,\n\t\t\titerator: number,\n\t\t\tsave_break: string | null,\n\t\t\tsave_continue: string | null;\n\t\titerator = this.locals.register(forloop.iterator);\n\t\tthis.locals.allocate(); // array\n\t\tthis.locals.allocate(); // index\n\t\tthis.compile(forloop.list);\n\t\tfor_start = this.routine.createLabel(\"for_start\");\n\t\tfor_continue = this.routine.createLabel(\"for_continue\");\n\t\tfor_end = this.routine.createLabel(\"for_end\");\n\t\tthis.routine.FORIN_INIT([iterator, for_end], forloop);\n\t\tthis.routine.setLabel(for_start);\n\t\tthis.locals.push();\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = for_end;\n\t\tthis.continue_label = for_continue;\n\t\tthis.compileSequence(forloop.sequence);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(for_continue);\n\t\tthis.routine.FORIN_CONTROL([iterator, for_start], forloop);\n\t\tthis.routine.setLabel(for_end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileSequence(sequence: Statement[]): void {\n\t\tvar i: number, j: number, ref: number;\n\t\tfor (i = j = 0, ref = sequence.length - 1; j <= ref; i = j += 1) {\n\t\t\tif (!sequence[i].nopop) {\n\t\t\t\tthis.routine.POP(sequence[i]);\n\t\t\t}\n\t\t\tthis.compile(sequence[i]);\n\n\t\t\t// OPTIMIZATION: Dead Code Elimination\n\t\t\t// Stop compiling after return, break, or continue statements\n\t\t\tif (sequence[i] instanceof Return || sequence[i] instanceof Break || sequence[i] instanceof Continue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Compile 'while' loop\n\t *\n\t * Generates bytecode for condition-based loops.\n\t * Manages break/continue labels for control flow within the loop.\n\t *\n\t * @param {While} whiloop - The while loop AST node\n\t */\n\tcompileWhile(whiloop: While): void {\n\t\tvar end: string, save_break: string | null, save_continue: string | null, start: string;\n\t\tthis.locals.push();\n\t\tstart = this.routine.createLabel(\"while_start\");\n\t\tend = this.routine.createLabel(\"while_end\");\n\t\tthis.routine.LOAD_VALUE(0, whiloop);\n\t\tthis.routine.setLabel(start);\n\t\tthis.compile(whiloop.condition);\n\t\tthis.routine.JUMPN(end);\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = end;\n\t\tthis.continue_label = start;\n\t\tthis.compileSequence(whiloop.sequence);\n\t\tthis.routine.JUMP(start, whiloop);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileBreak(statement: Break): void {\n\t\tif (this.break_label != null) {\n\t\t\tthis.routine.JUMP(this.break_label, statement);\n\t\t}\n\t}\n\n\tcompileContinue(statement: Continue): void {\n\t\tif (this.continue_label != null) {\n\t\t\tthis.routine.JUMP(this.continue_label, statement);\n\t\t}\n\t}\n\n\tcompileFunction(func: Function): void {\n\t\tvar r: Routine;\n\t\tr = this.compileFunctionBody(func);\n\t\tthis.routine.LOAD_ROUTINE(r, func);\n\t}\n\n\tcompileFunctionBody(func: Function | After | Every | Do): Routine {\n\t\t// Type guard to check if func has args property (only Function has it)\n\t\tconst hasArgs = \"args\" in func && func.args != null;\n\t\tvar a: any,\n\t\t\targs: number,\n\t\t\ti: number,\n\t\t\tindex: number,\n\t\t\tj: number,\n\t\t\tk: number,\n\t\t\tl: number,\n\t\t\tlabel: string,\n\t\t\tlen: number,\n\t\t\tlocals: Locals,\n\t\t\tm: number,\n\t\t\tnumargs: number,\n\t\t\tr: Routine,\n\t\t\t// ref: number, // unused\n\t\t\tref1: number,\n\t\t\tref2: number,\n\t\t\tref3: any[],\n\t\t\troutine: Routine;\n\t\troutine = this.routine;\n\t\tlocals = this.locals;\n\t\tthis.routine = new Routine(hasArgs ? (func as Function).args.length : 0);\n\t\tthis.locals = new Locals(this, locals);\n\t\t// local_index = this.locals.index; // unused\n\t\tthis.routine.uses_arguments = true;\n\t\tif (hasArgs) {\n\t\t\tconst funcArgs = (func as Function).args;\n\t\t\tif (this.routine.uses_arguments) {\n\t\t\t\targs = this.locals.register(\"arguments\");\n\t\t\t\tthis.routine.STORE_LOCAL(args, func);\n\t\t\t\tthis.routine.POP(func);\n\t\t\t}\n\t\t\tnumargs = this.locals.register(\"+numargs\");\n\t\t\tthis.routine.STORE_LOCAL(numargs, func);\n\t\t\tthis.routine.POP(func);\n\t\t\tfor (i = j = ref1 = funcArgs.length - 1; j >= 0; i = j += -1) {\n\t\t\t\ta = funcArgs[i];\n\t\t\t\tindex = this.locals.register(a.name);\n\t\t\t\tthis.routine.STORE_LOCAL(index, func);\n\t\t\t\tthis.routine.POP(func);\n\t\t\t}\n\t\t\tfor (i = k = 0, ref1 = funcArgs.length - 1; k <= ref1; i = k += 1) {\n\t\t\t\ta = funcArgs[i];\n\t\t\t\tif (a.default != null) {\n\t\t\t\t\tindex = this.locals.get(a.name)!;\n\t\t\t\t\tlabel = this.routine.createLabel(\"default_arg\");\n\t\t\t\t\tthis.routine.LOAD_VALUE(i, func);\n\t\t\t\t\tthis.routine.LOAD_LOCAL(numargs, func);\n\t\t\t\t\tthis.routine.LT(func);\n\t\t\t\t\tthis.routine.JUMPY(label, func);\n\t\t\t\t\tthis.compile(a.default);\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, func);\n\t\t\t\t\tthis.routine.POP(func);\n\t\t\t\t\tthis.routine.setLabel(label);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (func.sequence.length > 0) {\n\t\t\tfor (i = l = 0, ref2 = func.sequence.length - 1; l <= ref2; i = l += 1) {\n\t\t\t\tthis.compile(func.sequence[i]);\n\t\t\t\tif (i < func.sequence.length - 1) {\n\t\t\t\t\tthis.routine.POP(func.sequence[i]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.RETURN(func.sequence[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, func);\n\t\t\tthis.routine.RETURN(func);\n\t\t}\n\t\tif (hasArgs && !this.locals.arguments_used) {\n\t\t\tthis.routine.uses_arguments = false;\n\t\t\tthis.routine.remove(0);\n\t\t\tthis.routine.remove(0);\n\t\t}\n\t\tindex = 0;\n\t\tref3 = this.locals.imports;\n\t\tfor (m = 0, len = ref3.length; m < len; m++) {\n\t\t\tconst imp = ref3[m];\n\t\t\tthis.routine.OP_INSERT(OPCODES.LOAD_IMPORT, func, index, index * 3);\n\t\t\tthis.routine.OP_INSERT(OPCODES.STORE_LOCAL, func, imp.index, index * 3 + 1);\n\t\t\tthis.routine.OP_INSERT(OPCODES.POP, func, 0, index * 3 + 2);\n\t\t\tthis.routine.import_refs.push(imp.source);\n\t\t\tindex += 1;\n\t\t}\n\t\tthis.routine.optimize();\n\t\tthis.routine.resolveLabels();\n\t\tthis.count += this.routine.opcodes.length;\n\t\tr = this.routine;\n\t\t// console.info r.toString()\n\t\tthis.routine.locals_size = this.locals.max_index;\n\t\tthis.routine = routine;\n\t\tthis.locals = locals;\n\t\treturn r;\n\t}\n\n\tcompileReturn(ret: Return): void {\n\t\tif (ret.expression != null) {\n\t\t\tthis.compile(ret.expression);\n\t\t\tthis.routine.RETURN(ret);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, ret);\n\t\t\tthis.routine.RETURN(ret);\n\t\t}\n\t}\n\n\tcompileCondition(condition: Condition): void {\n\t\tvar c, chain, condition_end, condition_next, i, j, ref;\n\t\tchain = condition.chain;\n\t\tthis.routine.LOAD_VALUE(0, condition);\n\t\tcondition_end = this.routine.createLabel(\"condition_end\");\n\t\tfor (i = j = 0, ref = chain.length - 1; j <= ref; i = j += 1) {\n\t\t\tcondition_next = this.routine.createLabel(\"condition_next\");\n\t\t\tc = chain[i];\n\t\t\tc.condition.nowarning = true;\n\t\t\tthis.compile(c.condition);\n\t\t\tthis.routine.JUMPN(condition_next);\n\t\t\tthis.locals.push();\n\t\t\tthis.compileSequence(c.sequence);\n\t\t\tthis.locals.pop();\n\t\t\tthis.routine.JUMP(condition_end, condition);\n\t\t\tthis.routine.setLabel(condition_next);\n\t\t\tif (i === chain.length - 1 && c.else != null) {\n\t\t\t\tthis.locals.push();\n\t\t\t\tthis.compileSequence(c.else);\n\t\t\t\tthis.locals.pop();\n\t\t\t}\n\t\t}\n\t\tthis.routine.setLabel(condition_end);\n\t}\n\n\tformatField(field: string | number): string {\n\t\tif (field === \"constructor\") {\n\t\t\tfield = \"_constructor\";\n\t\t}\n\t\treturn String(field).replace(/\"/g, '\\\\\"');\n\t}\n\n\tcompileCreateObject(statement: CreateObject): void {\n\t\tlet f: {\n\t\t\t\tfield: string | number | null;\n\t\t\t\tvalue: Statement;\n\t\t\t},\n\t\t\tj: number,\n\t\t\tlen: number,\n\t\t\tref: Array<{\n\t\t\t\tfield: string | number | null;\n\t\t\t\tvalue: Statement;\n\t\t\t}>;\n\t\tthis.routine.CREATE_OBJECT(statement);\n\t\tref = statement.fields;\n\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\tf = ref[j];\n\t\t\tthis.routine.LOAD_VALUE(f.field, statement);\n\t\t\tthis.compile(f.value);\n\t\t\tthis.routine.CREATE_PROPERTY(statement);\n\t\t}\n\t}\n\n\tcompileCreateClass(statement: CreateClass): void {\n\t\tlet f: {\n\t\t\t\tfield: string | number;\n\t\t\t\tvalue: Statement;\n\t\t\t},\n\t\t\tj: number,\n\t\t\tlen: number,\n\t\t\tref: Array<{\n\t\t\t\tfield: string | number;\n\t\t\t\tvalue: Statement;\n\t\t\t}>,\n\t\t\tvariable: string | number;\n\t\tif (statement.ext != null) {\n\t\t\tstatement.ext.nowarning = true;\n\t\t\tthis.compile(statement.ext);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, statement);\n\t\t}\n\t\tvariable = statement.ext != null && statement.ext instanceof Variable ? statement.ext.identifier : 0;\n\t\tthis.routine.CREATE_CLASS(variable, statement);\n\t\tref = statement.fields;\n\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\tf = ref[j];\n\t\t\tthis.routine.LOAD_VALUE(f.field, statement);\n\t\t\tthis.compile(f.value);\n\t\t\tthis.routine.CREATE_PROPERTY(statement);\n\t\t}\n\t}\n\n\tcompileUpdateClass(statement: CreateClass, variable: string): void {\n\t\tthis.compileCreateClass(statement);\n\t\tthis.routine.UPDATE_CLASS(variable, statement);\n\t}\n\n\tcompileNewCall(statement: NewCall): void {\n\t\tlet a: Statement, call: FunctionCall, i: number, j: number, len: number, ref: Statement[];\n\t\tcall = statement.expression as FunctionCall;\n\t\tthis.routine.LOAD_VALUE(0, statement); // reserve spot on stack for the class instance\n\t\tref = call.args;\n\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\ta = ref[i];\n\t\t\tthis.compile(a);\n\t\t}\n\t\tthis.compile(call.expression);\n\t\tthis.routine.NEW_CALL(call.args.length, statement);\n\t\tthis.routine.POP(statement); // pop return value of class constructor\n\t}\n\n\tcompileAfter(after: After): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(after);\n\t\tthis.routine.LOAD_ROUTINE(r, after);\n\t\tthis.compile(after.delay);\n\t\tif (after.multiplier != null && after.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(after.multiplier, after);\n\t\t\tthis.routine.MUL(after);\n\t\t}\n\t\tthis.routine.AFTER(after);\n\t}\n\n\tcompileEvery(every: Every): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(every);\n\t\tthis.routine.LOAD_ROUTINE(r, every);\n\t\tthis.compile(every.delay);\n\t\tif (every.multiplier != null && every.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(every.multiplier, every);\n\t\t\tthis.routine.MUL(every);\n\t\t}\n\t\tthis.routine.EVERY(every);\n\t}\n\n\tcompileDo(dostuff: Do): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(dostuff);\n\t\tthis.routine.LOAD_ROUTINE(r, dostuff);\n\t\tthis.routine.DO(dostuff);\n\t}\n\n\tcompileSleep(sleep: Sleep): void {\n\t\tthis.compile(sleep.delay);\n\t\tif (sleep.multiplier != null && sleep.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(sleep.multiplier, sleep);\n\t\t\tthis.routine.MUL(sleep);\n\t\t}\n\t\tthis.routine.SLEEP(sleep);\n\t}\n\n\tcompileDelete(del: Delete): void {\n\t\tlet chain: Statement[], i: number, j: number, ref: number;\n\t\tif (del.field instanceof Variable) {\n\t\t\tthis.routine.LOAD_THIS(del);\n\t\t\tthis.routine.LOAD_VALUE(del.field.identifier, del);\n\t\t\tthis.routine.DELETE(del);\n\t\t} else if (del.field instanceof Field) {\n\t\t\tthis.compile(del.field.expression);\n\t\t\tchain = del.field.chain;\n\t\t\tfor (i = j = 0, ref = chain.length - 1; j <= ref; i = j += 1) {\n\t\t\t\tthis.compile(chain[i]);\n\t\t\t\tif (i < chain.length - 1) {\n\t\t\t\t\tthis.routine.LOAD_PROPERTY(del);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.routine.DELETE(del);\n\t\t} else {\n\t\t\tthrow \"Delete expects variable or field access\";\n\t\t}\n\t}\n\n\texec(context: any): any {\n\t\tif (!this.processor) {\n\t\t\tthis.processor = new Processor(null as any);\n\t\t}\n\t\tif (!this.routine) {\n\t\t\tthrow new Error(\"No routine to execute\");\n\t\t}\n\t\tthis.processor!.load(this.routine);\n\t\treturn this.processor!.run(context);\n\t}\n\n\tstatic predefined_unary_functions: Record<string, (x: any) => number> = {\n\t\tround: Math.round,\n\t\tfloor: Math.floor,\n\t\tceil: Math.ceil,\n\t\tabs: Math.abs,\n\t\tsqrt: Math.sqrt,\n\t\tsin: Math.sin,\n\t\tcos: Math.cos,\n\t\ttan: Math.tan,\n\t\tacos: Math.acos,\n\t\tasin: Math.asin,\n\t\tatan: Math.atan,\n\t\tsind: (x: number) => Math.sin((x * Math.PI) / 180),\n\t\tcosd: (x: number) => Math.cos((x * Math.PI) / 180),\n\t\ttand: (x: number) => Math.tan((x * Math.PI) / 180),\n\t\tasind: (x: number) => (Math.asin(x) / Math.PI) * 180,\n\t\tacosd: (x: number) => (Math.acos(x) / Math.PI) * 180,\n\t\tatand: (x: number) => (Math.atan(x) / Math.PI) * 180,\n\t\tlog: Math.log,\n\t\texp: Math.exp,\n\t};\n\n\tstatic predefined_binary_functions: Record<string, (a: any, b: any) => number> = {\n\t\tmin: Math.min,\n\t\tmax: Math.max,\n\t\tpow: Math.pow,\n\t\tatan2: Math.atan2,\n\t\tatan2d: (y: number, x: number) => (Math.atan2(y, x) / Math.PI) * 180,\n\t};\n\n\tstatic predefined_values: Record<string, number> = {\n\t\tPI: Math.PI,\n\t\ttrue: 1,\n\t\tfalse: 0,\n\t};\n}\n\n/**\n * Locals - Manages local variable scopes and allocations\n */\nexport class Locals {\n\tcompiler: Compiler;\n\tparent: Locals | null;\n\tlayers: LocalLayer[];\n\tindex: number;\n\tmax_index: number;\n\timports: Array<{\n\t\tname: string;\n\t\tindex: number;\n\t\tsource: number;\n\t}>;\n\targuments_used?: boolean;\n\n\tconstructor(compiler: Compiler, parent: Locals | null = null) {\n\t\tthis.compiler = compiler;\n\t\tthis.parent = parent;\n\t\tthis.layers = [];\n\t\tthis.index = 0;\n\t\tthis.max_index = 0;\n\t\tthis.imports = [];\n\t\tthis.push();\n\t}\n\n\tincrement(): number {\n\t\tconst spot = this.index++;\n\t\tthis.max_index = Math.max(this.index, this.max_index);\n\t\treturn spot;\n\t}\n\n\tpush(): number {\n\t\treturn this.layers.push(new LocalLayer(this));\n\t}\n\n\tpop(): LocalLayer[] {\n\t\t// resetting the @index below was causing erasure of outer locals\n\t\t// when used after the block ; such reset is not needed\n\t\t//@index = @layers[@layers.length-1].start_index\n\t\treturn this.layers.splice(this.layers.length - 1, 1);\n\t}\n\n\tregister(name: string): number {\n\t\treturn this.layers[this.layers.length - 1].register(name);\n\t}\n\n\tallocate(): number {\n\t\treturn this.layers[this.layers.length - 1].allocate();\n\t}\n\n\tget(name: string): number | null {\n\t\tlet i: number, index: number, j: number, v: number | null;\n\t\tif (name === \"arguments\") {\n\t\t\tthis.arguments_used = true;\n\t\t}\n\t\tfor (i = j = this.layers.length - 1; j >= 0; i = j -= 1) {\n\t\t\tv = this.layers[i].get(name);\n\t\t\tif (v != null) {\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t\tif (this.parent != null) {\n\t\t\tv = this.parent.get(name);\n\t\t\tif (v != null) {\n\t\t\t\tindex = this.register(name);\n\t\t\t\tthis.imports.push({\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\tsource: v,\n\t\t\t\t});\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/**\n * LocalLayer - Represents a single scope layer for local variables\n */\nexport class LocalLayer {\n\tlocals: Locals;\n\tstart_index: number;\n\tregistered: Record<string, number>;\n\n\tconstructor(locals: Locals) {\n\t\tthis.locals = locals;\n\t\tthis.start_index = this.locals.index;\n\t\tthis.registered = {};\n\t}\n\n\tregister(name: string): number {\n\t\treturn (this.registered[name] = this.locals.increment());\n\t}\n\n\tallocate(): number {\n\t\treturn this.locals.increment();\n\t}\n\n\tget(name: string): number | null {\n\t\tif (this.registered[name] != null) {\n\t\t\treturn this.registered[name];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * Runner - Manages LootiScript execution lifecycle\n *\n * Handles multiple threads, scheduling, and global environment setup.\n */\n\nimport { JSONLib, ListLib, MathLib, StringLib } from \"@al8b/stdlib\";\n\nimport { Random } from \"../random\";\n\nimport { Compiler } from \"./compiler\";\nimport { Parser } from \"./parser\";\nimport { Processor } from \"./processor\";\nimport { VMProfiler } from \"./profiler\";\nimport { Program } from \"./program\";\nimport { Routine } from \"./routine\";\n\n/**\n * L8BVM context interface\n */\ninterface L8BVMContext {\n\tglobal: Record<string, any>;\n\tmeta: {\n\t\tprint: (text: string) => void;\n\t};\n\twarnings: {\n\t\tusing_undefined_variable: Record<string, any>;\n\t\tassigning_field_to_undefined: Record<string, any>;\n\t\tinvoking_non_function: Record<string, any>;\n\t\tassigning_api_variable: Record<string, any>;\n\t\tassignment_as_condition: Record<string, any>;\n\t};\n\tlocation?: any;\n}\n\n/**\n * L8BVM interface\n */\ninterface L8BVM {\n\tcontext: L8BVMContext;\n}\n\n/**\n * Thread interface\n */\nexport interface ThreadInterface {\n\tpause: () => number;\n\tresume: () => number;\n\tstop: () => number;\n\tstatus: \"running\" | \"paused\" | \"stopped\";\n}\n\n/**\n * Thread - Execution thread for LootiScript\n */\nexport class Thread {\n\trunner: Runner;\n\tloop: boolean;\n\tprocessor: Processor;\n\tpaused: boolean;\n\tterminated: boolean;\n\tnext_calls: (string | Routine)[];\n\tinterface: ThreadInterface;\n\troutine?: Routine;\n\tstart_time?: number;\n\tdelay?: number;\n\trepeat?: boolean;\n\tsleep_until?: number;\n\n\tconstructor(runner: Runner) {\n\t\tthis.runner = runner;\n\t\tthis.loop = false;\n\t\tthis.processor = new Processor(this.runner);\n\t\tthis.paused = false;\n\t\tthis.terminated = false;\n\t\tthis.next_calls = [];\n\t\tthis.interface = {\n\t\t\tpause: () => {\n\t\t\t\treturn this.pause();\n\t\t\t},\n\t\t\tresume: () => {\n\t\t\t\treturn this.resume();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\treturn this.stop();\n\t\t\t},\n\t\t\tstatus: \"running\",\n\t\t};\n\t}\n\n\taddCall(call: string | Routine): void {\n\t\tif (this.next_calls.indexOf(call) < 0) {\n\t\t\tthis.next_calls.push(call);\n\t\t}\n\t}\n\n\tloadNext(): boolean {\n\t\tlet compiler: Compiler;\n\t\tlet f: string | Routine;\n\t\tlet parser: Parser;\n\t\tlet program: Program;\n\t\tif (this.next_calls.length > 0) {\n\t\t\tf = this.next_calls.splice(0, 1)[0];\n\t\t\tif (f instanceof Routine) {\n\t\t\t\tthis.processor.load(f);\n\t\t\t} else {\n\t\t\t\tparser = new Parser(f, \"\");\n\t\t\t\tparser.parse();\n\t\t\t\tprogram = parser.program;\n\t\t\t\tcompiler = new Compiler(program);\n\t\t\t\tthis.processor.load(compiler.routine);\n\t\t\t\tif ((f === \"update()\" || f === \"serverUpdate()\") && (this.runner as any).updateControls != null) {\n\t\t\t\t\t(this.runner as any).updateControls();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpause(): number {\n\t\tif (this.interface.status === \"running\") {\n\t\t\tthis.interface.status = \"paused\";\n\t\t\tthis.paused = true;\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tresume(): number {\n\t\tif (this.interface.status === \"paused\") {\n\t\t\tthis.interface.status = \"running\";\n\t\t\tthis.paused = false;\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tstop(): number {\n\t\tthis.interface.status = \"stopped\";\n\t\tthis.terminated = true;\n\t\treturn 1;\n\t}\n}\n\n/**\n * Runner - Manages LootiScript execution lifecycle\n *\n * Handles multiple threads, scheduling, and global environment setup.\n */\nexport class Runner {\n\tl8bvm: L8BVM;\n\tinitialized: boolean;\n\tsystem: any;\n\tmain_thread!: Thread;\n\tthreads: Thread[];\n\tcurrent_thread: Thread | null;\n\tthread_index: number;\n\tfps: number;\n\tfps_max: number;\n\tcpu_load: number;\n\ttriggers_controls_update: boolean;\n\tupdateControls?: () => void;\n\tonNativeError: ((error: unknown) => void) | null;\n\tprofiler: VMProfiler;\n\n\tconstructor(l8bvm: L8BVM) {\n\t\tthis.l8bvm = l8bvm;\n\t\tthis.initialized = false;\n\t\tthis.threads = [];\n\t\tthis.current_thread = null;\n\t\tthis.thread_index = 0;\n\t\tthis.fps = 60;\n\t\tthis.fps_max = 60;\n\t\tthis.cpu_load = 0;\n\t\tthis.triggers_controls_update = false;\n\t\tthis.onNativeError = null;\n\t\t// Main thread and profiler are initialized lazily in init()\n\t\t// to ensure proper dependency setup with L8BVM context\n\t\tthis.profiler = new VMProfiler(null as any);\n\t}\n\n\treportNativeError(error: unknown): void {\n\t\tif (this.onNativeError) {\n\t\t\tthis.onNativeError(error);\n\t\t} else {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\tinit(): boolean {\n\t\tthis.initialized = true;\n\t\t// Initialize system object if not provided by runtime\n\t\t// This object exposes VM state and controls to LootiScript code\n\t\tif (!this.l8bvm.context.global.system) {\n\t\t\tthis.l8bvm.context.global.system = {};\n\t\t}\n\t\tthis.system = this.l8bvm.context.global.system;\n\t\tthis.system.preemptive = 1;\n\t\tthis.system.threads = [];\n\t\tthis.main_thread = new Thread(this);\n\t\tthis.threads = [this.main_thread];\n\t\tthis.current_thread = this.main_thread;\n\t\tthis.thread_index = 0;\n\n\t\t// Initialize profiler with main thread processor for performance monitoring\n\t\tthis.profiler = new VMProfiler(this.main_thread.processor);\n\n\t\t// Expose profiler API to system object for LootiScript code access\n\t\tthis.system.profiler = {\n\t\t\tstart: () => {\n\t\t\t\tthis.main_thread.processor.profilingEnabled = true;\n\t\t\t\tthis.profiler.start();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\tthis.main_thread.processor.profilingEnabled = false;\n\t\t\t\treturn this.profiler.stop();\n\t\t\t},\n\t\t\tgetMetrics: () => this.profiler.getAverageMetrics(),\n\t\t};\n\n\t\tthis.l8bvm.context.global.print = this.l8bvm.context.meta.print;\n\t\tthis.l8bvm.context.global.random = new Random(0);\n\t\tthis.l8bvm.context.global.Function = {\n\t\t\tbind: function (this: any, obj: any) {\n\t\t\t\tlet rc: Routine;\n\t\t\t\tif (this instanceof Routine) {\n\t\t\t\t\trc = this.clone();\n\t\t\t\t\t(rc as any).object = obj;\n\t\t\t\t\treturn rc;\n\t\t\t\t} else {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t},\n\t\t} as any;\n\t\t// Inject standard library into global scope for LootiScript code\n\t\t// Provides Math, JSON, List, and String utility functions\n\t\tthis.l8bvm.context.global.Math = MathLib;\n\t\tthis.l8bvm.context.global.JSON = JSONLib;\n\t\tthis.l8bvm.context.global.List = ListLib;\n\n\t\tthis.l8bvm.context.global.Function = {\n\t\t\tbind: (...args: any[]) => {\n\t\t\t\treturn args[0].bind.apply(args[0], args.slice(1));\n\t\t\t},\n\t\t} as any;\n\t\t// Extend String with stdlib utilities for LootiScript\n\t\tthis.l8bvm.context.global.String = {\n\t\t\t...StringLib,\n\t\t\t// Override fromCharCode to use proper calling convention with variable arguments\n\t\t\tfromCharCode: function () {\n\t\t\t\treturn String.fromCharCode.apply(null, arguments as any);\n\t\t\t},\n\t\t};\n\n\t\tthis.l8bvm.context.global.Number = {\n\t\t\tparse: (str: string) => {\n\t\t\t\tconst res = Number.parseFloat(str);\n\t\t\t\treturn isFinite(res) ? res : 0;\n\t\t\t},\n\t\t\ttoString: function (this: number) {\n\t\t\t\treturn this.toString();\n\t\t\t},\n\t\t};\n\n\t\t// Initialize Object with default operator overloads for LootiScript\n\t\t// Enables operator syntax like obj1 + obj2, obj1 - obj2, etc.\n\t\tthis.l8bvm.context.global.Object = {\n\t\t\t\"+\": (a: any, b: any) => (a != null ? a + b : b),\n\t\t\t\"-\": (a: any, b: any) => a - b,\n\t\t\t\"*\": (a: any, b: any) => a * b,\n\t\t\t\"/\": (a: any, b: any) => a / b,\n\t\t\t\"%\": (a: any, b: any) => a % b,\n\t\t};\n\t\tthis.fps = 60;\n\t\tthis.fps_max = 60;\n\t\tthis.cpu_load = 0;\n\t\tthis.l8bvm.context.meta.print(\"LootiScript 1.0\");\n\t\treturn (this.triggers_controls_update = true);\n\t}\n\n\trun(src: string, filename: string = \"\", callback?: (result: string) => void): any {\n\t\tlet compiler: Compiler;\n\t\tlet err: any;\n\t\tlet id: string;\n\t\tlet j: number;\n\t\tlet len: number;\n\t\tlet parser: Parser;\n\t\tlet program: Program;\n\t\tlet ref: any[];\n\t\tlet result: any = null;\n\t\tlet w: any;\n\t\tif (!this.initialized) {\n\t\t\tthis.init();\n\t\t}\n\t\tparser = new Parser(src, filename);\n\t\tparser.parse();\n\t\tif ((parser as any).error_info != null) {\n\t\t\terr = (parser as any).error_info;\n\t\t\terr.type = \"compile\";\n\t\t\tthrow err;\n\t\t}\n\t\tif (parser.warnings.length > 0) {\n\t\t\tref = parser.warnings;\n\t\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\t\tw = ref[j];\n\t\t\t\tid = filename + \"-\" + w.line + \"-\" + w.column;\n\t\t\t\tswitch (w.type) {\n\t\t\t\t\tcase \"assigning_api_variable\":\n\t\t\t\t\t\tif (this.l8bvm.context.warnings.assigning_api_variable[id] == null) {\n\t\t\t\t\t\t\tthis.l8bvm.context.warnings.assigning_api_variable[id] = {\n\t\t\t\t\t\t\t\tfile: filename,\n\t\t\t\t\t\t\t\tline: w.line,\n\t\t\t\t\t\t\t\tcolumn: w.column,\n\t\t\t\t\t\t\t\texpression: w.identifier,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assignment_as_condition\":\n\t\t\t\t\t\tif (this.l8bvm.context.warnings.assignment_as_condition[id] == null) {\n\t\t\t\t\t\t\tthis.l8bvm.context.warnings.assignment_as_condition[id] = {\n\t\t\t\t\t\t\t\tfile: filename,\n\t\t\t\t\t\t\t\tline: w.line,\n\t\t\t\t\t\t\t\tcolumn: w.column,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprogram = parser.program;\n\t\tcompiler = new Compiler(program);\n\t\tresult = null;\n\t\t(compiler.routine as any).callback = (res: any) => {\n\t\t\tif (callback != null) {\n\t\t\t\treturn callback(Program.toString(res));\n\t\t\t} else {\n\t\t\t\treturn (result = res);\n\t\t\t}\n\t\t};\n\t\tthis.main_thread.addCall(compiler.routine);\n\t\tthis.tick();\n\t\treturn result;\n\t}\n\n\tcall(name: string, args?: any[]): any {\n\t\tlet f: (...args: any[]) => any;\n\t\tlet routine: any;\n\t\tif (name === \"draw\" || name === \"update\" || name === \"serverUpdate\") {\n\t\t\tif (this.l8bvm.context.global[name] != null) {\n\t\t\t\tthis.main_thread.addCall(`${name}()`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.l8bvm.context.global[name] != null) {\n\t\t\tif (args == null || !args.length) {\n\t\t\t\tthis.main_thread.addCall(`${name}()`);\n\t\t\t} else {\n\t\t\t\troutine = this.l8bvm.context.global[name];\n\t\t\t\tif (routine instanceof Routine) {\n\t\t\t\t\tf = this.main_thread.processor.routineAsFunction(routine, this.l8bvm.context) as any;\n\t\t\t\t\treturn f(...args);\n\t\t\t\t} else if (typeof routine === \"function\") {\n\t\t\t\t\treturn (routine as any)(...args);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\ttoString(obj: any): string {\n\t\treturn Program.toString(obj);\n\t}\n\n\tprocess(thread: Thread, time_limit: number): any {\n\t\tlet processor: Processor;\n\t\tprocessor = thread.processor;\n\t\tprocessor.time_limit = time_limit;\n\t\tthis.current_thread = thread;\n\t\treturn processor.run(this.l8bvm.context);\n\t}\n\n\ttick(): void {\n\t\tlet dt: number;\n\t\tlet i: number;\n\t\tlet index: number;\n\t\tlet j: number;\n\t\tlet len: number;\n\t\tlet load: number;\n\t\tlet margin: number;\n\t\tlet processing: boolean;\n\t\tlet processor: Processor;\n\t\tlet ref: Thread[];\n\t\tlet t: Thread;\n\t\tlet time: number;\n\t\tlet time_limit: number;\n\t\tlet time_out: number;\n\t\tif (this.system.fps != null) {\n\t\t\tthis.fps = this.fps * 0.9 + this.system.fps * 0.1;\n\t\t}\n\t\tthis.fps_max = Math.max(this.fps, this.fps_max);\n\t\tif (this.fps < 59) {\n\t\t\tmargin = 10;\n\t\t} else {\n\t\t\tmargin = Math.floor((1000 / this.fps) * 0.8);\n\t\t}\n\t\ttime = performance.now();\n\t\t// Allocate 100ms time budget for main thread to prevent interrupting draw() mid-frame\n\t\t// This ensures smooth rendering even under heavy computational load\n\t\ttime_limit = time + 100;\n\t\ttime_out = this.system.preemptive ? time_limit : Infinity;\n\t\tprocessor = this.main_thread.processor;\n\t\tif (!processor.done) {\n\t\t\tif (this.main_thread.sleep_until != null) {\n\t\t\t\tif (performance.now() >= this.main_thread.sleep_until) {\n\t\t\t\t\tdelete this.main_thread.sleep_until;\n\t\t\t\t\tthis.process(this.main_thread, time_out);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.process(this.main_thread, time_out);\n\t\t\t}\n\t\t}\n\t\twhile (processor.done && performance.now() < time_out && this.main_thread.loadNext()) {\n\t\t\tthis.process(this.main_thread, time_out);\n\t\t}\n\t\t// Secondary threads receive remaining time budget after main thread completes\n\t\t// This prevents background tasks from impacting frame rate and ensures main thread priority\n\t\ttime_limit = time + margin;\n\t\ttime_out = this.system.preemptive ? time_limit : Infinity;\n\n\t\t// Record frame metrics in profiler for performance analysis\n\t\tif (this.main_thread.processor.profilingEnabled) {\n\t\t\tthis.profiler.frame();\n\t\t}\n\n\t\tprocessing = true;\n\t\twhile (processing) {\n\t\t\tprocessing = false;\n\t\t\tref = this.threads;\n\t\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\t\tt = ref[j];\n\t\t\t\tif (t !== this.main_thread) {\n\t\t\t\t\tif (t.paused || t.terminated) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tprocessor = t.processor;\n\t\t\t\t\tif (!processor.done) {\n\t\t\t\t\t\tif (t.sleep_until != null) {\n\t\t\t\t\t\t\tif (performance.now() >= t.sleep_until) {\n\t\t\t\t\t\t\t\tdelete t.sleep_until;\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (t.start_time != null) {\n\t\t\t\t\t\tif (t.repeat) {\n\t\t\t\t\t\t\twhile (time >= t.start_time && !(t.paused || t.terminated)) {\n\t\t\t\t\t\t\t\tif (time >= t.start_time + 150) {\n\t\t\t\t\t\t\t\t\tt.start_time = time + (t.delay || 0);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tt.start_time += t.delay || 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprocessor.load(t.routine!);\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (time >= t.start_time) {\n\t\t\t\t\t\t\t\tdelete t.start_time;\n\t\t\t\t\t\t\t\tprocessor.load(t.routine!);\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt.terminated = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (performance.now() > time_limit) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Compact terminated threads using swap-and-pop (O(n) vs O(n^2) with splice)\n\t\tlet writeIdx = 1; // Preserve main thread at index 0\n\t\tfor (i = 1; i < this.threads.length; i++) {\n\t\t\tt = this.threads[i];\n\t\t\tif (t.terminated) {\n\t\t\t\tindex = this.system.threads.indexOf(t.interface);\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tconst last = this.system.threads.length - 1;\n\t\t\t\t\tif (index !== last) {\n\t\t\t\t\t\tthis.system.threads[index] = this.system.threads[last];\n\t\t\t\t\t}\n\t\t\t\t\tthis.system.threads.length--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.threads[writeIdx++] = this.threads[i];\n\t\t\t}\n\t\t}\n\t\tthis.threads.length = writeIdx;\n\t\t// Reuse variable for main thread reference to avoid allocation\n\t\tt = this.threads[0];\n\t\tdt = performance.now() - time;\n\t\tconst dt_limit = time_limit - time;\n\t\tload = (dt / dt_limit) * 100;\n\t\tthis.cpu_load = this.cpu_load * 0.9 + load * 0.1;\n\t\tthis.system.cpu_load = Math.min(100, Math.round(this.cpu_load));\n\t\treturn;\n\t}\n\n\tcreateThread(routine: Routine, delay: number, repeat: boolean): ThreadInterface {\n\t\tlet i: number;\n\t\tlet t: Thread;\n\t\tt = new Thread(this);\n\t\tt.routine = routine;\n\t\tthis.threads.push(t);\n\t\tt.start_time = performance.now() + delay - 1000 / this.fps;\n\t\tif (repeat) {\n\t\t\tt.repeat = repeat;\n\t\t\tt.delay = delay;\n\t\t}\n\t\tthis.system.threads.push(t.interface);\n\t\tfor (i = 0; i < (routine as any).import_values.length; i++) {\n\t\t\tif ((routine as any).import_values[i] === routine) {\n\t\t\t\t(routine as any).import_values[i] = t.interface;\n\t\t\t}\n\t\t}\n\t\treturn t.interface;\n\t}\n\n\tsleep(value: number): void {\n\t\tif (this.current_thread != null) {\n\t\t\tthis.current_thread.sleep_until = performance.now() + Math.max(0, value);\n\t\t}\n\t}\n}\n","import type { Processor } from \"./processor\";\n\nexport interface ProfilerMetrics {\n\tops: number;\n\ttime: number;\n\tallocations: number;\n\tframes: number;\n\tsamples: number;\n\topsPerSec: number;\n\tavgFrameTime: number;\n}\n\nconst MAX_SAMPLES = 100;\n\nexport class VMProfiler {\n\tprivate startTime: number = 0;\n\tprivate startOps: number = 0;\n\tprivate startAllocations: number = 0;\n\tprivate frameCount: number = 0;\n\tprivate sampleCount: number = 0;\n\tprivate processor: Processor;\n\n\t// Running totals for O(1) average computation\n\tprivate totalOps: number = 0;\n\tprivate totalTime: number = 0;\n\tprivate totalAllocations: number = 0;\n\tprivate totalFrames: number = 0;\n\tprivate totalOpsPerSec: number = 0;\n\tprivate totalAvgFrameTime: number = 0;\n\n\tconstructor(processor: Processor) {\n\t\tthis.processor = processor;\n\t}\n\n\tstart() {\n\t\tthis.startTime = performance.now();\n\t\tthis.startOps = (this.processor as any).metrics?.ops || 0;\n\t\tthis.startAllocations = (this.processor as any).metrics?.allocations || 0;\n\t\tthis.frameCount = 0;\n\t}\n\n\tstop(): ProfilerMetrics {\n\t\tconst endTime = performance.now();\n\t\tconst duration = endTime - this.startTime;\n\t\tconst currentOps = (this.processor as any).metrics?.ops || 0;\n\t\tconst currentAllocations = (this.processor as any).metrics?.allocations || 0;\n\t\tconst ops = currentOps - this.startOps;\n\t\tconst allocations = currentAllocations - this.startAllocations;\n\t\tconst opsPerSec = (ops / duration) * 1000;\n\t\tconst avgFrameTime = duration / (this.frameCount || 1);\n\n\t\tconst metrics: ProfilerMetrics = {\n\t\t\tops,\n\t\t\ttime: duration,\n\t\t\tallocations,\n\t\t\tframes: this.frameCount,\n\t\t\tsamples: this.sampleCount + 1,\n\t\t\topsPerSec,\n\t\t\tavgFrameTime,\n\t\t};\n\n\t\tif (this.sampleCount < MAX_SAMPLES) {\n\t\t\tthis.totalOps += ops;\n\t\t\tthis.totalTime += duration;\n\t\t\tthis.totalAllocations += allocations;\n\t\t\tthis.totalFrames += this.frameCount;\n\t\t\tthis.totalOpsPerSec += opsPerSec;\n\t\t\tthis.totalAvgFrameTime += avgFrameTime;\n\t\t\tthis.sampleCount++;\n\t\t}\n\n\t\treturn metrics;\n\t}\n\n\tframe() {\n\t\tthis.frameCount++;\n\t}\n\n\tgetAverageMetrics(): ProfilerMetrics {\n\t\tif (this.sampleCount === 0) {\n\t\t\treturn this.stop();\n\t\t}\n\n\t\treturn {\n\t\t\tops: this.totalOps / this.sampleCount,\n\t\t\ttime: this.totalTime / this.sampleCount,\n\t\t\tallocations: this.totalAllocations / this.sampleCount,\n\t\t\tframes: this.totalFrames / this.sampleCount,\n\t\t\tsamples: this.sampleCount,\n\t\t\topsPerSec: this.totalOpsPerSec / this.sampleCount,\n\t\t\tavgFrameTime: this.totalAvgFrameTime / this.sampleCount,\n\t\t};\n\t}\n\n\treset() {\n\t\tthis.sampleCount = 0;\n\t\tthis.totalOps = 0;\n\t\tthis.totalTime = 0;\n\t\tthis.totalAllocations = 0;\n\t\tthis.totalFrames = 0;\n\t\tthis.totalOpsPerSec = 0;\n\t\tthis.totalAvgFrameTime = 0;\n\t}\n}\n","/**\n * Transpiler - Transpiles bytecode to JavaScript for optimization\n *\n * Converts bytecode to optimized JavaScript for better performance.\n */\n\nimport { OPCODES, type Routine } from \"./routine\";\n\nfunction isDevelopmentMode(): boolean {\n\tconst runtime = globalThis as {\n\t\tprocess?: { env?: Record<string, string | undefined> };\n\t\tBun?: { env?: Record<string, string | undefined> };\n\t};\n\treturn runtime.process?.env?.NODE_ENV === \"development\" || runtime.Bun?.env?.NODE_ENV === \"development\";\n}\n\n/**\n * Stack - Internal stack tracking for transpiler\n */\nclass Stack {\n\tstack: string[];\n\tindex: number;\n\ttouched: Record<number, boolean>;\n\n\tconstructor() {\n\t\tthis.stack = [\"stack[stack_index]\"];\n\t\tthis.index = 0;\n\t\tthis.touched = {};\n\t}\n\n\tpush(value: string): boolean {\n\t\tthis.stack[++this.index] = value;\n\t\treturn (this.touched[this.index] = true);\n\t}\n\n\tpop(): string {\n\t\tlet res: string;\n\t\tif (this.index >= 0) {\n\t\t\tres = this.stack.splice(this.index, 1)[0];\n\t\t} else if (this.stack[this.index] != null) {\n\t\t\tres = this.stack[this.index];\n\t\t} else {\n\t\t\tres = \"stack[stack_index-\" + this.index + \"]\";\n\t\t}\n\t\tthis.index -= 1;\n\t\treturn res;\n\t}\n\n\tget(index: number = 0): string {\n\t\tlet i: number;\n\t\tif (index == null) {\n\t\t\tindex = 0;\n\t\t}\n\t\ti = this.index + index;\n\t\tif (i >= 0) {\n\t\t\treturn this.stack[i];\n\t\t} else if (this.stack[i] != null) {\n\t\t\treturn this.stack[i];\n\t\t} else {\n\t\t\treturn \"stack[stack_index-\" + -i + \"]\";\n\t\t}\n\t}\n}\n\n/**\n * Transpiler - Transpiles bytecode sequences to optimized JavaScript functions\n */\nexport class Transpiler {\n\tprivate vcount: number = 0;\n\tprivate stack?: Stack;\n\tprivate locals?: Record<number, string>;\n\tprivate variables?: Record<string, string>;\n\tprivate readonly opcodeHandlers: Record<string, (arg: any) => string | undefined>;\n\n\tconstructor() {\n\t\tthis.opcodeHandlers = {\n\t\t\tLOAD_VALUE: this.LOAD_VALUE.bind(this),\n\t\t\tLOAD_LOCAL: this.LOAD_LOCAL.bind(this),\n\t\t\tLOAD_LOCAL_OBJECT: this.LOAD_LOCAL_OBJECT.bind(this),\n\t\t\tSTORE_LOCAL: this.STORE_LOCAL.bind(this),\n\t\t\tPOP: this.POP.bind(this),\n\t\t\tCREATE_PROPERTY: this.CREATE_PROPERTY.bind(this),\n\t\t\tLOAD_PROPERTY: this.LOAD_PROPERTY.bind(this),\n\t\t\tLOAD_PROPERTY_ATOP: this.LOAD_PROPERTY_ATOP.bind(this),\n\t\t\tNEW_OBJECT: this.NEW_OBJECT.bind(this),\n\t\t\tNEW_ARRAY: this.NEW_ARRAY.bind(this),\n\t\t\tMAKE_OBJECT: this.MAKE_OBJECT.bind(this),\n\t\t\tSTORE_VARIABLE: this.STORE_VARIABLE.bind(this),\n\t\t\tSTORE_PROPERTY: this.STORE_PROPERTY.bind(this),\n\t\t};\n\t}\n\n\t/**\n\t * Transpile a routine to JavaScript\n\t */\n\ttranspile(r: Routine): void {\n\t\tfor (let i = 0; i < r.opcodes.length; i++) {\n\t\t\tconst op = OPCODES[r.opcodes[i] as keyof typeof OPCODES] as string;\n\t\t\tif (this.transpilable(op, r.arg1[i])) {\n\t\t\t\tlet j = i + 1;\n\t\t\t\twhile (\n\t\t\t\t\tj < r.opcodes.length &&\n\t\t\t\t\tr.removeable(j) &&\n\t\t\t\t\tthis.transpilable(OPCODES[r.opcodes[j] as keyof typeof OPCODES] as string, r.arg1[j])\n\t\t\t\t) {\n\t\t\t\t\tj += 1;\n\t\t\t\t}\n\t\t\t\tj -= 1;\n\t\t\t\tif (j - i >= 2) {\n\t\t\t\t\tthis.transpileSegment(r, i, j);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Transpile a segment of bytecode to JavaScript\n\t */\n\tprivate transpileSegment(r: Routine, i: number, j: number): void {\n\t\tlet comp: string | undefined;\n\t\tlet err: any;\n\t\tlet index: number | string;\n\t\tlet k: number;\n\t\tlet s: string;\n\t\tthis.vcount = 0;\n\t\tthis.stack = new Stack();\n\t\tthis.locals = {};\n\t\tthis.variables = {};\n\t\t// Body of the function\n\t\ts = \"\";\n\t\tfor (k = i; k <= j; k++) {\n\t\t\tconst op = OPCODES[r.opcodes[k] as keyof typeof OPCODES] as string;\n\t\t\tconst handler = this.opcodeHandlers[op];\n\t\t\tif (handler) {\n\t\t\t\tcomp = handler(r.arg1[k]);\n\t\t\t} else {\n\t\t\t\tcomp = undefined;\n\t\t\t}\n\t\t\tif (comp) {\n\t\t\t\ts += comp + \"\\n\";\n\t\t\t}\n\t\t}\n\t\tfor (index in this.stack!.touched) {\n\t\t\tif (this.stack!.touched[index as any]) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tif (idx < 0) {\n\t\t\t\t\ts += \"stack[stack_index-\" + Math.abs(idx) + \"] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t} else if (idx > 0) {\n\t\t\t\t\ts += \"stack[stack_index+\" + index + \"] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t} else {\n\t\t\t\t\ts += \"stack[stack_index] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.stack!.index < 0) {\n\t\t\ts += \"stack_index -= \" + Math.abs(this.stack!.index) + \" ;\\n\";\n\t\t} else if (this.stack!.index > 0) {\n\t\t\ts += \"stack_index += \" + this.stack!.index + \" ;\\n\";\n\t\t}\n\t\ts += \"return stack_index ;\\n\";\n\n\t\tif (isDevelopmentMode()) {\n\t\t\tconsole.info(\"Transpiled body:\\n\" + s);\n\t\t}\n\n\t\ttry {\n\t\t\t// Use new Function instead of eval\n\t\t\tconst f = new Function(\"stack\", \"stack_index\", \"locals\", \"locals_offset\", \"object\", \"global\", s);\n\t\t\tr.opcodes[i] = OPCODES.COMPILED;\n\t\t\tr.arg1[i] = f;\n\t\t} catch (error) {\n\t\t\terr = error;\n\t\t\tconsole.error(\"Transpilation failed:\");\n\t\t\tconsole.error(s);\n\t\t\tconsole.error(err);\n\t\t}\n\n\t\tfor (k = i + 1; k <= j; k++) {\n\t\t\tr.remove(i + 1);\n\t\t}\n\t}\n\n\t/**\n\t * Create a new variable name\n\t */\n\tprivate createVariable(): string {\n\t\treturn \"v\" + this.vcount++;\n\t}\n\n\t/**\n\t * Check if an opcode is transpilable\n\t */\n\tprivate transpilable(op: string, arg: any): boolean {\n\t\tif (op === \"LOAD_VALUE\") {\n\t\t\treturn typeof arg === \"string\" || typeof arg === \"number\";\n\t\t} else {\n\t\t\treturn this.opcodeHandlers[op] != null;\n\t\t}\n\t}\n\n\t/**\n\t * Transpile LOAD_VALUE opcode\n\t * @internal Called dynamically via transpileSegment\n\t */\n\tprivate LOAD_VALUE(arg: any): string {\n\t\tif (typeof arg === \"string\") {\n\t\t\tthis.stack!.push(' \"' + arg.replace(/\"/g, '\\\\\"') + '\" ');\n\t\t} else if (typeof arg === \"number\") {\n\t\t\tthis.stack!.push(arg + \"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Transpile LOAD_LOCAL opcode\n\t */\n\tprivate LOAD_LOCAL(arg: number): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = locals[locals_offset+\" + arg + \"] ; // LOAD_LOCAL\";\n\t}\n\n\t/**\n\t * Transpile LOAD_LOCAL_OBJECT opcode\n\t */\n\tprivate LOAD_LOCAL_OBJECT(arg: number): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tif (this.locals![arg] != null) {\n\t\t\tv = this.locals![arg];\n\t\t\tthis.stack!.push(v);\n\t\t\treturn \"if (typeof \" + v + ' != \"object\") { ' + v + \" = locals[locals_offset+\" + arg + \"] = {} } ;\";\n\t\t} else {\n\t\t\tv = this.createVariable();\n\t\t\tres =\n\t\t\t\t\"let \" +\n\t\t\t\tv +\n\t\t\t\t\" = locals[locals_offset+\" +\n\t\t\t\targ +\n\t\t\t\t\"] ;\\nif (typeof \" +\n\t\t\t\tv +\n\t\t\t\t' != \"object\") { ' +\n\t\t\t\tv +\n\t\t\t\t\" = locals[locals_offset+\" +\n\t\t\t\targ +\n\t\t\t\t\"] = {} } ;\";\n\t\t\tthis.stack!.push(v);\n\t\t\tthis.locals![arg] = v;\n\t\t\treturn res;\n\t\t}\n\t}\n\n\t/**\n\t * Transpile STORE_LOCAL opcode\n\t */\n\tprivate STORE_LOCAL(arg: number): string {\n\t\tconst v = this.stack!.get();\n\t\treturn \"locals[locals_offset+\" + arg + \"] = \" + v + \" ; // STORE_LOCAL\";\n\t}\n\n\t/**\n\t * Transpile POP opcode\n\t */\n\tprivate POP(): string {\n\t\tthis.stack!.pop();\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Transpile CREATE_PROPERTY opcode\n\t */\n\tprivate CREATE_PROPERTY(_arg: any): string {\n\t\tconst res = this.stack!.get(-2) + \"[\" + this.stack!.get(-1) + \"] = \" + this.stack!.get() + \" ;\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile LOAD_PROPERTY opcode\n\t */\n\tprivate LOAD_PROPERTY(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get() +\n\t\t\t\"] ; // LOAD_PROPERTY\\nif (\" +\n\t\t\tv +\n\t\t\t\" == null) { \" +\n\t\t\tv +\n\t\t\t\" = 0 ; }\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile LOAD_PROPERTY_ATOP opcode\n\t */\n\tprivate LOAD_PROPERTY_ATOP(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get() +\n\t\t\t\"] ; // LOAD_PROPERTY_ATOP\\nif (\" +\n\t\t\tv +\n\t\t\t\" == null) { \" +\n\t\t\tv +\n\t\t\t\" = 0 ; }\";\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile NEW_OBJECT opcode\n\t */\n\tprivate NEW_OBJECT(): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = {} ;\";\n\t}\n\n\t/**\n\t * Transpile NEW_ARRAY opcode\n\t */\n\tprivate NEW_ARRAY(): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = [] ;\";\n\t}\n\n\t/**\n\t * Transpile MAKE_OBJECT opcode\n\t */\n\tprivate MAKE_OBJECT(): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres = \"let \" + v + \" = \" + this.stack!.get() + \" ;\\nif (typeof \" + v + ' != \"object\") ' + v + \" = {} ; \";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile STORE_VARIABLE opcode\n\t */\n\tprivate STORE_VARIABLE(arg: string): string {\n\t\tif (this.variables![arg] != null) {\n\t\t\treturn this.variables![arg] + ' = object[\"' + arg + '\"] = ' + this.stack!.get() + \" ; // STORE_VARIABLE\";\n\t\t} else {\n\t\t\treturn 'object[\"' + arg + '\"] = ' + this.stack!.get() + \" ; // STORE_VARIABLE\";\n\t\t}\n\t}\n\n\t/**\n\t * Transpile STORE_PROPERTY opcode\n\t */\n\tprivate STORE_PROPERTY(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-2) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"] = \" +\n\t\t\tthis.stack!.get(0) +\n\t\t\t\" ; // STORE_PROPERTY\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n}\n","/**\n * Storage service - localStorage wrapper with automatic serialization\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\n\nexport class StorageService {\n\tprivate namespace: string;\n\tprivate cache: Map<string, any> = new Map();\n\tprivate pendingWrites: Map<string, any> = new Map();\n\tprivate writeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate runtime?: any;\n\n\tconstructor(namespace = \"/l8b\", preserve = false, runtime?: any) {\n\t\tthis.namespace = namespace;\n\t\tthis.runtime = runtime;\n\n\t\t// Clear storage if not preserving\n\t\tif (!preserve && typeof localStorage !== \"undefined\") {\n\t\t\tthis.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Get value from storage\n\t */\n\tget(name: string): any {\n\t\t// Validate storage key\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7063, { key: String(name) });\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check cache first\n\t\tif (this.cache.has(name)) {\n\t\t\treturn this.cache.get(name);\n\t\t}\n\n\t\t// Try localStorage\n\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\ttry {\n\t\t\t\tconst key = `${this.namespace}.${name}`;\n\t\t\t\tconst value = localStorage.getItem(key);\n\t\t\t\tif (value !== null) {\n\t\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\t\tthis.cache.set(name, parsed);\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7062, { error: `Get operation failed: ${String(err)}` });\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Set value in storage (batched write)\n\t */\n\tset(name: string, value: any): void {\n\t\t// Validate storage key\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7063, { key: String(name) });\n\t\t\treturn;\n\t\t}\n\n\t\t// Update cache\n\t\tthis.cache.set(name, value);\n\n\t\t// Queue write\n\t\tthis.pendingWrites.set(name, value);\n\n\t\t// Schedule batch write\n\t\tif (this.writeTimer === null) {\n\t\t\tconst schedule =\n\t\t\t\ttypeof window !== \"undefined\" && typeof window.setTimeout === \"function\"\n\t\t\t\t\t? window.setTimeout.bind(window)\n\t\t\t\t\t: setTimeout;\n\n\t\t\tthis.writeTimer = schedule(() => {\n\t\t\t\tthis.flush();\n\t\t\t}, 100);\n\t\t}\n\t}\n\n\t/**\n\t * Flush pending writes to localStorage\n\t */\n\tflush(): void {\n\t\tif (this.writeTimer !== null) {\n\t\t\tclearTimeout(this.writeTimer);\n\t\t\tthis.writeTimer = null;\n\t\t}\n\n\t\tif (typeof localStorage === \"undefined\") {\n\t\t\tthis.pendingWrites.clear();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [name, value] of this.pendingWrites) {\n\t\t\ttry {\n\t\t\t\tconst key = `${this.namespace}.${name}`;\n\t\t\t\tconst serialized = JSON.stringify(this.sanitize(value));\n\t\t\t\tlocalStorage.setItem(key, serialized);\n\t\t\t} catch (err: any) {\n\t\t\t\t// Check for quota exceeded error\n\t\t\t\tif (err.name === \"QuotaExceededError\" || err.code === 22) {\n\t\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7061, {});\n\t\t\t\t} else {\n\t\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7062, { error: `Set operation failed: ${String(err)}` });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.pendingWrites.clear();\n\t}\n\n\t/**\n\t * Check if there are pending writes and flush if needed\n\t */\n\tcheck(): void {\n\t\tif (this.pendingWrites.size > 0) {\n\t\t\tthis.flush();\n\t\t}\n\t}\n\n\t/**\n\t * Delete a single key from storage (cache + localStorage + any pending write)\n\t */\n\tdelete(name: string): void {\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7063, { key: String(name) });\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove from in-memory state\n\t\tthis.cache.delete(name);\n\t\tthis.pendingWrites.delete(name);\n\n\t\t// Remove from localStorage\n\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\ttry {\n\t\t\t\tlocalStorage.removeItem(`${this.namespace}.${name}`);\n\t\t\t} catch (err: any) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7062, {\n\t\t\t\t\terror: `Delete operation failed: ${String(err)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all storage for this namespace\n\t */\n\tclear(): void {\n\t\tif (typeof localStorage === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst prefix = `${this.namespace}.`;\n\t\tconst keysToRemove: string[] = [];\n\n\t\t// Find all keys with this namespace\n\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\tconst key = localStorage.key(i);\n\t\t\tif (key && key.startsWith(prefix)) {\n\t\t\t\tkeysToRemove.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Remove them\n\t\tfor (const key of keysToRemove) {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\n\t\t// Clear cache\n\t\tthis.cache.clear();\n\t\tthis.pendingWrites.clear();\n\t}\n\n\t/**\n\t * Sanitize value for JSON serialization\n\t * Removes functions and handles circular references\n\t */\n\tprivate sanitize(value: any, seen = new WeakSet()): any {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Primitives\n\t\tif (typeof value !== \"object\") {\n\t\t\t// Remove functions\n\t\t\tif (typeof value === \"function\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\t// Check for circular reference\n\t\tif (seen.has(value)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tseen.add(value);\n\n\t\t// Arrays\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.map((item) => this.sanitize(item, seen)).filter((item) => item !== undefined);\n\t\t}\n\n\t\t// Objects\n\t\tconst result: any = {};\n\t\tfor (const key in value) {\n\t\t\tif (Object.hasOwn(value, key)) {\n\t\t\t\tconst sanitized = this.sanitize(value[key], seen);\n\t\t\t\tif (sanitized !== undefined) {\n\t\t\t\t\tresult[key] = sanitized;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate interfaceCache: {\n\t\tset: (name: string, value: unknown) => void;\n\t\tget: (name: string) => unknown;\n\t\tdelete: (name: string) => void;\n\t} | null = null;\n\n\t/**\n\t * Get storage interface for game code\n\t */\n\tgetInterface() {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\t\tthis.interfaceCache = {\n\t\t\tset: (name: string, value: any) => this.set(name, value),\n\t\t\tget: (name: string) => this.get(name),\n\t\t\tdelete: (name: string) => this.delete(name),\n\t\t};\n\t\treturn this.interfaceCache;\n\t}\n}\n","/**\n * VM Context creation utilities\n */\n\nimport { Random } from \"@al8b/lootiscript\";\nimport type { GlobalAPI, MetaFunctions, VMContext } from \"./types\";\n\n// Shared math lambdas — allocated once, reused across all VM instances\nconst _baseMeta = {\n\tround: (x: number) => Math.round(x),\n\tfloor: (x: number) => Math.floor(x),\n\tceil: (x: number) => Math.ceil(x),\n\tabs: (x: number) => Math.abs(x),\n\tmin: (x: number, y: number) => Math.min(x, y),\n\tmax: (x: number, y: number) => Math.max(x, y),\n\tsqrt: (x: number) => Math.sqrt(x),\n\tpow: (x: number, y: number) => x ** y,\n\tsin: (x: number) => Math.sin(x),\n\tcos: (x: number) => Math.cos(x),\n\ttan: (x: number) => Math.tan(x),\n\tasin: (x: number) => Math.asin(x),\n\tacos: (x: number) => Math.acos(x),\n\tatan: (x: number) => Math.atan(x),\n\tatan2: (y: number, x: number) => Math.atan2(y, x),\n\tsind: (x: number) => Math.sin((x / 180) * Math.PI),\n\tcosd: (x: number) => Math.cos((x / 180) * Math.PI),\n\ttand: (x: number) => Math.tan((x / 180) * Math.PI),\n\tasind: (x: number) => (Math.asin(x) * 180) / Math.PI,\n\tacosd: (x: number) => (Math.acos(x) * 180) / Math.PI,\n\tatand: (x: number) => (Math.atan(x) * 180) / Math.PI,\n\tatan2d: (y: number, x: number) => (Math.atan2(y, x) * 180) / Math.PI,\n\tlog: (x: number) => Math.log(x),\n\texp: (x: number) => Math.exp(x),\n\trandom: new Random(0),\n\tPI: Math.PI,\n\ttrue: 1 as const,\n\tfalse: 0 as const,\n};\n\nconst _defaultPrint = (text: any) => console.log(text);\n\n/**\n * Create meta functions (built-in functions)\n */\nexport function createMetaFunctions(customPrint?: (text: any) => void): MetaFunctions {\n\treturn {\n\t\t..._baseMeta,\n\t\tprint: customPrint ?? _defaultPrint,\n\t};\n}\n\n/**\n * Create VM context\n */\nexport function createVMContext(meta: Partial<MetaFunctions>, global: Partial<GlobalAPI>): VMContext {\n\tconst fullMeta: MetaFunctions = {\n\t\t..._baseMeta,\n\t\tprint: meta.print ?? _defaultPrint,\n\t\t...meta,\n\t};\n\n\treturn {\n\t\tmeta: fullMeta as MetaFunctions,\n\t\tglobal: global as GlobalAPI,\n\t\tlocal: global,\n\t\tobject: global,\n\t\tbreakable: 0,\n\t\tcontinuable: 0,\n\t\treturnable: 0,\n\t\tstack_size: 0,\n\t\ttimeout: Date.now() + 3000,\n\t\twarnings: {\n\t\t\tusing_undefined_variable: {},\n\t\t\tassigning_field_to_undefined: {},\n\t\t\tinvoking_non_function: {},\n\t\t\tassigning_api_variable: {},\n\t\t\tassignment_as_condition: {},\n\t\t},\n\t};\n}\n","/**\n * Array extensions\n */\n\n/**\n * Setup array extensions\n */\nexport function setupArrayExtensions(): void {\n\t// Insert element at beginning of array (returns the inserted element)\n\tif (!Array.prototype.insert) {\n\t\tArray.prototype.insert = function (element: any) {\n\t\t\tthis.splice(0, 0, element);\n\t\t\treturn element;\n\t\t};\n\t}\n\n\t// Insert element at specific index (returns the inserted element)\n\tif (!Array.prototype.insertAt) {\n\t\tArray.prototype.insertAt = function (element: any, index: number) {\n\t\t\tif (index >= 0 && index < this.length) {\n\t\t\t\tthis.splice(index, 0, element);\n\t\t\t} else {\n\t\t\t\tthis.push(element);\n\t\t\t}\n\t\t\treturn element;\n\t\t};\n\t}\n\n\t// Remove element at index (returns removed element or 0 if out of bounds)\n\tif (!Array.prototype.remove) {\n\t\tArray.prototype.remove = function (index: number) {\n\t\t\tif (index >= 0 && index < this.length) {\n\t\t\t\treturn this.splice(index, 1)[0];\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t}\n\n\t// Remove first occurrence of element (returns removed element or 0 if not found)\n\tif (!Array.prototype.removeElement) {\n\t\tArray.prototype.removeElement = function (element: any) {\n\t\t\tconst index = this.indexOf(element);\n\t\t\tif (index >= 0) {\n\t\t\t\treturn this.splice(index, 1)[0];\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t}\n\n\t// Check if array contains element (returns 1 if found, 0 if not found)\n\tif (!Array.prototype.contains) {\n\t\tArray.prototype.contains = function (element: any) {\n\t\t\treturn this.indexOf(element) >= 0 ? 1 : 0;\n\t\t};\n\t}\n\n\t// Sort array with optional comparator function\n\tif (!Array.prototype.sortList) {\n\t\tArray.prototype.sortList = function (fn?: (a: any, b: any) => number) {\n\t\t\tif (fn) {\n\t\t\t\treturn this.sort(fn);\n\t\t\t}\n\t\t\treturn this.sort();\n\t\t};\n\t}\n}\n\n// TypeScript type declarations for Array prototype extensions\ndeclare global {\n\tinterface Array<T> {\n\t\tinsert(element: T): T;\n\t\tinsertAt(element: T, index: number): T;\n\t\tremove(index: number): T | 0;\n\t\tremoveElement(element: T): T | 0;\n\t\tcontains(element: T): 0 | 1;\n\t\tsortList(fn?: (a: T, b: T) => number): T[];\n\t}\n}\n","/**\n * L8BVM - Virtual Machine wrapper for lootiscript\n *\n * High-level interface for the LootiScript virtual machine.\n * Wraps the core Compiler, Processor, and Runner into a usable engine component.\n * Handles context creation, storage persistence, and error formatting.\n *\n * Responsibilities:\n * - Create and manage VM execution context\n * - Provide clean API for running code and calling functions\n * - Handle storage persistence\n * - Format and normalize runtime errors\n *\n * @module vm\n */\n\nimport type { CompiledModuleArtifact, SerializedRoutineData } from \"@al8b/framework-shared\";\nimport { StorageService } from \"@al8b/io\";\nimport { Routine, Runner } from \"@al8b/lootiscript\";\nimport { createVMContext } from \"./context\";\nimport { setupArrayExtensions } from \"./extensions\";\nimport type { ErrorInfo, GlobalAPI, MetaFunctions, VMContext } from \"./types\";\n\n/**\n * Extract normalized ErrorInfo from a caught exception.\n * Centralizes the error-parsing logic shared across run(), call(), and loadRoutine().\n */\nfunction extractErrorInfo(err: any, fallbackFile: string, fallbackType: string, runner?: Runner): ErrorInfo {\n\tconst errorMessage =\n\t\ttypeof err === \"object\" && err !== null && \"error\" in err && typeof err.error === \"string\"\n\t\t\t? err.error\n\t\t\t: err?.message ?? String(err);\n\n\tlet stackTrace = err?.stackTrace;\n\tif (!stackTrace && (runner as any)?.main_thread?.processor?.generateStackTrace) {\n\t\tstackTrace = (runner as any).main_thread.processor.generateStackTrace();\n\t}\n\n\treturn {\n\t\terror: errorMessage,\n\t\ttype: err?.type ?? fallbackType,\n\t\tline: err?.line,\n\t\tcolumn: err?.column,\n\t\tfile: err?.file ?? fallbackFile,\n\t\tstack: err?.stack,\n\t\tstackTrace,\n\t};\n}\n\nexport class L8BVM {\n\tpublic context: VMContext;\n\tpublic runner: Runner;\n\tpublic storage_service: StorageService;\n\tpublic error_info: ErrorInfo | null = null;\n\n\tconstructor(\n\t\tmeta: Partial<MetaFunctions> = {},\n\t\tglobal: Partial<GlobalAPI> = {},\n\t\tnamespace = \"/l8b\",\n\t\tpreserve_ls = false,\n\t) {\n\t\t// Initialize VM execution context with meta functions and global API\n\t\tthis.context = createVMContext(meta, global);\n\n\t\t// Initialize storage service for persistent data (localStorage/sessionStorage)\n\t\tthis.storage_service = new StorageService(namespace, preserve_ls);\n\n\t\t// Inject storage API into global scope for LootiScript access\n\t\tthis.context.global.storage = this.storage_service.getInterface();\n\n\t\t// Create Runner instance with reference to this VM for bidirectional communication\n\t\tthis.runner = new Runner(this as any);\n\n\t\t// Initialize Runner and create main execution thread\n\t\tthis.runner.init();\n\n\t\t// Add custom array methods to Array.prototype for LootiScript\n\t\tsetupArrayExtensions();\n\t}\n\n\t/**\n\t * Run source code\n\t *\n\t * Compiles and executes a string of LootiScript code.\n\t *\n\t * @param {string} source - The source code to execute\n\t * @param {number} [timeout=3000] - Execution time limit in ms\n\t * @param {string} [filename=\"\"] - Filename for error reporting\n\t * @returns {any} The result of the last statement execution\n\t * @throws {ErrorInfo} If compilation or execution fails\n\t */\n\trun(source: string, timeout = 3000, filename = \"\"): any {\n\t\tthis.error_info = null;\n\t\tthis.context.timeout = Date.now() + timeout;\n\t\tthis.context.stack_size = 0;\n\n\t\ttry {\n\t\t\tconst result = this.runner.run(source, filename);\n\t\t\tthis.storage_service.check();\n\n\t\t\tif (result !== null && result !== undefined) {\n\t\t\t\treturn this.runner.toString(result);\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, filename, \"runtime\", this.runner);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Call a global function\n\t *\n\t * Executes a specific function defined in the global scope.\n\t * Useful for game loop hooks (update, draw) or event handlers.\n\t *\n\t * @param {string} name - Name of the function to call\n\t * @param {any[]} [args=[]] - Arguments to pass to the function\n\t * @param {number} [timeout=3000] - Execution time limit in ms\n\t * @returns {any} The return value of the function\n\t * @throws {ErrorInfo} If the function doesn't exist or execution fails\n\t */\n\tcall(name: string, args: any[] = [], timeout = 3000): any {\n\t\tthis.error_info = null;\n\t\tthis.context.timeout = Date.now() + timeout;\n\t\tthis.context.stack_size = 0;\n\n\t\ttry {\n\t\t\tconst result = this.runner.call(name, ...args);\n\t\t\tthis.storage_service.check();\n\t\t\treturn result;\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, name, \"call\", this.runner);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Load a pre-compiled routine (for production builds)\n\t *\n\t * Loads bytecode directly into the VM, bypassing the compilation step.\n\t * Used in production to improve startup time and obfuscate source.\n\t *\n\t * @param {any} routineData - Either a Routine instance or serialized JSON\n\t * @param {string} [filename=\"\"] - Name of the file for error reporting\n\t * @throws {ErrorInfo} If loading fails\n\t */\n\tloadRoutine(routineData: any, filename: string = \"\"): void {\n\t\tthis.error_info = null;\n\n\t\ttry {\n\t\t\tlet routine: Routine;\n\n\t\t\t// Handle both Routine instances and serialized routine data\n\t\t\t// Serialized data needs to be imported first\n\t\t\tif (routineData instanceof Routine) {\n\t\t\t\troutine = routineData;\n\t\t\t} else {\n\t\t\t\troutine = new Routine(0).import(normalizeSerializedRoutine(routineData));\n\t\t\t}\n\n\t\t\t// Add to main thread for execution\n\t\t\tthis.runner.main_thread.addCall(routine);\n\t\t\tthis.runner.tick();\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, filename, \"compile\");\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Clear warnings\n\t */\n\tclearWarnings(): void {\n\t\tthis.context.warnings = {\n\t\t\tusing_undefined_variable: {},\n\t\t\tassigning_field_to_undefined: {},\n\t\t\tinvoking_non_function: {},\n\t\t\tassigning_api_variable: {},\n\t\t\tassignment_as_condition: {},\n\t\t};\n\t}\n\n\t/**\n\t * Get warnings\n\t */\n\tgetWarnings(): Record<string, any> {\n\t\treturn this.context.warnings || {};\n\t}\n\n\t/**\n\t * Convert value to string (for printing)\n\t */\n\ttoString(value: any): string {\n\t\treturn this.runner.toString(value);\n\t}\n}\n\nfunction normalizeSerializedRoutine(routineData: CompiledModuleArtifact | SerializedRoutineData): SerializedRoutineData {\n\tif (isCompiledModuleArtifact(routineData)) {\n\t\treturn routineData.routine;\n\t}\n\n\treturn routineData;\n}\n\nfunction isCompiledModuleArtifact(value: unknown): value is CompiledModuleArtifact {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"format\" in value &&\n\t\t(value as { format?: unknown }).format === \"l8b-compiled-routine\" &&\n\t\t\"routine\" in value\n\t);\n}\n","// VM public surface — StorageService is intentionally NOT re-exported here.\n// Import it directly from \"@al8b/io\" if you need it.\nexport { createMetaFunctions, createVMContext } from \"./context\";\nexport { setupArrayExtensions } from \"./extensions\";\nexport { L8BVM } from \"./l8bvm\";\nexport type {\n\tErrorInfo,\n\tGlobalAPI,\n\tMetaFunctions,\n\tPlayerAPI,\n\tSystemAPI,\n\tVMContext,\n\tVMWarnings,\n\tWarningInfo,\n} from \"./types\";\n\n// Re-export language primitives that runtime and host code legitimately need.\n// This keeps runtime from bypassing the vm layer and importing lootiscript directly.\nexport { Random, Routine } from \"@al8b/lootiscript\";\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","import { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): 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\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Keyboard state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Mouse state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Touch state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7051, { device: \"gamepad\" });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n}\n","/**\n * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\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","/**\n * Palette - Color palette management\n */\n\nimport { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport type { ColorHex, ColorRGB, PaletteData } from \"../types\";\n\n/** Matches a valid 6-digit hex color string, e.g. \"#1A2B3C\" */\nconst HEX_COLOR_REGEX = /^#[0-9A-Fa-f]{6}$/;\n\nexport interface PaletteOptions {\n\tcolors?: ColorHex[];\n\tname?: string;\n}\n\nexport class Palette {\n\tprivate colors: ColorHex[];\n\tprivate name: string;\n\tprivate rgbCache: Map<number, ColorRGB>;\n\tprivate runtime?: any;\n\n\tconstructor(options: PaletteOptions | PaletteData = {}, runtime?: any) {\n\t\tthis.runtime = runtime;\n\n\t\tif (\"colors\" in options && Array.isArray(options.colors)) {\n\t\t\t// Validate palette format to ensure all colors are valid hex strings\n\t\t\tif (!this.validatePaletteFormat(options.colors)) {\n\t\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7072, { format: \"invalid color array\" });\n\t\t\t\tthis.colors = [];\n\t\t\t\tthis.name = \"Invalid\";\n\t\t\t} else {\n\t\t\t\tthis.colors = [...options.colors];\n\t\t\t\tthis.name = options.name || \"Custom\";\n\t\t\t}\n\t\t} else {\n\t\t\t// Initialize with empty palette when no valid colors provided\n\t\t\tthis.colors = [];\n\t\t\tthis.name = \"Empty\";\n\t\t}\n\n\t\tthis.rgbCache = new Map();\n\t}\n\n\t/**\n\t * Validate palette format\n\t */\n\tprivate validatePaletteFormat(colors: any[]): boolean {\n\t\tif (!Array.isArray(colors)) return false;\n\t\treturn colors.every((color) => typeof color === \"string\" && HEX_COLOR_REGEX.test(color));\n\t}\n\n\t/**\n\t * Get color by index\n\t */\n\tget(index: number): ColorHex {\n\t\t// Validate color index is a finite, non-negative number\n\t\tif (!isFinite(index) || index < 0) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7073, { index, maxIndex: this.colors.length - 1 });\n\t\t\treturn \"#000000\";\n\t\t}\n\n\t\tif (this.colors.length === 0) {\n\t\t\treturn \"#000000\";\n\t\t}\n\n\t\treturn this.colors[index % this.colors.length] || \"#000000\";\n\t}\n\n\t/**\n\t * Get color as RGB object\n\t */\n\tgetRGB(index: number): ColorRGB {\n\t\tif (this.rgbCache.has(index)) {\n\t\t\treturn this.rgbCache.get(index)!;\n\t\t}\n\n\t\tconst hex = this.get(index);\n\t\tconst rgb = this.hexToRGB(hex);\n\t\tthis.rgbCache.set(index, rgb);\n\t\treturn rgb;\n\t}\n\n\t/**\n\t * Get all colors\n\t */\n\tgetAll(): ColorHex[] {\n\t\treturn [...this.colors];\n\t}\n\n\t/**\n\t * Get palette size\n\t */\n\tget size(): number {\n\t\treturn this.colors.length;\n\t}\n\n\t/**\n\t * Get palette name\n\t */\n\tget paletteName(): string {\n\t\treturn this.name;\n\t}\n\n\t/**\n\t * Set color at index (expands palette if needed)\n\t */\n\tset(index: number, color: ColorHex): void {\n\t\t// Validate color index is a finite, non-negative number\n\t\tif (!isFinite(index) || index < 0) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7073, { index, maxIndex: this.colors.length - 1 });\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate color format matches hex pattern (#RRGGBB)\n\t\tif (!HEX_COLOR_REGEX.test(color)) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7072, { format: color });\n\t\t\treturn;\n\t\t}\n\n\t\t// Expand palette with black (#000000) if index exceeds current size\n\t\twhile (this.colors.length <= index) {\n\t\t\tthis.colors.push(\"#000000\");\n\t\t}\n\t\tthis.colors[index] = color;\n\t\tthis.rgbCache.delete(index);\n\t}\n\n\t/**\n\t * Add color to palette\n\t */\n\tadd(color: ColorHex): number {\n\t\tthis.colors.push(color);\n\t\treturn this.colors.length - 1;\n\t}\n\n\t/**\n\t * Remove color at index\n\t */\n\tremove(index: number): void {\n\t\tif (index >= 0 && index < this.colors.length) {\n\t\t\tthis.colors.splice(index, 1);\n\t\t\tthis.rgbCache.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Replace entire palette\n\t */\n\tsetPalette(colors: ColorHex[]): void {\n\t\t// Validate palette format to ensure all colors are valid hex strings\n\t\tif (!this.validatePaletteFormat(colors)) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7072, { format: \"invalid color array\" });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.colors = [...colors];\n\t\tthis.rgbCache.clear();\n\t}\n\n\t/**\n\t * Reset to original colors\n\t */\n\treset(paletteData?: PaletteData): void {\n\t\tif (paletteData) {\n\t\t\tthis.colors = [...paletteData.colors];\n\t\t\tthis.name = paletteData.name;\n\t\t}\n\t\tthis.rgbCache.clear();\n\t}\n\n\t/**\n\t * Convert hex to RGB\n\t */\n\tprivate hexToRGB(hex: ColorHex): ColorRGB {\n\t\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\t\treturn result\n\t\t\t? {\n\t\t\t\t\tr: Number.parseInt(result[1], 16),\n\t\t\t\t\tg: Number.parseInt(result[2], 16),\n\t\t\t\t\tb: Number.parseInt(result[3], 16),\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t};\n\t}\n\n\t/**\n\t * Convert RGB to hex\n\t */\n\tstatic rgbToHex(r: number, g: number, b: number): ColorHex {\n\t\treturn \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();\n\t}\n\n\t/**\n\t * Find closest color in palette\n\t */\n\tfindClosest(targetHex: ColorHex): number {\n\t\tconst target = this.hexToRGB(targetHex);\n\t\tlet closestIndex = 0;\n\t\tlet closestDistance = Number.POSITIVE_INFINITY;\n\n\t\tfor (let i = 0; i < this.colors.length; i++) {\n\t\t\tconst color = this.getRGB(i);\n\t\t\tconst distance = (target.r - color.r) ** 2 + (target.g - color.g) ** 2 + (target.b - color.b) ** 2;\n\n\t\t\tif (distance < closestDistance) {\n\t\t\t\tclosestDistance = distance;\n\t\t\t\tclosestIndex = i;\n\t\t\t}\n\t\t}\n\n\t\treturn closestIndex;\n\t}\n\n\t/**\n\t * Create a gradient between two palette colors\n\t */\n\tgradient(startIndex: number, endIndex: number, steps: number): ColorHex[] {\n\t\tconst start = this.getRGB(startIndex);\n\t\tconst end = this.getRGB(endIndex);\n\t\tconst gradient: ColorHex[] = [];\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = i / (steps - 1);\n\t\t\tconst r = Math.round(start.r + (end.r - start.r) * t);\n\t\t\tconst g = Math.round(start.g + (end.g - start.g) * t);\n\t\t\tconst b = Math.round(start.b + (end.b - start.b) * t);\n\t\t\tgradient.push(Palette.rgbToHex(r, g, b));\n\t\t}\n\n\t\treturn gradient;\n\t}\n\n\t/**\n\t * Lighten a color\n\t */\n\tlighten(index: number, amount: number = 0.2): ColorHex {\n\t\tconst color = this.getRGB(index);\n\t\tconst r = Math.min(255, Math.round(color.r + (255 - color.r) * amount));\n\t\tconst g = Math.min(255, Math.round(color.g + (255 - color.g) * amount));\n\t\tconst b = Math.min(255, Math.round(color.b + (255 - color.b) * amount));\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Darken a color\n\t */\n\tdarken(index: number, amount: number = 0.2): ColorHex {\n\t\tconst color = this.getRGB(index);\n\t\tconst r = Math.max(0, Math.round(color.r * (1 - amount)));\n\t\tconst g = Math.max(0, Math.round(color.g * (1 - amount)));\n\t\tconst b = Math.max(0, Math.round(color.b * (1 - amount)));\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Mix two colors\n\t */\n\tmix(index1: number, index2: number, ratio: number = 0.5): ColorHex {\n\t\tconst color1 = this.getRGB(index1);\n\t\tconst color2 = this.getRGB(index2);\n\t\tconst r = Math.round(color1.r + (color2.r - color1.r) * ratio);\n\t\tconst g = Math.round(color1.g + (color2.g - color1.g) * ratio);\n\t\tconst b = Math.round(color1.b + (color2.b - color1.b) * ratio);\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Export palette data\n\t */\n\ttoData(): PaletteData {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcolors: this.getAll(),\n\t\t};\n\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","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","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 * Deep clone utility using structuredClone\n */\n\n/**\n * Deep clone a value using the native structuredClone API\n * Supports all structured-cloneable types: objects, arrays, primitives, Date, Set, Map, etc.\n * Does NOT support: Functions, Symbols, DOM nodes\n *\n * @param value The value to deep clone\n * @returns A deep clone of the value\n */\nexport function deepClone(value: unknown): unknown {\n\t// Use native structuredClone if available (Node 17.5+, modern browsers)\n\tif (typeof structuredClone !== \"undefined\") {\n\t\treturn structuredClone(value);\n\t}\n\n\t// Fallback for older environments: JSON round-trip\n\t// WARNING: This loses Date, Map, Set, undefined, Function, Symbol values\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(value));\n\t} catch {\n\t\t// If JSON fails (circular reference, etc.), return the original\n\t\t// This is safe but means mutations will affect the original\n\t\treturn value;\n\t}\n}\n","/**\n * Shallow equality comparison for objects and arrays\n */\n\n/**\n * Compare two values for shallow equality\n * For objects and arrays, only checks if top-level properties have the same references\n * For primitives, uses === comparison\n *\n * @param a First value\n * @param b Second value\n * @returns true if values are shallowly equal\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n\t// Same reference\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\t// Different types\n\tif (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) {\n\t\treturn false;\n\t}\n\n\tconst aObj = a as Record<string, unknown>;\n\tconst bObj = b as Record<string, unknown>;\n\n\t// Get keys\n\tconst aKeys = Object.keys(aObj);\n\tconst bKeys = Object.keys(bObj);\n\n\t// Different number of keys\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\n\t// Check all keys have same reference values\n\tfor (const key of aKeys) {\n\t\tif (!(key in bObj) || aObj[key] !== bObj[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n"],"mappings":"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","names":["shallowEqual","SyntaxErrorCode","RuntimeErrorCode","CompilationErrorCode","SceneErrorCode","CLIErrorCode","APIErrorCode","WarningCode","DiagnosticSeverity","DiagnosticCategory","assetMessages","E7041","code","severity","Error","category","API","message","__name","args","assetName","description","suggestions","E7042","E7043","assetType","E7044","audioMessages","E7011","E7012","E7013","soundName","E7014","musicName","E7015","E7016","error","drawMessages","E7091","operation","E7092","E7093","inputMessages","E7051","device","E7052","mapMessages","E7031","E7032","x","y","E7033","spriteName","E7034","width","height","paletteMessages","E7071","paletteName","E7072","format","E7073","index","maxIndex","E7074","E7075","size","expectedSize","screenMessages","E7001","E7002","E7003","color","E7004","E7005","E7006","font","E7007","blendMode","spriteMessages","E7021","url","E7022","E7023","E7024","frame","totalFrames","storageMessages","E7061","E7062","E7063","key","timeMessages","E7081","value","E7082","E7083","E7084","validationMessages","E7100","suggestion","propertyName","objectName","apiMessages","cliMessages","E6001","CLI","String","E6002","E6003","compilationMessages","E3001","Compilation","E3002","filePath","file","E3003","runtimeMessages","E2001","Runtime","variableName","E2002","expectedType","actualType","E2003","E2004","functionName","E2005","sceneMessages","E5001","Scene","path","E5002","name","E5003","E5004","E5005","E5006","E5007","syntaxMessages","E1001","Syntax","functionStartLine","blockType","E1002","E1003","E1004","E1005","expected","E1006","E1007","keyword","E1008","E1009","type","warningMessages","W1001","Warning","W1002","W2001","apiName","W5001","sceneName","W5002","W5003","W5004","MESSAGES","getMessageTemplate","formatMessage","template","getSuggestions","formatForCLI","diagnostic","lines","indicator","push","location","line","undefined","column","context","data","length","related","stackTrace","join","formatForLSP","Math","max","endColumn","lspSeverity","Info","result","range","start","character","end","source","relatedInformation","uri","formatForBrowser","formatted","reportRuntimeError","listener","createDiagnostic","reportError","formatSimple","startsWith","A4_FREQUENCY","SEMITONE_RATIO","A4_MIDI_NOTE","Beeper","audio","notes","plainNotes","currentOctave","currentDuration","currentVolume","currentSpan","currentWaveform","initializeNotes","noteNames","i","oct","Math","floor","n","beep","input","status","sequence","loops","note","parsed","split","t","undefined","push","frequency","volume","span","duration","waveform","includes","length","lop","splice","loopto","start","repeats","tempo","Number","parseFloat","isNaN","step","addBeeps","AUDIO_WORKLET_CODE","AudioCore","context","buffer","playing","wakeupList","workletNode","beeper","runtime","masterVolume","getContext","isStarted","state","addToWakeUpList","item","interfaceCache","setVolume","max","min","getVolume","getInterface","__name","cancelBeeps","playSound","sound","pitch","pan","loopit","playMusic","music","stopAll","soundName","replace","s","sounds","reportRuntimeError","listener","APIErrorCode","E7013","play","musicName","m","E7014","AudioContextClass","window","AudioContext","webkitAudioContext","activate","resume","wakeUp","document","body","removeEventListener","addEventListener","once","blob","Blob","type","url","URL","createObjectURL","audioWorklet","addModule","AudioWorkletNode","connect","destination","flushBuffer","e","E7012","error","String","port","postMessage","getBeeper","beeps","b","sampleRate","increment","JSON","stringify","name","addPlaying","removePlaying","index","indexOf","p","stop","err","E7016","Music","ready","tag","Audio","loop","pause","v","getPosition","currentTime","getDuration","setPosition","pos","Sound","AudioBuffer","loadSound","request","XMLHttpRequest","open","responseType","onload","decodeAudioData","response","onerror","send","finished","source","createBufferSource","playbackRate","value","gain","createGain","panner","createPanner","panningModel","setPan","abs","res","setPitch","onended","createSoundClass","audiocore","MicroSound","classname","channels","createBuffer","write","channel","position","ch1","getChannelData","ch2","read","ensureCanvas","__name","state","width","height","blockWidth","blockHeight","canvas","document","createElement","expectedWidth","expectedHeight","ctx","getContext","diagnostic","createDiagnostic","APIErrorCode","E7031","formatted","formatForBrowser","Error","clearRect","animated","drawTile","sprite","gridX","gridY","parsed","frames","subX","tx","ty","subY","drawImage","queueAnimatedTile","tile","x","y","w","h","push","renderAnimatedTiles","time","performance","now","buffer","bufferCtx","len","length","frame","Math","floor","fps","normalizeRefForStorage","ref","replace","normalizeRefForUsage","parseTileRef","entry","colonIdx","indexOf","spriteName","substring","coords","commaIdx","Number","parseInt","TileMap","block_width","block_height","sprites","map","ready","needs_update","name","parsedMap","renderState","isFinite","E7034","data","clear","j","i","idx","set","normalized","get","cell","getCanvas","update","draw","context","index","loadFile","url","loaded","req","XMLHttpRequest","onreadystatechange","readyState","DONE","status","load","responseText","open","send","JSON","parse","value","clone","duplicate","copyFrom","LoadMap","UpdateMap","SaveMap","list","table","serialized","payload","stringify","BLENDING_MODES","normal","additive","MODES","mode","setColor","context","color","fillStyle","strokeStyle","setLinearGradient","x1","y1","x2","y2","c1","c2","grd","createLinearGradient","addColorStop","setRadialGradient","x","y","radius","createRadialGradient","createDefaultContextState","centered","alpha","pixelated","line_width","translation_x","translation_y","rotation","scale_x","scale_y","image_transform","anchor_x","anchor_y","object_rotation","object_scale_x","object_scale_y","font","updateImageTransform","state","initDrawOp","object_transform","res","save","translate","scale","rotate","Math","PI","closeDrawOp","restore","fillRect","w","h","globalAlpha","fillRoundRect","round","fillRound","abs","beginPath","ellipse","fill","drawRect","lineWidth","strokeRect","drawRoundRect","strokeRoundRect","drawRound","stroke","drawLine","transform","moveTo","lineTo","loadedFonts","Set","loadingFonts","Map","loadFont","has","Promise","resolve","get","document","promise","fonts","load","then","add","delete","catch","set","isFontReady","check","clearFontCache","clear","resolveStringMap","__name","name","playerRuntime","globalThis","player","runtime","directMaps","maps","screenMaps","screen","drawMap","map","resolvedMap","ready","draw","imageSmoothingEnabled","pixelDataCache","setRGB","r","g","b","createImageData","data","R","G","B","putImageData","setRGBA","a","A","getRGB","result","d","getImageData","getRGBA","drawPolyline","args","Array","isArray","length","len","floor","i","drawPolygon","closePath","fillPolygon","drawQuadCurve","index","quadraticCurveTo","drawBezierCurve","bezierCurveTo","drawArc","angle1","angle2","ccw","arc","fillArc","getSpriteFrame","sprite","canvas","image","frames","animation_start","Date","now","dt","fps","frame","drawSprite","width","height","drawImage","drawSpritePart","sx","sy","sw","sh","textWidth","text","size","measureText","drawText","textAlign","textBaseline","fillText","drawTextOutline","strokeText","setTranslation","isFinite","setScale","setRotation","setDrawAnchor","setDrawRotation","setDrawScale","splitColorArg","points","slice","undefined","Image","_canvas","_context","_image","_state","_centered","widthOrImage","createElement","initContext","getContext","lineCap","c","s","blending_save","globalCompositeOperation","setAlpha","setPixelated","setBlending","blending","setLineWidth","setLineDash","dash","setFont","drawImagePart","Sprite","name","frames","animation_start","fps","ready","width","height","push","Image","setFPS","dt","frame","Date","now","length","newDt","setFrame","getFrame","Math","floor","getCurrentFrameCanvas","canvas","resolveFrameCount","imgWidth","imgHeight","requested","available","min","LoadSprite","url","properties","loaded","sprite","img","window","location","protocol","crossOrigin","src","onload","numframes","round","i","initContext","ctx","context","setTransform","drawImage","onerror","UpdateSprite","DEFAULT_FPS","DEFAULT_UPDATE_RATE","FRAME_TIME_MS","PAUSE_THRESHOLD_MS","DEFAULT_BLOCK_SIZE","LOADING_BAR_THROTTLE_MS","ASSET_LOAD_TIMEOUT_MS","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","PlayerService","delegate","interfaceCache","getInterface","iface","pause","__name","resume","postMessage","message","setFps","fps","isFinite","setUpdateRate","Object","defineProperty","get","getFps","enumerable","getUpdateRate","set","value","DEFAULT_PATH","PARAM_PATTERN","PARAM_REPLACEMENT","isBrowser","window","safeExecute","fn","errorHandler","context","error","undefined","isValidString","value","length","isValidObject","Array","isArray","normalizeScenePath","path","cleanPath","split","startsWith","RouteManager","routes","register","sceneName","validateRouteInputs","regex","keys","parsePath","push","match","route","tryMatchRoute","regexMatch","exec","params","extractParams","forEach","key","index","pattern","replace","_","RegExp","clear","Router","routeManager","sceneManager","state","setupPopStateListener","addEventListener","handlePathChange","location","pathname","validatePath","normalizedPath","updateBrowserHistory","back","history","getState","method","pushState","replaceState","updateStateWithMatch","handleNoRouteMatch","setActiveScene","hasActiveScene","activateFirstAvailableScene","availableScenes","registry","getNames","firstScene","init","initialPath","ensureActiveScene","getInterface","routerInterface","__name","getPath","getParams","getSceneName","Object","defineProperty","get","enumerable","configurable","SceneRegistry","scenes","Map","name","definition","set","has","from","SceneError","Error","message","captureStackTrace","SceneNotFoundError","SceneManager","router","activeSceneName","activeScene","onError","registerScene","validateSceneRegistration","registerRoute","newScene","handleSceneNotFound","isSameScene","handleSameSceneActivation","transitionToScene","console","scene","_name","onEnter","leaveCurrentScene","activateNewScene","onLeave","initializeSceneIfNeeded","enterScene","_initialized","update","draw","getCurrentSceneName","getCurrentScene","interfaceCache","def","goto","current","ZBuffer","buffer","width","height","Float32Array","clear","fill","get","x","y","set","z","resize","edgeFn","a","b","c","getSpritePixel","sprite","u","v","runtime","canvas","sprites","spriteObj","frames","Math","floor","px","py","ctx","getContext","imageData","getImageData","r","data","g","e","getMapPixel","map","mapObj","getCanvas","maps","drawTexturedTriangle","v0","v1","v2","texture","textureSource","zBuffer","useDepth","context","pixelated","minX","max","min","minY","maxX","ceil","maxY","area","abs","useZ","w0","w1","w2","u0","u1","u2","v0v","v1v","v2v","pixels","p","w0b","w1b","w2b","bary0","bary1","bary2","currentZ","w","pixel","idx","imageSmoothingEnabled","putImageData","drawTriangle","color","fillStyle","beginPath","moveTo","lineTo","closePath","drawTriangleOutline","lineWidth","strokeStyle","stroke","BaseScreen","alpha","line_width","font","translation_x","translation_y","rotation","scale_x","scale_y","screen_transform","object_rotation","object_scale_x","object_scale_y","anchor_x","anchor_y","blending","font_load_requested","font_loaded","interfaceCache","cursor","cursor_visibility","last_mouse_move","Date","now","options","document","createElement","initContext","normal","additive","blendModes","mode","loadFont","addEventListener","style","setInterval","checkMouseCursor","diagnostic","createDiagnostic","APIErrorCode","E7001","formatted","formatForBrowser","reportRuntimeError","listener","Error","restore","save","translate","ratio","scale","lineCap","initDraw","updateInterface","globalAlpha","globalCompositeOperation","fillRect","setColor","Number","isNaN","parseInt","String","num","hex","toString","substring","isValidColor","test","E7003","setAlpha","setPixelated","setBlending","blend","E7007","blendMode","setLineWidth","setLineDash","dash","Array","isArray","setLinearGradient","x1","y1","x2","y2","c1","c2","grd","createLinearGradient","addColorStop","setRadialGradient","radius","createRadialGradient","setFont","fonts","load","catch","E7006","isFontReady","ready","check","setTranslation","tx","ty","isFinite","updateScreenTransform","setScale","setRotation","setDrawAnchor","ax","ay","setDrawRotation","setDrawScale","initDrawOp","object_transform","res","rotate","PI","closeDrawOp","setCursorVisible","visible","E7002","PrimitiveScreen","h","E7092","E7093","error","fillRoundRect","round","transform","rx","ry","roundRect","quadraticCurveTo","fillRound","ellipse","drawRect","strokeRect","drawRoundRect","drawRound","drawLine","drawPolygon","args","points","extractPoints","length","len","i","drawPolyline","fillPolygon","drawQuadCurve","index","drawBezierCurve","bezierCurveTo","drawArc","angle1","angle2","ccw","arc","fillArc","slice","SpriteScreen","_lastImageSmoothing","_frameTime","performance","setImageSmoothing","smooth","getSpriteFrame","frame","spriteName","parts","split","E7004","image","E7005","animation_start","dt","fps","drawSprite","drawX","drawY","halfW","halfH","drawImage","drawSpritePart","sx","sy","sw","sh","drawMap","draw","TextScreen","_cachedFontSize","_cachedFontName","_cachedFontString","getFontString","size","textWidth","text","measureText","drawText","textAlign","textBaseline","fillText","drawTextOutline","strokeText","TriangleScreen","tri","x3","y3","trib","ttri","u3","v3","z1","z2","z3","canvasWidth","canvasHeight","toCanvasX","__name","toCanvasY","Screen","getInterface","screen","DEFAULT_RECORD_BUFFER_FRAMES","DEFAULT_LOOP_BUFFER_FRAMES","deepCopy","value","excluded","includes","Array","isArray","result","i","length","key","Object","hasOwn","StatePlayer","looping","loopStart","loopIndex","loopLength","loopCallback","isLooping","startLoop","position","callback","Math","max","stopLoop","updateLoop","executeCallback","restoreState","target","snapshot","isProtectedKey","protected_keys","StateRecorder","history","recordIndex","recordLength","maxLength","setExcluded","record","state","makeStorableState","min","getState","index","getLength","getMaxLength","clear","trimTo","histo","start","end","push","TimeMachine","runtime","recorder","player","recording","replayPosition","statusCallback","setupExclusions","vm","context","global","random","screen","audio","keyboard","mouse","touch","gamepad","system","storage","host","session","memory","step","sendStatus","err","reportRuntimeError","listener","APIErrorCode","E7082","error","String","messageReceived","data","command","startRecording","stopRecording","stepBackward","stepForward","setReplayPosition","startLooping","stopLooping","E7083","replay","isFinite","E7081","pos","round","skipDraw","drawCall","updateCall","loopStep","onStatus","isRecording","JSONLib","encode","__name","value","JSON","stringify","error","decode","json","parse","pretty","indent","ListLib","map","arr","fn","filter","reduce","initial","find","findIndex","some","every","reverse","slice","sort","start","end","concat","arrays","flat","depth","flatMap","indexOf","item","fromIndex","lastIndexOf","includes","length","first","last","at","index","normalized","push","items","pop","shift","unshift","splice","deleteCount","fill","join","separator","unique","Set","shuffle","result","i","j","Math","floor","random","chunk","size","sum","average","min","max","MathLib","abs","x","sqrt","ceil","round","args","pow","base","exp","log","log10","sin","cos","tan","asin","acos","atan","atan2","y","randomInt","randomFloat","PI","E","clamp","lerp","a","b","t","distance","x1","y1","x2","y2","distance3D","z1","z2","angleBetween","degToRad","degrees","radToDeg","radians","sign","mod","n","m","StringLib","split","str","trim","trimStart","trimEnd","replace","search","replacement","replaceAll","startsWith","prefix","endsWith","suffix","contains","toLowerCase","toUpperCase","charAt","charCodeAt","fromCharCode","codes","String","substring","repeat","count","padStart","pad","padEnd","parseInt","radix","Number","isNaN","parseFloat","format","template","match","argIndex","Random","_seed","a","b","size","mask","norm","hash","Math","random","nextSeed","next","nextInt","num","floor","seed","clone","Token","tokenizer","type","value","string_value","line","column","start","length","index","reserved_keyword","is_binary_operator","token_start","TYPE_IDENTIFIER","Object","hasOwn","predefined","String","toString","TYPE_EQUALS","TYPE_DOUBLE_EQUALS","TYPE_GREATER","TYPE_GREATER_OR_EQUALS","TYPE_LOWER","TYPE_LOWER_OR_EQUALS","TYPE_UNEQUALS","TYPE_NUMBER","TYPE_STRING","TYPE_OPEN_BRACE","TYPE_CLOSED_BRACE","TYPE_OPEN_BRACKET","TYPE_CLOSED_BRACKET","TYPE_COMMA","TYPE_DOT","TYPE_COLON","TYPE_PLUS","TYPE_MINUS","TYPE_MULTIPLY","TYPE_DIVIDE","TYPE_POWER","TYPE_MODULO","TYPE_BINARY_AND","TYPE_BINARY_OR","TYPE_SHIFT_LEFT","TYPE_SHIFT_RIGHT","TYPE_PLUS_EQUALS","TYPE_MINUS_EQUALS","TYPE_MULTIPLY_EQUALS","TYPE_DIVIDE_EQUALS","TYPE_MODULO_EQUALS","TYPE_AND_EQUALS","TYPE_OR_EQUALS","TYPE_RETURN","TYPE_BREAK","TYPE_CONTINUE","TYPE_FUNCTION","TYPE_IF","TYPE_THEN","TYPE_ELSE","TYPE_ELSIF","TYPE_END","TYPE_FOR","TYPE_TO","TYPE_BY","TYPE_IN","TYPE_WHILE","TYPE_OBJECT","TYPE_CLASS","TYPE_EXTENDS","TYPE_NEW","TYPE_ARROW","TYPE_TEMPLATE","TYPE_AFTER","TYPE_EVERY","TYPE_DO","TYPE_SLEEP","TYPE_LOCAL","TYPE_AND","TYPE_OR","TYPE_NOT","TYPE_ERROR","TYPE_DELETE","return","break","continue","function","for","to","by","in","while","if","then","else","elsif","end","object","class","extends","new","and","or","not","after","every","do","sleep","delete","local","var","let","Tokenizer","input","filename","last_column","buffer","chars","doubles","shifts","letter_regex","pushBack","token","splice","peek","finished","nextChar","ignore_comments","c","endseq","charAt","rewind","code","charCodeAt","parseDouble","parseUnequals","parseNumber","test","parseIdentifier","parseString","error","changeNumberToIdentifier","i","v","results","split","push","undefined","d","c2","_c","s","exp","pointed","Number","parseFloat","parseHexNumber","parseInt","close","count_close","n","substring","Error","OPCODES_CLASS","table","set","op","TYPE","VARIABLE_TYPE","PROPERTY_TYPE","LOAD_IMPORT","LOAD_THIS","LOAD_GLOBAL","LOAD_VALUE","LOAD_LOCAL","LOAD_VARIABLE","LOAD_LOCAL_OBJECT","LOAD_VARIABLE_OBJECT","POP","LOAD_PROPERTY","LOAD_PROPERTY_OBJECT","CREATE_OBJECT","MAKE_OBJECT","CREATE_ARRAY","STORE_LOCAL","STORE_VARIABLE","CREATE_PROPERTY","STORE_PROPERTY","DELETE","UPDATE_CLASS","CREATE_CLASS","NEW_CALL","ADD","SUB","MUL","DIV","MODULO","BINARY_AND","BINARY_OR","SHIFT_LEFT","SHIFT_RIGHT","NEGATE","EQ","NEQ","LT","GT","LTE","GTE","NOT","LOAD_PROPERTY_ATOP","JUMP","JUMPY","JUMPN","JUMPY_NOPOP","JUMPN_NOPOP","LOAD_ROUTINE","FUNCTION_CALL","FUNCTION_APPLY_VARIABLE","FUNCTION_APPLY_PROPERTY","SUPER_CALL","RETURN","FORLOOP_INIT","FORLOOP_CONTROL","FORIN_INIT","FORIN_CONTROL","UNARY_OP","BINARY_OP","COMPILED","AFTER","EVERY","DO","SLEEP","LOAD_VAR_CALL","LOAD_PROP_CALL","LOAD_CONST_ADD","LOAD_CONST_SUB","LOAD_CONST_MUL","LOAD_LOCAL_ADD","LOAD_LOCAL_SUB","LOAD_LOCAL_MUL","LOAD_CONST_DIV","LOAD_LOCAL_LT","LOAD_LOCAL_GT","LOAD_LOCAL_EQ","OPCODES","Routine","num_args","ops","opcodes","arg1","ref","label_count","labels","transpile","import_refs","import_values","import_self","locals_size","uses_arguments","as_function","callback","ics","r","createLabel","str","setLabel","name","optimize","Transpiler","removeable","label","remove","resolveLabels","opcode","args","OP","v1","OP_INSERT","variable","parent_var","self","iterator","field","f","exportArg","arg","export","import","src","expression","Compiler","predefined_unary_functions","predefined_binary_functions","Array","isArray","Expression","nowarning","nopop","Program","statements","Field","Variable","Assignment","add","statement","isAssignment","nesting","key","pref","source","Precedence","CreateFieldAccess","appendField","BuildOperations","terms","o","o1","o2","t1","t2","operation","Operation","SelfAssignment","Value","TYPE_ARRAY","identifier","chain","term1","term2","Negate","Not","Braced","Return","Condition","For","range_from","range_to","range_by","sequence","ForIn","list","While","condition","Break","Continue","Function","FunctionCall","CreateObject","fields","CreateClass","ext","NewCall","After","delay","multiplier","Every","Do","Sleep","Delete","LootiScriptError","message","file","stackTrace","msg","LootiSyntaxError","context","suggestions","related","formatSourceContext","contextLines","errorLength","lines","startLine","max","endLine","min","lineNum","prefix","lineNumStr","padStart","lineContent","baseOffset","pointer","repeat","Parser","program","current_block","current","verbose","object_nesting","not_terminated","function_stack","api_reserved","warnings","unexpected_eof","error_info","last_function_call","multipliers","millisecond","milliseconds","second","seconds","minute","minutes","hour","hours","day","days","replace","screen","audio","keyboard","gamepad","sprites","sounds","music","assets","asset_manager","maps","touch","mouse","fonts","Sound","Image","Sprite","Map","system","storage","print","List","scenes","scene","route","router","nextToken","nextTokenOptional","parse","err","nt","parseLine","ErrorCode","E1002","console","info","error1","functionName","functionStartLine","functionStartColumn","func","errorMessage","E1001","E1004","parseExpression","parseLocalAssignment","filter","first_function_call","access","parseExpressionStart","parseExpressionSuffix","assertExpression","assertBroadIdentifier","assert","parseFunctionCall","parseAssignment","parseSelfAssignment","parseBinaryOperation","parseNumberExpression","parseStringExpression","parseTemplate","parseIf","parseFor","parseWhile","parseBracedExpression","parseArray","parseFunction","parseObject","parseClass","parseNew","isInteger","parseAfter","parseEvery","parseDo","parseSleep","parseDelete","number","string","bracket","res","peekToken","assignedValue","funcToken","opStr","parseOptionalType","open","parseArrowFunction","arrow","funcArgs","default","body","brace_token","addTerminable","endTerminable","funk","parseFunctionArgs","funcInfo","pop","last","defaultExpr","warningAssignmentCondition","iftoken","parsedLine","text","fortoken","iter","parseSequence","whiletoken","start_token","tryParseMultiplier","parseBlock","keyword","endToken","do_token","del","raw","parts","indexOf","depth","inString","stringChar","char","exprSource","subParser","expr","result","routineAsFunction","runner","routine","ProcessorClass","main_thread","processor","proc","count","arguments","load","stack","stack_index","run","routineAsApplicableFunction","argToNative","IC_STATE","UNINITIALIZED","MONOMORPHIC","POLYMORPHIC","MEGAMORPHIC","MAX_POOL_SIZE","arrayPool","objectPool","getPooledArray","arr","recycleArray","getPooledObject","recycleObject","obj","resolveCallable","_routineAsApplicableFunction","dispatchBinaryOp","nativeStringOp","global","isFinite","fn","call","operatorAdd","operatorSub","operatorMul","operatorDiv","operatorBand","operatorBor","operatorModulo","operatorNegate","Processor","locals","call_stack","call_stack_frames","log","time_limit","done","local_index","op_index","call_stack_index","locals_offset","call_super","call_supername","metrics","profilingEnabled","_argv","POSITIVE_INFINITY","allocations","cacheHits","cacheMisses","reportNativeError","getArray","poolRecycleArray","getObject","poolRecycleObject","resetState","generateStackTrace","reverse","formatStackTrace","frames","map","frame","join","resolveParentClass","applyFunction","_args","resolvePropertyIC","prop","ic","state","shape","hits","misses","shapes","offsets","property","_routineAsFunction","_argToNative","argv","con","cs","fc","i1","i2","id","ir","j","k","l","len","loop_by","loop_to","m","op_count","p","parent","q","rc","ref11","ref12","ref14","ref2","ref3","ref5","ref6","ref8","ref9","restore_op_index","sleep_time","sup","t","u","w","profiling","using_undefined_variable","assigning_field_to_undefined","curr","super","supername","slice","performance","now","keys","apply","invoking_non_function","createThread","e","code_saves","break_label","continue_label","Locals","compile","optimizeFusedOpcodes","max_index","refs","varName","numArgs","val","localIdx","compileValue","compileOperation","compileAssignment","compileVariable","compileFunction","compileFunctionCall","compileWhile","compileSelfAssignment","compileBraced","compileCreateObject","compileField","compileNegate","compileFor","compileForIn","compileNot","compileReturn","compileCondition","compileBreak","compileContinue","compileCreateClass","compileNewCall","compileAfter","compileEvery","compileDo","compileSleep","compileDelete","arg_index","register","get","compileUpdateClass","jump","ref1","v2","pow","predefined_values","compileFieldParent","len1","len2","len3","len4","ref4","forloop","from","step","iterations","abs","iterValue","compileSequence","for_continue","for_end","for_start","save_break","save_continue","allocate","whiloop","compileFunctionBody","hasArgs","numargs","arguments_used","imports","imp","ret","condition_end","condition_next","formatField","dostuff","exec","round","ceil","sqrt","sin","cos","tan","acos","asin","atan","sind","__name","x","PI","cosd","tand","asind","acosd","atand","atan2","atan2d","y","true","false","compiler","layers","increment","spot","LocalLayer","start_index","registered","MAX_SAMPLES","VMProfiler","startTime","startOps","startAllocations","frameCount","sampleCount","totalOps","totalTime","totalAllocations","totalFrames","totalOpsPerSec","totalAvgFrameTime","stop","endTime","duration","currentOps","currentAllocations","opsPerSec","avgFrameTime","time","samples","getAverageMetrics","reset","Thread","loop","paused","terminated","next_calls","interface","start_time","sleep_until","pause","resume","status","addCall","loadNext","parser","updateControls","Runner","l8bvm","initialized","threads","current_thread","thread_index","fps","fps_max","cpu_load","triggers_controls_update","onNativeError","profiler","init","preemptive","getMetrics","meta","bind","MathLib","JSON","JSONLib","ListLib","StringLib","fromCharCode","assigning_api_variable","assignment_as_condition","tick","process","thread","dt","margin","processing","time_out","Infinity","writeIdx","dt_limit","isDevelopmentMode","runtime","globalThis","env","NODE_ENV","Bun","Stack","touched","vcount","variables","opcodeHandlers","NEW_OBJECT","NEW_ARRAY","transpilable","transpileSegment","comp","handler","idx","createVariable","_arg","StorageService","namespace","cache","Map","pendingWrites","writeTimer","runtime","preserve","localStorage","clear","get","name","trim","reportRuntimeError","listener","APIErrorCode","E7063","key","String","has","value","getItem","parsed","JSON","parse","set","err","E7062","error","schedule","window","setTimeout","bind","flush","clearTimeout","serialized","stringify","sanitize","setItem","code","E7061","check","size","delete","removeItem","prefix","keysToRemove","i","length","startsWith","push","seen","WeakSet","undefined","add","Array","isArray","map","item","filter","result","Object","hasOwn","sanitized","interfaceCache","getInterface","__name","_baseMeta","round","__name","x","Math","floor","ceil","abs","min","y","max","sqrt","pow","sin","cos","tan","asin","acos","atan","atan2","sind","PI","cosd","tand","asind","acosd","atand","atan2d","log","exp","random","Random","true","false","_defaultPrint","text","console","createMetaFunctions","customPrint","print","createVMContext","meta","global","fullMeta","local","object","breakable","continuable","returnable","stack_size","timeout","Date","now","warnings","using_undefined_variable","assigning_field_to_undefined","invoking_non_function","assigning_api_variable","assignment_as_condition","setupArrayExtensions","Array","prototype","insert","element","splice","insertAt","index","length","push","remove","removeElement","indexOf","contains","sortList","fn","sort","extractErrorInfo","err","fallbackFile","fallbackType","runner","errorMessage","error","message","String","stackTrace","main_thread","processor","generateStackTrace","type","line","column","file","stack","L8BVM","context","storage_service","error_info","namespace","preserve_ls","StorageService","storage","getInterface","Runner","init","run","source","filename","result","check","undefined","toString","call","name","args","loadRoutine","routineData","routine","Routine","import","normalizeSerializedRoutine","addCall","tick","clearWarnings","getWarnings","value","isCompiledModuleArtifact","format","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","createState","__name","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","clientWidth","clientHeight","left","top","KeyboardInput","dirtyKeys","Set","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","test","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","prev","clear","reset","MouseInput","middle","right","wheel","previousPressed","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","onDown","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","passive","removeEventListener","wheelEvent","deltaY","wheelDelta","detail","TouchInput","touches","Map","previousTouching","mouse","syncMouseTouch","list","id","push","size","mouseState","set","delete","onStart","handleTouchStart","handleTouchMove","onEnd","handleTouchEnd","stopPropagation","changedTouches","t","identifier","has","Input","keyboard","touch","gamepad","runtime","getKeyboard","reportRuntimeError","listener","APIErrorCode","E7052","error","getMouse","getTouch","getGamepad","E7051","device","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","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","HEX_COLOR_REGEX","Palette","colors","name","rgbCache","runtime","options","Array","isArray","validatePaletteFormat","reportRuntimeError","listener","APIErrorCode","E7072","format","Map","every","color","test","get","index","isFinite","E7073","maxIndex","length","getRGB","has","hex","rgb","hexToRGB","set","getAll","size","paletteName","push","delete","add","remove","splice","clear","setPalette","reset","paletteData","result","exec","r","Number","parseInt","g","b","rgbToHex","toString","slice","toUpperCase","findClosest","targetHex","target","closestIndex","closestDistance","POSITIVE_INFINITY","i","distance","gradient","startIndex","endIndex","steps","start","end","t","Math","round","lighten","amount","min","darken","max","mix","index1","index2","ratio","color1","color2","toData","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","deepClone","value","structuredClone","JSON","parse","stringify","shallowEqual","a","b","aObj","bObj","aKeys","Object","keys","bKeys","length","key"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../../../core/audio/src/constants.ts","../../../../core/audio/src/devices/beeper.ts","../../../../core/audio/src/core/audio-worklet.ts","../../../../core/audio/src/core/audio-core.ts","../../../../core/audio/src/devices/music.ts","../../../../core/audio/src/devices/sound.ts","../../../../core/map/src/drawing/renderer.ts","../../../../core/map/src/shared/references.ts","../../../../core/map/src/core/tile-map.ts","../../../../core/image/src/blending.ts","../../../../core/image/src/core/color.ts","../../../../core/image/src/core/context.ts","../../../../core/image/src/core/drawing.ts","../../../../core/image/src/core/font.ts","../../../../core/image/src/core/map-rendering.ts","../../../../core/image/src/core/pixel.ts","../../../../core/image/src/core/shapes.ts","../../../../core/image/src/core/sprite-rendering.ts","../../../../core/image/src/core/text.ts","../../../../core/image/src/core/transform.ts","../../../../core/image/src/core/image.ts","../../../../core/sprites/src/sprite.ts","../../src/constants.ts","../../src/assets/loader.ts","../../../../core/player/src/player-service.ts","../../../../core/screen/src/tri/ttri.ts","../../../../core/screen/src/core/base-screen.ts","../../../../core/screen/src/drawing/primitives-screen.ts","../../../../core/screen/src/drawing/sprite-screen.ts","../../../../core/screen/src/drawing/text-screen.ts","../../../../core/screen/src/tri/triangle-screen.ts","../../../../core/screen/src/core/screen.ts","../../../../core/time/src/constants.ts","../../../../core/time/src/utils.ts","../../../../core/time/src/playback/player.ts","../../../../core/time/src/recording/recorder.ts","../../../../core/time/src/core/machine.ts","../../../stdlib/src/json.ts","../../../stdlib/src/list.ts","../../../stdlib/src/math.ts","../../../stdlib/src/string.ts","../../../../lootiscript/src/random.ts","../../../../lootiscript/src/v1/token.ts","../../../../lootiscript/src/v1/tokenizer.ts","../../../../lootiscript/src/v1/routine.ts","../../../../lootiscript/src/v1/program.ts","../../../../lootiscript/src/v1/parser.ts","../../../../lootiscript/src/v1/function-bridge.ts","../../../../lootiscript/src/v1/inline-cache.ts","../../../../lootiscript/src/v1/memory-pool.ts","../../../../lootiscript/src/v1/processor-operators.ts","../../../../lootiscript/src/v1/processor.ts","../../../../lootiscript/src/v1/compiler.ts","../../../../lootiscript/src/v1/runner.ts","../../../../lootiscript/src/v1/profiler.ts","../../../../lootiscript/src/v1/transpiler.ts","../../../io/src/storage/index.ts","../../../vm/src/context.ts","../../../vm/src/extensions.ts","../../../vm/src/l8bvm.ts","../../../vm/src/index.ts","../../src/hot-reload/updater.ts","../../../../core/input/src/devices/gamepad.ts","../../../../core/input/src/shared/constants.ts","../../../../core/input/src/shared/utils.ts","../../../../core/input/src/devices/keyboard.ts","../../../../core/input/src/devices/mouse.ts","../../../../core/input/src/devices/touch.ts","../../../../core/input/src/core/input-manager.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","../../../../core/palette/src/core/palette.ts","../../src/utils/object-pool.ts","../../src/core/api-factory.ts","../../src/core/controller.ts","../../src/utils/deep-clone.ts","../../src/utils/shallow-equal.ts"],"sourcesContent":["/**\n * @al8b/runtime\n *\n * Browser runtime facade and supporting subsystems for AL8B games.\n */\n\nexport * from \"./assets\";\n// Component exports (for advanced usage)\nexport * from \"./core\";\nexport * from \"./hot-reload\";\nexport * from \"./input\";\nexport * from \"./loop\";\nexport * from \"./storage\";\nexport * from \"./system\";\n// Type exports\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./vm\";\n","/** A4 reference frequency in Hz (concert pitch) */\nexport const A4_FREQUENCY = 440;\n\n/** Ratio between adjacent semitones in equal temperament */\nexport const SEMITONE_RATIO = 2 ** (1 / 12);\n\n/** MIDI note number for A4 */\nexport const A4_MIDI_NOTE = 69;\n","/**\n * Beeper - Procedural sound generation from text sequences\n * Converts music notation strings into beep sequences\n * Example: \"square tempo 120 C4 D4 E4 F4\"\n */\nimport { A4_FREQUENCY, A4_MIDI_NOTE, SEMITONE_RATIO } from \"../constants\";\nexport class Beeper {\n\tprivate audio: any;\n\tprivate notes: Record<string | number, number> = {};\n\tprivate plainNotes: Record<string, number> = {};\n\tprivate currentOctave = 5;\n\tprivate currentDuration = 0.5;\n\tprivate currentVolume = 0.5;\n\tprivate currentSpan = 1;\n\tprivate currentWaveform = \"square\";\n\n\tconstructor(audio: any) {\n\t\tthis.audio = audio;\n\t\tthis.initializeNotes();\n\t}\n\n\t/**\n\t * Initialize note mappings\n\t */\n\tprivate initializeNotes(): void {\n\t\tconst noteNames = [\n\t\t\t[\"C\", \"DO\"],\n\t\t\t[\"C#\", \"DO#\", \"Db\", \"REb\"],\n\t\t\t[\"D\", \"RE\"],\n\t\t\t[\"D#\", \"RE#\", \"Eb\", \"MIb\"],\n\t\t\t[\"E\", \"MI\"],\n\t\t\t[\"F\", \"FA\"],\n\t\t\t[\"F#\", \"FA#\", \"Gb\", \"SOLb\"],\n\t\t\t[\"G\", \"SOL\"],\n\t\t\t[\"G#\", \"SOL#\", \"Ab\", \"LAb\"],\n\t\t\t[\"A\", \"LA\"],\n\t\t\t[\"A#\", \"LA#\", \"Bb\", \"SIb\"],\n\t\t\t[\"B\", \"SI\"],\n\t\t];\n\n\t\tfor (let i = 0; i <= 127; i++) {\n\t\t\tthis.notes[i] = i;\n\t\t\tconst oct = Math.floor(i / 12) - 1;\n\n\t\t\tfor (const n of noteNames[i % 12]) {\n\t\t\t\tthis.notes[n + oct] = i;\n\t\t\t}\n\n\t\t\tif (oct === -1) {\n\t\t\t\tfor (const n of noteNames[i % 12]) {\n\t\t\t\t\tthis.plainNotes[n] = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse and play beep sequence\n\t */\n\tpublic beep(input: string): void {\n\t\tlet status: string = \"normal\";\n\t\tconst sequence: any[] = [];\n\t\tconst loops: any[] = [];\n\t\tlet note: number | undefined;\n\n\t\tconst parsed = input.split(\" \");\n\n\t\tfor (const t of parsed) {\n\t\t\tif (t === \"\") continue;\n\n\t\t\tswitch (status) {\n\t\t\t\tcase \"normal\":\n\t\t\t\t\tif (this.notes[t] !== undefined) {\n\t\t\t\t\t\t// Full note with octave (e.g., \"C4\")\n\t\t\t\t\t\tnote = this.notes[t];\n\t\t\t\t\t\tthis.currentOctave = Math.floor(note / 12);\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (note - A4_MIDI_NOTE),\n\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (this.plainNotes[t] !== undefined) {\n\t\t\t\t\t\t// Note without octave (e.g., \"C\")\n\t\t\t\t\t\tnote = this.plainNotes[t] + this.currentOctave * 12;\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (note - A4_MIDI_NOTE),\n\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if ([\"square\", \"sine\", \"saw\", \"noise\"].includes(t)) {\n\t\t\t\t\t\t// Waveform\n\t\t\t\t\t\tthis.currentWaveform = t;\n\t\t\t\t\t} else if ([\"tempo\", \"duration\", \"volume\", \"span\", \"loop\", \"to\"].includes(t)) {\n\t\t\t\t\t\t// Commands\n\t\t\t\t\t\tstatus = t;\n\t\t\t\t\t} else if (t === \"-\") {\n\t\t\t\t\t\t// Rest/silence\n\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\t\t\t\tvolume: 0,\n\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (t === \"end\") {\n\t\t\t\t\t\t// End loop\n\t\t\t\t\t\tif (loops.length > 0 && sequence.length > 0) {\n\t\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\t\t\t\t\tvolume: 0,\n\t\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst lop = loops.splice(loops.length - 1, 1)[0];\n\t\t\t\t\t\t\tsequence[sequence.length - 1].loopto = lop.start;\n\t\t\t\t\t\t\tsequence[sequence.length - 1].repeats = lop.repeats;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"tempo\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst tempo = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(tempo) && tempo > 0) {\n\t\t\t\t\t\tthis.currentDuration = 60 / tempo;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"duration\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst duration = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(duration) && duration > 0) {\n\t\t\t\t\t\tthis.currentDuration = duration / 1000;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"volume\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst volume = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(volume)) {\n\t\t\t\t\t\tthis.currentVolume = volume / 100;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"span\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tconst span = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(span)) {\n\t\t\t\t\t\tthis.currentSpan = span / 100;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"loop\": {\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tloops.push({\n\t\t\t\t\t\tstart: sequence.length,\n\t\t\t\t\t});\n\t\t\t\t\tconst repeats = Number.parseFloat(t);\n\t\t\t\t\tif (!Number.isNaN(repeats)) {\n\t\t\t\t\t\tloops[loops.length - 1].repeats = repeats;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"to\":\n\t\t\t\t\tstatus = \"normal\";\n\t\t\t\t\tif (note !== undefined) {\n\t\t\t\t\t\tlet n: number | undefined;\n\n\t\t\t\t\t\tif (this.notes[t] !== undefined) {\n\t\t\t\t\t\t\tn = this.notes[t];\n\t\t\t\t\t\t} else if (this.plainNotes[t] !== undefined) {\n\t\t\t\t\t\t\tn = this.plainNotes[t] + this.currentOctave * 12;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (n !== undefined && n !== note) {\n\t\t\t\t\t\t\t// Generate slide from note to n\n\t\t\t\t\t\t\tconst step = n > note ? 1 : -1;\n\t\t\t\t\t\t\tfor (let i = note + step; step > 0 ? i <= n : i >= n; i += step) {\n\t\t\t\t\t\t\t\tsequence.push({\n\t\t\t\t\t\t\t\t\tfrequency: A4_FREQUENCY * SEMITONE_RATIO ** (i - A4_MIDI_NOTE),\n\t\t\t\t\t\t\t\t\tvolume: this.currentVolume,\n\t\t\t\t\t\t\t\t\tspan: this.currentSpan,\n\t\t\t\t\t\t\t\t\tduration: this.currentDuration,\n\t\t\t\t\t\t\t\t\twaveform: this.currentWaveform,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnote = n;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Close any remaining loops\n\t\tif (loops.length > 0 && sequence.length > 0) {\n\t\t\tconst lop = loops.splice(loops.length - 1, 1)[0];\n\t\t\tsequence.push({\n\t\t\t\tfrequency: A4_FREQUENCY,\n\t\t\t\tvolume: 0,\n\t\t\t\tspan: this.currentSpan,\n\t\t\t\tduration: 0,\n\t\t\t\twaveform: this.currentWaveform,\n\t\t\t});\n\n\t\t\tsequence[sequence.length - 1].loopto = lop.start;\n\t\t\tsequence[sequence.length - 1].repeats = lop.repeats;\n\t\t}\n\n\t\tthis.audio.addBeeps(sequence);\n\t}\n}\n","export const AUDIO_WORKLET_CODE = `\nclass L8bAudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.beeps = [];\n this.last = 0;\n this.port.onmessage = (event) => {\n const data = JSON.parse(event.data);\n if (data.name === \"cancel_beeps\") {\n this.beeps = [];\n } else if (data.name === \"beep\") {\n const seq = data.sequence;\n // Link sequence notes together\n for (let i = 0; i < seq.length; i++) {\n const note = seq[i];\n if (i > 0) {\n seq[i - 1].next = note;\n }\n // Resolve loopto index to actual note reference\n if (note.loopto != null) {\n note.loopto = seq[note.loopto];\n }\n // Initialize phase and time\n note.phase = 0;\n note.time = 0;\n }\n // Add first note to beeps queue\n if (seq.length > 0) {\n this.beeps.push(seq[0]);\n }\n }\n };\n }\n\n process(inputs, outputs, parameters) {\n const output = outputs[0];\n \n for (let i = 0; i < output.length; i++) {\n const channel = output[i];\n \n if (i > 0) {\n // Copy first channel to other channels\n for (let j = 0; j < channel.length; j++) {\n channel[j] = output[0][j];\n }\n } else {\n // Generate audio for first channel\n for (let j = 0; j < channel.length; j++) {\n let sig = 0;\n \n for (let k = this.beeps.length - 1; k >= 0; k--) {\n const b = this.beeps[k];\n let volume = b.volume;\n \n if (b.time / b.duration > b.span) {\n volume = 0;\n }\n \n // Generate waveform\n switch (b.waveform) {\n case \"square\":\n sig += b.phase > 0.5 ? volume : -volume;\n break;\n case \"saw\":\n sig += (b.phase * 2 - 1) * volume;\n break;\n case \"noise\":\n sig += (Math.random() * 2 - 1) * volume;\n break;\n default: // sine\n sig += Math.sin(b.phase * Math.PI * 2) * volume;\n }\n \n b.phase = (b.phase + b.increment) % 1;\n b.time += 1;\n \n if (b.time >= b.duration) {\n b.time = 0;\n \n if (b.loopto != null) {\n if (b.repeats != null && b.repeats > 0) {\n if (b.loopcount == null) {\n b.loopcount = 0;\n }\n b.loopcount++;\n \n if (b.loopcount >= b.repeats) {\n b.loopcount = 0;\n if (b.next != null) {\n b.next.phase = b.phase;\n this.beeps[k] = b.next;\n } else {\n this.beeps.splice(k, 1);\n }\n } else {\n b.loopto.phase = b.phase;\n this.beeps[k] = b.loopto;\n }\n } else {\n b.loopto.phase = b.phase;\n this.beeps[k] = b.loopto;\n }\n } else if (b.next != null) {\n b.next.phase = b.phase;\n this.beeps[k] = b.next;\n } else {\n this.beeps.splice(k, 1);\n }\n }\n }\n \n this.last = this.last * 0.9 + sig * 0.1;\n channel[j] = this.last;\n }\n }\n }\n \n return true;\n }\n}\n\nregisterProcessor(\"l8b-audio-processor\", L8bAudioProcessor);\n`;\n","/**\n * AudioCore - Web Audio API wrapper\n * Manages audio context, beeper, and sound/music playback\n */\n\nimport { Beeper } from \"../devices/beeper\";\nimport { AUDIO_WORKLET_CODE } from \"./audio-worklet\";\n\n/** An actively playing sound/music that can be stopped */\ninterface PlayingHandle {\n\tstop: () => void;\n}\n\n/** Item that can be woken up on audio context activation */\ninterface WakeUpItem {\n\twakeUp: () => void;\n}\n\nexport class AudioCore {\n\tpublic context!: AudioContext;\n\tprivate buffer: string[] = [];\n\tprivate playing: PlayingHandle[] = [];\n\tprivate wakeupList: WakeUpItem[] = [];\n\tprivate workletNode?: AudioWorkletNode;\n\tprivate beeper?: Beeper;\n\tprivate runtime: any;\n\tprivate masterVolume: number = 1;\n\n\tconstructor(runtime: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.getContext();\n\t}\n\n\t/**\n\t * Check if audio context is running\n\t */\n\tpublic isStarted(): boolean {\n\t\treturn this.context.state === \"running\";\n\t}\n\n\t/**\n\t * Add item to wakeup list (for mobile audio activation)\n\t */\n\tpublic addToWakeUpList(item: WakeUpItem): void {\n\t\tthis.wakeupList.push(item);\n\t}\n\n\tprivate interfaceCache: Record<string, any> | null = null;\n\n\t/**\n\t * Set master volume (0-1). Applied as a multiplier to all sound/music playback.\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tthis.masterVolume = Math.max(0, Math.min(1, volume));\n\t}\n\n\t/**\n\t * Get current master volume (0-1)\n\t */\n\tpublic getVolume(): number {\n\t\treturn this.masterVolume;\n\t}\n\n\t/**\n\t * Get interface for game code\n\t */\n\tpublic getInterface() {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\t\tthis.interfaceCache = {\n\t\t\tbeep: (sequence: string) => this.beep(sequence),\n\t\t\tcancelBeeps: () => this.cancelBeeps(),\n\t\t\tplaySound: (sound: any, volume?: number, pitch?: number, pan?: number, loopit?: boolean) =>\n\t\t\t\tthis.playSound(sound, volume, pitch, pan, loopit),\n\t\t\tplayMusic: (music: any, volume?: number, loopit?: boolean) => this.playMusic(music, volume, loopit),\n\t\t\tsetVolume: (volume: number) => this.setVolume(volume),\n\t\t\tgetVolume: () => this.getVolume(),\n\t\t\tstopAll: () => this.stopAll(),\n\t\t};\n\t\treturn this.interfaceCache;\n\t}\n\n\t/**\n\t * Play sound effect\n\t */\n\tpublic playSound(sound: any, volume: number = 1, pitch: number = 1, pan: number = 0, loopit: boolean = false): number {\n\t\tif (typeof sound === \"string\") {\n\t\t\tconst soundName = sound.replace(/\\//g, \"-\");\n\t\t\tconst s = this.runtime.sounds[soundName];\n\t\t\tif (!s) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7013\", message: \"Sound not found\", data: { soundName } });\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn s.play(volume * this.masterVolume, pitch, pan, loopit);\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Play music\n\t */\n\tpublic playMusic(music: any, volume: number = 1, loopit: boolean = false): number {\n\t\tif (typeof music === \"string\") {\n\t\t\tconst musicName = music.replace(/\\//g, \"-\");\n\t\t\tconst m = this.runtime.music[musicName];\n\t\t\tif (!m) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7014\", message: \"Music not found\", data: { musicName } });\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn m.play(volume * this.masterVolume, loopit);\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Get or create audio context (lazy initialization - created on first use)\n\t * Note: Browser may suspend context until user interaction, which is handled automatically\n\t */\n\tpublic getContext(): AudioContext {\n\t\tif (!this.context) {\n\t\t\tconst AudioContextClass = (window as any).AudioContext || (window as any).webkitAudioContext;\n\t\t\t// Create context - browser may suspend until user interaction\n\t\t\tthis.context = new AudioContextClass();\n\n\t\t\t// If context is suspended, set up activation listeners\n\t\t\tif (this.context.state !== \"running\") {\n\t\t\t\tconst activate = () => {\n\t\t\t\t\tif (this.context && this.context.state !== \"running\") {\n\t\t\t\t\t\tthis.context.resume();\n\t\t\t\t\t\tif (this.beeper) {\n\t\t\t\t\t\t\tthis.start();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of this.wakeupList) {\n\t\t\t\t\t\t\titem.wakeUp();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Clean up listeners\n\t\t\t\t\t\tdocument.body.removeEventListener(\"touchend\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"mouseup\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"click\", activate);\n\t\t\t\t\t\tdocument.body.removeEventListener(\"keydown\", activate);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Add multiple event listeners for better compatibility\n\t\t\t\tdocument.body.addEventListener(\"touchend\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"mouseup\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"click\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tdocument.body.addEventListener(\"keydown\", activate, {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t} else if (this.beeper) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t}\n\n\t\treturn this.context;\n\t}\n\n\t/**\n\t * Start audio processor\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (this.workletNode) return;\n\n\t\ttry {\n\t\t\tconst blob = new Blob([AUDIO_WORKLET_CODE], {\n\t\t\t\ttype: \"application/javascript\",\n\t\t\t});\n\t\t\tconst url = URL.createObjectURL(blob);\n\n\t\t\tawait this.context.audioWorklet.addModule(url);\n\n\t\t\tthis.workletNode = new AudioWorkletNode(this.context, \"l8b-audio-processor\");\n\t\t\tthis.workletNode.connect(this.context.destination);\n\n\t\t\tthis.flushBuffer();\n\t\t} catch (e) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7012\", message: \"Audio worklet error\", data: { error: String(e) } });\n\t\t}\n\t}\n\n\t/**\n\t * Flush buffered messages\n\t */\n\tprivate flushBuffer(): void {\n\t\tif (!this.workletNode) return;\n\n\t\twhile (this.buffer.length > 0) {\n\t\t\tthis.workletNode.port.postMessage(this.buffer.splice(0, 1)[0]);\n\t\t}\n\t}\n\n\t/**\n\t * Get or create beeper\n\t */\n\tpublic getBeeper(): Beeper {\n\t\tif (!this.beeper) {\n\t\t\t// Create Beeper instance\n\t\t\tthis.beeper = new Beeper(this);\n\n\t\t\tif (this.context.state === \"running\") {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t}\n\t\treturn this.beeper;\n\t}\n\n\t/**\n\t * Play beep sequence\n\t */\n\tpublic beep(sequence: string): void {\n\t\tthis.getBeeper().beep(sequence);\n\t}\n\n\t/**\n\t * Add beeps to audio processor\n\t */\n\tpublic addBeeps(beeps: any[]): void {\n\t\tfor (const b of beeps) {\n\t\t\tb.duration *= this.context.sampleRate;\n\t\t\tb.increment = b.frequency / this.context.sampleRate;\n\t\t}\n\n\t\tif (this.workletNode) {\n\t\t\tthis.workletNode.port.postMessage(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"beep\",\n\t\t\t\t\tsequence: beeps,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.buffer.push(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"beep\",\n\t\t\t\t\tsequence: beeps,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Cancel all beeps\n\t */\n\tpublic cancelBeeps(): void {\n\t\tif (this.workletNode) {\n\t\t\tthis.workletNode.port.postMessage(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"cancel_beeps\",\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.buffer.push(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tname: \"cancel_beeps\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tthis.stopAll();\n\t}\n\n\t/**\n\t * Add playing sound/music to list\n\t */\n\tpublic addPlaying(item: PlayingHandle): void {\n\t\tthis.playing.push(item);\n\t}\n\n\t/**\n\t * Remove playing sound/music from list\n\t */\n\tpublic removePlaying(item: PlayingHandle): void {\n\t\tconst index = this.playing.indexOf(item);\n\t\tif (index >= 0) {\n\t\t\tthis.playing.splice(index, 1);\n\t\t}\n\t}\n\n\t/**\n\t * Stop all playing sounds/music\n\t */\n\tpublic stopAll(): void {\n\t\tfor (const p of this.playing) {\n\t\t\ttry {\n\t\t\t\tp.stop();\n\t\t\t} catch (err) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7016\", message: \"Audio error\", data: { error: String(err) } });\n\t\t\t}\n\t\t}\n\t\tthis.playing = [];\n\t}\n}\n","/**\n * Music - Music streaming and playback using HTML5 Audio\n * L8B Music class for LootiScript\n */\nexport class Music {\n\tpublic ready: number = 1;\n\tpublic name: string = \"\";\n\tpublic url: string;\n\tpublic tag: HTMLAudioElement;\n\tpublic playing: boolean = false;\n\tprivate audio: any;\n\n\tconstructor(audio: any, url: string) {\n\t\tthis.audio = audio;\n\t\tthis.url = url;\n\t\tthis.tag = new Audio(this.url);\n\t\tthis.ready = 1;\n\t}\n\n\t/**\n\t * Play music with volume and loop (HTML5 Audio implementation)\n\t */\n\tpublic play(volume: number = 1, loopit: boolean = false): any {\n\t\tthis.playing = true;\n\t\tthis.tag.loop = !!loopit;\n\t\tthis.tag.volume = Math.max(0, Math.min(1, volume));\n\n\t\tif (this.audio.isStarted()) {\n\t\t\tthis.tag.play();\n\t\t} else {\n\t\t\tthis.audio.addToWakeUpList(this);\n\t\t}\n\n\t\tthis.audio.addPlaying(this);\n\n\t\treturn {\n\t\t\tplay: () => {\n\t\t\t\treturn this.tag.play();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\tthis.playing = false;\n\t\t\t\tthis.tag.pause();\n\t\t\t\tthis.audio.removePlaying(this);\n\t\t\t},\n\t\t\tsetVolume: (v: number) => {\n\t\t\t\tthis.tag.volume = Math.max(0, Math.min(1, v));\n\t\t\t},\n\t\t\tgetPosition: () => {\n\t\t\t\treturn this.tag.currentTime;\n\t\t\t},\n\t\t\tgetDuration: () => {\n\t\t\t\treturn this.tag.duration;\n\t\t\t},\n\t\t\tsetPosition: (pos: number) => {\n\t\t\t\tthis.tag.pause();\n\t\t\t\tthis.tag.currentTime = Math.max(0, Math.min(this.tag.duration, pos));\n\t\t\t\tif (this.playing) {\n\t\t\t\t\tthis.tag.play();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wake up audio (for autoplay policy)\n\t */\n\tpublic wakeUp(): void {\n\t\tif (this.playing) {\n\t\t\tthis.tag.play();\n\t\t}\n\t}\n\n\t/**\n\t * Stop music\n\t */\n\tpublic stop(): void {\n\t\tthis.playing = false;\n\t\tthis.tag.pause();\n\t\tthis.audio.removePlaying(this);\n\t}\n}\n","/**\n * Sound - Sound effect playback\n * Handles loading and playing audio buffers\n */\n\nexport class Sound {\n\tpublic ready: number = 0;\n\tpublic buffer?: AudioBuffer;\n\tpublic name: string = \"\";\n\tpublic url: string;\n\tprivate audio: any;\n\n\tconstructor(audio: any, url: string | AudioBuffer) {\n\t\tthis.audio = audio;\n\n\t\tif (url instanceof AudioBuffer) {\n\t\t\tthis.buffer = url;\n\t\t\tthis.url = \"\";\n\t\t\tthis.ready = 1;\n\t\t} else {\n\t\t\tthis.url = url;\n\t\t\tthis.loadSound(url);\n\t\t}\n\t}\n\n\t/**\n\t * Load sound from URL\n\t */\n\tprivate loadSound(url: string): void {\n\t\tconst request = new XMLHttpRequest();\n\t\trequest.open(\"GET\", url, true);\n\t\trequest.responseType = \"arraybuffer\";\n\n\t\trequest.onload = () => {\n\t\t\tthis.audio.context.decodeAudioData(\n\t\t\t\trequest.response,\n\t\t\t\t(buffer: AudioBuffer) => {\n\t\t\t\t\tthis.buffer = buffer;\n\t\t\t\t\tthis.ready = 1;\n\t\t\t\t},\n\t\t\t\t(err: any) => {\n\t\t\t\t\tthis.audio?.runtime?.listener?.reportError?.({\n\t\t\t\t\t\tcode: \"E7016\",\n\t\t\t\t\t\tmessage: \"Audio decoding failed\",\n\t\t\t\t\t\tdata: { error: `Audio decoding failed: ${String(err)}` },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\trequest.onerror = () => {\n\t\t\tthis.audio?.runtime?.listener?.reportError?.({\n\t\t\t\tcode: \"E7016\",\n\t\t\t\tmessage: \"Failed to load sound\",\n\t\t\t\tdata: { error: `Failed to load sound: ${url}` },\n\t\t\t});\n\t\t};\n\n\t\trequest.send();\n\t}\n\n\t/**\n\t * Play sound with volume, pitch, pan, and loop\n\t */\n\tpublic play(volume: number = 1, pitch: number = 1, pan: number = 0, loopit: boolean = false): any {\n\t\tif (!this.buffer)\n\t\t\treturn {\n\t\t\t\tstop: () => {},\n\t\t\t\tfinished: true,\n\t\t\t};\n\n\t\tconst context = this.audio.context;\n\n\t\t// Create source\n\t\tconst source = context.createBufferSource();\n\t\tsource.playbackRate.value = pitch;\n\t\tsource.buffer = this.buffer;\n\t\tif (loopit) source.loop = true;\n\n\t\t// Create gain node\n\t\tconst gain = context.createGain();\n\t\tgain.gain.value = volume;\n\n\t\t// Create panner\n\t\tconst panner: any = context.createPanner();\n\t\tpanner.panningModel = \"equalpower\";\n\t\tpanner.setPan = (p: number) => {\n\t\t\tpanner.setPosition(p, 0, 1 - Math.abs(p));\n\t\t};\n\t\tpanner.setPan(pan);\n\n\t\t// Connect nodes\n\t\tsource.connect(gain);\n\t\tgain.connect(panner);\n\t\tpanner.connect(context.destination);\n\n\t\t// Start playback\n\t\tsource.start();\n\n\t\t// Track playing sounds for looping\n\t\tlet playing: any = null;\n\t\tif (loopit) {\n\t\t\tplaying = {\n\t\t\t\tstop: () => {\n\t\t\t\t\tsource.stop();\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis.audio.addPlaying(playing);\n\t\t}\n\n\t\t// Return control interface\n\t\tconst res = {\n\t\t\tstop: () => {\n\t\t\t\tsource.stop();\n\t\t\t\tif (playing) this.audio.removePlaying(playing);\n\t\t\t\treturn 1;\n\t\t\t},\n\t\t\tsetVolume: (v: number) => {\n\t\t\t\tgain.gain.value = Math.max(0, Math.min(1, v));\n\t\t\t},\n\t\t\tsetPitch: (p: number) => {\n\t\t\t\tsource.playbackRate.value = Math.max(0.001, Math.min(1000, p));\n\t\t\t},\n\t\t\tsetPan: (p: number) => {\n\t\t\t\tpanner.setPan(Math.max(-1, Math.min(1, p)));\n\t\t\t},\n\t\t\tgetDuration: () => {\n\t\t\t\treturn source.buffer ? source.buffer.duration : 0;\n\t\t\t},\n\t\t\tfinished: false,\n\t\t};\n\n\t\tsource.onended = () => {\n\t\t\tres.finished = true;\n\t\t};\n\n\t\treturn res;\n\t}\n\n\t/**\n\t * Create MicroSound class for procedural sound generation\n\t */\n\tpublic static createSoundClass(audiocore: any): any {\n\t\treturn class MicroSound {\n\t\t\tpublic static classname = \"Sound\";\n\t\t\tpublic channels: number;\n\t\t\tpublic length: number;\n\t\t\tpublic sampleRate: number;\n\t\t\tprivate sound: Sound;\n\t\t\tprivate buffer: AudioBuffer;\n\n\t\t\tconstructor(channels: number, length: number, sampleRate: number = 44100) {\n\t\t\t\t// Validate parameters\n\t\t\t\tchannels = channels === 1 ? 1 : 2;\n\t\t\t\tif (!(length > 1 && length < 44100 * 1000)) {\n\t\t\t\t\tlength = 44100;\n\t\t\t\t}\n\t\t\t\tif (!(sampleRate >= 8000 && sampleRate <= 96000)) {\n\t\t\t\t\tsampleRate = 44100;\n\t\t\t\t}\n\n\t\t\t\tthis.channels = channels;\n\t\t\t\tthis.length = length;\n\t\t\t\tthis.sampleRate = sampleRate;\n\n\t\t\t\t// Create audio buffer\n\t\t\t\tthis.buffer = audiocore.context.createBuffer(channels, length, sampleRate);\n\t\t\t\tthis.sound = new Sound(audiocore, this.buffer);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Play the sound\n\t\t\t */\n\t\t\tpublic play(volume?: number, pitch?: number, pan?: number, loopit?: boolean): any {\n\t\t\t\treturn this.sound.play(volume, pitch, pan, loopit);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Write sample value to buffer\n\t\t\t */\n\t\t\tpublic write(channel: number, position: number, value: number): void {\n\t\t\t\tif (channel === 0) {\n\t\t\t\t\tconst ch1 = this.buffer.getChannelData(0);\n\t\t\t\t\tch1[position] = value;\n\t\t\t\t} else if (this.channels === 2) {\n\t\t\t\t\tconst ch2 = this.buffer.getChannelData(1);\n\t\t\t\t\tch2[position] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Read sample value from buffer\n\t\t\t */\n\t\t\tpublic read(channel: number, position: number): number {\n\t\t\t\tif (channel === 0) {\n\t\t\t\t\tconst ch1 = this.buffer.getChannelData(0);\n\t\t\t\t\treturn ch1[position];\n\t\t\t\t} else if (this.channels === 2) {\n\t\t\t\t\tconst ch2 = this.buffer.getChannelData(1);\n\t\t\t\t\treturn ch2[position];\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t};\n\t}\n}\n","import type { Sprite } from \"@al8b/sprites\";\nimport type { AnimatedTile, ParsedTile } from \"../data/types\";\n\nexport interface RenderState {\n\tcanvas: HTMLCanvasElement | null;\n\tbuffer: HTMLCanvasElement | null;\n\tanimated: AnimatedTile[];\n}\n\nexport const ensureCanvas = (\n\tstate: RenderState,\n\twidth: number,\n\theight: number,\n\tblockWidth: number,\n\tblockHeight: number,\n): CanvasRenderingContext2D => {\n\tif (!state.canvas) {\n\t\tstate.canvas = document.createElement(\"canvas\");\n\t}\n\tconst expectedWidth = width * blockWidth;\n\tconst expectedHeight = height * blockHeight;\n\tif (state.canvas.width !== expectedWidth || state.canvas.height !== expectedHeight) {\n\t\tstate.canvas.width = expectedWidth;\n\t\tstate.canvas.height = expectedHeight;\n\t}\n\tconst ctx = state.canvas.getContext(\"2d\");\n\tif (!ctx) {\n\t\tconst message = \"Failed to get 2D rendering context for tile canvas\";\n\t\tthrow new Error(message);\n\t}\n\tctx.clearRect(0, 0, state.canvas.width, state.canvas.height);\n\tstate.animated = [];\n\treturn ctx;\n};\n\nexport const drawTile = (\n\tctx: CanvasRenderingContext2D,\n\tsprite: Sprite,\n\tblockWidth: number,\n\tblockHeight: number,\n\tgridX: number,\n\tgridY: number,\n\tparsed: ParsedTile,\n): boolean => {\n\tconst canvas = sprite.frames[0].canvas;\n\tif (!canvas || canvas.width === 0 || canvas.height === 0) {\n\t\treturn false;\n\t}\n\tif (parsed.subX != null) {\n\t\tconst tx = parsed.subX * blockWidth;\n\t\tconst ty = (parsed.subY ?? 0) * blockHeight;\n\t\tctx.drawImage(\n\t\t\tcanvas,\n\t\t\ttx,\n\t\t\tty,\n\t\t\tblockWidth,\n\t\t\tblockHeight,\n\t\t\tblockWidth * gridX,\n\t\t\tblockHeight * gridY,\n\t\t\tblockWidth,\n\t\t\tblockHeight,\n\t\t);\n\t} else {\n\t\tctx.drawImage(canvas, blockWidth * gridX, blockHeight * gridY);\n\t}\n\treturn true;\n};\n\nexport const queueAnimatedTile = (\n\tstate: RenderState,\n\tsprite: Sprite,\n\tblockWidth: number,\n\tblockHeight: number,\n\tgridX: number,\n\tgridY: number,\n\tparsed: ParsedTile,\n): void => {\n\tconst tile: AnimatedTile = {\n\t\tx: blockWidth * gridX,\n\t\ty: blockHeight * gridY,\n\t\tw: blockWidth,\n\t\th: blockHeight,\n\t\tsprite,\n\t};\n\tif (parsed.subX != null) {\n\t\ttile.tx = parsed.subX * blockWidth;\n\t\ttile.ty = (parsed.subY ?? 0) * blockHeight;\n\t}\n\tstate.animated.push(tile);\n};\n\nexport const renderAnimatedTiles = (state: RenderState, blockWidth: number, blockHeight: number): HTMLCanvasElement => {\n\tconst time = performance.now();\n\tif (\n\t\t!state.buffer ||\n\t\tstate.buffer.width !== blockWidth * (state.canvas!.width / blockWidth) ||\n\t\tstate.buffer.height !== blockHeight * (state.canvas!.height / blockHeight)\n\t) {\n\t\tstate.buffer = document.createElement(\"canvas\");\n\t\tstate.buffer.width = state.canvas!.width;\n\t\tstate.buffer.height = state.canvas!.height;\n\t}\n\tconst bufferCtx = state.buffer.getContext(\"2d\")!;\n\tbufferCtx.clearRect(0, 0, state.buffer.width, state.buffer.height);\n\tbufferCtx.drawImage(state.canvas!, 0, 0);\n\tfor (const tile of state.animated) {\n\t\tconst len = tile.sprite.frames.length;\n\t\tconst frame = tile.sprite.frames[Math.floor((time / 1000) * tile.sprite.fps) % len]?.canvas;\n\t\tif (!frame) continue;\n\t\tif (tile.tx != null && tile.ty != null) {\n\t\t\tbufferCtx.drawImage(frame, tile.tx, tile.ty, blockWidth, blockHeight, tile.x, tile.y, blockWidth, blockHeight);\n\t\t} else {\n\t\t\tbufferCtx.drawImage(frame, tile.x, tile.y, blockWidth, blockHeight);\n\t\t}\n\t}\n\treturn state.buffer;\n};\n","// Convert forward slashes to dashes for safe storage in map data format\nexport const normalizeRefForStorage = (ref: string): string => ref.replace(/\\//g, \"-\");\n// Convert dashes back to forward slashes for sprite reference lookup\nexport const normalizeRefForUsage = (ref: string): string => ref.replace(/-/g, \"/\");\n","/**\n * TileMap - Tile-based map implementation with sprite rendering support.\n */\n\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { MapData, ParsedTile, SpriteDictionary } from \"../data/types\";\nimport { drawTile, ensureCanvas, queueAnimatedTile, type RenderState, renderAnimatedTiles } from \"../drawing/renderer\";\nimport { normalizeRefForStorage, normalizeRefForUsage } from \"../shared/references\";\n\n/**\n * Parse a tile reference string into a cached ParsedTile object.\n * Input format: \"spriteName\" or \"spriteName:subX,subY\"\n */\nfunction parseTileRef(entry: string): ParsedTile {\n\tconst colonIdx = entry.indexOf(\":\");\n\tif (colonIdx === -1) {\n\t\treturn { spriteName: entry };\n\t}\n\tconst spriteName = entry.substring(0, colonIdx);\n\tconst coords = entry.substring(colonIdx + 1);\n\tconst commaIdx = coords.indexOf(\",\");\n\tif (commaIdx === -1) {\n\t\treturn { spriteName, subX: Number.parseInt(coords, 10) };\n\t}\n\treturn {\n\t\tspriteName,\n\t\tsubX: Number.parseInt(coords.substring(0, commaIdx), 10),\n\t\tsubY: Number.parseInt(coords.substring(commaIdx + 1), 10),\n\t};\n}\n\nexport class TileMap {\n\tpublic width: number;\n\tpublic height: number;\n\tpublic block_width: number;\n\tpublic block_height: number;\n\tpublic sprites: SpriteDictionary;\n\tpublic map: (string | null)[] = [];\n\tpublic ready = true;\n\tpublic needs_update = false;\n\tpublic name = \"\";\n\tprivate parsedMap: (ParsedTile | null)[] = [];\n\tprivate readonly renderState: RenderState = {\n\t\tcanvas: null,\n\t\tbuffer: null,\n\t\tanimated: [],\n\t};\n\n\tconstructor(\n\t\twidth: number,\n\t\theight: number,\n\t\tblock_width: number,\n\t\tblock_height: number,\n\t\tsprites?: Record<string, Sprite>,\n\t) {\n\t\t// Validate map dimensions to ensure positive, finite values\n\t\tif (width <= 0 || height <= 0 || !isFinite(width) || !isFinite(height)) {\n\t\t\tthrow new Error(`Invalid map dimensions: width=${width}, height=${height}`);\n\t\t}\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.block_width = block_width;\n\t\tthis.block_height = block_height;\n\t\tthis.sprites = sprites ?? {};\n\t\tthis.clear();\n\t}\n\n\tclear(): void {\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tthis.map[idx] = null;\n\t\t\t\tthis.parsedMap[idx] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(x: number, y: number, ref: string | null): void {\n\t\t// Validate tile coordinates are within map bounds\n\t\tif (x < 0 || y < 0 || x >= this.width || y >= this.height || !isFinite(x) || !isFinite(y)) {\n\t\t\t// Silent fail: TileMap lacks runtime reference for error reporting\n\t\t\t// Out-of-bounds access is ignored to prevent crashes during development\n\t\t\treturn;\n\t\t}\n\n\t\tlet normalized = ref;\n\t\tif (typeof normalized === \"string\") {\n\t\t\tnormalized = normalizeRefForStorage(normalized);\n\t\t}\n\t\tconst idx = x + y * this.width;\n\t\tthis.map[idx] = normalized;\n\t\tthis.parsedMap[idx] = normalized ? parseTileRef(normalized) : null;\n\t\tthis.needs_update = true;\n\t}\n\n\tget(x: number, y: number): string | number | null {\n\t\t// Validate tile coordinates are within map bounds\n\t\tif (x < 0 || y < 0 || x >= this.width || y >= this.height || !isFinite(x) || !isFinite(y)) {\n\t\t\t// Silent fail: TileMap lacks runtime reference for error reporting\n\t\t\t// Returns 0 for out-of-bounds access to maintain backward compatibility\n\t\t\treturn 0;\n\t\t}\n\t\tlet cell = this.map[x + y * this.width];\n\t\tif (typeof cell === \"string\") {\n\t\t\tcell = normalizeRefForUsage(cell);\n\t\t}\n\t\treturn cell || 0;\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\tif (this.renderState.canvas == null || this.needs_update) {\n\t\t\tthis.update();\n\t\t}\n\t\treturn this.renderState.canvas!;\n\t}\n\n\tdraw(context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number): void {\n\t\tif (this.renderState.animated.length > 0) {\n\t\t\tconst buffer = renderAnimatedTiles(this.renderState, this.block_width, this.block_height);\n\t\t\tcontext.drawImage(buffer, x, y, w, h);\n\t\t} else {\n\t\t\tcontext.drawImage(this.getCanvas(), x, y, w, h);\n\t\t}\n\t}\n\n\tupdate(): void {\n\t\tthis.needs_update = false;\n\t\tconst context = ensureCanvas(this.renderState, this.width, this.height, this.block_width, this.block_height);\n\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst index = i + (this.height - 1 - j) * this.width;\n\t\t\t\tconst parsed = this.parsedMap[index];\n\t\t\t\tif (!parsed) continue;\n\n\t\t\t\tconst sprite =\n\t\t\t\t\tthis.sprites[parsed.spriteName] || this.sprites[normalizeRefForUsage(parsed.spriteName)];\n\t\t\t\tif (!sprite || !sprite.frames[0]) continue;\n\n\t\t\t\tif (sprite.frames.length > 1) {\n\t\t\t\t\tqueueAnimatedTile(this.renderState, sprite, this.block_width, this.block_height, i, j, parsed);\n\t\t\t\t} else {\n\t\t\t\t\tdrawTile(context, sprite, this.block_width, this.block_height, i, j, parsed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tloadFile(url: string, loaded?: () => void): void {\n\t\tconst req = new XMLHttpRequest();\n\t\treq.onreadystatechange = () => {\n\t\t\tif (req.readyState === XMLHttpRequest.DONE && req.status === 200) {\n\t\t\t\tthis.load(req.responseText, this.sprites);\n\t\t\t\tthis.update();\n\t\t\t\tloaded?.();\n\t\t\t}\n\t\t};\n\t\treq.open(\"GET\", url);\n\t\treq.send();\n\t}\n\n\tload(data: string, sprites: Record<string, Sprite>): void {\n\t\tconst parsed: MapData = JSON.parse(data);\n\t\tthis.width = parsed.width;\n\t\tthis.height = parsed.height;\n\t\tthis.block_width = parsed.block_width;\n\t\tthis.block_height = parsed.block_height;\n\t\tthis.sprites = sprites ?? this.sprites;\n\n\t\tfor (let j = 0; j < parsed.height; j++) {\n\t\t\tfor (let i = 0; i < parsed.width; i++) {\n\t\t\t\tconst idx = i + j * parsed.width;\n\t\t\t\tconst value = parsed.data[idx];\n\t\t\t\tif (value > 0) {\n\t\t\t\t\tconst ref = parsed.sprites[value] as string;\n\t\t\t\t\tthis.map[idx] = ref;\n\t\t\t\t\tthis.parsedMap[idx] = parseTileRef(ref);\n\t\t\t\t} else {\n\t\t\t\t\tthis.map[idx] = null;\n\t\t\t\t\tthis.parsedMap[idx] = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.needs_update = true;\n\t}\n\n\tclone(): TileMap {\n\t\tconst duplicate = new TileMap(this.width, this.height, this.block_width, this.block_height, this.sprites);\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tduplicate.map[idx] = this.map[idx];\n\t\t\t\tduplicate.parsedMap[idx] = this.parsedMap[idx];\n\t\t\t}\n\t\t}\n\t\tduplicate.needs_update = true;\n\t\treturn duplicate;\n\t}\n\n\tcopyFrom(map: TileMap): TileMap {\n\t\tthis.width = map.width;\n\t\tthis.height = map.height;\n\t\tthis.block_width = map.block_width;\n\t\tthis.block_height = map.block_height;\n\t\tfor (let j = 0; j < this.height; j++) {\n\t\t\tfor (let i = 0; i < this.width; i++) {\n\t\t\t\tconst idx = i + j * this.width;\n\t\t\t\tthis.map[idx] = map.map[idx];\n\t\t\t\tthis.parsedMap[idx] = map.parsedMap[idx];\n\t\t\t}\n\t\t}\n\t\tthis.update();\n\t\treturn this;\n\t}\n}\n\nexport function LoadMap(url: string, sprites?: Record<string, Sprite>, loaded?: () => void): TileMap {\n\tconst map = new TileMap(1, 1, 1, 1, sprites);\n\tmap.ready = false;\n\n\tconst req = new XMLHttpRequest();\n\treq.onreadystatechange = () => {\n\t\tif (req.readyState === XMLHttpRequest.DONE) {\n\t\t\tmap.ready = true;\n\t\t\tif (req.status === 200) {\n\t\t\t\tUpdateMap(map, req.responseText, sprites);\n\t\t\t}\n\t\t\tmap.needs_update = true;\n\t\t\tloaded?.();\n\t\t}\n\t};\n\treq.open(\"GET\", url);\n\treq.send();\n\treturn map;\n}\n\nexport function UpdateMap(map: TileMap, data: string, sprites?: Record<string, Sprite>): TileMap {\n\tmap.load(data, sprites ?? map.sprites);\n\treturn map;\n}\n\nexport function SaveMap(map: TileMap): string {\n\tlet index = 1;\n\tconst list: Array<string | number> = [0];\n\tconst table: Record<string, number> = {};\n\n\tfor (let j = 0; j < map.height; j++) {\n\t\tfor (let i = 0; i < map.width; i++) {\n\t\t\tconst entry = map.map[i + j * map.width];\n\t\t\tif (entry && entry.length > 0 && table[entry] == null) {\n\t\t\t\tlist.push(entry);\n\t\t\t\ttable[entry] = index++;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst serialized: number[] = [];\n\tfor (let j = 0; j < map.height; j++) {\n\t\tfor (let i = 0; i < map.width; i++) {\n\t\t\tconst entry = map.map[i + j * map.width];\n\t\t\tserialized[i + j * map.width] = entry && entry.length > 0 ? table[entry] : 0;\n\t\t}\n\t}\n\n\tconst payload: MapData = {\n\t\twidth: map.width,\n\t\theight: map.height,\n\t\tblock_width: map.block_width,\n\t\tblock_height: map.block_height,\n\t\tsprites: list,\n\t\tdata: serialized,\n\t};\n\n\treturn JSON.stringify(payload);\n}\n","export const BLENDING_MODES: Record<string, GlobalCompositeOperation> = {\n\tnormal: \"source-over\",\n\tadditive: \"lighter\",\n};\n\nconst MODES = [\n\t\"source-over\",\n\t\"source-in\",\n\t\"source-out\",\n\t\"source-atop\",\n\t\"destination-over\",\n\t\"destination-in\",\n\t\"destination-out\",\n\t\"destination-atop\",\n\t\"lighter\",\n\t\"copy\",\n\t\"xor\",\n\t\"multiply\",\n\t\"screen\",\n\t\"overlay\",\n\t\"darken\",\n\t\"lighten\",\n\t\"color-dodge\",\n\t\"color-burn\",\n\t\"hard-light\",\n\t\"soft-light\",\n\t\"difference\",\n\t\"exclusion\",\n\t\"hue\",\n\t\"saturation\",\n\t\"color\",\n\t\"luminosity\",\n];\n\nfor (const mode of MODES) {\n\tBLENDING_MODES[mode] = mode as GlobalCompositeOperation;\n}\n","/**\n * Color management for Image class\n * Handles color setting, pixel operations, and gradients\n */\n\nexport function setColor(context: CanvasRenderingContext2D, color?: string): void {\n\tif (color == null) {\n\t\treturn;\n\t}\n\tif (typeof color === \"string\") {\n\t\tcontext.fillStyle = color;\n\t\tcontext.strokeStyle = color;\n\t}\n}\n\nexport function setLinearGradient(\n\tcontext: CanvasRenderingContext2D,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n\tc1: string,\n\tc2: string,\n): void {\n\tconst grd = context.createLinearGradient(x1, y1, x2, y2);\n\tgrd.addColorStop(0, c1);\n\tgrd.addColorStop(1, c2);\n\tcontext.fillStyle = grd;\n\tcontext.strokeStyle = grd;\n}\n\nexport function setRadialGradient(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tc1: string,\n\tc2: string,\n): void {\n\tconst grd = context.createRadialGradient(x, y, 0, x, y, radius);\n\tgrd.addColorStop(0, c1);\n\tgrd.addColorStop(1, c2);\n\tcontext.fillStyle = grd;\n\tcontext.strokeStyle = grd;\n}\n","/**\n * Context management for Image class\n * Handles canvas context initialization and state management\n */\n\nexport interface ImageContextState {\n\talpha: number;\n\tpixelated: number;\n\tline_width: number;\n\ttranslation_x: number;\n\ttranslation_y: number;\n\trotation: number;\n\tscale_x: number;\n\tscale_y: number;\n\timage_transform: boolean;\n\tanchor_x: number;\n\tanchor_y: number;\n\tobject_rotation: number;\n\tobject_scale_x: number;\n\tobject_scale_y: number;\n\tfont: string;\n}\n\nexport function createDefaultContextState(centered: boolean): ImageContextState {\n\tif (centered) {\n\t\treturn {\n\t\t\talpha: 1,\n\t\t\tpixelated: 1,\n\t\t\tline_width: 1,\n\t\t\ttranslation_x: 0, // Will be set to width/2\n\t\t\ttranslation_y: 0, // Will be set to height/2\n\t\t\trotation: 0,\n\t\t\tscale_x: 1,\n\t\t\tscale_y: -1,\n\t\t\timage_transform: true,\n\t\t\tanchor_x: 0,\n\t\t\tanchor_y: 0,\n\t\t\tobject_rotation: 0,\n\t\t\tobject_scale_x: 1,\n\t\t\tobject_scale_y: -1,\n\t\t\tfont: \"BitCell\",\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\talpha: 1,\n\t\t\tpixelated: 1,\n\t\t\tline_width: 1,\n\t\t\ttranslation_x: 0,\n\t\t\ttranslation_y: 0,\n\t\t\trotation: 0,\n\t\t\tscale_x: 1,\n\t\t\tscale_y: 1,\n\t\t\timage_transform: false,\n\t\t\tanchor_x: -1,\n\t\t\tanchor_y: 1,\n\t\t\tobject_rotation: 0,\n\t\t\tobject_scale_x: 1,\n\t\t\tobject_scale_y: 1,\n\t\t\tfont: \"BitCell\",\n\t\t};\n\t}\n}\n\nexport function updateImageTransform(state: ImageContextState): void {\n\tstate.image_transform =\n\t\tstate.translation_x !== 0 ||\n\t\tstate.translation_y !== 0 ||\n\t\tstate.scale_x !== 1 ||\n\t\tstate.scale_y !== 1 ||\n\t\tstate.rotation !== 0;\n}\n","/**\n * Drawing operations for Image class\n * Handles all drawing primitives (rectangles, circles, lines, etc.)\n */\n\nimport type { ImageContextState } from \"./context\";\n\nexport function initDrawOp(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tobject_transform = true,\n): boolean {\n\tlet res = false;\n\n\tif (state.image_transform) {\n\t\tcontext.save();\n\t\tres = true;\n\t\tcontext.translate(state.translation_x, state.translation_y);\n\t\tcontext.scale(state.scale_x, state.scale_y);\n\t\tcontext.rotate((state.rotation / 180) * Math.PI);\n\t\tcontext.translate(x, y);\n\t}\n\n\tif (object_transform && (state.object_rotation !== 0 || state.object_scale_x !== 1 || state.object_scale_y !== 1)) {\n\t\tif (!res) {\n\t\t\tcontext.save();\n\t\t\tres = true;\n\t\t\tcontext.translate(x, y);\n\t\t}\n\t\tif (state.object_rotation !== 0) {\n\t\t\tcontext.rotate((state.object_rotation / 180) * Math.PI);\n\t\t}\n\t\tif (state.object_scale_x !== 1 || state.object_scale_y !== 1) {\n\t\t\tcontext.scale(state.object_scale_x, state.object_scale_y);\n\t\t}\n\t}\n\n\treturn res;\n}\n\nexport function closeDrawOp(context: CanvasRenderingContext2D): void {\n\tcontext.restore();\n}\n\nexport function fillRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.fillRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.fillRect(x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function fillRoundRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tround: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tif (initDrawOp(context, state, x, y)) {\n\t\t(context as any).fillRoundRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h, round);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\t(context as any).fillRoundRect(\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t\tround,\n\t\t);\n\t}\n}\n\nexport function fillRound(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tw = Math.abs(w);\n\th = Math.abs(h);\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse((-state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.fill();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.fill();\n\t}\n}\n\nexport function drawRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.strokeRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.strokeRect(x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function drawRoundRect(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tround: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tif (initDrawOp(context, state, x, y)) {\n\t\t(context as any).strokeRoundRect(-w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h, round);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\t(context as any).strokeRoundRect(\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t\tround,\n\t\t);\n\t}\n}\n\nexport function drawRound(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tw = Math.abs(w);\n\th = Math.abs(h);\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.stroke();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.ellipse(x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\tcontext.stroke();\n\t}\n}\n\nexport function drawLine(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(x1, y1);\n\tcontext.lineTo(x2, y2);\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n","/**\n * Font management for Image class\n * Handles font loading and readiness checking\n */\n\n// Font cache to track loaded fonts\nconst loadedFonts = new Set<string>();\nconst loadingFonts = new Map<string, Promise<void>>();\n\n/**\n * Load a font for use in the image\n * In a full implementation, this would integrate with a font loading system\n */\nexport function loadFont(font: string): Promise<void> | void {\n\tif (!font) {\n\t\treturn;\n\t}\n\n\t// If already loaded, return immediately\n\tif (loadedFonts.has(font)) {\n\t\treturn Promise.resolve();\n\t}\n\n\t// If currently loading, return existing promise\n\tif (loadingFonts.has(font)) {\n\t\treturn loadingFonts.get(font);\n\t}\n\n\t// Check if font is available via CSS Font Loading API\n\tif (typeof document !== \"undefined\" && \"fonts\" in document) {\n\t\tconst promise = document.fonts\n\t\t\t.load(`12pt ${font}`)\n\t\t\t.then(() => {\n\t\t\t\tloadedFonts.add(font);\n\t\t\t\tloadingFonts.delete(font);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Font loading failed, but we'll mark it as loaded anyway\n\t\t\t\tloadedFonts.add(font);\n\t\t\t\tloadingFonts.delete(font);\n\t\t\t});\n\n\t\tloadingFonts.set(font, promise);\n\t\treturn promise;\n\t}\n\n\t// Fallback: assume font is available\n\tloadedFonts.add(font);\n\treturn Promise.resolve();\n}\n\n/**\n * Check if a font is ready to use\n */\nexport function isFontReady(font: string): boolean {\n\tif (!font) {\n\t\treturn true;\n\t}\n\n\t// Check if font is in loaded set\n\tif (loadedFonts.has(font)) {\n\t\treturn true;\n\t}\n\n\t// Check via CSS Font Loading API\n\tif (typeof document !== \"undefined\" && \"fonts\" in document) {\n\t\treturn document.fonts.check(`12pt ${font}`);\n\t}\n\n\t// Fallback: assume font is ready\n\treturn true;\n}\n\n/**\n * Clear font cache (useful for testing)\n */\nexport function clearFontCache(): void {\n\tloadedFonts.clear();\n\tloadingFonts.clear();\n}\n","/**\n * Map rendering for Image class\n * Handles drawing map objects onto the canvas\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport interface MapSource {\n\tready?: boolean | number;\n\tdraw?: (context: CanvasRenderingContext2D, x: number, y: number, w: number, h: number) => void;\n}\n\nconst resolveStringMap = (name: string): MapSource | null => {\n\tconst playerRuntime = (globalThis as any)?.player?.runtime;\n\tif (!playerRuntime) {\n\t\treturn null;\n\t}\n\n\t// Resolved maps are stored under runtime.maps; fall back to\n\t// screen.runtime.maps if provided by host environments.\n\tconst directMaps = playerRuntime.maps as Record<string, MapSource> | undefined;\n\tif (directMaps && directMaps[name]) {\n\t\treturn directMaps[name];\n\t}\n\n\tconst screenMaps = playerRuntime.screen?.runtime?.maps as Record<string, MapSource> | undefined;\n\tif (screenMaps && screenMaps[name]) {\n\t\treturn screenMaps[name];\n\t}\n\n\treturn null;\n};\n\nexport function drawMap(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tmap: MapSource | string,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n): void {\n\tconst resolvedMap: MapSource | null = typeof map === \"string\" ? resolveStringMap(map) : (map ?? null);\n\n\tif (!resolvedMap || !resolvedMap.ready || !resolvedMap.draw) {\n\t\treturn;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tresolvedMap.draw(context, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tresolvedMap.draw(context, x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n","/**\n * Pixel-level operations for Image class\n * Handles individual pixel reading and writing\n */\n\nexport interface RGBColor {\n\tR: number;\n\tG: number;\n\tB: number;\n}\n\nexport interface RGBAColor extends RGBColor {\n\tA: number;\n}\n\nlet pixelDataCache: ImageData | null = null;\n\nexport function setRGB(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tr: number | RGBColor,\n\tg?: number,\n\tb?: number,\n): void {\n\tif (pixelDataCache == null) {\n\t\tpixelDataCache = context.createImageData(1, 1);\n\t}\n\n\tif (typeof r === \"object\") {\n\t\tpixelDataCache.data[0] = r.R;\n\t\tpixelDataCache.data[1] = r.G;\n\t\tpixelDataCache.data[2] = r.B;\n\t} else {\n\t\tpixelDataCache.data[0] = r;\n\t\tpixelDataCache.data[1] = g || 0;\n\t\tpixelDataCache.data[2] = b || 0;\n\t}\n\tpixelDataCache.data[3] = 255;\n\n\tcontext.putImageData(pixelDataCache, x, y);\n}\n\nexport function setRGBA(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tr: number | RGBAColor,\n\tg?: number,\n\tb?: number,\n\ta?: number,\n): void {\n\tif (pixelDataCache == null) {\n\t\tpixelDataCache = context.createImageData(1, 1);\n\t}\n\n\tif (typeof r === \"object\") {\n\t\tpixelDataCache.data[0] = r.R;\n\t\tpixelDataCache.data[1] = r.G;\n\t\tpixelDataCache.data[2] = r.B;\n\t\tpixelDataCache.data[3] = r.A != null ? r.A : 255;\n\t} else {\n\t\tpixelDataCache.data[0] = r;\n\t\tpixelDataCache.data[1] = g || 0;\n\t\tpixelDataCache.data[2] = b || 0;\n\t\tpixelDataCache.data[3] = a ?? 255;\n\t}\n\n\tcontext.putImageData(pixelDataCache, x, y);\n}\n\nexport function getRGB(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tresult: RGBColor = {\n\t\tR: 0,\n\t\tG: 0,\n\t\tB: 0,\n\t},\n): RGBColor {\n\tconst d = context.getImageData(x, y, 1, 1);\n\tresult.R = d.data[0];\n\tresult.G = d.data[1];\n\tresult.B = d.data[2];\n\treturn result;\n}\n\nexport function getRGBA(\n\tcontext: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tresult: RGBAColor = {\n\t\tR: 0,\n\t\tG: 0,\n\t\tB: 0,\n\t\tA: 255,\n\t},\n): RGBAColor {\n\tconst d = context.getImageData(x, y, 1, 1);\n\tresult.R = d.data[0];\n\tresult.G = d.data[1];\n\tresult.B = d.data[2];\n\tresult.A = d.data[3];\n\treturn result;\n}\n","/**\n * Advanced shape drawing operations\n * Handles polygons, polylines, curves, and arcs\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport function drawPolyline(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawPolygon(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.closePath();\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function fillPolygon(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst len = Math.floor(args.length / 2);\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tfor (let i = 1; i <= len - 1; i++) {\n\t\tcontext.lineTo(args[i * 2], args[i * 2 + 1]);\n\t}\n\n\tcontext.fill();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawQuadCurve(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tlet index = 2;\n\twhile (index <= args.length - 4) {\n\t\tcontext.quadraticCurveTo(args[index], args[index + 1], args[index + 2], args[index + 3]);\n\t\tindex += 4;\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawBezierCurve(context: CanvasRenderingContext2D, state: ImageContextState, args: any[]): void {\n\tif (Array.isArray(args[0])) {\n\t\targs = args[0];\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (args.length < 4) {\n\t\treturn;\n\t}\n\n\tconst transform = initDrawOp(context, state, 0, 0, false);\n\tcontext.beginPath();\n\tcontext.moveTo(args[0], args[1]);\n\n\tlet index = 2;\n\twhile (index <= args.length - 6) {\n\t\tcontext.bezierCurveTo(\n\t\t\targs[index],\n\t\t\targs[index + 1],\n\t\t\targs[index + 2],\n\t\t\targs[index + 3],\n\t\t\targs[index + 4],\n\t\t\targs[index + 5],\n\t\t);\n\t\tindex += 6;\n\t}\n\n\tcontext.stroke();\n\tif (transform) {\n\t\tcloseDrawOp(context);\n\t}\n}\n\nexport function drawArc(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tangle1: number,\n\tangle2: number,\n\tccw: boolean,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.lineWidth = state.line_width;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.arc(0, 0, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.stroke();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.arc(x, y, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.stroke();\n\t}\n}\n\nexport function fillArc(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tx: number,\n\ty: number,\n\tradius: number,\n\tangle1: number,\n\tangle2: number,\n\tccw: boolean,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.beginPath();\n\t\tcontext.arc(0, 0, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.fill();\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.beginPath();\n\t\tcontext.arc(x, y, radius, (angle1 / 180) * Math.PI, (angle2 / 180) * Math.PI, ccw);\n\t\tcontext.fill();\n\t}\n}\n","/**\n * Sprite and image rendering for Image class\n * Handles drawing sprites and images onto the canvas\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport interface SpriteSource {\n\tframes?: Array<{\n\t\tcanvas: HTMLCanvasElement;\n\t}>;\n\tcanvas?: HTMLCanvasElement;\n\timage?: HTMLImageElement;\n\tready?: boolean | number;\n\tfps?: number;\n\tanimation_start?: number;\n}\n\nexport function getSpriteFrame(sprite: SpriteSource | string): HTMLCanvasElement | null {\n\t// Handle Image instances\n\tif (typeof sprite === \"object\" && \"canvas\" in sprite && !(\"frames\" in sprite)) {\n\t\treturn sprite.canvas || (sprite.image as any) || null;\n\t}\n\n\t// Handle Sprite instances\n\tif (typeof sprite === \"object\" && sprite.frames && sprite.frames.length > 0) {\n\t\tif (!sprite.ready) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (sprite.frames.length > 1) {\n\t\t\t// Initialize animation_start lazily on first use to ensure animation starts from frame 0\n\t\t\t// This ensures smooth sequential animation: 0->1->2->...->N->0->1->...\n\t\t\tif (!sprite.animation_start || sprite.animation_start === 0) {\n\t\t\t\tsprite.animation_start = Date.now();\n\t\t\t}\n\t\t\tconst dt = 1000 / (sprite.fps || 5);\n\t\t\tconst frame = Math.floor((Date.now() - sprite.animation_start) / dt) % sprite.frames.length;\n\t\t\tif (frame >= 0 && frame < sprite.frames.length) {\n\t\t\t\treturn sprite.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn sprite.frames[0].canvas;\n\t\t}\n\t\treturn sprite.frames[0].canvas;\n\t}\n\n\treturn null;\n}\n\nexport function drawSprite(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tsprite: SpriteSource | string,\n\tx: number,\n\ty: number,\n\tw?: number,\n\th?: number,\n): void {\n\tconst canvas = getSpriteFrame(sprite);\n\tif (canvas == null) {\n\t\treturn;\n\t}\n\n\tif (w == null) {\n\t\tw = canvas.width;\n\t}\n\tif (!h) {\n\t\th = (w / canvas.width) * canvas.height;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.drawImage(canvas, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.drawImage(canvas, x - w / 2 - (state.anchor_x * w) / 2, y - h / 2 + (state.anchor_y * h) / 2, w, h);\n\t}\n}\n\nexport function drawSpritePart(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\tsprite: SpriteSource | string,\n\tsx: number,\n\tsy: number,\n\tsw: number,\n\tsh: number,\n\tx: number,\n\ty: number,\n\tw?: number,\n\th?: number,\n): void {\n\tconst canvas = getSpriteFrame(sprite);\n\tif (canvas == null) {\n\t\treturn;\n\t}\n\n\t// Image class uses w = canvas.width (Screen uses w = sw)\n\tif (w == null) {\n\t\tw = canvas.width;\n\t}\n\tif (!h) {\n\t\th = (w / sw) * sh;\n\t}\n\n\tcontext.globalAlpha = state.alpha;\n\tcontext.imageSmoothingEnabled = !state.pixelated;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.drawImage(canvas, sx, sy, sw, sh, -w / 2 - (state.anchor_x * w) / 2, -h / 2 + (state.anchor_y * h) / 2, w, h);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.drawImage(\n\t\t\tcanvas,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tsw,\n\t\t\tsh,\n\t\t\tx - w / 2 - (state.anchor_x * w) / 2,\n\t\t\ty - h / 2 + (state.anchor_y * h) / 2,\n\t\t\tw,\n\t\t\th,\n\t\t);\n\t}\n}\n","/**\n * Text rendering operations for Image class\n * Handles text drawing, measurement, and font management\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { closeDrawOp, initDrawOp } from \"./drawing\";\n\nexport function textWidth(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tsize: number,\n): number {\n\tcontext.font = `${size}pt ${state.font}`;\n\treturn context.measureText(text).width;\n}\n\nexport function drawText(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tx: number,\n\ty: number,\n\tsize: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.font = `${size}pt ${state.font}`;\n\tcontext.textAlign = \"center\";\n\tcontext.textBaseline = \"middle\";\n\n\tconst w = context.measureText(text).width;\n\tconst h = size;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.fillText(text, 0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.fillText(text, x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2);\n\t}\n}\n\nexport function drawTextOutline(\n\tcontext: CanvasRenderingContext2D,\n\tstate: ImageContextState,\n\ttext: string,\n\tx: number,\n\ty: number,\n\tsize: number,\n): void {\n\tcontext.globalAlpha = state.alpha;\n\tcontext.font = `${size}pt ${state.font}`;\n\tcontext.lineWidth = state.line_width;\n\tcontext.textAlign = \"center\";\n\tcontext.textBaseline = \"middle\";\n\n\tconst w = context.measureText(text).width;\n\tconst h = size;\n\n\tif (initDrawOp(context, state, x, y)) {\n\t\tcontext.strokeText(text, 0 - (state.anchor_x * w) / 2, 0 + (state.anchor_y * h) / 2);\n\t\tcloseDrawOp(context);\n\t} else {\n\t\tcontext.strokeText(text, x - (state.anchor_x * w) / 2, y + (state.anchor_y * h) / 2);\n\t}\n}\n","/**\n * Transform operations for Image class\n * Handles translation, rotation, scaling, and anchoring\n */\n\nimport type { ImageContextState } from \"./context\";\nimport { updateImageTransform } from \"./context\";\n\nexport function setTranslation(state: ImageContextState, translation_x: number, translation_y: number): void {\n\tstate.translation_x = translation_x;\n\tstate.translation_y = translation_y;\n\n\tif (!isFinite(state.translation_x)) {\n\t\tstate.translation_x = 0;\n\t}\n\tif (!isFinite(state.translation_y)) {\n\t\tstate.translation_y = 0;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setScale(state: ImageContextState, scale_x: number, scale_y: number): void {\n\tstate.scale_x = scale_x;\n\tstate.scale_y = scale_y;\n\n\tif (!isFinite(state.scale_x) || state.scale_x === 0) {\n\t\tstate.scale_x = 1;\n\t}\n\tif (!isFinite(state.scale_y) || state.scale_y === 0) {\n\t\tstate.scale_y = 1;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setRotation(state: ImageContextState, rotation: number): void {\n\tstate.rotation = rotation;\n\n\tif (!isFinite(state.rotation)) {\n\t\tstate.rotation = 0;\n\t}\n\n\tupdateImageTransform(state);\n}\n\nexport function setDrawAnchor(state: ImageContextState, anchor_x: number, anchor_y: number): void {\n\tstate.anchor_x = anchor_x;\n\tstate.anchor_y = anchor_y;\n\n\tif (typeof state.anchor_x !== \"number\") {\n\t\tstate.anchor_x = 0;\n\t}\n\tif (typeof state.anchor_y !== \"number\") {\n\t\tstate.anchor_y = 0;\n\t}\n}\n\nexport function setDrawRotation(state: ImageContextState, object_rotation: number): void {\n\tstate.object_rotation = object_rotation;\n}\n\nexport function setDrawScale(state: ImageContextState, object_scale_x: number, object_scale_y: number): void {\n\tstate.object_scale_x = object_scale_x;\n\tstate.object_scale_y = object_scale_y;\n}\n","/**\n * Image - Canvas-based image class for game graphics\n *\n * Provides a canvas wrapper for image manipulation and drawing operations.\n */\n\nimport { BLENDING_MODES } from \"../blending\";\nimport * as ColorOps from \"./color\";\nimport { createDefaultContextState, type ImageContextState } from \"./context\";\nimport * as DrawingOps from \"./drawing\";\nimport * as FontOps from \"./font\";\nimport * as MapRenderingOps from \"./map-rendering\";\nimport * as PixelOps from \"./pixel\";\nimport * as ShapeOps from \"./shapes\";\nimport * as SpriteRenderingOps from \"./sprite-rendering\";\nimport * as TextOps from \"./text\";\nimport * as TransformOps from \"./transform\";\n\n/**\n * For variadic shape methods, the last argument may optionally be a color string.\n * This helper splits the args into point pairs and an optional color.\n */\nfunction splitColorArg(args: any[]): { points: any[]; color: string | undefined } {\n\tif (args.length > 0 && args.length % 2 === 1 && typeof args[args.length - 1] === \"string\") {\n\t\treturn { points: args.slice(0, -1), color: args[args.length - 1] };\n\t}\n\treturn { points: args, color: undefined };\n}\n\nexport class Image {\n\tprivate _canvas!: HTMLCanvasElement;\n\tprivate _context: CanvasRenderingContext2D | null = null;\n\tprivate _image: HTMLImageElement | null = null;\n\tprivate _state!: ImageContextState;\n\tprivate _centered: boolean;\n\n\tpublic width: number;\n\tpublic height: number;\n\n\tconstructor(widthOrImage: number | HTMLImageElement | HTMLCanvasElement, height?: number, centered: boolean = false) {\n\t\tthis._centered = centered;\n\n\t\tif (typeof widthOrImage === \"object\" && \"naturalWidth\" in widthOrImage) {\n\t\t\t// HTMLImageElement\n\t\t\tthis._image = widthOrImage as HTMLImageElement;\n\t\t\tthis.width = this._image.width;\n\t\t\tthis.height = this._image.height;\n\t\t} else if (typeof widthOrImage === \"object\" && \"getContext\" in widthOrImage) {\n\t\t\t// HTMLCanvasElement\n\t\t\tthis._canvas = widthOrImage as HTMLCanvasElement;\n\t\t\tthis.width = this._canvas.width;\n\t\t\tthis.height = this._canvas.height;\n\t\t} else {\n\t\t\t// Number\n\t\t\tthis._canvas = document.createElement(\"canvas\");\n\t\t\tthis.width = Math.round(widthOrImage as number);\n\t\t\tthis.height = Math.round(height || (widthOrImage as number));\n\t\t\tthis._canvas.width = this.width;\n\t\t\tthis._canvas.height = this.height;\n\t\t}\n\t}\n\n\t/**\n\t * Initialize or get the canvas context\n\t * Matches msImage initContext behavior exactly\n\t */\n\tinitContext(): CanvasRenderingContext2D {\n\t\t// Return early if context already exists (same as msImage line 68)\n\t\tif (this._context) {\n\t\t\treturn this._context;\n\t\t}\n\n\t\t// Convert image to canvas if needed (same as msImage lines 69-75)\n\t\tif (!this._canvas && this._image) {\n\t\t\tthis._canvas = document.createElement(\"canvas\");\n\t\t\tthis._canvas.width = this._image.width;\n\t\t\tthis._canvas.height = this._image.height;\n\t\t\tthis._context = this._canvas.getContext(\"2d\")!;\n\t\t\tthis._context.drawImage(this._image, 0, 0);\n\t\t\tthis._image = null;\n\t\t}\n\n\t\t// Always get fresh context (same as msImage line 80)\n\t\t// This ensures no leftover transforms from previous operations\n\t\tthis._context = this._canvas.getContext(\"2d\")!;\n\t\tif (this._context) {\n\t\t\tthis._context.lineCap = \"round\";\n\t\t}\n\n\t\t// Initialize state (same as msImage lines 77-106)\n\t\tif (!this._state) {\n\t\t\tthis._state = createDefaultContextState(this._centered);\n\t\t\tif (this._centered) {\n\t\t\t\tthis._state.translation_x = this.width / 2;\n\t\t\t\tthis._state.translation_y = this.height / 2;\n\t\t\t}\n\t\t}\n\n\t\treturn this._context;\n\t}\n\n\t/**\n\t * Get the canvas element\n\t */\n\tget canvas(): HTMLCanvasElement {\n\t\tthis.initContext();\n\t\treturn this._canvas;\n\t}\n\n\t/**\n\t * Get the image element (if still available)\n\t */\n\tget image(): HTMLImageElement | null {\n\t\treturn this._image;\n\t}\n\n\t/**\n\t * Get the rendering context\n\t */\n\tget context(): CanvasRenderingContext2D | null {\n\t\treturn this._context;\n\t}\n\n\t// ===== PIXEL OPERATIONS =====\n\n\tsetRGB(x: number, y: number, r: number | PixelOps.RGBColor, g?: number, b?: number): void {\n\t\tthis.initContext();\n\t\tPixelOps.setRGB(this._context!, x, y, r, g, b);\n\t}\n\n\tsetRGBA(x: number, y: number, r: number | PixelOps.RGBAColor, g?: number, b?: number, a?: number): void {\n\t\tthis.initContext();\n\t\tPixelOps.setRGBA(this._context!, x, y, r, g, b, a);\n\t}\n\n\tgetRGB(x: number, y: number, result?: PixelOps.RGBColor): PixelOps.RGBColor {\n\t\tthis.initContext();\n\t\treturn PixelOps.getRGB(this._context!, x, y, result);\n\t}\n\n\tgetRGBA(x: number, y: number, result?: PixelOps.RGBAColor): PixelOps.RGBAColor {\n\t\tthis.initContext();\n\t\treturn PixelOps.getRGBA(this._context!, x, y, result);\n\t}\n\n\t// ===== CANVAS OPERATIONS =====\n\n\tclear(color?: string): void {\n\t\tthis.initContext();\n\t\tconst c = this._context!.fillStyle;\n\t\tconst s = this._context!.strokeStyle;\n\t\tconst blending_save = this._context!.globalCompositeOperation;\n\n\t\tthis._context!.globalAlpha = 1;\n\t\tthis._context!.globalCompositeOperation = \"source-over\";\n\n\t\tif (color != null) {\n\t\t\tthis.setColor(color);\n\t\t} else {\n\t\t\tthis._context!.fillStyle = \"#000\";\n\t\t}\n\n\t\tthis._context!.fillRect(0, 0, this.width, this.height);\n\t\tthis._context!.fillStyle = c;\n\t\tthis._context!.strokeStyle = s;\n\t\tthis._context!.globalCompositeOperation = blending_save;\n\t}\n\n\t// ===== COLOR OPERATIONS =====\n\n\tsetColor(color?: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setColor(this._context!, color);\n\t}\n\n\tsetAlpha(alpha: number): void {\n\t\tthis.initContext();\n\t\tthis._state.alpha = alpha;\n\t}\n\n\tsetPixelated(pixelated: number): void {\n\t\tthis.initContext();\n\t\tthis._state.pixelated = pixelated;\n\t}\n\n\tsetBlending(blending?: string): void {\n\t\tthis.initContext();\n\t\tconst mode = BLENDING_MODES[blending || \"normal\"] || \"source-over\";\n\t\tthis._context!.globalCompositeOperation = mode;\n\t}\n\n\tsetLineWidth(line_width: number): void {\n\t\tthis.initContext();\n\t\tthis._state.line_width = line_width;\n\t}\n\n\tsetLineDash(dash: number[] | any): void {\n\t\tthis.initContext();\n\t\tif (!Array.isArray(dash)) {\n\t\t\tthis._context!.setLineDash([]);\n\t\t} else {\n\t\t\tthis._context!.setLineDash(dash);\n\t\t}\n\t}\n\n\tsetLinearGradient(x1: number, y1: number, x2: number, y2: number, c1: string, c2: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setLinearGradient(this._context!, x1, y1, x2, y2, c1, c2);\n\t}\n\n\tsetRadialGradient(x: number, y: number, radius: number, c1: string, c2: string): void {\n\t\tthis.initContext();\n\t\tColorOps.setRadialGradient(this._context!, x, y, radius, c1, c2);\n\t}\n\n\t// ===== FONT OPERATIONS =====\n\n\tsetFont(font?: string): void {\n\t\tthis.initContext();\n\t\tthis._state.font = font || \"Verdana\";\n\t\tthis.loadFont(this._state.font);\n\t}\n\n\tloadFont(font: string): Promise<void> | void {\n\t\treturn FontOps.loadFont(font);\n\t}\n\n\tisFontReady(font?: string): boolean {\n\t\treturn FontOps.isFontReady(font || this._state?.font || \"Verdana\");\n\t}\n\n\t// ===== TRANSFORM OPERATIONS =====\n\n\tsetTranslation(translation_x: number, translation_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setTranslation(this._state, translation_x, translation_y);\n\t}\n\n\tsetScale(scale_x: number, scale_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setScale(this._state, scale_x, scale_y);\n\t}\n\n\tsetRotation(rotation: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setRotation(this._state, rotation);\n\t}\n\n\tsetDrawAnchor(anchor_x: number, anchor_y: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawAnchor(this._state, anchor_x, anchor_y);\n\t}\n\n\tsetDrawRotation(object_rotation: number): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawRotation(this._state, object_rotation);\n\t}\n\n\tsetDrawScale(object_scale_x: number, object_scale_y: number = object_scale_x): void {\n\t\tthis.initContext();\n\t\tTransformOps.setDrawScale(this._state, object_scale_x, object_scale_y);\n\t}\n\n\t// ===== DRAWING OPERATIONS =====\n\n\tfillRect(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRect(this._context!, this._state, x, y, w, h);\n\t}\n\n\tfillRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRoundRect(this._context!, this._state, x, y, w, h, round);\n\t}\n\n\tfillRound(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.fillRound(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawRect(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRect(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRoundRect(this._context!, this._state, x, y, w, h, round);\n\t}\n\n\tdrawRound(x: number, y: number, w: number, h: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawRound(this._context!, this._state, x, y, w, h);\n\t}\n\n\tdrawLine(x1: number, y1: number, x2: number, y2: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tDrawingOps.drawLine(this._context!, this._state, x1, y1, x2, y2);\n\t}\n\n\t// ===== SHAPE OPERATIONS =====\n\n\tdrawPolyline(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawPolyline(this._context!, this._state, points);\n\t}\n\n\tdrawPolygon(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawPolygon(this._context!, this._state, points);\n\t}\n\n\tfillPolygon(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.fillPolygon(this._context!, this._state, points);\n\t}\n\n\tdrawQuadCurve(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawQuadCurve(this._context!, this._state, points);\n\t}\n\n\tdrawBezierCurve(...args: any[]): void {\n\t\tthis.initContext();\n\t\tconst { points, color } = splitColorArg(args);\n\t\tthis.setColor(color);\n\t\tShapeOps.drawBezierCurve(this._context!, this._state, points);\n\t}\n\n\tdrawArc(x: number, y: number, radius: number, angle1: number, angle2: number, ccw: boolean, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tShapeOps.drawArc(this._context!, this._state, x, y, radius, angle1, angle2, ccw);\n\t}\n\n\tfillArc(x: number, y: number, radius: number, angle1: number, angle2: number, ccw: boolean, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tShapeOps.fillArc(this._context!, this._state, x, y, radius, angle1, angle2, ccw);\n\t}\n\n\t// ===== TEXT OPERATIONS =====\n\n\ttextWidth(text: string, size: number): number {\n\t\tthis.initContext();\n\t\treturn TextOps.textWidth(this._context!, this._state, text, size);\n\t}\n\n\tdrawText(text: string, x: number, y: number, size: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tTextOps.drawText(this._context!, this._state, text, x, y, size);\n\t}\n\n\tdrawTextOutline(text: string, x: number, y: number, size: number, color?: string): void {\n\t\tthis.initContext();\n\t\tthis.setColor(color);\n\t\tTextOps.drawTextOutline(this._context!, this._state, text, x, y, size);\n\t}\n\n\t// ===== SPRITE RENDERING =====\n\n\tdrawSprite(sprite: SpriteRenderingOps.SpriteSource | string, x: number, y: number, w?: number, h?: number): void {\n\t\tthis.initContext();\n\t\tSpriteRenderingOps.drawSprite(this._context!, this._state, sprite, x, y, w, h);\n\t}\n\n\tdrawImage(sprite: SpriteRenderingOps.SpriteSource | string, x: number, y: number, w?: number, h?: number): void {\n\t\tthis.drawSprite(sprite, x, y, w, h);\n\t}\n\n\tdrawSpritePart(\n\t\tsprite: SpriteRenderingOps.SpriteSource | string,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tthis.initContext();\n\t\tSpriteRenderingOps.drawSpritePart(this._context!, this._state, sprite, sx, sy, sw, sh, x, y, w, h);\n\t}\n\n\tdrawImagePart(\n\t\tsprite: SpriteRenderingOps.SpriteSource | string,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tthis.drawSpritePart(sprite, sx, sy, sw, sh, x, y, w, h);\n\t}\n\n\t// ===== MAP RENDERING =====\n\n\tdrawMap(map: MapRenderingOps.MapSource | string, x: number, y: number, w: number, h: number): void {\n\t\tthis.initContext();\n\t\tMapRenderingOps.drawMap(this._context!, this._state, map, x, y, w, h);\n\t}\n}\n","/**\n * Sprite - Animated sprite class for game graphics\n *\n * Provides sprite animation support with multiple frames.\n */\n\nimport { Image } from \"@al8b/image\";\n\nexport interface SpriteProperties {\n\tframes?: number;\n\tfps?: number;\n}\n\nexport class Sprite {\n\tpublic name: string = \"\";\n\tpublic frames: Image[] = [];\n\tpublic animation_start: number = 0;\n\tpublic fps: number = 5;\n\tpublic ready: number = 0;\n\tpublic width: number;\n\tpublic height: number;\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.frames = [];\n\t\tthis.animation_start = 0;\n\t\tthis.fps = 5;\n\n\t\tif (this.width > 0 && this.height > 0) {\n\t\t\tthis.frames.push(new Image(this.width, this.height));\n\t\t\tthis.ready = 1;\n\t\t}\n\t}\n\n\t/**\n\t * Set animation frames per second\n\t * Preserves current animation position when changing FPS\n\t */\n\tsetFPS(fps: number): number {\n\t\tconst dt = 1000 / this.fps;\n\t\tconst frame = ((Date.now() - this.animation_start) / dt) % this.frames.length;\n\t\tthis.fps = fps;\n\t\tconst newDt = 1000 / fps;\n\t\tthis.animation_start = Date.now() - frame * newDt;\n\t\treturn fps;\n\t}\n\n\t/**\n\t * Set the current animation frame\n\t */\n\tsetFrame(frame: number): void {\n\t\tthis.animation_start = Date.now() - (1000 / this.fps) * frame;\n\t}\n\n\t/**\n\t * Get the current animation frame index\n\t */\n\tgetFrame(): number {\n\t\tconst dt = 1000 / this.fps;\n\t\treturn Math.floor((Date.now() - this.animation_start) / dt) % this.frames.length;\n\t}\n\n\t/**\n\t * Get the canvas of the current frame\n\t */\n\tgetCurrentFrameCanvas(): HTMLCanvasElement | null {\n\t\tif (!this.ready || this.frames.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.frames.length > 1) {\n\t\t\tif (this.animation_start === 0) {\n\t\t\t\tthis.animation_start = Date.now();\n\t\t\t}\n\t\t\tconst frame = this.getFrame();\n\t\t\tif (frame >= 0 && frame < this.frames.length) {\n\t\t\t\treturn this.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn this.frames[0].canvas;\n\t\t}\n\n\t\treturn this.frames[0].canvas;\n\t}\n}\n\n/**\n * Resolve the actual number of animation frames for a spritesheet image.\n *\n * Strategy: if the image height is an exact multiple of its width (square frames),\n * cap the requested frame count to the available rows. Otherwise trust the caller.\n *\n * @param imgWidth - Natural width of the loaded image\n * @param imgHeight - Natural height of the loaded image\n * @param requested - Frame count requested via SpriteProperties (defaults to 1)\n */\nfunction resolveFrameCount(imgWidth: number, imgHeight: number, requested: number): number {\n\tif (imgWidth > 0 && imgHeight % imgWidth === 0) {\n\t\tconst available = imgHeight / imgWidth;\n\t\treturn Math.min(requested, available);\n\t}\n\treturn requested;\n}\n\n/**\n * Load a sprite from a URL\n * Supports multi-frame spritesheets (vertical stacking)\n */\nexport function LoadSprite(url: string, properties?: SpriteProperties, loaded?: () => void): Sprite {\n\tconst sprite = new Sprite(0, 0);\n\tsprite.ready = 0;\n\n\tconst img = new window.Image();\n\tif (location.protocol !== \"file:\") {\n\t\timg.crossOrigin = \"Anonymous\";\n\t}\n\timg.src = url;\n\n\timg.onload = () => {\n\t\tsprite.ready = 1;\n\n\t\tif (img.width > 0 && img.height > 0) {\n\t\t\tif (properties?.fps) {\n\t\t\t\tsprite.fps = properties.fps;\n\t\t\t}\n\n\t\t\tsprite.width = img.width;\n\t\t\tconst numframes = resolveFrameCount(img.width, img.height, properties?.frames ?? 1);\n\t\t\tsprite.height = Math.round(img.height / numframes);\n\t\t\tsprite.frames = [];\n\n\t\t\tfor (let i = 0; i < numframes; i++) {\n\t\t\t\tconst frame = new Image(sprite.width, sprite.height);\n\t\t\t\tframe.initContext();\n\t\t\t\tconst ctx = frame.context!;\n\t\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\t\tctx.drawImage(img, 0, -i * sprite.height);\n\t\t\t\tsprite.frames.push(frame);\n\t\t\t}\n\t\t\tsprite.ready = 1;\n\t\t}\n\n\t\tif (loaded) {\n\t\t\tloaded();\n\t\t}\n\t};\n\n\timg.onerror = () => {\n\t\tsprite.ready = 1;\n\t};\n\n\treturn sprite;\n}\n\n/**\n * Update a sprite from an image element\n * Supports multi-frame spritesheets (vertical stacking)\n */\nexport function UpdateSprite(sprite: Sprite, img: HTMLImageElement, properties?: SpriteProperties): void {\n\tif (img.width > 0 && img.height > 0) {\n\t\tif (properties?.fps) {\n\t\t\tsprite.fps = properties.fps;\n\t\t}\n\t\tsprite.width = img.width;\n\t\tconst numframes = resolveFrameCount(img.width, img.height, properties?.frames ?? 1);\n\t\tsprite.height = Math.round(img.height / numframes);\n\t\tsprite.frames = [];\n\n\t\tfor (let i = 0; i < numframes; i++) {\n\t\t\tconst frame = new Image(sprite.width, sprite.height);\n\t\t\tframe.initContext();\n\t\t\tconst ctx = frame.context!;\n\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\tctx.drawImage(img, 0, -i * sprite.height);\n\t\t\tsprite.frames.push(frame);\n\t\t}\n\t\tsprite.ready = 1;\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 * 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","/**\n * PlayerService - Controls player UX from LootiScript\n *\n * Provides game scripts with the ability to control the player lifecycle\n * (quit, pause, resume, exit), adjust performance (fps, update_rate),\n * and communicate with the host application (postMessage).\n */\n\nimport type { PlayerDelegate } from \"./types\";\n\nexport class PlayerService {\n\tprivate delegate: PlayerDelegate;\n\tprivate interfaceCache: Record<string, any> | null = null;\n\n\tconstructor(delegate: PlayerDelegate) {\n\t\tthis.delegate = delegate;\n\t}\n\n\t/**\n\t * Get interface for game code (LootiScript `player.*`)\n\t */\n\tgetInterface(): Record<string, any> {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\n\t\tconst iface: Record<string, any> = {\n\t\t\tpause: () => this.delegate.pause(),\n\t\t\tresume: () => this.delegate.resume(),\n\t\t\tpostMessage: (message: any) => this.delegate.postMessage(message),\n\t\t\tsetFps: (fps: number) => {\n\t\t\t\tif (typeof fps === \"number\" && isFinite(fps) && fps > 0) {\n\t\t\t\t\tthis.delegate.setUpdateRate(fps);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\tObject.defineProperty(iface, \"fps\", {\n\t\t\tget: () => this.delegate.getFps(),\n\t\t\tenumerable: true,\n\t\t});\n\n\t\tObject.defineProperty(iface, \"update_rate\", {\n\t\t\tget: () => this.delegate.getUpdateRate(),\n\t\t\tset: (value: number) => {\n\t\t\t\tif (typeof value === \"number\" && isFinite(value) && value > 0) {\n\t\t\t\t\tthis.delegate.setUpdateRate(value);\n\t\t\t\t}\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t});\n\n\t\tthis.interfaceCache = iface;\n\t\treturn this.interfaceCache;\n\t}\n}\n","/**\n * TTRI - Textured Triangle Rendering (Software Rasterization)\n *\n * Based on TIC-80's ttri implementation for 3D-style graphics.\n * This is NOT a 3D engine - it's pure 2D pixel manipulation using Canvas 2D API.\n *\n * How it works:\n * 1. Use getImageData() to get pixel buffer\n * 2. Rasterize triangle pixel-by-pixel (barycentric coordinates)\n * 3. Interpolate UV texture coordinates (perspective-correct with 1/z)\n * 4. Sample texture and write to pixel buffer\n * 5. Use putImageData() to update canvas\n *\n * This is software rendering like Doom, Quake software mode, and PlayStation 1.\n * No WebGL, no GPU - just CPU pixel manipulation.\n */\n\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nexport interface Vec2 {\n\tx: number;\n\ty: number;\n}\n\nexport interface Vec3 {\n\tx: number;\n\ty: number;\n\tz: number;\n}\n\nexport interface TexVert {\n\tx: number;\n\ty: number;\n\tu: number;\n\tv: number;\n\tz: number;\n}\n\nexport type TextureSource = \"tiles\" | \"map\" | \"screen\";\n\nexport interface TriangleData {\n\tcontext: CanvasRenderingContext2D;\n\twidth: number;\n\theight: number;\n\truntime?: any;\n\tpixelated: boolean;\n}\n\n/**\n * Z-Buffer for depth testing\n */\nexport class ZBuffer {\n\tprivate buffer: Float32Array;\n\tprivate width: number;\n\tprivate height: number;\n\n\tconstructor(width: number, height: number) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.buffer = new Float32Array(width * height);\n\t}\n\n\tclear(): void {\n\t\tthis.buffer.fill(0);\n\t}\n\n\tget(x: number, y: number): number {\n\t\treturn this.buffer[y * this.width + x] || 0;\n\t}\n\n\tset(x: number, y: number, z: number): void {\n\t\tthis.buffer[y * this.width + x] = z;\n\t}\n\n\tresize(width: number, height: number): void {\n\t\tif (this.width !== width || this.height !== height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.buffer = new Float32Array(width * height);\n\t\t}\n\t}\n}\n\n/**\n * Edge function for triangle rasterization\n */\nfunction edgeFn(a: Vec2, b: Vec2, c: Vec2): number {\n\treturn (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/**\n * Get pixel from sprite/image\n */\nfunction getSpritePixel(\n\tsprite: Sprite | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Resolve sprite canvas from object or runtime registry\n\tlet canvas: HTMLCanvasElement | null = null;\n\n\tif (sprite && typeof sprite === \"object\" && sprite.canvas) {\n\t\tcanvas = sprite.canvas;\n\t} else if (typeof sprite === \"string\" && runtime?.sprites) {\n\t\tconst spriteObj = runtime.sprites[sprite];\n\t\tif (spriteObj?.frames?.[0]?.canvas) {\n\t\t\tcanvas = spriteObj.frames[0].canvas;\n\t\t}\n\t}\n\n\tif (!canvas) return null;\n\n\t// Apply texture coordinate wrapping (repeat mode)\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Sample pixel color from sprite canvas\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get pixel from map\n */\nfunction getMapPixel(\n\tmap: Map | any,\n\tu: number,\n\tv: number,\n\truntime?: any,\n): {\n\tr: number;\n\tg: number;\n\tb: number;\n\ta: number;\n} | null {\n\t// Get map object\n\tlet mapObj: any = null;\n\n\tif (map && typeof map === \"object\" && map.getCanvas) {\n\t\tmapObj = map;\n\t} else if (typeof map === \"string\" && runtime?.maps) {\n\t\tmapObj = runtime.maps[map];\n\t}\n\n\tif (!mapObj) return null;\n\n\t// Get canvas from map\n\tconst canvas = mapObj.getCanvas ? mapObj.getCanvas() : mapObj.canvas;\n\tif (!canvas) return null;\n\n\t// Wrap texture coordinates\n\tconst width = canvas.width;\n\tconst height = canvas.height;\n\tconst x = Math.floor(u) % width;\n\tconst y = Math.floor(v) % height;\n\tconst px = x < 0 ? x + width : x;\n\tconst py = y < 0 ? y + height : y;\n\n\t// Get pixel data\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return null;\n\n\ttry {\n\t\tconst imageData = ctx.getImageData(px, py, 1, 1);\n\t\treturn {\n\t\t\tr: imageData.data[0],\n\t\t\tg: imageData.data[1],\n\t\t\tb: imageData.data[2],\n\t\t\ta: imageData.data[3],\n\t\t};\n\t} catch (e) {\n\t\treturn null;\n\t}\n}\n\n/**\n * Draw textured triangle with perspective correction\n */\nexport function drawTexturedTriangle(\n\tdata: TriangleData,\n\tv0: TexVert,\n\tv1: TexVert,\n\tv2: TexVert,\n\ttexture: Sprite | Map | string | any,\n\ttextureSource: TextureSource = \"tiles\",\n\tzBuffer?: ZBuffer,\n\tuseDepth: boolean = false,\n): void {\n\tconst { context, width, height, runtime, pixelated } = data;\n\n\t// Get bounding box\n\tconst minX = Math.max(0, Math.floor(Math.min(v0.x, v1.x, v2.x)));\n\tconst minY = Math.max(0, Math.floor(Math.min(v0.y, v1.y, v2.y)));\n\tconst maxX = Math.min(width, Math.ceil(Math.max(v0.x, v1.x, v2.x)));\n\tconst maxY = Math.min(height, Math.ceil(Math.max(v0.y, v1.y, v2.y)));\n\n\tif (minX >= maxX || minY >= maxY) return;\n\n\t// Calculate triangle area\n\tconst area = edgeFn(v0, v1, v2);\n\tif (Math.abs(area) < 0.001) return;\n\n\t// Backface culling\n\tif (area < 0) return;\n\n\t// Prepare perspective-correct interpolation\n\tconst useZ = useDepth && v0.z > 0 && v1.z > 0 && v2.z > 0;\n\n\tlet w0 = 1,\n\t\tw1 = 1,\n\t\tw2 = 1;\n\tlet u0 = v0.u,\n\t\tu1 = v1.u,\n\t\tu2 = v2.u;\n\tlet v0v = v0.v,\n\t\tv1v = v1.v,\n\t\tv2v = v2.v;\n\n\tif (useZ) {\n\t\tw0 = 1 / v0.z;\n\t\tw1 = 1 / v1.z;\n\t\tw2 = 1 / v2.z;\n\t\tu0 *= w0;\n\t\tu1 *= w1;\n\t\tu2 *= w2;\n\t\tv0v *= w0;\n\t\tv1v *= w1;\n\t\tv2v *= w2;\n\t}\n\n\t// Get image data for fast pixel manipulation\n\tconst imageData = context.getImageData(minX, minY, maxX - minX, maxY - minY);\n\tconst pixels = imageData.data;\n\n\t// Rasterize\n\tfor (let y = minY; y < maxY; y++) {\n\t\tfor (let x = minX; x < maxX; x++) {\n\t\t\tconst p = {\n\t\t\t\tx: x + 0.5,\n\t\t\t\ty: y + 0.5,\n\t\t\t};\n\n\t\t\t// Calculate barycentric coordinates\n\t\t\tconst w0b = edgeFn(v1, v2, p);\n\t\t\tconst w1b = edgeFn(v2, v0, p);\n\t\t\tconst w2b = edgeFn(v0, v1, p);\n\n\t\t\t// Check if point is inside triangle\n\t\t\tif (w0b >= 0 && w1b >= 0 && w2b >= 0) {\n\t\t\t\t// Normalize barycentric coordinates\n\t\t\t\tconst bary0 = w0b / area;\n\t\t\t\tconst bary1 = w1b / area;\n\t\t\t\tconst bary2 = w2b / area;\n\n\t\t\t\t// Depth test\n\t\t\t\tif (useZ && zBuffer) {\n\t\t\t\t\tconst z = bary0 * v0.z + bary1 * v1.z + bary2 * v2.z;\n\t\t\t\t\tconst currentZ = zBuffer.get(x, y);\n\t\t\t\t\tif (currentZ > 0 && currentZ >= z) continue;\n\t\t\t\t\tzBuffer.set(x, y, z);\n\t\t\t\t}\n\n\t\t\t\t// Interpolate texture coordinates\n\t\t\t\tlet u: number, v: number;\n\n\t\t\t\tif (useZ) {\n\t\t\t\t\tconst w = bary0 * w0 + bary1 * w1 + bary2 * w2;\n\t\t\t\t\tu = (bary0 * u0 + bary1 * u1 + bary2 * u2) / w;\n\t\t\t\t\tv = (bary0 * v0v + bary1 * v1v + bary2 * v2v) / w;\n\t\t\t\t} else {\n\t\t\t\t\tu = bary0 * v0.u + bary1 * v1.u + bary2 * v2.u;\n\t\t\t\t\tv = bary0 * v0.v + bary1 * v1.v + bary2 * v2.v;\n\t\t\t\t}\n\n\t\t\t\t// Sample texture\n\t\t\t\tlet pixel: {\n\t\t\t\t\tr: number;\n\t\t\t\t\tg: number;\n\t\t\t\t\tb: number;\n\t\t\t\t\ta: number;\n\t\t\t\t} | null = null;\n\n\t\t\t\tif (textureSource === \"map\") {\n\t\t\t\t\tpixel = getMapPixel(texture, u, v, runtime);\n\t\t\t\t} else {\n\t\t\t\t\tpixel = getSpritePixel(texture, u, v, runtime);\n\t\t\t\t}\n\n\t\t\t\t// Draw pixel\n\t\t\t\tif (pixel && pixel.a > 0) {\n\t\t\t\t\tconst idx = ((y - minY) * (maxX - minX) + (x - minX)) * 4;\n\t\t\t\t\tpixels[idx] = pixel.r;\n\t\t\t\t\tpixels[idx + 1] = pixel.g;\n\t\t\t\t\tpixels[idx + 2] = pixel.b;\n\t\t\t\t\tpixels[idx + 3] = pixel.a;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Put image data back\n\tcontext.imageSmoothingEnabled = !pixelated;\n\tcontext.putImageData(imageData, minX, minY);\n}\n\n/**\n * Draw solid color triangle\n */\nexport function drawTriangle(context: CanvasRenderingContext2D, v0: Vec2, v1: Vec2, v2: Vec2, color: string): void {\n\tcontext.fillStyle = color;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.fill();\n}\n\n/**\n * Draw triangle outline\n */\nexport function drawTriangleOutline(\n\tcontext: CanvasRenderingContext2D,\n\tv0: Vec2,\n\tv1: Vec2,\n\tv2: Vec2,\n\tcolor: string,\n\tlineWidth: number = 1,\n): void {\n\tcontext.strokeStyle = color;\n\tcontext.lineWidth = lineWidth;\n\tcontext.beginPath();\n\tcontext.moveTo(v0.x, v0.y);\n\tcontext.lineTo(v1.x, v1.y);\n\tcontext.lineTo(v2.x, v2.y);\n\tcontext.closePath();\n\tcontext.stroke();\n}\n","import { ZBuffer } from \"../tri\";\nimport type { ScreenInterface, ScreenOptions } from \"../types\";\n\n/**\n * BaseScreen encapsulates canvas/context management plus shared drawing state.\n * Feature-specific behaviors (primitives, sprites, text, triangles) extend this class.\n */\nexport class BaseScreen {\n\tprotected canvas: HTMLCanvasElement;\n\tprotected context!: CanvasRenderingContext2D;\n\tprotected runtime: any;\n\n\tpublic width!: number;\n\tpublic height!: number;\n\n\t// Drawing state\n\tprotected alpha = 1;\n\tprotected pixelated = 1;\n\tprotected line_width = 1;\n\tprotected font = \"BitCell\";\n\n\t// Transformations\n\tprotected translation_x = 0;\n\tprotected translation_y = 0;\n\tprotected rotation = 0;\n\tprotected scale_x = 1;\n\tprotected scale_y = 1;\n\tprotected screen_transform = false;\n\n\t// Object transformations\n\tprotected object_rotation = 0;\n\tprotected object_scale_x = 1;\n\tprotected object_scale_y = 1;\n\tprotected anchor_x = 0;\n\tprotected anchor_y = 0;\n\n\t// Blending + font caches\n\tprotected blending: Record<string, string> = {};\n\tprotected font_load_requested: Record<string, boolean> = {};\n\tprotected font_loaded: Record<string, boolean> = {};\n\n\t// Interface cache\n\tprotected interfaceCache: ScreenInterface | null = null;\n\n\t// Cursor management\n\tprotected cursor: string = \"default\";\n\tprotected cursor_visibility: string = \"auto\";\n\tprotected last_mouse_move: number = Date.now();\n\n\t// 3D helper\n\tprotected zBuffer: ZBuffer;\n\n\tconstructor(options: ScreenOptions = {}) {\n\t\tthis.runtime = options.runtime;\n\n\t\tif (options.canvas) {\n\t\t\tthis.canvas = options.canvas;\n\t\t\tif (this.canvas.width === 0 || this.canvas.height === 0) {\n\t\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\t\tthis.canvas.height = options.height || 1920;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.canvas = document.createElement(\"canvas\");\n\t\t\tthis.canvas.width = options.width || 1080;\n\t\t\tthis.canvas.height = options.height || 1920;\n\t\t}\n\n\t\tthis.initContext();\n\n\t\tthis.blending = {\n\t\t\tnormal: \"source-over\",\n\t\t\tadditive: \"lighter\",\n\t\t};\n\n\t\tconst blendModes = [\n\t\t\t\"source-over\",\n\t\t\t\"source-in\",\n\t\t\t\"source-out\",\n\t\t\t\"source-atop\",\n\t\t\t\"destination-over\",\n\t\t\t\"destination-in\",\n\t\t\t\"destination-out\",\n\t\t\t\"destination-atop\",\n\t\t\t\"lighter\",\n\t\t\t\"copy\",\n\t\t\t\"xor\",\n\t\t\t\"multiply\",\n\t\t\t\"screen\",\n\t\t\t\"overlay\",\n\t\t\t\"darken\",\n\t\t\t\"lighten\",\n\t\t\t\"color-dodge\",\n\t\t\t\"color-burn\",\n\t\t\t\"hard-light\",\n\t\t\t\"soft-light\",\n\t\t\t\"difference\",\n\t\t\t\"exclusion\",\n\t\t\t\"hue\",\n\t\t\t\"saturation\",\n\t\t\t\"color\",\n\t\t\t\"luminosity\",\n\t\t];\n\n\t\tfor (const mode of blendModes) {\n\t\t\tthis.blending[mode] = mode;\n\t\t}\n\n\t\tthis.loadFont(this.font);\n\t\tthis.zBuffer = new ZBuffer(this.canvas.width, this.canvas.height);\n\n\t\tthis.cursor = \"default\";\n\n\t\tthis.canvas.addEventListener(\"mousemove\", () => {\n\t\t\tthis.last_mouse_move = Date.now();\n\t\t\tif (this.cursor !== \"default\" && this.cursor_visibility === \"auto\") {\n\t\t\t\tthis.cursor = \"default\";\n\t\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t\t}\n\t\t});\n\n\t\t// When the context is lost and then restored, base transform needs to be reinstated\n\t\tthis.canvas.addEventListener(\"contextrestored\", () => {\n\t\t\tthis.initContext();\n\t\t});\n\n\t\tsetInterval(() => this.checkMouseCursor(), 1000);\n\t\tthis.cursor_visibility = \"auto\";\n\t}\n\n\tprotected initContext(): void {\n\t\tconst ctx = this.canvas.getContext(\"2d\", {\n\t\t\talpha: false,\n\t\t});\n\t\tif (!ctx) {\n\t\t\tconst message = \"Failed to get 2D rendering context\";\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7001\", message, data: {} });\n\n\t\t\tthrow new Error(message);\n\t\t}\n\n\t\tif (ctx !== this.context) {\n\t\t\tthis.context = ctx;\n\t\t} else {\n\t\t\tthis.context.restore();\n\t\t}\n\n\t\tthis.context.save();\n\t\tthis.context.translate(this.canvas.width / 2, this.canvas.height / 2);\n\n\t\t// Calculate ratio: Math.min(canvas.width/200, canvas.height/200)\n\t\tconst ratio = Math.min(this.canvas.width / 200, this.canvas.height / 200);\n\t\tthis.context.scale(ratio, ratio);\n\n\t\t// Set logical width/height\n\t\tthis.width = this.canvas.width / ratio;\n\t\tthis.height = this.canvas.height / ratio;\n\t\tthis.context.lineCap = \"round\";\n\t}\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\tinitDraw(): void {\n\t\tthis.alpha = 1;\n\t\tthis.line_width = 1;\n\t\t// Note: Supersampling not implemented in l8b\n\t\t// If needed, add: if (this.supersampling != this.previous_supersampling) { this.resize(); this.previous_supersampling = this.supersampling; }\n\t}\n\n\t/**\n\t * Update interface dimensions (called before each draw frame)\n\t */\n\tupdateInterface(): void {\n\t\t// Update interface cache if it exists\n\t\tif (this.interfaceCache) {\n\t\t\tthis.interfaceCache.width = this.width;\n\t\t\tthis.interfaceCache.height = this.height;\n\t\t}\n\t}\n\n\tclear(color?: string): void {\n\t\tthis.context.globalAlpha = 1;\n\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\tthis.context.fillStyle = color || \"#000\";\n\t\tthis.context.strokeStyle = color || \"#000\";\n\t\tthis.context.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n\t\tthis.zBuffer.clear();\n\t}\n\n\tsetColor(color: string | number): void {\n\t\tif (!color) return;\n\n\t\tif (!Number.isNaN(Number.parseInt(String(color)))) {\n\t\t\tconst num = Number.parseInt(String(color));\n\t\t\tconst r = ((Math.floor(num / 100) % 10) / 9) * 255;\n\t\t\tconst g = ((Math.floor(num / 10) % 10) / 9) * 255;\n\t\t\tconst b = ((num % 10) / 9) * 255;\n\t\t\tconst c = 0xff000000 + (r << 16) + (g << 8) + b;\n\t\t\tconst hex = \"#\" + c.toString(16).substring(2, 8);\n\t\t\tthis.context.fillStyle = hex;\n\t\t\tthis.context.strokeStyle = hex;\n\t\t} else if (typeof color === \"string\") {\n\t\t\t// Validate color format\n\t\t\tconst isValidColor =\n\t\t\t\t/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(color) ||\n\t\t\t\t/^rgb\\(|^rgba\\(|^hsl\\(|^hsla\\(/.test(color) ||\n\t\t\t\t/^(red|green|blue|yellow|cyan|magenta|black|white|gray|grey|orange|pink|purple|brown|transparent)$/i.test(color);\n\n\t\t\tif (!isValidColor) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7003\", message: \"Invalid color\", data: { color } });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.context.fillStyle = color;\n\t\t\tthis.context.strokeStyle = color;\n\t\t}\n\t}\n\n\tsetAlpha(alpha: number): void {\n\t\tthis.alpha = alpha;\n\t}\n\n\tsetPixelated(pixelated: number): void {\n\t\tthis.pixelated = pixelated;\n\t}\n\n\tsetBlending(blending: string): void {\n\t\tconst blend = this.blending[blending || \"normal\"];\n\n\t\tif (!blend) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7007\", message: \"Invalid blend mode\", data: { blendMode: blending } });\n\t\t\t// Fallback to normal blend mode\n\t\t\tthis.context.globalCompositeOperation = \"source-over\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalCompositeOperation = blend as GlobalCompositeOperation;\n\t}\n\n\tsetLineWidth(width: number): void {\n\t\tthis.line_width = width;\n\t}\n\n\tsetLineDash(dash: number[] | null): void {\n\t\tif (!Array.isArray(dash)) {\n\t\t\tthis.context.setLineDash([]);\n\t\t} else {\n\t\t\tthis.context.setLineDash(dash);\n\t\t}\n\t}\n\n\tsetLinearGradient(x1: number, y1: number, x2: number, y2: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createLinearGradient(x1, -y1, x2, -y2);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetRadialGradient(x: number, y: number, radius: number, c1: string, c2: string): void {\n\t\tconst grd = this.context.createRadialGradient(x, -y, 0, x, -y, radius);\n\t\tgrd.addColorStop(0, c1);\n\t\tgrd.addColorStop(1, c2);\n\t\tthis.context.fillStyle = grd;\n\t\tthis.context.strokeStyle = grd;\n\t}\n\n\tsetFont(font: string): void {\n\t\tthis.font = font || \"Verdana\";\n\t\tthis.loadFont(this.font);\n\t}\n\n\tloadFont(font: string = \"BitCell\"): void {\n\t\tif (this.font_load_requested[font]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.font_load_requested[font] = true;\n\t\ttry {\n\t\t\tdocument.fonts?.load?.(`16pt ${font}`).catch(() => {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7006\", message: \"Font loading failed\", data: { font } });\n\t\t\t});\n\t\t} catch {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7006\", message: \"Font loading failed\", data: { font } });\n\t\t}\n\t}\n\n\tisFontReady(font: string = this.font): number {\n\t\tif (this.font_loaded[font]) {\n\t\t\treturn 1;\n\t\t}\n\n\t\ttry {\n\t\t\tconst ready = document.fonts?.check?.(`16pt ${font}`) ?? true;\n\t\t\tif (ready) {\n\t\t\t\tthis.font_loaded[font] = true;\n\t\t\t}\n\t\t\treturn ready ? 1 : 0;\n\t\t} catch {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tsetTranslation(tx: number, ty: number): void {\n\t\tthis.translation_x = isFinite(tx) ? tx : 0;\n\t\tthis.translation_y = isFinite(ty) ? ty : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetScale(x: number, y: number): void {\n\t\tthis.scale_x = isFinite(x) && x !== 0 ? x : 1;\n\t\tthis.scale_y = isFinite(y) && y !== 0 ? y : 1;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tsetRotation(rotation: number): void {\n\t\tthis.rotation = isFinite(rotation) ? rotation : 0;\n\t\tthis.updateScreenTransform();\n\t}\n\n\tprotected updateScreenTransform(): void {\n\t\tthis.screen_transform =\n\t\t\tthis.translation_x !== 0 ||\n\t\t\tthis.translation_y !== 0 ||\n\t\t\tthis.scale_x !== 1 ||\n\t\t\tthis.scale_y !== 1 ||\n\t\t\tthis.rotation !== 0;\n\t}\n\n\tsetDrawAnchor(ax: number, ay: number): void {\n\t\tthis.anchor_x = typeof ax === \"number\" ? ax : 0;\n\t\tthis.anchor_y = typeof ay === \"number\" ? ay : 0;\n\t}\n\n\tsetDrawRotation(rotation: number): void {\n\t\tthis.object_rotation = rotation;\n\t}\n\n\tsetDrawScale(x: number, y: number = x): void {\n\t\tthis.object_scale_x = x;\n\t\tthis.object_scale_y = y;\n\t}\n\n\tprotected initDrawOp(x: number, y: number, object_transform: boolean = true): boolean {\n\t\tlet res = false;\n\n\t\tif (this.screen_transform) {\n\t\t\tthis.context.save();\n\t\t\tres = true;\n\t\t\tthis.context.translate(this.translation_x, -this.translation_y);\n\t\t\tthis.context.scale(this.scale_x, this.scale_y);\n\t\t\tthis.context.rotate((-this.rotation / 180) * Math.PI);\n\t\t\tthis.context.translate(x, y);\n\t\t}\n\n\t\tif (object_transform && (this.object_rotation !== 0 || this.object_scale_x !== 1 || this.object_scale_y !== 1)) {\n\t\t\tif (!res) {\n\t\t\t\tthis.context.save();\n\t\t\t\tres = true;\n\t\t\t\tthis.context.translate(x, y);\n\t\t\t}\n\n\t\t\tif (this.object_rotation !== 0) {\n\t\t\t\tthis.context.rotate((-this.object_rotation / 180) * Math.PI);\n\t\t\t}\n\n\t\t\tif (this.object_scale_x !== 1 || this.object_scale_y !== 1) {\n\t\t\t\tthis.context.scale(this.object_scale_x, this.object_scale_y);\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tprotected closeDrawOp(): void {\n\t\tthis.context.restore();\n\t}\n\n\t/**\n\t * Check mouse cursor visibility\n\t * Auto-hides cursor after 4 seconds of inactivity\n\t */\n\tprotected checkMouseCursor(): void {\n\t\tif (Date.now() > this.last_mouse_move + 4000 && this.cursor_visibility === \"auto\") {\n\t\t\tif (this.cursor !== \"none\") {\n\t\t\t\tthis.cursor = \"none\";\n\t\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set cursor visibility\n\t */\n\tsetCursorVisible(visible: boolean): void {\n\t\tthis.cursor_visibility = visible ? \"default\" : \"none\";\n\t\tif (visible) {\n\t\t\tthis.cursor = \"default\";\n\t\t\tthis.canvas.style.cursor = \"default\";\n\t\t} else {\n\t\t\tthis.cursor = \"none\";\n\t\t\tthis.canvas.style.cursor = \"none\";\n\t\t}\n\t}\n\n\tgetCanvas(): HTMLCanvasElement {\n\t\treturn this.canvas;\n\t}\n\n\tgetContext(): CanvasRenderingContext2D {\n\t\treturn this.context;\n\t}\n\n\tresize(width?: number, height?: number): void {\n\t\tif (width && height) {\n\t\t\t// Validate dimensions\n\t\t\tif (width <= 0 || height <= 0 || !isFinite(width) || !isFinite(height)) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7002\", message: \"Invalid resize dimensions\", data: { width, height } });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.canvas.width = width;\n\t\t\tthis.canvas.height = height;\n\t\t\tthis.initContext();\n\t\t\tthis.zBuffer.resize(width, height);\n\t\t\t// Update interface cache immediately after resize\n\t\t\tthis.updateInterface();\n\t\t}\n\t}\n}\n","import { BaseScreen } from \"../core/base-screen\";\n\n/**\n * Adds primitive shape drawing APIs on top of BaseScreen.\n */\nexport class PrimitiveScreen extends BaseScreen {\n\tfillRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\t// Validate drawing context\n\t\tif (!this.context) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7092\", message: \"Drawing context not available\", data: {} });\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate drawing parameters\n\t\tif (!isFinite(x) || !isFinite(y) || !isFinite(w) || !isFinite(h) || w <= 0 || h <= 0) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7093\", message: \"Invalid draw parameters\", data: { error: `Invalid parameters: x=${x}, y=${y}, w=${w}, h=${h}` } });\n\t\t\treturn;\n\t\t}\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tfillRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tdrawRect(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeRect(-w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeRect(x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\tdrawRoundRect(x: number, y: number, w: number, h: number, round: number = 10, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(x, -y);\n\t\tconst rx = (transform ? -w / 2 : x - w / 2) - (this.anchor_x * w) / 2;\n\t\tconst ry = (transform ? -h / 2 : -y - h / 2) + (this.anchor_y * h) / 2;\n\n\t\tthis.context.beginPath();\n\t\tif (this.context.roundRect) {\n\t\t\tthis.context.roundRect(rx, ry, w, h, round);\n\t\t} else {\n\t\t\tconst r = Math.min(round, w / 2, h / 2);\n\t\t\tthis.context.moveTo(rx + r, ry);\n\t\t\tthis.context.lineTo(rx + w - r, ry);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry, rx + w, ry + r);\n\t\t\tthis.context.lineTo(rx + w, ry + h - r);\n\t\t\tthis.context.quadraticCurveTo(rx + w, ry + h, rx + w - r, ry + h);\n\t\t\tthis.context.lineTo(rx + r, ry + h);\n\t\t\tthis.context.quadraticCurveTo(rx, ry + h, rx, ry + h - r);\n\t\t\tthis.context.lineTo(rx, ry + r);\n\t\t\tthis.context.quadraticCurveTo(rx, ry, rx + r, ry);\n\t\t\tthis.context.closePath();\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawRound(x: number, y: number, w: number, h: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tw = Math.abs(w);\n\t\th = Math.abs(h);\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse((-this.anchor_x * w) / 2, (this.anchor_y * h) / 2, w / 2, h / 2, 0, 0, Math.PI * 2, false);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.ellipse(\n\t\t\t\tx - (this.anchor_x * w) / 2,\n\t\t\t\t-y + (this.anchor_y * h) / 2,\n\t\t\t\tw / 2,\n\t\t\t\th / 2,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.PI * 2,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tdrawLine(x1: number, y1: number, x2: number, y2: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(x1, -y1);\n\t\tthis.context.lineTo(x2, -y2);\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.closePath();\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawPolyline(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tfillPolygon(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst len = Math.floor(points.length / 2);\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tthis.context.lineTo(points[i * 2], -points[i * 2 + 1]);\n\t\t}\n\t\tthis.context.fill();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawQuadCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 4) {\n\t\t\tthis.context.quadraticCurveTo(points[index], -points[index + 1], points[index + 2], -points[index + 3]);\n\t\t\tindex += 4;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawBezierCurve(args: any[]): void {\n\t\tconst { color, points } = this.extractPoints(args);\n\t\tif (!points || points.length < 4) return;\n\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tconst transform = this.initDrawOp(0, 0, false);\n\t\tthis.context.beginPath();\n\t\tthis.context.moveTo(points[0], -points[1]);\n\t\tlet index = 2;\n\t\twhile (index <= points.length - 6) {\n\t\t\tthis.context.bezierCurveTo(\n\t\t\t\tpoints[index],\n\t\t\t\t-points[index + 1],\n\t\t\t\tpoints[index + 2],\n\t\t\t\t-points[index + 3],\n\t\t\t\tpoints[index + 4],\n\t\t\t\t-points[index + 5],\n\t\t\t);\n\t\t\tindex += 6;\n\t\t}\n\t\tthis.context.stroke();\n\t\tif (transform) this.closeDrawOp();\n\t}\n\n\tdrawArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.lineWidth = this.line_width;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.stroke();\n\t\t}\n\t}\n\n\tfillArc(\n\t\tx: number,\n\t\ty: number,\n\t\tradius: number,\n\t\tangle1: number,\n\t\tangle2: number,\n\t\tccw: boolean,\n\t\tcolor?: string | number,\n\t): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(0, 0, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(x, -y, radius, (-angle1 / 180) * Math.PI, (-angle2 / 180) * Math.PI, ccw);\n\t\t\tthis.context.fill();\n\t\t}\n\t}\n\n\tprivate extractPoints(args: any[]): {\n\t\tcolor?: string | number;\n\t\tpoints?: number[];\n\t} {\n\t\tlet color: string | number | undefined;\n\t\tlet points: number[] | undefined;\n\n\t\tif (args.length > 0 && args.length % 2 === 1 && typeof args[args.length - 1] === \"string\") {\n\t\t\tcolor = args[args.length - 1];\n\t\t\tpoints = args.slice(0, -1);\n\t\t} else if (Array.isArray(args[0])) {\n\t\t\tif (args[1] && typeof args[1] === \"string\") {\n\t\t\t\tcolor = args[1];\n\t\t\t}\n\t\t\tpoints = args[0];\n\t\t} else {\n\t\t\tpoints = args as number[];\n\t\t}\n\n\t\treturn {\n\t\t\tcolor,\n\t\t\tpoints,\n\t\t};\n\t}\n}\n","/**\n * Sprite rendering for Screen class\n */\n\nimport type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { PrimitiveScreen } from \"./primitives-screen\";\n\nexport class SpriteScreen extends PrimitiveScreen {\n\t// Cache imageSmoothingEnabled — only set when pixelated flag changes\n\tprivate _lastImageSmoothing = true;\n\n\t// Cache frame time once per draw frame instead of per-sprite\n\tprotected _frameTime = 0;\n\n\t/**\n\t * Initialize draw state (called before each draw frame)\n\t */\n\toverride initDraw(): void {\n\t\tsuper.initDraw();\n\t\tthis._frameTime = performance.now();\n\t}\n\n\t/**\n\t * Set imageSmoothingEnabled only when it actually changes\n\t */\n\tprotected setImageSmoothing(): void {\n\t\tconst smooth = !this.pixelated;\n\t\tif (smooth !== this._lastImageSmoothing) {\n\t\t\tthis.context.imageSmoothingEnabled = smooth;\n\t\t\tthis._lastImageSmoothing = smooth;\n\t\t}\n\t}\n\n\t/**\n\t * Get the canvas for the current sprite frame\n\t */\n\tprotected getSpriteFrame(sprite: Sprite | string | any): HTMLCanvasElement | null {\n\t\tlet frame: number | null = null;\n\n\t\t// Handle string sprite name\n\t\tif (typeof sprite === \"string\") {\n\t\t\tconst spriteName = sprite;\n\t\t\tlet spriteObj: Sprite | null = null;\n\n\t\t\tif (this.runtime && this.runtime.sprites) {\n\t\t\t\tspriteObj = this.runtime.sprites[sprite];\n\t\t\t}\n\n\t\t\t// Handle \"sprite.frame\" format (e.g., \"player.0\")\n\t\t\tif (!spriteObj) {\n\t\t\t\tconst parts = sprite.split(\".\");\n\t\t\t\tif (parts.length > 1 && this.runtime && this.runtime.sprites) {\n\t\t\t\t\tspriteObj = this.runtime.sprites[parts[0]];\n\t\t\t\t\tframe = Number.parseInt(parts[1]) || 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Report sprite not found error\n\t\t\tif (!spriteObj) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7004\", message: \"Sprite not found\", data: { spriteName } });\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tsprite = spriteObj;\n\t\t}\n\t\t// Handle Image instances - check for objects with canvas but no frames\n\t\telse if (sprite && typeof sprite === \"object\" && (sprite as any).canvas && !(sprite as any).frames) {\n\t\t\treturn (sprite as any).canvas || (sprite as any).image || null;\n\t\t}\n\n\t\t// Validate sprite object\n\t\tif (!sprite || !(sprite as Sprite).ready) {\n\t\t\tconst spriteName = typeof sprite === \"string\" ? sprite : \"unknown\";\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7005\", message: \"Sprite not ready\", data: { spriteName } });\n\t\t\treturn null;\n\t\t}\n\n\t\tconst spriteObj = sprite as Sprite;\n\n\t\t// Handle multi-frame sprites — use cached _frameTime instead of Date.now() per call\n\t\tif (spriteObj.frames && spriteObj.frames.length > 1) {\n\t\t\tif (frame === null) {\n\t\t\t\tif (spriteObj.animation_start === 0) {\n\t\t\t\t\tspriteObj.animation_start = this._frameTime;\n\t\t\t\t}\n\t\t\t\tconst dt = 1000 / spriteObj.fps;\n\t\t\t\tframe = Math.floor((this._frameTime - spriteObj.animation_start) / dt) % spriteObj.frames.length;\n\t\t\t}\n\t\t\tif (frame >= 0 && frame < spriteObj.frames.length) {\n\t\t\t\treturn spriteObj.frames[frame].canvas;\n\t\t\t}\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\t\t// Handle single-frame sprites\n\t\telse if (spriteObj.frames && spriteObj.frames[0]) {\n\t\t\treturn spriteObj.frames[0].canvas;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Draw a sprite\n\t */\n\tdrawSprite(sprite: Sprite | string | any, x: number, y: number, w?: number, h?: number): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = canvas.width;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / canvas.width) * canvas.height;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\t// Only when no screen/object transforms are active (simple AABB check)\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(canvas, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(canvas, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a portion of a sprite\n\t */\n\tdrawSpritePart(\n\t\tsprite: Sprite | string | any,\n\t\tsx: number,\n\t\tsy: number,\n\t\tsw: number,\n\t\tsh: number,\n\t\tx: number,\n\t\ty: number,\n\t\tw?: number,\n\t\th?: number,\n\t): void {\n\t\tconst canvas = this.getSpriteFrame(sprite);\n\t\tif (!canvas) return;\n\n\t\tif (w == null) {\n\t\t\tw = sw;\n\t\t}\n\n\t\tif (!h) {\n\t\t\th = (w / sw) * sh;\n\t\t}\n\n\t\t// Viewport culling: skip sprites entirely outside visible area\n\t\tif (\n\t\t\t!this.screen_transform &&\n\t\t\tthis.object_rotation === 0 &&\n\t\t\tthis.object_scale_x === 1 &&\n\t\t\tthis.object_scale_y === 1\n\t\t) {\n\t\t\tconst drawX = x - w / 2 - (this.anchor_x * w) / 2;\n\t\t\tconst drawY = -y - h / 2 + (this.anchor_y * h) / 2;\n\t\t\tconst halfW = this.width / 2;\n\t\t\tconst halfH = this.height / 2;\n\t\t\tif (drawX > halfW || drawX + w < -halfW || drawY > halfH || drawY + h < -halfH) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\t-w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.drawImage(\n\t\t\t\tcanvas,\n\t\t\t\tsx,\n\t\t\t\tsy,\n\t\t\t\tsw,\n\t\t\t\tsh,\n\t\t\t\tx - w / 2 - (this.anchor_x * w) / 2,\n\t\t\t\t-y - h / 2 + (this.anchor_y * h) / 2,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a map\n\t */\n\tdrawMap(map: Map | string, x: number, y: number, w: number, h: number): void {\n\t\tlet mapObj: Map | null = null;\n\n\t\tif (typeof map === \"string\") {\n\t\t\tif (this.runtime && this.runtime.maps) {\n\t\t\t\tmapObj = this.runtime.maps[map];\n\t\t\t}\n\t\t} else {\n\t\t\tmapObj = map;\n\t\t}\n\n\t\tif (!(mapObj && mapObj.ready)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.setImageSmoothing();\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tmapObj.draw(this.context, -w / 2 - (this.anchor_x * w) / 2, -h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tmapObj.draw(this.context, x - w / 2 - (this.anchor_x * w) / 2, -y - h / 2 + (this.anchor_y * h) / 2, w, h);\n\t\t}\n\t}\n}\n","import { SpriteScreen } from \"./sprite-screen\";\n\nexport class TextScreen extends SpriteScreen {\n\t// Font string cache — avoid rebuilding template string every draw call\n\tprivate _cachedFontSize = -1;\n\tprivate _cachedFontName = \"\";\n\tprivate _cachedFontString = \"\";\n\n\tprivate getFontString(size: number): string {\n\t\tif (size !== this._cachedFontSize || this.font !== this._cachedFontName) {\n\t\t\tthis._cachedFontSize = size;\n\t\t\tthis._cachedFontName = this.font;\n\t\t\tthis._cachedFontString = `${size}pt ${this.font}`;\n\t\t}\n\t\treturn this._cachedFontString;\n\t}\n\n\ttextWidth(text: string, size: number): number {\n\t\tthis.context.font = this.getFontString(size);\n\t\treturn this.context.measureText(text).width;\n\t}\n\n\tdrawText(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.fillText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.fillText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n\n\tdrawTextOutline(text: string, x: number, y: number, size: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\t\tthis.context.font = this.getFontString(size);\n\t\tthis.context.lineWidth = this.line_width;\n\t\tthis.context.textAlign = \"center\";\n\t\tthis.context.textBaseline = \"middle\";\n\t\tconst w = this.context.measureText(text).width;\n\t\tconst h = size;\n\t\tif (this.initDrawOp(x, -y)) {\n\t\t\tthis.context.strokeText(text, 0 - (this.anchor_x * w) / 2, 0 + (this.anchor_y * h) / 2);\n\t\t\tthis.closeDrawOp();\n\t\t} else {\n\t\t\tthis.context.strokeText(text, x - (this.anchor_x * w) / 2, -y + (this.anchor_y * h) / 2);\n\t\t}\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\n\nimport { TextScreen } from \"../drawing/text-screen\";\nimport { drawTexturedTriangle, drawTriangle, drawTriangleOutline, type TextureSource, type TriangleData } from \"./ttri\";\n\nexport class TriangleScreen extends TextScreen {\n\ttri(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangle(this.context, v0, v1, v2, this.context.fillStyle as string);\n\t}\n\n\ttrib(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number): void {\n\t\tif (color) this.setColor(color);\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst v0 = {\n\t\t\tx: x1,\n\t\t\ty: -y1,\n\t\t};\n\t\tconst v1 = {\n\t\t\tx: x2,\n\t\t\ty: -y2,\n\t\t};\n\t\tconst v2 = {\n\t\t\tx: x3,\n\t\t\ty: -y3,\n\t\t};\n\n\t\tdrawTriangleOutline(this.context, v0, v1, v2, this.context.strokeStyle as string, this.line_width);\n\t}\n\n\tttri(\n\t\tx1: number,\n\t\ty1: number,\n\t\tx2: number,\n\t\ty2: number,\n\t\tx3: number,\n\t\ty3: number,\n\t\tu1: number,\n\t\tv1: number,\n\t\tu2: number,\n\t\tv2: number,\n\t\tu3: number,\n\t\tv3: number,\n\t\ttexture: Sprite | Map | string,\n\t\ttextureSource: TextureSource = \"tiles\",\n\t\tz1: number = 1,\n\t\tz2: number = 1,\n\t\tz3: number = 1,\n\t\tuseDepth: boolean = false,\n\t): void {\n\t\tthis.context.globalAlpha = this.alpha;\n\n\t\tconst canvasWidth = this.canvas.width;\n\t\tconst canvasHeight = this.canvas.height;\n\t\tconst ratio = Math.min(canvasWidth / 200, canvasHeight / 200);\n\n\t\tconst toCanvasX = (x: number) => canvasWidth / 2 + x * ratio;\n\t\tconst toCanvasY = (y: number) => canvasHeight / 2 - y * ratio;\n\n\t\tconst data: TriangleData = {\n\t\t\tcontext: this.context,\n\t\t\twidth: canvasWidth,\n\t\t\theight: canvasHeight,\n\t\t\truntime: this.runtime,\n\t\t\tpixelated: this.pixelated === 1,\n\t\t};\n\n\t\tdrawTexturedTriangle(\n\t\t\tdata,\n\t\t\t{\n\t\t\t\tx: toCanvasX(x1),\n\t\t\t\ty: toCanvasY(y1),\n\t\t\t\tu: u1,\n\t\t\t\tv: v1,\n\t\t\t\tz: z1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x2),\n\t\t\t\ty: toCanvasY(y2),\n\t\t\t\tu: u2,\n\t\t\t\tv: v2,\n\t\t\t\tz: z2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tx: toCanvasX(x3),\n\t\t\t\ty: toCanvasY(y3),\n\t\t\t\tu: u3,\n\t\t\t\tv: v3,\n\t\t\t\tz: z3,\n\t\t\t},\n\t\t\ttexture,\n\t\t\ttextureSource,\n\t\t\tthis.zBuffer,\n\t\t\tuseDepth,\n\t\t);\n\t}\n}\n","import type { TileMap as Map } from \"@al8b/map\";\nimport type { Sprite } from \"@al8b/sprites\";\nimport type { TextureSource } from \"../tri\";\nimport { TriangleScreen } from \"../tri/triangle-screen\";\nimport type { ScreenInterface } from \"../types\";\n\nexport class Screen extends TriangleScreen {\n\tgetInterface(): ScreenInterface {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\n\t\tconst screen = this;\n\t\tthis.interfaceCache = {\n\t\t\twidth: screen.width,\n\t\t\theight: screen.height,\n\t\t\tclear: (color?: string) => screen.clear(color),\n\t\t\tsetColor: (color: string | number) => screen.setColor(color),\n\t\t\tsetAlpha: (alpha: number) => screen.setAlpha(alpha),\n\t\t\tsetPixelated: (pixelated: number) => screen.setPixelated(pixelated),\n\t\t\tsetBlending: (blending: string) => screen.setBlending(blending),\n\t\t\tsetLinearGradient: (x1: number, y1: number, x2: number, y2: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setLinearGradient(x1, y1, x2, y2, c1, c2),\n\t\t\tsetRadialGradient: (x: number, y: number, radius: number, c1: string, c2: string) =>\n\t\t\t\tscreen.setRadialGradient(x, y, radius, c1, c2),\n\t\t\tsetFont: (font: string) => screen.setFont(font),\n\t\t\tsetTranslation: (tx: number, ty: number) => screen.setTranslation(tx, ty),\n\t\t\tsetScale: (x: number, y: number) => screen.setScale(x, y),\n\t\t\tsetRotation: (rotation: number) => screen.setRotation(rotation),\n\t\t\tsetDrawAnchor: (ax: number, ay: number) => screen.setDrawAnchor(ax, ay),\n\t\t\tsetDrawRotation: (rotation: number) => screen.setDrawRotation(rotation),\n\t\t\tsetDrawScale: (x: number, y?: number) => screen.setDrawScale(x, y),\n\t\t\tfillRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRect(x, y, w, h, c),\n\t\t\tfillRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.fillRoundRect(x, y, w, h, r, c),\n\t\t\tfillRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.fillRound(x, y, w, h, c),\n\t\t\tdrawRect: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRect(x, y, w, h, c),\n\t\t\tdrawRoundRect: (x: number, y: number, w: number, h: number, r?: number, c?: string | number) =>\n\t\t\t\tscreen.drawRoundRect(x, y, w, h, r, c),\n\t\t\tdrawRound: (x: number, y: number, w: number, h: number, c?: string | number) => screen.drawRound(x, y, w, h, c),\n\t\t\tdrawSprite: (sprite: Sprite | string, x: number, y: number, w?: number, h?: number) =>\n\t\t\t\tscreen.drawSprite(sprite, x, y, w, h),\n\t\t\tdrawSpritePart: (\n\t\t\t\tsprite: Sprite | string,\n\t\t\t\tsx: number,\n\t\t\t\tsy: number,\n\t\t\t\tsw: number,\n\t\t\t\tsh: number,\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tw?: number,\n\t\t\t\th?: number,\n\t\t\t) => screen.drawSpritePart(sprite, sx, sy, sw, sh, x, y, w, h),\n\t\t\tdrawMap: (map: Map | string, x: number, y: number, w: number, h: number) => screen.drawMap(map, x, y, w, h),\n\t\t\tdrawText: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawText(text, x, y, size, color),\n\t\t\tdrawTextOutline: (text: string, x: number, y: number, size: number, color?: string | number) =>\n\t\t\t\tscreen.drawTextOutline(text, x, y, size, color),\n\t\t\ttextWidth: (text: string, size: number) => screen.textWidth(text, size),\n\t\t\tsetLineWidth: (width: number) => screen.setLineWidth(width),\n\t\t\tsetLineDash: (dash: number[] | null) => screen.setLineDash(dash),\n\t\t\tdrawLine: (x1: number, y1: number, x2: number, y2: number, color?: string | number) =>\n\t\t\t\tscreen.drawLine(x1, y1, x2, y2, color),\n\t\t\tdrawPolygon: (...args: any[]) => screen.drawPolygon(args),\n\t\t\tdrawPolyline: (...args: any[]) => screen.drawPolyline(args),\n\t\t\tfillPolygon: (...args: any[]) => screen.fillPolygon(args),\n\t\t\tdrawQuadCurve: (...args: any[]) => screen.drawQuadCurve(args),\n\t\t\tdrawBezierCurve: (...args: any[]) => screen.drawBezierCurve(args),\n\t\t\tdrawArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.drawArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tfillArc: (\n\t\t\t\tx: number,\n\t\t\t\ty: number,\n\t\t\t\tradius: number,\n\t\t\t\tangle1: number,\n\t\t\t\tangle2: number,\n\t\t\t\tccw: boolean,\n\t\t\t\tcolor?: string | number,\n\t\t\t) => screen.fillArc(x, y, radius, angle1, angle2, ccw, color),\n\t\t\tsetCursorVisible: (visible: boolean) => screen.setCursorVisible(visible),\n\t\t\tloadFont: (font: string) => screen.loadFont(font),\n\t\t\tisFontReady: (font?: string) => screen.isFontReady(font),\n\t\t\ttri: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.tri(x1, y1, x2, y2, x3, y3, color),\n\t\t\ttrib: (x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, color?: string | number) =>\n\t\t\t\tscreen.trib(x1, y1, x2, y2, x3, y3, color),\n\t\t\tttri: (\n\t\t\t\tx1: number,\n\t\t\t\ty1: number,\n\t\t\t\tx2: number,\n\t\t\t\ty2: number,\n\t\t\t\tx3: number,\n\t\t\t\ty3: number,\n\t\t\t\tu1: number,\n\t\t\t\tv1: number,\n\t\t\t\tu2: number,\n\t\t\t\tv2: number,\n\t\t\t\tu3: number,\n\t\t\t\tv3: number,\n\t\t\t\ttexture: Sprite | Map | string,\n\t\t\t\ttextureSource?: TextureSource,\n\t\t\t\tz1?: number,\n\t\t\t\tz2?: number,\n\t\t\t\tz3?: number,\n\t\t\t\tuseDepth?: boolean,\n\t\t\t) => screen.ttri(x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, texture, textureSource, z1, z2, z3, useDepth),\n\t\t};\n\n\t\treturn this.interfaceCache;\n\t}\n}\n\nexport default Screen;\n","/** Default recording buffer: 30 seconds at 60fps (1800 frames) */\nexport const DEFAULT_RECORD_BUFFER_FRAMES = 60 * 30;\n\n/** Default loop playback buffer: 4 seconds at 60fps (240 frames) */\nexport const DEFAULT_LOOP_BUFFER_FRAMES = 60 * 4;\n","/**\n * Deep copy a value, optionally skipping excluded references.\n *\n * @param value - The value to deep copy\n * @param excluded - Optional array of object references to skip (replaced with null)\n */\nexport function deepCopy(value: any, excluded?: any[]): any {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (excluded && excluded.includes(value)) {\n\t\treturn null;\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\tconst result: any[] = [];\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tresult[i] = deepCopy(value[i], excluded);\n\t\t}\n\t\treturn result;\n\t}\n\n\tif (typeof value === \"object\") {\n\t\tconst result: any = {};\n\t\tfor (const key in value) {\n\t\t\tif (Object.hasOwn(value, key)) {\n\t\t\t\tresult[key] = deepCopy(value[key], excluded);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t// Non-serializable types: return null when filtering, passthrough otherwise\n\treturn excluded ? null : value;\n}\n","/**\n * StatePlayer - Handles replay and loop playback\n *\n * Responsibilities:\n * - Restore state snapshots\n * - Manage loop playback\n * - Control playback position\n */\nimport { DEFAULT_LOOP_BUFFER_FRAMES } from \"../constants\";\nimport { deepCopy } from \"../utils\";\n\nimport type { StateSnapshot } from \"../types\";\n\nexport class StatePlayer {\n\tprivate looping = false;\n\tprivate loopStart = 0;\n\tprivate loopIndex = 0;\n\tprivate loopLength: number;\n\tprivate loopCallback: (() => void) | null = null;\n\n\tconstructor(loopLength = DEFAULT_LOOP_BUFFER_FRAMES) {\n\t\tthis.loopLength = loopLength;\n\t}\n\n\t/**\n\t * Check if currently looping\n\t */\n\tisLooping(): boolean {\n\t\treturn this.looping;\n\t}\n\n\t/**\n\t * Start loop playback\n\t */\n\tstartLoop(position: number, callback: () => void): void {\n\t\tthis.looping = true;\n\t\tthis.loopStart = Math.max(position, 1);\n\t\tthis.loopIndex = 0;\n\t\tthis.loopCallback = callback;\n\t}\n\n\t/**\n\t * Stop loop playback\n\t */\n\tstopLoop(): number {\n\t\tthis.looping = false;\n\t\tthis.loopCallback = null;\n\t\treturn this.loopStart;\n\t}\n\n\t/**\n\t * Update loop (call each frame)\n\t * Returns position to replay, or null if not looping\n\t */\n\tupdateLoop(): number | null {\n\t\tif (!this.looping) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.loopIndex === 0) {\n\t\t\tthis.loopIndex++;\n\t\t\treturn this.loopStart;\n\t\t}\n\n\t\tthis.loopIndex++;\n\t\tif (this.loopIndex > this.loopLength) {\n\t\t\tthis.loopIndex = 0;\n\t\t}\n\n\t\treturn this.loopStart - this.loopIndex;\n\t}\n\n\t/**\n\t * Execute loop callback\n\t */\n\texecuteCallback(): void {\n\t\tif (this.loopCallback) {\n\t\t\tthis.loopCallback();\n\t\t}\n\t}\n\n\t/**\n\t * Restore state to target object\n\t */\n\trestoreState(target: any, snapshot: StateSnapshot): void {\n\t\tif (!snapshot || !target) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all existing properties except protected system APIs\n\t\tfor (const key in target) {\n\t\t\tif (Object.hasOwn(target, key) && !this.isProtectedKey(key)) {\n\t\t\t\tdelete target[key];\n\t\t\t}\n\t\t}\n\n\t\t// Apply snapshot properties to target object via deep copy\n\t\tfor (const key in snapshot) {\n\t\t\tif (Object.hasOwn(snapshot, key)) {\n\t\t\t\ttarget[key] = deepCopy(snapshot[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if key should be protected from restoration\n\t */\n\tprivate isProtectedKey(key: string): boolean {\n\t\t// Prevent system APIs and runtime objects from being overwritten during restore\n\t\tconst protected_keys = [\n\t\t\t\"screen\",\n\t\t\t\"audio\",\n\t\t\t\"keyboard\",\n\t\t\t\"mouse\",\n\t\t\t\"touch\",\n\t\t\t\"gamepad\",\n\t\t\t\"system\",\n\t\t\t\"storage\",\n\t\t\t\"sprites\",\n\t\t\t\"maps\",\n\t\t\t\"sounds\",\n\t\t\t\"music\",\n\t\t\t\"assets\",\n\t\t\t\"host\",\n\t\t\t\"session\",\n\t\t\t\"memory\",\n\t\t];\n\t\treturn protected_keys.includes(key);\n\t}\n\n}\n","/**\n * StateRecorder - Records game state history\n *\n * Responsibilities:\n * - Capture state snapshots\n * - Manage circular buffer\n * - Exclude non-serializable objects\n */\nimport { DEFAULT_RECORD_BUFFER_FRAMES } from \"../constants\";\nimport { deepCopy } from \"../utils\";\n\nimport type { StateSnapshot } from \"../types\";\n\nexport class StateRecorder {\n\tprivate history: StateSnapshot[] = [];\n\tprivate recordIndex = 0;\n\tprivate recordLength = 0;\n\tprivate maxLength: number;\n\tprivate excluded: any[] = [];\n\n\tconstructor(maxLength = DEFAULT_RECORD_BUFFER_FRAMES) {\n\t\tthis.maxLength = maxLength;\n\t}\n\n\t/**\n\t * Set objects to exclude from serialization\n\t */\n\tsetExcluded(excluded: any[]): void {\n\t\tthis.excluded = excluded;\n\t}\n\n\t/**\n\t * Record a state snapshot\n\t */\n\trecord(state: any): void {\n\t\tconst snapshot = this.makeStorableState(state);\n\t\tthis.history[this.recordIndex++] = snapshot;\n\t\tthis.recordLength = Math.min(this.recordLength + 1, this.maxLength);\n\n\t\tif (this.recordIndex >= this.maxLength) {\n\t\t\tthis.recordIndex = 0;\n\t\t}\n\t}\n\n\t/**\n\t * Get state at specific position (0 = most recent)\n\t */\n\tgetState(position: number): StateSnapshot | null {\n\t\tif (position >= this.recordLength) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst index = (this.recordIndex - position - 1 + this.maxLength) % this.maxLength;\n\t\treturn this.history[index];\n\t}\n\n\t/**\n\t * Get current record length\n\t */\n\tgetLength(): number {\n\t\treturn this.recordLength;\n\t}\n\n\t/**\n\t * Get maximum record length\n\t */\n\tgetMaxLength(): number {\n\t\treturn this.maxLength;\n\t}\n\n\t/**\n\t * Clear all recorded history\n\t */\n\tclear(): void {\n\t\tthis.history = [];\n\t\tthis.recordIndex = 0;\n\t\tthis.recordLength = 0;\n\t}\n\n\t/**\n\t * Trim history to specific position\n\t */\n\ttrimTo(position: number): void {\n\t\tif (position >= this.recordLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst histo: StateSnapshot[] = [];\n\t\tconst start = this.recordLength;\n\t\tconst end = position + 1;\n\n\t\tfor (let i = start; i >= end; i--) {\n\t\t\tconst index = (this.recordIndex - i + this.maxLength) % this.maxLength;\n\t\t\thisto.push(this.history[index]);\n\t\t}\n\n\t\tthis.history = histo;\n\t\tthis.recordIndex = this.history.length;\n\t\tthis.recordLength = this.history.length;\n\t}\n\n\tprivate makeStorableState(value: any): any {\n\t\treturn deepCopy(value, this.excluded);\n\t}\n}\n","/**\n * TimeMachine - Main time machine controller\n *\n * Responsibilities:\n * - Coordinate recording and playback\n * - Handle commands\n * - Manage state\n */\n\nimport { DEFAULT_LOOP_BUFFER_FRAMES, DEFAULT_RECORD_BUFFER_FRAMES } from \"../constants\";\nimport { StatePlayer } from \"../playback\";\nimport { StateRecorder } from \"../recording\";\nimport type { TimeMachineMessage, TimeMachineStatus } from \"../types\";\n\nexport interface TimeMachineRuntime {\n\tvm?: {\n\t\tcontext?: {\n\t\t\tglobal?: any;\n\t\t};\n\t};\n\tupdateCall?: () => void;\n\tdrawCall?: () => void;\n}\n\nexport class TimeMachine {\n\tprivate runtime: TimeMachineRuntime;\n\tprivate recorder: StateRecorder;\n\tprivate player: StatePlayer;\n\tprivate recording = false;\n\tprivate replayPosition = 0;\n\tprivate statusCallback?: (status: TimeMachineStatus) => void;\n\n\tconstructor(runtime: TimeMachineRuntime) {\n\t\tthis.runtime = runtime;\n\t\tthis.recorder = new StateRecorder(DEFAULT_RECORD_BUFFER_FRAMES);\n\t\tthis.player = new StatePlayer(DEFAULT_LOOP_BUFFER_FRAMES);\n\n\t\t// Configure which objects should be excluded from state recording\n\t\tthis.setupExclusions();\n\t}\n\n\t/**\n\t * Setup objects to exclude from recording\n\t */\n\tprivate setupExclusions(): void {\n\t\tconst excluded: any[] = [];\n\n\t\tif (this.runtime.vm?.context?.global) {\n\t\t\tconst global = this.runtime.vm.context.global;\n\n\t\t\t// Exclude system APIs and non-serializable objects from recording\n\t\t\tif (global.random) excluded.push(global.random);\n\t\t\tif (global.screen) excluded.push(global.screen);\n\t\t\tif (global.audio) excluded.push(global.audio);\n\t\t\tif (global.keyboard) excluded.push(global.keyboard);\n\t\t\tif (global.mouse) excluded.push(global.mouse);\n\t\t\tif (global.touch) excluded.push(global.touch);\n\t\t\tif (global.gamepad) excluded.push(global.gamepad);\n\t\t\tif (global.system) excluded.push(global.system);\n\t\t\tif (global.storage) excluded.push(global.storage);\n\t\t\tif (global.host) excluded.push(global.host);\n\t\t\tif (global.session) excluded.push(global.session);\n\t\t\tif (global.memory) excluded.push(global.memory);\n\t\t}\n\n\t\tthis.recorder.setExcluded(excluded);\n\t}\n\n\t/**\n\t * Step function - call each frame\n\t */\n\tstep(): void {\n\t\tif (!this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Apply replay position changes and update loop if active\n\t\t\tif (this.replayPosition !== 0) {\n\t\t\t\tthis.recorder.trimTo(this.replayPosition);\n\t\t\t\tif (this.player.isLooping()) {\n\t\t\t\t\tthis.player.startLoop(this.recorder.getLength(), () => this.loopCallback());\n\t\t\t\t}\n\t\t\t\tthis.replayPosition = 0;\n\t\t\t}\n\n\t\t\t// Capture current global state snapshot for time travel\n\t\t\tif (this.runtime.vm?.context?.global) {\n\t\t\t\tthis.recorder.record(this.runtime.vm.context.global);\n\t\t\t}\n\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\t(this.runtime as any)?.listener?.reportError?.({ code: \"E7082\", message: \"Time machine step error\", data: { error: String(err) } });\n\t\t}\n\t}\n\n\t/**\n\t * Handle incoming messages\n\t */\n\tmessageReceived(data: TimeMachineMessage): void {\n\t\tswitch (data.command) {\n\t\t\tcase \"start_recording\":\n\t\t\t\tthis.startRecording();\n\t\t\t\tbreak;\n\n\t\t\tcase \"stop_recording\":\n\t\t\t\tthis.stopRecording();\n\t\t\t\tbreak;\n\n\t\t\tcase \"step_backward\":\n\t\t\t\tthis.stepBackward();\n\t\t\t\tbreak;\n\n\t\t\tcase \"step_forward\":\n\t\t\t\tthis.stepForward();\n\t\t\t\tbreak;\n\n\t\t\tcase \"replay_position\":\n\t\t\t\tif (data.position != null) {\n\t\t\t\t\tthis.setReplayPosition(data.position);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"start_looping\":\n\t\t\t\tthis.startLooping();\n\t\t\t\tbreak;\n\n\t\t\tcase \"stop_looping\":\n\t\t\t\tthis.stopLooping();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Start recording\n\t */\n\tprivate startRecording(): void {\n\t\tif (this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.recording = true;\n\t\t\tthis.recorder.clear();\n\t\t\tthis.replayPosition = 0;\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\tthis.recording = false;\n\t\t\t(this.runtime as any)?.listener?.reportError?.({ code: \"E7083\", message: \"Time machine recording error\", data: { error: String(err) } });\n\t\t}\n\t}\n\n\t/**\n\t * Stop recording\n\t */\n\tprivate stopRecording(): void {\n\t\tif (!this.recording) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.recording = false;\n\t\t\tthis.sendStatus();\n\t\t} catch (err) {\n\t\t\t(this.runtime as any)?.listener?.reportError?.({ code: \"E7083\", message: \"Time machine recording error\", data: { error: String(err) } });\n\t\t}\n\t}\n\n\t/**\n\t * Step backward in time\n\t */\n\tprivate stepBackward(): void {\n\t\tif (this.replayPosition + 1 >= this.recorder.getLength()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stopLooping();\n\t\tthis.replayPosition++;\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Step forward in time\n\t */\n\tprivate stepForward(): void {\n\t\tif (this.replayPosition <= 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stopLooping();\n\t\tthis.replayPosition--;\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Set replay position\n\t */\n\tprivate setReplayPosition(position: number): void {\n\t\t// Validate time value is finite and non-negative\n\t\tif (!isFinite(position) || position < 0) {\n\t\t\t(this.runtime as any)?.listener?.reportError?.({ code: \"E7081\", message: \"Invalid replay position\", data: { value: String(position) } });\n\t\t\treturn;\n\t\t}\n\n\t\tconst pos = Math.round(position);\n\t\tthis.replayPosition = Math.max(2, Math.min(this.recorder.getLength() - 1, pos));\n\n\t\tif (this.player.isLooping()) {\n\t\t\tthis.player.startLoop(this.replayPosition, () => this.loopCallback());\n\t\t}\n\n\t\tthis.replay();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Start looping\n\t */\n\tprivate startLooping(): void {\n\t\tif (this.recorder.getLength() === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.recording = false;\n\t\tconst position = Math.max(this.replayPosition, 1);\n\t\tthis.player.startLoop(position, () => this.loopCallback());\n\t}\n\n\t/**\n\t * Stop looping\n\t */\n\tprivate stopLooping(): void {\n\t\tif (!this.player.isLooping()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.replayPosition = this.player.stopLoop();\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Replay state at current position\n\t */\n\tprivate replay(skipDraw = false): void {\n\t\tif (this.replayPosition >= this.recorder.getLength()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst snapshot = this.recorder.getState(this.replayPosition);\n\t\tif (snapshot && this.runtime.vm?.context?.global) {\n\t\t\tthis.player.restoreState(this.runtime.vm.context.global, snapshot);\n\t\t}\n\n\t\tif (!skipDraw) {\n\t\t\tthis.runtime.drawCall?.();\n\t\t}\n\t}\n\n\t/**\n\t * Loop callback\n\t */\n\tprivate loopCallback(): void {\n\t\tconst position = this.player.updateLoop();\n\t\tif (position !== null) {\n\t\t\tthis.replayPosition = position;\n\t\t\tthis.replay(true);\n\t\t\tthis.runtime.updateCall?.();\n\t\t\tthis.runtime.drawCall?.();\n\t\t}\n\t\tthis.sendStatus();\n\t}\n\n\t/**\n\t * Send status update\n\t */\n\tprivate sendStatus(): void {\n\t\tif (this.statusCallback) {\n\t\t\tthis.statusCallback({\n\t\t\t\trecording: this.recording,\n\t\t\t\tlooping: this.player.isLooping(),\n\t\t\t\tposition: this.replayPosition,\n\t\t\t\tlength: this.recorder.getLength(),\n\t\t\t\tmax: this.recorder.getMaxLength(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Advance the loop playback by one tick.\n\t * Call once per real game frame (from the orchestrator's watch-step hook).\n\t * No-op when not looping.\n\t */\n\tloopStep(): void {\n\t\tif (this.player.isLooping()) {\n\t\t\tthis.player.executeCallback();\n\t\t}\n\t}\n\n\t/**\n\t * Set status callback\n\t */\n\tonStatus(callback: (status: TimeMachineStatus) => void): void {\n\t\tthis.statusCallback = callback;\n\t}\n\n\t/**\n\t * Check if recording\n\t */\n\tisRecording(): boolean {\n\t\treturn this.recording;\n\t}\n\n\t/**\n\t * Check if looping\n\t */\n\tisLooping(): boolean {\n\t\treturn this.player.isLooping();\n\t}\n}\n","/**\n * JSON utilities for LootiScript\n *\n * Provides JSON encoding and decoding.\n */\n\nexport const JSONLib = {\n\t/**\n\t * Encode a value to JSON string\n\t */\n\tencode: (value: any): string => {\n\t\ttry {\n\t\t\treturn JSON.stringify(value);\n\t\t} catch (error) {\n\t\t\treturn \"\";\n\t\t}\n\t},\n\n\t/**\n\t * Decode a JSON string to value\n\t */\n\tdecode: (json: string): any => {\n\t\ttry {\n\t\t\treturn JSON.parse(json);\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\t/**\n\t * Pretty-print JSON with indentation\n\t */\n\tpretty: (value: any, indent: number = 2): string => {\n\t\ttry {\n\t\t\treturn JSON.stringify(value, null, indent);\n\t\t} catch (error) {\n\t\t\treturn \"\";\n\t\t}\n\t},\n};\n","/**\n * List (Array) utilities for LootiScript\n *\n * Provides functional programming helpers and array manipulation.\n */\n\nexport const ListLib = {\n\t// Functional programming methods (map, filter, reduce, etc.)\n\tmap: <T, R>(arr: T[], fn: (item: T, index: number) => R): R[] => arr.map(fn),\n\n\tfilter: <T>(arr: T[], fn: (item: T, index: number) => boolean): T[] => arr.filter(fn),\n\n\treduce: <T, R>(arr: T[], fn: (acc: R, item: T, index: number) => R, initial: R): R => arr.reduce(fn, initial),\n\n\tfind: <T>(arr: T[], fn: (item: T, index: number) => boolean): T | null => arr.find(fn) ?? null,\n\n\tfindIndex: <T>(arr: T[], fn: (item: T, index: number) => boolean): number => arr.findIndex(fn),\n\n\tsome: <T>(arr: T[], fn: (item: T, index: number) => boolean): boolean => arr.some(fn),\n\n\tevery: <T>(arr: T[], fn: (item: T, index: number) => boolean): boolean => arr.every(fn),\n\n\t// Array manipulation methods (non-mutating, returns new arrays)\n\treverse: <T>(arr: T[]): T[] => arr.slice().reverse(),\n\n\tsort: <T>(arr: T[], fn?: (a: T, b: T) => number): T[] => arr.slice().sort(fn),\n\n\tslice: <T>(arr: T[], start: number, end?: number): T[] => arr.slice(start, end),\n\n\tconcat: <T>(...arrays: T[][]): T[] => ([] as T[]).concat(...arrays),\n\n\tflat: <T>(arr: T[], depth: number = 1): unknown[] => arr.flat(depth),\n\n\tflatMap: <T>(arr: T[], fn: (item: T, index: number) => unknown): unknown[] => arr.flatMap(fn),\n\n\t// Search and lookup methods\n\tindexOf: <T>(arr: T[], item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex),\n\n\tlastIndexOf: <T>(arr: T[], item: T, fromIndex?: number): number => arr.lastIndexOf(item, fromIndex),\n\n\tincludes: <T>(arr: T[], item: T, fromIndex?: number): boolean => arr.includes(item, fromIndex),\n\n\t// Array length accessor\n\tlength: <T>(arr: T[]): number => arr.length,\n\n\t// Element access methods (first, last, at)\n\tfirst: <T>(arr: T[]): T | null => arr[0] ?? null,\n\n\tlast: <T>(arr: T[]): T | null => arr[arr.length - 1] ?? null,\n\n\tat: <T>(arr: T[], index: number): T | null => {\n\t\t// Support negative indices (Python-style)\n\t\tconst normalized = index < 0 ? arr.length + index : index;\n\t\treturn arr[normalized] ?? null;\n\t},\n\n\t// Array mutation methods (modifies original array and returns it)\n\tpush: <T>(arr: T[], ...items: T[]): T[] => {\n\t\tarr.push(...items);\n\t\treturn arr;\n\t},\n\n\tpop: <T>(arr: T[]): T | null => arr.pop() ?? null,\n\n\tshift: <T>(arr: T[]): T | null => arr.shift() ?? null,\n\n\tunshift: <T>(arr: T[], ...items: T[]): T[] => {\n\t\tarr.unshift(...items);\n\t\treturn arr;\n\t},\n\n\tsplice: <T>(arr: T[], start: number, deleteCount?: number, ...items: T[]): T[] =>\n\t\tarr.splice(start, deleteCount ?? arr.length - start, ...items),\n\n\t/** Fills arr in-place (matches native Array.prototype.fill behaviour). */\n\tfill: <T>(arr: T[], value: T, start?: number, end?: number): T[] => arr.fill(value, start, end),\n\n\tjoin: <T>(arr: T[], separator: string = \",\"): string => arr.join(separator),\n\n\tunique: <T>(arr: T[]): T[] => [...new Set(arr)],\n\n\tshuffle: <T>(arr: T[]): T[] => {\n\t\tconst result = [...arr];\n\t\tfor (let i = result.length - 1; i > 0; i--) {\n\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t[result[i], result[j]] = [result[j], result[i]];\n\t\t}\n\t\treturn result;\n\t},\n\n\tchunk: <T>(arr: T[], size: number): T[][] => {\n\t\tconst result: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) {\n\t\t\tresult.push(arr.slice(i, i + size));\n\t\t}\n\t\treturn result;\n\t},\n\n\tsum: (arr: number[]): number => {\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tsum += arr[i];\n\t\t}\n\t\treturn sum;\n\t},\n\n\taverage: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tsum += arr[i];\n\t\t}\n\t\treturn sum / arr.length;\n\t},\n\n\tmin: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet min = arr[0];\n\t\tfor (let i = 1; i < arr.length; i++) {\n\t\t\tif (arr[i] < min) min = arr[i];\n\t\t}\n\t\treturn min;\n\t},\n\n\tmax: (arr: number[]): number => {\n\t\tif (arr.length === 0) return 0;\n\t\tlet max = arr[0];\n\t\tfor (let i = 1; i < arr.length; i++) {\n\t\t\tif (arr[i] > max) max = arr[i];\n\t\t}\n\t\treturn max;\n\t},\n};\n","/**\n * Math utilities for LootiScript\n *\n * Provides mathematical functions and game-specific helpers.\n */\n\nexport const MathLib = {\n\t// Basic mathematical operations\n\tabs: (x: number): number => Math.abs(x),\n\tsqrt: (x: number): number => Math.sqrt(x),\n\tfloor: (x: number): number => Math.floor(x),\n\tceil: (x: number): number => Math.ceil(x),\n\tround: (x: number): number => Math.round(x),\n\n\t// Minimum and maximum value selection\n\tmin: (...args: number[]): number => Math.min(...args),\n\tmax: (...args: number[]): number => Math.max(...args),\n\n\t// Exponential and logarithmic functions\n\tpow: (base: number, exp: number): number => base ** exp,\n\texp: (x: number): number => Math.exp(x),\n\tlog: (x: number): number => Math.log(x),\n\tlog10: (x: number): number => Math.log10(x),\n\n\t// Trigonometric functions (all angles in radians)\n\tsin: (x: number): number => Math.sin(x),\n\tcos: (x: number): number => Math.cos(x),\n\ttan: (x: number): number => Math.tan(x),\n\tasin: (x: number): number => Math.asin(x),\n\tacos: (x: number): number => Math.acos(x),\n\tatan: (x: number): number => Math.atan(x),\n\tatan2: (y: number, x: number): number => Math.atan2(y, x),\n\n\t// Random number generation\n\trandom: (): number => Math.random(),\n\trandomInt: (min: number, max: number): number => Math.floor(Math.random() * (max - min + 1)) + min,\n\trandomFloat: (min: number, max: number): number => Math.random() * (max - min) + min,\n\n\t// Mathematical constants\n\tPI: Math.PI,\n\tE: Math.E,\n\n\t// Game development utility functions\n\tclamp: (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max),\n\n\tlerp: (a: number, b: number, t: number): number => a + (b - a) * t,\n\n\tdistance: (x1: number, y1: number, x2: number, y2: number): number => Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2),\n\n\tdistance3D: (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number): number =>\n\t\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2),\n\n\tangleBetween: (x1: number, y1: number, x2: number, y2: number): number => Math.atan2(y2 - y1, x2 - x1),\n\n\t// Angle unit conversion utilities\n\tdegToRad: (degrees: number): number => degrees * (Math.PI / 180),\n\tradToDeg: (radians: number): number => radians * (180 / Math.PI),\n\n\t// Sign and comparison utilities\n\tsign: (x: number): number => Math.sign(x),\n\n\t// Euclidean modulo (handles negative numbers correctly)\n\tmod: (n: number, m: number): number => ((n % m) + m) % m,\n};\n","/**\n * String utilities for LootiScript\n *\n * Provides string manipulation and parsing functions.\n */\n\nexport const StringLib = {\n\t// String splitting and array joining methods\n\tsplit: (str: string, separator: string = \"\"): string[] => str.split(separator),\n\n\tjoin: (arr: string[], separator: string = \"\"): string => arr.join(separator),\n\n\t// Whitespace trimming methods\n\ttrim: (str: string): string => str.trim(),\n\ttrimStart: (str: string): string => str.trimStart(),\n\ttrimEnd: (str: string): string => str.trimEnd(),\n\n\t// String replacement methods\n\treplace: (str: string, search: string, replacement: string): string => str.replace(search, replacement),\n\n\treplaceAll: (str: string, search: string, replacement: string): string => str.split(search).join(replacement),\n\n\t// String content checking methods\n\tstartsWith: (str: string, prefix: string): boolean => str.startsWith(prefix),\n\n\tendsWith: (str: string, suffix: string): boolean => str.endsWith(suffix),\n\n\tcontains: (str: string, search: string): boolean => str.includes(search),\n\n\t// Case transformation methods\n\ttoLowerCase: (str: string): string => str.toLowerCase(),\n\ttoUpperCase: (str: string): string => str.toUpperCase(),\n\n\t// Character access and code point methods\n\tcharAt: (str: string, index: number): string => str.charAt(index),\n\tcharCodeAt: (str: string, index: number): number => str.charCodeAt(index),\n\tfromCharCode: (...codes: number[]): string => String.fromCharCode(...codes),\n\n\t// Substring extraction methods\n\tsubstring: (str: string, start: number, end?: number): string => str.substring(start, end),\n\n\tslice: (str: string, start: number, end?: number): string => str.slice(start, end),\n\n\t// String search methods\n\tindexOf: (str: string, search: string, fromIndex?: number): number => str.indexOf(search, fromIndex),\n\n\tlastIndexOf: (str: string, search: string, fromIndex?: number): number => str.lastIndexOf(search, fromIndex),\n\n\t// String padding and repetition methods\n\trepeat: (str: string, count: number): string => str.repeat(count),\n\n\tpadStart: (str: string, length: number, pad: string = \" \"): string => str.padStart(length, pad),\n\n\tpadEnd: (str: string, length: number, pad: string = \" \"): string => str.padEnd(length, pad),\n\n\t// String length accessor\n\tlength: (str: string): number => str.length,\n\n\t// String to number parsing methods\n\tparseInt: (str: string, radix?: number): number => {\n\t\tconst result = Number.parseInt(str, radix);\n\t\treturn isNaN(result) ? 0 : result;\n\t},\n\n\tparseFloat: (str: string): number => {\n\t\tconst result = Number.parseFloat(str);\n\t\treturn isNaN(result) ? 0 : result;\n\t},\n\n\t// String formatting and templating methods\n\tformat: (template: string, ...args: any[]): string => {\n\t\treturn template.replace(/{(\\d+)}/g, (match, index) => {\n\t\t\tconst argIndex = Number.parseInt(index);\n\t\t\treturn typeof args[argIndex] !== \"undefined\" ? String(args[argIndex]) : match;\n\t\t});\n\t},\n};\n","/**\n * Random - Pseudorandom number generator for LootiScript\n *\n * Uses linear congruential generator (LCG) algorithm for deterministic randomness.\n */\n\n/**\n * Pseudorandom number generator using LCG (Linear Congruential Generator)\n */\nexport class Random {\n\tprivate _seed: number;\n\tprivate readonly a: number = 13971;\n\tprivate readonly b: number = 12345;\n\tprivate readonly size: number = 1 << 30;\n\tprivate readonly mask: number;\n\tprivate readonly norm: number;\n\n\tconstructor(_seed?: number, hash: boolean = true) {\n\t\tthis._seed = _seed != null ? _seed : Math.random();\n\t\tif (this._seed === 0) {\n\t\t\tthis._seed = Math.random();\n\t\t}\n\t\tif (this._seed < 1) {\n\t\t\tthis._seed *= 1 << 30;\n\t\t}\n\t\tthis.mask = this.size - 1;\n\t\tthis.norm = 1 / this.size;\n\n\t\tif (hash) {\n\t\t\tthis.nextSeed();\n\t\t\tthis.nextSeed();\n\t\t\tthis.nextSeed();\n\t\t}\n\t}\n\n\t/**\n\t * Generate next random number [0, 1)\n\t */\n\tnext(): number {\n\t\tthis._seed = (this._seed * this.a + this.b) & this.mask;\n\t\treturn this._seed * this.norm;\n\t}\n\n\t/**\n\t * Generate random integer [0, num)\n\t */\n\tnextInt(num: number): number {\n\t\treturn Math.floor(this.next() * num);\n\t}\n\n\t/**\n\t * Advance to next seed state\n\t */\n\tnextSeed(): number {\n\t\treturn (this._seed = (this._seed * this.a + this.b) & this.mask);\n\t}\n\n\t/**\n\t * Set seed value\n\t */\n\tseed(_seed?: number): number {\n\t\tthis._seed = _seed != null ? _seed : Math.random();\n\t\tif (this._seed < 1) {\n\t\t\tthis._seed *= 1 << 30;\n\t\t}\n\t\tthis.nextSeed();\n\t\tthis.nextSeed();\n\t\treturn this.nextSeed();\n\t}\n\n\t/**\n\t * Clone random generator with optional new seed\n\t */\n\tclone(seed?: number): Random {\n\t\tif (seed != null) {\n\t\t\treturn new Random(seed);\n\t\t} else {\n\t\t\treturn new Random(this._seed, false);\n\t\t}\n\t}\n}\n","/**\n * Token - Represents a token in the LootiScript lexer\n *\n * Basic unit of lexical analysis.\n */\n\nexport interface Tokenizer {\n\tline: number;\n\tcolumn: number;\n\ttoken_start: number;\n\tindex: number;\n\tinput: string;\n\tfilename: string;\n}\n\n/**\n * Token class representing lexical tokens in LootiScript\n */\nexport class Token {\n\ttokenizer: Tokenizer;\n\ttype: number;\n\tvalue: string | number;\n\tstring_value?: string;\n\tline: number;\n\tcolumn: number;\n\tstart: number;\n\tlength: number;\n\tindex: number;\n\treserved_keyword?: boolean;\n\tis_binary_operator: boolean;\n\n\tconstructor(tokenizer: Tokenizer, type: number, value: string | number, string_value?: string) {\n\t\tthis.tokenizer = tokenizer;\n\t\tthis.type = type;\n\t\tthis.value = value;\n\t\tthis.string_value = string_value;\n\t\tthis.line = tokenizer.line;\n\t\tthis.column = tokenizer.column;\n\t\tthis.start = tokenizer.token_start;\n\t\tthis.length = tokenizer.index - this.start;\n\t\tthis.index = tokenizer.index;\n\n\t\tif (this.type === Token.TYPE_IDENTIFIER && Object.hasOwn(Token.predefined, String(this.value))) {\n\t\t\tthis.type = Token.predefined[String(this.value)];\n\t\t\tthis.reserved_keyword = true;\n\t\t}\n\n\t\tthis.is_binary_operator =\n\t\t\t(this.type >= 30 && this.type <= 39) || (this.type >= 200 && this.type <= 201) || (this.type >= 2 && this.type <= 7);\n\t}\n\n\ttoString(): string {\n\t\treturn String(this.value) + \" : \" + this.type;\n\t}\n\n\t// Token type constants\n\tstatic readonly TYPE_EQUALS = 1;\n\tstatic readonly TYPE_DOUBLE_EQUALS = 2;\n\tstatic readonly TYPE_GREATER = 3;\n\tstatic readonly TYPE_GREATER_OR_EQUALS = 4;\n\tstatic readonly TYPE_LOWER = 5;\n\tstatic readonly TYPE_LOWER_OR_EQUALS = 6;\n\tstatic readonly TYPE_UNEQUALS = 7;\n\tstatic readonly TYPE_IDENTIFIER = 10;\n\tstatic readonly TYPE_NUMBER = 11;\n\tstatic readonly TYPE_STRING = 12;\n\tstatic readonly TYPE_OPEN_BRACE = 20;\n\tstatic readonly TYPE_CLOSED_BRACE = 21;\n\t// TYPE_OPEN_CURLY_BRACE = 22\n\t// TYPE_CLOSED_CURLY_BRACE = 23\n\tstatic readonly TYPE_OPEN_BRACKET = 24;\n\tstatic readonly TYPE_CLOSED_BRACKET = 25;\n\tstatic readonly TYPE_COMMA = 26;\n\tstatic readonly TYPE_DOT = 27;\n\tstatic readonly TYPE_COLON = 28; // NEW: Colon for types\n\tstatic readonly TYPE_PLUS = 30;\n\tstatic readonly TYPE_MINUS = 31;\n\tstatic readonly TYPE_MULTIPLY = 32;\n\tstatic readonly TYPE_DIVIDE = 33;\n\tstatic readonly TYPE_POWER = 34;\n\tstatic readonly TYPE_MODULO = 35;\n\tstatic readonly TYPE_BINARY_AND = 36;\n\tstatic readonly TYPE_BINARY_OR = 37;\n\tstatic readonly TYPE_SHIFT_LEFT = 38;\n\tstatic readonly TYPE_SHIFT_RIGHT = 39;\n\tstatic readonly TYPE_PLUS_EQUALS = 40;\n\tstatic readonly TYPE_MINUS_EQUALS = 41;\n\tstatic readonly TYPE_MULTIPLY_EQUALS = 42;\n\tstatic readonly TYPE_DIVIDE_EQUALS = 43;\n\tstatic readonly TYPE_MODULO_EQUALS = 44;\n\tstatic readonly TYPE_AND_EQUALS = 45;\n\tstatic readonly TYPE_OR_EQUALS = 46;\n\tstatic readonly TYPE_RETURN = 100;\n\tstatic readonly TYPE_BREAK = 101;\n\tstatic readonly TYPE_CONTINUE = 102;\n\tstatic readonly TYPE_FUNCTION = 103;\n\tstatic readonly TYPE_IF = 104;\n\tstatic readonly TYPE_THEN = 105;\n\tstatic readonly TYPE_ELSE = 106;\n\tstatic readonly TYPE_ELSIF = 107;\n\tstatic readonly TYPE_END = 108;\n\tstatic readonly TYPE_FOR = 109;\n\tstatic readonly TYPE_TO = 110;\n\tstatic readonly TYPE_BY = 111;\n\tstatic readonly TYPE_IN = 112;\n\tstatic readonly TYPE_WHILE = 113;\n\tstatic readonly TYPE_OBJECT = 114;\n\tstatic readonly TYPE_CLASS = 115;\n\tstatic readonly TYPE_EXTENDS = 116;\n\tstatic readonly TYPE_NEW = 117;\n\tstatic readonly TYPE_ARROW = 118;\n\tstatic readonly TYPE_TEMPLATE = 119; // NEW: Template string `...`\n\tstatic readonly TYPE_AFTER = 61;\n\tstatic readonly TYPE_EVERY = 62;\n\tstatic readonly TYPE_DO = 63;\n\tstatic readonly TYPE_SLEEP = 64;\n\tstatic readonly TYPE_LOCAL = 70;\n\tstatic readonly TYPE_AND = 200;\n\tstatic readonly TYPE_OR = 201;\n\tstatic readonly TYPE_NOT = 202;\n\tstatic readonly TYPE_ERROR = 404;\n\tstatic readonly TYPE_DELETE = 403;\n\n\t// Predefined keyword mapping\n\tstatic readonly predefined: Record<string, number> = {\n\t\treturn: Token.TYPE_RETURN,\n\t\tbreak: Token.TYPE_BREAK,\n\t\tcontinue: Token.TYPE_CONTINUE,\n\t\tfunction: Token.TYPE_FUNCTION,\n\t\tfor: Token.TYPE_FOR,\n\t\tto: Token.TYPE_TO,\n\t\tby: Token.TYPE_BY,\n\t\tin: Token.TYPE_IN,\n\t\twhile: Token.TYPE_WHILE,\n\t\tif: Token.TYPE_IF,\n\t\tthen: Token.TYPE_THEN,\n\t\telse: Token.TYPE_ELSE,\n\t\telsif: Token.TYPE_ELSIF,\n\t\tend: Token.TYPE_END,\n\t\tobject: Token.TYPE_OBJECT,\n\t\tclass: Token.TYPE_CLASS,\n\t\textends: Token.TYPE_EXTENDS,\n\t\tnew: Token.TYPE_NEW,\n\t\tand: Token.TYPE_AND,\n\t\tor: Token.TYPE_OR,\n\t\tnot: Token.TYPE_NOT,\n\t\tafter: Token.TYPE_AFTER,\n\t\tevery: Token.TYPE_EVERY,\n\t\tdo: Token.TYPE_DO,\n\t\tsleep: Token.TYPE_SLEEP,\n\t\tdelete: Token.TYPE_DELETE,\n\t\tlocal: Token.TYPE_LOCAL,\n\t\tvar: Token.TYPE_LOCAL, // Alias\n\t\tlet: Token.TYPE_LOCAL, // Alias\n\t};\n}\n","/**\n * Tokenizer - Lexical analyzer for LootiScript\n *\n * Breaks source code into tokens for parsing.\n */\n\nimport { type Tokenizer as ITokenizer, Token } from \"./token\";\n\n/**\n * Tokenizer class for tokenizing LootiScript source code\n */\nexport class Tokenizer implements ITokenizer {\n\tinput: string;\n\tfilename: string;\n\tindex: number = 0;\n\tline: number = 1;\n\tcolumn: number = 0;\n\tlast_column: number = 0;\n\tbuffer: Token[] = [];\n\ttoken_start: number = 0;\n\tchars: Record<string, number> = {};\n\tdoubles: Record<string, [number, number]> = {};\n\tshifts: Record<string, number> = {};\n\tletter_regex: RegExp = /^\\p{L}/u;\n\n\tconstructor(input: string, filename: string) {\n\t\tthis.input = input;\n\t\tthis.filename = filename;\n\n\t\t// Initialize single character tokens\n\t\tthis.chars[\"(\"] = Token.TYPE_OPEN_BRACE;\n\t\tthis.chars[\")\"] = Token.TYPE_CLOSED_BRACE;\n\t\tthis.chars[\"[\"] = Token.TYPE_OPEN_BRACKET;\n\t\tthis.chars[\"]\"] = Token.TYPE_CLOSED_BRACKET;\n\t\tthis.chars[\"{\"] = 22; // TYPE_OPEN_CURLY_BRACE (not defined in Token)\n\t\tthis.chars[\"}\"] = 23; // TYPE_CLOSED_CURLY_BRACE (not defined in Token)\n\t\tthis.chars[\"^\"] = Token.TYPE_POWER;\n\t\tthis.chars[\",\"] = Token.TYPE_COMMA;\n\t\tthis.chars[\".\"] = Token.TYPE_DOT;\n\t\tthis.chars[\":\"] = Token.TYPE_COLON;\n\n\t\t// Initialize double character tokens (single + equals)\n\t\tthis.doubles[\">\"] = [Token.TYPE_GREATER, Token.TYPE_GREATER_OR_EQUALS];\n\t\tthis.doubles[\"<\"] = [Token.TYPE_LOWER, Token.TYPE_LOWER_OR_EQUALS];\n\t\tthis.doubles[\"=\"] = [Token.TYPE_EQUALS, Token.TYPE_DOUBLE_EQUALS];\n\t\tthis.doubles[\"+\"] = [Token.TYPE_PLUS, Token.TYPE_PLUS_EQUALS];\n\t\tthis.doubles[\"-\"] = [Token.TYPE_MINUS, Token.TYPE_MINUS_EQUALS];\n\t\tthis.doubles[\"*\"] = [Token.TYPE_MULTIPLY, Token.TYPE_MULTIPLY_EQUALS];\n\t\tthis.doubles[\"/\"] = [Token.TYPE_DIVIDE, Token.TYPE_DIVIDE_EQUALS];\n\t\tthis.doubles[\"%\"] = [Token.TYPE_MODULO, Token.TYPE_MODULO_EQUALS];\n\t\tthis.doubles[\"&\"] = [Token.TYPE_BINARY_AND, Token.TYPE_AND_EQUALS];\n\t\tthis.doubles[\"|\"] = [Token.TYPE_BINARY_OR, Token.TYPE_OR_EQUALS];\n\n\t\t// Initialize shift operators\n\t\tthis.shifts[\"<\"] = Token.TYPE_SHIFT_LEFT;\n\t\tthis.shifts[\">\"] = Token.TYPE_SHIFT_RIGHT;\n\t}\n\n\tpushBack(token: Token): Token {\n\t\tthis.buffer.splice(0, 0, token);\n\t\treturn token;\n\t}\n\n\t/**\n\t * Peek at next token without consuming it\n\t */\n\tpeek(): Token | null {\n\t\tif (this.buffer.length > 0) {\n\t\t\treturn this.buffer[0];\n\t\t}\n\t\tconst token = this.next();\n\t\tif (token) {\n\t\t\tthis.pushBack(token);\n\t\t}\n\t\treturn token;\n\t}\n\n\tfinished(): boolean {\n\t\treturn this.index >= this.input.length && this.buffer.length === 0;\n\t}\n\n\tnextChar(ignore_comments: boolean = false): string {\n\t\tlet c: string;\n\t\tlet endseq: number;\n\t\tc = this.input.charAt(this.index++);\n\n\t\tif (c === \"\\n\") {\n\t\t\tthis.line += 1;\n\t\t\tthis.last_column = this.column;\n\t\t\tthis.column = 0;\n\t\t} else if (c === \"/\" && !ignore_comments) {\n\t\t\tif (this.input.charAt(this.index) === \"/\") {\n\t\t\t\t// Single line comment\n\t\t\t\twhile (true) {\n\t\t\t\t\tc = this.input.charAt(this.index++);\n\t\t\t\t\tif (c === \"\\n\" || this.index >= this.input.length) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.line += 1;\n\t\t\t\tthis.last_column = this.column;\n\t\t\t\tthis.column = 0;\n\t\t\t\treturn this.nextChar();\n\t\t\t} else if (this.input.charAt(this.index) === \"*\") {\n\t\t\t\t// Multi-line comment\n\t\t\t\tendseq = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\tc = this.input.charAt(this.index++);\n\t\t\t\t\tif (c === \"\\n\") {\n\t\t\t\t\t\tthis.line += 1;\n\t\t\t\t\t\tthis.last_column = this.column;\n\t\t\t\t\t\tthis.column = 0;\n\t\t\t\t\t\tendseq = 0;\n\t\t\t\t\t} else if (c === \"*\") {\n\t\t\t\t\t\tendseq = 1;\n\t\t\t\t\t} else if (c === \"/\" && endseq === 1) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendseq = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.index >= this.input.length) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.nextChar();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.column += 1;\n\t\t}\n\t\treturn c;\n\t}\n\n\trewind(): void {\n\t\tthis.index -= 1;\n\t\tthis.column -= 1;\n\t\tif (this.input.charAt(this.index) === \"\\n\") {\n\t\t\tthis.line -= 1;\n\t\t\tthis.column = this.last_column;\n\t\t}\n\t}\n\n\tnext(): Token | null {\n\t\tlet c: string;\n\t\tlet code: number;\n\n\t\tif (this.buffer.length > 0) {\n\t\t\treturn this.buffer.splice(0, 1)[0];\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\t\t\tif (code > 32 && code !== 160) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.token_start = this.index - 1;\n\n\t\tif (this.doubles[c] != null) {\n\t\t\treturn this.parseDouble(c, this.doubles[c]);\n\t\t}\n\n\t\tif (this.chars[c] != null) {\n\t\t\treturn new Token(this, this.chars[c], c);\n\t\t}\n\n\t\tif (c === \"!\") {\n\t\t\treturn this.parseUnequals(c);\n\t\t} else if (code >= 48 && code <= 57) {\n\t\t\treturn this.parseNumber(c);\n\t\t} else if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122) || code === 95 || this.letter_regex.test(c)) {\n\t\t\treturn this.parseIdentifier(c);\n\t\t} else if (c === '\"') {\n\t\t\treturn this.parseString(c, '\"');\n\t\t} else if (c === \"'\") {\n\t\t\treturn this.parseString(c, \"'\");\n\t\t} else if (c === \"`\") {\n\t\t\treturn this.parseString(c, \"`\");\n\t\t} else {\n\t\t\treturn this.error(\"Syntax Error\");\n\t\t}\n\t}\n\n\tchangeNumberToIdentifier(): Token[] | Token | undefined {\n\t\tlet i: number;\n\t\tlet token: Token | null;\n\t\tlet v: string[];\n\t\tconst results: Token[] = [];\n\n\t\ttoken = this.next();\n\t\tif (token != null && token.type === Token.TYPE_NUMBER) {\n\t\t\tv = (token.string_value || String(token.value)).split(\".\");\n\t\t\tfor (i = v.length - 1; i >= 0; i--) {\n\t\t\t\tif (v[i].length > 0) {\n\t\t\t\t\tthis.pushBack(new Token(this, Token.TYPE_IDENTIFIER, v[i]));\n\t\t\t\t}\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tresults.push(this.pushBack(new Token(this, Token.TYPE_DOT, \".\")));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn results;\n\t\t} else if (token != null && token.type === Token.TYPE_STRING) {\n\t\t\treturn this.pushBack(new Token(this, Token.TYPE_IDENTIFIER, token.value));\n\t\t} else {\n\t\t\treturn token ? this.pushBack(token) : undefined;\n\t\t}\n\t}\n\n\tparseDouble(c: string, d?: [number, number]): Token {\n\t\tconst c2: string = this.input.charAt(this.index);\n\n\t\t// Check for arrow function =>\n\t\tif (c === \"=\" && c2 === \">\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, Token.TYPE_ARROW, \"=>\");\n\t\t}\n\n\t\t// Check for shift operators (<<, >>)\n\t\tif (this.shifts[c] != null && this.index < this.input.length && c2 === c) {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, this.shifts[c], c + c);\n\t\t}\n\n\t\t// Check for assignment operators (+=, -=, etc.)\n\t\tif (d && this.index < this.input.length && c2 === \"=\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, d[1], c + \"=\");\n\t\t}\n\n\t\t// Return single character token\n\t\treturn new Token(this, d ? d[0] : this.chars[c], c);\n\t}\n\n\tparseUnequals(_c: string): Token {\n\t\tif (this.index < this.input.length && this.input.charAt(this.index) === \"=\") {\n\t\t\tthis.nextChar();\n\t\t\treturn new Token(this, Token.TYPE_UNEQUALS, \"!=\");\n\t\t} else {\n\t\t\treturn this.error(\"Expected inequality !=\");\n\t\t}\n\t}\n\n\tparseIdentifier(s: string): Token {\n\t\tlet c: string;\n\t\tlet code: number;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_IDENTIFIER, s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\t\t\tif (\n\t\t\t\t(code >= 65 && code <= 90) ||\n\t\t\t\t(code >= 97 && code <= 122) ||\n\t\t\t\tcode === 95 ||\n\t\t\t\t(code >= 48 && code <= 57) ||\n\t\t\t\tthis.letter_regex.test(c)\n\t\t\t) {\n\t\t\t\ts += c;\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_IDENTIFIER, s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseNumber(s: string): Token {\n\t\tlet c: string;\n\t\tlet code: number;\n\t\tlet exp: boolean = false;\n\t\tlet pointed: boolean = false;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseFloat(s), s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tcode = c.charCodeAt(0);\n\n\t\t\tif (c === \".\" && !pointed && !exp) {\n\t\t\t\tpointed = true;\n\t\t\t\ts += c;\n\t\t\t} else if (code >= 48 && code <= 57) {\n\t\t\t\ts += c;\n\t\t\t} else if ((c === \"e\" || c === \"E\") && !exp && this.index < this.input.length) {\n\t\t\t\texp = true;\n\t\t\t\ts += c;\n\t\t\t\tc = this.nextChar();\n\t\t\t\tif (c === \"+\" || c === \"-\") {\n\t\t\t\t\ts += c;\n\t\t\t\t} else {\n\t\t\t\t\tthis.rewind();\n\t\t\t\t}\n\t\t\t} else if ((c === \"x\" || c === \"X\") && s === \"0\") {\n\t\t\t\treturn this.parseHexNumber(\"0x\");\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseFloat(s), s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseHexNumber(s: string): Token {\n\t\tlet c: string;\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseInt(s), s);\n\t\t\t}\n\t\t\tc = this.nextChar();\n\t\t\tif (/[a-fA-F0-9]/.test(c)) {\n\t\t\t\ts += c;\n\t\t\t} else {\n\t\t\t\tthis.rewind();\n\t\t\t\treturn new Token(this, Token.TYPE_NUMBER, Number.parseInt(s), s);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseString(s: string, close: string): Token {\n\t\tlet c: string;\n\t\tlet count_close: number = 0;\n\t\tlet n: string;\n\n\t\tif (close == null) {\n\t\t\tclose = '\"';\n\t\t}\n\n\t\tif (close === '\"') {\n\t\t\t// Check for triple-quoted string\n\t\t\tif (\n\t\t\t\tthis.input.charAt(this.index) === '\"' &&\n\t\t\t\tthis.input.charAt(this.index + 1) === '\"' &&\n\t\t\t\tthis.input.charAt(this.index + 2) !== '\"'\n\t\t\t) {\n\t\t\t\tclose = '\"\"\"';\n\t\t\t\tthis.nextChar(true);\n\t\t\t\tthis.nextChar(true);\n\t\t\t}\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (this.index >= this.input.length) {\n\t\t\t\treturn this.error(\"Unclosed string value\");\n\t\t\t}\n\t\t\tc = this.nextChar(true);\n\n\t\t\tif (c === \"\\\\\") {\n\t\t\t\tn = this.nextChar(true);\n\t\t\t\tswitch (n) {\n\t\t\t\t\tcase \"n\":\n\t\t\t\t\t\ts += \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"\\\\\":\n\t\t\t\t\t\ts += \"\\\\\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase close:\n\t\t\t\t\t\ts += close;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ts += \"\\\\\" + n;\n\t\t\t\t}\n\t\t\t} else if (c === close) {\n\t\t\t\tn = this.nextChar(true);\n\t\t\t\tif (n === close) {\n\t\t\t\t\ts += c;\n\t\t\t\t} else {\n\t\t\t\t\tthis.rewind();\n\t\t\t\t\ts += c;\n\t\t\t\t\treturn new Token(this, close === \"`\" ? Token.TYPE_TEMPLATE : Token.TYPE_STRING, s.substring(1, s.length - 1));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (close === '\"\"\"' && c === '\"') {\n\t\t\t\t\tcount_close += 1;\n\t\t\t\t\tif (count_close === 3) {\n\t\t\t\t\t\treturn new Token(this, Token.TYPE_STRING, s.substring(1, s.length - 2));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcount_close = 0;\n\t\t\t\t}\n\t\t\t\ts += c;\n\t\t\t}\n\t\t}\n\t}\n\n\terror(s: string): never {\n\t\tthrow new Error(s);\n\t}\n}\n","/**\n * Routine - VM bytecode routine and opcodes for LootiScript\n *\n * Represents compiled bytecode ready for execution.\n */\n\nimport type { InlineCache } from \"./inline-cache\";\n\n// Forward declarations for circular dependencies\ndeclare class Transpiler {\n\ttranspile(routine: Routine): void;\n}\n\ndeclare class Compiler {\n\tstatic predefined_unary_functions: Record<string, any>;\n\tstatic predefined_binary_functions: Record<string, any>;\n}\n\n/**\n * OPCODES class - Maps opcode names to numeric codes\n */\nclass OPCODES_CLASS {\n\tprivate table: Record<string | number, string | number> = {};\n\n\tset(op: string, code: number): number {\n\t\tthis[op as keyof this] = code as any;\n\t\tthis[code] = op;\n\t\tthis.table[op] = code;\n\t\tthis.table[code] = op;\n\t\treturn code;\n\t}\n\n\t// Opcode constants\n\treadonly TYPE = 1;\n\treadonly VARIABLE_TYPE = 2;\n\treadonly PROPERTY_TYPE = 3;\n\treadonly LOAD_IMPORT = 4;\n\treadonly LOAD_THIS = 5;\n\treadonly LOAD_GLOBAL = 6;\n\treadonly LOAD_VALUE = 10;\n\treadonly LOAD_LOCAL = 11;\n\treadonly LOAD_VARIABLE = 12;\n\treadonly LOAD_LOCAL_OBJECT = 13;\n\treadonly LOAD_VARIABLE_OBJECT = 14;\n\treadonly POP = 15;\n\treadonly LOAD_PROPERTY = 16;\n\treadonly LOAD_PROPERTY_OBJECT = 17;\n\treadonly CREATE_OBJECT = 18;\n\treadonly MAKE_OBJECT = 19;\n\treadonly CREATE_ARRAY = 20;\n\treadonly STORE_LOCAL = 21;\n\treadonly STORE_VARIABLE = 23;\n\treadonly CREATE_PROPERTY = 24;\n\treadonly STORE_PROPERTY = 25;\n\treadonly DELETE = 26;\n\treadonly UPDATE_CLASS = 27;\n\treadonly CREATE_CLASS = 28;\n\treadonly NEW_CALL = 29;\n\treadonly ADD = 30;\n\treadonly SUB = 31;\n\treadonly MUL = 32;\n\treadonly DIV = 33;\n\treadonly MODULO = 34;\n\treadonly BINARY_AND = 35;\n\treadonly BINARY_OR = 36;\n\treadonly SHIFT_LEFT = 37;\n\treadonly SHIFT_RIGHT = 38;\n\treadonly NEGATE = 39;\n\treadonly EQ = 40;\n\treadonly NEQ = 41;\n\treadonly LT = 42;\n\treadonly GT = 43;\n\treadonly LTE = 44;\n\treadonly GTE = 45;\n\treadonly NOT = 50;\n\treadonly LOAD_PROPERTY_ATOP = 68;\n\treadonly JUMP = 80;\n\treadonly JUMPY = 81;\n\treadonly JUMPN = 82;\n\treadonly JUMPY_NOPOP = 83;\n\treadonly JUMPN_NOPOP = 84;\n\treadonly LOAD_ROUTINE = 89;\n\treadonly FUNCTION_CALL = 90;\n\treadonly FUNCTION_APPLY_VARIABLE = 91;\n\treadonly FUNCTION_APPLY_PROPERTY = 92;\n\treadonly SUPER_CALL = 93;\n\treadonly RETURN = 94;\n\treadonly FORLOOP_INIT = 95;\n\treadonly FORLOOP_CONTROL = 96;\n\treadonly FORIN_INIT = 97;\n\treadonly FORIN_CONTROL = 98;\n\treadonly UNARY_OP = 100;\n\treadonly BINARY_OP = 101;\n\treadonly COMPILED = 200;\n\treadonly AFTER = 110;\n\treadonly EVERY = 111;\n\treadonly DO = 112;\n\treadonly SLEEP = 113;\n\n\t/**\n\t * Fused opcodes - Performance optimization\n\t *\n\t * Combines common operation pairs into single opcodes to reduce\n\t * instruction dispatch overhead and improve cache locality.\n\t * Typical performance gain: 15-30% for hot paths.\n\t */\n\treadonly LOAD_VAR_CALL = 120;\n\treadonly LOAD_PROP_CALL = 121;\n\treadonly LOAD_CONST_ADD = 122;\n\treadonly LOAD_CONST_SUB = 123;\n\treadonly LOAD_CONST_MUL = 124;\n\treadonly LOAD_LOCAL_ADD = 125;\n\treadonly LOAD_LOCAL_SUB = 126;\n\treadonly LOAD_LOCAL_MUL = 127;\n\treadonly LOAD_CONST_DIV = 128;\n\treadonly LOAD_LOCAL_LT = 129;\n\treadonly LOAD_LOCAL_GT = 130;\n\treadonly LOAD_LOCAL_EQ = 131;\n\n\tconstructor() {\n\t\tthis.set(\"TYPE\", 1);\n\t\tthis.set(\"VARIABLE_TYPE\", 2);\n\t\tthis.set(\"PROPERTY_TYPE\", 3);\n\t\tthis.set(\"LOAD_IMPORT\", 4);\n\t\tthis.set(\"LOAD_THIS\", 5);\n\t\tthis.set(\"LOAD_GLOBAL\", 6);\n\t\tthis.set(\"LOAD_VALUE\", 10);\n\t\tthis.set(\"LOAD_LOCAL\", 11);\n\t\tthis.set(\"LOAD_VARIABLE\", 12);\n\t\tthis.set(\"LOAD_LOCAL_OBJECT\", 13);\n\t\tthis.set(\"LOAD_VARIABLE_OBJECT\", 14);\n\t\tthis.set(\"POP\", 15);\n\t\tthis.set(\"LOAD_PROPERTY\", 16);\n\t\tthis.set(\"LOAD_PROPERTY_OBJECT\", 17);\n\t\tthis.set(\"CREATE_OBJECT\", 18);\n\t\tthis.set(\"MAKE_OBJECT\", 19);\n\t\tthis.set(\"CREATE_ARRAY\", 20);\n\t\tthis.set(\"STORE_LOCAL\", 21);\n\t\tthis.set(\"STORE_VARIABLE\", 23);\n\t\tthis.set(\"CREATE_PROPERTY\", 24);\n\t\tthis.set(\"STORE_PROPERTY\", 25);\n\t\tthis.set(\"DELETE\", 26);\n\t\tthis.set(\"UPDATE_CLASS\", 27);\n\t\tthis.set(\"CREATE_CLASS\", 28);\n\t\tthis.set(\"NEW_CALL\", 29);\n\t\tthis.set(\"ADD\", 30);\n\t\tthis.set(\"SUB\", 31);\n\t\tthis.set(\"MUL\", 32);\n\t\tthis.set(\"DIV\", 33);\n\t\tthis.set(\"MODULO\", 34);\n\t\tthis.set(\"BINARY_AND\", 35);\n\t\tthis.set(\"BINARY_OR\", 36);\n\t\tthis.set(\"SHIFT_LEFT\", 37);\n\t\tthis.set(\"SHIFT_RIGHT\", 38);\n\t\tthis.set(\"NEGATE\", 39);\n\t\tthis.set(\"EQ\", 40);\n\t\tthis.set(\"NEQ\", 41);\n\t\tthis.set(\"LT\", 42);\n\t\tthis.set(\"GT\", 43);\n\t\tthis.set(\"LTE\", 44);\n\t\tthis.set(\"GTE\", 45);\n\t\tthis.set(\"NOT\", 50);\n\t\tthis.set(\"LOAD_PROPERTY_ATOP\", 68);\n\t\tthis.set(\"JUMP\", 80);\n\t\tthis.set(\"JUMPY\", 81);\n\t\tthis.set(\"JUMPN\", 82);\n\t\tthis.set(\"JUMPY_NOPOP\", 83);\n\t\tthis.set(\"JUMPN_NOPOP\", 84);\n\t\tthis.set(\"LOAD_ROUTINE\", 89);\n\t\tthis.set(\"FUNCTION_CALL\", 90);\n\t\tthis.set(\"FUNCTION_APPLY_VARIABLE\", 91);\n\t\tthis.set(\"FUNCTION_APPLY_PROPERTY\", 92);\n\t\tthis.set(\"SUPER_CALL\", 93);\n\t\tthis.set(\"RETURN\", 94);\n\t\tthis.set(\"FORLOOP_INIT\", 95);\n\t\tthis.set(\"FORLOOP_CONTROL\", 96);\n\t\tthis.set(\"FORIN_INIT\", 97);\n\t\tthis.set(\"FORIN_CONTROL\", 98);\n\t\tthis.set(\"UNARY_OP\", 100);\n\t\tthis.set(\"BINARY_OP\", 101);\n\t\tthis.set(\"COMPILED\", 200);\n\t\tthis.set(\"AFTER\", 110);\n\t\tthis.set(\"EVERY\", 111);\n\t\tthis.set(\"DO\", 112);\n\t\tthis.set(\"SLEEP\", 113);\n\t\t// Fused opcodes - combine frequent operation pairs for performance\n\t\tthis.set(\"LOAD_VAR_CALL\", 120); // LOAD_VARIABLE + FUNCTION_CALL\n\t\tthis.set(\"LOAD_PROP_CALL\", 121); // LOAD_PROPERTY + FUNCTION_CALL\n\t\tthis.set(\"LOAD_CONST_ADD\", 122); // LOAD_VALUE + ADD\n\t\tthis.set(\"LOAD_CONST_SUB\", 123); // LOAD_VALUE + SUB\n\t\tthis.set(\"LOAD_CONST_MUL\", 124); // LOAD_VALUE + MUL\n\t\tthis.set(\"LOAD_LOCAL_ADD\", 125); // LOAD_LOCAL + ADD\n\t\tthis.set(\"LOAD_LOCAL_SUB\", 126); // LOAD_LOCAL + SUB\n\t\tthis.set(\"LOAD_LOCAL_MUL\", 127); // LOAD_LOCAL + MUL\n\t\tthis.set(\"LOAD_CONST_DIV\", 128); // LOAD_VALUE + DIV\n\t\tthis.set(\"LOAD_LOCAL_LT\", 129); // LOAD_LOCAL + LT\n\t\tthis.set(\"LOAD_LOCAL_GT\", 130); // LOAD_LOCAL + GT\n\t\tthis.set(\"LOAD_LOCAL_EQ\", 131); // LOAD_LOCAL + EQ\n\t}\n\n\t[key: string | number]: any;\n}\n\n/**\n * Global OPCODES instance\n */\nexport const OPCODES = new OPCODES_CLASS();\n\n/**\n * Routine - VM bytecode routine representing compiled LootiScript code\n */\nexport class Routine {\n\tnum_args: number;\n\tops: number[];\n\topcodes: number[];\n\targ1: any[];\n\tref: any[];\n\tlabel_count: number;\n\tlabels: Record<string, number>;\n\ttranspile: boolean;\n\timport_refs: any[];\n\timport_values: any[];\n\timport_self: number;\n\tlocals_size?: number;\n\tuses_arguments?: boolean;\n\tas_function?: Function;\n\tobject?: any;\n\tcallback?: Function | null;\n\t/** Source text of the function, used for hot reload change detection */\n\tsource?: string;\n\n\t/**\n\t * Inline caches mapped by opcode index\n\t *\n\t * Caches property lookups and method calls to avoid repeated\n\t * hash table lookups. Significantly improves performance for\n\t * hot code paths with stable object shapes.\n\t */\n\tics: Record<number, InlineCache>;\n\n\tconstructor(num_args: number = 0) {\n\t\tthis.num_args = num_args;\n\t\tthis.ops = [];\n\t\tthis.opcodes = [];\n\t\tthis.arg1 = [];\n\t\tthis.ref = [];\n\t\tthis.label_count = 0;\n\t\tthis.labels = {};\n\t\tthis.transpile = false;\n\t\tthis.import_refs = [];\n\t\tthis.import_values = [];\n\t\tthis.import_self = -1;\n\t\tthis.ics = {};\n\t}\n\n\tclone(): Routine {\n\t\tconst r = new Routine(this.num_args);\n\t\t// Deep clone arrays to prevent shared mutations between clones\n\t\tr.opcodes = [...this.opcodes];\n\t\tr.arg1 = [...this.arg1];\n\t\tr.ref = [...this.ref];\n\t\tr.locals_size = this.locals_size;\n\t\tr.uses_arguments = this.uses_arguments;\n\t\tr.source = this.source;\n\t\t// Inline caches are not cloned - each routine instance starts with\n\t\t// fresh caches to avoid polluting new instances with stale cache data\n\t\treturn r;\n\t}\n\n\tcreateLabel(str: string = \"label\"): string {\n\t\treturn \":\" + str + \"_\" + this.label_count++;\n\t}\n\n\tsetLabel(name: string): number {\n\t\treturn (this.labels[name] = this.opcodes.length);\n\t}\n\n\toptimize(): void {\n\t\tif (this.transpile) {\n\t\t\tnew Transpiler().transpile(this);\n\t\t}\n\t}\n\n\tremoveable(index: number): boolean {\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value === index) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tremove(index: number): boolean {\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value === index) {\n\t\t\t\treturn false;\n\t\t\t} else if (value > index) {\n\t\t\t\tthis.labels[label] -= 1;\n\t\t\t}\n\t\t}\n\t\tthis.opcodes.splice(index, 1);\n\t\tthis.arg1.splice(index, 1);\n\t\tthis.ref.splice(index, 1);\n\t\treturn true;\n\t}\n\n\tresolveLabels(): void {\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tconst opcode = this.opcodes[i];\n\t\t\tif (\n\t\t\t\topcode === OPCODES.JUMP ||\n\t\t\t\topcode === OPCODES.JUMPY ||\n\t\t\t\topcode === OPCODES.JUMPN ||\n\t\t\t\topcode === OPCODES.JUMPY_NOPOP ||\n\t\t\t\topcode === OPCODES.JUMPN_NOPOP\n\t\t\t) {\n\t\t\t\tif (this.labels[this.arg1[i]]) {\n\t\t\t\t\tthis.arg1[i] = this.labels[this.arg1[i] as string];\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\topcode === OPCODES.FORLOOP_CONTROL ||\n\t\t\t\topcode === OPCODES.FORLOOP_INIT ||\n\t\t\t\topcode === OPCODES.FORIN_CONTROL ||\n\t\t\t\topcode === OPCODES.FORIN_INIT\n\t\t\t) {\n\t\t\t\tconst args = this.arg1[i] as any[];\n\t\t\t\tif (args && this.labels[args[1]]) {\n\t\t\t\t\targs[1] = this.labels[args[1]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tOP(code: number, ref: any, v1: any = 0): number {\n\t\tthis.opcodes.push(code);\n\t\tthis.arg1.push(v1);\n\t\treturn this.ref.push(ref);\n\t}\n\n\tOP_INSERT(code: number, ref: any, v1: any = 0, index: number): void {\n\t\tthis.opcodes.splice(index, 0, code);\n\t\tthis.arg1.splice(index, 0, v1);\n\t\tthis.ref.splice(index, 0, ref);\n\n\t\tconst labels = this.labels;\n\t\tfor (const label in labels) {\n\t\t\tconst value = labels[label];\n\t\t\tif (value >= index) {\n\t\t\t\tthis.labels[label] += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tTYPE(ref: any): number {\n\t\treturn this.OP(OPCODES.TYPE, ref);\n\t}\n\n\tVARIABLE_TYPE(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.VARIABLE_TYPE, ref, variable);\n\t}\n\n\tPROPERTY_TYPE(ref: any): number {\n\t\treturn this.OP(OPCODES.PROPERTY_TYPE, ref);\n\t}\n\n\tLOAD_THIS(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_THIS, ref);\n\t}\n\n\tLOAD_GLOBAL(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_GLOBAL, ref);\n\t}\n\n\tLOAD_VALUE(value: any, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VALUE, ref, value);\n\t}\n\n\tLOAD_LOCAL(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_LOCAL, ref, index);\n\t}\n\n\tLOAD_VARIABLE(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VARIABLE, ref, variable);\n\t}\n\n\tLOAD_LOCAL_OBJECT(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_LOCAL_OBJECT, ref, index);\n\t}\n\n\tLOAD_VARIABLE_OBJECT(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_VARIABLE_OBJECT, ref, variable);\n\t}\n\n\tPOP(ref: any): number {\n\t\treturn this.OP(OPCODES.POP, ref);\n\t}\n\n\tLOAD_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY, ref);\n\t}\n\n\tLOAD_PROPERTY_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY_OBJECT, ref);\n\t}\n\n\tCREATE_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_OBJECT, ref);\n\t}\n\n\tMAKE_OBJECT(ref: any): number {\n\t\treturn this.OP(OPCODES.MAKE_OBJECT, ref);\n\t}\n\n\tCREATE_ARRAY(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_ARRAY, ref);\n\t}\n\n\tCREATE_CLASS(parent_var: number | string, ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_CLASS, ref, parent_var);\n\t}\n\n\tUPDATE_CLASS(variable: string, ref: any): number {\n\t\treturn this.OP(OPCODES.UPDATE_CLASS, ref, variable);\n\t}\n\n\tNEW_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.NEW_CALL, ref, args);\n\t}\n\n\tADD(ref: any, self: number = 0): number {\n\t\treturn this.OP(OPCODES.ADD, ref, self);\n\t}\n\n\tSUB(ref: any, self: number = 0): number {\n\t\treturn this.OP(OPCODES.SUB, ref, self);\n\t}\n\n\tMUL(ref: any): number {\n\t\treturn this.OP(OPCODES.MUL, ref);\n\t}\n\n\tDIV(ref: any): number {\n\t\treturn this.OP(OPCODES.DIV, ref);\n\t}\n\n\tMODULO(ref: any): number {\n\t\treturn this.OP(OPCODES.MODULO, ref);\n\t}\n\n\tBINARY_AND(ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_AND, ref);\n\t}\n\n\tBINARY_OR(ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_OR, ref);\n\t}\n\n\tSHIFT_LEFT(ref: any): number {\n\t\treturn this.OP(OPCODES.SHIFT_LEFT, ref);\n\t}\n\n\tSHIFT_RIGHT(ref: any): number {\n\t\treturn this.OP(OPCODES.SHIFT_RIGHT, ref);\n\t}\n\n\tNEGATE(ref: any): number {\n\t\treturn this.OP(OPCODES.NEGATE, ref);\n\t}\n\n\tLOAD_PROPERTY_ATOP(ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_PROPERTY_ATOP, ref);\n\t}\n\n\tEQ(ref: any): number {\n\t\treturn this.OP(OPCODES.EQ, ref);\n\t}\n\n\tNEQ(ref: any): number {\n\t\treturn this.OP(OPCODES.NEQ, ref);\n\t}\n\n\tLT(ref: any): number {\n\t\treturn this.OP(OPCODES.LT, ref);\n\t}\n\n\tGT(ref: any): number {\n\t\treturn this.OP(OPCODES.GT, ref);\n\t}\n\n\tLTE(ref: any): number {\n\t\treturn this.OP(OPCODES.LTE, ref);\n\t}\n\n\tGTE(ref: any): number {\n\t\treturn this.OP(OPCODES.GTE, ref);\n\t}\n\n\tNOT(ref: any): number {\n\t\treturn this.OP(OPCODES.NOT, ref);\n\t}\n\n\tFORLOOP_INIT(iterator: number | any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORLOOP_INIT, ref, iterator);\n\t}\n\n\tFORLOOP_CONTROL(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORLOOP_CONTROL, ref, args);\n\t}\n\n\tFORIN_INIT(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORIN_INIT, ref, args);\n\t}\n\n\tFORIN_CONTROL(args: any[], ref: any): number {\n\t\treturn this.OP(OPCODES.FORIN_CONTROL, ref, args);\n\t}\n\n\tJUMP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMP, ref, index);\n\t}\n\n\tJUMPY(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPY, ref, index);\n\t}\n\n\tJUMPN(index: string | number, ref?: any): number {\n\t\treturn this.OP(OPCODES.JUMPN, ref, index);\n\t}\n\n\tJUMPY_NOPOP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPY_NOPOP, ref, index);\n\t}\n\n\tJUMPN_NOPOP(index: string | number, ref: any): number {\n\t\treturn this.OP(OPCODES.JUMPN_NOPOP, ref, index);\n\t}\n\n\tSTORE_LOCAL(index: number, ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_LOCAL, ref, index);\n\t}\n\n\tSTORE_VARIABLE(field: string, ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_VARIABLE, ref, field);\n\t}\n\n\tCREATE_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.CREATE_PROPERTY, ref);\n\t}\n\n\tSTORE_PROPERTY(ref: any): number {\n\t\treturn this.OP(OPCODES.STORE_PROPERTY, ref);\n\t}\n\n\tLOAD_ROUTINE(value: any, ref: any): number {\n\t\treturn this.OP(OPCODES.LOAD_ROUTINE, ref, value);\n\t}\n\n\tFUNCTION_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_CALL, ref, args);\n\t}\n\n\tFUNCTION_APPLY_VARIABLE(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_APPLY_VARIABLE, ref, args);\n\t}\n\n\tFUNCTION_APPLY_PROPERTY(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.FUNCTION_APPLY_PROPERTY, ref, args);\n\t}\n\n\tSUPER_CALL(args: number, ref: any): number {\n\t\treturn this.OP(OPCODES.SUPER_CALL, ref, args);\n\t}\n\n\tRETURN(ref: any): number {\n\t\treturn this.OP(OPCODES.RETURN, ref);\n\t}\n\n\tAFTER(ref: any): number {\n\t\treturn this.OP(OPCODES.AFTER, ref);\n\t}\n\n\tEVERY(ref: any): number {\n\t\treturn this.OP(OPCODES.EVERY, ref);\n\t}\n\n\tDO(ref: any): number {\n\t\treturn this.OP(OPCODES.DO, ref);\n\t}\n\n\tSLEEP(ref: any): number {\n\t\treturn this.OP(OPCODES.SLEEP, ref);\n\t}\n\n\tDELETE(ref: any): number {\n\t\treturn this.OP(OPCODES.DELETE, ref);\n\t}\n\n\tUNARY_OP(f: any, ref: any): number {\n\t\treturn this.OP(OPCODES.UNARY_OP, ref, f);\n\t}\n\n\tBINARY_OP(f: any, ref: any): number {\n\t\treturn this.OP(OPCODES.BINARY_OP, ref, f);\n\t}\n\n\ttoString(): string {\n\t\tlet s = \"\";\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tconst op = this.opcodes[i];\n\t\t\ts += OPCODES[op];\n\t\t\tif (this.arg1[i] != null) {\n\t\t\t\ts += ` ${this.arg1[i]}`;\n\t\t\t}\n\t\t\ts += \"\\n\";\n\t\t}\n\t\treturn s;\n\t}\n\n\texportArg(arg: any): any {\n\t\tif (arg == null) {\n\t\t\treturn 0;\n\t\t} else if (arg instanceof Routine) {\n\t\t\treturn arg.export();\n\t\t} else if (typeof arg === \"function\") {\n\t\t\treturn (arg as any).name;\n\t\t} else {\n\t\t\treturn arg;\n\t\t}\n\t}\n\n\texport(): {\n\t\tnum_args: number;\n\t\tops: number[];\n\t\targs: any[];\n\t\timport_refs: any[];\n\t\timport_values: any[];\n\t\timport_self: number;\n\t\tlocals_size?: number;\n\t} {\n\t\tconst args: any[] = [];\n\t\tfor (let i = 0; i < this.arg1.length; i++) {\n\t\t\targs[i] = this.exportArg(this.arg1[i]);\n\t\t}\n\t\treturn {\n\t\t\tnum_args: this.num_args,\n\t\t\tops: this.opcodes,\n\t\t\targs: args,\n\t\t\timport_refs: this.import_refs,\n\t\t\timport_values: this.import_values,\n\t\t\timport_self: this.import_self,\n\t\t\tlocals_size: this.locals_size,\n\t\t};\n\t}\n\n\timport(src: {\n\t\tnum_args: number;\n\t\tops: number[];\n\t\targs: any[];\n\t\timport_refs: any[];\n\t\timport_values: any[];\n\t\timport_self: number;\n\t\tlocals_size?: number;\n\t}): Routine {\n\t\tthis.num_args = src.num_args;\n\t\tthis.opcodes = src.ops;\n\t\tthis.arg1 = src.args;\n\t\tthis.import_refs = src.import_refs;\n\t\tthis.import_values = src.import_values;\n\t\tthis.import_self = src.import_self;\n\t\tthis.locals_size = src.locals_size;\n\n\t\tconst token = {\n\t\t\tline: 0,\n\t\t\tcolumn: 0,\n\t\t\tstart: 0,\n\t\t\tlength: 0,\n\t\t\tindex: 0,\n\t\t\ttokenizer: {\n\t\t\t\tfilename: \"filename\",\n\t\t\t\tinput: \"\",\n\t\t\t},\n\t\t} as any;\n\t\tconst ref = {\n\t\t\texpression: {\n\t\t\t\ttoken: token,\n\t\t\t},\n\t\t\ttoken: token,\n\t\t};\n\n\t\tfor (let i = 0; i < this.opcodes.length; i++) {\n\t\t\tif (this.opcodes[i] === 100) {\n\t\t\t\tthis.arg1[i] = (Compiler as any).predefined_unary_functions[this.arg1[i]];\n\t\t\t} else if (this.opcodes[i] === 101) {\n\t\t\t\tthis.arg1[i] = (Compiler as any).predefined_binary_functions[this.arg1[i]];\n\t\t\t} else if (typeof this.arg1[i] === \"object\" && !Array.isArray(this.arg1[i])) {\n\t\t\t\tthis.arg1[i] = new Routine(0).import(this.arg1[i]);\n\t\t\t}\n\t\t\tthis.ref[i] = ref;\n\t\t}\n\t\treturn this;\n\t}\n}\n","/**\n * Program - AST structures for LootiScript\n *\n * Abstract Syntax Tree node definitions for the language.\n */\n\nimport { Routine } from \"./routine\";\nimport type { Token } from \"./token\";\n\n/**\n * Base class for all AST expressions\n */\nexport class Expression {\n\tnowarning?: boolean;\n\tnopop?: boolean;\n\tconstructor() {}\n}\n\n/**\n * Type alias for all AST node types\n */\nexport type Statement =\n\t| Assignment\n\t| SelfAssignment\n\t| Value\n\t| Variable\n\t| Field\n\t| Operation\n\t| Negate\n\t| Not\n\t| Braced\n\t| Return\n\t| Condition\n\t| For\n\t| ForIn\n\t| While\n\t| Break\n\t| Continue\n\t| Function\n\t| FunctionCall\n\t| CreateObject\n\t| CreateClass\n\t| NewCall\n\t| After\n\t| Every\n\t| Do\n\t| Sleep\n\t| Delete;\n\n/**\n * Main Program class containing all statements\n */\nexport class Program {\n\tstatements: Statement[] = [];\n\n\t// Static references (will be assigned after class declarations)\n\tstatic Field: typeof Field;\n\tstatic Variable: typeof Variable;\n\tstatic Assignment: typeof Assignment;\n\n\tconstructor() {\n\t\tthis.statements = [];\n\t}\n\n\tadd(statement: Statement): number {\n\t\treturn this.statements.push(statement);\n\t}\n\n\tisAssignment(): boolean {\n\t\treturn this.statements.length > 0 && this.statements[this.statements.length - 1] instanceof Assignment;\n\t}\n\n\t/**\n\t * Convert value to string representation\n\t */\n\tstatic toString(value: any, nesting: number = 0): string {\n\t\tlet i: number;\n\t\tlet key: string;\n\t\tlet pref: string;\n\t\tlet s: string;\n\t\tlet v: any;\n\n\t\tif (value instanceof Routine) {\n\t\t\tif (nesting === 0) {\n\t\t\t\treturn (value as any).source || \"[function]\";\n\t\t\t} else {\n\t\t\t\treturn \"[function]\";\n\t\t\t}\n\t\t} else if (typeof value === \"function\") {\n\t\t\treturn \"[native function]\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn `\"${value}\"`;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tif (nesting >= 1) {\n\t\t\t\treturn \"[list]\";\n\t\t\t}\n\t\t\ts = \"[\";\n\t\t\tfor (i = 0; i < value.length; i++) {\n\t\t\t\tv = value[i];\n\t\t\t\ts += Program.toString(v, nesting + 1) + (i < value.length - 1 ? \",\" : \"\");\n\t\t\t}\n\t\t\treturn s + \"]\";\n\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\tif (nesting >= 1) {\n\t\t\t\treturn \"[object]\";\n\t\t\t}\n\t\t\ts = \"object\\n\";\n\t\t\tpref = \"\";\n\t\t\tfor (i = 1; i <= nesting; i++) {\n\t\t\t\tpref += \" \";\n\t\t\t}\n\t\t\tfor (key in value) {\n\t\t\t\tv = value[key];\n\t\t\t\ts += pref + ` ${key} = ${Program.toString(v, nesting + 1)}\\n`;\n\t\t\t}\n\t\t\treturn s + pref + \"end\";\n\t\t}\n\t\treturn value || 0;\n\t}\n\n\t/**\n\t * Operator precedence table\n\t */\n\tstatic readonly Precedence: Record<string | number, number> = {\n\t\t\"^\": 21,\n\t\t\"/\": 20,\n\t\t\"*\": 19,\n\t\t\"%\": 18,\n\t\t\"+\": 17,\n\t\t\"-\": 17,\n\t\t\"<\": 16,\n\t\t\"<=\": 15,\n\t\t\">\": 14,\n\t\t\">=\": 13,\n\t\t\"==\": 12,\n\t\t\"!=\": 11,\n\t\t\"<<\": 10,\n\t\t\">>\": 9,\n\t\t\"&\": 8,\n\t\t\"|\": 7,\n\t\tand: 6,\n\t\tor: 5,\n\t};\n\n\t/**\n\t * Create field access expression\n\t */\n\tstatic CreateFieldAccess(token: Token, expression: Statement, field: Statement): Field {\n\t\tif (expression instanceof Field) {\n\t\t\texpression.appendField(field);\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn new Field(token, expression, [field]);\n\t\t}\n\t}\n\n\t/**\n\t * Build operation tree from operators and terms\n\t */\n\tstatic BuildOperations(\n\t\tops: Array<{\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t}>,\n\t\tterms: Statement[],\n\t): Operation {\n\t\tlet i: number;\n\t\tlet o: Operation;\n\t\tlet o1: {\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t};\n\t\tlet o2: {\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t};\n\t\tlet t1: Statement;\n\t\tlet t2: Statement;\n\n\t\twhile (ops.length > 1) {\n\t\t\ti = 0;\n\t\t\twhile (i < ops.length - 1) {\n\t\t\t\to1 = ops[i];\n\t\t\t\to2 = ops[i + 1];\n\t\t\t\tif (Program.Precedence[o2.operation] <= Program.Precedence[o1.operation]) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tt1 = terms[i];\n\t\t\tt2 = terms[i + 1];\n\t\t\to = new Operation(ops[i].token, ops[i].operation, t1, t2);\n\t\t\tterms.splice(i, 2, o);\n\t\t\tops.splice(i, 1);\n\t\t}\n\t\treturn new Operation(ops[0].token, ops[0].operation, terms[0], terms[1]);\n\t}\n}\n\n/**\n * Assignment statement\n */\nexport class Assignment extends Expression {\n\ttoken: Token;\n\tfield: Statement | null;\n\texpression: Statement;\n\tlocal: boolean;\n\n\tconstructor(token: Token, field: Statement | null, expression: Statement, local: boolean) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t\tthis.expression = expression;\n\t\tthis.local = local;\n\t}\n}\n\n/**\n * Self-assignment statement (e.g., +=, -=)\n */\nexport class SelfAssignment extends Expression {\n\ttoken: Token;\n\tfield: Statement | null;\n\toperation: string;\n\texpression: Statement;\n\n\tconstructor(token: Token, field: Statement | null, operation: string, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t\tthis.operation = operation;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Value literal (number, string, array, object, function, class)\n */\nexport class Value extends Expression {\n\ttoken: Token;\n\ttype: number;\n\tvalue: any;\n\n\tstatic readonly TYPE_NUMBER = 1;\n\tstatic readonly TYPE_STRING = 2;\n\tstatic readonly TYPE_ARRAY = 3;\n\tstatic readonly TYPE_OBJECT = 4;\n\tstatic readonly TYPE_FUNCTION = 5;\n\tstatic readonly TYPE_CLASS = 6;\n\n\tconstructor(token: Token, type: number, value: any) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.type = type;\n\t\tthis.value = value;\n\t}\n}\n\n/**\n * Variable reference\n */\nexport class Variable extends Expression {\n\ttoken: Token;\n\tidentifier: string;\n\n\tconstructor(token: Token, identifier: string) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.identifier = identifier;\n\t}\n}\n\n/**\n * Field/property access\n */\nexport class Field extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\tchain: Statement[];\n\n\tconstructor(token: Token, expression: Statement, chain: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tthis.chain = chain;\n\t\tthis.token = expression instanceof Expression ? (expression as any).token : token;\n\t}\n\n\tappendField(field: Statement): number {\n\t\treturn this.chain.push(field);\n\t}\n}\n\n/**\n * Binary operation\n */\nexport class Operation extends Expression {\n\ttoken: Token;\n\toperation: string;\n\tterm1: Statement;\n\tterm2: Statement;\n\n\tconstructor(token: Token, operation: string, term1: Statement, term2: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.operation = operation;\n\t\tthis.term1 = term1;\n\t\tthis.term2 = term2;\n\t}\n}\n\n/**\n * Negate operation (-expression)\n */\nexport class Negate extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Not operation (not expression)\n */\nexport class Not extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Braced expression ((expression))\n */\nexport class Braced extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Return statement\n */\nexport class Return extends Expression {\n\ttoken: Token;\n\texpression: Statement | null;\n\n\tconstructor(token: Token, expression: Statement | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t}\n}\n\n/**\n * Conditional statement chain (if-then-else-elsif)\n */\nexport class Condition extends Expression {\n\ttoken: Token;\n\tchain: Array<{\n\t\tcondition: Statement;\n\t\tsequence: Statement[];\n\t\telse?: Statement[];\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\tchain: Array<{\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.chain = chain;\n\t}\n}\n\n/**\n * For loop statement\n */\nexport class For extends Expression {\n\ttoken: Token;\n\titerator: string;\n\trange_from: Statement;\n\trange_to: Statement;\n\trange_by: Statement | null;\n\tsequence: Statement[];\n\n\tconstructor(\n\t\ttoken: Token,\n\t\titerator: string,\n\t\trange_from: Statement,\n\t\trange_to: Statement,\n\t\trange_by: Statement | null,\n\t\tsequence: Statement[],\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.iterator = iterator;\n\t\tthis.range_from = range_from;\n\t\tthis.range_to = range_to;\n\t\tthis.range_by = range_by;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * For-in loop statement\n */\nexport class ForIn extends Expression {\n\ttoken: Token;\n\titerator: string;\n\tlist: Statement;\n\tsequence: Statement[];\n\n\tconstructor(token: Token, iterator: string, list: Statement, sequence: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.iterator = iterator;\n\t\tthis.list = list;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * While loop statement\n */\nexport class While extends Expression {\n\ttoken: Token;\n\tcondition: Statement;\n\tsequence: Statement[];\n\n\tconstructor(token: Token, condition: Statement, sequence: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.condition = condition;\n\t\tthis.sequence = sequence;\n\t}\n}\n\n/**\n * Break statement\n */\nexport class Break extends Expression {\n\ttoken: Token;\n\tnopop: boolean = true;\n\n\tconstructor(token: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.nopop = true;\n\t}\n}\n\n/**\n * Continue statement\n */\nexport class Continue extends Expression {\n\ttoken: Token;\n\tnopop: boolean = true;\n\n\tconstructor(token: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.nopop = true;\n\t}\n}\n\n/**\n * Function argument with optional default value\n */\nexport interface FunctionArg {\n\tname: string;\n\tdefault?: Statement;\n}\n\n/**\n * Function definition\n */\nexport class Function extends Expression {\n\ttoken: Token;\n\targs: FunctionArg[];\n\tsequence: Statement[];\n\tsource: string;\n\n\tconstructor(token: Token, args: FunctionArg[], sequence: Statement[], end: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.args = args;\n\t\tthis.sequence = sequence;\n\t\tthis.source = \"function\" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Function call\n */\nexport class FunctionCall extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\targs: Statement[];\n\n\tconstructor(token: Token, expression: Statement, args: Statement[]) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tthis.args = args;\n\t}\n}\n\n/**\n * Object literal creation\n */\nexport class CreateObject extends Expression {\n\ttoken: Token;\n\tfields: Array<{\n\t\tfield: string | number | null;\n\t\tvalue: Statement;\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\tfields: Array<{\n\t\t\tfield: string | number | null;\n\t\t\tvalue: Statement;\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.fields = fields;\n\t}\n}\n\n/**\n * Class definition\n */\nexport class CreateClass extends Expression {\n\ttoken: Token;\n\text: Statement | null;\n\tfields: Array<{\n\t\tfield: string | number;\n\t\tvalue: Statement;\n\t}>;\n\n\tconstructor(\n\t\ttoken: Token,\n\t\text: Statement | null,\n\t\tfields: Array<{\n\t\t\tfield: string | number;\n\t\t\tvalue: Statement;\n\t\t}>,\n\t) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.ext = ext;\n\t\tthis.fields = fields;\n\t}\n}\n\n/**\n * New call (constructor invocation)\n */\nexport class NewCall extends Expression {\n\ttoken: Token;\n\texpression: Statement;\n\n\tconstructor(token: Token, expression: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.expression = expression;\n\t\tif (!(this.expression instanceof FunctionCall)) {\n\t\t\tthis.expression = new FunctionCall(this.token, this.expression, []);\n\t\t}\n\t}\n}\n\n/**\n * After statement (delayed execution)\n */\nexport class After extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tsequence: Statement[];\n\tmultiplier: number | null;\n\tsource: string;\n\n\tconstructor(token: Token, delay: Statement, sequence: Statement[], end: Token, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.sequence = sequence;\n\t\tthis.multiplier = multiplier;\n\t\tthis.source = \"after \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Every statement (periodic execution)\n */\nexport class Every extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tsequence: Statement[];\n\tmultiplier: number | null;\n\tsource: string;\n\n\tconstructor(token: Token, delay: Statement, sequence: Statement[], end: Token, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.sequence = sequence;\n\t\tthis.multiplier = multiplier;\n\t\tthis.source = \"every \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Do statement (immediate async execution)\n */\nexport class Do extends Expression {\n\ttoken: Token;\n\tsequence: Statement[];\n\tsource: string;\n\n\tconstructor(token: Token, sequence: Statement[], end: Token) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.sequence = sequence;\n\t\tthis.source = \"do \" + token.tokenizer.input.substring(token.index, end.index + 2);\n\t}\n}\n\n/**\n * Sleep statement\n */\nexport class Sleep extends Expression {\n\ttoken: Token;\n\tdelay: Statement;\n\tmultiplier: number | null;\n\n\tconstructor(token: Token, delay: Statement, multiplier: number | null) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.delay = delay;\n\t\tthis.multiplier = multiplier;\n\t}\n}\n\n/**\n * Delete statement\n */\nexport class Delete extends Expression {\n\ttoken: Token;\n\tfield: Statement;\n\n\tconstructor(token: Token, field: Statement) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.field = field;\n\t}\n}\n\n// Static references - placed at end to avoid \"used before declaration\" errors\nProgram.Field = Field;\nProgram.Variable = Variable;\nProgram.Assignment = Assignment;\n","/**\n * Parser - Parser for LootiScript\n *\n * Transforms tokens into an Abstract Syntax Tree (AST).\n */\n\n// Inline enum stub for @al8b/diagnostics\nconst SyntaxErrorCode = {\n\tE1001: \"E1001\",\n\tE1002: \"E1002\",\n\tE1004: \"E1004\",\n} as const;\nconst ErrorCode = SyntaxErrorCode;\n\nimport {\n\tAfter,\n\tAssignment,\n\tBraced,\n\tBreak,\n\tCondition,\n\tContinue,\n\tCreateClass,\n\tCreateObject,\n\tDelete,\n\tDo,\n\tEvery,\n\tField,\n\tFor,\n\tForIn,\n\tFunction,\n\ttype FunctionArg,\n\tFunctionCall,\n\tNegate,\n\tNewCall,\n\tNot,\n\tOperation,\n\tProgram,\n\tReturn,\n\tSelfAssignment,\n\tSleep,\n\ttype Statement,\n\tValue,\n\tVariable,\n\tWhile,\n} from \"./program\";\nimport { Token } from \"./token\";\nimport { Tokenizer } from \"./tokenizer\";\n\n/**\n * Base error class for LootiScript errors\n */\nexport class LootiScriptError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic file: string,\n\t\tpublic line: number,\n\t\tpublic column: number,\n\t\tpublic stackTrace?: any[],\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"LootiScriptError\";\n\t}\n\n\ttoString(): string {\n\t\tlet msg = `${this.name}: ${this.message}\\n`;\n\t\tmsg += ` at ${this.file}:${this.line}:${this.column}\\n`;\n\t\treturn msg;\n\t}\n}\n\n/**\n * Syntax error during parsing\n */\nexport class LootiSyntaxError extends LootiScriptError {\n\tconstructor(\n\t\tmessage: string,\n\t\tfile: string,\n\t\tline: number,\n\t\tcolumn: number,\n\t\tpublic context?: string,\n\t\tpublic code?: string,\n\t\tpublic suggestions?: string[],\n\t\tpublic related?: {\n\t\t\tfile: string;\n\t\t\tline: number;\n\t\t\tcolumn: number;\n\t\t\tmessage: string;\n\t\t},\n\t) {\n\t\tsuper(message, file, line, column);\n\t\tthis.name = \"SyntaxError\";\n\t}\n\n\ttoString(): string {\n\t\tlet msg = \"\";\n\t\tif (this.code) {\n\t\t\tmsg += `[${this.code}] `;\n\t\t}\n\t\tmsg += `${this.name}: ${this.message}\\n`;\n\t\tmsg += ` at ${this.file}:${this.line}:${this.column}\\n`;\n\t\tif (this.context) {\n\t\t\tmsg += `\\n${this.context}\\n`;\n\t\t}\n\t\treturn msg;\n\t}\n}\n\n/**\n * Helper to format source context around an error\n */\nexport function formatSourceContext(\n\tsource: string,\n\tline: number,\n\tcolumn: number,\n\tcontextLines: number = 3,\n\terrorLength: number = 1,\n): string {\n\tconst lines = source.split(\"\\n\");\n\tconst startLine = Math.max(0, line - contextLines - 1);\n\tconst endLine = Math.min(lines.length - 1, line + contextLines - 1);\n\n\tlet context = \"\\nSource context:\\n\";\n\n\tfor (let i = startLine; i <= endLine; i++) {\n\t\tconst lineNum = i + 1;\n\t\tconst prefix = lineNum === line ? \">\" : \" \";\n\t\tconst lineNumStr = String(lineNum).padStart(4, \" \");\n\t\tconst lineContent = lines[i] || \"\";\n\n\t\tcontext += `${prefix} ${lineNumStr} | ${lineContent}\\n`;\n\n\t\tif (lineNum === line) {\n\t\t\tconst baseOffset = 8;\n\t\t\tconst pointer = \" \".repeat(baseOffset + Math.max(0, column - 1)) + \"^\".repeat(Math.max(1, errorLength));\n\t\t\tcontext += `${pointer}\\n`;\n\t\t}\n\t}\n\n\treturn context;\n}\n\n/**\n * Parser for LootiScript\n * Converts tokens into AST structures\n */\nexport class Parser {\n\tinput: string;\n\tfilename: string;\n\ttokenizer: Tokenizer;\n\tprogram: Program;\n\tcurrent_block: Statement[];\n\tcurrent: Token;\n\tverbose: boolean;\n\tnesting: number;\n\tobject_nesting: number;\n\tnot_terminated: Token[];\n\t// Track function names and their start locations for better error messages\n\tfunction_stack: Array<{\n\t\tname: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t\ttoken: Token;\n\t}>;\n\tapi_reserved: Record<string, boolean>;\n\twarnings: Array<{\n\t\ttype: string;\n\t\tidentifier?: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t}>;\n\tunexpected_eof?: boolean;\n\terror_info?: {\n\t\terror: string;\n\t\tline: number;\n\t\tcolumn: number;\n\t\tcontext?: string;\n\t\tcode?: string;\n\t\tsuggestions?: string[];\n\t\trelated?: {\n\t\t\tfile: string;\n\t\t\tline: number;\n\t\t\tcolumn: number;\n\t\t\tmessage: string;\n\t\t};\n\t};\n\tlast_function_call?: FunctionCall;\n\tstatic multipliers: Record<string, number> = {\n\t\tmillisecond: 1,\n\t\tmilliseconds: 1,\n\t\tsecond: 1000,\n\t\tseconds: 1000,\n\t\tminute: 60000,\n\t\tminutes: 60000,\n\t\thour: 60000 * 60,\n\t\thours: 60000 * 60,\n\t\tday: 60000 * 60 * 24,\n\t\tdays: 60000 * 60 * 24,\n\t};\n\n\tconstructor(input: string, filename: string = \"\") {\n\t\tthis.input = input;\n\t\tthis.filename = filename;\n\t\tif (/^\\s*\\/\\/\\s*javascript\\s*\\n/.test(this.input)) {\n\t\t\tthis.input = 'system.javascript(\"\"\"\\n\\n' + this.input.replace(/\\\\/g, \"\\\\\\\\\") + '\\n\\n\"\"\")';\n\t\t}\n\t\tthis.tokenizer = new Tokenizer(this.input, this.filename);\n\t\tthis.program = new Program();\n\t\tthis.current_block = [];\n\t\t// Initialize with a dummy token (will be replaced by first nextToken call)\n\t\tthis.current = {\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\ttokenizer: this.tokenizer,\n\t\t\ttype: 0,\n\t\t\tvalue: \"\",\n\t\t\tstart: 0,\n\t\t\tlength: 0,\n\t\t\tindex: 0,\n\t\t\tis_binary_operator: false,\n\t\t} as Token;\n\t\tthis.verbose = false;\n\t\tthis.nesting = 0;\n\t\tthis.object_nesting = 0;\n\t\tthis.not_terminated = [];\n\t\tthis.function_stack = [];\n\t\tthis.api_reserved = {\n\t\t\tscreen: true,\n\t\t\taudio: true,\n\t\t\tkeyboard: true,\n\t\t\tgamepad: true,\n\t\t\tsprites: true,\n\t\t\tsounds: true,\n\t\t\tmusic: true,\n\t\t\tassets: true,\n\t\t\tasset_manager: true,\n\t\t\tmaps: true,\n\t\t\ttouch: true,\n\t\t\tmouse: true,\n\t\t\tfonts: true,\n\t\t\tSound: true,\n\t\t\tImage: true,\n\t\t\tSprite: true,\n\t\t\tMap: true,\n\t\t\tsystem: true,\n\t\t\tstorage: true,\n\t\t\tprint: true,\n\t\t\trandom: true,\n\t\t\tFunction: true,\n\t\t\tList: true,\n\t\t\tObject: true,\n\t\t\tString: true,\n\t\t\tNumber: true,\n\t\t\tscenes: true,\n\t\t\tscene: true,\n\t\t\troute: true,\n\t\t\trouter: true,\n\t\t};\n\t\tthis.warnings = [];\n\t}\n\n\tnextToken(): Token {\n\t\tconst token = this.tokenizer.next();\n\t\tif (token == null) {\n\t\t\tthis.unexpected_eof = true;\n\t\t\tthrow \"Unexpected end of file\";\n\t\t}\n\t\treturn (this.current = token);\n\t}\n\n\tnextTokenOptional(): Token | null {\n\t\tconst token = this.tokenizer.next();\n\t\tif (token != null) {\n\t\t\tthis.current = token;\n\t\t}\n\t\treturn token;\n\t}\n\n\tparse():\n\t\t| Parser\n\t\t| {\n\t\t\t\terror: string;\n\t\t\t\tline: number;\n\t\t\t\tcolumn: number;\n\t\t } {\n\t\tlet err: any;\n\t\tlet expression: Statement | null;\n\t\tlet nt: Token;\n\t\tlet token: Token | null;\n\t\ttry {\n\t\t\tthis.warnings = [];\n\t\t\twhile (true) {\n\t\t\t\texpression = this.parseLine();\n\t\t\t\tif (expression == null && !this.tokenizer.finished()) {\n\t\t\t\t\ttoken = this.tokenizer.next();\n\t\t\t\t\tif (token != null && token.reserved_keyword) {\n\t\t\t\t\t\tif (token.value === \"end\") {\n\t\t\t\t\t\t\t// Enhanced error for too many 'end'\n\t\t\t\t\t\t\tconst context = formatSourceContext(\n\t\t\t\t\t\t\t\tthis.input,\n\t\t\t\t\t\t\t\ttoken.line,\n\t\t\t\t\t\t\t\ttoken.column,\n\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t3, // \"end\" length\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst suggestions = [\n\t\t\t\t\t\t\t\t\"Remove this extra 'end' statement\",\n\t\t\t\t\t\t\t\t\"Check if you're missing an opening statement (if, for, while, function)\",\n\t\t\t\t\t\t\t\t\"Verify all blocks are properly matched\",\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\treturn (this.error_info = {\n\t\t\t\t\t\t\t\terror: \"Too many 'end' statements - no matching opening statement found\",\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\tcontext: context,\n\t\t\t\t\t\t\t\tcode: ErrorCode.E1002,\n\t\t\t\t\t\t\t\tsuggestions: suggestions,\n\t\t\t\t\t\t\t}) as any;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.error(`Misuse of reserved keyword: '${token.value}'`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error(\"Unexpected data\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (expression === null) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.current_block.push(expression);\n\t\t\t\tthis.program.add(expression);\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.info(expression);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t} catch (error1) {\n\t\t\terr = error1;\n\n\t\t\t// Handle LootiSyntaxError (already formatted)\n\t\t\tif (err instanceof LootiSyntaxError) {\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: err.message,\n\t\t\t\t\tline: err.line,\n\t\t\t\t\tcolumn: err.column,\n\t\t\t\t\tcontext: err.context,\n\t\t\t\t}) as any;\n\t\t\t}\n\n\t\t\tif (this.not_terminated.length > 0 && err === \"Unexpected end of file\") {\n\t\t\t\tnt = this.not_terminated[this.not_terminated.length - 1];\n\n\t\t\t\t// Try to get function name if this is a function\n\t\t\t\tlet functionName: string | null = null;\n\t\t\t\tlet functionStartLine: number | null = null;\n\t\t\t\tlet functionStartColumn: number | null = null;\n\n\t\t\t\tif (nt.value === \"function\") {\n\t\t\t\t\t// Look for function name in function_stack\n\t\t\t\t\tfor (let i = this.function_stack.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst func = this.function_stack[i];\n\t\t\t\t\t\tif (func.token === nt) {\n\t\t\t\t\t\t\tfunctionName = func.name;\n\t\t\t\t\t\t\tfunctionStartLine = func.line;\n\t\t\t\t\t\t\tfunctionStartColumn = func.column;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst errorLength = typeof nt.value === \"string\" ? nt.value.length : 1;\n\t\t\t\tconst context = formatSourceContext(nt.tokenizer.input, nt.line, nt.column, 3, errorLength);\n\n\t\t\t\t// Build enhanced error message\n\t\t\t\tlet errorMessage: string;\n\t\t\t\tlet suggestions: string[] = [];\n\t\t\t\tlet related: any;\n\n\t\t\t\tif (nt.value === \"function\" && functionName) {\n\t\t\t\t\terrorMessage = `Function '${functionName}' started at line ${functionStartLine} is not closed`;\n\t\t\t\t\tsuggestions = [\n\t\t\t\t\t\t`Add 'end' after the last statement to close function '${functionName}'`,\n\t\t\t\t\t\t`Check if you have an extra 'end' statement somewhere`,\n\t\t\t\t\t\t`Verify all nested blocks (if, for, while) are properly closed`,\n\t\t\t\t\t];\n\t\t\t\t\trelated = {\n\t\t\t\t\t\tfile: this.filename,\n\t\t\t\t\t\tline: functionStartLine!,\n\t\t\t\t\t\tcolumn: functionStartColumn!,\n\t\t\t\t\t\tmessage: `Function '${functionName}' started here`,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = `Unterminated '${nt.value}' ; no matching 'end' found`;\n\t\t\t\t\tsuggestions = [\n\t\t\t\t\t\t`Add 'end' to close the '${nt.value}' statement`,\n\t\t\t\t\t\t`Check if you have nested blocks that need to be closed first`,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: errorMessage,\n\t\t\t\t\tline: nt.line,\n\t\t\t\t\tcolumn: nt.column,\n\t\t\t\t\tcontext: context,\n\t\t\t\t\tcode: ErrorCode.E1001,\n\t\t\t\t\tsuggestions: suggestions,\n\t\t\t\t\trelated: related,\n\t\t\t\t}) as any;\n\t\t\t} else {\n\t\t\t\t// Enhanced error with context for other errors\n\t\t\t\tconst context = formatSourceContext(this.input, this.current.line, this.current.column, 3, 1);\n\t\t\t\treturn (this.error_info = {\n\t\t\t\t\terror: typeof err === \"string\" ? err : err.message || String(err),\n\t\t\t\t\tline: this.current.line,\n\t\t\t\t\tcolumn: this.current.column,\n\t\t\t\t\tcontext: context,\n\t\t\t\t\tcode: ErrorCode.E1004,\n\t\t\t\t}) as any;\n\t\t\t}\n\t\t}\n\t}\n\n\tparseLine(): Statement | null {\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_RETURN:\n\t\t\t\treturn new Return(token, this.parseExpression());\n\t\t\tcase Token.TYPE_BREAK:\n\t\t\t\treturn new Break(token);\n\t\t\tcase Token.TYPE_CONTINUE:\n\t\t\t\treturn new Continue(token);\n\t\t\tcase Token.TYPE_LOCAL:\n\t\t\t\treturn this.parseLocalAssignment(token);\n\t\t\tdefault:\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\treturn this.parseExpression();\n\t\t}\n\t}\n\n\tparseExpression(filter?: string | null, first_function_call: boolean = false): Statement | null {\n\t\tlet access: Statement | null;\n\t\tlet expression: Statement | null;\n\t\texpression = this.parseExpressionStart();\n\t\tif (expression == null) {\n\t\t\treturn null;\n\t\t}\n\t\twhile (true) {\n\t\t\taccess = this.parseExpressionSuffix(expression, filter);\n\t\t\tif (access == null) {\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tif (first_function_call && access instanceof FunctionCall) {\n\t\t\t\treturn access;\n\t\t\t}\n\t\t\texpression = access;\n\t\t}\n\t}\n\n\tassertExpression(filter?: string | null, first_function_call: boolean = false): Statement {\n\t\tconst exp = this.parseExpression(filter, first_function_call);\n\t\tif (exp == null) {\n\t\t\tthrow \"Expression expected\";\n\t\t}\n\t\treturn exp;\n\t}\n\n\tparseExpressionSuffix(expression: Statement, filter?: string | null): Statement | null {\n\t\tlet field: Statement;\n\t\tlet identifier: Token;\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn filter === \"self\" ? expression : null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_DOT:\n\t\t\t\tif (expression instanceof Value && expression.type === Value.TYPE_NUMBER) {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.changeNumberToIdentifier();\n\t\t\t\t\tidentifier = this.assertBroadIdentifier(\"Expected identifier\");\n\t\t\t\t\treturn Program.CreateFieldAccess(\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\texpression,\n\t\t\t\t\t\tnew Value(identifier, Value.TYPE_STRING, identifier.value as string),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase Token.TYPE_OPEN_BRACKET:\n\t\t\t\tfield = this.assertExpression();\n\t\t\t\tthis.assert(Token.TYPE_CLOSED_BRACKET, \"Expected ']'\");\n\t\t\t\treturn Program.CreateFieldAccess(token, expression, field);\n\t\t\tcase Token.TYPE_OPEN_BRACE:\n\t\t\t\treturn this.parseFunctionCall(token, expression);\n\t\t\tcase Token.TYPE_EQUALS:\n\t\t\t\treturn this.parseAssignment(token, expression);\n\t\t\tcase Token.TYPE_PLUS_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MINUS_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MULTIPLY_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_DIVIDE_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tcase Token.TYPE_MODULO_EQUALS:\n\t\t\tcase Token.TYPE_AND_EQUALS:\n\t\t\tcase Token.TYPE_OR_EQUALS:\n\t\t\t\treturn this.parseSelfAssignment(token, expression, token.type);\n\t\t\tdefault:\n\t\t\t\tif (filter === \"self\") {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn expression;\n\t\t\t\t} else if (token.is_binary_operator && filter !== \"noop\") {\n\t\t\t\t\treturn this.parseBinaryOperation(token, expression);\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t}\n\t}\n\n\tparseExpressionStart(): Statement | null {\n\t\tlet next: Token;\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token == null) {\n\t\t\treturn null;\n\t\t}\n\t\tswitch (token.type) {\n\t\t\tcase Token.TYPE_IDENTIFIER: // variable name\n\t\t\t\treturn new Variable(token, token.value as string);\n\t\t\tcase Token.TYPE_NUMBER:\n\t\t\t\treturn this.parseNumberExpression(token);\n\t\t\tcase Token.TYPE_PLUS:\n\t\t\t\treturn this.assertExpression();\n\t\t\tcase Token.TYPE_MINUS:\n\t\t\t\treturn this.parseExpressionSuffix(new Negate(token, this.assertExpression(\"noop\")), \"self\");\n\t\t\tcase Token.TYPE_NOT:\n\t\t\t\treturn this.parseExpressionSuffix(new Not(token, this.assertExpression(\"noop\")), \"self\");\n\t\t\tcase Token.TYPE_STRING:\n\t\t\t\treturn this.parseStringExpression(token);\n\t\t\tcase Token.TYPE_TEMPLATE:\n\t\t\t\treturn this.parseTemplate(token);\n\t\t\tcase Token.TYPE_IF:\n\t\t\t\treturn this.parseIf(token);\n\t\t\tcase Token.TYPE_FOR:\n\t\t\t\treturn this.parseFor(token);\n\t\t\tcase Token.TYPE_WHILE:\n\t\t\t\treturn this.parseWhile(token);\n\t\t\tcase Token.TYPE_OPEN_BRACE:\n\t\t\t\treturn this.parseBracedExpression(token);\n\t\t\tcase Token.TYPE_OPEN_BRACKET:\n\t\t\t\treturn this.parseArray(token);\n\t\t\tcase Token.TYPE_FUNCTION:\n\t\t\t\treturn this.parseFunction(token);\n\t\t\tcase Token.TYPE_OBJECT:\n\t\t\t\treturn this.parseObject(token);\n\t\t\tcase Token.TYPE_CLASS:\n\t\t\t\treturn this.parseClass(token);\n\t\t\tcase Token.TYPE_NEW:\n\t\t\t\treturn this.parseNew(token);\n\t\t\tcase Token.TYPE_DOT:\n\t\t\t\tnext = this.assert(Token.TYPE_NUMBER, \"malformed number\");\n\t\t\t\tif (!Number.isInteger(next.value as number)) {\n\t\t\t\t\tthrow \"malformed number\";\n\t\t\t\t}\n\t\t\t\treturn new Value(token, Value.TYPE_NUMBER, Number.parseFloat(`.${next.string_value}`));\n\t\t\tcase Token.TYPE_AFTER:\n\t\t\t\treturn this.parseAfter(token);\n\t\t\tcase Token.TYPE_EVERY:\n\t\t\t\treturn this.parseEvery(token);\n\t\t\tcase Token.TYPE_DO:\n\t\t\t\treturn this.parseDo(token);\n\t\t\tcase Token.TYPE_SLEEP:\n\t\t\t\treturn this.parseSleep(token);\n\t\t\tcase Token.TYPE_DELETE:\n\t\t\t\treturn this.parseDelete(token);\n\t\t\tdefault:\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tparseNumberExpression(number: Token): Value {\n\t\treturn new Value(number, Value.TYPE_NUMBER, number.value as number);\n\t}\n\n\tparseStringExpression(string: Token): Value {\n\t\tconst token = this.nextTokenOptional();\n\t\tif (token != null) {\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t}\n\t\treturn new Value(string, Value.TYPE_STRING, string.value as string);\n\t}\n\n\tparseArray(bracket: Token): Value {\n\t\tconst res: Statement[] = [];\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_CLOSED_BRACKET) {\n\t\t\t\treturn new Value(bracket, Value.TYPE_ARRAY, res);\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\t// Skip comma\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tres.push(this.assertExpression());\n\t\t\t}\n\t\t}\n\t}\n\n\tparseBinaryOperation(operation: Token, term1: Statement): Statement {\n\t\tconst ops: Array<{\n\t\t\ttoken: Token;\n\t\t\toperation: string;\n\t\t}> = [\n\t\t\t{\n\t\t\t\ttoken: operation,\n\t\t\t\toperation: operation.value as string,\n\t\t\t},\n\t\t];\n\t\tconst terms: Statement[] = [term1];\n\t\tterms.push(this.assertExpression(\"noop\"));\n\t\twhile (true) {\n\t\t\tconst token = this.nextTokenOptional();\n\t\t\tif (token == null) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!token.is_binary_operator) {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push({\n\t\t\t\ttoken: token,\n\t\t\t\toperation: token.value as string,\n\t\t\t});\n\t\t\tterms.push(this.assertExpression(\"noop\"));\n\t\t}\n\t\treturn Program.BuildOperations(ops, terms);\n\t}\n\n\tparseAssignment(token: Token, expression: Statement): Assignment {\n\t\tlet res: Assignment;\n\t\tif (!(expression instanceof Variable || expression instanceof Field)) {\n\t\t\tthrow \"Expected variable identifier or property\";\n\t\t}\n\t\tif (this.object_nesting === 0 && expression instanceof Variable && this.api_reserved[expression.identifier]) {\n\t\t\tthis.warnings.push({\n\t\t\t\ttype: \"assigning_api_variable\",\n\t\t\t\tidentifier: expression.identifier,\n\t\t\t\tline: token.line,\n\t\t\t\tcolumn: token.column,\n\t\t\t});\n\t\t}\n\n\t\t// Peek ahead to see if we're assigning a function\n\t\tconst peekToken = this.tokenizer.peek();\n\t\tlet functionName: string | null = null;\n\n\t\tif (expression instanceof Variable) {\n\t\t\tfunctionName = expression.identifier;\n\t\t}\n\n\t\t// If next token is 'function', we're assigning a named function\n\t\t// Store the function name so parseFunction can use it\n\t\tif (peekToken && peekToken.type === Token.TYPE_FUNCTION && functionName) {\n\t\t\t// We'll update function_stack in parseFunction after it's created\n\t\t}\n\n\t\tconst assignedValue = this.assertExpression();\n\n\t\t// If assigned value is a function and we have a name, update function_stack\n\t\t// Find the most recently added function (should be the one we just parsed)\n\t\tif (assignedValue instanceof Function && functionName && this.function_stack.length > 0) {\n\t\t\t// Find function that matches the function token\n\t\t\tconst funcToken = (assignedValue as any).token;\n\t\t\tfor (let i = this.function_stack.length - 1; i >= 0; i--) {\n\t\t\t\tconst func = this.function_stack[i];\n\t\t\t\tif (func.token === funcToken && func.name === \"anonymous\") {\n\t\t\t\t\tfunc.name = functionName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (expression instanceof Field) {\n\t\t\tthis.object_nesting += 1;\n\t\t\tres = new Assignment(token, expression, assignedValue, false);\n\t\t\tthis.object_nesting -= 1;\n\t\t} else {\n\t\t\tres = new Assignment(token, expression, assignedValue, false);\n\t\t}\n\t\treturn res;\n\t}\n\n\tparseSelfAssignment(token: Token, expression: Statement, operation: number): SelfAssignment {\n\t\tif (!(expression instanceof Variable || expression instanceof Field)) {\n\t\t\tthrow \"Expected variable identifier or property\";\n\t\t}\n\t\t// Convert operation type number to string representation\n\t\tlet opStr: string;\n\t\tif (operation === Token.TYPE_PLUS_EQUALS) {\n\t\t\topStr = \"+=\";\n\t\t} else if (operation === Token.TYPE_MINUS_EQUALS) {\n\t\t\topStr = \"-=\";\n\t\t} else if (operation === Token.TYPE_MULTIPLY_EQUALS) {\n\t\t\topStr = \"*=\";\n\t\t} else if (operation === Token.TYPE_DIVIDE_EQUALS) {\n\t\t\topStr = \"/=\";\n\t\t} else if (operation === Token.TYPE_MODULO_EQUALS) {\n\t\t\topStr = \"%=\";\n\t\t} else if (operation === Token.TYPE_AND_EQUALS) {\n\t\t\topStr = \"&=\";\n\t\t} else if (operation === Token.TYPE_OR_EQUALS) {\n\t\t\topStr = \"|=\";\n\t\t} else {\n\t\t\topStr = String(operation);\n\t\t}\n\t\treturn new SelfAssignment(token, expression, opStr, this.assertExpression());\n\t}\n\n\tparseLocalAssignment(local: Token): Assignment {\n\t\tconst identifier = this.assert(Token.TYPE_IDENTIFIER, \"Expected identifier\");\n\t\tthis.parseOptionalType();\n\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\treturn new Assignment(local, new Variable(identifier, identifier.value as string), this.assertExpression(), true);\n\t}\n\n\tparseBracedExpression(open: Token): Statement {\n\t\t// Check for empty arrow function () => ...\n\t\tif (this.current.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\tconst close = this.nextToken(); // consume )\n\t\t\tconst next = this.nextToken();\n\t\t\tif (next.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(next, []);\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(next);\n\t\t\tthis.current = close;\n\t\t\treturn this.error(\"Unexpected ')'\") as Statement;\n\t\t}\n\n\t\tconst expression = this.assertExpression();\n\t\tthis.parseOptionalType();\n\t\tconst token = this.nextToken();\n\n\t\t// Check for single arg arrow function (arg) => ...\n\t\tif (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\tconst next = this.nextToken();\n\t\t\tif (next.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(next, [expression]);\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(next);\n\t\t\tthis.current = token;\n\t\t\treturn new Braced(open, expression);\n\t\t}\n\t\t// Check for multi arg arrow function (arg1, arg2) => ...\n\t\telse if (token.type === Token.TYPE_COMMA) {\n\t\t\tconst args: Statement[] = [expression];\n\t\t\twhile (true) {\n\t\t\t\targs.push(this.assertExpression());\n\t\t\t\tthis.parseOptionalType();\n\t\t\t\tconst next = this.nextToken();\n\t\t\t\tif (next.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (next.type !== Token.TYPE_COMMA) {\n\t\t\t\t\treturn this.error(\"Expected ',' or ')'\") as Statement;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst arrow = this.nextToken();\n\t\t\tif (arrow.type === Token.TYPE_ARROW) {\n\t\t\t\treturn this.parseArrowFunction(arrow, args);\n\t\t\t}\n\t\t\treturn this.error(\"Expected '=>' after parameter list\") as Statement;\n\t\t} else {\n\t\t\treturn this.error(\"missing closing parenthese\") as Braced;\n\t\t}\n\t}\n\tparseArrowFunction(arrow: Token, args: Statement[]): Function {\n\t\tconst funcArgs: FunctionArg[] = [];\n\t\tfor (const arg of args) {\n\t\t\tif (arg instanceof Variable) {\n\t\t\t\t// Check for type annotation if the variable was parsed with one?\n\t\t\t\t// Actually, parseExpression doesn't parse types.\n\t\t\t\t// So (x: int) => ... would fail in parseExpression because : is unexpected.\n\t\t\t\t// We need to handle types inside parseBracedExpression or here?\n\t\t\t\t// If we use (x: int), parseExpression stops at :?\n\t\t\t\t// No, parseExpression expects operators. : is not an operator.\n\t\t\t\t// So parseExpression returns 'x', and next token is ':'.\n\t\t\t\t// We need to handle that here!\n\n\t\t\t\tfuncArgs.push({\n\t\t\t\t\tname: arg.identifier,\n\t\t\t\t\tdefault: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthrow this.error(\"Invalid argument in arrow function\");\n\t\t\t}\n\t\t}\n\n\t\tconst sequence: Statement[] = [];\n\t\t// Parse single statement/expression body\n\t\tconst body = this.parseLine();\n\t\tif (body) {\n\t\t\t// If it's an expression (not a control flow statement), wrap in Return\n\t\t\tif (\n\t\t\t\tbody instanceof Value ||\n\t\t\t\tbody instanceof Variable ||\n\t\t\t\tbody instanceof Operation ||\n\t\t\t\tbody instanceof FunctionCall ||\n\t\t\t\tbody instanceof Assignment ||\n\t\t\t\tbody instanceof Braced\n\t\t\t) {\n\t\t\t\tsequence.push(new Return(arrow, body));\n\t\t\t} else {\n\t\t\t\tsequence.push(body);\n\t\t\t}\n\t\t}\n\n\t\treturn new Function(arrow, funcArgs, sequence, arrow);\n\t}\n\n\tparseFunctionCall(brace_token: Token, expression: Statement): FunctionCall {\n\t\tconst args: Statement[] = [];\n\t\tthis.last_function_call = new FunctionCall(brace_token, expression, args);\n\t\twhile (true) {\n\t\t\tconst token = this.nextTokenOptional();\n\t\t\tif (token == null) {\n\t\t\t\treturn this.error(\"missing closing parenthese\") as FunctionCall;\n\t\t\t} else if (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\treturn new FunctionCall(token, expression, args);\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\t// Skip comma\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\targs.push(this.assertExpression());\n\t\t\t}\n\t\t}\n\t}\n\n\taddTerminable(token: Token): number {\n\t\treturn this.not_terminated.push(token);\n\t}\n\n\tendTerminable(): void {\n\t\tif (this.not_terminated.length > 0) {\n\t\t\tthis.not_terminated.splice(this.not_terminated.length - 1, 1);\n\t\t}\n\t}\n\n\tparseFunction(funk: Token): Function {\n\t\tlet line: Statement | null;\n\t\tconst args = this.parseFunctionArgs();\n\t\tconst sequence: Statement[] = [];\n\t\tthis.nesting += 1;\n\n\t\t// Track this function (name will be set later if it's an assignment)\n\t\tconst funcInfo = {\n\t\t\tname: \"anonymous\",\n\t\t\tline: funk.line,\n\t\t\tcolumn: funk.column,\n\t\t\ttoken: funk,\n\t\t};\n\t\tthis.function_stack.push(funcInfo);\n\t\tthis.addTerminable(funk);\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst token = this.nextToken();\n\t\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\t\tthis.nesting -= 1;\n\t\t\t\t\tthis.endTerminable();\n\t\t\t\t\tthis.function_stack.pop();\n\t\t\t\t\treturn new Function(funk, args, sequence, token);\n\t\t\t\t} else {\n\t\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\t\tline = this.parseLine();\n\t\t\t\t\tif (line != null) {\n\t\t\t\t\t\tsequence.push(line);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error(\"Unexpected data while parsing function\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Remove from stack on error\n\t\t\tif (this.function_stack.length > 0 && this.function_stack[this.function_stack.length - 1].token === funk) {\n\t\t\t\tthis.function_stack.pop();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tparseFunctionArgs(): FunctionArg[] {\n\t\tconst args: FunctionArg[] = [];\n\t\tlet last: string | null = null;\n\t\tlet token = this.nextToken();\n\t\tif (token.type !== Token.TYPE_OPEN_BRACE) {\n\t\t\treturn this.error(\"Expected opening parenthese\") as FunctionArg[];\n\t\t}\n\t\twhile (true) {\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_CLOSED_BRACE) {\n\t\t\t\treturn args;\n\t\t\t} else if (token.type === Token.TYPE_COMMA) {\n\t\t\t\tlast = null;\n\t\t\t} else if (token.type === Token.TYPE_EQUALS && last === \"argument\") {\n\t\t\t\t// Set default value for the last argument\n\t\t\t\tconst defaultExpr = this.assertExpression();\n\t\t\t\tif (args.length > 0) {\n\t\t\t\t\targs[args.length - 1].default = defaultExpr;\n\t\t\t\t}\n\t\t\t} else if (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\tlast = \"argument\";\n\t\t\t\targs.push({\n\t\t\t\t\tname: token.value as string,\n\t\t\t\t});\n\t\t\t\tthis.parseOptionalType();\n\t\t\t} else {\n\t\t\t\treturn this.error(\"Unexpected token\") as FunctionArg[];\n\t\t\t}\n\t\t}\n\t}\n\n\twarningAssignmentCondition(expression: Statement): void {\n\t\tif (expression instanceof Assignment) {\n\t\t\tthis.warnings.push({\n\t\t\t\ttype: \"assignment_as_condition\",\n\t\t\t\tline: expression.token.line,\n\t\t\t\tcolumn: expression.token.column,\n\t\t\t});\n\t\t}\n\t}\n\n\tparseIf(iftoken: Token): Condition {\n\t\tlet line: Statement;\n\t\tlet token: Token;\n\t\tconst chain: Array<{\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t}> = [];\n\t\tlet current: {\n\t\t\tcondition: Statement;\n\t\t\tsequence: Statement[];\n\t\t\telse?: Statement[];\n\t\t} = {\n\t\t\tcondition: this.assertExpression(),\n\t\t\tsequence: [],\n\t\t};\n\t\tthis.addTerminable(iftoken);\n\t\tthis.warningAssignmentCondition(current.condition);\n\t\ttoken = this.nextToken();\n\t\tif (token.type !== Token.TYPE_THEN) {\n\t\t\treturn this.error(\"Expected 'then'\") as Condition;\n\t\t}\n\t\twhile (true) {\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_ELSIF) {\n\t\t\t\tchain.push(current);\n\t\t\t\tcurrent = {\n\t\t\t\t\tcondition: this.assertExpression(),\n\t\t\t\t\tsequence: [],\n\t\t\t\t};\n\t\t\t\tthis.warningAssignmentCondition(current.condition);\n\t\t\t\tthis.assert(Token.TYPE_THEN, \"Expected 'then'\");\n\t\t\t} else if (token.type === Token.TYPE_ELSE) {\n\t\t\t\tcurrent.else = [];\n\t\t\t} else if (token.type === Token.TYPE_END) {\n\t\t\t\tchain.push(current);\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new Condition(iftoken, chain);\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tconst parsedLine = this.parseLine();\n\t\t\t\tif (parsedLine == null) {\n\t\t\t\t\tthrow Error(\"Unexpected data while parsing if\");\n\t\t\t\t}\n\t\t\t\tline = parsedLine;\n\t\t\t\tif (current.else != null) {\n\t\t\t\t\tcurrent.else.push(line);\n\t\t\t\t} else {\n\t\t\t\t\tcurrent.sequence.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tassert(type: number, error: string): Token {\n\t\tconst token = this.nextToken();\n\t\tif (token.type !== type) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn token;\n\t}\n\n\tassertBroadIdentifier(error: string): Token {\n\t\tconst token = this.nextToken();\n\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t}\n\t\tif (token.type !== Token.TYPE_IDENTIFIER) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn token;\n\t}\n\n\t/**\n\t * Throw enhanced error with source context\n\t */\n\terror(text: string): never {\n\t\tconst token = this.current;\n\t\tconst context = formatSourceContext(token.tokenizer.input, token.line, token.column, 2);\n\n\t\tthrow new LootiSyntaxError(text, token.tokenizer.filename, token.line, token.column, context);\n\t}\n\n\t/**\n\t * Parse optional type annotation (e.g. : string)\n\t * Currently just consumes the tokens without storing type info\n\t */\n\tparseOptionalType(): void {\n\t\tlet token = this.nextTokenOptional();\n\t\tif (token == null) return;\n\n\t\tif (token.type === Token.TYPE_COLON) {\n\t\t\t// Consume type identifier\n\t\t\tthis.assert(Token.TYPE_IDENTIFIER, \"Expected type identifier\");\n\n\t\t\t// Handle array types: number[] or number[][]\n\t\t\twhile (true) {\n\t\t\t\ttoken = this.nextTokenOptional();\n\t\t\t\tif (token && (token as any).type === Token.TYPE_OPEN_BRACKET) {\n\t\t\t\t\tthis.assert(Token.TYPE_CLOSED_BRACKET, \"Expected ']'\");\n\t\t\t\t} else {\n\t\t\t\t\tif (token) this.tokenizer.pushBack(token);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t}\n\t}\n\n\tparseFor(fortoken: Token): For | ForIn {\n\t\tlet list: Statement;\n\t\tlet range_by: Statement | null;\n\t\tlet range_from: Statement;\n\t\tlet range_to: Statement;\n\t\tlet token: Token;\n\t\tconst iterator = this.assertExpression();\n\t\tif (iterator instanceof Assignment) {\n\t\t\trange_from = iterator.expression;\n\t\t\tconst iter = iterator.field;\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type !== Token.TYPE_TO) {\n\t\t\t\treturn this.error(\"Expected 'to'\") as For;\n\t\t\t}\n\t\t\trange_to = this.assertExpression();\n\t\t\ttoken = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_BY) {\n\t\t\t\trange_by = this.assertExpression();\n\t\t\t} else {\n\t\t\t\trange_by = null;\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t}\n\t\t\tif (iter instanceof Variable) {\n\t\t\t\treturn new For(fortoken, iter.identifier, range_from, range_to, range_by, this.parseSequence(fortoken));\n\t\t\t}\n\t\t\treturn this.error(\"Malformed for loop\") as For;\n\t\t} else if (iterator instanceof Variable) {\n\t\t\tthis.assert(Token.TYPE_IN, \"Error expected keyword 'in'\");\n\t\t\tlist = this.assertExpression();\n\t\t\treturn new ForIn(fortoken, iterator.identifier, list, this.parseSequence(fortoken));\n\t\t} else {\n\t\t\treturn this.error(\"Malformed for loop\") as For;\n\t\t}\n\t}\n\n\tparseWhile(whiletoken: Token): While {\n\t\tconst condition = this.assertExpression();\n\t\treturn new While(whiletoken, condition, this.parseSequence(whiletoken));\n\t}\n\n\tparseSequence(start_token: Token | null): Statement[] {\n\t\tlet line: Statement | null;\n\t\tconst sequence: Statement[] = [];\n\t\tif (start_token != null) {\n\t\t\tthis.addTerminable(start_token);\n\t\t}\n\t\tthis.nesting += 1;\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tif (start_token != null) {\n\t\t\t\t\tthis.endTerminable();\n\t\t\t\t}\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\treturn sequence;\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t\tline = this.parseLine();\n\t\t\t\tif (line == null) {\n\t\t\t\t\tthrow this.error(\"Unexpected data\");\n\t\t\t\t}\n\t\t\t\tsequence.push(line);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseObject(object: Token): CreateObject {\n\t\tlet exp: Statement;\n\t\tconst fields: Array<{\n\t\t\tfield: string | number | null;\n\t\t\tvalue: Statement;\n\t\t}> = [];\n\t\tthis.nesting += 1;\n\t\tthis.object_nesting += 1;\n\t\tthis.addTerminable(object);\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.object_nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new CreateObject(object, fields);\n\t\t\t} else {\n\t\t\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_STRING) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\t\t\t\texp = this.assertExpression();\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tfield: token.value as string,\n\t\t\t\t\t\tvalue: exp,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.error(\"Malformed object\") as CreateObject;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tparseClass(object: Token): CreateClass {\n\t\tlet exp: Statement;\n\t\tlet ext: Statement | null = null;\n\t\tconst fields: Array<{\n\t\t\tfield: string | number;\n\t\t\tvalue: Statement;\n\t\t}> = [];\n\t\tthis.nesting += 1;\n\t\tthis.object_nesting += 1;\n\t\tthis.addTerminable(object);\n\t\tlet token = this.nextToken();\n\t\tif (token.type === Token.TYPE_EXTENDS) {\n\t\t\text = this.assertExpression();\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t\twhile (true) {\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.object_nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn new CreateClass(object, ext, fields);\n\t\t\t} else {\n\t\t\t\tif (token.type !== Token.TYPE_IDENTIFIER && token.reserved_keyword) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_STRING) {\n\t\t\t\t\ttoken.type = Token.TYPE_IDENTIFIER;\n\t\t\t\t}\n\t\t\t\tif (token.type === Token.TYPE_IDENTIFIER) {\n\t\t\t\t\tthis.assert(Token.TYPE_EQUALS, \"Expected '='\");\n\t\t\t\t\texp = this.assertExpression();\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tfield: token.value as string,\n\t\t\t\t\t\tvalue: exp,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.error(\"Malformed object\") as CreateClass;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t}\n\n\tparseNew(token: Token): NewCall {\n\t\tconst exp = this.assertExpression(null, true);\n\t\treturn new NewCall(token, exp);\n\t}\n\n\tprivate tryParseMultiplier(): { multiplier: number | null; token: Token } {\n\t\tlet multiplier: number | null = null;\n\t\tlet token = this.nextToken();\n\t\tif (token.type === Token.TYPE_IDENTIFIER && Parser.multipliers[token.value as string]) {\n\t\t\tmultiplier = Parser.multipliers[token.value as string];\n\t\t\ttoken = this.nextToken();\n\t\t}\n\t\treturn { multiplier, token };\n\t}\n\n\tprivate parseBlock(keyword: string): { sequence: Statement[]; endToken: Token } {\n\t\tconst sequence: Statement[] = [];\n\t\twhile (true) {\n\t\t\tconst token = this.nextToken();\n\t\t\tif (token.type === Token.TYPE_END) {\n\t\t\t\tthis.nesting -= 1;\n\t\t\t\tthis.endTerminable();\n\t\t\t\treturn { sequence, endToken: token };\n\t\t\t}\n\t\t\tthis.tokenizer.pushBack(token);\n\t\t\tconst line = this.parseLine();\n\t\t\tif (line != null) {\n\t\t\t\tsequence.push(line);\n\t\t\t} else {\n\t\t\t\tthis.error(`Unexpected data while parsing ${keyword}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tparseAfter(after: Token): After {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(after);\n\t\tconst delay = this.assertExpression();\n\t\tconst { multiplier, token } = this.tryParseMultiplier();\n\t\tif (token == null || token.type !== Token.TYPE_DO) {\n\t\t\treturn this.error(\"Expected keyword 'do'\") as After;\n\t\t}\n\t\tconst { sequence, endToken } = this.parseBlock(\"after\");\n\t\treturn new After(after, delay, sequence, endToken, multiplier);\n\t}\n\n\tparseEvery(every: Token): Every {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(every);\n\t\tconst delay = this.assertExpression();\n\t\tconst { multiplier, token } = this.tryParseMultiplier();\n\t\tif (token == null || token.type !== Token.TYPE_DO) {\n\t\t\treturn this.error(\"Expected keyword 'do'\") as Every;\n\t\t}\n\t\tconst { sequence, endToken } = this.parseBlock(\"every\");\n\t\treturn new Every(every, delay, sequence, endToken, multiplier);\n\t}\n\n\tparseDo(do_token: Token): Do {\n\t\tthis.nesting += 1;\n\t\tthis.addTerminable(do_token);\n\t\tconst { sequence, endToken } = this.parseBlock(\"do\");\n\t\treturn new Do(do_token, sequence, endToken);\n\t}\n\n\tparseSleep(sleep: Token): Sleep {\n\t\tlet multiplier: number | null = null;\n\t\tconst delay = this.assertExpression();\n\t\tconst token = this.nextToken();\n\t\tif (token != null) {\n\t\t\tif (token.type === Token.TYPE_IDENTIFIER && Parser.multipliers[token.value as string]) {\n\t\t\t\tmultiplier = Parser.multipliers[token.value as string];\n\t\t\t} else {\n\t\t\t\tthis.tokenizer.pushBack(token);\n\t\t\t}\n\t\t}\n\t\treturn new Sleep(sleep, delay, multiplier);\n\t}\n\n\tparseDelete(del: Token): Delete {\n\t\tconst v = this.parseExpression();\n\t\tif (v == null || !(v instanceof Variable || v instanceof Field)) {\n\t\t\treturn this.error(\"expecting variable name or property access after keyword `delete`\") as Delete;\n\t\t} else {\n\t\t\treturn new Delete(del, v);\n\t\t}\n\t}\n\tparseTemplate(token: Token): Statement {\n\t\tconst raw = token.value as string;\n\t\tlet current = 0;\n\t\tconst parts: Statement[] = [];\n\n\t\twhile (current < raw.length) {\n\t\t\tconst start = raw.indexOf(\"${\", current);\n\t\t\tif (start === -1) {\n\t\t\t\t// No more interpolation, add remaining string\n\t\t\t\tif (current < raw.length) {\n\t\t\t\t\tparts.push(new Value(token, Value.TYPE_STRING, raw.substring(current)));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Add string part before ${\n\t\t\tif (start > current) {\n\t\t\t\tparts.push(new Value(token, Value.TYPE_STRING, raw.substring(current, start)));\n\t\t\t}\n\n\t\t\t// Find matching }\n\t\t\tlet depth = 1;\n\t\t\tlet end = start + 2;\n\t\t\tlet inString = false;\n\t\t\tlet stringChar = \"\";\n\n\t\t\twhile (end < raw.length && depth > 0) {\n\t\t\t\tconst char = raw[end];\n\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (char === stringChar && raw[end - 1] !== \"\\\\\") {\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (char === '\"' || char === \"'\" || char === \"`\") {\n\t\t\t\t\t\tinString = true;\n\t\t\t\t\t\tstringChar = char;\n\t\t\t\t\t} else if (char === \"{\") {\n\t\t\t\t\t\tdepth++;\n\t\t\t\t\t} else if (char === \"}\") {\n\t\t\t\t\t\tdepth--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (depth > 0) end++;\n\t\t\t}\n\n\t\t\tif (depth > 0) {\n\t\t\t\tthrow this.error(\"Unclosed template interpolation\");\n\t\t\t}\n\n\t\t\t// Extract expression source\n\t\t\tconst exprSource = raw.substring(start + 2, end);\n\n\t\t\t// Parse expression using a new Parser instance\n\t\t\tconst subParser = new (this.constructor as any)(exprSource, token.tokenizer.filename);\n\t\t\tconst expr = subParser.parseExpression();\n\n\t\t\tif (expr) {\n\t\t\t\tparts.push(expr);\n\t\t\t}\n\n\t\t\tcurrent = end + 1;\n\t\t}\n\n\t\tif (parts.length === 0) {\n\t\t\treturn new Value(token, Value.TYPE_STRING, \"\");\n\t\t}\n\n\t\t// Combine parts with +\n\t\tlet result = parts[0];\n\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\tresult = new Operation(token, \"+\", result, parts[i]);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","/**\n * Function Bridge - Converts between LootiScript routines and JavaScript functions\n *\n * Allows LootiScript functions to be called from JavaScript code\n * (e.g., scene lifecycle callbacks, event handlers).\n */\n\nimport type { RuntimeContext } from \"./processor-types\";\nimport { Routine } from \"./routine\";\n\n/**\n * Convert a LootiScript routine to a JavaScript function\n */\nexport function routineAsFunction(runner: any, routine: Routine, context: RuntimeContext): Function {\n\t// Lazy import to avoid circular dependency at module load time\n\tconst ProcessorClass = runner.main_thread.processor.constructor;\n\tconst proc = new ProcessorClass(runner);\n\n\treturn function (this: any) {\n\t\tconst count = Math.min(routine.num_args, arguments.length);\n\t\tproc.load(routine);\n\t\tfor (let i = 0; i <= count - 1; i += 1) {\n\t\t\tproc.stack[++proc.stack_index] = arguments[i] || 0;\n\t\t}\n\t\tproc.stack[++proc.stack_index] = arguments.length;\n\t\tif (routine.uses_arguments) {\n\t\t\tconst a = [...arguments];\n\t\t\tfor (let i = 0; i <= a.length - 1; i += 1) {\n\t\t\t\tif (a[i] == null) {\n\t\t\t\t\ta[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tproc.stack[++proc.stack_index] = a;\n\t\t}\n\t\treturn proc.run(context);\n\t};\n}\n\n/**\n * Convert a LootiScript routine to a JavaScript function that binds `this`\n */\nexport function routineAsApplicableFunction(runner: any, routine: Routine, context: RuntimeContext): Function {\n\tconst ProcessorClass = runner.main_thread.processor.constructor;\n\tconst proc = new ProcessorClass(runner);\n\n\treturn function (this: any) {\n\t\tconst count = routine.num_args;\n\t\tproc.load(routine);\n\t\tproc.object = this;\n\t\tfor (let i = 0; i <= count - 1; i += 1) {\n\t\t\tproc.stack[++proc.stack_index] = arguments[i] || 0;\n\t\t}\n\t\tproc.stack[++proc.stack_index] = arguments.length;\n\t\tif (routine.uses_arguments) {\n\t\t\tconst a: any[] = [...arguments];\n\t\t\tfor (let i = 0; i <= a.length - 1; i += 1) {\n\t\t\t\tif (a[i] == null) {\n\t\t\t\t\ta[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tproc.stack[++proc.stack_index] = a;\n\t\t}\n\t\tproc.run(context);\n\t\treturn proc.stack[0];\n\t};\n}\n\n/**\n * Convert a LootiScript argument to a native JavaScript value\n */\nexport function argToNative(runner: any, arg: any, context: RuntimeContext): any {\n\tif (arg instanceof Routine) {\n\t\treturn routineAsFunction(runner, arg, context);\n\t}\n\treturn arg != null ? arg : 0;\n}\n","/**\n * Inline Cache interfaces and structures\n *\n * Inline caches optimize property access by caching object shapes and property offsets.\n * This reduces property lookup time from O(n) hash table lookups to O(1) direct access\n * when the same object shape is accessed repeatedly.\n */\n\nexport const IC_STATE = {\n\tUNINITIALIZED: 0,\n\tMONOMORPHIC: 1,\n\tPOLYMORPHIC: 2,\n\tMEGAMORPHIC: 3,\n};\n\nexport interface InlineCache {\n\tstate: number;\n\thits: number;\n\tmisses: number;\n\tproperty: string | number;\n\n\t/**\n\t * Monomorphic cache - Single object shape optimization\n\t *\n\t * When property access consistently uses the same object shape,\n\t * we cache the shape and offset for O(1) lookup instead of O(n) hash lookup.\n\t * This is the fastest cache state and handles the majority of property accesses.\n\t */\n\tshape?: any; // The cached object shape/class/constructor\n\toffset?: number | string; // The pre-resolved property key or array index\n\n\t/**\n\t * Polymorphic cache - Multiple object shapes (2-4 shapes)\n\t *\n\t * When property access uses a small set of different shapes,\n\t * we maintain parallel arrays for quick linear search.\n\t * This provides good performance when dealing with a few different object types.\n\t */\n\tshapes?: any[];\n\toffsets?: any[];\n}\n\n/**\n * Global metrics for inline cache performance tracking\n *\n * Tracks cache hit/miss rates and invalidation counts across all inline caches\n * for performance analysis and optimization.\n */\nexport class ICMetrics {\n\tstatic hits = 0;\n\tstatic misses = 0;\n\tstatic invalidations = 0;\n}\n","/**\n * Memory Pool - Reusable object and array pools for the VM\n *\n * Reduces GC pressure by recycling arrays and objects\n * during bytecode execution.\n */\n\nconst MAX_POOL_SIZE = 1000;\n\nconst arrayPool: any[][] = [];\nconst objectPool: any[] = [];\n\n/**\n * Get an array from the pool or create new\n */\nexport function getPooledArray(): any[] {\n\tif (arrayPool.length > 0) {\n\t\tconst arr = arrayPool.pop()!;\n\t\tarr.length = 0;\n\t\treturn arr;\n\t}\n\treturn [];\n}\n\n/**\n * Recycle array to pool\n */\nexport function recycleArray(arr: any[]): void {\n\tif (arrayPool.length < MAX_POOL_SIZE) {\n\t\tarrayPool.push(arr);\n\t}\n}\n\n/**\n * Get object from pool or create new\n */\nexport function getPooledObject(): any {\n\tif (objectPool.length > 0) {\n\t\treturn objectPool.pop();\n\t}\n\treturn {};\n}\n\n/**\n * Recycle object to pool (clears own enumerable properties)\n * Uses for...in + delete directly to avoid Object.keys() intermediate array allocation\n */\nexport function recycleObject(obj: any): void {\n\tif (objectPool.length < MAX_POOL_SIZE) {\n\t\tfor (const key in obj) {\n\t\t\tdelete obj[key];\n\t\t}\n\t\tobjectPool.push(obj);\n\t}\n}\n","/**\n * Arithmetic and bitwise operator implementations for LootiScript.\n *\n * These are standalone functions extracted from the Processor class so\n * the hot `run()` dispatch loop stays focused on opcode execution.\n * Each operator follows the LootiScript operator-overloading protocol:\n * look up the operator symbol (\"+\", \"-\", …) on the value or its prototype\n * chain, then invoke it via the applicable-function bridge.\n *\n * Calling convention:\n * operatorXxx(runner, context, a, b[, self])\n * - runner – the Runner instance (needed by the routine-as-function bridge)\n * - context – the current VMContext / RuntimeContext\n * - a, b – the operands\n * - self – the opcode's arg1 slot (used by add/sub as a \"self\" hint)\n *\n * @module lootiscript/processor-operators\n */\n\nimport { routineAsApplicableFunction as _routineAsApplicableFunction } from \"./function-bridge\";\nimport { Routine } from \"./routine\";\nimport type { RuntimeContext } from \"./processor-types\";\n\n// ─── Internal helpers ─────────────────────────────────────────────────────\n\n/**\n * If `f` is a Routine, lazily cache its JS wrapper on `f.as_function` and\n * return it. If `f` is already a native JS function, return it unchanged.\n * Returns `null` for anything else.\n */\nfunction resolveCallable(\n\trunner: any,\n\tf: any,\n\tcontext: RuntimeContext,\n): ((...args: any[]) => any) | null {\n\tif (f instanceof Routine) {\n\t\tif (f.as_function == null) {\n\t\t\tf.as_function = _routineAsApplicableFunction(runner, f, context);\n\t\t}\n\t\treturn f.as_function as (...args: any[]) => any;\n\t}\n\tif (typeof f === \"function\") return f as (...args: any[]) => any;\n\treturn null;\n}\n\n/**\n * Shared dispatch logic for binary operators.\n *\n * 1. Determine the target object based on operand type\n * 2. Optionally short-circuit numeric strings with a native JS operation\n * 3. Walk the class chain looking for the operator symbol\n * 4. Fall back to the Object prototype\n * 5. Resolve and invoke\n */\nfunction dispatchBinaryOp(\n\trunner: any,\n\tcontext: RuntimeContext,\n\top: string,\n\ta: any,\n\tb: any,\n\tself: number | undefined,\n\tnativeStringOp?: (a: any, b: any) => number,\n): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (nativeStringOp && isFinite(a as any)) {\n\t\t\tconst r = nativeStringOp(a, b);\n\t\t\treturn isFinite(r) ? r : 0;\n\t\t}\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[op];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[op];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[op];\n\t}\n\tif (f != null) {\n\t\tconst fn = resolveCallable(runner, f, context);\n\t\tif (fn) return fn.call(context.global, a, b, self);\n\t}\n\treturn 0;\n}\n\n// ─── Operator implementations ──────────────────────────────────────────────\n\nexport function operatorAdd(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"+\", a, b, self);\n}\n\nexport function operatorSub(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"-\", a, b, self, (a, b) => a - b);\n}\n\nexport function operatorMul(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"*\", a, b, self, (a, b) => a * b);\n}\n\nexport function operatorDiv(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"/\", a, b, self, (a, b) => a / b);\n}\n\nexport function operatorBand(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"&\", a, b, self, (a, b) => a & b);\n}\n\nexport function operatorBor(runner: any, context: RuntimeContext, a: any, b: any, self: number): any {\n\treturn dispatchBinaryOp(runner, context, \"|\", a, b, self, (a, b) => a | b);\n}\n\nexport function operatorModulo(runner: any, context: RuntimeContext, a: any, b: any): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (isFinite(a as any)) {\n\t\t\tconst r = (a as any) % b;\n\t\t\treturn isFinite(r) ? r : 0;\n\t\t}\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[\"%\"];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[\"%\"];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[\"%\"];\n\t}\n\t// modulo only dispatches Routine operators, not native functions\n\tif (f != null && f instanceof Routine) {\n\t\tif (f.as_function == null) {\n\t\t\tf.as_function = _routineAsApplicableFunction(runner, f, context);\n\t\t}\n\t\tf = f.as_function;\n\t\treturn f.call(context.global, a, b);\n\t}\n\treturn 0;\n}\n\nexport function operatorNegate(runner: any, context: RuntimeContext, a: any): any {\n\tlet obj: any;\n\tif (Array.isArray(a)) {\n\t\tobj = context.global.List;\n\t} else if (typeof a === \"string\") {\n\t\tif (isFinite(a as any)) return -(a as any);\n\t\tobj = context.global.String;\n\t} else {\n\t\tobj = a;\n\t}\n\n\tlet f = obj[\"-\"];\n\twhile (f == null && obj.class != null) {\n\t\tobj = obj.class;\n\t\tf = obj[\"-\"];\n\t}\n\tif (f == null) {\n\t\tf = context.global.Object[\"-\"];\n\t}\n\tif (f != null) {\n\t\tconst fn = resolveCallable(runner, f, context);\n\t\tif (fn) return fn.call(context.global, 0, a);\n\t}\n\treturn 0;\n}\n","/**\n * Processor - VM runtime execution engine for LootiScript\n *\n * Executes bytecode instructions in the virtual machine.\n * Manages the stack, call stack, and local variables.\n * Implements the core fetch-decode-execute loop.\n *\n * Responsibilities:\n * - Execute bytecode instructions\n * - Manage execution stack and memory\n * - Handle function calls and returns\n * - Implement inline caching for property access\n * - Generate stack traces for errors\n *\n * @module lootiscript/processor\n */\n\n// Inline type stub for @al8b/diagnostics\ntype CallFrame = { fn?: string; ip?: number; line?: number; functionName?: string; file?: string; column?: number; source?: string };\nimport {\n\troutineAsFunction as _routineAsFunction,\n\troutineAsApplicableFunction as _routineAsApplicableFunction,\n\targToNative as _argToNative,\n} from \"./function-bridge\";\nimport { IC_STATE, type InlineCache } from \"./inline-cache\";\nimport {\n\tgetPooledArray,\n\tgetPooledObject,\n\trecycleArray as poolRecycleArray,\n\trecycleObject as poolRecycleObject,\n} from \"./memory-pool\";\nimport {\n\toperatorAdd,\n\toperatorBand,\n\toperatorBor,\n\toperatorDiv,\n\toperatorModulo,\n\toperatorMul,\n\toperatorNegate,\n\toperatorSub,\n} from \"./processor-operators\";\n// Re-export runtime types so existing imports from \"./processor\" keep working.\nexport type { RuntimeClass, RuntimeContext, RuntimeGlobal, RuntimeValue } from \"./processor-types\";\nimport type { RuntimeContext, RuntimeGlobal, RuntimeValue } from \"./processor-types\";\nimport { Routine } from \"./routine\";\n\n/**\n * Processor - Executes LootiScript bytecode\n *\n * The heart of the VM. It maintains the state of execution (stack, locals, instruction pointer)\n * and executes opcodes sequentially. It also handles the complexity of\n * function calls, including arguments passing and scope management.\n */\nexport class Processor {\n\trunner: any; // Runner instance\n\troutine!: Routine;\n\tlocals: any[];\n\tstack: any[];\n\tcall_stack: any[];\n\tcall_stack_frames: CallFrame[]; // NEW: Stack trace frames\n\tlog: boolean;\n\ttime_limit: number;\n\tdone: boolean;\n\tlocal_index: number;\n\tstack_index: number;\n\top_index: number;\n\tcall_stack_index: number;\n\tglobal: any;\n\tobject: any;\n\tlocals_offset: number;\n\tcall_super: any;\n\tcall_supername: string;\n\n\t// Profiling metrics\n\tmetrics: {\n\t\tops: number;\n\t\tallocations: number;\n\t\tcacheHits: number;\n\t\tcacheMisses: number;\n\t};\n\tprofilingEnabled: boolean;\n\n\t// Reusable argv array for native function calls with >3 args\n\t// Avoids allocating a new array per call — just reset length\n\tprivate _argv: any[] = [];\n\n\tconstructor(runner: any) {\n\t\tthis.runner = runner;\n\t\tthis.locals = [];\n\t\tthis.stack = [];\n\t\tthis.call_stack = [];\n\t\tthis.call_stack_frames = []; // NEW: Initialize stack frames\n\t\tthis.log = false;\n\t\tthis.time_limit = Number.POSITIVE_INFINITY;\n\t\tthis.done = true;\n\t\tthis.local_index = 0;\n\t\tthis.stack_index = -1;\n\t\tthis.op_index = 0;\n\t\tthis.call_stack_index = 0;\n\t\tthis.global = null;\n\t\tthis.object = null;\n\t\tthis.locals_offset = 0;\n\t\tthis.call_super = null;\n\t\tthis.call_supername = \"\";\n\n\t\tthis.metrics = {\n\t\t\tops: 0,\n\t\t\tallocations: 0,\n\t\t\tcacheHits: 0,\n\t\t\tcacheMisses: 0,\n\t\t};\n\t\tthis.profilingEnabled = false;\n\t}\n\n\tprivate reportNativeError(error: unknown): void {\n\t\tif (typeof this.runner?.reportNativeError === \"function\") {\n\t\t\tthis.runner.reportNativeError(error);\n\t\t} else {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\tgetArray(): any[] {\n\t\treturn getPooledArray();\n\t}\n\n\trecycleArray(arr: any[]): void {\n\t\tpoolRecycleArray(arr);\n\t}\n\n\tgetObject(): any {\n\t\treturn getPooledObject();\n\t}\n\n\trecycleObject(obj: any): void {\n\t\tpoolRecycleObject(obj);\n\t}\n\n\tload(routine: Routine): void {\n\t\tthis.routine = routine;\n\t\tthis.resetState();\n\t}\n\n\tresetState(): void {\n\t\tthis.local_index = 0;\n\t\tthis.stack_index = -1;\n\t\tthis.op_index = 0;\n\t\tthis.call_stack_index = 0;\n\t\tthis.call_stack_frames = []; // NEW: Reset stack frames\n\t\tthis.global = null;\n\t\tthis.object = this.routine.object || null;\n\t\tthis.locals_offset = 0;\n\t\tthis.call_super = null;\n\t\tthis.call_supername = \"\";\n\t\tthis.done = false;\n\t}\n\n\t/**\n\t * Generate stack trace from call frames\n\t *\n\t * Reconstructs the call stack for error reporting.\n\t * Converts internal CallFrame objects into a readable list.\n\t *\n\t * @returns {CallFrame[]} Array of stack frames (most recent first)\n\t */\n\tgenerateStackTrace(): CallFrame[] {\n\t\treturn [...this.call_stack_frames].reverse();\n\t}\n\n\t/**\n\t * Format stack trace as string\n\t */\n\tformatStackTrace(): string {\n\t\tconst frames = this.generateStackTrace();\n\t\tif (frames.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn frames.map((frame) => ` at ${frame.functionName} (${frame.file}:${frame.line}:${frame.column})`).join(\"\\n\");\n\t}\n\n\tresolveParentClass(obj: RuntimeValue, global: RuntimeGlobal): void {\n\t\tif (obj.class != null && typeof obj.class === \"string\") {\n\t\t\tif (global[obj.class] != null) {\n\t\t\t\tobj.class = global[obj.class];\n\t\t\t\tif (typeof obj.class !== \"string\") {\n\t\t\t\t\treturn this.resolveParentClass(obj.class as RuntimeValue, global);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (obj.class != null && typeof obj.class !== \"string\") {\n\t\t\treturn this.resolveParentClass(obj.class as RuntimeValue, global);\n\t\t}\n\t}\n\n\tapplyFunction(_args: any): void {}\n\n\t/**\n\t * Inline Cache Handler for Property Access\n\t *\n\t * Optimizes property access by caching the shape/structure of objects.\n\t *\n\t * States:\n\t * - UNINITIALIZED: First access\n\t * - MONOMORPHIC: Optimized for single object shape (fastest)\n\t * - POLYMORPHIC: Optimized for few object shapes (2-4)\n\t * - MEGAMORPHIC: Fallback for many shapes (slowest)\n\t *\n\t * @param {any} obj - The object to access\n\t * @param {string} prop - The property name\n\t * @param {InlineCache} ic - The inline cache slot associated with this instruction\n\t * @returns {any} The property value\n\t */\n\tresolvePropertyIC(obj: any, prop: string, ic: InlineCache): any {\n\t\tif (obj == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check cache state\n\t\tif (ic.state === IC_STATE.MONOMORPHIC) {\n\t\t\t// Fast path: check if object shape matches cached shape\n\t\t\t// Note: In JS engines, objects don't expose shape IDs easily.\n\t\t\t// We use constructor/class as a proxy for shape.\n\t\t\tconst shape = obj.class || obj.constructor;\n\n\t\t\tif (shape === ic.shape) {\n\t\t\t\tic.hits++;\n\t\t\t\t// In a real VM we'd use offset, here we just return the access\n\t\t\t\t// since we can't easily get property offsets in JS objects\n\t\t\t\treturn obj[prop];\n\t\t\t} else {\n\t\t\t\tic.misses++;\n\t\t\t\t// Transition to polymorphic or update monomorphic\n\t\t\t\tic.state = IC_STATE.POLYMORPHIC;\n\t\t\t\tic.shapes = [ic.shape, shape];\n\t\t\t\tic.offsets = [0, 0]; // Placeholder\n\t\t\t}\n\t\t} else if (ic.state === IC_STATE.POLYMORPHIC) {\n\t\t\t// Linear scan of small polymorphic cache\n\t\t\tconst shape = obj.class || obj.constructor;\n\t\t\tif (ic.shapes && ic.shapes.length < 4) {\n\t\t\t\tfor (let i = 0; i < ic.shapes.length; i++) {\n\t\t\t\t\tif (ic.shapes[i] === shape) {\n\t\t\t\t\t\tic.hits++;\n\t\t\t\t\t\treturn obj[prop];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Add new shape\n\t\t\t\tic.shapes.push(shape);\n\t\t\t\tic.misses++;\n\t\t\t} else {\n\t\t\t\t// Too many shapes, go megamorphic\n\t\t\t\tic.state = IC_STATE.MEGAMORPHIC;\n\t\t\t}\n\t\t}\n\n\t\t// Uninitialized or Megamorphic fallback\n\t\tif (ic.state === IC_STATE.UNINITIALIZED) {\n\t\t\tic.state = IC_STATE.MONOMORPHIC;\n\t\t\tic.shape = obj.class || obj.constructor;\n\t\t\tic.property = prop;\n\t\t\tic.hits = 1; // Count initialization as a hit for tracking\n\t\t}\n\n\t\treturn obj[prop];\n\t}\n\n\troutineAsFunction(routine: Routine, context: RuntimeContext): Function {\n\t\treturn _routineAsFunction(this.runner, routine, context);\n\t}\n\n\troutineAsApplicableFunction(routine: Routine, context: RuntimeContext): Function {\n\t\treturn _routineAsApplicableFunction(this.runner, routine, context);\n\t}\n\n\targToNative(arg: any, context: RuntimeContext): any {\n\t\treturn _argToNative(this.runner, arg, context);\n\t}\n\n\t/**\n\t * Main execution loop\n\t *\n\t * The core fetch-decode-execute loop of the VM.\n\t * Iterates through opcodes and performs corresponding actions.\n\t *\n\t * Performance Note:\n\t * This method is the hottest path in the engine.\n\t * It uses a giant switch statement for opcode dispatch which is generally\n\t * the fastest approach in JavaScript engines.\n\t *\n\t * @param {any} context - The execution context (global scope)\n\t * @returns {any} The result of the last executed statement\n\t */\n\trun(context: any): any {\n\t\tlet a,\n\t\t\targ1,\n\t\t\targs,\n\t\t\targv,\n\t\t\tb,\n\t\t\tc,\n\t\t\tcall_stack,\n\t\t\tcall_stack_index,\n\t\t\tcall_super,\n\t\t\tcall_supername,\n\t\t\tcon,\n\t\t\tcs,\n\t\t\terr,\n\t\t\tf,\n\t\t\tfc,\n\t\t\tfield,\n\t\t\tglobal,\n\t\t\ti,\n\t\t\ti1,\n\t\t\ti2,\n\t\t\tid,\n\t\t\tindex,\n\t\t\tir,\n\t\t\titer,\n\t\t\titerator,\n\t\t\tj,\n\t\t\tk,\n\t\t\tkey,\n\t\t\tl,\n\t\t\tlen,\n\t\t\tlength,\n\t\t\tlocal_index,\n\t\t\tlocals,\n\t\t\tlocals_offset,\n\t\t\tloop_by,\n\t\t\tloop_to,\n\t\t\tm,\n\t\t\tn,\n\t\t\tname,\n\t\t\to,\n\t\t\tobj,\n\t\t\tobject,\n\t\t\top_count,\n\t\t\top_index,\n\t\t\topcodes,\n\t\t\tp,\n\t\t\tparent,\n\t\t\tq,\n\t\t\tr,\n\t\t\trc,\n\t\t\tref,\n\t\t\tref2,\n\t\t\tref3,\n\t\t\tref5,\n\t\t\tref6,\n\t\t\tref8,\n\t\t\tref9,\n\t\t\tref11,\n\t\t\tref12,\n\t\t\tref14,\n\t\t\tres,\n\t\t\trestore_op_index,\n\t\t\troutine,\n\t\t\ts,\n\t\t\tsleep_time,\n\t\t\tsrc,\n\t\t\tstack,\n\t\t\tstack_index,\n\t\t\tsup,\n\t\t\tt,\n\t\t\ttoken,\n\t\t\tu,\n\t\t\tv,\n\t\t\tvalue,\n\t\t\tw;\n\t\troutine = this.routine;\n\t\topcodes = this.routine.opcodes;\n\t\targ1 = this.routine.arg1;\n\t\tlength = opcodes.length;\n\t\top_index = this.op_index;\n\t\tstack = this.stack;\n\t\tstack_index = this.stack_index;\n\t\tlocals = this.locals;\n\t\tlocal_index = this.local_index;\n\t\tglobal = this.global || context.global;\n\t\tobject = this.object || global;\n\t\tcall_stack = this.call_stack;\n\t\tcall_stack_index = this.call_stack_index;\n\t\tcall_super = this.call_super || global;\n\t\tcall_supername = this.call_supername || \"\";\n\t\tlocals_offset = this.locals_offset;\n\t\top_count = 0;\n\t\trestore_op_index = -1;\n\n\t\t// Local cache of profiling state for performance\n\t\tconst profiling = this.profilingEnabled;\n\n\t\twhile (op_index < length) {\n\t\t\tif (profiling) {\n\t\t\t\tthis.metrics.ops++;\n\t\t\t}\n\t\t\tswitch (opcodes[op_index]) {\n\t\t\t\tcase 1: // OPCODE_TYPE\n\t\t\t\t\tv = stack[stack_index];\n\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\tstack[stack_index] = \"number\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\tstack[stack_index] = \"string\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\tstack[stack_index] = \"function\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"list\";\n\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"function\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstack[stack_index] = \"object\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: // OPCODE_TYPE_VARIABLE\n\t\t\t\t\tv = object[arg1[op_index]];\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[arg1[op_index]];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"number\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"string\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\t\tstack[++stack_index] = \"function\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"list\";\n\t\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"function\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = \"object\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3: // OPCODE_TYPE_PROPERTY\n\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]];\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tstack[--stack_index] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (typeof v) {\n\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"number\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"string\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\t\tstack[--stack_index] = \"function\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"list\";\n\t\t\t\t\t\t\t\t} else if (v instanceof Routine) {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"function\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstack[--stack_index] = \"object\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4: // OPCODE_LOAD_IMPORT\n\t\t\t\t\tstack[++stack_index] = routine.import_values[arg1[op_index++]];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5: // OPCODE_LOAD_THIS\n\t\t\t\t\tstack[++stack_index] = object;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6: // OPCODE_LOAD_GLOBAL\n\t\t\t\t\tstack[++stack_index] = global;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 10: // CODE_LOAD_VALUE\n\t\t\t\t\tstack[++stack_index] = arg1[op_index++];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 11: // OPCODE_LOAD_LOCAL\n\t\t\t\t\tstack[++stack_index] = locals[locals_offset + arg1[op_index++]];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 12: // OPCODE_LOAD_VARIABLE\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tv = object[name];\n\t\t\t\t\tif (v == null && object.class != null) {\n\t\t\t\t\t\tobj = object;\n\t\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null && !routine.ref[op_index].nowarning) {\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.using_undefined_variable[id]) {\n\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v != null ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // OPCODE_LOAD_LOCAL_OBJECT\n\t\t\t\t\to = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tif (typeof o !== \"object\") {\n\t\t\t\t\t\to = locals[locals_offset + arg1[op_index]] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: token.value,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = o;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 14: // OPCODE_LOAD_VARIABLE_OBJECT\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tobj = object;\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null && global[name] != null) {\n\t\t\t\t\t\tobj = global;\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null || typeof v !== \"object\") {\n\t\t\t\t\t\tv = obj[name] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: arg1[op_index],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 15: // OPCODE_POP\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 16: {\n\t\t\t\t\t// OPCODE_LOAD_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\n\t\t\t\t\t// Inline Cache Check\n\t\t\t\t\tlet ic = routine.ics[op_index];\n\t\t\t\t\tif (!ic) {\n\t\t\t\t\t\tic = routine.ics[op_index] = {\n\t\t\t\t\t\t\tstate: IC_STATE.UNINITIALIZED,\n\t\t\t\t\t\t\thits: 0,\n\t\t\t\t\t\t\tmisses: 0,\n\t\t\t\t\t\t\tproperty: name,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tv = this.resolvePropertyIC(obj, name, ic);\n\n\t\t\t\t\t// Fallback logic if IC didn't fully resolve prototype chain\n\t\t\t\t\tif (v == null && obj.class != null) {\n\t\t\t\t\t\tlet curr = obj;\n\t\t\t\t\t\twhile (v == null && curr.class != null) {\n\t\t\t\t\t\t\tcurr = curr.class;\n\t\t\t\t\t\t\tv = curr[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[--stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 17: // OPCODE_LOAD_PROPERTY_OBJECT\n\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]];\n\t\t\t\t\tif (typeof v !== \"object\") {\n\t\t\t\t\t\tv = stack[stack_index - 1][stack[stack_index]] = {};\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.assigning_field_to_undefined[id]) {\n\t\t\t\t\t\t\tcontext.warnings.assigning_field_to_undefined[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: stack[stack_index],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[--stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 18: // OPCODE_CREATE_OBJECT\n\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = this.getObject();\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 19: // OPCODE_MAKE_OBJECT\n\t\t\t\t\tif (typeof stack[stack_index] !== \"object\") {\n\t\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[stack_index] = this.getObject();\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 20: // OPCODE_CREATE_ARRAY\n\t\t\t\t\tif (profiling) {\n\t\t\t\t\t\tthis.metrics.allocations++;\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = this.getArray();\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 21: // OPCODE_STORE_LOCAL\n\t\t\t\t\tlocals[locals_offset + arg1[op_index]] = stack[stack_index];\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 22: // OPCODE_STORE_LOCAL_POP\n\t\t\t\t\tlocals[locals_offset + arg1[op_index]] = stack[stack_index--];\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 23: // OPCODE_STORE_VARIABLE\n\t\t\t\t\tobject[arg1[op_index++]] = stack[stack_index];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 24: // OPCODE_CREATE_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 2];\n\t\t\t\t\tfield = stack[stack_index - 1];\n\t\t\t\t\tobj[field] = stack[stack_index];\n\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 25: // OPCODE_STORE_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 2];\n\t\t\t\t\tfield = stack[stack_index - 1];\n\t\t\t\t\tstack[stack_index - 2] = obj[field] = stack[stack_index];\n\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 26: // OPCODE_DELETE\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tfield = stack[stack_index];\n\t\t\t\t\tdelete obj[field];\n\t\t\t\t\tstack[(stack_index -= 1)] = 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 27: // OPCODE_UPDATE_CLASS\n\t\t\t\t\tname = arg1[op_index];\n\t\t\t\t\tif (object[name] != null && typeof object[name] === \"object\") {\n\t\t\t\t\t\tobj = object[name];\n\t\t\t\t\t\tsrc = stack[stack_index];\n\t\t\t\t\t\tfor (key in src) {\n\t\t\t\t\t\t\tvalue = src[key];\n\t\t\t\t\t\t\tobj[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobject[name] = stack[stack_index];\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 28: // OPCODE_CREATE_CLASS\n\t\t\t\t\tres = {} as any;\n\t\t\t\t\tparent = stack[stack_index];\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\t(res as any).class = parent;\n\t\t\t\t\t} else if (arg1[op_index]) {\n\t\t\t\t\t\t(res as any).class = arg1[op_index];\n\t\t\t\t\t}\n\t\t\t\t\tstack[stack_index] = res;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 29: // OPCODE_NEW_CALL\n\t\t\t\t\tc = stack[stack_index];\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (typeof c === \"function\") {\n\t\t\t\t\t\ta = [];\n\t\t\t\t\t\tfor (i = j = 0, ref = args - 1; j <= ref; i = j += 1) {\n\t\t\t\t\t\t\ta.push(stack[stack_index - args + i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t// NEW CALL is followed by a POP (to get rid of constructor return value)\n\t\t\t\t\t\tstack[stack_index - 1] = new c(...a);\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.resolveParentClass(c, global);\n\t\t\t\t\t\tres = {\n\t\t\t\t\t\t\tclass: c,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcon = c.constructor;\n\t\t\t\t\t\twhile (!con && c.class != null) {\n\t\t\t\t\t\t\tc = c.class;\n\t\t\t\t\t\t\tcon = c.constructor;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (con != null && con instanceof Routine) {\n\t\t\t\t\t\t\tstack[stack_index - args - 1] = res;\n\t\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\t\troutine = con;\n\t\t\t\t\t\t\topcodes = con.opcodes;\n\t\t\t\t\t\t\targ1 = con.arg1;\n\t\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\t\tobject = res;\n\t\t\t\t\t\t\tcall_super = c;\n\t\t\t\t\t\t\tcall_supername = \"constructor\";\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (args < con.num_args) {\n\t\t\t\t\t\t\t\tfor (i = k = args + 1, ref2 = con.num_args; k <= ref2; i = k += 1) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (args > con.num_args) {\n\t\t\t\t\t\t\t\tstack_index -= args - con.num_args;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\tstack[stack_index - 1] = res;\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 30: // OPCODE_ADD\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta += b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) || typeof b === \"string\" ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, a, b, arg1[op_index]);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 31: // OPCODE_SUB\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta -= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, a, b, arg1[op_index]);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32: // OPCODE_MUL\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta *= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 33: // OPCODE_DIV\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta /= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorDiv(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 34: // OPCODE_MODULO\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\" && typeof b === \"number\") {\n\t\t\t\t\t\ta %= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorModulo(this.runner, context, a, b);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 35: // OPCODE_BINARY_AND\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta &= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorBand(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 36: // OPCODE_BINARY_OR\n\t\t\t\t\tb = stack[stack_index--];\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\ta |= b;\n\t\t\t\t\t\tstack[stack_index] = isFinite(a) ? a : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorBor(this.runner, context, a, b, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // OPCODE_SHIFT_LEFT\n\t\t\t\t\tv = stack[stack_index - 1] << stack[stack_index];\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // OPCODE_SHIFT_RIGHT\n\t\t\t\t\tv = stack[stack_index - 1] >> stack[stack_index];\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39: // OPCODE_NEGATE\n\t\t\t\t\ta = stack[stack_index];\n\t\t\t\t\tif (typeof a === \"number\") {\n\t\t\t\t\t\tstack[stack_index] = -a;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorNegate(this.runner, context, a);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 50: // OPCODE_NOT\n\t\t\t\t\tstack[stack_index] = stack[stack_index] ? 0 : 1;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 68: // OPCODE_LOAD_PROPERTY_ATOP\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstack[++stack_index] = v;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 40: // OPCODE_EQ\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index] === stack[stack_index - 1] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 41: // OPCODE_NEQ\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index] !== stack[stack_index - 1] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 42: // OPCODE_LT\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] < stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 43: // OPCODE_GT\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] > stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 44: // OPCODE_LTE\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] <= stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 45: // OPCODE_GTE\n\t\t\t\t\tstack[stack_index - 1] = stack[stack_index - 1] >= stack[stack_index] ? 1 : 0;\n\t\t\t\t\tstack_index--;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 95: // FORLOOP_INIT\n\t\t\t\t\t// fix loop_by if not set\n\t\t\t\t\titer = arg1[op_index][0];\n\t\t\t\t\tloop_to = locals[locals_offset + iter + 1] = stack[stack_index - 1];\n\t\t\t\t\tloop_by = stack[stack_index];\n\t\t\t\t\titerator = locals[locals_offset + iter];\n\t\t\t\t\tstack[--stack_index] = 0; // unload 2 values and load default value\n\t\t\t\t\tif (loop_by === 0) {\n\t\t\t\t\t\tlocals[locals_offset + iter + 2] = loop_to > iterator ? 1 : -1;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocals[locals_offset + iter + 2] = loop_by;\n\t\t\t\t\t\tif ((loop_by > 0 && iterator > loop_to) || (loop_by < 0 && iterator < loop_to)) {\n\t\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 96: // FORLOOP_CONTROL\n\t\t\t\t\titer = arg1[op_index][0];\n\t\t\t\t\tloop_by = locals[locals_offset + iter + 2];\n\t\t\t\t\tloop_to = locals[locals_offset + iter + 1];\n\t\t\t\t\titerator = locals[locals_offset + iter];\n\t\t\t\t\titerator += loop_by;\n\t\t\t\t\tif ((loop_by > 0 && iterator > loop_to) || (loop_by < 0 && iterator < loop_to)) {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocals[locals_offset + iter] = iterator;\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t}\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 97: // FORIN_INIT\n\t\t\t\t\tv = stack[stack_index];\n\t\t\t\t\tstack[stack_index] = 0; // default result\n\t\t\t\t\titerator = arg1[op_index][0];\n\t\t\t\t\tif (typeof v === \"object\") {\n\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\tlocals[locals_offset + iterator + 1] = v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = Object.keys(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === \"string\") {\n\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = v.split(\"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv = locals[locals_offset + iterator + 1] = [];\n\t\t\t\t\t}\n\t\t\t\t\tif (v.length === 0) {\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = v[0];\n\t\t\t\t\t\t// value could be undefined if the array is sparse\n\t\t\t\t\t\tlocals[locals_offset + arg1[op_index][0]] = value != null ? value : 0;\n\t\t\t\t\t\tlocals[locals_offset + iterator + 2] = 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 98: // FORIN_CONTROL\n\t\t\t\t\titerator = arg1[op_index][0];\n\t\t\t\t\tindex = locals[locals_offset + iterator + 2] += 1;\n\t\t\t\t\tv = locals[locals_offset + iterator + 1];\n\t\t\t\t\tif (index < v.length) {\n\t\t\t\t\t\tvalue = v[index];\n\t\t\t\t\t\t// value could be undefined if the array is sparse\n\t\t\t\t\t\tlocals[locals_offset + iterator] = value != null ? value : 0;\n\t\t\t\t\t\top_index = arg1[op_index][1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 80: // OPCODE_JUMP\n\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\tif (op_count++ > 500) {\n\t\t\t\t\t\top_count = 0;\n\t\t\t\t\t\tif (performance.now() > this.time_limit) {\n\t\t\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\t\t\top_index = length; // stop the loop without adding a condition statement\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 81: // OPCODE_JUMPY\n\t\t\t\t\tif (stack[stack_index--]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 82: // OPCODE_JUMPN\n\t\t\t\t\tif (!stack[stack_index--]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 83: // OPCODE_JUMPY_NOPOP\n\t\t\t\t\tif (stack[stack_index]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 84: // OPCODE_JUMPN_NOPOP\n\t\t\t\t\tif (!stack[stack_index]) {\n\t\t\t\t\t\top_index = arg1[op_index];\n\t\t\t\t\t} else {\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 89: // OPCODE_LOAD_ROUTINE\n\t\t\t\t\tr = arg1[op_index++];\n\t\t\t\t\trc = r.clone();\n\t\t\t\t\tref3 = r.import_refs;\n\t\t\t\t\tfor (l = 0, len = ref3.length; l < len; l++) {\n\t\t\t\t\t\tir = ref3[l];\n\t\t\t\t\t\tif (ir === r.import_self) {\n\t\t\t\t\t\t\trc.import_values.push(rc);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trc.import_values.push(locals[locals_offset + ir]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trc.object = object;\n\t\t\t\t\tstack[++stack_index] = rc;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 90: // OPCODE_FUNCTION_CALL\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tf = stack[stack_index];\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 1] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = n = 0, ref6 = args - 1; n <= ref6; i = n += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 91: // OPCODE_FUNCTION_APPLY_VARIABLE\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tsup = obj = object;\n\t\t\t\t\tf = obj[name];\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\t\tf = sup[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\t\tf = global.Object[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\t\tf = global[name];\n\t\t\t\t\t\t\tsup = global;\n\t\t\t\t\t\t\tobj = global;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index -= 1;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = obj;\n\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\tcall_supername = name;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = p = args + 1, ref8 = f.num_args; p <= ref8; i = p += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj, this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = q = 0, ref9 = args - 1; q <= ref9; i = q += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(obj, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 92: // OPCODE_FUNCTION_APPLY_PROPERTY\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tsup = obj;\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tf = obj[name];\n\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\tf = sup[name];\n\t\t\t\t\t}\n\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\tif (obj instanceof Routine) {\n\t\t\t\t\t\t\tf = global.Function[name];\n\t\t\t\t\t\t} else if (typeof obj === \"string\") {\n\t\t\t\t\t\t\tf = global.String[name];\n\t\t\t\t\t\t} else if (typeof obj === \"number\") {\n\t\t\t\t\t\t\tf = global.Number[name];\n\t\t\t\t\t\t} else if (Array.isArray(obj)) {\n\t\t\t\t\t\t\tf = global.List[name];\n\t\t\t\t\t\t} else if (typeof obj === \"object\") {\n\t\t\t\t\t\t\tf = global.Object[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = obj;\n\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\tcall_supername = name;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = s = args + 1, ref11 = f.num_args; s <= ref11; i = s += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(obj, this.argToNative(stack[stack_index - 2], context));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.call(\n\t\t\t\t\t\t\t\t\t\tobj,\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 4], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 4] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args + 1;\n\t\t\t\t\t\t\t\tfor (i = u = 0, ref12 = args - 1; u <= ref12; i = u += 1) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(obj, argv);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\terr = error;\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(err);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args + 1;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.invoking_non_function[id]) {\n\t\t\t\t\t\t\tfc = routine.ref[op_index];\n\t\t\t\t\t\t\ti1 = fc.expression.token.start;\n\t\t\t\t\t\t\ti2 = fc.token.start + fc.token.length;\n\t\t\t\t\t\t\tcontext.warnings.invoking_non_function[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: fc.token.tokenizer.input.substring(i1, i2),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 93: // OPCODE_SUPER_CALL\n\t\t\t\t\tif (call_super != null && call_supername != null) {\n\t\t\t\t\t\tsup = call_super;\n\t\t\t\t\t\tf = null;\n\t\t\t\t\t\twhile (f == null && sup.class != null) {\n\t\t\t\t\t\t\tsup = sup.class;\n\t\t\t\t\t\t\tf = sup[call_supername];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (f != null && f instanceof Routine) {\n\t\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\t\tcs.op_index = op_index + 1;\n\t\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\t\tcall_super = sup;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\t\tfor (i = w = args + 1, ref14 = f.num_args; w <= ref14; i = w += 1) {\n\t\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\top_index++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\targs = arg1[op_index];\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 94: // OPCODE_RETURN\n\t\t\t\t\tlocal_index -= arg1[op_index];\n\t\t\t\t\tif (call_stack_index <= 0) {\n\t\t\t\t\t\top_index = length;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcs = call_stack[--call_stack_index];\n\t\t\t\t\t\tobject = cs.object;\n\t\t\t\t\t\tcall_super = cs.super;\n\t\t\t\t\t\tcall_supername = cs.supername;\n\t\t\t\t\t\troutine = cs.routine;\n\t\t\t\t\t\top_index = cs.op_index;\n\t\t\t\t\t\topcodes = routine.opcodes;\n\t\t\t\t\t\targ1 = routine.arg1;\n\t\t\t\t\t\tlocals_offset -= routine.locals_size;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 100: // OPCODE_UNARY_FUNC\n\t\t\t\t\tv = arg1[op_index](stack[stack_index]);\n\t\t\t\t\tstack[stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 101: // OPCODE_BINARY_FUNC\n\t\t\t\t\tv = arg1[op_index](stack[stack_index - 1], stack[stack_index]);\n\t\t\t\t\tstack[--stack_index] = isFinite(v) ? v : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 110: // OPCODE_AFTER\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index - 1], stack[stack_index], false);\n\t\t\t\t\tstack[--stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 111: // OPCODE_EVERY\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index - 1], stack[stack_index], true);\n\t\t\t\t\tstack[--stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 112: // OPCODE_DO\n\t\t\t\t\tt = this.runner.createThread(stack[stack_index], 0, false);\n\t\t\t\t\tstack[stack_index] = t;\n\t\t\t\t\top_index += 1;\n\t\t\t\t\tbreak;\n\t\t\t\t// add thread to the runner thread list\n\t\t\t\tcase 113: // OPCODE_SLEEP\n\t\t\t\t\tsleep_time = isFinite(stack[stack_index]) ? stack[stack_index] : 0;\n\t\t\t\t\tthis.runner.sleep(sleep_time);\n\t\t\t\t\top_index += 1;\n\t\t\t\t\trestore_op_index = op_index;\n\t\t\t\t\top_index = length; // stop the thread\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Fused Opcodes\n\t\t\t\tcase 120: // LOAD_VAR_CALL\n\t\t\t\t\t// { name: string, args: number }\n\t\t\t\t\tname = arg1[op_index].name;\n\t\t\t\t\targs = arg1[op_index].args;\n\n\t\t\t\t\t// Load Variable Logic\n\t\t\t\t\tv = object[name];\n\t\t\t\t\tif (v == null && object.class != null) {\n\t\t\t\t\t\tobj = object;\n\t\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = global[name];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check for warning (using undefined variable)\n\t\t\t\t\tif (v == null && !routine.ref[op_index].nowarning) {\n\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\tif (!context.warnings.using_undefined_variable[id]) {\n\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tf = v != null ? v : 0;\n\n\t\t\t\t\t// Function Call Logic\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[++stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index], context));\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[--stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args - 1; // Point to first arg\n\t\t\t\t\t\t\t\tfor (i = 0; i < args; i++) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Not a function\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[++stack_index] = f != null ? f : 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 121: // LOAD_PROP_CALL\n\t\t\t\t\t// args: number\n\t\t\t\t\targs = arg1[op_index];\n\n\t\t\t\t\t// LOAD_PROPERTY logic\n\t\t\t\t\tobj = stack[stack_index - 1];\n\t\t\t\t\tname = stack[stack_index];\n\t\t\t\t\tv = obj[name];\n\t\t\t\t\twhile (v == null && obj.class != null) {\n\t\t\t\t\t\tobj = obj.class;\n\t\t\t\t\t\tv = obj[name];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (v == null) {\n\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\tif (!routine.ref[op_index].nowarning) {\n\t\t\t\t\t\t\troutine.ref[op_index].nowarning = true;\n\t\t\t\t\t\t\tif (!Array.isArray(obj)) {\n\t\t\t\t\t\t\t\ttoken = routine.ref[op_index].token;\n\t\t\t\t\t\t\t\tid = token.tokenizer.filename + \"-\" + token.line + \"-\" + token.column;\n\t\t\t\t\t\t\t\tcontext.warnings.using_undefined_variable[id] = {\n\t\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t\t\texpression: name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tf = v;\n\t\t\t\t\tstack[--stack_index] = f; // Replace name with function on stack\n\n\t\t\t\t\t// FUNCTION_CALL logic (simplified duplication for fusion)\n\t\t\t\t\tif (f instanceof Routine) {\n\t\t\t\t\t\tstack_index--; // Pop function\n\t\t\t\t\t\tcs = call_stack[call_stack_index] || (call_stack[call_stack_index] = {});\n\t\t\t\t\t\tcall_stack_index++;\n\t\t\t\t\t\tcs.routine = routine;\n\t\t\t\t\t\tcs.object = object;\n\t\t\t\t\t\tcs.super = call_super;\n\t\t\t\t\t\tcs.supername = call_supername;\n\t\t\t\t\t\tcs.op_index = op_index + 1;\n\n\t\t\t\t\t\t// NEW: Track stack frame for error reporting\n\t\t\t\t\t\tconst token = routine.ref[op_index]?.token;\n\t\t\t\t\t\tif (token) {\n\t\t\t\t\t\t\tthis.call_stack_frames.push({\n\t\t\t\t\t\t\t\tfunctionName: (f as any).source || \"[anonymous function]\",\n\t\t\t\t\t\t\t\tfile: token.tokenizer.filename,\n\t\t\t\t\t\t\t\tline: token.line,\n\t\t\t\t\t\t\t\tcolumn: token.column,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlocals_offset += routine.locals_size;\n\t\t\t\t\t\troutine = f;\n\t\t\t\t\t\topcodes = f.opcodes;\n\t\t\t\t\t\targ1 = f.arg1;\n\t\t\t\t\t\top_index = 0;\n\t\t\t\t\t\tlength = opcodes.length;\n\t\t\t\t\t\tobject = routine.object != null ? routine.object : global;\n\t\t\t\t\t\tcall_super = global;\n\t\t\t\t\t\tcall_supername = \"\";\n\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\targv = stack.slice(stack_index - args + 1, stack_index + 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (args < f.num_args) {\n\t\t\t\t\t\t\tfor (i = m = args + 1, ref5 = f.num_args; m <= ref5; i = m += 1) {\n\t\t\t\t\t\t\t\tstack[++stack_index] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (args > f.num_args) {\n\t\t\t\t\t\t\tstack_index -= args - f.num_args;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstack[++stack_index] = args;\n\t\t\t\t\t\tif (routine.uses_arguments) {\n\t\t\t\t\t\t\tstack[++stack_index] = argv;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof f === \"function\") {\n\t\t\t\t\t\tswitch (args) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f();\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(this.argToNative(stack[stack_index - 1], context));\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 1] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 2] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f(\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 3], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 2], context),\n\t\t\t\t\t\t\t\t\t\tthis.argToNative(stack[stack_index - 1], context),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index - 3] = v != null ? v : 0;\n\t\t\t\t\t\t\t\tstack_index -= 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\targv = this._argv; argv.length = 0;\n\t\t\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\t\t\tfor (i = 0; i < args; i++) {\n\t\t\t\t\t\t\t\t\targv[i] = this.argToNative(stack[stack_index + i], context);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tv = f.apply(null, argv);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tthis.reportNativeError(e);\n\t\t\t\t\t\t\t\t\tv = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstack[stack_index] = v != null ? v : 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack_index -= args;\n\t\t\t\t\t\tstack[stack_index] = f != null ? f : 0;\n\t\t\t\t\t\top_index++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 122: // LOAD_CONST_ADD\n\t\t\t\t\t// arg1[op_index] is the constant value\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb += a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to full add logic for non-numbers\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 123: // LOAD_CONST_SUB\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb -= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 124: // LOAD_CONST_MUL\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb *= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 125: // LOAD_LOCAL_ADD\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb += a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorAdd(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 126: // LOAD_LOCAL_SUB\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb -= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorSub(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 127: // LOAD_LOCAL_MUL\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\" && typeof a === \"number\") {\n\t\t\t\t\t\tb *= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorMul(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 128: // LOAD_CONST_DIV\n\t\t\t\t\ta = arg1[op_index];\n\t\t\t\t\tb = stack[stack_index];\n\n\t\t\t\t\tif (typeof b === \"number\") {\n\t\t\t\t\t\tb /= a;\n\t\t\t\t\t\tstack[stack_index] = isFinite(b) ? b : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack[stack_index] = operatorDiv(this.runner, context, b, a, 0);\n\t\t\t\t\t}\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 129: // LOAD_LOCAL_LT\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] < a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 130: // LOAD_LOCAL_GT\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] > a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 131: // LOAD_LOCAL_EQ\n\t\t\t\t\ta = locals[locals_offset + arg1[op_index]];\n\t\t\t\t\tstack[stack_index] = stack[stack_index] === a ? 1 : 0;\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 200: // COMPILED\n\t\t\t\t\tstack_index = arg1[op_index](stack, stack_index, locals, locals_offset, object, global);\n\t\t\t\t\top_index++;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow `Unsupported operation: ${opcodes[op_index]}`;\n\t\t\t}\n\t\t}\n\t\tif (restore_op_index >= 0) {\n\t\t\tthis.op_index = restore_op_index;\n\t\t\tthis.routine = routine;\n\t\t\tthis.stack_index = stack_index;\n\t\t\tthis.local_index = local_index;\n\t\t\tthis.object = object;\n\t\t\tthis.call_stack_index = call_stack_index;\n\t\t\tthis.call_super = call_super;\n\t\t\tthis.call_supername = call_supername;\n\t\t\tthis.locals_offset = locals_offset;\n\t\t\tthis.done = false;\n\t\t} else {\n\t\t\tthis.op_index = 0;\n\t\t\tthis.done = true;\n\t\t\tif (this.routine.callback != null) {\n\t\t\t\tthis.routine.callback(stack[stack_index]);\n\t\t\t\tthis.routine.callback = null;\n\t\t\t}\n\t\t}\n\t\t// console.info \"\"\"stack_index: #{stack_index}\"\"\"\n\t\t// console.info stack\n\t\tif (this.log) {\n\t\t\tconsole.info(\"total operations: \" + op_count);\n\t\t\tconsole.info(`stack_index: ${stack_index}`);\n\t\t\tconsole.info(`result: ${stack[stack_index]}`);\n\t\t}\n\t\treturn stack[stack_index];\n\t}\n}\n","/**\n * Compiler - Compiles AST to bytecode\n *\n * Transforms parsed AST into executable bytecode for the VM.\n * Handles optimization, label resolution, and scope management.\n *\n * Responsibilities:\n * - Traverse AST and generate opcodes\n * - Manage local variable scope and allocation\n * - Resolve control flow labels (break/continue)\n * - Perform peephole optimizations (opcode fusion)\n *\n * @module lootiscript/compiler\n */\n\nimport {\n\tAfter,\n\tAssignment,\n\tBraced,\n\tBreak,\n\tCondition,\n\tContinue,\n\tCreateClass,\n\tCreateObject,\n\tDelete,\n\tDo,\n\tEvery,\n\tField,\n\tFor,\n\tForIn,\n\tFunction,\n\tFunctionCall,\n\tNegate,\n\tNewCall,\n\tNot,\n\tOperation,\n\ttype Program,\n\tReturn,\n\tSelfAssignment,\n\tSleep,\n\ttype Statement,\n\tValue,\n\tVariable,\n\tWhile,\n} from \"./program\";\nimport { OPCODES, Routine } from \"./routine\";\nimport { Processor } from \"./processor\";\n\n/**\n * Compiler - Compiles LootiScript AST to bytecode\n *\n * The compiler works in a single pass for code generation, followed by\n * optimization passes for label resolution and opcode fusion.\n *\n * @example\n * const compiler = new Compiler(programAst);\n * const routine = compiler.routine;\n */\nexport class Compiler {\n\tprogram: Program;\n\tcode_saves: any[];\n\tcode: string[];\n\troutine: Routine;\n\tlocals: Locals;\n\tcount: number;\n\tbreak_label: string | null;\n\tcontinue_label: string | null;\n\tprocessor?: Processor;\n\n\tconstructor(program: Program) {\n\t\tlet i: number, j: number, len: number, ref: Statement[], s: Statement;\n\t\tthis.program = program;\n\t\tthis.code_saves = [];\n\t\tthis.code = [\"\"];\n\t\tthis.routine = new Routine(0);\n\t\tthis.locals = new Locals(this);\n\t\tthis.count = 0;\n\t\tthis.break_label = null;\n\t\tthis.continue_label = null;\n\t\tref = this.program.statements;\n\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\ts = ref[i];\n\t\t\tthis.compile(s);\n\t\t\tif (i < this.program.statements.length - 1) {\n\t\t\t\tthis.routine.POP(s);\n\t\t\t}\n\n\t\t\t// OPTIMIZATION: Dead Code Elimination\n\t\t\t// Stop compiling after return, break, or continue statements\n\t\t\tif (s instanceof Return || s instanceof Break || s instanceof Continue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.routine.optimize();\n\t\tthis.routine.resolveLabels();\n\t\tthis.optimizeFusedOpcodes();\n\t\tthis.count += this.routine.opcodes.length;\n\t\tthis.routine.locals_size = this.locals.max_index;\n\t}\n\n\t/**\n\t * Optimize bytecode by fusing common opcode patterns\n\t *\n\t * Performs peephole optimization by combining adjacent opcodes into\n\t * more efficient fused instructions. This reduces opcode dispatch overhead\n\t * and improves execution performance.\n\t *\n\t * Optimization patterns:\n\t * - LOAD_VARIABLE + FUNCTION_CALL -> LOAD_VAR_CALL\n\t * - LOAD_PROPERTY + FUNCTION_CALL -> LOAD_PROP_CALL\n\t * - LOAD_VALUE (number) + ADD -> LOAD_CONST_ADD\n\t *\n\t * @remarks\n\t * This method modifies the routine's opcode array in place.\n\t * Should be called after label resolution.\n\t */\n\toptimizeFusedOpcodes(): void {\n\t\tconst ops = this.routine.opcodes;\n\t\tconst args = this.routine.arg1;\n\t\tconst refs = this.routine.ref;\n\t\tlet i = 0;\n\n\t\twhile (i < ops.length - 1) {\n\t\t\t// Fusion: LOAD_VARIABLE + FUNCTION_CALL -> LOAD_VAR_CALL\n\t\t\tif (ops[i] === OPCODES.LOAD_VARIABLE && ops[i + 1] === OPCODES.FUNCTION_CALL) {\n\t\t\t\tconst varName = args[i];\n\t\t\t\tconst numArgs = args[i + 1];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_VAR_CALL;\n\t\t\t\targs[i] = {\n\t\t\t\t\tname: varName,\n\t\t\t\t\targs: numArgs,\n\t\t\t\t};\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_PROPERTY + FUNCTION_CALL -> LOAD_PROP_CALL\n\t\t\tif (ops[i] === OPCODES.LOAD_PROPERTY && ops[i + 1] === OPCODES.FUNCTION_CALL) {\n\t\t\t\tconst numArgs = args[i + 1];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_PROP_CALL;\n\t\t\t\targs[i] = numArgs;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + ADD -> LOAD_CONST_ADD\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.ADD) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_ADD;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + SUB -> LOAD_CONST_SUB\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.SUB) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_SUB;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + MUL -> LOAD_CONST_MUL\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.MUL) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_MUL;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + ADD -> LOAD_LOCAL_ADD\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.ADD) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_ADD;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + SUB -> LOAD_LOCAL_SUB\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.SUB) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_SUB;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + MUL -> LOAD_LOCAL_MUL\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.MUL) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_MUL;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_VALUE (number) + DIV -> LOAD_CONST_DIV\n\t\t\tif (ops[i] === OPCODES.LOAD_VALUE && typeof args[i] === \"number\" && ops[i + 1] === OPCODES.DIV) {\n\t\t\t\tconst val = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_CONST_DIV;\n\t\t\t\targs[i] = val;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + LT -> LOAD_LOCAL_LT\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.LT) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_LT;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + GT -> LOAD_LOCAL_GT\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.GT) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_GT;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fusion: LOAD_LOCAL + EQ -> LOAD_LOCAL_EQ\n\t\t\tif (ops[i] === OPCODES.LOAD_LOCAL && ops[i + 1] === OPCODES.EQ) {\n\t\t\t\tconst localIdx = args[i];\n\t\t\t\tconst ref = refs[i + 1];\n\n\t\t\t\tops[i] = OPCODES.LOAD_LOCAL_EQ;\n\t\t\t\targs[i] = localIdx;\n\t\t\t\trefs[i] = ref;\n\n\t\t\t\tops.splice(i + 1, 1);\n\t\t\t\targs.splice(i + 1, 1);\n\t\t\t\trefs.splice(i + 1, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n\t * Main compile method - dispatches to appropriate compile method based on statement type\n\t *\n\t * Acts as the central dispatcher for the compilation process.\n\t * Recursively calls specific compile methods for each AST node type.\n\t *\n\t * @param {Statement} statement - The AST node to compile\n\t * @throws {string} If the statement type is not implemented\n\t */\n\tcompile(statement: Statement): void {\n\t\tif (statement instanceof Value) {\n\t\t\tthis.compileValue(statement);\n\t\t} else if (statement instanceof Operation) {\n\t\t\tthis.compileOperation(statement);\n\t\t} else if (statement instanceof Assignment) {\n\t\t\tthis.compileAssignment(statement);\n\t\t} else if (statement instanceof Variable) {\n\t\t\tthis.compileVariable(statement);\n\t\t} else if (statement instanceof Function) {\n\t\t\tthis.compileFunction(statement);\n\t\t} else if (statement instanceof FunctionCall) {\n\t\t\tthis.compileFunctionCall(statement);\n\t\t} else if (statement instanceof While) {\n\t\t\tthis.compileWhile(statement);\n\t\t} else if (statement instanceof SelfAssignment) {\n\t\t\tthis.compileSelfAssignment(statement);\n\t\t} else if (statement instanceof Braced) {\n\t\t\tthis.compileBraced(statement);\n\t\t} else if (statement instanceof CreateObject) {\n\t\t\tthis.compileCreateObject(statement);\n\t\t} else if (statement instanceof Field) {\n\t\t\tthis.compileField(statement);\n\t\t} else if (statement instanceof Negate) {\n\t\t\tthis.compileNegate(statement);\n\t\t} else if (statement instanceof For) {\n\t\t\tthis.compileFor(statement);\n\t\t} else if (statement instanceof ForIn) {\n\t\t\tthis.compileForIn(statement);\n\t\t} else if (statement instanceof Not) {\n\t\t\tthis.compileNot(statement);\n\t\t} else if (statement instanceof Return) {\n\t\t\tthis.compileReturn(statement);\n\t\t} else if (statement instanceof Condition) {\n\t\t\tthis.compileCondition(statement);\n\t\t} else if (statement instanceof Break) {\n\t\t\tthis.compileBreak(statement);\n\t\t} else if (statement instanceof Continue) {\n\t\t\tthis.compileContinue(statement);\n\t\t} else if (statement instanceof CreateClass) {\n\t\t\tthis.compileCreateClass(statement);\n\t\t} else if (statement instanceof NewCall) {\n\t\t\tthis.compileNewCall(statement);\n\t\t} else if (statement instanceof After) {\n\t\t\tthis.compileAfter(statement);\n\t\t} else if (statement instanceof Every) {\n\t\t\tthis.compileEvery(statement);\n\t\t} else if (statement instanceof Do) {\n\t\t\tthis.compileDo(statement);\n\t\t} else if (statement instanceof Sleep) {\n\t\t\tthis.compileSleep(statement);\n\t\t} else if (statement instanceof Delete) {\n\t\t\tthis.compileDelete(statement);\n\t\t} else {\n\t\t\tconsole.info(statement);\n\t\t\tthrow \"Not implemented\";\n\t\t}\n\t}\n\n\t/**\n\t * Compile assignment statement\n\t *\n\t * Handles variable assignment, property assignment, and local variable declaration.\n\t * Manages the complexity of assigning to:\n\t * - Local variables (optimized access)\n\t * - Global variables\n\t * - Object properties\n\t * - \"this\" context\n\t *\n\t * @param {Assignment} statement - The assignment AST node\n\t */\n\tcompileAssignment(statement: Assignment): void {\n\t\tlet arg_index: number, f: Field, i: number, index: number, j: number, ref: number;\n\t\tif (statement.local) {\n\t\t\tif (statement.field instanceof Variable) {\n\t\t\t\tif (statement.expression instanceof Function) {\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // register function locally first\n\t\t\t\t\tthis.compile(statement.expression); // then compile function which may refer to itself\n\t\t\t\t\tthis.routine.arg1[this.routine.arg1.length - 1].import_self = index;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else if (\n\t\t\t\t\tstatement.expression instanceof After ||\n\t\t\t\t\tstatement.expression instanceof Do ||\n\t\t\t\t\tstatement.expression instanceof Every\n\t\t\t\t) {\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // register thread locally first\n\t\t\t\t\targ_index = this.routine.arg1.length; // thread main routine will land here\n\t\t\t\t\tthis.compile(statement.expression); // then compile function which may refer to itself\n\t\t\t\t\tthis.routine.arg1[arg_index].import_self = index;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(statement.expression); // first compile expression which may refer to another local with same name\n\t\t\t\t\tindex = this.locals.register(statement.field.identifier); // then register a local for that name\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow \"illegal\";\n\t\t\t}\n\t\t} else {\n\t\t\tif (statement.field instanceof Variable) {\n\t\t\t\tif (this.locals.get(statement.field.identifier) != null) {\n\t\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t\tindex = this.locals.get(statement.field.identifier)!;\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t\t} else if (statement.expression instanceof CreateClass) {\n\t\t\t\t\tthis.compileUpdateClass(statement.expression, statement.field.identifier);\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t\tthis.routine.STORE_VARIABLE(statement.field.identifier, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tf = statement.field as Field;\n\t\t\t\tif (f.expression instanceof Variable) {\n\t\t\t\t\tif (f.expression.identifier === \"this\") {\n\t\t\t\t\t\tthis.routine.LOAD_THIS(f);\n\t\t\t\t\t} else if (this.locals.get(f.expression.identifier) != null) {\n\t\t\t\t\t\tindex = this.locals.get(f.expression.identifier)!;\n\t\t\t\t\t\tthis.routine.LOAD_LOCAL_OBJECT(index, f.expression);\n\t\t\t\t\t} else if (f.expression.identifier === \"global\") {\n\t\t\t\t\t\tthis.routine.LOAD_GLOBAL(f);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.routine.LOAD_VARIABLE_OBJECT(f.expression.identifier, statement);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(f.expression);\n\t\t\t\t\tthis.routine.MAKE_OBJECT(statement);\n\t\t\t\t}\n\t\t\t\tfor (i = j = 0, ref = f.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.compile(f.chain[i]);\n\t\t\t\t\tthis.routine.LOAD_PROPERTY_OBJECT(f.chain[i]);\n\t\t\t\t}\n\t\t\t\tthis.compile(f.chain[f.chain.length - 1]);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\tthis.routine.STORE_PROPERTY(statement);\n\t\t\t}\n\t\t}\n\t}\n\n\tcompileSelfAssignment(statement: SelfAssignment): void {\n\t\tlet f: Field, i: number, index: number, j: number, op: string, ref: number;\n\t\tswitch (statement.operation) {\n\t\t\tcase \"+=\":\n\t\t\t\top = \"ADD\";\n\t\t\t\tbreak;\n\t\t\tcase \"-=\":\n\t\t\t\top = \"SUB\";\n\t\t\t\tbreak;\n\t\t\tcase \"*=\":\n\t\t\t\top = \"MUL\";\n\t\t\t\tbreak;\n\t\t\tcase \"/=\":\n\t\t\t\top = \"DIV\";\n\t\t\t\tbreak;\n\t\t\tcase \"%=\":\n\t\t\t\top = \"MODULO\";\n\t\t\t\tbreak;\n\t\t\tcase \"&=\":\n\t\t\t\top = \"BINARY_AND\";\n\t\t\t\tbreak;\n\t\t\tcase \"|=\":\n\t\t\t\top = \"BINARY_OR\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Unknown self-assignment operation: \" + statement.operation;\n\t\t}\n\t\tif (statement.field instanceof Variable) {\n\t\t\tif (this.locals.get(statement.field.identifier) != null) {\n\t\t\t\tindex = this.locals.get(statement.field.identifier)!;\n\t\t\t\tthis.routine.LOAD_LOCAL(index, statement);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t(this.routine as any)[op](statement);\n\t\t\t\tthis.routine.STORE_LOCAL(index, statement);\n\t\t\t} else {\n\t\t\t\tthis.routine.LOAD_VARIABLE(statement.field.identifier, statement);\n\t\t\t\tthis.compile(statement.expression);\n\t\t\t\t(this.routine as any)[op](statement);\n\t\t\t\tthis.routine.STORE_VARIABLE(statement.field.identifier, statement);\n\t\t\t}\n\t\t} else {\n\t\t\tf = statement.field as Field;\n\t\t\tif (f.expression instanceof Variable) {\n\t\t\t\tif (f.expression.identifier === \"this\") {\n\t\t\t\t\tthis.routine.LOAD_THIS(f);\n\t\t\t\t} else if (this.locals.get(f.expression.identifier) != null) {\n\t\t\t\t\tindex = this.locals.get(f.expression.identifier)!;\n\t\t\t\t\tthis.routine.LOAD_LOCAL_OBJECT(index, statement);\n\t\t\t\t} else if (f.expression.identifier === \"global\") {\n\t\t\t\t\tthis.routine.LOAD_GLOBAL(f);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VARIABLE_OBJECT(f.expression.identifier, statement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.compile(f.expression);\n\t\t\t\tthis.routine.MAKE_OBJECT(statement);\n\t\t\t}\n\t\t\tfor (i = j = 0, ref = f.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\t\tthis.compile(f.chain[i]);\n\t\t\t\tthis.routine.LOAD_PROPERTY_OBJECT(f.chain[i]);\n\t\t\t}\n\t\t\tthis.compile(f.chain[f.chain.length - 1]);\n\t\t\tthis.routine.LOAD_PROPERTY_ATOP(statement);\n\t\t\tthis.compile(statement.expression);\n\t\t\t(this.routine as any)[op](statement);\n\t\t\tthis.routine.STORE_PROPERTY(statement);\n\t\t}\n\t}\n\n\t/**\n\t * Compile binary or unary operation\n\t *\n\t * Generates opcodes for mathematical and logical operations.\n\t * Handles short-circuit evaluation for 'and'/'or' operators.\n\t *\n\t * @param {Operation} op - The operation AST node\n\t */\n\tcompileOperation(op: Operation): void {\n\t\tlet jump: string, ref: string, ref1: string;\n\t\tif (\n\t\t\t(ref = op.operation) === \"+\" ||\n\t\t\tref === \"-\" ||\n\t\t\tref === \"*\" ||\n\t\t\tref === \"/\" ||\n\t\t\tref === \"%\" ||\n\t\t\tref === \"&\" ||\n\t\t\tref === \"|\" ||\n\t\t\tref === \"<<\" ||\n\t\t\tref === \">>\"\n\t\t) {\n\t\t\t// OPTIMIZATION: Constant Folding\n\t\t\t// If both operands are constant values, compute the result at compile time\n\t\t\tif (\n\t\t\t\top.term1 instanceof Value &&\n\t\t\t\top.term1.type === Value.TYPE_NUMBER &&\n\t\t\t\top.term2 instanceof Value &&\n\t\t\t\top.term2.type === Value.TYPE_NUMBER\n\t\t\t) {\n\t\t\t\tlet result: number;\n\t\t\t\tconst v1 = op.term1.value as number;\n\t\t\t\tconst v2 = op.term2.value as number;\n\n\t\t\t\tswitch (op.operation) {\n\t\t\t\t\tcase \"+\":\n\t\t\t\t\t\tresult = v1 + v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"-\":\n\t\t\t\t\t\tresult = v1 - v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"*\":\n\t\t\t\t\t\tresult = v1 * v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"/\":\n\t\t\t\t\t\tresult = v1 / v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"%\":\n\t\t\t\t\t\tresult = v1 % v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"&\":\n\t\t\t\t\t\tresult = v1 & v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"|\":\n\t\t\t\t\t\tresult = v1 | v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<<\":\n\t\t\t\t\t\tresult = v1 << v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">>\":\n\t\t\t\t\t\tresult = v1 >> v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tresult = 0;\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE(result, op);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase \"+\":\n\t\t\t\t\tthis.routine.ADD(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\tthis.routine.SUB(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"*\":\n\t\t\t\t\tthis.routine.MUL(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\":\n\t\t\t\t\tthis.routine.DIV(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%\":\n\t\t\t\t\tthis.routine.MODULO(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"&\":\n\t\t\t\t\tthis.routine.BINARY_AND(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"|\":\n\t\t\t\t\tthis.routine.BINARY_OR(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<<\":\n\t\t\t\t\tthis.routine.SHIFT_LEFT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">>\":\n\t\t\t\t\tthis.routine.SHIFT_RIGHT(op);\n\t\t\t}\n\t\t} else if (\n\t\t\t(ref1 = op.operation) === \"==\" ||\n\t\t\tref1 === \"!=\" ||\n\t\t\tref1 === \"<\" ||\n\t\t\tref1 === \">\" ||\n\t\t\tref1 === \"<=\" ||\n\t\t\tref1 === \">=\"\n\t\t) {\n\t\t\t// OPTIMIZATION: Constant Folding for comparisons\n\t\t\tif (\n\t\t\t\top.term1 instanceof Value &&\n\t\t\t\top.term1.type === Value.TYPE_NUMBER &&\n\t\t\t\top.term2 instanceof Value &&\n\t\t\t\top.term2.type === Value.TYPE_NUMBER\n\t\t\t) {\n\t\t\t\tconst v1 = op.term1.value as number;\n\t\t\t\tconst v2 = op.term2.value as number;\n\t\t\t\tlet result: number;\n\t\t\t\tswitch (op.operation) {\n\t\t\t\t\tcase \"==\":\n\t\t\t\t\t\tresult = v1 === v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!=\":\n\t\t\t\t\t\tresult = v1 !== v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<\":\n\t\t\t\t\t\tresult = v1 < v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">\":\n\t\t\t\t\t\tresult = v1 > v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"<=\":\n\t\t\t\t\t\tresult = v1 <= v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \">=\":\n\t\t\t\t\t\tresult = v1 >= v2 ? 1 : 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tresult = 0;\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE(result, op);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase \"==\":\n\t\t\t\t\tthis.routine.EQ(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"!=\":\n\t\t\t\t\tthis.routine.NEQ(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\":\n\t\t\t\t\tthis.routine.LT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">\":\n\t\t\t\t\tthis.routine.GT(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<=\":\n\t\t\t\t\tthis.routine.LTE(op);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">=\":\n\t\t\t\t\tthis.routine.GTE(op);\n\t\t\t}\n\t\t} else if (op.operation === \"and\") {\n\t\t\tjump = this.routine.createLabel(\"and\");\n\t\t\top.term1.nowarning = true;\n\t\t\top.term2.nowarning = true;\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.routine.JUMPN_NOPOP(jump, op);\n\t\t\tthis.routine.POP(op);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.setLabel(jump);\n\t\t} else if (op.operation === \"or\") {\n\t\t\tjump = this.routine.createLabel(\"or\");\n\t\t\top.term1.nowarning = true;\n\t\t\top.term2.nowarning = true;\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.routine.JUMPY_NOPOP(jump, op);\n\t\t\tthis.routine.POP(op);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.setLabel(jump);\n\t\t} else if (op.operation === \"^\") {\n\t\t\tthis.compile(op.term1);\n\t\t\tthis.compile(op.term2);\n\t\t\tthis.routine.BINARY_OP(Compiler.predefined_binary_functions.pow, op);\n\t\t}\n\t}\n\n\tcompileBraced(expression: Braced): void {\n\t\tthis.compile(expression.expression);\n\t}\n\n\tcompileNegate(expression: Negate): void {\n\t\tif (expression.expression instanceof Value && expression.expression.type === Value.TYPE_NUMBER) {\n\t\t\tthis.routine.LOAD_VALUE(-expression.expression.value, expression);\n\t\t} else {\n\t\t\tthis.compile(expression.expression);\n\t\t\tthis.routine.NEGATE(expression);\n\t\t}\n\t}\n\n\tcompileNot(expression: Not): void {\n\t\t// OPTIMIZATION: Constant Folding for NOT\n\t\tif (expression.expression instanceof Value && expression.expression.type === Value.TYPE_NUMBER) {\n\t\t\tthis.routine.LOAD_VALUE(expression.expression.value ? 0 : 1, expression);\n\t\t\treturn;\n\t\t}\n\t\texpression.expression.nowarning = true;\n\t\tthis.compile(expression.expression);\n\t\tthis.routine.NOT(expression);\n\t}\n\n\tcompileValue(value: Value): void {\n\t\tlet i: number, j: number, ref: number;\n\t\tswitch (value.type) {\n\t\t\tcase Value.TYPE_NUMBER:\n\t\t\t\tthis.routine.LOAD_VALUE(value.value, value);\n\t\t\t\tbreak;\n\t\t\tcase Value.TYPE_STRING:\n\t\t\t\tthis.routine.LOAD_VALUE(value.value, value);\n\t\t\t\tbreak;\n\t\t\tcase Value.TYPE_ARRAY:\n\t\t\t\tthis.routine.CREATE_ARRAY(value);\n\t\t\t\tfor (i = j = 0, ref = (value.value as Statement[]).length - 1; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.routine.LOAD_VALUE(i, value);\n\t\t\t\t\tthis.compile((value.value as Statement[])[i]);\n\t\t\t\t\tthis.routine.CREATE_PROPERTY(value);\n\t\t\t\t}\n\t\t}\n\t}\n\n\tcompileVariable(variable: Variable): void {\n\t\tlet index: number, v: string;\n\t\tv = variable.identifier;\n\t\tif (v === \"this\") {\n\t\t\tthis.routine.LOAD_THIS(variable);\n\t\t} else if (v === \"global\") {\n\t\t\tthis.routine.LOAD_GLOBAL(variable);\n\t\t} else if (Compiler.predefined_values[v] != null) {\n\t\t\tthis.routine.LOAD_VALUE(Compiler.predefined_values[v], variable);\n\t\t} else if (this.locals.get(v) != null) {\n\t\t\tindex = this.locals.get(v)!;\n\t\t\tthis.routine.LOAD_LOCAL(index, variable);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VARIABLE(v, variable);\n\t\t}\n\t}\n\n\tcompileField(field: Field): void {\n\t\tvar c: Statement,\n\t\t\ti: number,\n\t\t\tid: string,\n\t\t\tindex: number,\n\t\t\tj: number,\n\t\t\tk: number,\n\t\t\tlen: number,\n\t\t\tref: number,\n\t\t\tref1: Statement[];\n\t\tif (\n\t\t\t(field.expression as Variable).identifier === \"keyboard\" ||\n\t\t\t(field.expression as Variable).identifier === \"gamepad\"\n\t\t) {\n\t\t\tfield.nowarning = true;\n\t\t}\n\t\tc = field.chain[field.chain.length - 1];\n\t\tif (c instanceof Value && c.value === \"type\") {\n\t\t\tif (field.chain.length === 1) {\n\t\t\t\tif (field.expression instanceof Variable) {\n\t\t\t\t\t// variable.type\n\t\t\t\t\tid = field.expression.identifier;\n\t\t\t\t\tif (this.locals.get(id) != null) {\n\t\t\t\t\t\tindex = this.locals.get(id)!;\n\t\t\t\t\t\tthis.routine.LOAD_LOCAL(index, field);\n\t\t\t\t\t\tthis.routine.TYPE(field);\n\t\t\t\t\t} else if (Compiler.predefined_values[id] != null) {\n\t\t\t\t\t\tthis.routine.LOAD_VALUE(\"number\", field);\n\t\t\t\t\t} else if (Compiler.predefined_unary_functions[id] != null || Compiler.predefined_binary_functions[id]) {\n\t\t\t\t\t\tthis.routine.LOAD_VALUE(\"function\", field);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.routine.VARIABLE_TYPE(id, field.expression);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.compile(field.expression);\n\t\t\t\t\tthis.routine.TYPE(field);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.compile(field.expression);\n\t\t\t\tfor (i = j = 0, ref = field.chain.length - 3; j <= ref; i = j += 1) {\n\t\t\t\t\tthis.compile(field.chain[i]);\n\t\t\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t\t\t}\n\t\t\t\tthis.compile(field.chain[field.chain.length - 2]);\n\t\t\t\tthis.routine.PROPERTY_TYPE(field.expression);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.compile(field.expression);\n\t\t\tref1 = field.chain;\n\t\t\tfor (k = 0, len = ref1.length; k < len; k++) {\n\t\t\t\tc = ref1[k];\n\t\t\t\tthis.compile(c);\n\t\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t\t}\n\t\t}\n\t}\n\n\tcompileFieldParent(field: Field): void {\n\t\tvar c: Statement, i: number, j: number, ref: number;\n\t\tthis.compile(field.expression);\n\t\tfor (i = j = 0, ref = field.chain.length - 2; j <= ref; i = j += 1) {\n\t\t\tc = field.chain[i];\n\t\t\tthis.compile(c);\n\t\t\tthis.routine.LOAD_PROPERTY(field);\n\t\t}\n\t}\n\n\tcompileFunctionCall(call: FunctionCall): void {\n\t\tvar a, funk, i, index, j, k, l, len, len1, len2, len3, len4, m, n, ref, ref1, ref2, ref3, ref4;\n\t\tif (call.expression instanceof Field) {\n\t\t\tref = call.args;\n\t\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\t\ta = ref[i];\n\t\t\t\tthis.compile(a);\n\t\t\t}\n\t\t\tthis.compileFieldParent(call.expression as Field);\n\t\t\tthis.compile((call.expression as Field).chain[(call.expression as Field).chain.length - 1]);\n\t\t\tthis.routine.FUNCTION_APPLY_PROPERTY(call.args.length, call);\n\t\t} else if (call.expression instanceof Variable) {\n\t\t\tif (Compiler.predefined_unary_functions[(call.expression as Variable).identifier] != null) {\n\t\t\t\tfunk = Compiler.predefined_unary_functions[(call.expression as Variable).identifier];\n\t\t\t\tif (call.args.length > 0) {\n\t\t\t\t\tthis.compile(call.args[0]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tthis.routine.UNARY_OP(funk, call);\n\t\t\t} else if (Compiler.predefined_binary_functions[(call.expression as Variable).identifier] != null) {\n\t\t\t\tfunk = Compiler.predefined_binary_functions[(call.expression as Variable).identifier];\n\t\t\t\tif (call.args.length > 0) {\n\t\t\t\t\tthis.compile(call.args[0]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tif (call.args.length > 1) {\n\t\t\t\t\tthis.compile(call.args[1]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.LOAD_VALUE(0, call);\n\t\t\t\t}\n\t\t\t\tthis.routine.BINARY_OP(funk, call);\n\t\t\t} else if ((call.expression as Variable).identifier === \"super\") {\n\t\t\t\tref1 = call.args;\n\t\t\t\tfor (i = k = 0, len1 = ref1.length; k < len1; i = ++k) {\n\t\t\t\t\ta = ref1[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tthis.routine.SUPER_CALL(call.args.length, call);\n\t\t\t} else if (this.locals.get((call.expression as Variable).identifier) != null) {\n\t\t\t\tref2 = call.args;\n\t\t\t\tfor (i = l = 0, len2 = ref2.length; l < len2; i = ++l) {\n\t\t\t\t\ta = ref2[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tindex = this.locals.get((call.expression as Variable).identifier)!;\n\t\t\t\tthis.routine.LOAD_LOCAL(index, call);\n\t\t\t\tthis.routine.FUNCTION_CALL(call.args.length, call);\n\t\t\t} else {\n\t\t\t\tref3 = call.args;\n\t\t\t\tfor (i = m = 0, len3 = ref3.length; m < len3; i = ++m) {\n\t\t\t\t\ta = ref3[i];\n\t\t\t\t\tthis.compile(a);\n\t\t\t\t}\n\t\t\t\tthis.routine.LOAD_VALUE((call.expression as Variable).identifier, call);\n\t\t\t\tthis.routine.FUNCTION_APPLY_VARIABLE(call.args.length, call);\n\t\t\t}\n\t\t} else {\n\t\t\tref4 = call.args;\n\t\t\tfor (n = 0, len4 = ref4.length; n < len4; n++) {\n\t\t\t\ta = ref4[n];\n\t\t\t\tthis.compile(a);\n\t\t\t}\n\t\t\tthis.compile(call.expression);\n\t\t\tthis.routine.FUNCTION_CALL(call.args.length, call);\n\t\t}\n\t}\n\n\t/**\n\t * Compile 'for' loop\n\t *\n\t * Generates bytecode for numeric range loops.\n\t * Structure:\n\t * 1. Initialize iterator and bounds\n\t * 2. Loop start label\n\t * 3. Check condition (jump to end if false)\n\t * 4. Execute body\n\t * 5. Increment iterator\n\t * 6. Jump to start\n\t *\n\t * @param {For} forloop - The for loop AST node\n\t */\n\tcompileFor(forloop: For): void {\n\t\t// OPTIMIZATION: Loop Unrolling\n\t\t// If the loop has constant bounds and is small (≤ 5 iterations), unroll it\n\t\tif (\n\t\t\tforloop.range_from instanceof Value &&\n\t\t\tforloop.range_from.type === Value.TYPE_NUMBER &&\n\t\t\tforloop.range_to instanceof Value &&\n\t\t\tforloop.range_to.type === Value.TYPE_NUMBER &&\n\t\t\t(forloop.range_by == null || (forloop.range_by instanceof Value && forloop.range_by.type === Value.TYPE_NUMBER))\n\t\t) {\n\t\t\tconst from = forloop.range_from.value as number;\n\t\t\tconst to = forloop.range_to.value as number;\n\t\t\tconst step = forloop.range_by instanceof Value ? (forloop.range_by.value as number) : 1;\n\n\t\t\t// Calculate iteration count\n\t\t\tlet iterations = 0;\n\t\t\tif (step > 0 && to >= from) {\n\t\t\t\titerations = Math.floor((to - from) / step) + 1;\n\t\t\t} else if (step < 0 && to <= from) {\n\t\t\t\titerations = Math.floor((from - to) / Math.abs(step)) + 1;\n\t\t\t}\n\n\t\t\t// Only unroll if iterations are small (≤ 5)\n\t\t\tif (iterations > 0 && iterations <= 5) {\n\t\t\t\tconst iterator = this.locals.register(forloop.iterator);\n\t\t\t\tthis.locals.push();\n\n\t\t\t\tfor (let i = 0; i < iterations; i++) {\n\t\t\t\t\tconst iterValue = from + i * step;\n\t\t\t\t\t// Set iterator value\n\t\t\t\t\tthis.routine.LOAD_VALUE(iterValue, forloop);\n\t\t\t\t\tthis.routine.STORE_LOCAL(iterator, forloop);\n\t\t\t\t\tthis.routine.POP(forloop);\n\n\t\t\t\t\t// Compile loop body\n\t\t\t\t\tthis.compileSequence(forloop.sequence);\n\t\t\t\t}\n\n\t\t\t\tthis.locals.pop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Standard loop compilation (not unrolled)\n\t\tvar for_continue: string,\n\t\t\tfor_end: string,\n\t\t\tfor_start: string,\n\t\t\titerator: number,\n\t\t\tsave_break: string | null,\n\t\t\tsave_continue: string | null;\n\t\titerator = this.locals.register(forloop.iterator);\n\t\tthis.locals.allocate(); // range_to\n\t\tthis.locals.allocate(); // step\n\t\tthis.compile(forloop.range_from);\n\t\tthis.routine.STORE_LOCAL(iterator, forloop);\n\t\tthis.routine.POP(forloop);\n\t\tthis.compile(forloop.range_to);\n\t\tif (forloop.range_by != null) {\n\t\t\tthis.compile(forloop.range_by);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, forloop);\n\t\t}\n\t\tfor_start = this.routine.createLabel(\"for_start\");\n\t\tfor_continue = this.routine.createLabel(\"for_continue\");\n\t\tfor_end = this.routine.createLabel(\"for_end\");\n\t\tthis.routine.FORLOOP_INIT([iterator, for_end], forloop);\n\t\tthis.routine.setLabel(for_start);\n\t\tthis.locals.push();\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = for_end;\n\t\tthis.continue_label = for_continue;\n\t\tthis.compileSequence(forloop.sequence);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(for_continue);\n\t\tthis.routine.FORLOOP_CONTROL([iterator, for_start], forloop);\n\t\tthis.routine.setLabel(for_end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileForIn(forloop: ForIn): void {\n\t\tvar for_continue: string,\n\t\t\tfor_end: string,\n\t\t\tfor_start: string,\n\t\t\titerator: number,\n\t\t\tsave_break: string | null,\n\t\t\tsave_continue: string | null;\n\t\titerator = this.locals.register(forloop.iterator);\n\t\tthis.locals.allocate(); // array\n\t\tthis.locals.allocate(); // index\n\t\tthis.compile(forloop.list);\n\t\tfor_start = this.routine.createLabel(\"for_start\");\n\t\tfor_continue = this.routine.createLabel(\"for_continue\");\n\t\tfor_end = this.routine.createLabel(\"for_end\");\n\t\tthis.routine.FORIN_INIT([iterator, for_end], forloop);\n\t\tthis.routine.setLabel(for_start);\n\t\tthis.locals.push();\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = for_end;\n\t\tthis.continue_label = for_continue;\n\t\tthis.compileSequence(forloop.sequence);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(for_continue);\n\t\tthis.routine.FORIN_CONTROL([iterator, for_start], forloop);\n\t\tthis.routine.setLabel(for_end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileSequence(sequence: Statement[]): void {\n\t\tvar i: number, j: number, ref: number;\n\t\tfor (i = j = 0, ref = sequence.length - 1; j <= ref; i = j += 1) {\n\t\t\tif (!sequence[i].nopop) {\n\t\t\t\tthis.routine.POP(sequence[i]);\n\t\t\t}\n\t\t\tthis.compile(sequence[i]);\n\n\t\t\t// OPTIMIZATION: Dead Code Elimination\n\t\t\t// Stop compiling after return, break, or continue statements\n\t\t\tif (sequence[i] instanceof Return || sequence[i] instanceof Break || sequence[i] instanceof Continue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Compile 'while' loop\n\t *\n\t * Generates bytecode for condition-based loops.\n\t * Manages break/continue labels for control flow within the loop.\n\t *\n\t * @param {While} whiloop - The while loop AST node\n\t */\n\tcompileWhile(whiloop: While): void {\n\t\tvar end: string, save_break: string | null, save_continue: string | null, start: string;\n\t\tthis.locals.push();\n\t\tstart = this.routine.createLabel(\"while_start\");\n\t\tend = this.routine.createLabel(\"while_end\");\n\t\tthis.routine.LOAD_VALUE(0, whiloop);\n\t\tthis.routine.setLabel(start);\n\t\tthis.compile(whiloop.condition);\n\t\tthis.routine.JUMPN(end);\n\t\tsave_break = this.break_label;\n\t\tsave_continue = this.continue_label;\n\t\tthis.break_label = end;\n\t\tthis.continue_label = start;\n\t\tthis.compileSequence(whiloop.sequence);\n\t\tthis.routine.JUMP(start, whiloop);\n\t\tthis.break_label = save_break;\n\t\tthis.continue_label = save_continue;\n\t\tthis.routine.setLabel(end);\n\t\tthis.locals.pop();\n\t}\n\n\tcompileBreak(statement: Break): void {\n\t\tif (this.break_label != null) {\n\t\t\tthis.routine.JUMP(this.break_label, statement);\n\t\t}\n\t}\n\n\tcompileContinue(statement: Continue): void {\n\t\tif (this.continue_label != null) {\n\t\t\tthis.routine.JUMP(this.continue_label, statement);\n\t\t}\n\t}\n\n\tcompileFunction(func: Function): void {\n\t\tvar r: Routine;\n\t\tr = this.compileFunctionBody(func);\n\t\tthis.routine.LOAD_ROUTINE(r, func);\n\t}\n\n\tcompileFunctionBody(func: Function | After | Every | Do): Routine {\n\t\t// Type guard to check if func has args property (only Function has it)\n\t\tconst hasArgs = \"args\" in func && func.args != null;\n\t\tvar a: any,\n\t\t\targs: number,\n\t\t\ti: number,\n\t\t\tindex: number,\n\t\t\tj: number,\n\t\t\tk: number,\n\t\t\tl: number,\n\t\t\tlabel: string,\n\t\t\tlen: number,\n\t\t\tlocals: Locals,\n\t\t\tm: number,\n\t\t\tnumargs: number,\n\t\t\tr: Routine,\n\t\t\t// ref: number, // unused\n\t\t\tref1: number,\n\t\t\tref2: number,\n\t\t\tref3: any[],\n\t\t\troutine: Routine;\n\t\troutine = this.routine;\n\t\tlocals = this.locals;\n\t\tthis.routine = new Routine(hasArgs ? (func as Function).args.length : 0);\n\t\tthis.locals = new Locals(this, locals);\n\t\t// local_index = this.locals.index; // unused\n\t\tthis.routine.uses_arguments = true;\n\t\tif (hasArgs) {\n\t\t\tconst funcArgs = (func as Function).args;\n\t\t\tif (this.routine.uses_arguments) {\n\t\t\t\targs = this.locals.register(\"arguments\");\n\t\t\t\tthis.routine.STORE_LOCAL(args, func);\n\t\t\t\tthis.routine.POP(func);\n\t\t\t}\n\t\t\tnumargs = this.locals.register(\"+numargs\");\n\t\t\tthis.routine.STORE_LOCAL(numargs, func);\n\t\t\tthis.routine.POP(func);\n\t\t\tfor (i = j = ref1 = funcArgs.length - 1; j >= 0; i = j += -1) {\n\t\t\t\ta = funcArgs[i];\n\t\t\t\tindex = this.locals.register(a.name);\n\t\t\t\tthis.routine.STORE_LOCAL(index, func);\n\t\t\t\tthis.routine.POP(func);\n\t\t\t}\n\t\t\tfor (i = k = 0, ref1 = funcArgs.length - 1; k <= ref1; i = k += 1) {\n\t\t\t\ta = funcArgs[i];\n\t\t\t\tif (a.default != null) {\n\t\t\t\t\tindex = this.locals.get(a.name)!;\n\t\t\t\t\tlabel = this.routine.createLabel(\"default_arg\");\n\t\t\t\t\tthis.routine.LOAD_VALUE(i, func);\n\t\t\t\t\tthis.routine.LOAD_LOCAL(numargs, func);\n\t\t\t\t\tthis.routine.LT(func);\n\t\t\t\t\tthis.routine.JUMPY(label, func);\n\t\t\t\t\tthis.compile(a.default);\n\t\t\t\t\tthis.routine.STORE_LOCAL(index, func);\n\t\t\t\t\tthis.routine.POP(func);\n\t\t\t\t\tthis.routine.setLabel(label);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (func.sequence.length > 0) {\n\t\t\tfor (i = l = 0, ref2 = func.sequence.length - 1; l <= ref2; i = l += 1) {\n\t\t\t\tthis.compile(func.sequence[i]);\n\t\t\t\tif (i < func.sequence.length - 1) {\n\t\t\t\t\tthis.routine.POP(func.sequence[i]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.routine.RETURN(func.sequence[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, func);\n\t\t\tthis.routine.RETURN(func);\n\t\t}\n\t\tif (hasArgs && !this.locals.arguments_used) {\n\t\t\tthis.routine.uses_arguments = false;\n\t\t\tthis.routine.remove(0);\n\t\t\tthis.routine.remove(0);\n\t\t}\n\t\tindex = 0;\n\t\tref3 = this.locals.imports;\n\t\tfor (m = 0, len = ref3.length; m < len; m++) {\n\t\t\tconst imp = ref3[m];\n\t\t\tthis.routine.OP_INSERT(OPCODES.LOAD_IMPORT, func, index, index * 3);\n\t\t\tthis.routine.OP_INSERT(OPCODES.STORE_LOCAL, func, imp.index, index * 3 + 1);\n\t\t\tthis.routine.OP_INSERT(OPCODES.POP, func, 0, index * 3 + 2);\n\t\t\tthis.routine.import_refs.push(imp.source);\n\t\t\tindex += 1;\n\t\t}\n\t\tthis.routine.optimize();\n\t\tthis.routine.resolveLabels();\n\t\t// Store source text for hot reload change detection\n\t\tthis.routine.source = (func as any).source;\n\t\tthis.count += this.routine.opcodes.length;\n\t\tr = this.routine;\n\t\t// console.info r.toString()\n\t\tthis.routine.locals_size = this.locals.max_index;\n\t\tthis.routine = routine;\n\t\tthis.locals = locals;\n\t\treturn r;\n\t}\n\n\tcompileReturn(ret: Return): void {\n\t\tif (ret.expression != null) {\n\t\t\tthis.compile(ret.expression);\n\t\t\tthis.routine.RETURN(ret);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, ret);\n\t\t\tthis.routine.RETURN(ret);\n\t\t}\n\t}\n\n\tcompileCondition(condition: Condition): void {\n\t\tvar c, chain, condition_end, condition_next, i, j, ref;\n\t\tchain = condition.chain;\n\t\tthis.routine.LOAD_VALUE(0, condition);\n\t\tcondition_end = this.routine.createLabel(\"condition_end\");\n\t\tfor (i = j = 0, ref = chain.length - 1; j <= ref; i = j += 1) {\n\t\t\tcondition_next = this.routine.createLabel(\"condition_next\");\n\t\t\tc = chain[i];\n\t\t\tc.condition.nowarning = true;\n\t\t\tthis.compile(c.condition);\n\t\t\tthis.routine.JUMPN(condition_next);\n\t\t\tthis.locals.push();\n\t\t\tthis.compileSequence(c.sequence);\n\t\t\tthis.locals.pop();\n\t\t\tthis.routine.JUMP(condition_end, condition);\n\t\t\tthis.routine.setLabel(condition_next);\n\t\t\tif (i === chain.length - 1 && c.else != null) {\n\t\t\t\tthis.locals.push();\n\t\t\t\tthis.compileSequence(c.else);\n\t\t\t\tthis.locals.pop();\n\t\t\t}\n\t\t}\n\t\tthis.routine.setLabel(condition_end);\n\t}\n\n\tformatField(field: string | number): string {\n\t\tif (field === \"constructor\") {\n\t\t\tfield = \"_constructor\";\n\t\t}\n\t\treturn String(field).replace(/\"/g, '\\\\\"');\n\t}\n\n\tcompileCreateObject(statement: CreateObject): void {\n\t\tlet f: {\n\t\t\t\tfield: string | number | null;\n\t\t\t\tvalue: Statement;\n\t\t\t},\n\t\t\tj: number,\n\t\t\tlen: number,\n\t\t\tref: Array<{\n\t\t\t\tfield: string | number | null;\n\t\t\t\tvalue: Statement;\n\t\t\t}>;\n\t\tthis.routine.CREATE_OBJECT(statement);\n\t\tref = statement.fields;\n\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\tf = ref[j];\n\t\t\tthis.routine.LOAD_VALUE(f.field, statement);\n\t\t\tthis.compile(f.value);\n\t\t\tthis.routine.CREATE_PROPERTY(statement);\n\t\t}\n\t}\n\n\tcompileCreateClass(statement: CreateClass): void {\n\t\tlet f: {\n\t\t\t\tfield: string | number;\n\t\t\t\tvalue: Statement;\n\t\t\t},\n\t\t\tj: number,\n\t\t\tlen: number,\n\t\t\tref: Array<{\n\t\t\t\tfield: string | number;\n\t\t\t\tvalue: Statement;\n\t\t\t}>,\n\t\t\tvariable: string | number;\n\t\tif (statement.ext != null) {\n\t\t\tstatement.ext.nowarning = true;\n\t\t\tthis.compile(statement.ext);\n\t\t} else {\n\t\t\tthis.routine.LOAD_VALUE(0, statement);\n\t\t}\n\t\tvariable = statement.ext != null && statement.ext instanceof Variable ? statement.ext.identifier : 0;\n\t\tthis.routine.CREATE_CLASS(variable, statement);\n\t\tref = statement.fields;\n\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\tf = ref[j];\n\t\t\tthis.routine.LOAD_VALUE(f.field, statement);\n\t\t\tthis.compile(f.value);\n\t\t\tthis.routine.CREATE_PROPERTY(statement);\n\t\t}\n\t}\n\n\tcompileUpdateClass(statement: CreateClass, variable: string): void {\n\t\tthis.compileCreateClass(statement);\n\t\tthis.routine.UPDATE_CLASS(variable, statement);\n\t}\n\n\tcompileNewCall(statement: NewCall): void {\n\t\tlet a: Statement, call: FunctionCall, i: number, j: number, len: number, ref: Statement[];\n\t\tcall = statement.expression as FunctionCall;\n\t\tthis.routine.LOAD_VALUE(0, statement); // reserve spot on stack for the class instance\n\t\tref = call.args;\n\t\tfor (i = j = 0, len = ref.length; j < len; i = ++j) {\n\t\t\ta = ref[i];\n\t\t\tthis.compile(a);\n\t\t}\n\t\tthis.compile(call.expression);\n\t\tthis.routine.NEW_CALL(call.args.length, statement);\n\t\tthis.routine.POP(statement); // pop return value of class constructor\n\t}\n\n\tcompileAfter(after: After): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(after);\n\t\tthis.routine.LOAD_ROUTINE(r, after);\n\t\tthis.compile(after.delay);\n\t\tif (after.multiplier != null && after.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(after.multiplier, after);\n\t\t\tthis.routine.MUL(after);\n\t\t}\n\t\tthis.routine.AFTER(after);\n\t}\n\n\tcompileEvery(every: Every): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(every);\n\t\tthis.routine.LOAD_ROUTINE(r, every);\n\t\tthis.compile(every.delay);\n\t\tif (every.multiplier != null && every.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(every.multiplier, every);\n\t\t\tthis.routine.MUL(every);\n\t\t}\n\t\tthis.routine.EVERY(every);\n\t}\n\n\tcompileDo(dostuff: Do): void {\n\t\tlet r: Routine;\n\t\tr = this.compileFunctionBody(dostuff);\n\t\tthis.routine.LOAD_ROUTINE(r, dostuff);\n\t\tthis.routine.DO(dostuff);\n\t}\n\n\tcompileSleep(sleep: Sleep): void {\n\t\tthis.compile(sleep.delay);\n\t\tif (sleep.multiplier != null && sleep.multiplier !== 1) {\n\t\t\tthis.routine.LOAD_VALUE(sleep.multiplier, sleep);\n\t\t\tthis.routine.MUL(sleep);\n\t\t}\n\t\tthis.routine.SLEEP(sleep);\n\t}\n\n\tcompileDelete(del: Delete): void {\n\t\tlet chain: Statement[], i: number, j: number, ref: number;\n\t\tif (del.field instanceof Variable) {\n\t\t\tthis.routine.LOAD_THIS(del);\n\t\t\tthis.routine.LOAD_VALUE(del.field.identifier, del);\n\t\t\tthis.routine.DELETE(del);\n\t\t} else if (del.field instanceof Field) {\n\t\t\tthis.compile(del.field.expression);\n\t\t\tchain = del.field.chain;\n\t\t\tfor (i = j = 0, ref = chain.length - 1; j <= ref; i = j += 1) {\n\t\t\t\tthis.compile(chain[i]);\n\t\t\t\tif (i < chain.length - 1) {\n\t\t\t\t\tthis.routine.LOAD_PROPERTY(del);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.routine.DELETE(del);\n\t\t} else {\n\t\t\tthrow \"Delete expects variable or field access\";\n\t\t}\n\t}\n\n\texec(context: any): any {\n\t\tif (!this.processor) {\n\t\t\tthis.processor = new Processor(null as any);\n\t\t}\n\t\tif (!this.routine) {\n\t\t\tthrow new Error(\"No routine to execute\");\n\t\t}\n\t\tthis.processor!.load(this.routine);\n\t\treturn this.processor!.run(context);\n\t}\n\n\tstatic predefined_unary_functions: Record<string, (x: any) => number> = {\n\t\tround: Math.round,\n\t\tfloor: Math.floor,\n\t\tceil: Math.ceil,\n\t\tabs: Math.abs,\n\t\tsqrt: Math.sqrt,\n\t\tsin: Math.sin,\n\t\tcos: Math.cos,\n\t\ttan: Math.tan,\n\t\tacos: Math.acos,\n\t\tasin: Math.asin,\n\t\tatan: Math.atan,\n\t\tsind: (x: number) => Math.sin((x * Math.PI) / 180),\n\t\tcosd: (x: number) => Math.cos((x * Math.PI) / 180),\n\t\ttand: (x: number) => Math.tan((x * Math.PI) / 180),\n\t\tasind: (x: number) => (Math.asin(x) / Math.PI) * 180,\n\t\tacosd: (x: number) => (Math.acos(x) / Math.PI) * 180,\n\t\tatand: (x: number) => (Math.atan(x) / Math.PI) * 180,\n\t\tlog: Math.log,\n\t\texp: Math.exp,\n\t};\n\n\tstatic predefined_binary_functions: Record<string, (a: any, b: any) => number> = {\n\t\tmin: Math.min,\n\t\tmax: Math.max,\n\t\tpow: Math.pow,\n\t\tatan2: Math.atan2,\n\t\tatan2d: (y: number, x: number) => (Math.atan2(y, x) / Math.PI) * 180,\n\t};\n\n\tstatic predefined_values: Record<string, number> = {\n\t\tPI: Math.PI,\n\t\ttrue: 1,\n\t\tfalse: 0,\n\t};\n}\n\n/**\n * Locals - Manages local variable scopes and allocations\n */\nexport class Locals {\n\tcompiler: Compiler;\n\tparent: Locals | null;\n\tlayers: LocalLayer[];\n\tindex: number;\n\tmax_index: number;\n\timports: Array<{\n\t\tname: string;\n\t\tindex: number;\n\t\tsource: number;\n\t}>;\n\targuments_used?: boolean;\n\n\tconstructor(compiler: Compiler, parent: Locals | null = null) {\n\t\tthis.compiler = compiler;\n\t\tthis.parent = parent;\n\t\tthis.layers = [];\n\t\tthis.index = 0;\n\t\tthis.max_index = 0;\n\t\tthis.imports = [];\n\t\tthis.push();\n\t}\n\n\tincrement(): number {\n\t\tconst spot = this.index++;\n\t\tthis.max_index = Math.max(this.index, this.max_index);\n\t\treturn spot;\n\t}\n\n\tpush(): number {\n\t\treturn this.layers.push(new LocalLayer(this));\n\t}\n\n\tpop(): LocalLayer[] {\n\t\t// resetting the @index below was causing erasure of outer locals\n\t\t// when used after the block ; such reset is not needed\n\t\t//@index = @layers[@layers.length-1].start_index\n\t\treturn this.layers.splice(this.layers.length - 1, 1);\n\t}\n\n\tregister(name: string): number {\n\t\treturn this.layers[this.layers.length - 1].register(name);\n\t}\n\n\tallocate(): number {\n\t\treturn this.layers[this.layers.length - 1].allocate();\n\t}\n\n\tget(name: string): number | null {\n\t\tlet i: number, index: number, j: number, v: number | null;\n\t\tif (name === \"arguments\") {\n\t\t\tthis.arguments_used = true;\n\t\t}\n\t\tfor (i = j = this.layers.length - 1; j >= 0; i = j -= 1) {\n\t\t\tv = this.layers[i].get(name);\n\t\t\tif (v != null) {\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t\tif (this.parent != null) {\n\t\t\tv = this.parent.get(name);\n\t\t\tif (v != null) {\n\t\t\t\tindex = this.register(name);\n\t\t\t\tthis.imports.push({\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\tsource: v,\n\t\t\t\t});\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/**\n * LocalLayer - Represents a single scope layer for local variables\n */\nexport class LocalLayer {\n\tlocals: Locals;\n\tstart_index: number;\n\tregistered: Record<string, number>;\n\n\tconstructor(locals: Locals) {\n\t\tthis.locals = locals;\n\t\tthis.start_index = this.locals.index;\n\t\tthis.registered = {};\n\t}\n\n\tregister(name: string): number {\n\t\treturn (this.registered[name] = this.locals.increment());\n\t}\n\n\tallocate(): number {\n\t\treturn this.locals.increment();\n\t}\n\n\tget(name: string): number | null {\n\t\tif (this.registered[name] != null) {\n\t\t\treturn this.registered[name];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * Runner - Manages LootiScript execution lifecycle\n *\n * Handles multiple threads, scheduling, and global environment setup.\n */\n\nimport { JSONLib, ListLib, MathLib, StringLib } from \"@al8b/stdlib\";\n\nimport { Random } from \"../random\";\n\nimport { Compiler } from \"./compiler\";\nimport { Parser } from \"./parser\";\nimport { Processor } from \"./processor\";\nimport { VMProfiler } from \"./profiler\";\nimport { Program } from \"./program\";\nimport { Routine } from \"./routine\";\n\n/**\n * L8BVM context interface\n */\ninterface L8BVMContext {\n\tglobal: Record<string, any>;\n\tmeta: {\n\t\tprint: (text: string) => void;\n\t};\n\twarnings: {\n\t\tusing_undefined_variable: Record<string, any>;\n\t\tassigning_field_to_undefined: Record<string, any>;\n\t\tinvoking_non_function: Record<string, any>;\n\t\tassigning_api_variable: Record<string, any>;\n\t\tassignment_as_condition: Record<string, any>;\n\t};\n\tlocation?: any;\n}\n\n/**\n * L8BVM interface\n */\ninterface L8BVM {\n\tcontext: L8BVMContext;\n}\n\n/**\n * Thread interface\n */\nexport interface ThreadInterface {\n\tpause: () => number;\n\tresume: () => number;\n\tstop: () => number;\n\tstatus: \"running\" | \"paused\" | \"stopped\";\n}\n\n/**\n * Thread - Execution thread for LootiScript\n */\nexport class Thread {\n\trunner: Runner;\n\tloop: boolean;\n\tprocessor: Processor;\n\tpaused: boolean;\n\tterminated: boolean;\n\tnext_calls: (string | Routine)[];\n\tinterface: ThreadInterface;\n\troutine?: Routine;\n\tstart_time?: number;\n\tdelay?: number;\n\trepeat?: boolean;\n\tsleep_until?: number;\n\n\tconstructor(runner: Runner) {\n\t\tthis.runner = runner;\n\t\tthis.loop = false;\n\t\tthis.processor = new Processor(this.runner);\n\t\tthis.paused = false;\n\t\tthis.terminated = false;\n\t\tthis.next_calls = [];\n\t\tthis.interface = {\n\t\t\tpause: () => {\n\t\t\t\treturn this.pause();\n\t\t\t},\n\t\t\tresume: () => {\n\t\t\t\treturn this.resume();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\treturn this.stop();\n\t\t\t},\n\t\t\tstatus: \"running\",\n\t\t};\n\t}\n\n\taddCall(call: string | Routine): void {\n\t\tif (this.next_calls.indexOf(call) < 0) {\n\t\t\tthis.next_calls.push(call);\n\t\t}\n\t}\n\n\tloadNext(): boolean {\n\t\tlet compiler: Compiler;\n\t\tlet f: string | Routine;\n\t\tlet parser: Parser;\n\t\tlet program: Program;\n\t\tif (this.next_calls.length > 0) {\n\t\t\tf = this.next_calls.splice(0, 1)[0];\n\t\t\tif (f instanceof Routine) {\n\t\t\t\tthis.processor.load(f);\n\t\t\t} else {\n\t\t\t\tparser = new Parser(f, \"\");\n\t\t\t\tparser.parse();\n\t\t\t\tprogram = parser.program;\n\t\t\t\tcompiler = new Compiler(program);\n\t\t\t\tthis.processor.load(compiler.routine);\n\t\t\t\tif ((f === \"update()\" || f === \"serverUpdate()\") && (this.runner as any).updateControls != null) {\n\t\t\t\t\t(this.runner as any).updateControls();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpause(): number {\n\t\tif (this.interface.status === \"running\") {\n\t\t\tthis.interface.status = \"paused\";\n\t\t\tthis.paused = true;\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tresume(): number {\n\t\tif (this.interface.status === \"paused\") {\n\t\t\tthis.interface.status = \"running\";\n\t\t\tthis.paused = false;\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tstop(): number {\n\t\tthis.interface.status = \"stopped\";\n\t\tthis.terminated = true;\n\t\treturn 1;\n\t}\n}\n\n/**\n * Runner - Manages LootiScript execution lifecycle\n *\n * Handles multiple threads, scheduling, and global environment setup.\n */\nexport class Runner {\n\tl8bvm: L8BVM;\n\tinitialized: boolean;\n\tsystem: any;\n\tmain_thread!: Thread;\n\tthreads: Thread[];\n\tcurrent_thread: Thread | null;\n\tthread_index: number;\n\tfps: number;\n\tfps_max: number;\n\tcpu_load: number;\n\ttriggers_controls_update: boolean;\n\tupdateControls?: () => void;\n\tonNativeError: ((error: unknown) => void) | null;\n\tprofiler: VMProfiler;\n\n\tconstructor(l8bvm: L8BVM) {\n\t\tthis.l8bvm = l8bvm;\n\t\tthis.initialized = false;\n\t\tthis.threads = [];\n\t\tthis.current_thread = null;\n\t\tthis.thread_index = 0;\n\t\tthis.fps = 60;\n\t\tthis.fps_max = 60;\n\t\tthis.cpu_load = 0;\n\t\tthis.triggers_controls_update = false;\n\t\tthis.onNativeError = null;\n\t\t// Main thread and profiler are initialized lazily in init()\n\t\t// to ensure proper dependency setup with L8BVM context\n\t\tthis.profiler = new VMProfiler(null as any);\n\t}\n\n\treportNativeError(error: unknown): void {\n\t\tif (this.onNativeError) {\n\t\t\tthis.onNativeError(error);\n\t\t} else {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\tinit(): boolean {\n\t\tthis.initialized = true;\n\t\t// Initialize system object if not provided by runtime\n\t\t// This object exposes VM state and controls to LootiScript code\n\t\tif (!this.l8bvm.context.global.system) {\n\t\t\tthis.l8bvm.context.global.system = {};\n\t\t}\n\t\tthis.system = this.l8bvm.context.global.system;\n\t\tthis.system.preemptive = 1;\n\t\tthis.system.threads = [];\n\t\tthis.main_thread = new Thread(this);\n\t\tthis.threads = [this.main_thread];\n\t\tthis.current_thread = this.main_thread;\n\t\tthis.thread_index = 0;\n\n\t\t// Initialize profiler with main thread processor for performance monitoring\n\t\tthis.profiler = new VMProfiler(this.main_thread.processor);\n\n\t\t// Expose profiler API to system object for LootiScript code access\n\t\tthis.system.profiler = {\n\t\t\tstart: () => {\n\t\t\t\tthis.main_thread.processor.profilingEnabled = true;\n\t\t\t\tthis.profiler.start();\n\t\t\t},\n\t\t\tstop: () => {\n\t\t\t\tthis.main_thread.processor.profilingEnabled = false;\n\t\t\t\treturn this.profiler.stop();\n\t\t\t},\n\t\t\tgetMetrics: () => this.profiler.getAverageMetrics(),\n\t\t};\n\n\t\tthis.l8bvm.context.global.print = this.l8bvm.context.meta.print;\n\t\tthis.l8bvm.context.global.random = new Random(0);\n\t\tthis.l8bvm.context.global.Function = {\n\t\t\tbind: function (this: any, obj: any) {\n\t\t\t\tlet rc: Routine;\n\t\t\t\tif (this instanceof Routine) {\n\t\t\t\t\trc = this.clone();\n\t\t\t\t\t(rc as any).object = obj;\n\t\t\t\t\treturn rc;\n\t\t\t\t} else {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t},\n\t\t} as any;\n\t\t// Inject standard library into global scope for LootiScript code\n\t\t// Provides Math, JSON, List, and String utility functions\n\t\tthis.l8bvm.context.global.Math = MathLib;\n\t\tthis.l8bvm.context.global.JSON = JSONLib;\n\t\tthis.l8bvm.context.global.List = ListLib;\n\n\t\tthis.l8bvm.context.global.Function = {\n\t\t\tbind: (...args: any[]) => {\n\t\t\t\treturn args[0].bind.apply(args[0], args.slice(1));\n\t\t\t},\n\t\t} as any;\n\t\t// Extend String with stdlib utilities for LootiScript\n\t\tthis.l8bvm.context.global.String = {\n\t\t\t...StringLib,\n\t\t\t// Override fromCharCode to use proper calling convention with variable arguments\n\t\t\tfromCharCode: function () {\n\t\t\t\treturn String.fromCharCode.apply(null, arguments as any);\n\t\t\t},\n\t\t};\n\n\t\tthis.l8bvm.context.global.Number = {\n\t\t\tparse: (str: string) => {\n\t\t\t\tconst res = Number.parseFloat(str);\n\t\t\t\treturn isFinite(res) ? res : 0;\n\t\t\t},\n\t\t\ttoString: function (this: number) {\n\t\t\t\treturn this.toString();\n\t\t\t},\n\t\t};\n\n\t\t// Initialize Object with default operator overloads for LootiScript\n\t\t// Enables operator syntax like obj1 + obj2, obj1 - obj2, etc.\n\t\tthis.l8bvm.context.global.Object = {\n\t\t\t\"+\": (a: any, b: any) => (a != null ? a + b : b),\n\t\t\t\"-\": (a: any, b: any) => a - b,\n\t\t\t\"*\": (a: any, b: any) => a * b,\n\t\t\t\"/\": (a: any, b: any) => a / b,\n\t\t\t\"%\": (a: any, b: any) => a % b,\n\t\t};\n\t\tthis.fps = 60;\n\t\tthis.fps_max = 60;\n\t\tthis.cpu_load = 0;\n\t\tthis.l8bvm.context.meta.print(\"LootiScript 1.0\");\n\t\treturn (this.triggers_controls_update = true);\n\t}\n\n\trun(src: string, filename: string = \"\", callback?: (result: string) => void): any {\n\t\tlet compiler: Compiler;\n\t\tlet err: any;\n\t\tlet id: string;\n\t\tlet j: number;\n\t\tlet len: number;\n\t\tlet parser: Parser;\n\t\tlet program: Program;\n\t\tlet ref: any[];\n\t\tlet result: any = null;\n\t\tlet w: any;\n\t\tif (!this.initialized) {\n\t\t\tthis.init();\n\t\t}\n\t\tparser = new Parser(src, filename);\n\t\tparser.parse();\n\t\tif ((parser as any).error_info != null) {\n\t\t\terr = (parser as any).error_info;\n\t\t\terr.type = \"compile\";\n\t\t\tthrow err;\n\t\t}\n\t\tif (parser.warnings.length > 0) {\n\t\t\tref = parser.warnings;\n\t\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\t\tw = ref[j];\n\t\t\t\tid = filename + \"-\" + w.line + \"-\" + w.column;\n\t\t\t\tswitch (w.type) {\n\t\t\t\t\tcase \"assigning_api_variable\":\n\t\t\t\t\t\tif (this.l8bvm.context.warnings.assigning_api_variable[id] == null) {\n\t\t\t\t\t\t\tthis.l8bvm.context.warnings.assigning_api_variable[id] = {\n\t\t\t\t\t\t\t\tfile: filename,\n\t\t\t\t\t\t\t\tline: w.line,\n\t\t\t\t\t\t\t\tcolumn: w.column,\n\t\t\t\t\t\t\t\texpression: w.identifier,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assignment_as_condition\":\n\t\t\t\t\t\tif (this.l8bvm.context.warnings.assignment_as_condition[id] == null) {\n\t\t\t\t\t\t\tthis.l8bvm.context.warnings.assignment_as_condition[id] = {\n\t\t\t\t\t\t\t\tfile: filename,\n\t\t\t\t\t\t\t\tline: w.line,\n\t\t\t\t\t\t\t\tcolumn: w.column,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprogram = parser.program;\n\t\tcompiler = new Compiler(program);\n\t\tresult = null;\n\t\t(compiler.routine as any).callback = (res: any) => {\n\t\t\tif (callback != null) {\n\t\t\t\treturn callback(Program.toString(res));\n\t\t\t} else {\n\t\t\t\treturn (result = res);\n\t\t\t}\n\t\t};\n\t\tthis.main_thread.addCall(compiler.routine);\n\t\tthis.tick();\n\t\treturn result;\n\t}\n\n\tcall(name: string, args?: any[]): any {\n\t\tlet f: (...args: any[]) => any;\n\t\tlet routine: any;\n\t\tif (name === \"draw\" || name === \"update\" || name === \"serverUpdate\") {\n\t\t\tif (this.l8bvm.context.global[name] != null) {\n\t\t\t\tthis.main_thread.addCall(`${name}()`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.l8bvm.context.global[name] != null) {\n\t\t\tif (args == null || !args.length) {\n\t\t\t\tthis.main_thread.addCall(`${name}()`);\n\t\t\t} else {\n\t\t\t\troutine = this.l8bvm.context.global[name];\n\t\t\t\tif (routine instanceof Routine) {\n\t\t\t\t\tf = this.main_thread.processor.routineAsFunction(routine, this.l8bvm.context) as any;\n\t\t\t\t\treturn f(...args);\n\t\t\t\t} else if (typeof routine === \"function\") {\n\t\t\t\t\treturn (routine as any)(...args);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\ttoString(obj: any): string {\n\t\treturn Program.toString(obj);\n\t}\n\n\t/**\n\t * Get the source text of a compiled function by name.\n\t *\n\t * Used by hot reload to detect when init() has changed and needs re-execution.\n\t * Returns undefined if the function doesn't exist in the global scope.\n\t */\n\tgetFunctionSource(name: string): string | undefined {\n\t\tconst fn = this.l8bvm.context.global[name];\n\t\tif (fn instanceof Routine) {\n\t\t\treturn fn.source;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprocess(thread: Thread, time_limit: number): any {\n\t\tlet processor: Processor;\n\t\tprocessor = thread.processor;\n\t\tprocessor.time_limit = time_limit;\n\t\tthis.current_thread = thread;\n\t\treturn processor.run(this.l8bvm.context);\n\t}\n\n\ttick(): void {\n\t\tlet dt: number;\n\t\tlet i: number;\n\t\tlet index: number;\n\t\tlet j: number;\n\t\tlet len: number;\n\t\tlet load: number;\n\t\tlet margin: number;\n\t\tlet processing: boolean;\n\t\tlet processor: Processor;\n\t\tlet ref: Thread[];\n\t\tlet t: Thread;\n\t\tlet time: number;\n\t\tlet time_limit: number;\n\t\tlet time_out: number;\n\t\tif (this.system.fps != null) {\n\t\t\tthis.fps = this.fps * 0.9 + this.system.fps * 0.1;\n\t\t}\n\t\tthis.fps_max = Math.max(this.fps, this.fps_max);\n\t\tif (this.fps < 59) {\n\t\t\tmargin = 10;\n\t\t} else {\n\t\t\tmargin = Math.floor((1000 / this.fps) * 0.8);\n\t\t}\n\t\ttime = performance.now();\n\t\t// Allocate 100ms time budget for main thread to prevent interrupting draw() mid-frame\n\t\t// This ensures smooth rendering even under heavy computational load\n\t\ttime_limit = time + 100;\n\t\ttime_out = this.system.preemptive ? time_limit : Infinity;\n\t\tprocessor = this.main_thread.processor;\n\t\tif (!processor.done) {\n\t\t\tif (this.main_thread.sleep_until != null) {\n\t\t\t\tif (performance.now() >= this.main_thread.sleep_until) {\n\t\t\t\t\tdelete this.main_thread.sleep_until;\n\t\t\t\t\tthis.process(this.main_thread, time_out);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.process(this.main_thread, time_out);\n\t\t\t}\n\t\t}\n\t\twhile (processor.done && performance.now() < time_out && this.main_thread.loadNext()) {\n\t\t\tthis.process(this.main_thread, time_out);\n\t\t}\n\t\t// Secondary threads receive remaining time budget after main thread completes\n\t\t// This prevents background tasks from impacting frame rate and ensures main thread priority\n\t\ttime_limit = time + margin;\n\t\ttime_out = this.system.preemptive ? time_limit : Infinity;\n\n\t\t// Record frame metrics in profiler for performance analysis\n\t\tif (this.main_thread.processor.profilingEnabled) {\n\t\t\tthis.profiler.frame();\n\t\t}\n\n\t\tprocessing = true;\n\t\twhile (processing) {\n\t\t\tprocessing = false;\n\t\t\tref = this.threads;\n\t\t\tfor (j = 0, len = ref.length; j < len; j++) {\n\t\t\t\tt = ref[j];\n\t\t\t\tif (t !== this.main_thread) {\n\t\t\t\t\tif (t.paused || t.terminated) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tprocessor = t.processor;\n\t\t\t\t\tif (!processor.done) {\n\t\t\t\t\t\tif (t.sleep_until != null) {\n\t\t\t\t\t\t\tif (performance.now() >= t.sleep_until) {\n\t\t\t\t\t\t\t\tdelete t.sleep_until;\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (t.start_time != null) {\n\t\t\t\t\t\tif (t.repeat) {\n\t\t\t\t\t\t\twhile (time >= t.start_time && !(t.paused || t.terminated)) {\n\t\t\t\t\t\t\t\tif (time >= t.start_time + 150) {\n\t\t\t\t\t\t\t\t\tt.start_time = time + (t.delay || 0);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tt.start_time += t.delay || 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprocessor.load(t.routine!);\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (time >= t.start_time) {\n\t\t\t\t\t\t\t\tdelete t.start_time;\n\t\t\t\t\t\t\t\tprocessor.load(t.routine!);\n\t\t\t\t\t\t\t\tthis.process(t, time_out);\n\t\t\t\t\t\t\t\tprocessing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt.terminated = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (performance.now() > time_limit) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Compact terminated threads using swap-and-pop (O(n) vs O(n^2) with splice)\n\t\tlet writeIdx = 1; // Preserve main thread at index 0\n\t\tfor (i = 1; i < this.threads.length; i++) {\n\t\t\tt = this.threads[i];\n\t\t\tif (t.terminated) {\n\t\t\t\tindex = this.system.threads.indexOf(t.interface);\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tconst last = this.system.threads.length - 1;\n\t\t\t\t\tif (index !== last) {\n\t\t\t\t\t\tthis.system.threads[index] = this.system.threads[last];\n\t\t\t\t\t}\n\t\t\t\t\tthis.system.threads.length--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.threads[writeIdx++] = this.threads[i];\n\t\t\t}\n\t\t}\n\t\tthis.threads.length = writeIdx;\n\t\t// Reuse variable for main thread reference to avoid allocation\n\t\tt = this.threads[0];\n\t\tdt = performance.now() - time;\n\t\tconst dt_limit = time_limit - time;\n\t\tload = (dt / dt_limit) * 100;\n\t\tthis.cpu_load = this.cpu_load * 0.9 + load * 0.1;\n\t\tthis.system.cpu_load = Math.min(100, Math.round(this.cpu_load));\n\t\treturn;\n\t}\n\n\tcreateThread(routine: Routine, delay: number, repeat: boolean): ThreadInterface {\n\t\tlet i: number;\n\t\tlet t: Thread;\n\t\tt = new Thread(this);\n\t\tt.routine = routine;\n\t\tthis.threads.push(t);\n\t\tt.start_time = performance.now() + delay - 1000 / this.fps;\n\t\tif (repeat) {\n\t\t\tt.repeat = repeat;\n\t\t\tt.delay = delay;\n\t\t}\n\t\tthis.system.threads.push(t.interface);\n\t\tfor (i = 0; i < (routine as any).import_values.length; i++) {\n\t\t\tif ((routine as any).import_values[i] === routine) {\n\t\t\t\t(routine as any).import_values[i] = t.interface;\n\t\t\t}\n\t\t}\n\t\treturn t.interface;\n\t}\n\n\tsleep(value: number): void {\n\t\tif (this.current_thread != null) {\n\t\t\tthis.current_thread.sleep_until = performance.now() + Math.max(0, value);\n\t\t}\n\t}\n}\n","import type { Processor } from \"./processor\";\n\nexport interface ProfilerMetrics {\n\tops: number;\n\ttime: number;\n\tallocations: number;\n\tframes: number;\n\tsamples: number;\n\topsPerSec: number;\n\tavgFrameTime: number;\n}\n\nconst MAX_SAMPLES = 100;\n\nexport class VMProfiler {\n\tprivate startTime: number = 0;\n\tprivate startOps: number = 0;\n\tprivate startAllocations: number = 0;\n\tprivate frameCount: number = 0;\n\tprivate sampleCount: number = 0;\n\tprivate processor: Processor;\n\n\t// Running totals for O(1) average computation\n\tprivate totalOps: number = 0;\n\tprivate totalTime: number = 0;\n\tprivate totalAllocations: number = 0;\n\tprivate totalFrames: number = 0;\n\tprivate totalOpsPerSec: number = 0;\n\tprivate totalAvgFrameTime: number = 0;\n\n\tconstructor(processor: Processor) {\n\t\tthis.processor = processor;\n\t}\n\n\tstart() {\n\t\tthis.startTime = performance.now();\n\t\tthis.startOps = (this.processor as any).metrics?.ops || 0;\n\t\tthis.startAllocations = (this.processor as any).metrics?.allocations || 0;\n\t\tthis.frameCount = 0;\n\t}\n\n\tstop(): ProfilerMetrics {\n\t\tconst endTime = performance.now();\n\t\tconst duration = endTime - this.startTime;\n\t\tconst currentOps = (this.processor as any).metrics?.ops || 0;\n\t\tconst currentAllocations = (this.processor as any).metrics?.allocations || 0;\n\t\tconst ops = currentOps - this.startOps;\n\t\tconst allocations = currentAllocations - this.startAllocations;\n\t\tconst opsPerSec = (ops / duration) * 1000;\n\t\tconst avgFrameTime = duration / (this.frameCount || 1);\n\n\t\tconst metrics: ProfilerMetrics = {\n\t\t\tops,\n\t\t\ttime: duration,\n\t\t\tallocations,\n\t\t\tframes: this.frameCount,\n\t\t\tsamples: this.sampleCount + 1,\n\t\t\topsPerSec,\n\t\t\tavgFrameTime,\n\t\t};\n\n\t\tif (this.sampleCount < MAX_SAMPLES) {\n\t\t\tthis.totalOps += ops;\n\t\t\tthis.totalTime += duration;\n\t\t\tthis.totalAllocations += allocations;\n\t\t\tthis.totalFrames += this.frameCount;\n\t\t\tthis.totalOpsPerSec += opsPerSec;\n\t\t\tthis.totalAvgFrameTime += avgFrameTime;\n\t\t\tthis.sampleCount++;\n\t\t}\n\n\t\treturn metrics;\n\t}\n\n\tframe() {\n\t\tthis.frameCount++;\n\t}\n\n\tgetAverageMetrics(): ProfilerMetrics {\n\t\tif (this.sampleCount === 0) {\n\t\t\treturn this.stop();\n\t\t}\n\n\t\treturn {\n\t\t\tops: this.totalOps / this.sampleCount,\n\t\t\ttime: this.totalTime / this.sampleCount,\n\t\t\tallocations: this.totalAllocations / this.sampleCount,\n\t\t\tframes: this.totalFrames / this.sampleCount,\n\t\t\tsamples: this.sampleCount,\n\t\t\topsPerSec: this.totalOpsPerSec / this.sampleCount,\n\t\t\tavgFrameTime: this.totalAvgFrameTime / this.sampleCount,\n\t\t};\n\t}\n\n\treset() {\n\t\tthis.sampleCount = 0;\n\t\tthis.totalOps = 0;\n\t\tthis.totalTime = 0;\n\t\tthis.totalAllocations = 0;\n\t\tthis.totalFrames = 0;\n\t\tthis.totalOpsPerSec = 0;\n\t\tthis.totalAvgFrameTime = 0;\n\t}\n}\n","/**\n * Transpiler - Transpiles bytecode to JavaScript for optimization\n *\n * Converts bytecode to optimized JavaScript for better performance.\n */\n\nimport { OPCODES, type Routine } from \"./routine\";\n\nfunction isDevelopmentMode(): boolean {\n\tconst runtime = globalThis as {\n\t\tprocess?: { env?: Record<string, string | undefined> };\n\t\tBun?: { env?: Record<string, string | undefined> };\n\t};\n\treturn runtime.process?.env?.NODE_ENV === \"development\" || runtime.Bun?.env?.NODE_ENV === \"development\";\n}\n\n/**\n * Stack - Internal stack tracking for transpiler\n */\nclass Stack {\n\tstack: string[];\n\tindex: number;\n\ttouched: Record<number, boolean>;\n\n\tconstructor() {\n\t\tthis.stack = [\"stack[stack_index]\"];\n\t\tthis.index = 0;\n\t\tthis.touched = {};\n\t}\n\n\tpush(value: string): boolean {\n\t\tthis.stack[++this.index] = value;\n\t\treturn (this.touched[this.index] = true);\n\t}\n\n\tpop(): string {\n\t\tlet res: string;\n\t\tif (this.index >= 0) {\n\t\t\tres = this.stack.splice(this.index, 1)[0];\n\t\t} else if (this.stack[this.index] != null) {\n\t\t\tres = this.stack[this.index];\n\t\t} else {\n\t\t\tres = \"stack[stack_index-\" + this.index + \"]\";\n\t\t}\n\t\tthis.index -= 1;\n\t\treturn res;\n\t}\n\n\tget(index: number = 0): string {\n\t\tlet i: number;\n\t\tif (index == null) {\n\t\t\tindex = 0;\n\t\t}\n\t\ti = this.index + index;\n\t\tif (i >= 0) {\n\t\t\treturn this.stack[i];\n\t\t} else if (this.stack[i] != null) {\n\t\t\treturn this.stack[i];\n\t\t} else {\n\t\t\treturn \"stack[stack_index-\" + -i + \"]\";\n\t\t}\n\t}\n}\n\n/**\n * Transpiler - Transpiles bytecode sequences to optimized JavaScript functions\n */\nexport class Transpiler {\n\tprivate vcount: number = 0;\n\tprivate stack?: Stack;\n\tprivate locals?: Record<number, string>;\n\tprivate variables?: Record<string, string>;\n\tprivate readonly opcodeHandlers: Record<string, (arg: any) => string | undefined>;\n\n\tconstructor() {\n\t\tthis.opcodeHandlers = {\n\t\t\tLOAD_VALUE: this.LOAD_VALUE.bind(this),\n\t\t\tLOAD_LOCAL: this.LOAD_LOCAL.bind(this),\n\t\t\tLOAD_LOCAL_OBJECT: this.LOAD_LOCAL_OBJECT.bind(this),\n\t\t\tSTORE_LOCAL: this.STORE_LOCAL.bind(this),\n\t\t\tPOP: this.POP.bind(this),\n\t\t\tCREATE_PROPERTY: this.CREATE_PROPERTY.bind(this),\n\t\t\tLOAD_PROPERTY: this.LOAD_PROPERTY.bind(this),\n\t\t\tLOAD_PROPERTY_ATOP: this.LOAD_PROPERTY_ATOP.bind(this),\n\t\t\tNEW_OBJECT: this.NEW_OBJECT.bind(this),\n\t\t\tNEW_ARRAY: this.NEW_ARRAY.bind(this),\n\t\t\tMAKE_OBJECT: this.MAKE_OBJECT.bind(this),\n\t\t\tSTORE_VARIABLE: this.STORE_VARIABLE.bind(this),\n\t\t\tSTORE_PROPERTY: this.STORE_PROPERTY.bind(this),\n\t\t};\n\t}\n\n\t/**\n\t * Transpile a routine to JavaScript\n\t */\n\ttranspile(r: Routine): void {\n\t\tfor (let i = 0; i < r.opcodes.length; i++) {\n\t\t\tconst op = OPCODES[r.opcodes[i] as keyof typeof OPCODES] as string;\n\t\t\tif (this.transpilable(op, r.arg1[i])) {\n\t\t\t\tlet j = i + 1;\n\t\t\t\twhile (\n\t\t\t\t\tj < r.opcodes.length &&\n\t\t\t\t\tr.removeable(j) &&\n\t\t\t\t\tthis.transpilable(OPCODES[r.opcodes[j] as keyof typeof OPCODES] as string, r.arg1[j])\n\t\t\t\t) {\n\t\t\t\t\tj += 1;\n\t\t\t\t}\n\t\t\t\tj -= 1;\n\t\t\t\tif (j - i >= 2) {\n\t\t\t\t\tthis.transpileSegment(r, i, j);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Transpile a segment of bytecode to JavaScript\n\t */\n\tprivate transpileSegment(r: Routine, i: number, j: number): void {\n\t\tlet comp: string | undefined;\n\t\tlet err: any;\n\t\tlet index: number | string;\n\t\tlet k: number;\n\t\tlet s: string;\n\t\tthis.vcount = 0;\n\t\tthis.stack = new Stack();\n\t\tthis.locals = {};\n\t\tthis.variables = {};\n\t\t// Body of the function\n\t\ts = \"\";\n\t\tfor (k = i; k <= j; k++) {\n\t\t\tconst op = OPCODES[r.opcodes[k] as keyof typeof OPCODES] as string;\n\t\t\tconst handler = this.opcodeHandlers[op];\n\t\t\tif (handler) {\n\t\t\t\tcomp = handler(r.arg1[k]);\n\t\t\t} else {\n\t\t\t\tcomp = undefined;\n\t\t\t}\n\t\t\tif (comp) {\n\t\t\t\ts += comp + \"\\n\";\n\t\t\t}\n\t\t}\n\t\tfor (index in this.stack!.touched) {\n\t\t\tif (this.stack!.touched[index as any]) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tif (idx < 0) {\n\t\t\t\t\ts += \"stack[stack_index-\" + Math.abs(idx) + \"] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t} else if (idx > 0) {\n\t\t\t\t\ts += \"stack[stack_index+\" + index + \"] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t} else {\n\t\t\t\t\ts += \"stack[stack_index] = \" + this.stack!.stack[idx] + \" ;\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.stack!.index < 0) {\n\t\t\ts += \"stack_index -= \" + Math.abs(this.stack!.index) + \" ;\\n\";\n\t\t} else if (this.stack!.index > 0) {\n\t\t\ts += \"stack_index += \" + this.stack!.index + \" ;\\n\";\n\t\t}\n\t\ts += \"return stack_index ;\\n\";\n\n\t\tif (isDevelopmentMode()) {\n\t\t\tconsole.info(\"Transpiled body:\\n\" + s);\n\t\t}\n\n\t\ttry {\n\t\t\t// Use new Function instead of eval\n\t\t\tconst f = new Function(\"stack\", \"stack_index\", \"locals\", \"locals_offset\", \"object\", \"global\", s);\n\t\t\tr.opcodes[i] = OPCODES.COMPILED;\n\t\t\tr.arg1[i] = f;\n\t\t} catch (error) {\n\t\t\terr = error;\n\t\t\tconsole.error(\"Transpilation failed:\");\n\t\t\tconsole.error(s);\n\t\t\tconsole.error(err);\n\t\t}\n\n\t\tfor (k = i + 1; k <= j; k++) {\n\t\t\tr.remove(i + 1);\n\t\t}\n\t}\n\n\t/**\n\t * Create a new variable name\n\t */\n\tprivate createVariable(): string {\n\t\treturn \"v\" + this.vcount++;\n\t}\n\n\t/**\n\t * Check if an opcode is transpilable\n\t */\n\tprivate transpilable(op: string, arg: any): boolean {\n\t\tif (op === \"LOAD_VALUE\") {\n\t\t\treturn typeof arg === \"string\" || typeof arg === \"number\";\n\t\t} else {\n\t\t\treturn this.opcodeHandlers[op] != null;\n\t\t}\n\t}\n\n\t/**\n\t * Transpile LOAD_VALUE opcode\n\t * @internal Called dynamically via transpileSegment\n\t */\n\tprivate LOAD_VALUE(arg: any): string {\n\t\tif (typeof arg === \"string\") {\n\t\t\tthis.stack!.push(' \"' + arg.replace(/\"/g, '\\\\\"') + '\" ');\n\t\t} else if (typeof arg === \"number\") {\n\t\t\tthis.stack!.push(arg + \"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Transpile LOAD_LOCAL opcode\n\t */\n\tprivate LOAD_LOCAL(arg: number): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = locals[locals_offset+\" + arg + \"] ; // LOAD_LOCAL\";\n\t}\n\n\t/**\n\t * Transpile LOAD_LOCAL_OBJECT opcode\n\t */\n\tprivate LOAD_LOCAL_OBJECT(arg: number): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tif (this.locals![arg] != null) {\n\t\t\tv = this.locals![arg];\n\t\t\tthis.stack!.push(v);\n\t\t\treturn \"if (typeof \" + v + ' != \"object\") { ' + v + \" = locals[locals_offset+\" + arg + \"] = {} } ;\";\n\t\t} else {\n\t\t\tv = this.createVariable();\n\t\t\tres =\n\t\t\t\t\"let \" +\n\t\t\t\tv +\n\t\t\t\t\" = locals[locals_offset+\" +\n\t\t\t\targ +\n\t\t\t\t\"] ;\\nif (typeof \" +\n\t\t\t\tv +\n\t\t\t\t' != \"object\") { ' +\n\t\t\t\tv +\n\t\t\t\t\" = locals[locals_offset+\" +\n\t\t\t\targ +\n\t\t\t\t\"] = {} } ;\";\n\t\t\tthis.stack!.push(v);\n\t\t\tthis.locals![arg] = v;\n\t\t\treturn res;\n\t\t}\n\t}\n\n\t/**\n\t * Transpile STORE_LOCAL opcode\n\t */\n\tprivate STORE_LOCAL(arg: number): string {\n\t\tconst v = this.stack!.get();\n\t\treturn \"locals[locals_offset+\" + arg + \"] = \" + v + \" ; // STORE_LOCAL\";\n\t}\n\n\t/**\n\t * Transpile POP opcode\n\t */\n\tprivate POP(): string {\n\t\tthis.stack!.pop();\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Transpile CREATE_PROPERTY opcode\n\t */\n\tprivate CREATE_PROPERTY(_arg: any): string {\n\t\tconst res = this.stack!.get(-2) + \"[\" + this.stack!.get(-1) + \"] = \" + this.stack!.get() + \" ;\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile LOAD_PROPERTY opcode\n\t */\n\tprivate LOAD_PROPERTY(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get() +\n\t\t\t\"] ; // LOAD_PROPERTY\\nif (\" +\n\t\t\tv +\n\t\t\t\" == null) { \" +\n\t\t\tv +\n\t\t\t\" = 0 ; }\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile LOAD_PROPERTY_ATOP opcode\n\t */\n\tprivate LOAD_PROPERTY_ATOP(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get() +\n\t\t\t\"] ; // LOAD_PROPERTY_ATOP\\nif (\" +\n\t\t\tv +\n\t\t\t\" == null) { \" +\n\t\t\tv +\n\t\t\t\" = 0 ; }\";\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile NEW_OBJECT opcode\n\t */\n\tprivate NEW_OBJECT(): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = {} ;\";\n\t}\n\n\t/**\n\t * Transpile NEW_ARRAY opcode\n\t */\n\tprivate NEW_ARRAY(): string {\n\t\tconst v = this.createVariable();\n\t\tthis.stack!.push(v);\n\t\treturn \"let \" + v + \" = [] ;\";\n\t}\n\n\t/**\n\t * Transpile MAKE_OBJECT opcode\n\t */\n\tprivate MAKE_OBJECT(): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres = \"let \" + v + \" = \" + this.stack!.get() + \" ;\\nif (typeof \" + v + ' != \"object\") ' + v + \" = {} ; \";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n\n\t/**\n\t * Transpile STORE_VARIABLE opcode\n\t */\n\tprivate STORE_VARIABLE(arg: string): string {\n\t\tif (this.variables![arg] != null) {\n\t\t\treturn this.variables![arg] + ' = object[\"' + arg + '\"] = ' + this.stack!.get() + \" ; // STORE_VARIABLE\";\n\t\t} else {\n\t\t\treturn 'object[\"' + arg + '\"] = ' + this.stack!.get() + \" ; // STORE_VARIABLE\";\n\t\t}\n\t}\n\n\t/**\n\t * Transpile STORE_PROPERTY opcode\n\t */\n\tprivate STORE_PROPERTY(_arg: any): string {\n\t\tlet res: string;\n\t\tlet v: string;\n\t\tv = this.createVariable();\n\t\tres =\n\t\t\t\"let \" +\n\t\t\tv +\n\t\t\t\" = \" +\n\t\t\tthis.stack!.get(-2) +\n\t\t\t\"[\" +\n\t\t\tthis.stack!.get(-1) +\n\t\t\t\"] = \" +\n\t\t\tthis.stack!.get(0) +\n\t\t\t\" ; // STORE_PROPERTY\";\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.pop();\n\t\tthis.stack!.push(v);\n\t\treturn res;\n\t}\n}\n","/**\n * Storage service - localStorage wrapper with automatic serialization\n */\n\nexport class StorageService {\n\tprivate namespace: string;\n\tprivate cache: Map<string, any> = new Map();\n\tprivate pendingWrites: Map<string, any> = new Map();\n\tprivate writeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate runtime?: any;\n\n\tconstructor(namespace = \"/l8b\", preserve = false, runtime?: any) {\n\t\tthis.namespace = namespace;\n\t\tthis.runtime = runtime;\n\n\t\t// Clear storage if not preserving\n\t\tif (!preserve && typeof localStorage !== \"undefined\") {\n\t\t\tthis.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Get value from storage\n\t */\n\tget(name: string): any {\n\t\t// Validate storage key\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7063\", message: `Invalid storage key: ${name}` });\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check cache first\n\t\tif (this.cache.has(name)) {\n\t\t\treturn this.cache.get(name);\n\t\t}\n\n\t\t// Try localStorage\n\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\ttry {\n\t\t\t\tconst key = `${this.namespace}.${name}`;\n\t\t\t\tconst value = localStorage.getItem(key);\n\t\t\t\tif (value !== null) {\n\t\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\t\tthis.cache.set(name, parsed);\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7062\", message: `Get operation failed: ${String(err)}` });\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Set value in storage (batched write)\n\t */\n\tset(name: string, value: any): void {\n\t\t// Validate storage key\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7063\", message: `Invalid storage key: ${name}` });\n\t\t\treturn;\n\t\t}\n\n\t\t// Update cache\n\t\tthis.cache.set(name, value);\n\n\t\t// Queue write\n\t\tthis.pendingWrites.set(name, value);\n\n\t\t// Schedule batch write\n\t\tif (this.writeTimer === null) {\n\t\t\tconst schedule =\n\t\t\t\ttypeof window !== \"undefined\" && typeof window.setTimeout === \"function\"\n\t\t\t\t\t? window.setTimeout.bind(window)\n\t\t\t\t\t: setTimeout;\n\n\t\t\tthis.writeTimer = schedule(() => {\n\t\t\t\tthis.flush();\n\t\t\t}, 100);\n\t\t}\n\t}\n\n\t/**\n\t * Flush pending writes to localStorage\n\t */\n\tflush(): void {\n\t\tif (this.writeTimer !== null) {\n\t\t\tclearTimeout(this.writeTimer);\n\t\t\tthis.writeTimer = null;\n\t\t}\n\n\t\tif (typeof localStorage === \"undefined\") {\n\t\t\tthis.pendingWrites.clear();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [name, value] of this.pendingWrites) {\n\t\t\ttry {\n\t\t\t\tconst key = `${this.namespace}.${name}`;\n\t\t\t\tconst serialized = JSON.stringify(this.sanitize(value));\n\t\t\t\tlocalStorage.setItem(key, serialized);\n\t\t\t} catch (err: any) {\n\t\t\t\t// Check for quota exceeded error\n\t\t\t\tif (err.name === \"QuotaExceededError\" || err.code === 22) {\n\t\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7061\", message: \"Storage quota exceeded\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7062\", message: `Set operation failed: ${String(err)}` });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.pendingWrites.clear();\n\t}\n\n\t/**\n\t * Check if there are pending writes and flush if needed\n\t */\n\tcheck(): void {\n\t\tif (this.pendingWrites.size > 0) {\n\t\t\tthis.flush();\n\t\t}\n\t}\n\n\t/**\n\t * Delete a single key from storage (cache + localStorage + any pending write)\n\t */\n\tdelete(name: string): void {\n\t\tif (!name || typeof name !== \"string\" || name.trim() === \"\") {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7063\", message: `Invalid storage key: ${name}` });\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove from in-memory state\n\t\tthis.cache.delete(name);\n\t\tthis.pendingWrites.delete(name);\n\n\t\t// Remove from localStorage\n\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\ttry {\n\t\t\t\tlocalStorage.removeItem(`${this.namespace}.${name}`);\n\t\t\t} catch (err: any) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7062\", message: `Delete operation failed: ${String(err)}` });\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all storage for this namespace\n\t */\n\tclear(): void {\n\t\tif (typeof localStorage === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst prefix = `${this.namespace}.`;\n\t\tconst keysToRemove: string[] = [];\n\n\t\t// Find all keys with this namespace\n\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\tconst key = localStorage.key(i);\n\t\t\tif (key && key.startsWith(prefix)) {\n\t\t\t\tkeysToRemove.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Remove them\n\t\tfor (const key of keysToRemove) {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\n\t\t// Clear cache\n\t\tthis.cache.clear();\n\t\tthis.pendingWrites.clear();\n\t}\n\n\t/**\n\t * Sanitize value for JSON serialization\n\t * Removes functions and handles circular references\n\t */\n\tprivate sanitize(value: any, seen = new WeakSet()): any {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Primitives\n\t\tif (typeof value !== \"object\") {\n\t\t\t// Remove functions\n\t\t\tif (typeof value === \"function\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\t// Check for circular reference\n\t\tif (seen.has(value)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tseen.add(value);\n\n\t\t// Arrays\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.map((item) => this.sanitize(item, seen)).filter((item) => item !== undefined);\n\t\t}\n\n\t\t// Objects\n\t\tconst result: any = {};\n\t\tfor (const key in value) {\n\t\t\tif (Object.hasOwn(value, key)) {\n\t\t\t\tconst sanitized = this.sanitize(value[key], seen);\n\t\t\t\tif (sanitized !== undefined) {\n\t\t\t\t\tresult[key] = sanitized;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate interfaceCache: {\n\t\tset: (name: string, value: unknown) => void;\n\t\tget: (name: string) => unknown;\n\t\tdelete: (name: string) => void;\n\t} | null = null;\n\n\t/**\n\t * Get storage interface for game code\n\t */\n\tgetInterface() {\n\t\tif (this.interfaceCache) {\n\t\t\treturn this.interfaceCache;\n\t\t}\n\t\tthis.interfaceCache = {\n\t\t\tset: (name: string, value: any) => this.set(name, value),\n\t\t\tget: (name: string) => this.get(name),\n\t\t\tdelete: (name: string) => this.delete(name),\n\t\t};\n\t\treturn this.interfaceCache;\n\t}\n}\n","/**\n * VM Context creation utilities\n */\n\nimport { Random } from \"@al8b/lootiscript\";\nimport type { GlobalAPI, MetaFunctions, VMContext } from \"./types\";\n\n// Shared math lambdas — allocated once, reused across all VM instances\nconst _baseMeta = {\n\tround: (x: number) => Math.round(x),\n\tfloor: (x: number) => Math.floor(x),\n\tceil: (x: number) => Math.ceil(x),\n\tabs: (x: number) => Math.abs(x),\n\tmin: (x: number, y: number) => Math.min(x, y),\n\tmax: (x: number, y: number) => Math.max(x, y),\n\tsqrt: (x: number) => Math.sqrt(x),\n\tpow: (x: number, y: number) => x ** y,\n\tsin: (x: number) => Math.sin(x),\n\tcos: (x: number) => Math.cos(x),\n\ttan: (x: number) => Math.tan(x),\n\tasin: (x: number) => Math.asin(x),\n\tacos: (x: number) => Math.acos(x),\n\tatan: (x: number) => Math.atan(x),\n\tatan2: (y: number, x: number) => Math.atan2(y, x),\n\tsind: (x: number) => Math.sin((x / 180) * Math.PI),\n\tcosd: (x: number) => Math.cos((x / 180) * Math.PI),\n\ttand: (x: number) => Math.tan((x / 180) * Math.PI),\n\tasind: (x: number) => (Math.asin(x) * 180) / Math.PI,\n\tacosd: (x: number) => (Math.acos(x) * 180) / Math.PI,\n\tatand: (x: number) => (Math.atan(x) * 180) / Math.PI,\n\tatan2d: (y: number, x: number) => (Math.atan2(y, x) * 180) / Math.PI,\n\tlog: (x: number) => Math.log(x),\n\texp: (x: number) => Math.exp(x),\n\trandom: new Random(0),\n\tPI: Math.PI,\n\ttrue: 1 as const,\n\tfalse: 0 as const,\n};\n\nconst _defaultPrint = (text: any) => console.log(text);\n\n/**\n * Create meta functions (built-in functions)\n */\nexport function createMetaFunctions(customPrint?: (text: any) => void): MetaFunctions {\n\treturn {\n\t\t..._baseMeta,\n\t\tprint: customPrint ?? _defaultPrint,\n\t};\n}\n\n/**\n * Create VM context\n */\nexport function createVMContext(meta: Partial<MetaFunctions>, global: Partial<GlobalAPI>): VMContext {\n\tconst fullMeta: MetaFunctions = {\n\t\t..._baseMeta,\n\t\tprint: meta.print ?? _defaultPrint,\n\t\t...meta,\n\t};\n\n\treturn {\n\t\tmeta: fullMeta as MetaFunctions,\n\t\tglobal: global as GlobalAPI,\n\t\tlocal: global,\n\t\tobject: global,\n\t\tbreakable: 0,\n\t\tcontinuable: 0,\n\t\treturnable: 0,\n\t\tstack_size: 0,\n\t\ttimeout: Date.now() + 3000,\n\t\twarnings: {\n\t\t\tusing_undefined_variable: {},\n\t\t\tassigning_field_to_undefined: {},\n\t\t\tinvoking_non_function: {},\n\t\t\tassigning_api_variable: {},\n\t\t\tassignment_as_condition: {},\n\t\t},\n\t};\n}\n","/**\n * Array extensions\n */\n\n/**\n * Setup array extensions\n */\nexport function setupArrayExtensions(): void {\n\t// Insert element at beginning of array (returns the inserted element)\n\tif (!Array.prototype.insert) {\n\t\tArray.prototype.insert = function (element: any) {\n\t\t\tthis.splice(0, 0, element);\n\t\t\treturn element;\n\t\t};\n\t}\n\n\t// Insert element at specific index (returns the inserted element)\n\tif (!Array.prototype.insertAt) {\n\t\tArray.prototype.insertAt = function (element: any, index: number) {\n\t\t\tif (index >= 0 && index < this.length) {\n\t\t\t\tthis.splice(index, 0, element);\n\t\t\t} else {\n\t\t\t\tthis.push(element);\n\t\t\t}\n\t\t\treturn element;\n\t\t};\n\t}\n\n\t// Remove element at index (returns removed element or 0 if out of bounds)\n\tif (!Array.prototype.remove) {\n\t\tArray.prototype.remove = function (index: number) {\n\t\t\tif (index >= 0 && index < this.length) {\n\t\t\t\treturn this.splice(index, 1)[0];\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t}\n\n\t// Remove first occurrence of element (returns removed element or 0 if not found)\n\tif (!Array.prototype.removeElement) {\n\t\tArray.prototype.removeElement = function (element: any) {\n\t\t\tconst index = this.indexOf(element);\n\t\t\tif (index >= 0) {\n\t\t\t\treturn this.splice(index, 1)[0];\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t}\n\n\t// Check if array contains element (returns 1 if found, 0 if not found)\n\tif (!Array.prototype.contains) {\n\t\tArray.prototype.contains = function (element: any) {\n\t\t\treturn this.indexOf(element) >= 0 ? 1 : 0;\n\t\t};\n\t}\n\n\t// Sort array with optional comparator function\n\tif (!Array.prototype.sortList) {\n\t\tArray.prototype.sortList = function (fn?: (a: any, b: any) => number) {\n\t\t\tif (fn) {\n\t\t\t\treturn this.sort(fn);\n\t\t\t}\n\t\t\treturn this.sort();\n\t\t};\n\t}\n}\n\n// TypeScript type declarations for Array prototype extensions\ndeclare global {\n\tinterface Array<T> {\n\t\tinsert(element: T): T;\n\t\tinsertAt(element: T, index: number): T;\n\t\tremove(index: number): T | 0;\n\t\tremoveElement(element: T): T | 0;\n\t\tcontains(element: T): 0 | 1;\n\t\tsortList(fn?: (a: T, b: T) => number): T[];\n\t}\n}\n","/**\n * L8BVM - Virtual Machine wrapper for lootiscript\n *\n * High-level interface for the LootiScript virtual machine.\n * Wraps the core Compiler, Processor, and Runner into a usable engine component.\n * Handles context creation, storage persistence, and error formatting.\n *\n * Responsibilities:\n * - Create and manage VM execution context\n * - Provide clean API for running code and calling functions\n * - Handle storage persistence\n * - Format and normalize runtime errors\n *\n * @module vm\n */\n\nimport { StorageService } from \"@al8b/io\";\nimport { Routine, Runner } from \"@al8b/lootiscript\";\nimport { createVMContext } from \"./context\";\nimport { setupArrayExtensions } from \"./extensions\";\nimport type { ErrorInfo, GlobalAPI, MetaFunctions, VMContext } from \"./types\";\n\n/**\n * Extract normalized ErrorInfo from a caught exception.\n * Centralizes the error-parsing logic shared across run(), call(), and loadRoutine().\n */\nfunction extractErrorInfo(err: any, fallbackFile: string, fallbackType: string, runner?: Runner): ErrorInfo {\n\tconst errorMessage =\n\t\ttypeof err === \"object\" && err !== null && \"error\" in err && typeof err.error === \"string\"\n\t\t\t? err.error\n\t\t\t: err?.message ?? String(err);\n\n\tlet stackTrace = err?.stackTrace;\n\tif (!stackTrace && (runner as any)?.main_thread?.processor?.generateStackTrace) {\n\t\tstackTrace = (runner as any).main_thread.processor.generateStackTrace();\n\t}\n\n\treturn {\n\t\terror: errorMessage,\n\t\ttype: err?.type ?? fallbackType,\n\t\tline: err?.line,\n\t\tcolumn: err?.column,\n\t\tfile: err?.file ?? fallbackFile,\n\t\tstack: err?.stack,\n\t\tstackTrace,\n\t};\n}\n\nexport class L8BVM {\n\tpublic context: VMContext;\n\tpublic runner: Runner;\n\tpublic storage_service: StorageService;\n\tpublic error_info: ErrorInfo | null = null;\n\n\tconstructor(\n\t\tmeta: Partial<MetaFunctions> = {},\n\t\tglobal: Partial<GlobalAPI> = {},\n\t\tnamespace = \"/l8b\",\n\t\tpreserve_ls = false,\n\t) {\n\t\t// Initialize VM execution context with meta functions and global API\n\t\tthis.context = createVMContext(meta, global);\n\n\t\t// Initialize storage service for persistent data (localStorage/sessionStorage)\n\t\tthis.storage_service = new StorageService(namespace, preserve_ls);\n\n\t\t// Inject storage API into global scope for LootiScript access\n\t\tthis.context.global.storage = this.storage_service.getInterface();\n\n\t\t// Create Runner instance with reference to this VM for bidirectional communication\n\t\tthis.runner = new Runner(this as any);\n\n\t\t// Initialize Runner and create main execution thread\n\t\tthis.runner.init();\n\n\t\t// Add custom array methods to Array.prototype for LootiScript\n\t\tsetupArrayExtensions();\n\t}\n\n\t/**\n\t * Run source code\n\t *\n\t * Compiles and executes a string of LootiScript code.\n\t *\n\t * @param {string} source - The source code to execute\n\t * @param {number} [timeout=3000] - Execution time limit in ms\n\t * @param {string} [filename=\"\"] - Filename for error reporting\n\t * @returns {any} The result of the last statement execution\n\t * @throws {ErrorInfo} If compilation or execution fails\n\t */\n\trun(source: string, timeout = 3000, filename = \"\"): any {\n\t\tthis.error_info = null;\n\t\tthis.context.timeout = Date.now() + timeout;\n\t\tthis.context.stack_size = 0;\n\n\t\ttry {\n\t\t\tconst result = this.runner.run(source, filename);\n\t\t\tthis.storage_service.check();\n\n\t\t\tif (result !== null && result !== undefined) {\n\t\t\t\treturn this.runner.toString(result);\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, filename, \"runtime\", this.runner);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Call a global function\n\t *\n\t * Executes a specific function defined in the global scope.\n\t * Useful for game loop hooks (update, draw) or event handlers.\n\t *\n\t * @param {string} name - Name of the function to call\n\t * @param {any[]} [args=[]] - Arguments to pass to the function\n\t * @param {number} [timeout=3000] - Execution time limit in ms\n\t * @returns {any} The return value of the function\n\t * @throws {ErrorInfo} If the function doesn't exist or execution fails\n\t */\n\tcall(name: string, args: any[] = [], timeout = 3000): any {\n\t\tthis.error_info = null;\n\t\tthis.context.timeout = Date.now() + timeout;\n\t\tthis.context.stack_size = 0;\n\n\t\ttry {\n\t\t\tconst result = this.runner.call(name, ...args);\n\t\t\tthis.storage_service.check();\n\t\t\treturn result;\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, name, \"call\", this.runner);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Load a pre-compiled routine (for production builds)\n\t *\n\t * Loads bytecode directly into the VM, bypassing the compilation step.\n\t * Used in production to improve startup time and obfuscate source.\n\t *\n\t * @param {any} routineData - Either a Routine instance or serialized JSON\n\t * @param {string} [filename=\"\"] - Name of the file for error reporting\n\t * @throws {ErrorInfo} If loading fails\n\t */\n\tloadRoutine(routineData: any, filename: string = \"\"): void {\n\t\tthis.error_info = null;\n\n\t\ttry {\n\t\t\tlet routine: Routine;\n\n\t\t\t// Handle both Routine instances and serialized routine data\n\t\t\t// Serialized data needs to be imported first\n\t\t\tif (routineData instanceof Routine) {\n\t\t\t\troutine = routineData;\n\t\t\t} else {\n\t\t\t\troutine = new Routine(0).import(normalizeSerializedRoutine(routineData));\n\t\t\t}\n\n\t\t\t// Add to main thread for execution\n\t\t\tthis.runner.main_thread.addCall(routine);\n\t\t\tthis.runner.tick();\n\t\t} catch (err: any) {\n\t\t\tthis.error_info = extractErrorInfo(err, filename, \"compile\");\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Clear warnings\n\t */\n\tclearWarnings(): void {\n\t\tthis.context.warnings = {\n\t\t\tusing_undefined_variable: {},\n\t\t\tassigning_field_to_undefined: {},\n\t\t\tinvoking_non_function: {},\n\t\t\tassigning_api_variable: {},\n\t\t\tassignment_as_condition: {},\n\t\t};\n\t}\n\n\t/**\n\t * Get warnings\n\t */\n\tgetWarnings(): Record<string, any> {\n\t\treturn this.context.warnings || {};\n\t}\n\n\t/**\n\t * Convert value to string (for printing)\n\t */\n\ttoString(value: any): string {\n\t\treturn this.runner.toString(value);\n\t}\n}\n\n// Inline types stub for @al8b/framework-shared\ninterface CompiledModuleArtifact {\n\tformat: \"l8b-compiled-routine\";\n\troutine: SerializedRoutineData;\n}\ntype SerializedRoutineData = {\n\tnum_args: number;\n\tops: number[];\n\targs: any[];\n\timport_refs: any[];\n\timport_values: any[];\n\timport_self: number;\n\tlocals_size?: number;\n};\n\nfunction normalizeSerializedRoutine(routineData: CompiledModuleArtifact | SerializedRoutineData): SerializedRoutineData {\n\tif (isCompiledModuleArtifact(routineData)) {\n\t\treturn routineData.routine;\n\t}\n\n\treturn routineData;\n}\n\nfunction isCompiledModuleArtifact(value: unknown): value is CompiledModuleArtifact {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"format\" in value &&\n\t\t(value as { format?: unknown }).format === \"l8b-compiled-routine\" &&\n\t\t\"routine\" in value\n\t);\n}\n","// VM public surface — StorageService is intentionally NOT re-exported here.\n// Import it directly from \"@al8b/io\" if you need it.\nexport { createMetaFunctions, createVMContext } from \"./context\";\nexport { setupArrayExtensions } from \"./extensions\";\nexport { L8BVM } from \"./l8bvm\";\nexport type {\n\tErrorInfo,\n\tGlobalAPI,\n\tMetaFunctions,\n\tPlayerAPI,\n\tSystemAPI,\n\tVMContext,\n\tVMWarnings,\n\tWarningInfo,\n} from \"./types\";\n\n// Re-export language primitives that runtime and host code legitimately need.\n// This keeps runtime from bypassing the vm layer and importing lootiscript directly.\nexport { Random, Routine } from \"@al8b/lootiscript\";\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?.getFunctionSource) {\n\t\t\t\tconst init = this.vm.runner.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 * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n","import { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): 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\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Keyboard state not available\", data: { error: \"Keyboard state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Mouse state not available\", data: { error: \"Mouse state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Touch state not available\", data: { error: \"Touch state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7051\", message: \"Gamepad API not available\", data: { device: \"gamepad\" } });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\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 type { RuntimeListener } from \"../types\";\nimport type { L8BVM } from \"@al8b/vm\";\n\n/**\n * Format error message\n */\nexport function formatRuntimeError(error: any): any {\n\tif (error.code || error.context || error.suggestions) {\n\t\treturn error;\n\t}\n\n\treturn {\n\t\t...error,\n\t\tcode: error.code || \"E2005\",\n\t\tformatted: error.message || String(error),\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","/**\n * Palette - Color palette management\n */\n\nimport type { ColorHex, ColorRGB, PaletteData } from \"../types\";\n\n/** Matches a valid 6-digit hex color string, e.g. \"#1A2B3C\" */\nconst HEX_COLOR_REGEX = /^#[0-9A-Fa-f]{6}$/;\n\nexport interface PaletteOptions {\n\tcolors?: ColorHex[];\n\tname?: string;\n}\n\nexport class Palette {\n\tprivate colors: ColorHex[];\n\tprivate name: string;\n\tprivate rgbCache: Map<number, ColorRGB>;\n\tprivate runtime?: any;\n\n\tconstructor(options: PaletteOptions | PaletteData = {}, runtime?: any) {\n\t\tthis.runtime = runtime;\n\n\t\tif (\"colors\" in options && Array.isArray(options.colors)) {\n\t\t\t// Validate palette format to ensure all colors are valid hex strings\n\t\t\tif (!this.validatePaletteFormat(options.colors)) {\n\t\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7072\", message: \"Invalid palette format\", data: { format: \"invalid color array\" } });\n\t\t\t\tthis.colors = [];\n\t\t\t\tthis.name = \"Invalid\";\n\t\t\t} else {\n\t\t\t\tthis.colors = [...options.colors];\n\t\t\t\tthis.name = options.name || \"Custom\";\n\t\t\t}\n\t\t} else {\n\t\t\t// Initialize with empty palette when no valid colors provided\n\t\t\tthis.colors = [];\n\t\t\tthis.name = \"Empty\";\n\t\t}\n\n\t\tthis.rgbCache = new Map();\n\t}\n\n\t/**\n\t * Validate palette format\n\t */\n\tprivate validatePaletteFormat(colors: any[]): boolean {\n\t\tif (!Array.isArray(colors)) return false;\n\t\treturn colors.every((color) => typeof color === \"string\" && HEX_COLOR_REGEX.test(color));\n\t}\n\n\t/**\n\t * Get color by index\n\t */\n\tget(index: number): ColorHex {\n\t\t// Validate color index is a finite, non-negative number\n\t\tif (!isFinite(index) || index < 0) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7073\", message: \"Invalid color index\", data: { index, maxIndex: this.colors.length - 1 } });\n\t\t\treturn \"#000000\";\n\t\t}\n\n\t\tif (this.colors.length === 0) {\n\t\t\treturn \"#000000\";\n\t\t}\n\n\t\treturn this.colors[index % this.colors.length] || \"#000000\";\n\t}\n\n\t/**\n\t * Get color as RGB object\n\t */\n\tgetRGB(index: number): ColorRGB {\n\t\tif (this.rgbCache.has(index)) {\n\t\t\treturn this.rgbCache.get(index)!;\n\t\t}\n\n\t\tconst hex = this.get(index);\n\t\tconst rgb = this.hexToRGB(hex);\n\t\tthis.rgbCache.set(index, rgb);\n\t\treturn rgb;\n\t}\n\n\t/**\n\t * Get all colors\n\t */\n\tgetAll(): ColorHex[] {\n\t\treturn [...this.colors];\n\t}\n\n\t/**\n\t * Get palette size\n\t */\n\tget size(): number {\n\t\treturn this.colors.length;\n\t}\n\n\t/**\n\t * Get palette name\n\t */\n\tget paletteName(): string {\n\t\treturn this.name;\n\t}\n\n\t/**\n\t * Set color at index (expands palette if needed)\n\t */\n\tset(index: number, color: ColorHex): void {\n\t\t// Validate color index is a finite, non-negative number\n\t\tif (!isFinite(index) || index < 0) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7073\", message: \"Invalid color index\", data: { index, maxIndex: this.colors.length - 1 } });\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate color format matches hex pattern (#RRGGBB)\n\t\tif (!HEX_COLOR_REGEX.test(color)) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7072\", message: \"Invalid color format\", data: { format: color } });\n\t\t\treturn;\n\t\t}\n\n\t\t// Expand palette with black (#000000) if index exceeds current size\n\t\twhile (this.colors.length <= index) {\n\t\t\tthis.colors.push(\"#000000\");\n\t\t}\n\t\tthis.colors[index] = color;\n\t\tthis.rgbCache.delete(index);\n\t}\n\n\t/**\n\t * Add color to palette\n\t */\n\tadd(color: ColorHex): number {\n\t\tthis.colors.push(color);\n\t\treturn this.colors.length - 1;\n\t}\n\n\t/**\n\t * Remove color at index\n\t */\n\tremove(index: number): void {\n\t\tif (index >= 0 && index < this.colors.length) {\n\t\t\tthis.colors.splice(index, 1);\n\t\t\tthis.rgbCache.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Replace entire palette\n\t */\n\tsetPalette(colors: ColorHex[]): void {\n\t\t// Validate palette format to ensure all colors are valid hex strings\n\t\tif (!this.validatePaletteFormat(colors)) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7072\", message: \"Invalid palette format\", data: { format: \"invalid color array\" } });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.colors = [...colors];\n\t\tthis.rgbCache.clear();\n\t}\n\n\t/**\n\t * Reset to original colors\n\t */\n\treset(paletteData?: PaletteData): void {\n\t\tif (paletteData) {\n\t\t\tthis.colors = [...paletteData.colors];\n\t\t\tthis.name = paletteData.name;\n\t\t}\n\t\tthis.rgbCache.clear();\n\t}\n\n\t/**\n\t * Convert hex to RGB\n\t */\n\tprivate hexToRGB(hex: ColorHex): ColorRGB {\n\t\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\t\treturn result\n\t\t\t? {\n\t\t\t\t\tr: Number.parseInt(result[1], 16),\n\t\t\t\t\tg: Number.parseInt(result[2], 16),\n\t\t\t\t\tb: Number.parseInt(result[3], 16),\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t};\n\t}\n\n\t/**\n\t * Convert RGB to hex\n\t */\n\tstatic rgbToHex(r: number, g: number, b: number): ColorHex {\n\t\treturn \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();\n\t}\n\n\t/**\n\t * Find closest color in palette\n\t */\n\tfindClosest(targetHex: ColorHex): number {\n\t\tconst target = this.hexToRGB(targetHex);\n\t\tlet closestIndex = 0;\n\t\tlet closestDistance = Number.POSITIVE_INFINITY;\n\n\t\tfor (let i = 0; i < this.colors.length; i++) {\n\t\t\tconst color = this.getRGB(i);\n\t\t\tconst distance = (target.r - color.r) ** 2 + (target.g - color.g) ** 2 + (target.b - color.b) ** 2;\n\n\t\t\tif (distance < closestDistance) {\n\t\t\t\tclosestDistance = distance;\n\t\t\t\tclosestIndex = i;\n\t\t\t}\n\t\t}\n\n\t\treturn closestIndex;\n\t}\n\n\t/**\n\t * Create a gradient between two palette colors\n\t */\n\tgradient(startIndex: number, endIndex: number, steps: number): ColorHex[] {\n\t\tconst start = this.getRGB(startIndex);\n\t\tconst end = this.getRGB(endIndex);\n\t\tconst gradient: ColorHex[] = [];\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = i / (steps - 1);\n\t\t\tconst r = Math.round(start.r + (end.r - start.r) * t);\n\t\t\tconst g = Math.round(start.g + (end.g - start.g) * t);\n\t\t\tconst b = Math.round(start.b + (end.b - start.b) * t);\n\t\t\tgradient.push(Palette.rgbToHex(r, g, b));\n\t\t}\n\n\t\treturn gradient;\n\t}\n\n\t/**\n\t * Lighten a color\n\t */\n\tlighten(index: number, amount: number = 0.2): ColorHex {\n\t\tconst color = this.getRGB(index);\n\t\tconst r = Math.min(255, Math.round(color.r + (255 - color.r) * amount));\n\t\tconst g = Math.min(255, Math.round(color.g + (255 - color.g) * amount));\n\t\tconst b = Math.min(255, Math.round(color.b + (255 - color.b) * amount));\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Darken a color\n\t */\n\tdarken(index: number, amount: number = 0.2): ColorHex {\n\t\tconst color = this.getRGB(index);\n\t\tconst r = Math.max(0, Math.round(color.r * (1 - amount)));\n\t\tconst g = Math.max(0, Math.round(color.g * (1 - amount)));\n\t\tconst b = Math.max(0, Math.round(color.b * (1 - amount)));\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Mix two colors\n\t */\n\tmix(index1: number, index2: number, ratio: number = 0.5): ColorHex {\n\t\tconst color1 = this.getRGB(index1);\n\t\tconst color2 = this.getRGB(index2);\n\t\tconst r = Math.round(color1.r + (color2.r - color1.r) * ratio);\n\t\tconst g = Math.round(color1.g + (color2.g - color1.g) * ratio);\n\t\tconst b = Math.round(color1.b + (color2.b - color1.b) * ratio);\n\t\treturn Palette.rgbToHex(r, g, b);\n\t}\n\n\t/**\n\t * Export palette data\n\t */\n\ttoData(): PaletteData {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcolors: this.getAll(),\n\t\t};\n\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","import { Palette } from \"@al8b/palette\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random } 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\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\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\n/**\n * Deep clone a value, handling primitives, arrays, objects, and Date.\n * Unlike JSON.parse(JSON.stringify()), this:\n * - Returns null for functions instead of stripping them silently\n * - Preserves Date objects as Date instances\n * - Handles circular references via excluded set\n */\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn new Date(value) 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) => cloneValue(entry)) 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] = cloneValue(entry);\n\t\t}\n\t\treturn clone as T;\n\t}\n\n\treturn null as T;\n}\n","import { AudioCore } from \"@al8b/audio\";\nimport { PlayerService } from \"@al8b/player\";\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 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 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.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\treturn {\n\t\t\tversion: 1,\n\t\t\tglobal: global ? serializeGlobalSnapshot(global) : {},\n\t\t\tsession: this.getSession(),\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\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\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\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 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\tthis.vm.call(\"update\");\n\t\t\tthis.vm.runner.tick();\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\tthis.vm.call(\"draw\");\n\t\t\tthis.vm.runner.tick();\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}\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\tif (!(\"session\" in value)) return false;\n\treturn true;\n}\n","/**\n * Deep clone utility using structuredClone\n */\n\n/**\n * Deep clone a value using the native structuredClone API\n * Supports all structured-cloneable types: objects, arrays, primitives, Date, Set, Map, etc.\n * Does NOT support: Functions, Symbols, DOM nodes\n *\n * @param value The value to deep clone\n * @returns A deep clone of the value\n */\nexport function deepClone(value: unknown): unknown {\n\t// Use native structuredClone if available (Node 17.5+, modern browsers)\n\tif (typeof structuredClone !== \"undefined\") {\n\t\treturn structuredClone(value);\n\t}\n\n\t// Fallback for older environments: JSON round-trip\n\t// WARNING: This loses Date, Map, Set, undefined, Function, Symbol values\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(value));\n\t} catch {\n\t\t// If JSON fails (circular reference, etc.), return the original\n\t\t// This is safe but means mutations will affect the original\n\t\treturn value;\n\t}\n}\n","/**\n * Shallow equality comparison for objects and arrays\n */\n\n/**\n * Compare two values for shallow equality\n * For objects and arrays, only checks if top-level properties have the same references\n * For primitives, uses === comparison\n *\n * @param a First value\n * @param b Second value\n * @returns true if values are shallowly equal\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n\t// Same reference\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\t// Different types\n\tif (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) {\n\t\treturn false;\n\t}\n\n\tconst aObj = a as Record<string, unknown>;\n\tconst bObj = b as Record<string, unknown>;\n\n\t// Get keys\n\tconst aKeys = Object.keys(aObj);\n\tconst bKeys = Object.keys(bObj);\n\n\t// Different number of keys\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\n\t// Check all keys have same reference values\n\tfor (const key of aKeys) {\n\t\tif (!(key in bObj) || aObj[key] !== bObj[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n"],"mappings":"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","names":["shallowEqual","A4_FREQUENCY","SEMITONE_RATIO","A4_MIDI_NOTE","Beeper","audio","notes","plainNotes","currentOctave","currentDuration","currentVolume","currentSpan","currentWaveform","initializeNotes","noteNames","i","oct","Math","floor","n","beep","input","status","sequence","loops","note","parsed","split","t","undefined","push","frequency","volume","span","duration","waveform","includes","length","lop","splice","loopto","start","repeats","tempo","Number","parseFloat","isNaN","step","addBeeps","AUDIO_WORKLET_CODE","AudioCore","context","buffer","playing","wakeupList","workletNode","beeper","runtime","masterVolume","getContext","isStarted","state","addToWakeUpList","item","interfaceCache","setVolume","max","min","getVolume","getInterface","__name","cancelBeeps","playSound","sound","pitch","pan","loopit","playMusic","music","stopAll","soundName","replace","s","sounds","listener","reportError","code","message","data","play","musicName","m","AudioContextClass","window","AudioContext","webkitAudioContext","activate","resume","wakeUp","document","body","removeEventListener","addEventListener","once","blob","Blob","type","url","URL","createObjectURL","audioWorklet","addModule","AudioWorkletNode","connect","destination","flushBuffer","e","error","String","port","postMessage","getBeeper","beeps","b","sampleRate","increment","JSON","stringify","name","addPlaying","removePlaying","index","indexOf","p","stop","err","Music","ready","tag","Audio","loop","pause","v","getPosition","currentTime","getDuration","setPosition","pos","Sound","AudioBuffer","loadSound","request","XMLHttpRequest","open","responseType","onload","decodeAudioData","response","onerror","send","finished","source","createBufferSource","playbackRate","value","gain","createGain","panner","createPanner","panningModel","setPan","abs","res","setPitch","onended","createSoundClass","audiocore","MicroSound","classname","channels","createBuffer","write","channel","position","ch1","getChannelData","ch2","read","ensureCanvas","__name","state","width","height","blockWidth","blockHeight","canvas","document","createElement","expectedWidth","expectedHeight","ctx","getContext","message","Error","clearRect","animated","drawTile","sprite","gridX","gridY","parsed","frames","subX","tx","ty","subY","drawImage","queueAnimatedTile","tile","x","y","w","h","push","renderAnimatedTiles","time","performance","now","buffer","bufferCtx","len","length","frame","Math","floor","fps","normalizeRefForStorage","ref","replace","normalizeRefForUsage","parseTileRef","entry","colonIdx","indexOf","spriteName","substring","coords","commaIdx","Number","parseInt","TileMap","block_width","block_height","sprites","map","ready","needs_update","name","parsedMap","renderState","isFinite","clear","j","i","idx","set","normalized","get","cell","getCanvas","update","draw","context","index","loadFile","url","loaded","req","XMLHttpRequest","onreadystatechange","readyState","DONE","status","load","responseText","open","send","data","JSON","parse","value","clone","duplicate","copyFrom","LoadMap","UpdateMap","SaveMap","list","table","serialized","payload","stringify","BLENDING_MODES","normal","additive","MODES","mode","setColor","context","color","fillStyle","strokeStyle","setLinearGradient","x1","y1","x2","y2","c1","c2","grd","createLinearGradient","addColorStop","setRadialGradient","x","y","radius","createRadialGradient","createDefaultContextState","centered","alpha","pixelated","line_width","translation_x","translation_y","rotation","scale_x","scale_y","image_transform","anchor_x","anchor_y","object_rotation","object_scale_x","object_scale_y","font","updateImageTransform","state","initDrawOp","object_transform","res","save","translate","scale","rotate","Math","PI","closeDrawOp","restore","fillRect","w","h","globalAlpha","fillRoundRect","round","fillRound","abs","beginPath","ellipse","fill","drawRect","lineWidth","strokeRect","drawRoundRect","strokeRoundRect","drawRound","stroke","drawLine","transform","moveTo","lineTo","loadedFonts","Set","loadingFonts","Map","loadFont","has","Promise","resolve","get","document","promise","fonts","load","then","add","delete","catch","set","isFontReady","check","clearFontCache","clear","resolveStringMap","__name","name","playerRuntime","globalThis","player","runtime","directMaps","maps","screenMaps","screen","drawMap","map","resolvedMap","ready","draw","imageSmoothingEnabled","pixelDataCache","setRGB","r","g","b","createImageData","data","R","G","B","putImageData","setRGBA","a","A","getRGB","result","d","getImageData","getRGBA","drawPolyline","args","Array","isArray","length","len","floor","i","drawPolygon","closePath","fillPolygon","drawQuadCurve","index","quadraticCurveTo","drawBezierCurve","bezierCurveTo","drawArc","angle1","angle2","ccw","arc","fillArc","getSpriteFrame","sprite","canvas","image","frames","animation_start","Date","now","dt","fps","frame","drawSprite","width","height","drawImage","drawSpritePart","sx","sy","sw","sh","textWidth","text","size","measureText","drawText","textAlign","textBaseline","fillText","drawTextOutline","strokeText","setTranslation","isFinite","setScale","setRotation","setDrawAnchor","setDrawRotation","setDrawScale","splitColorArg","points","slice","undefined","Image","_canvas","_context","_image","_state","_centered","widthOrImage","createElement","initContext","getContext","lineCap","c","s","blending_save","globalCompositeOperation","setAlpha","setPixelated","setBlending","blending","setLineWidth","setLineDash","dash","setFont","drawImagePart","Sprite","name","frames","animation_start","fps","ready","width","height","push","Image","setFPS","dt","frame","Date","now","length","newDt","setFrame","getFrame","Math","floor","getCurrentFrameCanvas","canvas","resolveFrameCount","imgWidth","imgHeight","requested","available","min","LoadSprite","url","properties","loaded","sprite","img","window","location","protocol","crossOrigin","src","onload","numframes","round","i","initContext","ctx","context","setTransform","drawImage","onerror","UpdateSprite","DEFAULT_FPS","DEFAULT_UPDATE_RATE","FRAME_TIME_MS","PAUSE_THRESHOLD_MS","DEFAULT_BLOCK_SIZE","LOADING_BAR_THROTTLE_MS","ASSET_LOAD_TIMEOUT_MS","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","PlayerService","delegate","interfaceCache","getInterface","iface","pause","__name","resume","postMessage","message","setFps","fps","isFinite","setUpdateRate","Object","defineProperty","get","getFps","enumerable","getUpdateRate","set","value","ZBuffer","buffer","width","height","Float32Array","clear","fill","get","x","y","set","z","resize","edgeFn","a","b","c","getSpritePixel","sprite","u","v","runtime","canvas","sprites","spriteObj","frames","Math","floor","px","py","ctx","getContext","imageData","getImageData","r","data","g","e","getMapPixel","map","mapObj","getCanvas","maps","drawTexturedTriangle","v0","v1","v2","texture","textureSource","zBuffer","useDepth","context","pixelated","minX","max","min","minY","maxX","ceil","maxY","area","abs","useZ","w0","w1","w2","u0","u1","u2","v0v","v1v","v2v","pixels","p","w0b","w1b","w2b","bary0","bary1","bary2","currentZ","w","pixel","idx","imageSmoothingEnabled","putImageData","drawTriangle","color","fillStyle","beginPath","moveTo","lineTo","closePath","drawTriangleOutline","lineWidth","strokeStyle","stroke","BaseScreen","alpha","line_width","font","translation_x","translation_y","rotation","scale_x","scale_y","screen_transform","object_rotation","object_scale_x","object_scale_y","anchor_x","anchor_y","blending","font_load_requested","font_loaded","interfaceCache","cursor","cursor_visibility","last_mouse_move","Date","now","options","document","createElement","initContext","normal","additive","blendModes","mode","loadFont","addEventListener","style","setInterval","checkMouseCursor","message","listener","reportError","code","Error","restore","save","translate","ratio","scale","lineCap","initDraw","updateInterface","globalAlpha","globalCompositeOperation","fillRect","setColor","Number","isNaN","parseInt","String","num","hex","toString","substring","isValidColor","test","setAlpha","setPixelated","setBlending","blend","blendMode","setLineWidth","setLineDash","dash","Array","isArray","setLinearGradient","x1","y1","x2","y2","c1","c2","grd","createLinearGradient","addColorStop","setRadialGradient","radius","createRadialGradient","setFont","fonts","load","catch","isFontReady","ready","check","setTranslation","tx","ty","isFinite","updateScreenTransform","setScale","setRotation","setDrawAnchor","ax","ay","setDrawRotation","setDrawScale","initDrawOp","object_transform","res","rotate","PI","closeDrawOp","setCursorVisible","visible","PrimitiveScreen","h","error","fillRoundRect","round","transform","rx","ry","roundRect","quadraticCurveTo","fillRound","ellipse","drawRect","strokeRect","drawRoundRect","drawRound","drawLine","drawPolygon","args","points","extractPoints","length","len","i","drawPolyline","fillPolygon","drawQuadCurve","index","drawBezierCurve","bezierCurveTo","drawArc","angle1","angle2","ccw","arc","fillArc","slice","SpriteScreen","_lastImageSmoothing","_frameTime","performance","setImageSmoothing","smooth","getSpriteFrame","frame","spriteName","parts","split","image","animation_start","dt","fps","drawSprite","drawX","drawY","halfW","halfH","drawImage","drawSpritePart","sx","sy","sw","sh","drawMap","draw","TextScreen","_cachedFontSize","_cachedFontName","_cachedFontString","getFontString","size","textWidth","text","measureText","drawText","textAlign","textBaseline","fillText","drawTextOutline","strokeText","TriangleScreen","tri","x3","y3","trib","ttri","u3","v3","z1","z2","z3","canvasWidth","canvasHeight","toCanvasX","__name","toCanvasY","Screen","getInterface","screen","DEFAULT_RECORD_BUFFER_FRAMES","DEFAULT_LOOP_BUFFER_FRAMES","deepCopy","value","excluded","includes","Array","isArray","result","i","length","key","Object","hasOwn","StatePlayer","looping","loopStart","loopIndex","loopLength","loopCallback","isLooping","startLoop","position","callback","Math","max","stopLoop","updateLoop","executeCallback","restoreState","target","snapshot","isProtectedKey","protected_keys","StateRecorder","history","recordIndex","recordLength","maxLength","setExcluded","record","state","makeStorableState","min","getState","index","getLength","getMaxLength","clear","trimTo","histo","start","end","push","TimeMachine","runtime","recorder","player","recording","replayPosition","statusCallback","setupExclusions","vm","context","global","random","screen","audio","keyboard","mouse","touch","gamepad","system","storage","host","session","memory","step","sendStatus","err","listener","reportError","code","message","data","error","String","messageReceived","command","startRecording","stopRecording","stepBackward","stepForward","setReplayPosition","startLooping","stopLooping","replay","isFinite","pos","round","skipDraw","drawCall","updateCall","loopStep","onStatus","isRecording","JSONLib","encode","__name","value","JSON","stringify","error","decode","json","parse","pretty","indent","ListLib","map","arr","fn","filter","reduce","initial","find","findIndex","some","every","reverse","slice","sort","start","end","concat","arrays","flat","depth","flatMap","indexOf","item","fromIndex","lastIndexOf","includes","length","first","last","at","index","normalized","push","items","pop","shift","unshift","splice","deleteCount","fill","join","separator","unique","Set","shuffle","result","i","j","Math","floor","random","chunk","size","sum","average","min","max","MathLib","abs","x","sqrt","ceil","round","args","pow","base","exp","log","log10","sin","cos","tan","asin","acos","atan","atan2","y","randomInt","randomFloat","PI","E","clamp","lerp","a","b","t","distance","x1","y1","x2","y2","distance3D","z1","z2","angleBetween","degToRad","degrees","radToDeg","radians","sign","mod","n","m","StringLib","split","str","trim","trimStart","trimEnd","replace","search","replacement","replaceAll","startsWith","prefix","endsWith","suffix","contains","toLowerCase","toUpperCase","charAt","charCodeAt","fromCharCode","codes","String","substring","repeat","count","padStart","pad","padEnd","parseInt","radix","Number","isNaN","parseFloat","format","template","match","argIndex","Random","_seed","a","b","size","mask","norm","hash","Math","random","nextSeed","next","nextInt","num","floor","seed","clone","Token","tokenizer","type","value","string_value","line","column","start","length","index","reserved_keyword","is_binary_operator","token_start","TYPE_IDENTIFIER","Object","hasOwn","predefined","String","toString","TYPE_EQUALS","TYPE_DOUBLE_EQUALS","TYPE_GREATER","TYPE_GREATER_OR_EQUALS","TYPE_LOWER","TYPE_LOWER_OR_EQUALS","TYPE_UNEQUALS","TYPE_NUMBER","TYPE_STRING","TYPE_OPEN_BRACE","TYPE_CLOSED_BRACE","TYPE_OPEN_BRACKET","TYPE_CLOSED_BRACKET","TYPE_COMMA","TYPE_DOT","TYPE_COLON","TYPE_PLUS","TYPE_MINUS","TYPE_MULTIPLY","TYPE_DIVIDE","TYPE_POWER","TYPE_MODULO","TYPE_BINARY_AND","TYPE_BINARY_OR","TYPE_SHIFT_LEFT","TYPE_SHIFT_RIGHT","TYPE_PLUS_EQUALS","TYPE_MINUS_EQUALS","TYPE_MULTIPLY_EQUALS","TYPE_DIVIDE_EQUALS","TYPE_MODULO_EQUALS","TYPE_AND_EQUALS","TYPE_OR_EQUALS","TYPE_RETURN","TYPE_BREAK","TYPE_CONTINUE","TYPE_FUNCTION","TYPE_IF","TYPE_THEN","TYPE_ELSE","TYPE_ELSIF","TYPE_END","TYPE_FOR","TYPE_TO","TYPE_BY","TYPE_IN","TYPE_WHILE","TYPE_OBJECT","TYPE_CLASS","TYPE_EXTENDS","TYPE_NEW","TYPE_ARROW","TYPE_TEMPLATE","TYPE_AFTER","TYPE_EVERY","TYPE_DO","TYPE_SLEEP","TYPE_LOCAL","TYPE_AND","TYPE_OR","TYPE_NOT","TYPE_ERROR","TYPE_DELETE","return","break","continue","function","for","to","by","in","while","if","then","else","elsif","end","object","class","extends","new","and","or","not","after","every","do","sleep","delete","local","var","let","Tokenizer","input","filename","last_column","buffer","chars","doubles","shifts","letter_regex","pushBack","token","splice","peek","finished","nextChar","ignore_comments","c","endseq","charAt","rewind","code","charCodeAt","parseDouble","parseUnequals","parseNumber","test","parseIdentifier","parseString","error","changeNumberToIdentifier","i","v","results","split","push","undefined","d","c2","_c","s","exp","pointed","Number","parseFloat","parseHexNumber","parseInt","close","count_close","n","substring","Error","OPCODES_CLASS","table","set","op","TYPE","VARIABLE_TYPE","PROPERTY_TYPE","LOAD_IMPORT","LOAD_THIS","LOAD_GLOBAL","LOAD_VALUE","LOAD_LOCAL","LOAD_VARIABLE","LOAD_LOCAL_OBJECT","LOAD_VARIABLE_OBJECT","POP","LOAD_PROPERTY","LOAD_PROPERTY_OBJECT","CREATE_OBJECT","MAKE_OBJECT","CREATE_ARRAY","STORE_LOCAL","STORE_VARIABLE","CREATE_PROPERTY","STORE_PROPERTY","DELETE","UPDATE_CLASS","CREATE_CLASS","NEW_CALL","ADD","SUB","MUL","DIV","MODULO","BINARY_AND","BINARY_OR","SHIFT_LEFT","SHIFT_RIGHT","NEGATE","EQ","NEQ","LT","GT","LTE","GTE","NOT","LOAD_PROPERTY_ATOP","JUMP","JUMPY","JUMPN","JUMPY_NOPOP","JUMPN_NOPOP","LOAD_ROUTINE","FUNCTION_CALL","FUNCTION_APPLY_VARIABLE","FUNCTION_APPLY_PROPERTY","SUPER_CALL","RETURN","FORLOOP_INIT","FORLOOP_CONTROL","FORIN_INIT","FORIN_CONTROL","UNARY_OP","BINARY_OP","COMPILED","AFTER","EVERY","DO","SLEEP","LOAD_VAR_CALL","LOAD_PROP_CALL","LOAD_CONST_ADD","LOAD_CONST_SUB","LOAD_CONST_MUL","LOAD_LOCAL_ADD","LOAD_LOCAL_SUB","LOAD_LOCAL_MUL","LOAD_CONST_DIV","LOAD_LOCAL_LT","LOAD_LOCAL_GT","LOAD_LOCAL_EQ","OPCODES","Routine","num_args","ops","opcodes","arg1","ref","label_count","labels","transpile","import_refs","import_values","import_self","locals_size","uses_arguments","as_function","callback","source","ics","r","createLabel","str","setLabel","name","optimize","Transpiler","removeable","label","remove","resolveLabels","opcode","args","OP","v1","OP_INSERT","variable","parent_var","self","iterator","field","f","exportArg","arg","export","import","src","expression","Compiler","predefined_unary_functions","predefined_binary_functions","Array","isArray","Expression","nowarning","nopop","Program","statements","Field","Variable","Assignment","add","statement","isAssignment","nesting","key","pref","Precedence","CreateFieldAccess","appendField","BuildOperations","terms","o","o1","o2","t1","t2","operation","Operation","SelfAssignment","Value","TYPE_ARRAY","identifier","chain","term1","term2","Negate","Not","Braced","Return","Condition","For","range_from","range_to","range_by","sequence","ForIn","list","While","condition","Break","Continue","Function","FunctionCall","CreateObject","fields","CreateClass","ext","NewCall","After","delay","multiplier","Every","Do","Sleep","Delete","SyntaxErrorCode","E1001","E1002","E1004","ErrorCode","LootiScriptError","message","file","stackTrace","msg","LootiSyntaxError","context","suggestions","related","formatSourceContext","contextLines","errorLength","lines","startLine","max","endLine","min","lineNum","prefix","lineNumStr","padStart","lineContent","baseOffset","pointer","repeat","Parser","program","current_block","current","verbose","object_nesting","not_terminated","function_stack","api_reserved","warnings","unexpected_eof","error_info","last_function_call","multipliers","millisecond","milliseconds","second","seconds","minute","minutes","hour","hours","day","days","replace","screen","audio","keyboard","gamepad","sprites","sounds","music","assets","asset_manager","maps","touch","mouse","fonts","Sound","Image","Sprite","Map","system","storage","print","List","scenes","scene","route","router","nextToken","nextTokenOptional","parse","err","nt","parseLine","console","info","error1","functionName","functionStartLine","functionStartColumn","func","errorMessage","parseExpression","parseLocalAssignment","filter","first_function_call","access","parseExpressionStart","parseExpressionSuffix","assertExpression","assertBroadIdentifier","assert","parseFunctionCall","parseAssignment","parseSelfAssignment","parseBinaryOperation","parseNumberExpression","parseStringExpression","parseTemplate","parseIf","parseFor","parseWhile","parseBracedExpression","parseArray","parseFunction","parseObject","parseClass","parseNew","isInteger","parseAfter","parseEvery","parseDo","parseSleep","parseDelete","number","string","bracket","res","peekToken","assignedValue","funcToken","opStr","parseOptionalType","open","parseArrowFunction","arrow","funcArgs","default","body","brace_token","addTerminable","endTerminable","funk","parseFunctionArgs","funcInfo","pop","last","defaultExpr","warningAssignmentCondition","iftoken","parsedLine","text","fortoken","iter","parseSequence","whiletoken","start_token","tryParseMultiplier","parseBlock","keyword","endToken","do_token","del","raw","parts","indexOf","depth","inString","stringChar","char","exprSource","subParser","expr","result","routineAsFunction","runner","routine","ProcessorClass","main_thread","processor","proc","count","arguments","load","stack","stack_index","run","routineAsApplicableFunction","argToNative","IC_STATE","UNINITIALIZED","MONOMORPHIC","POLYMORPHIC","MEGAMORPHIC","MAX_POOL_SIZE","arrayPool","objectPool","getPooledArray","arr","recycleArray","getPooledObject","recycleObject","obj","resolveCallable","_routineAsApplicableFunction","dispatchBinaryOp","nativeStringOp","global","isFinite","fn","call","operatorAdd","operatorSub","operatorMul","operatorDiv","operatorBand","operatorBor","operatorModulo","operatorNegate","Processor","locals","call_stack","call_stack_frames","log","time_limit","done","local_index","op_index","call_stack_index","locals_offset","call_super","call_supername","metrics","profilingEnabled","_argv","POSITIVE_INFINITY","allocations","cacheHits","cacheMisses","reportNativeError","getArray","poolRecycleArray","getObject","poolRecycleObject","resetState","generateStackTrace","reverse","formatStackTrace","frames","map","frame","join","resolveParentClass","applyFunction","_args","resolvePropertyIC","prop","ic","state","shape","hits","misses","shapes","offsets","property","_routineAsFunction","_argToNative","argv","con","cs","fc","i1","i2","id","ir","j","k","l","len","loop_by","loop_to","m","op_count","p","parent","q","rc","ref2","ref3","ref5","ref6","ref8","ref9","ref11","ref12","ref14","restore_op_index","sleep_time","sup","t","u","w","profiling","using_undefined_variable","assigning_field_to_undefined","curr","super","supername","slice","performance","now","keys","apply","invoking_non_function","createThread","e","code_saves","break_label","continue_label","Locals","compile","optimizeFusedOpcodes","max_index","refs","varName","numArgs","val","localIdx","compileValue","compileOperation","compileAssignment","compileVariable","compileFunction","compileFunctionCall","compileWhile","compileSelfAssignment","compileBraced","compileCreateObject","compileField","compileNegate","compileFor","compileForIn","compileNot","compileReturn","compileCondition","compileBreak","compileContinue","compileCreateClass","compileNewCall","compileAfter","compileEvery","compileDo","compileSleep","compileDelete","arg_index","register","get","compileUpdateClass","jump","ref1","v2","pow","predefined_values","compileFieldParent","len1","len2","len3","len4","ref4","forloop","from","step","iterations","abs","iterValue","compileSequence","for_continue","for_end","for_start","save_break","save_continue","allocate","whiloop","compileFunctionBody","hasArgs","numargs","arguments_used","imports","imp","ret","condition_end","condition_next","formatField","dostuff","exec","round","ceil","sqrt","sin","cos","tan","acos","asin","atan","sind","__name","x","PI","cosd","tand","asind","acosd","atand","atan2","atan2d","y","true","false","compiler","layers","increment","spot","LocalLayer","start_index","registered","MAX_SAMPLES","VMProfiler","startTime","startOps","startAllocations","frameCount","sampleCount","totalOps","totalTime","totalAllocations","totalFrames","totalOpsPerSec","totalAvgFrameTime","stop","endTime","duration","currentOps","currentAllocations","opsPerSec","avgFrameTime","time","samples","getAverageMetrics","reset","Thread","loop","paused","terminated","next_calls","interface","start_time","sleep_until","pause","resume","status","addCall","loadNext","parser","updateControls","Runner","l8bvm","initialized","threads","current_thread","thread_index","fps","fps_max","cpu_load","triggers_controls_update","onNativeError","profiler","init","preemptive","getMetrics","meta","bind","MathLib","JSON","JSONLib","ListLib","StringLib","fromCharCode","assigning_api_variable","assignment_as_condition","tick","getFunctionSource","process","thread","dt","margin","processing","time_out","Infinity","writeIdx","dt_limit","isDevelopmentMode","runtime","globalThis","env","NODE_ENV","Bun","Stack","touched","vcount","variables","opcodeHandlers","NEW_OBJECT","NEW_ARRAY","transpilable","transpileSegment","comp","handler","idx","createVariable","_arg","StorageService","namespace","cache","Map","pendingWrites","writeTimer","runtime","preserve","localStorage","clear","get","name","trim","listener","reportError","code","message","has","key","value","getItem","parsed","JSON","parse","set","err","String","schedule","window","setTimeout","bind","flush","clearTimeout","serialized","stringify","sanitize","setItem","check","size","delete","removeItem","prefix","keysToRemove","i","length","startsWith","push","seen","WeakSet","undefined","add","Array","isArray","map","item","filter","result","Object","hasOwn","sanitized","interfaceCache","getInterface","__name","_baseMeta","round","__name","x","Math","floor","ceil","abs","min","y","max","sqrt","pow","sin","cos","tan","asin","acos","atan","atan2","sind","PI","cosd","tand","asind","acosd","atand","atan2d","log","exp","random","Random","true","false","_defaultPrint","text","console","createMetaFunctions","customPrint","print","createVMContext","meta","global","fullMeta","local","object","breakable","continuable","returnable","stack_size","timeout","Date","now","warnings","using_undefined_variable","assigning_field_to_undefined","invoking_non_function","assigning_api_variable","assignment_as_condition","setupArrayExtensions","Array","prototype","insert","element","splice","insertAt","index","length","push","remove","removeElement","indexOf","contains","sortList","fn","sort","extractErrorInfo","err","fallbackFile","fallbackType","runner","errorMessage","error","message","String","stackTrace","main_thread","processor","generateStackTrace","type","line","column","file","stack","L8BVM","context","storage_service","error_info","namespace","preserve_ls","StorageService","storage","getInterface","Runner","init","run","source","filename","result","check","undefined","toString","call","name","args","loadRoutine","routineData","routine","Routine","import","normalizeSerializedRoutine","addCall","tick","clearWarnings","getWarnings","value","isCompiledModuleArtifact","format","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","createState","__name","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","clientWidth","clientHeight","left","top","KeyboardInput","dirtyKeys","Set","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","test","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","prev","clear","reset","MouseInput","middle","right","wheel","previousPressed","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","onDown","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","passive","removeEventListener","wheelEvent","deltaY","wheelDelta","detail","TouchInput","touches","Map","previousTouching","mouse","syncMouseTouch","list","id","push","size","mouseState","set","delete","onStart","handleTouchStart","handleTouchMove","onEnd","handleTouchEnd","stopPropagation","changedTouches","t","identifier","has","Input","keyboard","touch","gamepad","runtime","getKeyboard","listener","reportError","message","data","error","getMouse","getTouch","getGamepad","device","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","formatRuntimeError","error","code","context","suggestions","formatted","message","String","reportError","listener","reportWarnings","vm","warnings","invoking_non_function","value","Object","values","warning","reported","type","expression","line","column","file","using_undefined_variable","RuntimeAssetsRegistry","collections","sprites","maps","sounds","music","assets","replace","getCollections","HEX_COLOR_REGEX","Palette","colors","name","rgbCache","runtime","options","Array","isArray","validatePaletteFormat","listener","reportError","code","message","data","format","Map","every","color","test","get","index","isFinite","maxIndex","length","getRGB","has","hex","rgb","hexToRGB","set","getAll","size","paletteName","push","delete","add","remove","splice","clear","setPalette","reset","paletteData","result","exec","r","Number","parseInt","g","b","rgbToHex","toString","slice","toUpperCase","findClosest","targetHex","target","closestIndex","closestDistance","POSITIVE_INFINITY","i","distance","gradient","startIndex","endIndex","steps","start","end","t","Math","round","lighten","amount","min","darken","max","mix","index1","index2","ratio","color1","color2","toData","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","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","value","Date","Array","isArray","map","entry","clone","key","Object","entries","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","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","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","version","serializeGlobalSnapshot","session","updateRate","snapshot","restoreState","updateGameLoopUpdateRate","updateSource","file","src","reinit","handleMessage","type","sendHostEvent","name","messageReceived","event","handleHostEvent","collections","loadAll","replace","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","compiledRoutines","files","routine","entries","loadRoutine","err","reportError","error","String","stack","call","runner","tick","GameLoop","onUpdate","handleUpdate","onDraw","handleDraw","onTick","handleTick","onWatchStep","handleWatchStep","undefined","setFPS","Number","isFinite","update","debugInputs","debug","debugScreen","getFPS","error_info","assign","initDraw","updateInterface","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","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","deepClone","value","structuredClone","JSON","parse","stringify","shallowEqual","a","b","aObj","bObj","aKeys","Object","keys","bKeys","length","key"]}