@vgai/engine 0.5.0-canary.20260719.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/dist/adapter/adapter-surface.d.ts +30 -0
  2. package/dist/adapter/adapter-surface.d.ts.map +1 -0
  3. package/dist/adapter/adapter-surface.js +18 -0
  4. package/dist/adapter/authoring.d.ts +461 -0
  5. package/dist/adapter/authoring.d.ts.map +1 -0
  6. package/dist/adapter/authoring.js +22 -0
  7. package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
  8. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
  9. package/dist/adapter/colyseus-networking-adapter.js +38 -0
  10. package/dist/adapter/first-party-systems.d.ts +38 -0
  11. package/dist/adapter/first-party-systems.d.ts.map +1 -0
  12. package/dist/adapter/first-party-systems.js +77 -0
  13. package/dist/adapter/game-adapter.d.ts +133 -0
  14. package/dist/adapter/game-adapter.d.ts.map +1 -0
  15. package/dist/adapter/game-adapter.js +10 -0
  16. package/dist/adapter/host-context.d.ts +71 -0
  17. package/dist/adapter/host-context.d.ts.map +1 -0
  18. package/dist/adapter/host-context.js +16 -0
  19. package/dist/adapter/index.d.ts +22 -0
  20. package/dist/adapter/index.d.ts.map +1 -0
  21. package/dist/adapter/index.js +15 -0
  22. package/dist/adapter/ingest/game-contract.d.ts +53 -0
  23. package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
  24. package/dist/adapter/ingest/game-contract.js +30 -0
  25. package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
  26. package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
  27. package/dist/adapter/ingest/overlay-applier.js +132 -0
  28. package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
  29. package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
  30. package/dist/adapter/ingest/overlay-apply.js +101 -0
  31. package/dist/adapter/ingest/overlay-file.d.ts +79 -0
  32. package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
  33. package/dist/adapter/ingest/overlay-file.js +66 -0
  34. package/dist/adapter/ingest/overlay-report.d.ts +113 -0
  35. package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
  36. package/dist/adapter/ingest/overlay-report.js +103 -0
  37. package/dist/adapter/ingest/scene-capture.d.ts +97 -0
  38. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
  39. package/dist/adapter/ingest/scene-capture.js +248 -0
  40. package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
  41. package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
  42. package/dist/adapter/ingest/upstream-pin.js +50 -0
  43. package/dist/adapter/loop-gate-report.d.ts +34 -0
  44. package/dist/adapter/loop-gate-report.d.ts.map +1 -0
  45. package/dist/adapter/loop-gate-report.js +37 -0
  46. package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
  47. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
  48. package/dist/adapter/rapier-physics-adapter.js +46 -0
  49. package/dist/adapter/system-adapter.d.ts +206 -0
  50. package/dist/adapter/system-adapter.d.ts.map +1 -0
  51. package/dist/adapter/system-adapter.js +13 -0
  52. package/dist/adapter/transform.d.ts +18 -0
  53. package/dist/adapter/transform.d.ts.map +1 -0
  54. package/dist/adapter/transform.js +1 -0
  55. package/dist/adapter/vgai-scene-game-adapter.d.ts +108 -0
  56. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
  57. package/dist/adapter/vgai-scene-game-adapter.js +762 -0
  58. package/dist/ai/navigation.d.ts +64 -0
  59. package/dist/ai/navigation.d.ts.map +1 -0
  60. package/dist/ai/navigation.js +133 -0
  61. package/dist/animation/anim-graph-types.d.ts +25 -0
  62. package/dist/animation/anim-graph-types.d.ts.map +1 -0
  63. package/dist/animation/anim-graph-types.js +1 -0
  64. package/dist/animation/animation-clock.d.ts +213 -0
  65. package/dist/animation/animation-clock.d.ts.map +1 -0
  66. package/dist/animation/animation-clock.js +301 -0
  67. package/dist/animation/blend-node.d.ts +22 -0
  68. package/dist/animation/blend-node.d.ts.map +1 -0
  69. package/dist/animation/blend-node.js +97 -0
  70. package/dist/animation/camera-ownership.d.ts +250 -0
  71. package/dist/animation/camera-ownership.d.ts.map +1 -0
  72. package/dist/animation/camera-ownership.js +169 -0
  73. package/dist/animation/cinematic-cues.d.ts +200 -0
  74. package/dist/animation/cinematic-cues.d.ts.map +1 -0
  75. package/dist/animation/cinematic-cues.js +213 -0
  76. package/dist/animation/clip-map.d.ts +12 -0
  77. package/dist/animation/clip-map.d.ts.map +1 -0
  78. package/dist/animation/clip-map.js +37 -0
  79. package/dist/animation/gsap-registration.d.ts +119 -0
  80. package/dist/animation/gsap-registration.d.ts.map +1 -0
  81. package/dist/animation/gsap-registration.js +92 -0
  82. package/dist/animation/theatre-clock-binding.d.ts +89 -0
  83. package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
  84. package/dist/animation/theatre-clock-binding.js +29 -0
  85. package/dist/animation/theatre-director.d.ts +242 -0
  86. package/dist/animation/theatre-director.d.ts.map +1 -0
  87. package/dist/animation/theatre-director.js +235 -0
  88. package/dist/animation/theatre-object-binding.d.ts +305 -0
  89. package/dist/animation/theatre-object-binding.d.ts.map +1 -0
  90. package/dist/animation/theatre-object-binding.js +351 -0
  91. package/dist/animation/xstate-animation-binding.d.ts +56 -0
  92. package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
  93. package/dist/animation/xstate-animation-binding.js +331 -0
  94. package/dist/animation/xstate-animation-meta.d.ts +266 -0
  95. package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
  96. package/dist/animation/xstate-animation-meta.js +252 -0
  97. package/dist/assets.d.ts +26 -0
  98. package/dist/assets.d.ts.map +1 -0
  99. package/dist/assets.js +55 -0
  100. package/dist/audio/index.d.ts +4 -0
  101. package/dist/audio/index.d.ts.map +1 -0
  102. package/dist/audio/index.js +24 -0
  103. package/dist/audio/tone-clock-binding.d.ts +75 -0
  104. package/dist/audio/tone-clock-binding.d.ts.map +1 -0
  105. package/dist/audio/tone-clock-binding.js +29 -0
  106. package/dist/audio/tone-context.d.ts +114 -0
  107. package/dist/audio/tone-context.d.ts.map +1 -0
  108. package/dist/audio/tone-context.js +39 -0
  109. package/dist/audio/tone-offline-render.d.ts +90 -0
  110. package/dist/audio/tone-offline-render.d.ts.map +1 -0
  111. package/dist/audio/tone-offline-render.js +56 -0
  112. package/dist/audio/wav-encode.d.ts +38 -0
  113. package/dist/audio/wav-encode.d.ts.map +1 -0
  114. package/dist/audio/wav-encode.js +97 -0
  115. package/dist/character/cloth-sim.d.ts +179 -0
  116. package/dist/character/cloth-sim.d.ts.map +1 -0
  117. package/dist/character/cloth-sim.js +334 -0
  118. package/dist/character/spring-chain.d.ts +135 -0
  119. package/dist/character/spring-chain.d.ts.map +1 -0
  120. package/dist/character/spring-chain.js +165 -0
  121. package/dist/core/game-loop.d.ts +42 -0
  122. package/dist/core/game-loop.d.ts.map +1 -0
  123. package/dist/core/game-loop.js +167 -0
  124. package/dist/core/seeded-random.d.ts +69 -0
  125. package/dist/core/seeded-random.d.ts.map +1 -0
  126. package/dist/core/seeded-random.js +121 -0
  127. package/dist/core/system-runner.d.ts +120 -0
  128. package/dist/core/system-runner.d.ts.map +1 -0
  129. package/dist/core/system-runner.js +297 -0
  130. package/dist/core/types.d.ts +92 -0
  131. package/dist/core/types.d.ts.map +1 -0
  132. package/dist/core/types.js +25 -0
  133. package/dist/data/data-asset.d.ts +101 -0
  134. package/dist/data/data-asset.d.ts.map +1 -0
  135. package/dist/data/data-asset.js +122 -0
  136. package/dist/data/data-check-core.d.ts +110 -0
  137. package/dist/data/data-check-core.d.ts.map +1 -0
  138. package/dist/data/data-check-core.js +178 -0
  139. package/dist/data/data-ref.d.ts +79 -0
  140. package/dist/data/data-ref.d.ts.map +1 -0
  141. package/dist/data/data-ref.js +130 -0
  142. package/dist/data/vite-plugin-data.d.ts +79 -0
  143. package/dist/data/vite-plugin-data.d.ts.map +1 -0
  144. package/dist/data/vite-plugin-data.js +217 -0
  145. package/dist/dev/console-bridge.d.ts +22 -0
  146. package/dist/dev/console-bridge.d.ts.map +1 -0
  147. package/dist/dev/console-bridge.js +71 -0
  148. package/dist/dev/debug-draw.d.ts +24 -0
  149. package/dist/dev/debug-draw.d.ts.map +1 -0
  150. package/dist/dev/debug-draw.js +73 -0
  151. package/dist/dev/logger.d.ts +30 -0
  152. package/dist/dev/logger.d.ts.map +1 -0
  153. package/dist/dev/logger.js +90 -0
  154. package/dist/dev/performance-profiler.d.ts +60 -0
  155. package/dist/dev/performance-profiler.d.ts.map +1 -0
  156. package/dist/dev/performance-profiler.js +181 -0
  157. package/dist/dev/webgl-gpu-timer.d.ts +8 -0
  158. package/dist/dev/webgl-gpu-timer.d.ts.map +1 -0
  159. package/dist/dev/webgl-gpu-timer.js +52 -0
  160. package/dist/ecs/component-manager.d.ts +205 -0
  161. package/dist/ecs/component-manager.d.ts.map +1 -0
  162. package/dist/ecs/component-manager.js +706 -0
  163. package/dist/ecs/game-component.d.ts +146 -0
  164. package/dist/ecs/game-component.d.ts.map +1 -0
  165. package/dist/ecs/game-component.js +141 -0
  166. package/dist/ecs/hmr-swap-report.d.ts +53 -0
  167. package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
  168. package/dist/ecs/hmr-swap-report.js +55 -0
  169. package/dist/humanoid/bake.operation.d.ts +119 -0
  170. package/dist/humanoid/bake.operation.d.ts.map +1 -0
  171. package/dist/humanoid/bake.operation.js +228 -0
  172. package/dist/humanoid/body.d.ts +101 -0
  173. package/dist/humanoid/body.d.ts.map +1 -0
  174. package/dist/humanoid/body.js +530 -0
  175. package/dist/humanoid/clips.d.ts +62 -0
  176. package/dist/humanoid/clips.d.ts.map +1 -0
  177. package/dist/humanoid/clips.js +121 -0
  178. package/dist/humanoid/compose.d.ts +75 -0
  179. package/dist/humanoid/compose.d.ts.map +1 -0
  180. package/dist/humanoid/compose.js +176 -0
  181. package/dist/humanoid/generate.d.ts +92 -0
  182. package/dist/humanoid/generate.d.ts.map +1 -0
  183. package/dist/humanoid/generate.js +124 -0
  184. package/dist/humanoid/index.d.ts +24 -0
  185. package/dist/humanoid/index.d.ts.map +1 -0
  186. package/dist/humanoid/index.js +18 -0
  187. package/dist/humanoid/schema.d.ts +35 -0
  188. package/dist/humanoid/schema.d.ts.map +1 -0
  189. package/dist/humanoid/schema.js +87 -0
  190. package/dist/humanoid/skeleton.d.ts +103 -0
  191. package/dist/humanoid/skeleton.d.ts.map +1 -0
  192. package/dist/humanoid/skeleton.js +289 -0
  193. package/dist/index.d.ts +37 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +30 -0
  196. package/dist/input/input-manager.d.ts +945 -0
  197. package/dist/input/input-manager.d.ts.map +1 -0
  198. package/dist/input/input-manager.js +2207 -0
  199. package/dist/input/input-types.d.ts +174 -0
  200. package/dist/input/input-types.d.ts.map +1 -0
  201. package/dist/input/input-types.js +1 -0
  202. package/dist/input/prompt-labels.d.ts +21 -0
  203. package/dist/input/prompt-labels.d.ts.map +1 -0
  204. package/dist/input/prompt-labels.js +121 -0
  205. package/dist/input/rebind-controller.d.ts +59 -0
  206. package/dist/input/rebind-controller.d.ts.map +1 -0
  207. package/dist/input/rebind-controller.js +85 -0
  208. package/dist/input/schema.d.ts +16 -0
  209. package/dist/input/schema.d.ts.map +1 -0
  210. package/dist/input/schema.js +228 -0
  211. package/dist/loader.d.ts +43 -0
  212. package/dist/loader.d.ts.map +1 -0
  213. package/dist/loader.js +59 -0
  214. package/dist/manifest/index.d.ts +5 -0
  215. package/dist/manifest/index.d.ts.map +1 -0
  216. package/dist/manifest/index.js +8 -0
  217. package/dist/manifest/load-file.d.ts +4 -0
  218. package/dist/manifest/load-file.d.ts.map +1 -0
  219. package/dist/manifest/load-file.js +14 -0
  220. package/dist/manifest/load.d.ts +144 -0
  221. package/dist/manifest/load.d.ts.map +1 -0
  222. package/dist/manifest/load.js +273 -0
  223. package/dist/manifest/schema.d.ts +230 -0
  224. package/dist/manifest/schema.d.ts.map +1 -0
  225. package/dist/manifest/schema.js +394 -0
  226. package/dist/physics/collision-system.d.ts +41 -0
  227. package/dist/physics/collision-system.d.ts.map +1 -0
  228. package/dist/physics/collision-system.js +64 -0
  229. package/dist/physics/physics-registry.d.ts +45 -0
  230. package/dist/physics/physics-registry.d.ts.map +1 -0
  231. package/dist/physics/physics-registry.js +65 -0
  232. package/dist/physics/transform-writer.d.ts +16 -0
  233. package/dist/physics/transform-writer.d.ts.map +1 -0
  234. package/dist/physics/transform-writer.js +38 -0
  235. package/dist/physics/trigger-dispatch.d.ts +24 -0
  236. package/dist/physics/trigger-dispatch.d.ts.map +1 -0
  237. package/dist/physics/trigger-dispatch.js +80 -0
  238. package/dist/react/game-state.d.ts +156 -0
  239. package/dist/react/game-state.d.ts.map +1 -0
  240. package/dist/react/game-state.js +222 -0
  241. package/dist/react/root-adapter.d.ts +11 -0
  242. package/dist/react/root-adapter.d.ts.map +1 -0
  243. package/dist/react/root-adapter.js +41 -0
  244. package/dist/react/unmanaged-root-detector.d.ts +12 -0
  245. package/dist/react/unmanaged-root-detector.d.ts.map +1 -0
  246. package/dist/react/unmanaged-root-detector.js +45 -0
  247. package/dist/react/use-data.d.ts +60 -0
  248. package/dist/react/use-data.d.ts.map +1 -0
  249. package/dist/react/use-data.js +101 -0
  250. package/dist/react/use-selection.d.ts +75 -0
  251. package/dist/react/use-selection.d.ts.map +1 -0
  252. package/dist/react/use-selection.js +90 -0
  253. package/dist/render/auto-batcher.d.ts +34 -0
  254. package/dist/render/auto-batcher.d.ts.map +1 -0
  255. package/dist/render/auto-batcher.js +140 -0
  256. package/dist/render/render-batch-system.d.ts +33 -0
  257. package/dist/render/render-batch-system.d.ts.map +1 -0
  258. package/dist/render/render-batch-system.js +230 -0
  259. package/dist/render/render-features.d.ts +47 -0
  260. package/dist/render/render-features.d.ts.map +1 -0
  261. package/dist/render/render-features.js +105 -0
  262. package/dist/render/render-settings.d.ts +36 -0
  263. package/dist/render/render-settings.d.ts.map +1 -0
  264. package/dist/render/render-settings.js +51 -0
  265. package/dist/runtime/create-runtime.d.ts +249 -0
  266. package/dist/runtime/create-runtime.d.ts.map +1 -0
  267. package/dist/runtime/create-runtime.js +641 -0
  268. package/dist/runtime/debug-bridge.d.ts +257 -0
  269. package/dist/runtime/debug-bridge.d.ts.map +1 -0
  270. package/dist/runtime/debug-bridge.js +224 -0
  271. package/dist/runtime/debug-registry.d.ts +288 -0
  272. package/dist/runtime/debug-registry.d.ts.map +1 -0
  273. package/dist/runtime/debug-registry.js +513 -0
  274. package/dist/runtime/frame-selector-cache.d.ts +41 -0
  275. package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
  276. package/dist/runtime/frame-selector-cache.js +65 -0
  277. package/dist/runtime/game.d.ts +496 -0
  278. package/dist/runtime/game.d.ts.map +1 -0
  279. package/dist/runtime/game.js +741 -0
  280. package/dist/runtime/gameplay-rng-trap.d.ts +48 -0
  281. package/dist/runtime/gameplay-rng-trap.d.ts.map +1 -0
  282. package/dist/runtime/gameplay-rng-trap.js +96 -0
  283. package/dist/runtime/input-router.d.ts +78 -0
  284. package/dist/runtime/input-router.d.ts.map +1 -0
  285. package/dist/runtime/input-router.js +171 -0
  286. package/dist/runtime/mount-game.d.ts +129 -0
  287. package/dist/runtime/mount-game.d.ts.map +1 -0
  288. package/dist/runtime/mount-game.js +152 -0
  289. package/dist/runtime/mount-manifest.d.ts +173 -0
  290. package/dist/runtime/mount-manifest.d.ts.map +1 -0
  291. package/dist/runtime/mount-manifest.js +297 -0
  292. package/dist/runtime/render-audio-control.d.ts +110 -0
  293. package/dist/runtime/render-audio-control.d.ts.map +1 -0
  294. package/dist/runtime/render-audio-control.js +111 -0
  295. package/dist/runtime/render-control.d.ts +291 -0
  296. package/dist/runtime/render-control.d.ts.map +1 -0
  297. package/dist/runtime/render-control.js +264 -0
  298. package/dist/runtime/render-seed.d.ts +57 -0
  299. package/dist/runtime/render-seed.d.ts.map +1 -0
  300. package/dist/runtime/render-seed.js +74 -0
  301. package/dist/runtime/state-bridge.d.ts +61 -0
  302. package/dist/runtime/state-bridge.d.ts.map +1 -0
  303. package/dist/runtime/state-bridge.js +63 -0
  304. package/dist/runtime/types.d.ts +253 -0
  305. package/dist/runtime/types.d.ts.map +1 -0
  306. package/dist/runtime/types.js +1 -0
  307. package/dist/scene/asset-loaders.d.ts +79 -0
  308. package/dist/scene/asset-loaders.d.ts.map +1 -0
  309. package/dist/scene/asset-loaders.js +141 -0
  310. package/dist/scene/asset-paths.d.ts +11 -0
  311. package/dist/scene/asset-paths.d.ts.map +1 -0
  312. package/dist/scene/asset-paths.js +108 -0
  313. package/dist/scene/asset-ref-check.d.ts +88 -0
  314. package/dist/scene/asset-ref-check.d.ts.map +1 -0
  315. package/dist/scene/asset-ref-check.js +214 -0
  316. package/dist/scene/asset-registry.d.ts +38 -0
  317. package/dist/scene/asset-registry.d.ts.map +1 -0
  318. package/dist/scene/asset-registry.js +66 -0
  319. package/dist/scene/collider-dimensions.d.ts +63 -0
  320. package/dist/scene/collider-dimensions.d.ts.map +1 -0
  321. package/dist/scene/collider-dimensions.js +98 -0
  322. package/dist/scene/component-registry.d.ts +22 -0
  323. package/dist/scene/component-registry.d.ts.map +1 -0
  324. package/dist/scene/component-registry.js +37 -0
  325. package/dist/scene/defaults.d.ts +252 -0
  326. package/dist/scene/defaults.d.ts.map +1 -0
  327. package/dist/scene/defaults.js +151 -0
  328. package/dist/scene/geometries/index.d.ts +8 -0
  329. package/dist/scene/geometries/index.d.ts.map +1 -0
  330. package/dist/scene/geometries/index.js +7 -0
  331. package/dist/scene/geometries/terrain.d.ts +2 -0
  332. package/dist/scene/geometries/terrain.d.ts.map +1 -0
  333. package/dist/scene/geometries/terrain.js +37 -0
  334. package/dist/scene/geometry-registry.d.ts +24 -0
  335. package/dist/scene/geometry-registry.d.ts.map +1 -0
  336. package/dist/scene/geometry-registry.js +20 -0
  337. package/dist/scene/instance-registry.d.ts +36 -0
  338. package/dist/scene/instance-registry.d.ts.map +1 -0
  339. package/dist/scene/instance-registry.js +55 -0
  340. package/dist/scene/instancers/grid.d.ts +2 -0
  341. package/dist/scene/instancers/grid.d.ts.map +1 -0
  342. package/dist/scene/instancers/grid.js +36 -0
  343. package/dist/scene/instancers/index.d.ts +8 -0
  344. package/dist/scene/instancers/index.d.ts.map +1 -0
  345. package/dist/scene/instancers/index.js +7 -0
  346. package/dist/scene/light-camera-factory.d.ts +23 -0
  347. package/dist/scene/light-camera-factory.d.ts.map +1 -0
  348. package/dist/scene/light-camera-factory.js +68 -0
  349. package/dist/scene/material-factory.d.ts +17 -0
  350. package/dist/scene/material-factory.d.ts.map +1 -0
  351. package/dist/scene/material-factory.js +197 -0
  352. package/dist/scene/material-registry.d.ts +40 -0
  353. package/dist/scene/material-registry.d.ts.map +1 -0
  354. package/dist/scene/material-registry.js +44 -0
  355. package/dist/scene/materials/index.d.ts +8 -0
  356. package/dist/scene/materials/index.d.ts.map +1 -0
  357. package/dist/scene/materials/index.js +7 -0
  358. package/dist/scene/materials/water.d.ts +2 -0
  359. package/dist/scene/materials/water.d.ts.map +1 -0
  360. package/dist/scene/materials/water.js +54 -0
  361. package/dist/scene/parse.d.ts +23 -0
  362. package/dist/scene/parse.d.ts.map +1 -0
  363. package/dist/scene/parse.js +179 -0
  364. package/dist/scene/particles-factory.d.ts +33 -0
  365. package/dist/scene/particles-factory.d.ts.map +1 -0
  366. package/dist/scene/particles-factory.js +282 -0
  367. package/dist/scene/scene-apply.d.ts +109 -0
  368. package/dist/scene/scene-apply.d.ts.map +1 -0
  369. package/dist/scene/scene-apply.js +370 -0
  370. package/dist/scene/scene-diff-schema.d.ts +285 -0
  371. package/dist/scene/scene-diff-schema.d.ts.map +1 -0
  372. package/dist/scene/scene-diff-schema.js +92 -0
  373. package/dist/scene/scene-diff-types.d.ts +40 -0
  374. package/dist/scene/scene-diff-types.d.ts.map +1 -0
  375. package/dist/scene/scene-diff-types.js +14 -0
  376. package/dist/scene/scene-loader.d.ts +167 -0
  377. package/dist/scene/scene-loader.d.ts.map +1 -0
  378. package/dist/scene/scene-loader.js +1211 -0
  379. package/dist/scene/scene-query.d.ts +11 -0
  380. package/dist/scene/scene-query.d.ts.map +1 -0
  381. package/dist/scene/scene-query.js +63 -0
  382. package/dist/scene/scene-types.d.ts +10 -0
  383. package/dist/scene/scene-types.d.ts.map +1 -0
  384. package/dist/scene/scene-types.js +8 -0
  385. package/dist/scene/scene-version.d.ts +26 -0
  386. package/dist/scene/scene-version.d.ts.map +1 -0
  387. package/dist/scene/scene-version.js +34 -0
  388. package/dist/scene/schema/animation.d.ts +8 -0
  389. package/dist/scene/schema/animation.d.ts.map +1 -0
  390. package/dist/scene/schema/animation.js +42 -0
  391. package/dist/scene/schema/audio.d.ts +13 -0
  392. package/dist/scene/schema/audio.d.ts.map +1 -0
  393. package/dist/scene/schema/audio.js +22 -0
  394. package/dist/scene/schema/camera.d.ts +28 -0
  395. package/dist/scene/schema/camera.d.ts.map +1 -0
  396. package/dist/scene/schema/camera.js +17 -0
  397. package/dist/scene/schema/collider.d.ts +40 -0
  398. package/dist/scene/schema/collider.d.ts.map +1 -0
  399. package/dist/scene/schema/collider.js +55 -0
  400. package/dist/scene/schema/entity-ref.d.ts +31 -0
  401. package/dist/scene/schema/entity-ref.d.ts.map +1 -0
  402. package/dist/scene/schema/entity-ref.js +61 -0
  403. package/dist/scene/schema/entity.d.ts +1036 -0
  404. package/dist/scene/schema/entity.d.ts.map +1 -0
  405. package/dist/scene/schema/entity.js +153 -0
  406. package/dist/scene/schema/environment.d.ts +425 -0
  407. package/dist/scene/schema/environment.d.ts.map +1 -0
  408. package/dist/scene/schema/environment.js +357 -0
  409. package/dist/scene/schema/index.d.ts +37 -0
  410. package/dist/scene/schema/index.d.ts.map +1 -0
  411. package/dist/scene/schema/index.js +19 -0
  412. package/dist/scene/schema/instances.d.ts +14 -0
  413. package/dist/scene/schema/instances.d.ts.map +1 -0
  414. package/dist/scene/schema/instances.js +28 -0
  415. package/dist/scene/schema/joint.d.ts +23 -0
  416. package/dist/scene/schema/joint.d.ts.map +1 -0
  417. package/dist/scene/schema/joint.js +23 -0
  418. package/dist/scene/schema/light.d.ts +38 -0
  419. package/dist/scene/schema/light.d.ts.map +1 -0
  420. package/dist/scene/schema/light.js +26 -0
  421. package/dist/scene/schema/material.d.ts +199 -0
  422. package/dist/scene/schema/material.d.ts.map +1 -0
  423. package/dist/scene/schema/material.js +103 -0
  424. package/dist/scene/schema/mesh.d.ts +48 -0
  425. package/dist/scene/schema/mesh.d.ts.map +1 -0
  426. package/dist/scene/schema/mesh.js +82 -0
  427. package/dist/scene/schema/particles.d.ts +2178 -0
  428. package/dist/scene/schema/particles.d.ts.map +1 -0
  429. package/dist/scene/schema/particles.js +321 -0
  430. package/dist/scene/schema/physics.d.ts +56 -0
  431. package/dist/scene/schema/physics.d.ts.map +1 -0
  432. package/dist/scene/schema/physics.js +37 -0
  433. package/dist/scene/schema/scene-file.d.ts +303 -0
  434. package/dist/scene/schema/scene-file.d.ts.map +1 -0
  435. package/dist/scene/schema/scene-file.js +256 -0
  436. package/dist/scene/schema/shadow.d.ts +28 -0
  437. package/dist/scene/schema/shadow.d.ts.map +1 -0
  438. package/dist/scene/schema/shadow.js +20 -0
  439. package/dist/scene/schema/spline.d.ts +25 -0
  440. package/dist/scene/schema/spline.d.ts.map +1 -0
  441. package/dist/scene/schema/spline.js +15 -0
  442. package/dist/scene/schema/tuples.d.ts +12 -0
  443. package/dist/scene/schema/tuples.d.ts.map +1 -0
  444. package/dist/scene/schema/tuples.js +14 -0
  445. package/dist/scene/user-data.d.ts +185 -0
  446. package/dist/scene/user-data.d.ts.map +1 -0
  447. package/dist/scene/user-data.js +144 -0
  448. package/dist/setup/setup-audio.d.ts +20 -0
  449. package/dist/setup/setup-audio.d.ts.map +1 -0
  450. package/dist/setup/setup-audio.js +41 -0
  451. package/dist/setup/setup-particles.d.ts +17 -0
  452. package/dist/setup/setup-particles.d.ts.map +1 -0
  453. package/dist/setup/setup-particles.js +16 -0
  454. package/dist/setup/setup-physics.d.ts +25 -0
  455. package/dist/setup/setup-physics.d.ts.map +1 -0
  456. package/dist/setup/setup-physics.js +51 -0
  457. package/dist/setup/setup-renderer.d.ts +69 -0
  458. package/dist/setup/setup-renderer.d.ts.map +1 -0
  459. package/dist/setup/setup-renderer.js +363 -0
  460. package/dist/tools/define-tool.d.ts +130 -0
  461. package/dist/tools/define-tool.d.ts.map +1 -0
  462. package/dist/tools/define-tool.js +96 -0
  463. package/dist/world2d/authoring-2d.d.ts +80 -0
  464. package/dist/world2d/authoring-2d.d.ts.map +1 -0
  465. package/dist/world2d/authoring-2d.js +195 -0
  466. package/dist/world2d/capture-to-scene2d.d.ts +5 -0
  467. package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
  468. package/dist/world2d/capture-to-scene2d.js +49 -0
  469. package/dist/world2d/collision-2d.d.ts +52 -0
  470. package/dist/world2d/collision-2d.d.ts.map +1 -0
  471. package/dist/world2d/collision-2d.js +70 -0
  472. package/dist/world2d/components-2d.d.ts +47 -0
  473. package/dist/world2d/components-2d.d.ts.map +1 -0
  474. package/dist/world2d/components-2d.js +77 -0
  475. package/dist/world2d/index.d.ts +34 -0
  476. package/dist/world2d/index.d.ts.map +1 -0
  477. package/dist/world2d/index.js +32 -0
  478. package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
  479. package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
  480. package/dist/world2d/ingest-iframe-2d.js +166 -0
  481. package/dist/world2d/ingest2d.d.ts +97 -0
  482. package/dist/world2d/ingest2d.d.ts.map +1 -0
  483. package/dist/world2d/ingest2d.js +40 -0
  484. package/dist/world2d/physics2d-registry.d.ts +24 -0
  485. package/dist/world2d/physics2d-registry.d.ts.map +1 -0
  486. package/dist/world2d/physics2d-registry.js +38 -0
  487. package/dist/world2d/pixi-game-adapter.d.ts +107 -0
  488. package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
  489. package/dist/world2d/pixi-game-adapter.js +210 -0
  490. package/dist/world2d/pixi-surface.d.ts +39 -0
  491. package/dist/world2d/pixi-surface.d.ts.map +1 -0
  492. package/dist/world2d/pixi-surface.js +47 -0
  493. package/dist/world2d/scene-capture-2d.d.ts +43 -0
  494. package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
  495. package/dist/world2d/scene-capture-2d.js +92 -0
  496. package/dist/world2d/scene2d-loader.d.ts +27 -0
  497. package/dist/world2d/scene2d-loader.d.ts.map +1 -0
  498. package/dist/world2d/scene2d-loader.js +275 -0
  499. package/dist/world2d/schema/entity2d.d.ts +102 -0
  500. package/dist/world2d/schema/entity2d.d.ts.map +1 -0
  501. package/dist/world2d/schema/entity2d.js +119 -0
  502. package/dist/world2d/schema/physics2d.d.ts +46 -0
  503. package/dist/world2d/schema/physics2d.d.ts.map +1 -0
  504. package/dist/world2d/schema/physics2d.js +45 -0
  505. package/dist/world2d/schema/sprite.d.ts +42 -0
  506. package/dist/world2d/schema/sprite.d.ts.map +1 -0
  507. package/dist/world2d/schema/sprite.js +63 -0
  508. package/dist/world2d/schema/tilemap.d.ts +15 -0
  509. package/dist/world2d/schema/tilemap.d.ts.map +1 -0
  510. package/dist/world2d/schema/tilemap.js +19 -0
  511. package/dist/world2d/schema/tuples2d.d.ts +20 -0
  512. package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
  513. package/dist/world2d/schema/tuples2d.js +19 -0
  514. package/dist/world2d/system-adapters-2d.d.ts +16 -0
  515. package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
  516. package/dist/world2d/system-adapters-2d.js +37 -0
  517. package/dist/world2d/transform-writer-2d.d.ts +16 -0
  518. package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
  519. package/dist/world2d/transform-writer-2d.js +22 -0
  520. package/dist/world2d/types.d.ts +59 -0
  521. package/dist/world2d/types.d.ts.map +1 -0
  522. package/dist/world2d/types.js +1 -0
  523. package/package.json +1 -1
  524. package/schemas/vgai-game.schema.json +63 -0
  525. package/src/manifest/load.ts +7 -0
  526. package/src/manifest/schema.ts +58 -0
  527. package/src/world3d-react/r3f-adapter.tsx +8 -8
@@ -0,0 +1,42 @@
1
+ import type { GameLoopConfig, GameLoopLiveness } from './types';
2
+ /**
3
+ * Fixed-timestep game loop with accumulator pattern.
4
+ *
5
+ * Physics/logic run at a fixed rate (default 60 Hz) regardless of display
6
+ * frame rate. Rendering is deliberately fixed-rate too (decided — D1, see
7
+ * `docs/DECISIONS-PENDING.md`): `config.update(fixedDt)` runs once per
8
+ * consumed substep, and per the documented phase order (`PHASE_ORDER` in
9
+ * `core/types.ts`) the `render` phase executes as the last phase of that
10
+ * same call — there is no separate per-real-frame render step and no
11
+ * display-refresh interpolation. A frame whose accumulator produces zero
12
+ * substeps therefore calls `update` zero times and renders zero times; do
13
+ * not reintroduce a render call outside the substep loop below.
14
+ */
15
+ export declare function createGameLoop(config: GameLoopConfig): {
16
+ start(): void;
17
+ stop(): void;
18
+ readonly isRunning: boolean;
19
+ /**
20
+ * Truthful liveness (issue #175 — see `GameLoopLiveness`'s doc comment
21
+ * in `core/types.ts` for the full contract). Unlike `isRunning` above,
22
+ * this DISTINGUISHES a hidden-tab pause from an actually-stopped loop:
23
+ * `hiddenPaused` is only ever set by `handleVisibilityChange` (T2.1's
24
+ * idle throttle) and cleared by `start()`/`stop()`/visibility-restore,
25
+ * so it can never be true at the same time `running` is true. An
26
+ * `externalDrive` loop never installs the visibility listener at all
27
+ * (see `start()` above), so `hiddenPaused` stays permanently `false` for
28
+ * it — it only ever reports `'running'` or `'stopped'`.
29
+ */
30
+ readonly liveness: GameLoopLiveness;
31
+ timeScale: number;
32
+ /**
33
+ * The fixed substep timestep (seconds) this loop's accumulator consumes
34
+ * per `config.update()` call (`config.fixedTimestep ?? 1/60`) — read by
35
+ * `Game.runTicks` (D15, `runtime/game.ts`) so a synchronous fast-forward
36
+ * burst drives `game.runFrame` with the SAME `fixedDt` this loop's own
37
+ * rAF-driven accumulator would have used, without exposing (or
38
+ * `runTicks` needing) any other internal loop state.
39
+ */
40
+ readonly fixedDt: number;
41
+ };
42
+ //# sourceMappingURL=game-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-loop.d.ts","sourceRoot":"","sources":["../../src/core/game-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc;;;;IA4HjD;;;;;;;;;;OAUG;uBACa,gBAAgB;eAKX,MAAM;IAc3B;;;;;;;OAOG;;EAKN"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Fixed-timestep game loop with accumulator pattern.
3
+ *
4
+ * Physics/logic run at a fixed rate (default 60 Hz) regardless of display
5
+ * frame rate. Rendering is deliberately fixed-rate too (decided — D1, see
6
+ * `docs/DECISIONS-PENDING.md`): `config.update(fixedDt)` runs once per
7
+ * consumed substep, and per the documented phase order (`PHASE_ORDER` in
8
+ * `core/types.ts`) the `render` phase executes as the last phase of that
9
+ * same call — there is no separate per-real-frame render step and no
10
+ * display-refresh interpolation. A frame whose accumulator produces zero
11
+ * substeps therefore calls `update` zero times and renders zero times; do
12
+ * not reintroduce a render call outside the substep loop below.
13
+ */
14
+ export function createGameLoop(config) {
15
+ const fixedDt = config.fixedTimestep ?? 1 / 60;
16
+ const maxSubSteps = config.maxSubSteps ?? 8;
17
+ // Also the accumulator's hard ceiling (see the spiral-of-death guard below).
18
+ const maxAccumulator = fixedDt * maxSubSteps;
19
+ // I2 (render-control runtime mode, see `GameLoopConfig.externalDrive`'s
20
+ // doc comment): in this mode `start()` below deliberately skips both the
21
+ // `requestAnimationFrame` arm AND the `visibilitychange` listener install —
22
+ // no wall-clock timing source ever exists for this loop instance, so
23
+ // `config.update` can only ever be invoked by an external driver calling
24
+ // into the render-control seam, never by this file's own `frame()`.
25
+ const externalDrive = config.externalDrive ?? false;
26
+ let accumulator = 0;
27
+ let lastTime = 0;
28
+ let running = false;
29
+ let rafId = 0;
30
+ let timeScale = 1.0;
31
+ // Idle throttle (T2.1): a hidden tab stops the loop outright; becoming
32
+ // visible again restarts it with the accumulator clock resynced to "now" —
33
+ // deliberately no catch-up burst for the wall-clock time spent hidden.
34
+ let hiddenPaused = false;
35
+ let visibilityListenerAttached = false;
36
+ function handleVisibilityChange() {
37
+ if (typeof document === 'undefined')
38
+ return;
39
+ if (document.hidden) {
40
+ if (running) {
41
+ running = false;
42
+ cancelAnimationFrame(rafId);
43
+ hiddenPaused = true;
44
+ }
45
+ }
46
+ else if (hiddenPaused) {
47
+ hiddenPaused = false;
48
+ running = true;
49
+ lastTime = performance.now();
50
+ accumulator = 0;
51
+ rafId = requestAnimationFrame(frame);
52
+ }
53
+ }
54
+ function frame(currentTime) {
55
+ if (!running)
56
+ return;
57
+ rafId = requestAnimationFrame(frame);
58
+ // Convert to seconds
59
+ const rawDt = (currentTime - lastTime) / 1000;
60
+ lastTime = currentTime;
61
+ // Clamp large frame gaps (e.g. a slow frame) before scaling by timeScale.
62
+ const dt = Math.min(rawDt, maxAccumulator) * timeScale;
63
+ accumulator += dt;
64
+ // Spiral-of-death guard: bound the accumulator regardless of timeScale
65
+ // (up to the clamped max of 8) or frame-gap size. Time that can't
66
+ // possibly be caught up on is dropped, never carried forward.
67
+ if (accumulator > maxAccumulator)
68
+ accumulator = maxAccumulator;
69
+ // Run fixed timestep updates (this is also where rendering happens —
70
+ // see the module doc comment above).
71
+ let steps = 0;
72
+ while (accumulator >= fixedDt && steps < maxSubSteps) {
73
+ config.update(fixedDt);
74
+ accumulator -= fixedDt;
75
+ steps++;
76
+ }
77
+ }
78
+ return {
79
+ start() {
80
+ if (running)
81
+ return;
82
+ running = true;
83
+ // A direct start() call can land while the loop is auto-hidden-paused
84
+ // (`hiddenPaused` true, `running` false, no rAF pending). Without this
85
+ // reset, a later visibilitychange-to-visible would see stale
86
+ // `hiddenPaused === true` and spawn a SECOND rAF chain on top of the
87
+ // one this call is about to start (doubled update()/render() overhead
88
+ // until the next stop() — no sim-speed effect, but wasted work).
89
+ hiddenPaused = false;
90
+ lastTime = performance.now();
91
+ accumulator = 0;
92
+ // External-drive mode (I2): never arm rAF and never install the
93
+ // visibilitychange auto-stop handler. `running` still flips `true`
94
+ // above (so `isRunning`/`stop()` behave normally for a caller that
95
+ // treats this loop as "started"), but nothing will ever call
96
+ // `frame()` — a headless/backgrounded capture page cannot have this
97
+ // loop silently killed by `document.hidden`, because there is no
98
+ // listener to fire in the first place.
99
+ if (externalDrive)
100
+ return;
101
+ // A play session can be started while the editor tab is ALREADY
102
+ // hidden. In that case no future visibilitychange-to-hidden event will
103
+ // arrive, and arming rAF would leave `running=true` forever while the
104
+ // browser executes zero callbacks. Classify and park the loop before
105
+ // arming it so status is truthful and visibility restore can resume it.
106
+ if (!visibilityListenerAttached && typeof document !== 'undefined') {
107
+ document.addEventListener('visibilitychange', handleVisibilityChange);
108
+ visibilityListenerAttached = true;
109
+ }
110
+ if (typeof document !== 'undefined' && document.hidden) {
111
+ running = false;
112
+ hiddenPaused = true;
113
+ return;
114
+ }
115
+ rafId = requestAnimationFrame(frame);
116
+ },
117
+ stop() {
118
+ running = false;
119
+ hiddenPaused = false;
120
+ cancelAnimationFrame(rafId);
121
+ if (visibilityListenerAttached && typeof document !== 'undefined') {
122
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
123
+ visibilityListenerAttached = false;
124
+ }
125
+ },
126
+ get isRunning() {
127
+ return running;
128
+ },
129
+ /**
130
+ * Truthful liveness (issue #175 — see `GameLoopLiveness`'s doc comment
131
+ * in `core/types.ts` for the full contract). Unlike `isRunning` above,
132
+ * this DISTINGUISHES a hidden-tab pause from an actually-stopped loop:
133
+ * `hiddenPaused` is only ever set by `handleVisibilityChange` (T2.1's
134
+ * idle throttle) and cleared by `start()`/`stop()`/visibility-restore,
135
+ * so it can never be true at the same time `running` is true. An
136
+ * `externalDrive` loop never installs the visibility listener at all
137
+ * (see `start()` above), so `hiddenPaused` stays permanently `false` for
138
+ * it — it only ever reports `'running'` or `'stopped'`.
139
+ */
140
+ get liveness() {
141
+ if (hiddenPaused)
142
+ return 'hidden-paused';
143
+ return running ? 'running' : 'stopped';
144
+ },
145
+ set timeScale(value) {
146
+ const clamped = Math.min(8, Math.max(0, value));
147
+ if (clamped !== value) {
148
+ console.warn(`[game-loop] timeScale ${value} is out of range [0, 8]; clamped to ${clamped}.`);
149
+ }
150
+ timeScale = clamped;
151
+ },
152
+ get timeScale() {
153
+ return timeScale;
154
+ },
155
+ /**
156
+ * The fixed substep timestep (seconds) this loop's accumulator consumes
157
+ * per `config.update()` call (`config.fixedTimestep ?? 1/60`) — read by
158
+ * `Game.runTicks` (D15, `runtime/game.ts`) so a synchronous fast-forward
159
+ * burst drives `game.runFrame` with the SAME `fixedDt` this loop's own
160
+ * rAF-driven accumulator would have used, without exposing (or
161
+ * `runTicks` needing) any other internal loop state.
162
+ */
163
+ get fixedDt() {
164
+ return fixedDt;
165
+ },
166
+ };
167
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * D15 — the seeded-random core (`docs/D15-DETERMINISM-DESIGN.md` §2.a,
3
+ * T-D15.1). `ctx.random` is a game-scoped PRNG with NAMED STREAMS: calling
4
+ * the object itself (`ctx.random()`) draws from the `'gameplay'` stream;
5
+ * `ctx.random.stream('vfx')` (or any other name) derives an INDEPENDENT
6
+ * generator, so a cosmetic/VFX draw can never perturb the gameplay draw
7
+ * order — the classic replay-drift trap option B ("one game-scoped PRNG
8
+ * only") would fall into (see the design doc's §2.a option table).
9
+ *
10
+ * Each stream is seeded from `fnv1a(name) ^ rootSeed` — deterministic given
11
+ * the root seed, independent of draw order across streams (drawing from
12
+ * `'vfx'` never advances `'gameplay'`'s generator, since they are two
13
+ * separate mulberry32 instances). `reseed(seed)` re-derives every stream
14
+ * that has EVER been asked for via `.stream(name)` (including the implicit
15
+ * `'gameplay'` stream `ctx.random()` itself draws from) — future draws only:
16
+ * numbers already returned before a `reseed()` call are not (and cannot be)
17
+ * un-returned; this matches `play.seed.set`'s documented semantics (T-D15.6).
18
+ *
19
+ * Deliberately reuses {@link createMulberry32} FROM `runtime/render-seed.ts`
20
+ * (the render/capture door's own generator) rather than duplicating the
21
+ * algorithm — `render-seed.ts` stays a zero-import module itself (this file
22
+ * imports FROM it, never the reverse), so this is a dependency-clean
23
+ * direction: the render/capture door and the gameplay determinism door share
24
+ * one PRNG implementation without either depending on the other's door
25
+ * logic (§2.a: "Kept as-is for the render/capture door only" — the two doors
26
+ * stay orthogonal; only the generator function itself is shared).
27
+ */
28
+ /** The name `ctx.random()` (called with no `.stream(...)`) draws from. */
29
+ export declare const GAMEPLAY_STREAM = "gameplay";
30
+ /** The fixed fallback seed a `SeededRandom` boots with when no explicit seed
31
+ * is supplied (mirrors `render-seed.ts`'s own `DEFAULT_RENDER_SEED` in
32
+ * spirit — an arbitrary but fixed golden-ratio-derived constant, never
33
+ * wall-clock/`Math.random`-derived, so an UNDECLARED project's `ctx.random`
34
+ * is still perfectly reproducible on its own terms even though nothing in
35
+ * the manifest asked for that — it just isn't a documented CONTRACT until
36
+ * `determinism.seededRandom` is declared, per T4.1's "no dead field" rule). */
37
+ export declare const DEFAULT_SEEDED_RANDOM_SEED = 2654435769;
38
+ /**
39
+ * The `ctx.random` surface (`GameContext.random`, `runtime/types.ts`).
40
+ * Callable (draws from the `'gameplay'` stream), plus:
41
+ * - `stream(name)` — an independent named generator, `[0, 1)` floats, same
42
+ * call signature as `Math.random`/the bare `SeededRandom` call itself.
43
+ * - `reseed(seed)` — re-derive every stream ever requested so far (future
44
+ * draws only) from a NEW root seed.
45
+ * - `seed` — the CURRENT root seed (reflects the last `reseed()` call, if
46
+ * any) — a live getter, not a value snapshotted at construction.
47
+ */
48
+ export interface SeededRandom {
49
+ (): number;
50
+ stream(name: string): () => number;
51
+ reseed(seed: number): void;
52
+ readonly seed: number;
53
+ }
54
+ /**
55
+ * Construct a fresh, game-scoped seeded-random surface. `initialSeed` is
56
+ * coerced to an unsigned 32-bit integer the same way `render-seed.ts`'s
57
+ * `installDeterministicRandom` does (`>>> 0`), so any finite JS number is
58
+ * accepted.
59
+ */
60
+ export declare function createSeededRandom(initialSeed: number): SeededRandom;
61
+ /** Called once by `createGame`, right after both the seeded-random surface
62
+ * and the Game shell object exist — mirrors `registerDebugRegistry`. */
63
+ export declare function registerSeededRandom(owner: object, random: SeededRandom): void;
64
+ /** The game-scoped `SeededRandom` backing every world's `ctx.random` — `null`
65
+ * for an owner built without one (there is always one for every real
66
+ * `createGame` call; `null` only for a hand-built `Game`-shaped stand-in a
67
+ * test constructs without going through `createGame`). */
68
+ export declare function getSeededRandom(owner: object): SeededRandom | null;
69
+ //# sourceMappingURL=seeded-random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeded-random.d.ts","sourceRoot":"","sources":["../../src/core/seeded-random.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,0EAA0E;AAC1E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C;;;;;;gFAMgF;AAChF,eAAO,MAAM,0BAA0B,aAAa,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,MAAM,CAAC;IACX,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAsBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAgDpE;AAeD;yEACyE;AACzE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAE9E;AAED;;;2DAG2D;AAC3D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAElE"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * D15 — the seeded-random core (`docs/D15-DETERMINISM-DESIGN.md` §2.a,
3
+ * T-D15.1). `ctx.random` is a game-scoped PRNG with NAMED STREAMS: calling
4
+ * the object itself (`ctx.random()`) draws from the `'gameplay'` stream;
5
+ * `ctx.random.stream('vfx')` (or any other name) derives an INDEPENDENT
6
+ * generator, so a cosmetic/VFX draw can never perturb the gameplay draw
7
+ * order — the classic replay-drift trap option B ("one game-scoped PRNG
8
+ * only") would fall into (see the design doc's §2.a option table).
9
+ *
10
+ * Each stream is seeded from `fnv1a(name) ^ rootSeed` — deterministic given
11
+ * the root seed, independent of draw order across streams (drawing from
12
+ * `'vfx'` never advances `'gameplay'`'s generator, since they are two
13
+ * separate mulberry32 instances). `reseed(seed)` re-derives every stream
14
+ * that has EVER been asked for via `.stream(name)` (including the implicit
15
+ * `'gameplay'` stream `ctx.random()` itself draws from) — future draws only:
16
+ * numbers already returned before a `reseed()` call are not (and cannot be)
17
+ * un-returned; this matches `play.seed.set`'s documented semantics (T-D15.6).
18
+ *
19
+ * Deliberately reuses {@link createMulberry32} FROM `runtime/render-seed.ts`
20
+ * (the render/capture door's own generator) rather than duplicating the
21
+ * algorithm — `render-seed.ts` stays a zero-import module itself (this file
22
+ * imports FROM it, never the reverse), so this is a dependency-clean
23
+ * direction: the render/capture door and the gameplay determinism door share
24
+ * one PRNG implementation without either depending on the other's door
25
+ * logic (§2.a: "Kept as-is for the render/capture door only" — the two doors
26
+ * stay orthogonal; only the generator function itself is shared).
27
+ */
28
+ import { createMulberry32 } from '../runtime/render-seed';
29
+ /** The name `ctx.random()` (called with no `.stream(...)`) draws from. */
30
+ export const GAMEPLAY_STREAM = 'gameplay';
31
+ /** The fixed fallback seed a `SeededRandom` boots with when no explicit seed
32
+ * is supplied (mirrors `render-seed.ts`'s own `DEFAULT_RENDER_SEED` in
33
+ * spirit — an arbitrary but fixed golden-ratio-derived constant, never
34
+ * wall-clock/`Math.random`-derived, so an UNDECLARED project's `ctx.random`
35
+ * is still perfectly reproducible on its own terms even though nothing in
36
+ * the manifest asked for that — it just isn't a documented CONTRACT until
37
+ * `determinism.seededRandom` is declared, per T4.1's "no dead field" rule). */
38
+ export const DEFAULT_SEEDED_RANDOM_SEED = 0x9e3779b9;
39
+ /** fnv1a-32, the standard non-cryptographic string hash — used only to mix a
40
+ * stream NAME into the root seed, never as a determinism primitive on its
41
+ * own (mulberry32 is still what actually produces the `[0,1)` sequence). */
42
+ function fnv1a32(str) {
43
+ let hash = 0x811c9dc5;
44
+ for (let i = 0; i < str.length; i++) {
45
+ hash ^= str.charCodeAt(i);
46
+ hash = Math.imul(hash, 0x01000193);
47
+ }
48
+ return hash >>> 0;
49
+ }
50
+ /**
51
+ * Construct a fresh, game-scoped seeded-random surface. `initialSeed` is
52
+ * coerced to an unsigned 32-bit integer the same way `render-seed.ts`'s
53
+ * `installDeterministicRandom` does (`>>> 0`), so any finite JS number is
54
+ * accepted.
55
+ */
56
+ export function createSeededRandom(initialSeed) {
57
+ let rootSeed = initialSeed >>> 0;
58
+ const streams = new Map();
59
+ function deriveStreamSeed(name) {
60
+ return (fnv1a32(name) ^ rootSeed) >>> 0;
61
+ }
62
+ function getBox(name) {
63
+ let box = streams.get(name);
64
+ if (!box) {
65
+ box = { gen: createMulberry32(deriveStreamSeed(name)) };
66
+ streams.set(name, box);
67
+ }
68
+ return box;
69
+ }
70
+ function streamFn(name) {
71
+ const box = getBox(name);
72
+ return () => box.gen();
73
+ }
74
+ const random = (() => getBox(GAMEPLAY_STREAM).gen());
75
+ Object.defineProperties(random, {
76
+ stream: { value: streamFn, enumerable: true },
77
+ reseed: {
78
+ value: (seed) => {
79
+ rootSeed = seed >>> 0;
80
+ // Re-derive every stream ANYONE has ever asked for (including the
81
+ // implicit 'gameplay' stream, once `random()` or
82
+ // `.stream('gameplay')` has been called at least once) — a handle a
83
+ // caller stashed before this call keeps its identity but now reads
84
+ // from the freshly-seeded generator on its NEXT call (future draws
85
+ // only, per the design doc's `play.seed.set` semantics).
86
+ for (const [name, box] of streams) {
87
+ box.gen = createMulberry32(deriveStreamSeed(name));
88
+ }
89
+ },
90
+ enumerable: true,
91
+ },
92
+ seed: {
93
+ get: () => rootSeed,
94
+ enumerable: true,
95
+ },
96
+ });
97
+ return random;
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Game-scoped registry — mirrors `runtime/debug-registry.ts`'s
101
+ // `registerDebugRegistry`/`getDebugRegistry` WeakMap pattern exactly, but
102
+ // keyed on a bare `object` (not `Game`) so this module never needs to import
103
+ // `runtime/game.ts` even as a type — `core/` stays independent of `runtime/`
104
+ // except for the one explicit, documented `render-seed.ts` reuse above.
105
+ // `createGame` (`runtime/game.ts`) is the one real registrant, passing itself
106
+ // (the `GameInternal` shell) as the key, exactly like it does for
107
+ // `registerDebugRegistry(gameInternal, debugRegistry)`.
108
+ // ---------------------------------------------------------------------------
109
+ const registryByOwner = new WeakMap();
110
+ /** Called once by `createGame`, right after both the seeded-random surface
111
+ * and the Game shell object exist — mirrors `registerDebugRegistry`. */
112
+ export function registerSeededRandom(owner, random) {
113
+ registryByOwner.set(owner, random);
114
+ }
115
+ /** The game-scoped `SeededRandom` backing every world's `ctx.random` — `null`
116
+ * for an owner built without one (there is always one for every real
117
+ * `createGame` call; `null` only for a hand-built `Game`-shaped stand-in a
118
+ * test constructs without going through `createGame`). */
119
+ export function getSeededRandom(owner) {
120
+ return registryByOwner.get(owner) ?? null;
121
+ }
@@ -0,0 +1,120 @@
1
+ import { type SystemDef, type SystemFn, type SystemOptions, type SystemPhaseName, type SystemRunObserver } from './types';
2
+ /**
3
+ * Ordered system execution by named phase.
4
+ *
5
+ * Systems are registered with a phase name. When `run(dt)` is called, all
6
+ * phases execute in `PHASE_ORDER` via `runPhase(phase, dt)`. Within a phase,
7
+ * `runPhase` executes three ordered buckets (GAME-ROOT-DESIGN.md §4, T7.1
8
+ * slice 2):
9
+ *
10
+ * 1. **engine** — everything `add()`/`register()`ed at or before the last
11
+ * `markEngineBoundary()` call, or EVERYTHING if no boundary has ever
12
+ * been marked (the world2d-silo case: it never calls
13
+ * `markEngineBoundary`, so its systems are all "engine").
14
+ * 2. **componentTick** — the single per-phase slot set via
15
+ * `setComponentTick(phase, fn)`. Component ticks are engine
16
+ * infrastructure: they always run after every engine system and before
17
+ * every game system in that phase, REGARDLESS of when
18
+ * `setComponentTick` was called relative to other `add()` calls. This
19
+ * is what makes "engine systems run before component ticks" a
20
+ * structural guarantee rather than a registration-order convention
21
+ * (see `component-manager.ts`, which registers its tick this way).
22
+ * 3. **game** — everything `add()`/`register()`ed AFTER the last
23
+ * `markEngineBoundary()` call.
24
+ *
25
+ * Within each bucket, systems run in registration order.
26
+ */
27
+ export declare function createSystemRunner(observer?: SystemRunObserver, scope?: string): {
28
+ /**
29
+ * Register a bare system function in a specific phase.
30
+ * Systems within the same phase run in the order they were added.
31
+ */
32
+ add(phase: SystemPhaseName, fn: SystemFn, options?: SystemOptions): void;
33
+ /**
34
+ * Remove a bare system function from a phase. Also drops it from the
35
+ * engine-membership set (if present) — the fix for the length-based
36
+ * bookkeeping bug: removing this has no effect on how any OTHER entry
37
+ * (before or after it) is classified, since classification is now
38
+ * per-function membership, not position.
39
+ */
40
+ remove(phase: SystemPhaseName, fn: SystemFn): void;
41
+ /**
42
+ * Register a lifecycle system. Adds its update to the correct phase.
43
+ * Call runInit() after all systems are registered to invoke init hooks.
44
+ */
45
+ register(system: SystemDef): void;
46
+ /**
47
+ * Unregister a lifecycle system. Removes its update and calls dispose.
48
+ */
49
+ unregister(system: SystemDef): void;
50
+ /**
51
+ * Register the ONE component-tick function for a phase (T7.1 slice 2).
52
+ * Component ticks are engine infrastructure, not a bare `add()`ed
53
+ * system: they always execute after every engine-bucket system and
54
+ * before every game-bucket system in that phase (see `runPhase`),
55
+ * they are never touched by `removeAllNonEngine()`, and they do not
56
+ * count toward `markEngineBoundary()`'s bookkeeping. Throws if a tick
57
+ * is already set for this phase — at most one component manager may
58
+ * own a phase's tick slot.
59
+ */
60
+ setComponentTick(phase: SystemPhaseName, fn: SystemFn): void;
61
+ /**
62
+ * Call init() on all registered lifecycle systems, in phase order.
63
+ * Call once after scene load, before the first game loop tick.
64
+ */
65
+ runInit(): void;
66
+ /**
67
+ * Call dispose() on all registered lifecycle systems and remove them.
68
+ */
69
+ runDispose(): void;
70
+ /**
71
+ * Run ONE phase's three ordered buckets — engine, componentTick, game
72
+ * (see the module doc comment). Each system call is isolated: a
73
+ * throwing system is loudly logged (never swallowed) but does not stop
74
+ * its siblings in the same bucket, a later bucket in this phase, or a
75
+ * later phase, from running this frame.
76
+ *
77
+ * Public — the Game root's frame executor (`runtime/game.ts`) calls this
78
+ * directly per (phase, world); `run(dt)` below is just a loop over it,
79
+ * preserved for the world2d silo and any direct caller.
80
+ */
81
+ runPhase(phase: SystemPhaseName, dt: number): void;
82
+ /**
83
+ * Run all phases in order, via `runPhase`.
84
+ */
85
+ run(dt: number): void;
86
+ /**
87
+ * Mark everything registered so far (via `add()`/`register()`, in every
88
+ * phase) as "engine" — infrastructure that must survive a warm restart.
89
+ * Call once, right after mount finishes wiring engine-level systems and
90
+ * BEFORE any game (`setup()`/scene load) registers its own. `hotReload`
91
+ * calls `removeAllNonEngine()` on every restart, which only ever removes
92
+ * what was added after this mark. Component-tick slots (`setComponentTick`)
93
+ * are unaffected — they are never part of this boundary.
94
+ */
95
+ markEngineBoundary(): void;
96
+ /**
97
+ * Bulk-remove every system registered after the last `markEngineBoundary()`
98
+ * call — both bare `add()`ed functions and lifecycle `register()`ed systems
99
+ * (the latter get `dispose()`d, mirroring `unregister()`). A no-op if no
100
+ * boundary has been marked. Idempotent: calling it again with nothing new
101
+ * registered since is a safe no-op. Component-tick slots are NEVER cleared
102
+ * by this — they are engine infrastructure, not game content.
103
+ *
104
+ * This is what makes a warm restart (`hotReload`) safe to call N times
105
+ * without accumulating duplicate systems/listeners — each restart's
106
+ * outgoing game systems are fully removed before the new one registers its
107
+ * own, while the engine systems (input/physics/render/the ComponentManager
108
+ * tick/...) registered before the boundary are never touched.
109
+ */
110
+ removeAllNonEngine(): void;
111
+ /**
112
+ * Total system-function count, optionally scoped to one phase. Includes
113
+ * component-tick slots (a set slot counts as 1 per phase it occupies).
114
+ * Test/introspection helper — used to assert a warm restart doesn't
115
+ * accumulate systems (see `removeAllNonEngine`).
116
+ */
117
+ count(phase?: SystemPhaseName): number;
118
+ };
119
+ export type SystemRunner = ReturnType<typeof createSystemRunner>;
120
+ //# sourceMappingURL=system-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-runner.d.ts","sourceRoot":"","sources":["../../src/core/system-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,KAAK,SAAU;IA+C5E;;;OAGG;eACQ,eAAe,MAAM,QAAQ,YAAY,aAAa;IASjE;;;;;;OAMG;kBACW,eAAe,MAAM,QAAQ;IAQ3C;;;OAGG;qBACc,SAAS;IAU1B;;OAEG;uBACgB,SAAS;IAa5B;;;;;;;;;OASG;4BACqB,eAAe,MAAM,QAAQ;IAarD;;;OAGG;;IAUH;;OAEG;;IAaH;;;;;;;;;;OAUG;oBACa,eAAe,MAAM,MAAM;IA+B3C;;OAEG;YACK,MAAM;IAMd;;;;;;;;OAQG;;IAUH;;;;;;;;;;;;;OAaG;;IAsBH;;;;;OAKG;kBACW,eAAe,GAAG,MAAM;EAYzC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}