@jgengine/core 0.9.0 → 0.11.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 (631) hide show
  1. package/CHANGELOG.md +34 -3
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/spawnDirector.d.ts +19 -1
  21. package/dist/ai/spawnDirector.js +53 -26
  22. package/dist/ai/spawnPoint.d.ts +7 -0
  23. package/dist/ai/spawnPoint.js +7 -0
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/audio/audioFalloff.d.ts +5 -2
  35. package/dist/audio/music.d.ts +53 -0
  36. package/dist/audio/music.js +34 -0
  37. package/dist/audio/synth.d.ts +60 -0
  38. package/dist/audio/synth.js +8 -0
  39. package/dist/authoring.d.ts +15 -0
  40. package/dist/authoring.js +15 -0
  41. package/dist/board/laneBoard.d.ts +13 -0
  42. package/dist/board/laneBoard.js +13 -0
  43. package/dist/board/timelineBoard.d.ts +10 -0
  44. package/dist/board/timelineBoard.js +10 -0
  45. package/dist/combat/abilityKit.d.ts +18 -0
  46. package/dist/combat/abilityKit.js +24 -9
  47. package/dist/combat/animationState.d.ts +5 -0
  48. package/dist/combat/animationState.js +5 -0
  49. package/dist/combat/breakMeters.d.ts +10 -0
  50. package/dist/combat/breakMeters.js +10 -0
  51. package/dist/combat/castRunner.d.ts +5 -0
  52. package/dist/combat/castRunner.js +5 -0
  53. package/dist/combat/comboPoints.d.ts +5 -0
  54. package/dist/combat/comboPoints.js +5 -0
  55. package/dist/combat/comboString.d.ts +5 -0
  56. package/dist/combat/comboString.js +5 -0
  57. package/dist/combat/damageInterceptors.d.ts +192 -0
  58. package/dist/combat/damageInterceptors.js +251 -0
  59. package/dist/combat/damageMatchup.d.ts +68 -0
  60. package/dist/combat/damageMatchup.js +42 -0
  61. package/dist/combat/damageResolution.d.ts +63 -0
  62. package/dist/combat/damageResolution.js +50 -0
  63. package/dist/combat/death.d.ts +7 -1
  64. package/dist/combat/death.js +5 -0
  65. package/dist/combat/deathReason.d.ts +14 -0
  66. package/dist/combat/deathReason.js +1 -0
  67. package/dist/combat/defensiveWindow.d.ts +5 -0
  68. package/dist/combat/defensiveWindow.js +5 -0
  69. package/dist/combat/dotField.d.ts +47 -0
  70. package/dist/combat/dotField.js +52 -0
  71. package/dist/combat/downed.d.ts +5 -0
  72. package/dist/combat/downed.js +5 -0
  73. package/dist/combat/effects.d.ts +5 -0
  74. package/dist/combat/effects.js +5 -0
  75. package/dist/combat/encounterSequence.d.ts +258 -0
  76. package/dist/combat/encounterSequence.js +426 -0
  77. package/dist/combat/hitReaction.d.ts +57 -1
  78. package/dist/combat/hitReaction.js +45 -5
  79. package/dist/combat/magazine.d.ts +54 -0
  80. package/dist/combat/magazine.js +96 -0
  81. package/dist/combat/projectiles.d.ts +7 -2
  82. package/dist/combat/projectiles.js +48 -17
  83. package/dist/combat/receivedDamage.d.ts +117 -0
  84. package/dist/combat/receivedDamage.js +92 -0
  85. package/dist/combat/regenShield.d.ts +39 -0
  86. package/dist/combat/regenShield.js +49 -0
  87. package/dist/combat/renderCues.d.ts +51 -0
  88. package/dist/combat/renderCues.js +44 -0
  89. package/dist/combat/resourcePool.d.ts +5 -0
  90. package/dist/combat/resourcePool.js +5 -0
  91. package/dist/combat/rewardAllocation.d.ts +121 -0
  92. package/dist/combat/rewardAllocation.js +251 -0
  93. package/dist/combat/shotOrigin.d.ts +30 -1
  94. package/dist/combat/shotOrigin.js +70 -2
  95. package/dist/combat/statusApplication.d.ts +96 -0
  96. package/dist/combat/statusApplication.js +81 -0
  97. package/dist/combat/telegraph.d.ts +11 -2
  98. package/dist/combat/telegraph.js +11 -2
  99. package/dist/combat/thresholdCrossings.d.ts +85 -0
  100. package/dist/combat/thresholdCrossings.js +116 -0
  101. package/dist/combat.d.ts +34 -0
  102. package/dist/combat.js +34 -0
  103. package/dist/commands/commandRegistry.d.ts +11 -0
  104. package/dist/commands/commandRegistry.js +9 -2
  105. package/dist/crafting/crop.d.ts +18 -0
  106. package/dist/crafting/crop.js +18 -0
  107. package/dist/crafting/production.d.ts +5 -0
  108. package/dist/crafting/production.js +5 -0
  109. package/dist/devtools/rewriteTunables.d.ts +17 -0
  110. package/dist/devtools/rewriteTunables.js +276 -0
  111. package/dist/devtools/saveEndpoint.d.ts +46 -0
  112. package/dist/devtools/saveEndpoint.js +48 -0
  113. package/dist/devtools/transformTunables.d.ts +3 -0
  114. package/dist/devtools/transformTunables.js +3 -0
  115. package/dist/devtools/tunableSchema.d.ts +31 -0
  116. package/dist/devtools/tunableSchema.js +31 -0
  117. package/dist/economy/currency.d.ts +12 -1
  118. package/dist/economy/currency.js +12 -1
  119. package/dist/economy/listingBook.d.ts +91 -0
  120. package/dist/economy/listingBook.js +144 -0
  121. package/dist/economy/resourceLedger.d.ts +222 -0
  122. package/dist/economy/resourceLedger.js +353 -0
  123. package/dist/economy/sharedWallet.d.ts +14 -0
  124. package/dist/economy/sharedWallet.js +14 -0
  125. package/dist/economy/techTree.d.ts +12 -0
  126. package/dist/economy/techTree.js +12 -0
  127. package/dist/economy/wallet.d.ts +26 -2
  128. package/dist/economy/wallet.js +35 -6
  129. package/dist/editor/commands.d.ts +248 -0
  130. package/dist/editor/commands.js +865 -0
  131. package/dist/editor/document.d.ts +186 -0
  132. package/dist/editor/document.js +884 -0
  133. package/dist/editor/grid.d.ts +229 -0
  134. package/dist/editor/grid.js +366 -0
  135. package/dist/editor/gridAdapters.d.ts +80 -0
  136. package/dist/editor/gridAdapters.js +134 -0
  137. package/dist/editor/index.d.ts +97 -0
  138. package/dist/editor/index.js +10 -0
  139. package/dist/editor/liveSync.d.ts +127 -0
  140. package/dist/editor/liveSync.js +249 -0
  141. package/dist/editor/runtimeInspector.d.ts +88 -0
  142. package/dist/editor/runtimeInspector.js +239 -0
  143. package/dist/editor/types.d.ts +175 -0
  144. package/dist/editor/types.js +29 -0
  145. package/dist/faction/reputation.d.ts +5 -0
  146. package/dist/faction/reputation.js +5 -0
  147. package/dist/format/distance.d.ts +17 -0
  148. package/dist/format/distance.js +18 -0
  149. package/dist/format/duration.d.ts +27 -0
  150. package/dist/format/duration.js +45 -0
  151. package/dist/format/speed.d.ts +17 -0
  152. package/dist/format/speed.js +25 -0
  153. package/dist/game/connectedPlayers.d.ts +30 -0
  154. package/dist/game/connectedPlayers.js +21 -0
  155. package/dist/game/cosmetics.d.ts +9 -0
  156. package/dist/game/cosmetics.js +16 -0
  157. package/dist/game/defineGame.d.ts +141 -2
  158. package/dist/game/defineGame.js +39 -1
  159. package/dist/game/defineSystem.d.ts +88 -0
  160. package/dist/game/defineSystem.js +45 -0
  161. package/dist/game/dialogue.d.ts +33 -0
  162. package/dist/game/dialogue.js +21 -0
  163. package/dist/game/events.d.ts +50 -13
  164. package/dist/game/events.js +5 -0
  165. package/dist/game/feed.d.ts +33 -0
  166. package/dist/game/feed.js +35 -2
  167. package/dist/game/gamePhase.d.ts +11 -0
  168. package/dist/game/gamePhase.js +16 -0
  169. package/dist/game/keyValueStore.d.ts +25 -0
  170. package/dist/game/keyValueStore.js +61 -0
  171. package/dist/game/leaderboard.d.ts +5 -0
  172. package/dist/game/leaderboard.js +5 -0
  173. package/dist/game/levelSequence.d.ts +24 -2
  174. package/dist/game/levelSequence.js +51 -2
  175. package/dist/game/loadout.d.ts +5 -0
  176. package/dist/game/loadout.js +5 -0
  177. package/dist/game/lootFilter.d.ts +2 -0
  178. package/dist/game/lootFilter.js +2 -0
  179. package/dist/game/lootPipeline.d.ts +164 -0
  180. package/dist/game/lootPipeline.js +216 -0
  181. package/dist/game/lootTable.d.ts +21 -0
  182. package/dist/game/lootTable.js +15 -4
  183. package/dist/game/modelAnimation.d.ts +8 -0
  184. package/dist/game/modelAnimation.js +18 -0
  185. package/dist/game/objectives.d.ts +43 -0
  186. package/dist/game/objectives.js +36 -0
  187. package/dist/game/paramLayers.d.ts +148 -0
  188. package/dist/game/paramLayers.js +185 -0
  189. package/dist/game/ping.d.ts +5 -0
  190. package/dist/game/ping.js +5 -0
  191. package/dist/game/playableGame.d.ts +160 -12
  192. package/dist/game/quest.d.ts +8 -0
  193. package/dist/game/quest.js +29 -0
  194. package/dist/game/race.d.ts +141 -0
  195. package/dist/game/race.js +169 -0
  196. package/dist/game/recordBook.d.ts +5 -5
  197. package/dist/game/recordBook.js +4 -1
  198. package/dist/game/ruleSelection.d.ts +75 -0
  199. package/dist/game/ruleSelection.js +127 -0
  200. package/dist/game/runDraft.d.ts +5 -0
  201. package/dist/game/runDraft.js +5 -0
  202. package/dist/game/saveStore.d.ts +111 -0
  203. package/dist/game/saveStore.js +312 -0
  204. package/dist/game/snapshotHistory.d.ts +67 -0
  205. package/dist/game/snapshotHistory.js +95 -0
  206. package/dist/game/social.d.ts +38 -1
  207. package/dist/game/social.js +71 -0
  208. package/dist/game/spawnPoints.d.ts +5 -0
  209. package/dist/game/spawnPoints.js +5 -0
  210. package/dist/game/systemRuntime.d.ts +50 -0
  211. package/dist/game/systemRuntime.js +157 -0
  212. package/dist/game/systemSchedule.d.ts +72 -0
  213. package/dist/game/systemSchedule.js +242 -0
  214. package/dist/game/toasts.d.ts +43 -0
  215. package/dist/game/toasts.js +44 -0
  216. package/dist/game/trade.d.ts +10 -0
  217. package/dist/game/trade.js +10 -0
  218. package/dist/game/unlocks.d.ts +8 -0
  219. package/dist/game/unlocks.js +16 -0
  220. package/dist/game/vfxInstance.d.ts +138 -0
  221. package/dist/game/vfxInstance.js +96 -0
  222. package/dist/game/worldItem.d.ts +17 -4
  223. package/dist/game/worldItem.js +17 -4
  224. package/dist/gameplay.d.ts +91 -0
  225. package/dist/gameplay.js +91 -0
  226. package/dist/index.d.ts +5 -7
  227. package/dist/index.js +5 -7
  228. package/dist/input/actionBindings.d.ts +24 -5
  229. package/dist/input/actionBindings.js +23 -5
  230. package/dist/input/axisInput.d.ts +13 -1
  231. package/dist/input/axisInput.js +22 -1
  232. package/dist/input/controlGroups.d.ts +67 -0
  233. package/dist/input/controlGroups.js +41 -0
  234. package/dist/input/touchScheme.d.ts +82 -6
  235. package/dist/input/touchScheme.js +123 -10
  236. package/dist/interaction/contextMenu.d.ts +1 -0
  237. package/dist/interaction/contextMenu.js +1 -0
  238. package/dist/interaction/lockpick.d.ts +61 -0
  239. package/dist/interaction/lockpick.js +168 -0
  240. package/dist/interaction/proximityPrompt.d.ts +5 -1
  241. package/dist/interaction/proximityPrompt.js +5 -3
  242. package/dist/interaction/qte.d.ts +5 -0
  243. package/dist/interaction/qte.js +5 -0
  244. package/dist/interaction/skillCheck.d.ts +5 -0
  245. package/dist/interaction/skillCheck.js +5 -0
  246. package/dist/inventory/inventoryModel.d.ts +12 -0
  247. package/dist/inventory/inventoryModel.js +12 -0
  248. package/dist/inventory/shapedGrid.d.ts +16 -0
  249. package/dist/inventory/shapedGrid.js +16 -0
  250. package/dist/inventory/slotModel.d.ts +10 -0
  251. package/dist/inventory/slotModel.js +10 -0
  252. package/dist/item/durability.d.ts +5 -0
  253. package/dist/item/durability.js +5 -0
  254. package/dist/item/itemIdentity.d.ts +171 -0
  255. package/dist/item/itemIdentity.js +138 -0
  256. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  257. package/dist/item/itemInstanceRegistry.js +34 -0
  258. package/dist/item/itemgen.d.ts +163 -0
  259. package/dist/item/itemgen.js +151 -0
  260. package/dist/item/modularItem.d.ts +5 -0
  261. package/dist/item/modularItem.js +5 -0
  262. package/dist/item/use.d.ts +5 -0
  263. package/dist/item/use.js +5 -0
  264. package/dist/item/useBehavior.d.ts +142 -0
  265. package/dist/item/useBehavior.js +105 -0
  266. package/dist/item/weapon.d.ts +5 -0
  267. package/dist/item/weapon.js +5 -0
  268. package/dist/math/scalar.d.ts +25 -0
  269. package/dist/math/scalar.js +47 -0
  270. package/dist/meta/changelog.d.ts +4 -1
  271. package/dist/meta/changelog.js +36 -1
  272. package/dist/movement/avoidance.d.ts +45 -0
  273. package/dist/movement/avoidance.js +123 -0
  274. package/dist/movement/cameraRig.d.ts +8 -0
  275. package/dist/movement/cameraRig.js +8 -0
  276. package/dist/movement/dash.d.ts +11 -0
  277. package/dist/movement/dash.js +11 -0
  278. package/dist/movement/formation.d.ts +135 -0
  279. package/dist/movement/formation.js +194 -0
  280. package/dist/movement/glideModel.d.ts +5 -0
  281. package/dist/movement/glideModel.js +5 -0
  282. package/dist/movement/grappleSwing.d.ts +5 -0
  283. package/dist/movement/grappleSwing.js +5 -0
  284. package/dist/movement/leaderTrail.d.ts +5 -0
  285. package/dist/movement/leaderTrail.js +5 -0
  286. package/dist/movement/movementModel.d.ts +38 -7
  287. package/dist/movement/movementModel.js +54 -13
  288. package/dist/movement/playerMovement.d.ts +41 -0
  289. package/dist/movement/playerMovement.js +236 -0
  290. package/dist/movement/poseState.d.ts +13 -0
  291. package/dist/movement/poseState.js +16 -0
  292. package/dist/movement/steering.d.ts +8 -0
  293. package/dist/movement/steering.js +18 -0
  294. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  295. package/dist/multiplayer/combatSnapshot.js +3 -0
  296. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  297. package/dist/multiplayer/lagCompensation.js +5 -0
  298. package/dist/multiplayer/presenceModel.d.ts +9 -1
  299. package/dist/multiplayer/presenceModel.js +9 -1
  300. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  301. package/dist/multiplayer/simultaneousCommit.js +3 -0
  302. package/dist/multiplayer.d.ts +11 -0
  303. package/dist/multiplayer.js +11 -0
  304. package/dist/nav/pathFollow.d.ts +57 -0
  305. package/dist/nav/pathFollow.js +109 -0
  306. package/dist/orders/orderKinds.d.ts +156 -0
  307. package/dist/orders/orderKinds.js +197 -0
  308. package/dist/orders/orderQueue.d.ts +208 -0
  309. package/dist/orders/orderQueue.js +211 -0
  310. package/dist/physics/drivableVehicle.d.ts +29 -0
  311. package/dist/physics/drivableVehicle.js +16 -0
  312. package/dist/physics/kinematicVehicle.d.ts +21 -1
  313. package/dist/physics/kinematicVehicle.js +23 -8
  314. package/dist/physics/physicsWorld.d.ts +24 -12
  315. package/dist/physics/physicsWorld.js +11 -5
  316. package/dist/physics/radialImpulse.d.ts +25 -0
  317. package/dist/physics/radialImpulse.js +27 -0
  318. package/dist/procedural.d.ts +3 -0
  319. package/dist/procedural.js +3 -0
  320. package/dist/progression/statGraph.d.ts +116 -0
  321. package/dist/progression/statGraph.js +318 -0
  322. package/dist/puzzle/cellGrid.d.ts +9 -0
  323. package/dist/puzzle/cellGrid.js +9 -0
  324. package/dist/puzzle/fallingPiece.d.ts +9 -0
  325. package/dist/puzzle/fallingPiece.js +9 -0
  326. package/dist/puzzle/nonogram.d.ts +39 -0
  327. package/dist/puzzle/nonogram.js +136 -0
  328. package/dist/random/nameGen.d.ts +5 -0
  329. package/dist/random/nameGen.js +5 -0
  330. package/dist/random/pick.d.ts +8 -0
  331. package/dist/random/pick.js +31 -0
  332. package/dist/random/rng.d.ts +24 -0
  333. package/dist/random/rng.js +30 -8
  334. package/dist/random/seedLink.d.ts +4 -0
  335. package/dist/random/seedLink.js +4 -0
  336. package/dist/relation/keyedValues.d.ts +54 -0
  337. package/dist/relation/keyedValues.js +115 -0
  338. package/dist/relation/thresholds.d.ts +62 -0
  339. package/dist/relation/thresholds.js +62 -0
  340. package/dist/render/color.d.ts +12 -0
  341. package/dist/render/color.js +26 -0
  342. package/dist/render/lookPreset.d.ts +41 -0
  343. package/dist/render/lookPreset.js +29 -0
  344. package/dist/render/postProcessing.d.ts +76 -0
  345. package/dist/render/postProcessing.js +21 -0
  346. package/dist/rules/predicate.d.ts +53 -0
  347. package/dist/rules/predicate.js +64 -0
  348. package/dist/rules/ruleEffects.d.ts +38 -0
  349. package/dist/rules/ruleEffects.js +37 -0
  350. package/dist/rules/triggeredRules.d.ts +160 -0
  351. package/dist/rules/triggeredRules.js +241 -0
  352. package/dist/runtime/adapter.d.ts +58 -0
  353. package/dist/runtime/adapter.js +54 -5
  354. package/dist/runtime/cameraDirector.d.ts +1 -0
  355. package/dist/runtime/cameraDirector.js +1 -0
  356. package/dist/runtime/commandRunner.d.ts +1 -0
  357. package/dist/runtime/commandRunner.js +1 -0
  358. package/dist/runtime/context/combatFx.d.ts +23 -0
  359. package/dist/runtime/context/combatFx.js +161 -0
  360. package/dist/runtime/context/registries.d.ts +13 -0
  361. package/dist/runtime/context/registries.js +84 -0
  362. package/dist/runtime/context/worldItems.d.ts +21 -0
  363. package/dist/runtime/context/worldItems.js +37 -0
  364. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  365. package/dist/runtime/descriptors/baseline.js +134 -0
  366. package/dist/runtime/descriptors/features.d.ts +74 -0
  367. package/dist/runtime/descriptors/features.js +281 -0
  368. package/dist/runtime/gameContext.d.ts +163 -19
  369. package/dist/runtime/gameContext.js +385 -339
  370. package/dist/runtime/gameRuntime.d.ts +1 -0
  371. package/dist/runtime/gameRuntime.js +1 -0
  372. package/dist/runtime/headlessRunner.d.ts +60 -0
  373. package/dist/runtime/headlessRunner.js +44 -0
  374. package/dist/runtime/hostPersistence.d.ts +12 -0
  375. package/dist/runtime/hostPersistence.js +12 -0
  376. package/dist/runtime/hostedGameRunner.d.ts +54 -0
  377. package/dist/runtime/hostedGameRunner.js +85 -0
  378. package/dist/runtime/hostedWorldSession.d.ts +73 -0
  379. package/dist/runtime/hostedWorldSession.js +64 -0
  380. package/dist/runtime/inputSnapshot.d.ts +21 -3
  381. package/dist/runtime/inputSnapshot.js +8 -2
  382. package/dist/runtime/motionIntents.d.ts +12 -1
  383. package/dist/runtime/motionIntents.js +26 -1
  384. package/dist/runtime/perContext.d.ts +15 -0
  385. package/dist/runtime/perContext.js +21 -0
  386. package/dist/runtime/runtimeSave.d.ts +79 -0
  387. package/dist/runtime/runtimeSave.js +105 -0
  388. package/dist/runtime/save.d.ts +4 -0
  389. package/dist/runtime/save.js +4 -0
  390. package/dist/runtime/snapshot.d.ts +7 -0
  391. package/dist/runtime/snapshot.js +7 -0
  392. package/dist/runtime/visibility.d.ts +2 -1
  393. package/dist/runtime/visibility.js +2 -1
  394. package/dist/runtime/worldChannel.d.ts +62 -0
  395. package/dist/runtime/worldChannel.js +114 -0
  396. package/dist/runtime/worldMirror.d.ts +36 -0
  397. package/dist/runtime/worldMirror.js +44 -0
  398. package/dist/runtime/worldProjection.d.ts +47 -0
  399. package/dist/runtime/worldProjection.js +52 -0
  400. package/dist/runtime/worldReplication.d.ts +69 -0
  401. package/dist/runtime/worldReplication.js +217 -0
  402. package/dist/runtime/worldSnapshot.d.ts +44 -0
  403. package/dist/runtime/worldSnapshot.js +30 -0
  404. package/dist/scene/assetCatalog.d.ts +22 -0
  405. package/dist/scene/assetCatalog.js +4 -0
  406. package/dist/scene/assetDiagnostics.d.ts +69 -0
  407. package/dist/scene/assetDiagnostics.js +110 -0
  408. package/dist/scene/assetGenerator.d.ts +65 -0
  409. package/dist/scene/assetGenerator.js +64 -0
  410. package/dist/scene/assetSpace.d.ts +137 -0
  411. package/dist/scene/assetSpace.js +259 -0
  412. package/dist/scene/authoredTriggers.d.ts +169 -0
  413. package/dist/scene/authoredTriggers.js +340 -0
  414. package/dist/scene/behaviorRuntime.d.ts +75 -0
  415. package/dist/scene/behaviorRuntime.js +217 -0
  416. package/dist/scene/behaviors.d.ts +14 -2
  417. package/dist/scene/behaviors.js +7 -2
  418. package/dist/scene/bodyBind.d.ts +60 -0
  419. package/dist/scene/bodyBind.js +51 -0
  420. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  421. package/dist/scene/builtinSceneKinds.js +62 -0
  422. package/dist/scene/colliders.d.ts +18 -0
  423. package/dist/scene/colliders.js +61 -1
  424. package/dist/scene/entityStats.d.ts +13 -0
  425. package/dist/scene/entityStats.js +30 -0
  426. package/dist/scene/entityStore.d.ts +41 -1
  427. package/dist/scene/entityStore.js +75 -0
  428. package/dist/scene/facing.d.ts +18 -0
  429. package/dist/scene/facing.js +26 -0
  430. package/dist/scene/modelSockets.d.ts +33 -0
  431. package/dist/scene/modelSockets.js +29 -0
  432. package/dist/scene/objectQuery.d.ts +2 -0
  433. package/dist/scene/objectQuery.js +2 -0
  434. package/dist/scene/objectStore.d.ts +4 -0
  435. package/dist/scene/objectStore.js +6 -0
  436. package/dist/scene/possession.d.ts +8 -0
  437. package/dist/scene/possession.js +14 -0
  438. package/dist/scene/roster.d.ts +3 -0
  439. package/dist/scene/roster.js +12 -0
  440. package/dist/scene/sceneKinds.d.ts +240 -0
  441. package/dist/scene/sceneKinds.js +214 -0
  442. package/dist/scene/sceneOwnership.d.ts +169 -0
  443. package/dist/scene/sceneOwnership.js +179 -0
  444. package/dist/scene/selectionBookmarks.d.ts +93 -0
  445. package/dist/scene/selectionBookmarks.js +122 -0
  446. package/dist/scene/vehicleSeat.d.ts +68 -0
  447. package/dist/scene/vehicleSeat.js +59 -0
  448. package/dist/sensor/concealment.d.ts +3 -0
  449. package/dist/sensor/concealment.js +3 -0
  450. package/dist/sensor/freezeMonitor.d.ts +1 -0
  451. package/dist/sensor/freezeMonitor.js +1 -0
  452. package/dist/sensor/frustumSensor.d.ts +7 -3
  453. package/dist/sensor/frustumSensor.js +7 -3
  454. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  455. package/dist/sensor/hiddenStateProbe.js +5 -2
  456. package/dist/sensor/recordingBuffer.d.ts +2 -1
  457. package/dist/sensor/recordingBuffer.js +2 -1
  458. package/dist/sensor/replayLoop.d.ts +6 -2
  459. package/dist/sensor/replayLoop.js +6 -2
  460. package/dist/sensor/revealQuery.d.ts +2 -1
  461. package/dist/sensor/revealQuery.js +2 -1
  462. package/dist/sensor/visionCone.d.ts +10 -3
  463. package/dist/sensor/visionCone.js +10 -3
  464. package/dist/session/contestedChannel.d.ts +1 -0
  465. package/dist/session/contestedChannel.js +1 -0
  466. package/dist/session/extraction.d.ts +1 -0
  467. package/dist/session/extraction.js +1 -0
  468. package/dist/session/roles.d.ts +6 -0
  469. package/dist/session/roles.js +6 -0
  470. package/dist/session/roundState.d.ts +8 -0
  471. package/dist/session/roundState.js +2 -0
  472. package/dist/settings/settingsModel.d.ts +1 -0
  473. package/dist/settings/settingsModel.js +1 -0
  474. package/dist/stats/accumulatorMeter.d.ts +6 -0
  475. package/dist/stats/accumulatorMeter.js +6 -0
  476. package/dist/stats/eventMeter.d.ts +5 -0
  477. package/dist/stats/eventMeter.js +5 -0
  478. package/dist/stats/rollCheck.d.ts +5 -0
  479. package/dist/stats/rollCheck.js +5 -0
  480. package/dist/stats/statModifiers.d.ts +5 -0
  481. package/dist/stats/statModifiers.js +5 -0
  482. package/dist/store/defineKeyedStore.d.ts +38 -0
  483. package/dist/store/defineKeyedStore.js +42 -0
  484. package/dist/store/defineStore.d.ts +33 -0
  485. package/dist/store/defineStore.js +35 -0
  486. package/dist/store/observableKeyedStore.d.ts +9 -0
  487. package/dist/store/observableKeyedStore.js +43 -2
  488. package/dist/survival/decayMeter.d.ts +55 -0
  489. package/dist/survival/decayMeter.js +130 -55
  490. package/dist/survival/moodle.d.ts +2 -0
  491. package/dist/survival/regionHealth.d.ts +6 -0
  492. package/dist/survival/regionHealth.js +5 -0
  493. package/dist/tactics/fallingGrid.d.ts +6 -4
  494. package/dist/tactics/fallingGrid.js +6 -4
  495. package/dist/tactics/predictiveQuery.d.ts +3 -0
  496. package/dist/tactics/predictiveQuery.js +3 -0
  497. package/dist/tactics/snapshot.d.ts +2 -0
  498. package/dist/tactics/snapshot.js +2 -0
  499. package/dist/tactics/surface.d.ts +1 -0
  500. package/dist/tactics/surface.js +1 -0
  501. package/dist/tactics/tacticalGrid.d.ts +1 -0
  502. package/dist/tactics/tacticalGrid.js +1 -0
  503. package/dist/time/beatClock.d.ts +14 -4
  504. package/dist/time/beatClock.js +14 -4
  505. package/dist/time/calendarClock.d.ts +3 -0
  506. package/dist/time/calendarClock.js +3 -0
  507. package/dist/time/idleProgress.d.ts +4 -0
  508. package/dist/time/idleProgress.js +4 -0
  509. package/dist/time/simClock.d.ts +2 -0
  510. package/dist/time/simClock.js +20 -5
  511. package/dist/ui/actionModel.d.ts +110 -0
  512. package/dist/ui/actionModel.js +159 -0
  513. package/dist/ui/gameLayout.d.ts +144 -0
  514. package/dist/ui/gameLayout.js +148 -0
  515. package/dist/ui/hudDocument.d.ts +114 -0
  516. package/dist/ui/hudDocument.js +220 -0
  517. package/dist/ui/hudLayout.d.ts +33 -1
  518. package/dist/ui/hudLayout.js +204 -17
  519. package/dist/ui/orientation.d.ts +39 -0
  520. package/dist/ui/orientation.js +49 -0
  521. package/dist/ui/selectionModel.d.ts +92 -0
  522. package/dist/ui/selectionModel.js +88 -0
  523. package/dist/ui/swingTimer.d.ts +42 -0
  524. package/dist/ui/swingTimer.js +38 -0
  525. package/dist/ui/tooltipModel.d.ts +63 -0
  526. package/dist/ui/tooltipModel.js +82 -0
  527. package/dist/ui.d.ts +15 -0
  528. package/dist/ui.js +15 -0
  529. package/dist/visibility/bounds.d.ts +8 -1
  530. package/dist/visibility/bounds.js +8 -1
  531. package/dist/visibility/frustum.d.ts +12 -3
  532. package/dist/visibility/frustum.js +12 -3
  533. package/dist/visibility/spatialIndex.js +34 -20
  534. package/dist/work/jobQueue.d.ts +201 -0
  535. package/dist/work/jobQueue.js +253 -0
  536. package/dist/work/unitTraining.d.ts +58 -0
  537. package/dist/work/unitTraining.js +52 -0
  538. package/dist/world/authoredObjects.d.ts +58 -0
  539. package/dist/world/authoredObjects.js +69 -0
  540. package/dist/world/buildingGenerator.d.ts +18 -0
  541. package/dist/world/buildingGenerator.js +62 -0
  542. package/dist/world/buildings.d.ts +5 -0
  543. package/dist/world/buildings.js +5 -0
  544. package/dist/world/catenary.d.ts +22 -0
  545. package/dist/world/catenary.js +69 -0
  546. package/dist/world/environmentSummary.d.ts +11 -2
  547. package/dist/world/environmentSummary.js +11 -1
  548. package/dist/world/features.d.ts +244 -7
  549. package/dist/world/features.js +92 -4
  550. package/dist/world/footprintGrid.d.ts +59 -0
  551. package/dist/world/footprintGrid.js +141 -0
  552. package/dist/world/geometry.d.ts +64 -0
  553. package/dist/world/geometry.js +94 -0
  554. package/dist/world/grassKind.d.ts +51 -0
  555. package/dist/world/grassKind.js +101 -0
  556. package/dist/world/pathInstances.d.ts +27 -0
  557. package/dist/world/pathInstances.js +27 -0
  558. package/dist/world/pathTerrain.d.ts +80 -0
  559. package/dist/world/pathTerrain.js +142 -0
  560. package/dist/world/placeAsset.d.ts +81 -0
  561. package/dist/world/placeAsset.js +77 -0
  562. package/dist/world/placement.d.ts +4 -0
  563. package/dist/world/placement.js +4 -0
  564. package/dist/world/placementController.d.ts +6 -0
  565. package/dist/world/placementController.js +6 -0
  566. package/dist/world/polyline.d.ts +34 -0
  567. package/dist/world/polyline.js +81 -0
  568. package/dist/world/roads.d.ts +55 -0
  569. package/dist/world/roads.js +184 -0
  570. package/dist/world/scatterRegion.d.ts +164 -0
  571. package/dist/world/scatterRegion.js +409 -0
  572. package/dist/world/sceneShapes.d.ts +43 -0
  573. package/dist/world/sceneShapes.js +1 -0
  574. package/dist/world/segment.d.ts +27 -0
  575. package/dist/world/segment.js +43 -0
  576. package/dist/world/soilKind.d.ts +48 -0
  577. package/dist/world/soilKind.js +92 -0
  578. package/dist/world/spatialSample.d.ts +241 -0
  579. package/dist/world/spatialSample.js +465 -0
  580. package/dist/world/streets.d.ts +80 -0
  581. package/dist/world/streets.js +144 -0
  582. package/dist/world/terraform.d.ts +213 -1
  583. package/dist/world/terraform.js +655 -20
  584. package/dist/world/terrain.d.ts +138 -12
  585. package/dist/world/terrain.js +346 -28
  586. package/dist/world/terrainGuides.d.ts +182 -0
  587. package/dist/world/terrainGuides.js +343 -0
  588. package/dist/world/vec2.d.ts +81 -0
  589. package/dist/world/vec2.js +128 -0
  590. package/dist/world/vec3.d.ts +49 -0
  591. package/dist/world/vec3.js +76 -0
  592. package/dist/world/vegetation.d.ts +71 -0
  593. package/dist/world/vegetation.js +151 -0
  594. package/dist/world/visibilityField.d.ts +154 -0
  595. package/dist/world/visibilityField.js +271 -0
  596. package/dist/world/volumetricClouds.d.ts +52 -0
  597. package/dist/world/volumetricClouds.js +43 -0
  598. package/dist/world/walls.d.ts +9 -0
  599. package/dist/world/walls.js +9 -0
  600. package/dist/world/waterKind.d.ts +55 -0
  601. package/dist/world/waterKind.js +99 -0
  602. package/dist/world.d.ts +132 -0
  603. package/dist/world.js +132 -0
  604. package/package.json +32 -8
  605. package/skills/jgengine/SKILL.md +51 -0
  606. package/skills/jgengine/api.md +434 -0
  607. package/skills/jgengine/capabilities.md +29 -0
  608. package/skills/jgengine/reference-cartridge.md +72 -0
  609. package/skills/jgengine-combat/SKILL.md +34 -0
  610. package/skills/jgengine-combat/api.md +549 -0
  611. package/skills/jgengine-combat/capabilities.md +169 -0
  612. package/skills/jgengine-combat/reference.md +98 -0
  613. package/skills/jgengine-gameplay/SKILL.md +39 -0
  614. package/skills/jgengine-gameplay/api.md +1794 -0
  615. package/skills/jgengine-gameplay/capabilities.md +378 -0
  616. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  617. package/skills/jgengine-world/SKILL.md +38 -0
  618. package/skills/jgengine-world/api.md +2652 -0
  619. package/skills/jgengine-world/capabilities.md +370 -0
  620. package/skills/jgengine-world/reference.md +222 -0
  621. package/dist/cartridge/runtime.d.ts +0 -15
  622. package/dist/cartridge/runtime.js +0 -556
  623. package/dist/cartridge/spec.d.ts +0 -188
  624. package/dist/cartridge/spec.js +0 -19
  625. package/dist/cartridge/validate.d.ts +0 -2
  626. package/dist/cartridge/validate.js +0 -78
  627. package/dist/store/engineStore.d.ts +0 -22
  628. package/dist/store/engineStore.js +0 -50
  629. package/dist/store/features.d.ts +0 -10
  630. package/dist/store/features.js +0 -23
  631. package/llms.txt +0 -4983
@@ -0,0 +1,240 @@
1
+ /**
2
+ * The parametric-studio seam: a registry that maps an editor object `kind` to a typed parameter
3
+ * schema (drives the inspector + `meta` parse/validation), an optional pure-data `resolve` (turns a
4
+ * document object into renderable data), and `+ Add` menu metadata. Registering a kind lets a third
5
+ * party ship a new authorable "studio" (pole line, water, bookcase) — schema + resolver here, a
6
+ * matching renderer in `shell` — without editing editor or engine files. Scatter is the proof adopter.
7
+ */
8
+ /** Which document collection a scene kind lives in. Drives placement + which `meta` bag holds params. */
9
+ export type SceneKindTarget = "path" | "marker" | "volume";
10
+ /** A closed-polygon area vs an open polyline, for path-target kinds. Ignored for marker/volume kinds. */
11
+ export type ScenePathShape = "area" | "line";
12
+ /** One weighted entry in a `weightedList` param — an item id and its relative spawn weight. */
13
+ export interface WeightedParamEntry {
14
+ item: string;
15
+ weight: number;
16
+ }
17
+ /** A numeric slider row: bounded range with a live readout. */
18
+ export interface RangeParamField {
19
+ type: "range";
20
+ key: string;
21
+ label?: string;
22
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
23
+ group?: string;
24
+ min: number;
25
+ max: number;
26
+ step?: number;
27
+ default: number;
28
+ /** Suffix shown next to the readout, e.g. "m" or "/m²". */
29
+ unit?: string;
30
+ }
31
+ /** A free numeric input, optionally clamped. */
32
+ export interface NumberParamField {
33
+ type: "number";
34
+ key: string;
35
+ label?: string;
36
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
37
+ group?: string;
38
+ step?: number;
39
+ default: number;
40
+ min?: number;
41
+ max?: number;
42
+ }
43
+ /** A checkbox. */
44
+ export interface BoolParamField {
45
+ type: "bool";
46
+ key: string;
47
+ label?: string;
48
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
49
+ group?: string;
50
+ default: boolean;
51
+ }
52
+ /** A dropdown of fixed string options. */
53
+ export interface SelectParamField {
54
+ type: "select";
55
+ key: string;
56
+ label?: string;
57
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
58
+ group?: string;
59
+ options: readonly {
60
+ value: string;
61
+ label?: string;
62
+ }[];
63
+ default: string;
64
+ }
65
+ /** A hex color picker. */
66
+ export interface ColorParamField {
67
+ type: "color";
68
+ key: string;
69
+ label?: string;
70
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
71
+ group?: string;
72
+ default: string;
73
+ }
74
+ /** A free string input. */
75
+ export interface TextParamField {
76
+ type: "text";
77
+ key: string;
78
+ label?: string;
79
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
80
+ group?: string;
81
+ default: string;
82
+ }
83
+ /** A seed string with a reroll button — same seed reproduces the same generated result. */
84
+ export interface SeedParamField {
85
+ type: "seed";
86
+ key: string;
87
+ label?: string;
88
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
89
+ group?: string;
90
+ default: string;
91
+ }
92
+ /** A repeatable list of weighted `{ item, weight }` rows (species palette, book set, …). */
93
+ export interface WeightedListParamField {
94
+ type: "weightedList";
95
+ key: string;
96
+ label?: string;
97
+ /** Optional group id — the inspector renders fields sharing a group under one collapsible section. */
98
+ group?: string;
99
+ /** Placeholder for the item id input. */
100
+ itemLabel?: string;
101
+ default: readonly WeightedParamEntry[];
102
+ }
103
+ /**
104
+ * A button row that runs a built-in inspector action on its group — currently `"randomize"` (reroll
105
+ * the group's numeric/seed/bool/select fields within their bounds) or `"reset"` (restore group
106
+ * defaults). Carries no persisted value; purely a control.
107
+ */
108
+ export interface ActionParamField {
109
+ type: "action";
110
+ key: string;
111
+ label?: string;
112
+ group?: string;
113
+ action: "randomize" | "reset";
114
+ }
115
+ /** One row in a kind's parameter schema — the union the generic inspector knows how to render. */
116
+ export type ParamField = RangeParamField | NumberParamField | BoolParamField | SelectParamField | ColorParamField | TextParamField | SeedParamField | WeightedListParamField | ActionParamField;
117
+ /** A named, optionally-collapsed section the inspector groups fields under (by `field.group === id`). */
118
+ export interface ParamGroup {
119
+ id: string;
120
+ label: string;
121
+ /** Start collapsed. Default expanded. */
122
+ collapsed?: boolean;
123
+ }
124
+ /** A kind's full parameter surface: an ordered list of fields the inspector renders top-to-bottom. */
125
+ export interface ParamSchema {
126
+ fields: readonly ParamField[];
127
+ /** Optional named sections; fields reference one by `group`. Ungrouped fields render first, headerless. */
128
+ groups?: readonly ParamGroup[];
129
+ }
130
+ /** Parsed params after `parseParams`: every schema field present with a validated, defaulted value. */
131
+ export type ParsedParams = Record<string, number | boolean | string | WeightedParamEntry[]>;
132
+ /**
133
+ * Parse a raw `meta` bag against a schema into typed params — every field present, invalid/missing
134
+ * values replaced by the field default, numbers clamped to their range. The single parser every
135
+ * studio shares instead of hand-writing its own `metaNumber`/`metaBool` ladder.
136
+ */
137
+ export declare function parseParams(schema: ParamSchema, meta: Record<string, unknown> | undefined): ParsedParams;
138
+ /** One validation problem found by {@link validateParams}: which field and why. */
139
+ export interface ParamIssue {
140
+ key: string;
141
+ message: string;
142
+ }
143
+ /**
144
+ * Check a raw `meta` bag against a schema without mutating it — reports out-of-range numbers, unknown
145
+ * select values, and wrong types. Empty array means valid. Used by `set_meta` to reject bad agent
146
+ * patches before they land in the document.
147
+ * @internal
148
+ */
149
+ export declare function validateParams(schema: ParamSchema, meta: Record<string, unknown> | undefined): ParamIssue[];
150
+ /**
151
+ * A `meta` patch that randomizes every field in `groupId` within its bounds — the "randomize" button's
152
+ * behavior, pure and injectable so it's deterministic in tests. Ranges/numbers land in `[min, max]`
153
+ * (integer-rounded when `step >= 1`), bools/selects pick uniformly, seeds get a fresh token, colors a
154
+ * random mid-tone. Text and weighted lists are left untouched.
155
+ * @internal
156
+ */
157
+ export declare function randomizeGroupParams(schema: ParamSchema, groupId: string | undefined, random: () => number): Record<string, unknown>;
158
+ /** A `meta` patch restoring every field in `groupId` to its schema default — the "reset" button. @internal */
159
+ export declare function resetGroupParams(schema: ParamSchema, groupId: string | undefined): Record<string, unknown>;
160
+ /** The `meta` patch that fills a fresh object of a kind with its schema defaults. @internal */
161
+ export declare function defaultParamMeta(schema: ParamSchema): Record<string, unknown>;
162
+ /**
163
+ * A registered scene kind — everything the editor/engine need to author and render a studio without
164
+ * bespoke code. `schema` drives the inspector + parse; `resolve` (optional) turns one document object
165
+ * into pure renderable data a matching `shell` renderer consumes; `add*` fields build the `+ Add` menu.
166
+ * @typeParam TResolved — the kind's renderable payload (scatter instances, pole+cable set, …).
167
+ */
168
+ export interface SceneKindDefinition<TResolved = unknown> {
169
+ kind: string;
170
+ target: SceneKindTarget;
171
+ /** Human label for the inspector header and `+ Add` entry. */
172
+ label: string;
173
+ schema: ParamSchema;
174
+ /** For path kinds: closed area (default) or open line. Ignored for markers/volumes. */
175
+ pathShape?: ScenePathShape;
176
+ /** `+ Add` menu section this kind lists under (e.g. "Studios"). Omit to hide from the menu. */
177
+ addCategory?: string;
178
+ /** Accent color for the inspector panel + `+ Add` entry, as a hex string. */
179
+ accent?: string;
180
+ /**
181
+ * Turn one document object (its geometry + parsed params) into pure renderable data. Pure — no
182
+ * three.js/DOM. Omitted for kinds whose renderer reads the object directly. `object` is the raw
183
+ * marker/volume/path; `params` is `parseParams(schema, object.meta)`.
184
+ */
185
+ resolve?: (object: SceneKindObject, params: ParsedParams, context: SceneKindResolveContext) => TResolved;
186
+ /** Optional one-line readout under the inspector fields (estimate, dimensions) — owned by the studio. */
187
+ note?: (object: SceneKindObject, params: ParsedParams) => string;
188
+ }
189
+ /** The raw document object a resolver receives — shape shared by markers, volumes, and paths. */
190
+ export interface SceneKindObject {
191
+ id: string;
192
+ kind: string;
193
+ meta?: Record<string, unknown>;
194
+ /** Present for path targets: the polyline/polygon points (XZ used). */
195
+ points?: readonly {
196
+ x: number;
197
+ y: number;
198
+ z: number;
199
+ }[];
200
+ /** Present for marker targets: the placed position. */
201
+ position?: {
202
+ x: number;
203
+ y: number;
204
+ z: number;
205
+ };
206
+ /** Present for volume targets: the region center. */
207
+ center?: {
208
+ x: number;
209
+ y: number;
210
+ z: number;
211
+ };
212
+ /** Present for volume targets: box half-extents. */
213
+ halfExtents?: {
214
+ x: number;
215
+ y: number;
216
+ z: number;
217
+ };
218
+ /** Present for volume targets: sphere/cylinder radius. */
219
+ radius?: number;
220
+ rotationY?: number;
221
+ }
222
+ /** Ground sampler + options a resolver may read (terrain height/normal snap). */
223
+ export interface SceneKindResolveContext {
224
+ sampleHeight?: (x: number, z: number) => number;
225
+ sampleNormal?: (x: number, z: number) => readonly [number, number, number];
226
+ }
227
+ /**
228
+ * Register a scene kind — the plug-in point for a new parametric studio. Idempotent per `kind` (last
229
+ * registration wins), so a game's registration overrides a default. Call at module load; the editor
230
+ * inspector, `+ Add` menu, and `AuthoredScene` renderer lookup all read this registry.
231
+ */
232
+ export declare function registerSceneKind<TResolved>(definition: SceneKindDefinition<TResolved>): void;
233
+ /** The registered definition for a kind, or undefined if the kind is a plain (non-studio) kind. @internal */
234
+ export declare function getSceneKind(kind: string): SceneKindDefinition | undefined;
235
+ /** True when a kind has a registered studio definition (schema/inspector/renderer). @internal */
236
+ export declare function isSceneKind(kind: string): boolean;
237
+ /** Every registered kind, optionally filtered by target, in registration order. @internal */
238
+ export declare function listSceneKinds(target?: SceneKindTarget): SceneKindDefinition[];
239
+ /** Parse a document object's `meta` against its registered kind schema, or `null` if unregistered. @internal */
240
+ export declare function parseSceneKindParams(object: SceneKindObject): ParsedParams | null;
@@ -0,0 +1,214 @@
1
+ /**
2
+ * The parametric-studio seam: a registry that maps an editor object `kind` to a typed parameter
3
+ * schema (drives the inspector + `meta` parse/validation), an optional pure-data `resolve` (turns a
4
+ * document object into renderable data), and `+ Add` menu metadata. Registering a kind lets a third
5
+ * party ship a new authorable "studio" (pole line, water, bookcase) — schema + resolver here, a
6
+ * matching renderer in `shell` — without editing editor or engine files. Scatter is the proof adopter.
7
+ */
8
+ function num(value, fallback, min, max) {
9
+ let n = typeof value === "number" && Number.isFinite(value) ? value : fallback;
10
+ if (min !== undefined)
11
+ n = Math.max(min, n);
12
+ if (max !== undefined)
13
+ n = Math.min(max, n);
14
+ return n;
15
+ }
16
+ function readWeightedList(value, fallback) {
17
+ if (!Array.isArray(value))
18
+ return fallback.map((entry) => ({ ...entry }));
19
+ const entries = value
20
+ .filter((entry) => typeof entry === "object" && entry !== null)
21
+ .map((entry) => ({
22
+ item: typeof entry.item === "string" ? entry.item : "",
23
+ weight: num(entry.weight, 1, 0),
24
+ }))
25
+ .filter((entry) => entry.item.length > 0);
26
+ return entries.length > 0 ? entries : fallback.map((entry) => ({ ...entry }));
27
+ }
28
+ /**
29
+ * Parse a raw `meta` bag against a schema into typed params — every field present, invalid/missing
30
+ * values replaced by the field default, numbers clamped to their range. The single parser every
31
+ * studio shares instead of hand-writing its own `metaNumber`/`metaBool` ladder.
32
+ */
33
+ export function parseParams(schema, meta) {
34
+ const out = {};
35
+ for (const field of schema.fields) {
36
+ const raw = meta?.[field.key];
37
+ switch (field.type) {
38
+ case "range":
39
+ out[field.key] = num(raw, field.default, field.min, field.max);
40
+ break;
41
+ case "number":
42
+ out[field.key] = num(raw, field.default, field.min, field.max);
43
+ break;
44
+ case "bool":
45
+ out[field.key] = typeof raw === "boolean" ? raw : field.default;
46
+ break;
47
+ case "select": {
48
+ const allowed = field.options.some((option) => option.value === raw);
49
+ out[field.key] = allowed ? raw : field.default;
50
+ break;
51
+ }
52
+ case "color":
53
+ case "text":
54
+ case "seed":
55
+ out[field.key] = typeof raw === "string" ? raw : field.default;
56
+ break;
57
+ case "weightedList":
58
+ out[field.key] = readWeightedList(raw, field.default);
59
+ break;
60
+ case "action":
61
+ break;
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ /**
67
+ * Check a raw `meta` bag against a schema without mutating it — reports out-of-range numbers, unknown
68
+ * select values, and wrong types. Empty array means valid. Used by `set_meta` to reject bad agent
69
+ * patches before they land in the document.
70
+ * @internal
71
+ */
72
+ export function validateParams(schema, meta) {
73
+ const issues = [];
74
+ if (meta === undefined)
75
+ return issues;
76
+ for (const field of schema.fields) {
77
+ const raw = meta[field.key];
78
+ if (raw === undefined)
79
+ continue;
80
+ switch (field.type) {
81
+ case "range":
82
+ if (typeof raw !== "number" || !Number.isFinite(raw))
83
+ issues.push({ key: field.key, message: "expected a number" });
84
+ else if (raw < field.min || raw > field.max)
85
+ issues.push({ key: field.key, message: `out of range ${field.min}..${field.max}` });
86
+ break;
87
+ case "number":
88
+ if (typeof raw !== "number" || !Number.isFinite(raw))
89
+ issues.push({ key: field.key, message: "expected a number" });
90
+ else if ((field.min !== undefined && raw < field.min) || (field.max !== undefined && raw > field.max))
91
+ issues.push({ key: field.key, message: "out of range" });
92
+ break;
93
+ case "bool":
94
+ if (typeof raw !== "boolean")
95
+ issues.push({ key: field.key, message: "expected a boolean" });
96
+ break;
97
+ case "select":
98
+ if (!field.options.some((option) => option.value === raw))
99
+ issues.push({ key: field.key, message: "not an allowed option" });
100
+ break;
101
+ case "color":
102
+ case "text":
103
+ case "seed":
104
+ if (typeof raw !== "string")
105
+ issues.push({ key: field.key, message: "expected a string" });
106
+ break;
107
+ case "weightedList":
108
+ if (!Array.isArray(raw))
109
+ issues.push({ key: field.key, message: "expected an array" });
110
+ break;
111
+ case "action":
112
+ break;
113
+ }
114
+ }
115
+ return issues;
116
+ }
117
+ function randomHex(random) {
118
+ const channel = () => Math.floor(60 + random() * 180)
119
+ .toString(16)
120
+ .padStart(2, "0");
121
+ return `#${channel()}${channel()}${channel()}`;
122
+ }
123
+ /**
124
+ * A `meta` patch that randomizes every field in `groupId` within its bounds — the "randomize" button's
125
+ * behavior, pure and injectable so it's deterministic in tests. Ranges/numbers land in `[min, max]`
126
+ * (integer-rounded when `step >= 1`), bools/selects pick uniformly, seeds get a fresh token, colors a
127
+ * random mid-tone. Text and weighted lists are left untouched.
128
+ * @internal
129
+ */
130
+ export function randomizeGroupParams(schema, groupId, random) {
131
+ const patch = {};
132
+ for (const field of schema.fields) {
133
+ if (field.group !== groupId)
134
+ continue;
135
+ switch (field.type) {
136
+ case "range": {
137
+ const value = field.min + random() * (field.max - field.min);
138
+ patch[field.key] = field.step !== undefined && field.step >= 1 ? Math.round(value) : Math.round(value * 1000) / 1000;
139
+ break;
140
+ }
141
+ case "number": {
142
+ if (field.min !== undefined && field.max !== undefined)
143
+ patch[field.key] = Math.round((field.min + random() * (field.max - field.min)) * 1000) / 1000;
144
+ else
145
+ patch[field.key] = Math.round(field.default * (0.5 + random()) * 1000) / 1000;
146
+ break;
147
+ }
148
+ case "bool":
149
+ patch[field.key] = random() < 0.5;
150
+ break;
151
+ case "select":
152
+ patch[field.key] = field.options[Math.floor(random() * field.options.length)].value;
153
+ break;
154
+ case "seed":
155
+ patch[field.key] = `r${Math.floor(random() * 1_000_000).toString(36)}`;
156
+ break;
157
+ case "color":
158
+ patch[field.key] = randomHex(random);
159
+ break;
160
+ case "text":
161
+ case "weightedList":
162
+ case "action":
163
+ break;
164
+ }
165
+ }
166
+ return patch;
167
+ }
168
+ /** A `meta` patch restoring every field in `groupId` to its schema default — the "reset" button. @internal */
169
+ export function resetGroupParams(schema, groupId) {
170
+ const patch = {};
171
+ for (const field of schema.fields) {
172
+ if (field.group !== groupId || field.type === "action")
173
+ continue;
174
+ patch[field.key] = field.type === "weightedList" ? field.default.map((entry) => ({ ...entry })) : field.default;
175
+ }
176
+ return patch;
177
+ }
178
+ /** The `meta` patch that fills a fresh object of a kind with its schema defaults. @internal */
179
+ export function defaultParamMeta(schema) {
180
+ const out = {};
181
+ for (const field of schema.fields) {
182
+ if (field.type === "action")
183
+ continue;
184
+ out[field.key] = field.type === "weightedList" ? field.default.map((entry) => ({ ...entry })) : field.default;
185
+ }
186
+ return out;
187
+ }
188
+ const registry = new Map();
189
+ /**
190
+ * Register a scene kind — the plug-in point for a new parametric studio. Idempotent per `kind` (last
191
+ * registration wins), so a game's registration overrides a default. Call at module load; the editor
192
+ * inspector, `+ Add` menu, and `AuthoredScene` renderer lookup all read this registry.
193
+ */
194
+ export function registerSceneKind(definition) {
195
+ registry.set(definition.kind, definition);
196
+ }
197
+ /** The registered definition for a kind, or undefined if the kind is a plain (non-studio) kind. @internal */
198
+ export function getSceneKind(kind) {
199
+ return registry.get(kind);
200
+ }
201
+ /** True when a kind has a registered studio definition (schema/inspector/renderer). @internal */
202
+ export function isSceneKind(kind) {
203
+ return registry.has(kind);
204
+ }
205
+ /** Every registered kind, optionally filtered by target, in registration order. @internal */
206
+ export function listSceneKinds(target) {
207
+ const all = [...registry.values()];
208
+ return target === undefined ? all : all.filter((definition) => definition.target === target);
209
+ }
210
+ /** Parse a document object's `meta` against its registered kind schema, or `null` if unregistered. @internal */
211
+ export function parseSceneKindParams(object) {
212
+ const definition = registry.get(object.kind);
213
+ return definition === undefined ? null : parseParams(definition.schema, object.meta);
214
+ }
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Scene ownership boundary — gives every editor-visible object an explicit
3
+ * provenance and a single verdict (expose / bake / reject) so the editor never
4
+ * presents unauthored content as broken authored content.
5
+ *
6
+ * The product invariant is "author world content in the editor": the scene
7
+ * document is the source of truth. Runtime code, procedural generators, and
8
+ * simulation still put objects in front of the player that the document never
9
+ * described. This module classifies each such object by where it comes from and
10
+ * decides whether the editor may author it, may offer to bake it into the
11
+ * document, or must reject it as read-only runtime content — with a diagnostic
12
+ * that explains the decision. Genuinely runtime-only content is then declared
13
+ * with a reason rather than silently tolerated or exempted by game name.
14
+ *
15
+ * Everything here is plain serializable data and pure functions, so a
16
+ * {@link SceneOwnershipManifest} round-trips through JSON and the verdict for an
17
+ * object is deterministic given its declaration.
18
+ */
19
+ /** Where an editor-visible object comes from — its authorship provenance. */
20
+ export type SceneProvenanceKind = "authored" | "generated" | "runtime" | "transient";
21
+ /** A first-class entry in the scene document — the editor fully owns and persists it. */
22
+ export interface AuthoredProvenance {
23
+ readonly kind: "authored";
24
+ /** Stable id of the object in the scene document. */
25
+ readonly documentId: string;
26
+ }
27
+ /**
28
+ * An object derived from an authored document object — instances scattered from a
29
+ * painted layer, walls extruded from an authored footprint. Edits belong on the
30
+ * source object, not the generated instance.
31
+ */
32
+ export interface GeneratedProvenance {
33
+ readonly kind: "generated";
34
+ /** Document object this instance was generated from. */
35
+ readonly sourceDocumentId: string;
36
+ /** Stable id of the generated instance. */
37
+ readonly instanceId: string;
38
+ }
39
+ /**
40
+ * An object owned entirely by runtime or procedural code with no document entry.
41
+ * Not authorable unless its provider can bake it into schema-valid authored data.
42
+ */
43
+ export interface RuntimeProvenance {
44
+ readonly kind: "runtime";
45
+ /** Stable id of the runtime provider that owns this object. */
46
+ readonly providerId: string;
47
+ /** Stable id of the object within the provider. */
48
+ readonly instanceId: string;
49
+ }
50
+ /** An ephemeral simulation object — a spawned agent, projectile, or particle that never persists. */
51
+ export interface TransientProvenance {
52
+ readonly kind: "transient";
53
+ /** Stable id of the runtime provider that spawned this object. */
54
+ readonly providerId: string;
55
+ /** Stable id of the object within the provider. */
56
+ readonly instanceId: string;
57
+ }
58
+ /** The provenance of one editor-visible object — authored, generated, runtime, or transient. */
59
+ export type SceneProvenance = AuthoredProvenance | GeneratedProvenance | RuntimeProvenance | TransientProvenance;
60
+ /** What a provider lets the editor do with one of its objects. Absent flags default to `false`. */
61
+ export interface ProviderCapabilities {
62
+ /** Editor may select the object. */
63
+ readonly select?: boolean;
64
+ /** Editor may focus/frame the camera on it. */
65
+ readonly focus?: boolean;
66
+ /** Editor may hide it from the viewport. */
67
+ readonly hide?: boolean;
68
+ /** Provider can emit schema-valid authored data (stable ids, undoable) to bake this object into the document. */
69
+ readonly bake?: boolean;
70
+ }
71
+ /** A provider's explicit ownership declaration for one editor-visible object. */
72
+ export interface SceneOwnershipDeclaration {
73
+ /** Where the object comes from. */
74
+ readonly provenance: SceneProvenance;
75
+ /** What the provider lets the editor do with it. */
76
+ readonly capabilities?: ProviderCapabilities;
77
+ /**
78
+ * Human-readable justification for why this object is not an authored document
79
+ * object. Required for `runtime`/`transient` provenance without a `bake`
80
+ * capability — its absence is a boundary violation (unowned content
81
+ * masquerading as scene content).
82
+ */
83
+ readonly reason?: string;
84
+ }
85
+ /** The boundary's resolution for one object. */
86
+ export type OwnershipDecision = "expose" | "bake" | "reject";
87
+ /** The full verdict for one object: its decision plus the flags and diagnostic the editor needs to act on it. */
88
+ export interface OwnershipVerdict {
89
+ /** `expose` (authorable), `bake` (offer import), or `reject` (read-only runtime content). */
90
+ readonly decision: OwnershipDecision;
91
+ /** The provenance kind that produced this decision. */
92
+ readonly provenance: SceneProvenanceKind;
93
+ /** The editor must present the object read-only — authoring edits are not accepted. */
94
+ readonly readOnly: boolean;
95
+ /** A "bake/import to document" action should be offered for this object. */
96
+ readonly bakeable: boolean;
97
+ /** Diagnostic string the editor can surface next to the object. */
98
+ readonly reason: string;
99
+ /** Set when the declaration breaks the ownership contract; the editor and content gate should flag it. */
100
+ readonly violation?: string;
101
+ }
102
+ /** One boundary problem found while auditing a set of declarations. */
103
+ export interface OwnershipDiagnostic {
104
+ /** Key identifying the offending object (its provenance id when audited from a manifest). */
105
+ readonly key: string;
106
+ /** Provenance kind of the offending object. */
107
+ readonly provenance: SceneProvenanceKind;
108
+ /** The decision the object resolved to (always `reject` for a violation). */
109
+ readonly decision: OwnershipDecision;
110
+ /** Human-readable violation message. */
111
+ readonly message: string;
112
+ }
113
+ /** Serializable record of a world's ownership declarations — persisted next to the scene document or shipped by a game. */
114
+ export interface SceneOwnershipManifest {
115
+ /** Schema version; currently {@link SCENE_OWNERSHIP_MANIFEST_VERSION}. */
116
+ readonly version: 1;
117
+ /** Optional label for the provider/world these declarations describe. */
118
+ readonly provider?: string;
119
+ /** The per-object ownership declarations. */
120
+ readonly declarations: readonly SceneOwnershipDeclaration[];
121
+ }
122
+ /** Current {@link SceneOwnershipManifest} schema version. */
123
+ export declare const SCENE_OWNERSHIP_MANIFEST_VERSION = 1;
124
+ /**
125
+ * Resolve one declaration into a single boundary verdict.
126
+ *
127
+ * - `authored` and `generated` provenance -> **expose** (generated objects are
128
+ * read-only; edit their source document object).
129
+ * - `runtime`/`transient` with a `bake` capability -> **bake** (offer import).
130
+ * - `runtime`/`transient` without `bake` -> **reject** (read-only); a missing
131
+ * `reason` marks it a boundary violation — content bypassing the document with
132
+ * no authored home, no way to bake, and no declared justification.
133
+ *
134
+ * @capability scene-ownership classify an editor-visible object as expose/bake/reject with a diagnostic
135
+ */
136
+ export declare function classifyOwnership(declaration: SceneOwnershipDeclaration): OwnershipVerdict;
137
+ /**
138
+ * Stable identity string for a provenance (e.g. `runtime:town/building-3`), suitable
139
+ * for keying an object in an editor tree or a diagnostics table.
140
+ *
141
+ * @capability scene-ownership derive a stable object key from its provenance
142
+ */
143
+ export declare function ownershipKey(provenance: SceneProvenance): string;
144
+ /**
145
+ * Audit a keyed set of declarations and return one diagnostic per object that
146
+ * breaks the boundary contract (a `reject` verdict carrying a `violation`).
147
+ * Deterministic: diagnostics come back in the iteration order of `entries`.
148
+ *
149
+ * @capability scene-ownership audit editor-visible objects and report boundary violations
150
+ */
151
+ export declare function collectOwnershipDiagnostics(entries: Iterable<readonly [string, SceneOwnershipDeclaration]>): OwnershipDiagnostic[];
152
+ /**
153
+ * Audit every declaration in a manifest, keying diagnostics by each object's
154
+ * provenance id. An empty result means the manifest declares all of its content
155
+ * cleanly — every object is authored, generated, bakeable, or a reasoned
156
+ * runtime/transient object.
157
+ *
158
+ * @capability scene-ownership audit a whole ownership manifest for boundary violations
159
+ */
160
+ export declare function auditManifest(manifest: SceneOwnershipManifest): OwnershipDiagnostic[];
161
+ /**
162
+ * Narrow unknown parsed JSON to a {@link SceneOwnershipManifest}. Structural only —
163
+ * verifies the version, the declarations array, and each declaration's provenance
164
+ * shape; it does not judge whether declarations satisfy the boundary (use
165
+ * {@link auditManifest} for that).
166
+ *
167
+ * @capability scene-ownership validate a serialized ownership manifest loaded from disk
168
+ */
169
+ export declare function isSceneOwnershipManifest(value: unknown): value is SceneOwnershipManifest;