@vgai/engine 0.2.0 → 0.3.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 (541) hide show
  1. package/README.md +3 -1
  2. package/dist/adapter/authoring.d.ts +404 -0
  3. package/dist/adapter/authoring.d.ts.map +1 -0
  4. package/dist/adapter/authoring.js +22 -0
  5. package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
  6. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
  7. package/dist/adapter/colyseus-networking-adapter.js +38 -0
  8. package/dist/adapter/first-party-systems.d.ts +38 -0
  9. package/dist/adapter/first-party-systems.d.ts.map +1 -0
  10. package/dist/adapter/first-party-systems.js +77 -0
  11. package/dist/adapter/game-adapter.d.ts +133 -0
  12. package/dist/adapter/game-adapter.d.ts.map +1 -0
  13. package/dist/adapter/game-adapter.js +10 -0
  14. package/dist/adapter/host-context.d.ts +73 -0
  15. package/dist/adapter/host-context.d.ts.map +1 -0
  16. package/dist/adapter/host-context.js +16 -0
  17. package/dist/adapter/index.d.ts +22 -0
  18. package/dist/adapter/index.d.ts.map +1 -0
  19. package/dist/adapter/index.js +15 -0
  20. package/dist/adapter/ingest/game-contract.d.ts +53 -0
  21. package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
  22. package/dist/adapter/ingest/game-contract.js +30 -0
  23. package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
  24. package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
  25. package/dist/adapter/ingest/overlay-applier.js +132 -0
  26. package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
  27. package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
  28. package/dist/adapter/ingest/overlay-apply.js +101 -0
  29. package/dist/adapter/ingest/overlay-file.d.ts +79 -0
  30. package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
  31. package/dist/adapter/ingest/overlay-file.js +66 -0
  32. package/dist/adapter/ingest/overlay-report.d.ts +113 -0
  33. package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
  34. package/dist/adapter/ingest/overlay-report.js +103 -0
  35. package/dist/adapter/ingest/scene-capture.d.ts +97 -0
  36. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
  37. package/dist/adapter/ingest/scene-capture.js +248 -0
  38. package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
  39. package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
  40. package/dist/adapter/ingest/upstream-pin.js +50 -0
  41. package/dist/adapter/loop-gate-report.d.ts +34 -0
  42. package/dist/adapter/loop-gate-report.d.ts.map +1 -0
  43. package/dist/adapter/loop-gate-report.js +37 -0
  44. package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
  45. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
  46. package/dist/adapter/rapier-physics-adapter.js +46 -0
  47. package/dist/adapter/system-adapter.d.ts +133 -0
  48. package/dist/adapter/system-adapter.d.ts.map +1 -0
  49. package/dist/adapter/system-adapter.js +13 -0
  50. package/dist/adapter/transform.d.ts +18 -0
  51. package/dist/adapter/transform.d.ts.map +1 -0
  52. package/dist/adapter/transform.js +1 -0
  53. package/dist/adapter/vgai-scene-game-adapter.d.ts +116 -0
  54. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
  55. package/dist/adapter/vgai-scene-game-adapter.js +714 -0
  56. package/dist/adapter/world-kind.d.ts +30 -0
  57. package/dist/adapter/world-kind.d.ts.map +1 -0
  58. package/dist/adapter/world-kind.js +18 -0
  59. package/dist/ai/navigation.d.ts +64 -0
  60. package/dist/ai/navigation.d.ts.map +1 -0
  61. package/dist/ai/navigation.js +133 -0
  62. package/dist/animation/anim-graph-types.d.ts +25 -0
  63. package/dist/animation/anim-graph-types.d.ts.map +1 -0
  64. package/dist/animation/anim-graph-types.js +1 -0
  65. package/dist/animation/animation-clock.d.ts +213 -0
  66. package/dist/animation/animation-clock.d.ts.map +1 -0
  67. package/dist/animation/animation-clock.js +301 -0
  68. package/dist/animation/blend-node.d.ts +22 -0
  69. package/dist/animation/blend-node.d.ts.map +1 -0
  70. package/dist/animation/blend-node.js +97 -0
  71. package/dist/animation/camera-ownership.d.ts +250 -0
  72. package/dist/animation/camera-ownership.d.ts.map +1 -0
  73. package/dist/animation/camera-ownership.js +169 -0
  74. package/dist/animation/cinematic-cues.d.ts +200 -0
  75. package/dist/animation/cinematic-cues.d.ts.map +1 -0
  76. package/dist/animation/cinematic-cues.js +213 -0
  77. package/dist/animation/clip-map.d.ts +12 -0
  78. package/dist/animation/clip-map.d.ts.map +1 -0
  79. package/dist/animation/clip-map.js +37 -0
  80. package/dist/animation/gsap-registration.d.ts +119 -0
  81. package/dist/animation/gsap-registration.d.ts.map +1 -0
  82. package/dist/animation/gsap-registration.js +92 -0
  83. package/dist/animation/theatre-clock-binding.d.ts +89 -0
  84. package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
  85. package/dist/animation/theatre-clock-binding.js +29 -0
  86. package/dist/animation/theatre-director.d.ts +242 -0
  87. package/dist/animation/theatre-director.d.ts.map +1 -0
  88. package/dist/animation/theatre-director.js +235 -0
  89. package/dist/animation/theatre-object-binding.d.ts +305 -0
  90. package/dist/animation/theatre-object-binding.d.ts.map +1 -0
  91. package/dist/animation/theatre-object-binding.js +351 -0
  92. package/dist/animation/xstate-animation-binding.d.ts +111 -0
  93. package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
  94. package/dist/animation/xstate-animation-binding.js +307 -0
  95. package/dist/animation/xstate-animation-meta.d.ts +228 -0
  96. package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
  97. package/dist/animation/xstate-animation-meta.js +221 -0
  98. package/dist/assets.d.ts +26 -0
  99. package/dist/assets.d.ts.map +1 -0
  100. package/dist/assets.js +55 -0
  101. package/dist/audio/index.d.ts +4 -0
  102. package/dist/audio/index.d.ts.map +1 -0
  103. package/dist/audio/index.js +24 -0
  104. package/dist/audio/tone-clock-binding.d.ts +75 -0
  105. package/dist/audio/tone-clock-binding.d.ts.map +1 -0
  106. package/dist/audio/tone-clock-binding.js +29 -0
  107. package/dist/audio/tone-context.d.ts +114 -0
  108. package/dist/audio/tone-context.d.ts.map +1 -0
  109. package/dist/audio/tone-context.js +39 -0
  110. package/dist/audio/tone-offline-render.d.ts +90 -0
  111. package/dist/audio/tone-offline-render.d.ts.map +1 -0
  112. package/dist/audio/tone-offline-render.js +56 -0
  113. package/dist/audio/wav-encode.d.ts +38 -0
  114. package/dist/audio/wav-encode.d.ts.map +1 -0
  115. package/dist/audio/wav-encode.js +97 -0
  116. package/dist/core/game-loop.d.ts +21 -0
  117. package/dist/core/game-loop.d.ts.map +1 -0
  118. package/dist/core/game-loop.js +130 -0
  119. package/dist/core/system-runner.d.ts +120 -0
  120. package/dist/core/system-runner.d.ts.map +1 -0
  121. package/dist/core/system-runner.js +286 -0
  122. package/dist/core/types.d.ts +58 -0
  123. package/dist/core/types.d.ts.map +1 -0
  124. package/dist/core/types.js +25 -0
  125. package/dist/data/data-asset.d.ts +101 -0
  126. package/dist/data/data-asset.d.ts.map +1 -0
  127. package/dist/data/data-asset.js +122 -0
  128. package/dist/data/data-check-core.d.ts +110 -0
  129. package/dist/data/data-check-core.d.ts.map +1 -0
  130. package/dist/data/data-check-core.js +178 -0
  131. package/dist/data/data-ref.d.ts +79 -0
  132. package/dist/data/data-ref.d.ts.map +1 -0
  133. package/dist/data/data-ref.js +130 -0
  134. package/dist/data/vite-plugin-data.d.ts +79 -0
  135. package/dist/data/vite-plugin-data.d.ts.map +1 -0
  136. package/dist/data/vite-plugin-data.js +217 -0
  137. package/dist/dev/console-bridge.d.ts +22 -0
  138. package/dist/dev/console-bridge.d.ts.map +1 -0
  139. package/dist/dev/console-bridge.js +71 -0
  140. package/dist/dev/debug-draw.d.ts +24 -0
  141. package/dist/dev/debug-draw.d.ts.map +1 -0
  142. package/dist/dev/debug-draw.js +73 -0
  143. package/dist/dev/logger.d.ts +30 -0
  144. package/dist/dev/logger.d.ts.map +1 -0
  145. package/dist/dev/logger.js +90 -0
  146. package/dist/ecs/component-manager.d.ts +189 -0
  147. package/dist/ecs/component-manager.d.ts.map +1 -0
  148. package/dist/ecs/component-manager.js +676 -0
  149. package/dist/ecs/game-component.d.ts +97 -0
  150. package/dist/ecs/game-component.d.ts.map +1 -0
  151. package/dist/ecs/game-component.js +80 -0
  152. package/dist/ecs/hmr-swap-report.d.ts +53 -0
  153. package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
  154. package/dist/ecs/hmr-swap-report.js +55 -0
  155. package/dist/index.d.ts +37 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +30 -0
  158. package/dist/input/input-manager.d.ts +596 -0
  159. package/dist/input/input-manager.d.ts.map +1 -0
  160. package/dist/input/input-manager.js +1564 -0
  161. package/dist/input/input-types.d.ts +171 -0
  162. package/dist/input/input-types.d.ts.map +1 -0
  163. package/dist/input/input-types.js +1 -0
  164. package/dist/input/prompt-labels.d.ts +21 -0
  165. package/dist/input/prompt-labels.d.ts.map +1 -0
  166. package/dist/input/prompt-labels.js +121 -0
  167. package/dist/input/rebind-controller.d.ts +59 -0
  168. package/dist/input/rebind-controller.d.ts.map +1 -0
  169. package/dist/input/rebind-controller.js +85 -0
  170. package/dist/input/schema.d.ts +16 -0
  171. package/dist/input/schema.d.ts.map +1 -0
  172. package/dist/input/schema.js +228 -0
  173. package/dist/loader.d.ts +43 -0
  174. package/dist/loader.d.ts.map +1 -0
  175. package/dist/loader.js +59 -0
  176. package/dist/manifest/index.d.ts +5 -0
  177. package/dist/manifest/index.d.ts.map +1 -0
  178. package/dist/manifest/index.js +8 -0
  179. package/dist/manifest/load-file.d.ts +4 -0
  180. package/dist/manifest/load-file.d.ts.map +1 -0
  181. package/dist/manifest/load-file.js +14 -0
  182. package/dist/manifest/load.d.ts +117 -0
  183. package/dist/manifest/load.d.ts.map +1 -0
  184. package/dist/manifest/load.js +255 -0
  185. package/dist/manifest/schema.d.ts +173 -0
  186. package/dist/manifest/schema.d.ts.map +1 -0
  187. package/dist/manifest/schema.js +302 -0
  188. package/dist/physics/collision-system.d.ts +41 -0
  189. package/dist/physics/collision-system.d.ts.map +1 -0
  190. package/dist/physics/collision-system.js +64 -0
  191. package/dist/physics/physics-registry.d.ts +45 -0
  192. package/dist/physics/physics-registry.d.ts.map +1 -0
  193. package/dist/physics/physics-registry.js +65 -0
  194. package/dist/physics/transform-writer.d.ts +16 -0
  195. package/dist/physics/transform-writer.d.ts.map +1 -0
  196. package/dist/physics/transform-writer.js +38 -0
  197. package/dist/physics/trigger-dispatch.d.ts +24 -0
  198. package/dist/physics/trigger-dispatch.d.ts.map +1 -0
  199. package/dist/physics/trigger-dispatch.js +80 -0
  200. package/dist/react/game-state.d.ts +105 -0
  201. package/dist/react/game-state.d.ts.map +1 -0
  202. package/dist/react/game-state.js +144 -0
  203. package/dist/react/use-data.d.ts +60 -0
  204. package/dist/react/use-data.d.ts.map +1 -0
  205. package/dist/react/use-data.js +96 -0
  206. package/dist/react/use-selection.d.ts +75 -0
  207. package/dist/react/use-selection.d.ts.map +1 -0
  208. package/dist/react/use-selection.js +90 -0
  209. package/dist/render/auto-batcher.d.ts +34 -0
  210. package/dist/render/auto-batcher.d.ts.map +1 -0
  211. package/dist/render/auto-batcher.js +140 -0
  212. package/dist/render/render-batch-system.d.ts +33 -0
  213. package/dist/render/render-batch-system.d.ts.map +1 -0
  214. package/dist/render/render-batch-system.js +230 -0
  215. package/dist/render/render-features.d.ts +47 -0
  216. package/dist/render/render-features.d.ts.map +1 -0
  217. package/dist/render/render-features.js +105 -0
  218. package/dist/render/render-settings.d.ts +36 -0
  219. package/dist/render/render-settings.d.ts.map +1 -0
  220. package/dist/render/render-settings.js +51 -0
  221. package/dist/runtime/create-runtime.d.ts +280 -0
  222. package/dist/runtime/create-runtime.d.ts.map +1 -0
  223. package/dist/runtime/create-runtime.js +795 -0
  224. package/dist/runtime/frame-selector-cache.d.ts +41 -0
  225. package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
  226. package/dist/runtime/frame-selector-cache.js +65 -0
  227. package/dist/runtime/game.d.ts +433 -0
  228. package/dist/runtime/game.d.ts.map +1 -0
  229. package/dist/runtime/game.js +569 -0
  230. package/dist/runtime/input-router.d.ts +78 -0
  231. package/dist/runtime/input-router.d.ts.map +1 -0
  232. package/dist/runtime/input-router.js +171 -0
  233. package/dist/runtime/mount-game.d.ts +129 -0
  234. package/dist/runtime/mount-game.d.ts.map +1 -0
  235. package/dist/runtime/mount-game.js +152 -0
  236. package/dist/runtime/mount-manifest.d.ts +119 -0
  237. package/dist/runtime/mount-manifest.d.ts.map +1 -0
  238. package/dist/runtime/mount-manifest.js +204 -0
  239. package/dist/runtime/render-audio-control.d.ts +110 -0
  240. package/dist/runtime/render-audio-control.d.ts.map +1 -0
  241. package/dist/runtime/render-audio-control.js +111 -0
  242. package/dist/runtime/render-control.d.ts +291 -0
  243. package/dist/runtime/render-control.d.ts.map +1 -0
  244. package/dist/runtime/render-control.js +264 -0
  245. package/dist/runtime/render-seed.d.ts +57 -0
  246. package/dist/runtime/render-seed.d.ts.map +1 -0
  247. package/dist/runtime/render-seed.js +74 -0
  248. package/dist/runtime/scene-ui-bridge.d.ts +69 -0
  249. package/dist/runtime/scene-ui-bridge.d.ts.map +1 -0
  250. package/dist/runtime/scene-ui-bridge.js +23 -0
  251. package/dist/runtime/scene-ui-data.d.ts +13 -0
  252. package/dist/runtime/scene-ui-data.d.ts.map +1 -0
  253. package/dist/runtime/scene-ui-data.js +92 -0
  254. package/dist/runtime/state-bridge.d.ts +47 -0
  255. package/dist/runtime/state-bridge.d.ts.map +1 -0
  256. package/dist/runtime/state-bridge.js +53 -0
  257. package/dist/runtime/types.d.ts +179 -0
  258. package/dist/runtime/types.d.ts.map +1 -0
  259. package/dist/runtime/types.js +1 -0
  260. package/dist/scene/asset-loaders.d.ts +79 -0
  261. package/dist/scene/asset-loaders.d.ts.map +1 -0
  262. package/dist/scene/asset-loaders.js +141 -0
  263. package/dist/scene/asset-paths.d.ts +11 -0
  264. package/dist/scene/asset-paths.d.ts.map +1 -0
  265. package/dist/scene/asset-paths.js +108 -0
  266. package/dist/scene/asset-ref-check.d.ts +88 -0
  267. package/dist/scene/asset-ref-check.d.ts.map +1 -0
  268. package/dist/scene/asset-ref-check.js +214 -0
  269. package/dist/scene/asset-registry.d.ts +30 -0
  270. package/dist/scene/asset-registry.d.ts.map +1 -0
  271. package/dist/scene/asset-registry.js +50 -0
  272. package/dist/scene/collider-dimensions.d.ts +63 -0
  273. package/dist/scene/collider-dimensions.d.ts.map +1 -0
  274. package/dist/scene/collider-dimensions.js +98 -0
  275. package/dist/scene/component-registry.d.ts +17 -0
  276. package/dist/scene/component-registry.d.ts.map +1 -0
  277. package/dist/scene/component-registry.js +28 -0
  278. package/dist/scene/defaults.d.ts +252 -0
  279. package/dist/scene/defaults.d.ts.map +1 -0
  280. package/dist/scene/defaults.js +151 -0
  281. package/dist/scene/geometries/index.d.ts +8 -0
  282. package/dist/scene/geometries/index.d.ts.map +1 -0
  283. package/dist/scene/geometries/index.js +7 -0
  284. package/dist/scene/geometries/terrain.d.ts +2 -0
  285. package/dist/scene/geometries/terrain.d.ts.map +1 -0
  286. package/dist/scene/geometries/terrain.js +37 -0
  287. package/dist/scene/geometry-registry.d.ts +24 -0
  288. package/dist/scene/geometry-registry.d.ts.map +1 -0
  289. package/dist/scene/geometry-registry.js +20 -0
  290. package/dist/scene/instance-registry.d.ts +36 -0
  291. package/dist/scene/instance-registry.d.ts.map +1 -0
  292. package/dist/scene/instance-registry.js +55 -0
  293. package/dist/scene/instancers/grid.d.ts +2 -0
  294. package/dist/scene/instancers/grid.d.ts.map +1 -0
  295. package/dist/scene/instancers/grid.js +36 -0
  296. package/dist/scene/instancers/index.d.ts +8 -0
  297. package/dist/scene/instancers/index.d.ts.map +1 -0
  298. package/dist/scene/instancers/index.js +7 -0
  299. package/dist/scene/light-camera-factory.d.ts +23 -0
  300. package/dist/scene/light-camera-factory.d.ts.map +1 -0
  301. package/dist/scene/light-camera-factory.js +68 -0
  302. package/dist/scene/material-factory.d.ts +17 -0
  303. package/dist/scene/material-factory.d.ts.map +1 -0
  304. package/dist/scene/material-factory.js +197 -0
  305. package/dist/scene/material-registry.d.ts +40 -0
  306. package/dist/scene/material-registry.d.ts.map +1 -0
  307. package/dist/scene/material-registry.js +44 -0
  308. package/dist/scene/materials/index.d.ts +8 -0
  309. package/dist/scene/materials/index.d.ts.map +1 -0
  310. package/dist/scene/materials/index.js +7 -0
  311. package/dist/scene/materials/water.d.ts +2 -0
  312. package/dist/scene/materials/water.d.ts.map +1 -0
  313. package/dist/scene/materials/water.js +54 -0
  314. package/dist/scene/parse.d.ts +23 -0
  315. package/dist/scene/parse.d.ts.map +1 -0
  316. package/dist/scene/parse.js +179 -0
  317. package/dist/scene/particles-factory.d.ts +33 -0
  318. package/dist/scene/particles-factory.d.ts.map +1 -0
  319. package/dist/scene/particles-factory.js +282 -0
  320. package/dist/scene/scene-apply.d.ts +109 -0
  321. package/dist/scene/scene-apply.d.ts.map +1 -0
  322. package/dist/scene/scene-apply.js +326 -0
  323. package/dist/scene/scene-diff-schema.d.ts +285 -0
  324. package/dist/scene/scene-diff-schema.d.ts.map +1 -0
  325. package/dist/scene/scene-diff-schema.js +92 -0
  326. package/dist/scene/scene-diff-types.d.ts +40 -0
  327. package/dist/scene/scene-diff-types.d.ts.map +1 -0
  328. package/dist/scene/scene-diff-types.js +14 -0
  329. package/dist/scene/scene-loader.d.ts +177 -0
  330. package/dist/scene/scene-loader.d.ts.map +1 -0
  331. package/dist/scene/scene-loader.js +1213 -0
  332. package/dist/scene/scene-query.d.ts +11 -0
  333. package/dist/scene/scene-query.d.ts.map +1 -0
  334. package/dist/scene/scene-query.js +63 -0
  335. package/dist/scene/scene-types.d.ts +10 -0
  336. package/dist/scene/scene-types.d.ts.map +1 -0
  337. package/dist/scene/scene-types.js +8 -0
  338. package/dist/scene/scene-version.d.ts +26 -0
  339. package/dist/scene/scene-version.d.ts.map +1 -0
  340. package/dist/scene/scene-version.js +34 -0
  341. package/dist/scene/schema/animation.d.ts +8 -0
  342. package/dist/scene/schema/animation.d.ts.map +1 -0
  343. package/dist/scene/schema/animation.js +42 -0
  344. package/dist/scene/schema/audio.d.ts +13 -0
  345. package/dist/scene/schema/audio.d.ts.map +1 -0
  346. package/dist/scene/schema/audio.js +22 -0
  347. package/dist/scene/schema/camera.d.ts +28 -0
  348. package/dist/scene/schema/camera.d.ts.map +1 -0
  349. package/dist/scene/schema/camera.js +17 -0
  350. package/dist/scene/schema/collider.d.ts +40 -0
  351. package/dist/scene/schema/collider.d.ts.map +1 -0
  352. package/dist/scene/schema/collider.js +55 -0
  353. package/dist/scene/schema/entity-ref.d.ts +31 -0
  354. package/dist/scene/schema/entity-ref.d.ts.map +1 -0
  355. package/dist/scene/schema/entity-ref.js +61 -0
  356. package/dist/scene/schema/entity.d.ts +1036 -0
  357. package/dist/scene/schema/entity.d.ts.map +1 -0
  358. package/dist/scene/schema/entity.js +153 -0
  359. package/dist/scene/schema/environment.d.ts +425 -0
  360. package/dist/scene/schema/environment.d.ts.map +1 -0
  361. package/dist/scene/schema/environment.js +357 -0
  362. package/dist/scene/schema/index.d.ts +39 -0
  363. package/dist/scene/schema/index.d.ts.map +1 -0
  364. package/dist/scene/schema/index.js +20 -0
  365. package/dist/scene/schema/instances.d.ts +14 -0
  366. package/dist/scene/schema/instances.d.ts.map +1 -0
  367. package/dist/scene/schema/instances.js +28 -0
  368. package/dist/scene/schema/joint.d.ts +23 -0
  369. package/dist/scene/schema/joint.d.ts.map +1 -0
  370. package/dist/scene/schema/joint.js +23 -0
  371. package/dist/scene/schema/light.d.ts +38 -0
  372. package/dist/scene/schema/light.d.ts.map +1 -0
  373. package/dist/scene/schema/light.js +26 -0
  374. package/dist/scene/schema/material.d.ts +199 -0
  375. package/dist/scene/schema/material.d.ts.map +1 -0
  376. package/dist/scene/schema/material.js +99 -0
  377. package/dist/scene/schema/mesh.d.ts +48 -0
  378. package/dist/scene/schema/mesh.d.ts.map +1 -0
  379. package/dist/scene/schema/mesh.js +82 -0
  380. package/dist/scene/schema/particles.d.ts +2178 -0
  381. package/dist/scene/schema/particles.d.ts.map +1 -0
  382. package/dist/scene/schema/particles.js +321 -0
  383. package/dist/scene/schema/physics.d.ts +56 -0
  384. package/dist/scene/schema/physics.d.ts.map +1 -0
  385. package/dist/scene/schema/physics.js +37 -0
  386. package/dist/scene/schema/scene-file.d.ts +304 -0
  387. package/dist/scene/schema/scene-file.d.ts.map +1 -0
  388. package/dist/scene/schema/scene-file.js +262 -0
  389. package/dist/scene/schema/shadow.d.ts +28 -0
  390. package/dist/scene/schema/shadow.d.ts.map +1 -0
  391. package/dist/scene/schema/shadow.js +20 -0
  392. package/dist/scene/schema/spline.d.ts +25 -0
  393. package/dist/scene/schema/spline.d.ts.map +1 -0
  394. package/dist/scene/schema/spline.js +15 -0
  395. package/dist/scene/schema/tuples.d.ts +12 -0
  396. package/dist/scene/schema/tuples.d.ts.map +1 -0
  397. package/dist/scene/schema/tuples.js +14 -0
  398. package/dist/scene/schema/ui.d.ts +880 -0
  399. package/dist/scene/schema/ui.d.ts.map +1 -0
  400. package/dist/scene/schema/ui.js +506 -0
  401. package/dist/scene/user-data.d.ts +171 -0
  402. package/dist/scene/user-data.d.ts.map +1 -0
  403. package/dist/scene/user-data.js +137 -0
  404. package/dist/setup/setup-audio.d.ts +20 -0
  405. package/dist/setup/setup-audio.d.ts.map +1 -0
  406. package/dist/setup/setup-audio.js +41 -0
  407. package/dist/setup/setup-particles.d.ts +17 -0
  408. package/dist/setup/setup-particles.d.ts.map +1 -0
  409. package/dist/setup/setup-particles.js +16 -0
  410. package/dist/setup/setup-physics.d.ts +25 -0
  411. package/dist/setup/setup-physics.d.ts.map +1 -0
  412. package/dist/setup/setup-physics.js +51 -0
  413. package/dist/setup/setup-renderer.d.ts +69 -0
  414. package/dist/setup/setup-renderer.d.ts.map +1 -0
  415. package/dist/setup/setup-renderer.js +363 -0
  416. package/dist/tools/define-tool.d.ts +105 -0
  417. package/dist/tools/define-tool.d.ts.map +1 -0
  418. package/dist/tools/define-tool.js +82 -0
  419. package/dist/world2d/authoring-2d.d.ts +76 -0
  420. package/dist/world2d/authoring-2d.d.ts.map +1 -0
  421. package/dist/world2d/authoring-2d.js +176 -0
  422. package/dist/world2d/capture-to-scene2d.d.ts +5 -0
  423. package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
  424. package/dist/world2d/capture-to-scene2d.js +49 -0
  425. package/dist/world2d/collision-2d.d.ts +52 -0
  426. package/dist/world2d/collision-2d.d.ts.map +1 -0
  427. package/dist/world2d/collision-2d.js +70 -0
  428. package/dist/world2d/components-2d.d.ts +47 -0
  429. package/dist/world2d/components-2d.d.ts.map +1 -0
  430. package/dist/world2d/components-2d.js +77 -0
  431. package/dist/world2d/index.d.ts +34 -0
  432. package/dist/world2d/index.d.ts.map +1 -0
  433. package/dist/world2d/index.js +32 -0
  434. package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
  435. package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
  436. package/dist/world2d/ingest-iframe-2d.js +166 -0
  437. package/dist/world2d/ingest2d.d.ts +97 -0
  438. package/dist/world2d/ingest2d.d.ts.map +1 -0
  439. package/dist/world2d/ingest2d.js +40 -0
  440. package/dist/world2d/physics2d-registry.d.ts +24 -0
  441. package/dist/world2d/physics2d-registry.d.ts.map +1 -0
  442. package/dist/world2d/physics2d-registry.js +38 -0
  443. package/dist/world2d/pixi-game-adapter.d.ts +107 -0
  444. package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
  445. package/dist/world2d/pixi-game-adapter.js +211 -0
  446. package/dist/world2d/pixi-surface.d.ts +39 -0
  447. package/dist/world2d/pixi-surface.d.ts.map +1 -0
  448. package/dist/world2d/pixi-surface.js +47 -0
  449. package/dist/world2d/scene-capture-2d.d.ts +43 -0
  450. package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
  451. package/dist/world2d/scene-capture-2d.js +92 -0
  452. package/dist/world2d/scene2d-loader.d.ts +27 -0
  453. package/dist/world2d/scene2d-loader.d.ts.map +1 -0
  454. package/dist/world2d/scene2d-loader.js +274 -0
  455. package/dist/world2d/schema/entity2d.d.ts +102 -0
  456. package/dist/world2d/schema/entity2d.d.ts.map +1 -0
  457. package/dist/world2d/schema/entity2d.js +119 -0
  458. package/dist/world2d/schema/physics2d.d.ts +46 -0
  459. package/dist/world2d/schema/physics2d.d.ts.map +1 -0
  460. package/dist/world2d/schema/physics2d.js +45 -0
  461. package/dist/world2d/schema/sprite.d.ts +42 -0
  462. package/dist/world2d/schema/sprite.d.ts.map +1 -0
  463. package/dist/world2d/schema/sprite.js +63 -0
  464. package/dist/world2d/schema/tilemap.d.ts +15 -0
  465. package/dist/world2d/schema/tilemap.d.ts.map +1 -0
  466. package/dist/world2d/schema/tilemap.js +19 -0
  467. package/dist/world2d/schema/tuples2d.d.ts +20 -0
  468. package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
  469. package/dist/world2d/schema/tuples2d.js +19 -0
  470. package/dist/world2d/system-adapters-2d.d.ts +16 -0
  471. package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
  472. package/dist/world2d/system-adapters-2d.js +37 -0
  473. package/dist/world2d/transform-writer-2d.d.ts +16 -0
  474. package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
  475. package/dist/world2d/transform-writer-2d.js +22 -0
  476. package/dist/world2d/types.d.ts +53 -0
  477. package/dist/world2d/types.d.ts.map +1 -0
  478. package/dist/world2d/types.js +1 -0
  479. package/package.json +18 -4
  480. package/src/adapter/authoring.ts +10 -0
  481. package/src/adapter/first-party-systems.ts +23 -34
  482. package/src/adapter/index.ts +1 -3
  483. package/src/adapter/system-adapter.ts +15 -22
  484. package/src/adapter/vgai-scene-game-adapter.ts +5 -14
  485. package/src/animation/anim-graph-types.ts +12 -43
  486. package/src/animation/animation-clock.ts +479 -0
  487. package/src/animation/camera-ownership.ts +467 -0
  488. package/src/animation/cinematic-cues.ts +451 -0
  489. package/src/animation/clip-map.ts +41 -0
  490. package/src/animation/gsap-registration.ts +184 -0
  491. package/src/animation/theatre-clock-binding.ts +111 -0
  492. package/src/animation/theatre-director.ts +347 -0
  493. package/src/animation/theatre-object-binding.ts +661 -0
  494. package/src/animation/xstate-animation-binding.ts +398 -0
  495. package/src/animation/xstate-animation-meta.ts +282 -0
  496. package/src/audio/index.ts +39 -7
  497. package/src/audio/tone-clock-binding.ts +98 -0
  498. package/src/audio/tone-context.ts +129 -0
  499. package/src/audio/tone-offline-render.ts +167 -0
  500. package/src/audio/wav-encode.ts +119 -0
  501. package/src/core/game-loop.ts +17 -0
  502. package/src/core/types.ts +13 -0
  503. package/src/data/data-asset.ts +167 -0
  504. package/src/data/data-check-core.ts +242 -0
  505. package/src/data/data-ref.ts +145 -0
  506. package/src/data/vite-plugin-data.ts +290 -0
  507. package/src/index.ts +48 -0
  508. package/src/input/input-manager.ts +1206 -32
  509. package/src/input/input-types.ts +155 -3
  510. package/src/input/prompt-labels.ts +122 -0
  511. package/src/input/rebind-controller.ts +105 -0
  512. package/src/input/schema.ts +206 -52
  513. package/src/react/use-data.ts +114 -0
  514. package/src/react/use-selection.tsx +135 -0
  515. package/src/runtime/create-runtime.ts +30 -9
  516. package/src/runtime/render-audio-control.ts +168 -0
  517. package/src/runtime/render-control.ts +522 -0
  518. package/src/runtime/render-seed.ts +79 -0
  519. package/src/runtime/types.ts +0 -5
  520. package/src/scene/asset-loaders.ts +10 -36
  521. package/src/scene/asset-paths.ts +0 -2
  522. package/src/scene/asset-ref-check.ts +248 -0
  523. package/src/scene/parse.ts +133 -0
  524. package/src/scene/scene-loader.ts +81 -96
  525. package/src/scene/schema/animation.ts +30 -79
  526. package/src/scene/schema/entity.ts +20 -0
  527. package/src/scene/schema/index.ts +2 -12
  528. package/src/scene/user-data.ts +8 -9
  529. package/src/setup/setup-renderer.ts +9 -2
  530. package/src/tools/define-tool.ts +152 -0
  531. package/src/animation/anim-graph.ts +0 -406
  532. package/src/animation/anim-system.ts +0 -28
  533. package/src/animation/property-track.ts +0 -178
  534. package/src/animation/schema.ts +0 -204
  535. package/src/audio/ambient.ts +0 -300
  536. package/src/audio/impacts.ts +0 -212
  537. package/src/audio/movement.ts +0 -140
  538. package/src/audio/musical.ts +0 -200
  539. package/src/audio/ui-sounds.ts +0 -171
  540. package/src/audio/vehicle.ts +0 -235
  541. package/src/audio/weapons.ts +0 -152
@@ -1,14 +1,116 @@
1
- /** A single binding for an action */
1
+ /**
2
+ * A single binding for an action.
3
+ *
4
+ * F2 (spec §12 "Complete Device Backends") un-rejects `mouse_move` and
5
+ * `gamepad_axis_pair` — both now have real `InputManager` readers (see that
6
+ * file's `collectPointerDeltaContributions`/`collectVector2Contributions`):
7
+ * - `mouse_move` feeds a `'pointerDelta'`-valueType action with the raw
8
+ * accumulated mouse delta (no deadzone — deltas are not deadzoned, same
9
+ * rule as `test_pointer_delta`), and can ALSO feed a `'vector2'`-valueType
10
+ * action (the same delta, radial-deadzoned + unit-circle-clamped via
11
+ * `deadzone`) — e.g. an alternative look control. It does not feed a
12
+ * `'scalar'` action (no natural single-axis-select field is defined; add
13
+ * one if a real use case needs it).
14
+ * - `gamepad_axis_pair` feeds a `'vector2'`-valueType action with the
15
+ * coupled `(xAxis, yAxis)` reading, radial-deadzoned the same way a real
16
+ * analog stick is (default deadzone 0.15, matching `gamepad_axis`).
17
+ *
18
+ * F2 also adds `touch_button`/`touch_stick` below — the touch/virtual-control
19
+ * backend. Both are driven by `InputManager.setTouchButton`/`setTouchStick`
20
+ * (the injectable entry points a touch-control UI's own touchstart/
21
+ * touchmove/touchend handlers call — that DOM wiring is a thin adapter at
22
+ * the edge, browser-verified separately; the MAPPING here is unit-tested
23
+ * headlessly with no DOM). `sourceId` names the virtual control (a zone/
24
+ * knob id chosen by the touch UI), reusing the same field `test_*` bindings
25
+ * use for their named source — not a real device index.
26
+ */
2
27
  export type InputBinding =
3
28
  | { type: 'key'; code: string }
4
29
  | { type: 'mouse_button'; button: number }
5
- | { type: 'mouse_move' }
30
+ | { type: 'mouse_move'; deadzone?: number }
6
31
  | { type: 'gamepad_button'; button: number }
7
32
  | { type: 'gamepad_axis'; axis: number; direction: 'positive' | 'negative'; deadzone?: number }
8
- | { type: 'gamepad_axis_pair'; xAxis: number; yAxis: number; deadzone?: number };
33
+ | { type: 'gamepad_axis_pair'; xAxis: number; yAxis: number; deadzone?: number }
34
+ // F1 (spec §12) — the "injected test input" backend named in F2's acceptance criteria,
35
+ // built here as the typed value model's testable source (see input-manager.ts's
36
+ // injectAxis/injectVector2/injectPointerDelta/injectPointerPosition). Each is keyed by a
37
+ // caller-chosen `sourceId` (not a real device index) so tests can push synthetic raw values
38
+ // through the exact same aggregation/deadzone/combine path real device backends will use.
39
+ | { type: 'test_axis'; sourceId: string; deadzone?: number }
40
+ | { type: 'test_vector2'; sourceId: string; deadzone?: number }
41
+ | { type: 'test_pointer_delta'; sourceId: string }
42
+ | { type: 'test_pointer_position'; sourceId: string }
43
+ // F2 (spec §12) — touch/virtual controls. `touch_button` is digital (edge-
44
+ // tracked just like `mouse_button`); `touch_stick` is a `'vector2'`-valueType
45
+ // analog control (radial-deadzoned like a gamepad stick). See input-manager.ts's
46
+ // setTouchButton/setTouchStick.
47
+ | { type: 'touch_button'; sourceId: string }
48
+ | { type: 'touch_stick'; sourceId: string; deadzone?: number };
49
+
50
+ /**
51
+ * The value shape an action carries (F1, spec §12 "Define Typed Action Values"):
52
+ * - `'digital'` — boolean, with pressed/justPressed/justReleased edges (InputManager.isPressed
53
+ * et al.). The default when an action omits `valueType` — every action authored before F1
54
+ * is a digital action, so this stays backward compatible.
55
+ * - `'scalar'` — a single float axis (InputManager.getScalar), e.g. a throttle or a single
56
+ * thumbstick axis.
57
+ * - `'vector2'` — a {x,y} axis pair (InputManager.getVector2), e.g. movement/look.
58
+ * - `'pointerDelta'` — a {x,y} per-frame movement delta (InputManager.getPointerDelta),
59
+ * summed across contributing sources, cleared every frame (mirrors the existing
60
+ * mouseDeltaX/Y accumulator's per-frame-reset shape).
61
+ * - `'pointerPosition'` — a {x,y} absolute position (InputManager.getPointerPosition),
62
+ * last-write-wins across contributing sources (position isn't additive).
63
+ */
64
+ export type ActionValueType = 'digital' | 'scalar' | 'vector2' | 'pointerDelta' | 'pointerPosition';
65
+
66
+ /** A plain 2D vector — the shared shape for Vector2 axis pairs, pointer delta, and pointer
67
+ * position action values (F1). */
68
+ export interface Vector2 {
69
+ x: number;
70
+ y: number;
71
+ }
72
+
73
+ /**
74
+ * Maps an `ActionValueType` to its TS read type. This is the "no `any`" backbone behind
75
+ * `InputManager.readAction` (and, informally, behind each dedicated typed getter returning a
76
+ * concrete, non-`any` type): given a value type known at the call site (a literal, or a type
77
+ * parameter inferred from a caller's own action-value-type map), the return type is exact.
78
+ */
79
+ export type ActionValueOf<T extends ActionValueType> = T extends 'digital'
80
+ ? boolean
81
+ : T extends 'scalar'
82
+ ? number
83
+ : T extends 'vector2' | 'pointerDelta' | 'pointerPosition'
84
+ ? Vector2
85
+ : never;
86
+
87
+ /**
88
+ * Device/source metadata (F1 AC): which binding — and, for gamepad bindings, which connected
89
+ * gamepad, or for injected test bindings, which named source — produced an action's current
90
+ * value. Returned by the `*Source` sibling of each typed getter (e.g. `getScalarSource`).
91
+ */
92
+ export interface ActionValueSource {
93
+ /** The binding kind that produced the current value. */
94
+ bindingType: InputBinding['type'];
95
+ /** Present for `test_axis`/`test_vector2`/`test_pointer_delta`/`test_pointer_position`/
96
+ * `touch_button`/`touch_stick` bindings — the caller-chosen source id passed to the
97
+ * matching `inject*`/`setTouch*` call (F2 reuses this same field for named touch zones,
98
+ * not a real device index). */
99
+ sourceId?: string;
100
+ /** Present for `gamepad_button`/`gamepad_axis`/`gamepad_axis_pair` (F2) bindings — the
101
+ * index into `navigator.getGamepads()` of the gamepad that produced the value. */
102
+ gamepadIndex?: number;
103
+ /** F2 — present alongside `gamepadIndex` for `gamepad_button`/`gamepad_axis`/
104
+ * `gamepad_axis_pair` bindings: the connected gamepad's `Gamepad.id` (device identity,
105
+ * spec §12 F2 "expose device identity"), e.g. a vendor/product string. */
106
+ gamepadId?: string;
107
+ }
9
108
 
10
109
  /** An action has a name and one or more bindings */
11
110
  export interface InputAction {
111
+ /** Declares this action's value shape (F1). Optional — defaults to `'digital'`, matching
112
+ * every action authored before F1. See `ActionValueType` for the full set. */
113
+ valueType?: ActionValueType;
12
114
  bindings: InputBinding[];
13
115
  }
14
116
 
@@ -17,3 +119,53 @@ export interface InputMapFile {
17
119
  version: number;
18
120
  actions: Record<string, InputAction>;
19
121
  }
122
+
123
+ // =============================================================================
124
+ // F3 (spec §12 "Add Rebinding and Prompts") — rebinding + conflict + prompt
125
+ // types. See input-manager.ts's class doc comment for the full design note;
126
+ // these are the plain data shapes shared between `InputManager`'s rebinding
127
+ // API, the framework-free `RebindController` (rebind-controller.ts), and any
128
+ // UI (e.g. the template's `RebindPanel.tsx`) that surfaces them.
129
+ // =============================================================================
130
+
131
+ /**
132
+ * A structural conflict returned by `InputManager.findConflicts` (F3 AC
133
+ * "Conflicts are detected and returned structurally"): a proposed binding
134
+ * would collide with an EXISTING binding already registered on a different
135
+ * action. Never thrown — always a plain data array the caller (typically a
136
+ * rebinding UI) inspects and decides what to do with (block, warn, or let the
137
+ * user override).
138
+ */
139
+ export interface BindingConflict {
140
+ /** The other action whose existing binding collides with the proposed one. */
141
+ actionName: string;
142
+ /** That action's bindings-array index the collision was found at (stable
143
+ * enough to pass straight to `removeBinding`/`replaceBinding` if the UI
144
+ * offers "steal this binding"). */
145
+ bindingIndex: number;
146
+ /** The colliding binding itself. */
147
+ binding: InputBinding;
148
+ }
149
+
150
+ /**
151
+ * The coarse input-device family a prompt is being requested for (F3 AC "a
152
+ * current-device prompt API"). Keyboard and mouse are kept distinct — a
153
+ * binding list frequently carries one of each (e.g. `key` for movement,
154
+ * `mouse_button` for fire) and a prompt UI usually wants to show whichever
155
+ * one is bound, not conflate the two.
156
+ */
157
+ export type PromptDevice = 'keyboard' | 'mouse' | 'gamepad' | 'touch';
158
+
159
+ /**
160
+ * The resolved display prompt for one action's binding on a given device
161
+ * family (F3 AC: "resolves labels/icons such as `Space`, `A`, or a touch
162
+ * control"). `icon` is a short glyph/name a UI can look up in its own icon
163
+ * set (for keyboard it's the same short label; for gamepad it's the
164
+ * canonical button/glyph name, e.g. `'A'`; the UI decides how to render it).
165
+ */
166
+ export interface BindingPrompt {
167
+ device: PromptDevice;
168
+ bindingType: InputBinding['type'];
169
+ label: string;
170
+ icon: string;
171
+ }
@@ -0,0 +1,122 @@
1
+ // F3 (spec §12 "Add Rebinding and Prompts") — the device->label map behind
2
+ // `InputManager.getPrompt`. Pure data + pure functions, no InputManager
3
+ // dependency, so it's independently unit-testable and reusable by a
4
+ // rebinding UI that wants to render a label without going through a live
5
+ // InputManager instance (e.g. previewing a not-yet-applied binding).
6
+ //
7
+ // Labels intentionally favor short, conventional display strings over exact
8
+ // spec names (`'Ctrl'` not `'ControlLeft'`, `'A'` not `'button-0'`) — this is
9
+ // what a HUD prompt or rebinding list actually renders.
10
+
11
+ import type { InputBinding, PromptDevice } from './input-types';
12
+
13
+ /** `KeyboardEvent.code` values with a friendlier display label than the raw
14
+ * code string. Anything not listed here falls through to `keyLabel`'s
15
+ * `Key*`/`Digit*` stripping, or the raw code as a last resort. */
16
+ const KEY_LABELS: Record<string, string> = {
17
+ Space: 'Space',
18
+ Escape: 'Esc',
19
+ Enter: 'Enter',
20
+ NumpadEnter: 'Enter',
21
+ Tab: 'Tab',
22
+ Backspace: 'Backspace',
23
+ CapsLock: 'Caps Lock',
24
+ ArrowUp: '↑',
25
+ ArrowDown: '↓',
26
+ ArrowLeft: '←',
27
+ ArrowRight: '→',
28
+ ShiftLeft: 'Shift',
29
+ ShiftRight: 'Shift',
30
+ ControlLeft: 'Ctrl',
31
+ ControlRight: 'Ctrl',
32
+ AltLeft: 'Alt',
33
+ AltRight: 'Alt',
34
+ MetaLeft: 'Meta',
35
+ MetaRight: 'Meta',
36
+ };
37
+
38
+ /** Display label for a `KeyboardEvent.code` (F3 AC example: `'Space'`). */
39
+ export function keyLabel(code: string): string {
40
+ const known = KEY_LABELS[code];
41
+ if (known) return known;
42
+ if (code.startsWith('Key') && code.length === 4) return code.slice(3); // KeyW -> W
43
+ if (code.startsWith('Digit') && code.length === 6) return code.slice(5); // Digit1 -> 1
44
+ if (code.startsWith('Numpad')) return `Num ${code.slice(6)}`;
45
+ if (code.startsWith('F') && /^F\d+$/.test(code)) return code; // F1..F12 already short
46
+ return code;
47
+ }
48
+
49
+ const MOUSE_BUTTON_LABELS: Record<number, string> = {
50
+ 0: 'Left Click',
51
+ 1: 'Middle Click',
52
+ 2: 'Right Click',
53
+ 3: 'Mouse 4',
54
+ 4: 'Mouse 5',
55
+ };
56
+
57
+ /** Display label for a `MouseEvent.button` index. */
58
+ export function mouseButtonLabel(button: number): string {
59
+ return MOUSE_BUTTON_LABELS[button] ?? `Mouse ${button}`;
60
+ }
61
+
62
+ /** W3C Standard Gamepad button-index -> conventional face-button glyph name
63
+ * (F3 AC example: `'A'`). Only meaningful when `Gamepad.mapping === 'standard'`
64
+ * — see `InputManager.getPrompt`, which falls back to a raw index label when
65
+ * the connected pad doesn't report the standard mapping. */
66
+ export const STANDARD_GAMEPAD_BUTTON_LABELS: Record<number, string> = {
67
+ 0: 'A',
68
+ 1: 'B',
69
+ 2: 'X',
70
+ 3: 'Y',
71
+ 4: 'LB',
72
+ 5: 'RB',
73
+ 6: 'LT',
74
+ 7: 'RT',
75
+ 8: 'Back',
76
+ 9: 'Start',
77
+ 10: 'L3',
78
+ 11: 'R3',
79
+ 12: 'D-Up',
80
+ 13: 'D-Down',
81
+ 14: 'D-Left',
82
+ 15: 'D-Right',
83
+ 16: 'Home',
84
+ };
85
+
86
+ /** Display label for a single standard-mapping gamepad axis (a `gamepad_axis`
87
+ * binding — one half of a stick, or a trigger). */
88
+ export function gamepadAxisLabel(axis: number): string {
89
+ if (axis === 0 || axis === 1) return 'Left Stick';
90
+ if (axis === 2 || axis === 3) return 'Right Stick';
91
+ return `Axis ${axis}`;
92
+ }
93
+
94
+ /** Display label for a coupled `gamepad_axis_pair` binding. */
95
+ export function gamepadAxisPairLabel(xAxis: number, yAxis: number): string {
96
+ if (xAxis === 0 && yAxis === 1) return 'Left Stick';
97
+ if (xAxis === 2 && yAxis === 3) return 'Right Stick';
98
+ return `Axis ${xAxis}/${yAxis}`;
99
+ }
100
+
101
+ /** Which `PromptDevice` family a binding kind belongs to, or `null` for a
102
+ * binding kind with no real physical device (the synthetic `test_*` kinds —
103
+ * they're an injected-test-input source, never something to prompt a player
104
+ * about). */
105
+ export function bindingDeviceFamily(type: InputBinding['type']): PromptDevice | null {
106
+ switch (type) {
107
+ case 'key':
108
+ return 'keyboard';
109
+ case 'mouse_button':
110
+ case 'mouse_move':
111
+ return 'mouse';
112
+ case 'gamepad_button':
113
+ case 'gamepad_axis':
114
+ case 'gamepad_axis_pair':
115
+ return 'gamepad';
116
+ case 'touch_button':
117
+ case 'touch_stick':
118
+ return 'touch';
119
+ default:
120
+ return null;
121
+ }
122
+ }
@@ -0,0 +1,105 @@
1
+ // F3 (spec §12 "Add Rebinding and Prompts") — a framework-free rebinding
2
+ // STATE MACHINE over an `InputManager`. Deliberately has no dependency on
3
+ // React (or any UI library): "listen for the next input, surface a conflict,
4
+ // let the caller decide" is the same flow whether the caller is the
5
+ // template's `RebindPanel.tsx` (ordinary React, see that file) or any other
6
+ // UI/CLI. Keeping the logic here means it's unit-testable with no DOM/JSX at
7
+ // all, and the React component becomes a thin, mechanically-verifiable
8
+ // wrapper (see the template component's own doc comment).
9
+ //
10
+ // Flow: `listen(actionName)` -> caller captures the next raw input event
11
+ // itself (a keydown, a gamepad poll, a touch tap — capture is inherently
12
+ // device-specific and NOT this class's job) and turns it into an
13
+ // `InputBinding`, then calls `capture(binding)`. If the proposed binding is
14
+ // free, it's applied immediately and the state becomes `'applied'`. If it
15
+ // collides with another action's existing binding (per
16
+ // `InputManager.findConflicts`), the state becomes `'conflict'`, carrying the
17
+ // structured conflict list for the UI to show — the caller then calls either
18
+ // `resolveOverride()` (apply anyway) or `cancel()`.
19
+
20
+ import type { InputManager } from './input-manager';
21
+ import type { BindingConflict, InputBinding } from './input-types';
22
+
23
+ /** How a captured binding is applied once accepted. */
24
+ export type RebindMode = 'replace' | 'add';
25
+
26
+ export type RebindState =
27
+ | { status: 'idle' }
28
+ | { status: 'listening'; actionName: string; mode: RebindMode; index: number }
29
+ | {
30
+ status: 'conflict';
31
+ actionName: string;
32
+ mode: RebindMode;
33
+ index: number;
34
+ proposed: InputBinding;
35
+ conflicts: BindingConflict[];
36
+ }
37
+ | { status: 'applied'; actionName: string; binding: InputBinding };
38
+
39
+ export class RebindController {
40
+ private state: RebindState = { status: 'idle' };
41
+
42
+ constructor(private readonly input: InputManager) {}
43
+
44
+ getState(): RebindState {
45
+ return this.state;
46
+ }
47
+
48
+ /**
49
+ * Enter listening mode for `actionName`. `mode: 'replace'` (default)
50
+ * rebinds the slot at `index` (default 0 — the action's first/primary
51
+ * binding); `mode: 'add'` appends a new binding alongside the existing
52
+ * ones instead (`index` is ignored for `'add'`).
53
+ */
54
+ listen(actionName: string, mode: RebindMode = 'replace', index = 0): void {
55
+ this.state = { status: 'listening', actionName, mode, index };
56
+ }
57
+
58
+ /** Abandon listening/a pending conflict with no changes applied. */
59
+ cancel(): void {
60
+ this.state = { status: 'idle' };
61
+ }
62
+
63
+ /**
64
+ * Feed a captured raw `InputBinding` while in the `'listening'` state
65
+ * (a no-op returning the current state unchanged otherwise — e.g. a stray
66
+ * keypress arriving after the UI already cancelled). Checks
67
+ * `InputManager.findConflicts` first: a free binding is applied
68
+ * immediately (-> `'applied'`); a colliding one transitions to
69
+ * `'conflict'` instead of applying, so the UI can surface it before
70
+ * anything changes.
71
+ */
72
+ capture(binding: InputBinding): RebindState {
73
+ if (this.state.status !== 'listening') return this.state;
74
+ const { actionName, mode, index } = this.state;
75
+ const conflicts = this.input.findConflicts(binding, actionName);
76
+ if (conflicts.length > 0) {
77
+ this.state = { status: 'conflict', actionName, mode, index, proposed: binding, conflicts };
78
+ return this.state;
79
+ }
80
+ this.apply(actionName, mode, index, binding);
81
+ this.state = { status: 'applied', actionName, binding };
82
+ return this.state;
83
+ }
84
+
85
+ /**
86
+ * From a `'conflict'` state, apply the pending proposed binding anyway
87
+ * (the UI decided the collision is acceptable, e.g. "steal this binding").
88
+ * Does NOT remove the colliding binding from the other action — that is a
89
+ * separate, explicit `InputManager.removeBinding` call the UI can make
90
+ * first if it wants a true swap. A no-op (returns current state) unless a
91
+ * conflict is pending.
92
+ */
93
+ resolveOverride(): RebindState {
94
+ if (this.state.status !== 'conflict') return this.state;
95
+ const { actionName, mode, index, proposed } = this.state;
96
+ this.apply(actionName, mode, index, proposed);
97
+ this.state = { status: 'applied', actionName, binding: proposed };
98
+ return this.state;
99
+ }
100
+
101
+ private apply(actionName: string, mode: RebindMode, index: number, binding: InputBinding): void {
102
+ if (mode === 'add') this.input.addBinding(actionName, binding);
103
+ else this.input.replaceBinding(actionName, index, binding);
104
+ }
105
+ }