@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,163 @@
1
+ /**
2
+ * One selectable option in a generation step's pool: a stable `id` used in provenance and pinning,
3
+ * the payload `value` a chosen option contributes, and an optional relative `weight` (default 1).
4
+ */
5
+ export interface GenOption<V = unknown> {
6
+ id: string;
7
+ value: V;
8
+ weight?: number;
9
+ }
10
+ /**
11
+ * Read-only view of the choices resolved so far, threaded into a later step's pool, constraint,
12
+ * weight function, or transform so a decision can depend on earlier picks (dependent choice).
13
+ */
14
+ export interface GenChoices {
15
+ /** Whether a step has resolved to a (non-skipped) option. */
16
+ has(step: string): boolean;
17
+ /** The chosen option id for a step, or undefined if unresolved or skipped. */
18
+ optionId(step: string): string | undefined;
19
+ /** The chosen option value for a step, or undefined if unresolved or skipped. */
20
+ value<V = unknown>(step: string): V | undefined;
21
+ }
22
+ /**
23
+ * A step's candidate options: a fixed list, or a function of the choices resolved so far so pools
24
+ * can narrow to earlier picks (a slot pool that depends on a chosen category).
25
+ */
26
+ export type GenPool<V = unknown> = readonly GenOption<V>[] | ((choices: GenChoices) => readonly GenOption<V>[]);
27
+ /**
28
+ * One decision point in a {@link GenSchema}: pick a single option from a pool, honoring an optional
29
+ * constraint, dependent weighting, selection mode, and optionality. Steps resolve in array order.
30
+ */
31
+ export interface GenStep<V = unknown> {
32
+ id: string;
33
+ pool: GenPool<V>;
34
+ /** `"weighted"` (default) picks proportional to weight; `"uniform"` ignores weight and picks evenly. */
35
+ select?: "weighted" | "uniform";
36
+ /** Constraint: only options for which this returns true are eligible, given the earlier choices. */
37
+ accept?: (option: GenOption<V>, choices: GenChoices) => boolean;
38
+ /** Override an option's weight as a function of earlier choices; falls back to `option.weight ?? 1`. */
39
+ weightOf?: (option: GenOption<V>, choices: GenChoices) => number;
40
+ /** When no option is eligible, skip this step instead of failing or backtracking. */
41
+ optional?: boolean;
42
+ }
43
+ /**
44
+ * Mutation surface a {@link GenTransform} uses to derive numeric fields after choices resolve.
45
+ * Every `set`/`add`/`mul` is captured as a {@link GenFieldRecord}, and `rng` is the same injected
46
+ * stream the choices drew from, so rolled derivations stay deterministic and explainable.
47
+ */
48
+ export interface TransformApi {
49
+ readonly choices: GenChoices;
50
+ readonly rng: () => number;
51
+ /** Current value of a field, or 0 if unset. */
52
+ get(field: string): number;
53
+ /** Replace a field's value, recording the change. */
54
+ set(field: string, value: number, note?: string): void;
55
+ /** Add to a field's value, recording the change. */
56
+ add(field: string, amount: number, note?: string): void;
57
+ /** Multiply a field's value, recording the change. */
58
+ mul(field: string, factor: number, note?: string): void;
59
+ }
60
+ /**
61
+ * A named derivation over the numeric field bag, applied in schema order after all choices resolve
62
+ * (affix rolls, level scaling, budget spend). Each field mutation it makes is recorded as provenance.
63
+ */
64
+ export interface GenTransform {
65
+ id: string;
66
+ apply: (api: TransformApi) => void;
67
+ }
68
+ /**
69
+ * The resolved-but-unvalidated draft passed to each {@link GenValidator}: the step choices, their
70
+ * values, and the transformed fields. Returning false from any validator rerolls the whole
71
+ * generation up to the attempt budget.
72
+ */
73
+ export interface GenDraft {
74
+ choices: Readonly<Record<string, string>>;
75
+ values: Readonly<Record<string, unknown>>;
76
+ fields: Readonly<Record<string, number>>;
77
+ }
78
+ /** A final-assembly check over a {@link GenDraft}; false triggers a whole-pipeline reroll. */
79
+ export type GenValidator = (draft: GenDraft) => boolean;
80
+ /**
81
+ * Provenance for one resolved step: which option stuck, its effective weight, how many options were
82
+ * eligible after constraints, and how many eligible options backtracking rejected before this one.
83
+ * A skipped optional step is recorded with an empty `optionId`.
84
+ */
85
+ export interface GenChoiceRecord {
86
+ step: string;
87
+ optionId: string;
88
+ weight: number;
89
+ eligible: number;
90
+ rerolls: number;
91
+ }
92
+ /** Provenance for one field mutation a transform made: which transform, field, op, and before/after. */
93
+ export interface GenFieldRecord {
94
+ transform: string;
95
+ field: string;
96
+ op: "set" | "add" | "mul";
97
+ from: number;
98
+ to: number;
99
+ note?: string;
100
+ }
101
+ /**
102
+ * The full explanation of a generated result: how many whole-pipeline attempts it took, every step
103
+ * choice, and every field mutation. Plain, serializable data for UI, debugging, balancing, and
104
+ * regeneration.
105
+ */
106
+ export interface GenProvenance {
107
+ attempts: number;
108
+ choices: readonly GenChoiceRecord[];
109
+ fields: readonly GenFieldRecord[];
110
+ }
111
+ /**
112
+ * A successful generation: the step-to-option map, step-to-value map, transformed numeric fields,
113
+ * and the {@link GenProvenance} that explains them. Entirely serializable; round-trips through
114
+ * save/load and multiplayer sync unchanged.
115
+ */
116
+ export interface GenResult {
117
+ choices: Readonly<Record<string, string>>;
118
+ values: Readonly<Record<string, unknown>>;
119
+ fields: Readonly<Record<string, number>>;
120
+ provenance: GenProvenance;
121
+ }
122
+ /**
123
+ * The outcome of {@link generate}: either a successful {@link GenResult}, or a failure carrying the
124
+ * reason (`"unsatisfiable"` — constraints left no valid assignment; `"rejected"` — validators kept
125
+ * rejecting drafts) and the attempts spent.
126
+ */
127
+ export type GenOutcome = {
128
+ ok: true;
129
+ result: GenResult;
130
+ } | {
131
+ ok: false;
132
+ reason: "unsatisfiable" | "rejected";
133
+ attempts: number;
134
+ };
135
+ /**
136
+ * A caller-defined generation schema over plain data: ordered choice steps, optional field
137
+ * transforms, optional validators, and bounded reroll/backtracking budgets. Genre-agnostic — it
138
+ * carries no built-in notion of rarity, element, weapon, or name; those are caller step and option ids.
139
+ */
140
+ export interface GenSchema {
141
+ steps: readonly GenStep[];
142
+ transforms?: readonly GenTransform[];
143
+ validate?: readonly GenValidator[];
144
+ /** Max whole-pipeline attempts when a validator rejects a draft (default 24). */
145
+ maxAttempts?: number;
146
+ /** Max option picks the backtracking search may spend satisfying constraints in one attempt (default 1024). */
147
+ maxPicks?: number;
148
+ }
149
+ /** Per-call options for {@link generate}. */
150
+ export interface GenerateOptions {
151
+ /** Force a step to a specific option id, consuming no rng for it (a requested rarity or family). */
152
+ pin?: Readonly<Record<string, string>>;
153
+ }
154
+ /**
155
+ * Run a caller-defined {@link GenSchema} against an injected `rng` into a deterministic, serializable
156
+ * {@link GenResult} with full provenance. Composes weighted/uniform choice, dependent choice,
157
+ * constraints with bounded backtracking, field transforms, and validation reroll over plain data —
158
+ * the generic seam procedural loot, affix, and modular-part rollers assemble on. Identical schema,
159
+ * seed, and pins reproduce an identical result across server/client and save/load.
160
+ *
161
+ * @capability item-generation compose constraints, weighted pools, transforms, and provenance into a deterministic generated item
162
+ */
163
+ export declare function generate(schema: GenSchema, rng: () => number, options?: GenerateOptions): GenOutcome;
@@ -0,0 +1,151 @@
1
+ import { pickUniform, pickWeighted } from "../random/pick.js";
2
+ function makeChoicesView(chosen) {
3
+ const find = (step) => {
4
+ for (const c of chosen)
5
+ if (c.step === step && !c.skipped)
6
+ return c;
7
+ return undefined;
8
+ };
9
+ return {
10
+ has: (step) => find(step) !== undefined,
11
+ optionId: (step) => find(step)?.optionId,
12
+ value: (step) => find(step)?.value,
13
+ };
14
+ }
15
+ function poolFor(pool, choices) {
16
+ return typeof pool === "function" ? pool(choices) : pool;
17
+ }
18
+ /**
19
+ * Run a caller-defined {@link GenSchema} against an injected `rng` into a deterministic, serializable
20
+ * {@link GenResult} with full provenance. Composes weighted/uniform choice, dependent choice,
21
+ * constraints with bounded backtracking, field transforms, and validation reroll over plain data —
22
+ * the generic seam procedural loot, affix, and modular-part rollers assemble on. Identical schema,
23
+ * seed, and pins reproduce an identical result across server/client and save/load.
24
+ *
25
+ * @capability item-generation compose constraints, weighted pools, transforms, and provenance into a deterministic generated item
26
+ */
27
+ export function generate(schema, rng, options = {}) {
28
+ const maxAttempts = schema.maxAttempts ?? 24;
29
+ const maxPicks = schema.maxPicks ?? 1024;
30
+ const pin = options.pin;
31
+ let lastReason = "unsatisfiable";
32
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
33
+ const chosen = [];
34
+ const view = makeChoicesView(chosen);
35
+ let picks = 0;
36
+ const weightGetter = (step) => (option) => step.weightOf !== undefined ? step.weightOf(option, view) : option.weight ?? 1;
37
+ const solve = (index) => {
38
+ if (index >= schema.steps.length)
39
+ return true;
40
+ const step = schema.steps[index];
41
+ const pinId = pin?.[step.id];
42
+ if (pinId !== undefined) {
43
+ const option = poolFor(step.pool, view).find((candidate) => candidate.id === pinId);
44
+ if (option === undefined)
45
+ return false;
46
+ chosen.push({
47
+ step: step.id,
48
+ optionId: option.id,
49
+ value: option.value,
50
+ weight: weightGetter(step)(option),
51
+ eligible: 1,
52
+ rerolls: 0,
53
+ skipped: false,
54
+ });
55
+ if (solve(index + 1))
56
+ return true;
57
+ chosen.pop();
58
+ return false;
59
+ }
60
+ const accept = step.accept;
61
+ let remaining = poolFor(step.pool, view).filter((option) => accept === undefined || accept(option, view));
62
+ const eligibleCount = remaining.length;
63
+ if (eligibleCount === 0) {
64
+ if (step.optional !== true)
65
+ return false;
66
+ chosen.push({ step: step.id, optionId: "", value: undefined, weight: 0, eligible: 0, rerolls: 0, skipped: true });
67
+ if (solve(index + 1))
68
+ return true;
69
+ chosen.pop();
70
+ return false;
71
+ }
72
+ let tried = 0;
73
+ while (remaining.length > 0) {
74
+ if (picks >= maxPicks)
75
+ return false;
76
+ picks += 1;
77
+ const picked = step.select === "uniform"
78
+ ? pickUniform(rng, remaining)
79
+ : pickWeighted(rng, remaining, weightGetter(step));
80
+ if (picked === undefined)
81
+ return false;
82
+ chosen.push({
83
+ step: step.id,
84
+ optionId: picked.id,
85
+ value: picked.value,
86
+ weight: weightGetter(step)(picked),
87
+ eligible: eligibleCount,
88
+ rerolls: tried,
89
+ skipped: false,
90
+ });
91
+ if (solve(index + 1))
92
+ return true;
93
+ chosen.pop();
94
+ remaining = remaining.filter((option) => option !== picked);
95
+ tried += 1;
96
+ }
97
+ return false;
98
+ };
99
+ if (!solve(0)) {
100
+ lastReason = "unsatisfiable";
101
+ continue;
102
+ }
103
+ const choices = {};
104
+ const values = {};
105
+ const choiceRecords = [];
106
+ for (const entry of chosen) {
107
+ choiceRecords.push({
108
+ step: entry.step,
109
+ optionId: entry.optionId,
110
+ weight: entry.weight,
111
+ eligible: entry.eligible,
112
+ rerolls: entry.rerolls,
113
+ });
114
+ if (entry.skipped)
115
+ continue;
116
+ choices[entry.step] = entry.optionId;
117
+ values[entry.step] = entry.value;
118
+ }
119
+ const fields = {};
120
+ const fieldRecords = [];
121
+ const record = (transform, op, field, from, to, note) => {
122
+ fields[field] = to;
123
+ const entry = { transform, field, op, from, to };
124
+ if (note !== undefined)
125
+ entry.note = note;
126
+ fieldRecords.push(entry);
127
+ };
128
+ for (const transform of schema.transforms ?? []) {
129
+ const api = {
130
+ choices: view,
131
+ rng,
132
+ get: (field) => fields[field] ?? 0,
133
+ set: (field, value, note) => record(transform.id, "set", field, fields[field] ?? 0, value, note),
134
+ add: (field, amount, note) => record(transform.id, "add", field, fields[field] ?? 0, (fields[field] ?? 0) + amount, note),
135
+ mul: (field, factor, note) => record(transform.id, "mul", field, fields[field] ?? 0, (fields[field] ?? 0) * factor, note),
136
+ };
137
+ transform.apply(api);
138
+ }
139
+ const draft = { choices, values, fields };
140
+ const validators = schema.validate ?? [];
141
+ if (!validators.every((validate) => validate(draft))) {
142
+ lastReason = "rejected";
143
+ continue;
144
+ }
145
+ return {
146
+ ok: true,
147
+ result: { choices, values, fields, provenance: { attempts: attempt, choices: choiceRecords, fields: fieldRecords } },
148
+ };
149
+ }
150
+ return { ok: false, reason: lastReason, attempts: maxAttempts };
151
+ }
@@ -26,6 +26,11 @@ export type InstallResult = {
26
26
  reason: "unknown-slot" | "wrong-category" | "slot-occupied";
27
27
  };
28
28
  export declare function slotById(def: ModularItemDef, slotId: string): MountSlotDef | null;
29
+ /**
30
+ * Attach parts into an item's mount slots and resolve the combined stats.
31
+ *
32
+ * @capability modular-item attach parts into item mount slots to compute combined stats
33
+ */
29
34
  export declare function slotAccepts(slot: MountSlotDef, category: string): boolean;
30
35
  export declare function install(def: ModularItemDef, installed: readonly InstalledPart[], slotId: string, part: PartDef): InstallResult;
31
36
  export declare function uninstall(installed: readonly InstalledPart[], slotId: string): readonly InstalledPart[];
@@ -1,6 +1,11 @@
1
1
  export function slotById(def, slotId) {
2
2
  return def.slots.find((s) => s.id === slotId) ?? null;
3
3
  }
4
+ /**
5
+ * Attach parts into an item's mount slots and resolve the combined stats.
6
+ *
7
+ * @capability modular-item attach parts into item mount slots to compute combined stats
8
+ */
4
9
  export function slotAccepts(slot, category) {
5
10
  return typeof slot.accepts === "string" ? slot.accepts === category : slot.accepts.includes(category);
6
11
  }
@@ -22,4 +22,9 @@ export interface ItemUse<TState> {
22
22
  can(state: TState, input: ItemUseInput): ItemUseRejection | null;
23
23
  use(state: TState, input: ItemUseInput): ItemUseResult<TState>;
24
24
  }
25
+ /**
26
+ * Use or consume items, applying their effects and per-item cooldowns.
27
+ *
28
+ * @capability consumables use/consume items with cooldowns and effects
29
+ */
25
30
  export declare function createItemUse<TState>(resolveUse: (itemId: string) => string | null | undefined): ItemUse<TState>;
package/dist/item/use.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Use or consume items, applying their effects and per-item cooldowns.
3
+ *
4
+ * @capability consumables use/consume items with cooldowns and effects
5
+ */
1
6
  export function createItemUse(resolveUse) {
2
7
  const handlers = new Map();
3
8
  function resolveHandler(itemId) {
@@ -0,0 +1,142 @@
1
+ import type { ItemUseInput } from "./use.js";
2
+ /**
3
+ * Per-behavior configuration stored on an item as plain data (e.g. charge time,
4
+ * projectile id). Kept opaque here so no game noun leaks into item core.
5
+ */
6
+ export type BehaviorConfig = Record<string, unknown>;
7
+ /**
8
+ * A single behavior's mutable, serializable runtime state (e.g. current charge,
9
+ * rounds queued). Composed state is a map of these keyed by behavior id.
10
+ */
11
+ export type BehaviorState = Record<string, unknown>;
12
+ /**
13
+ * A serialized snapshot of every behavior's state on one item, keyed by
14
+ * behavior id. Round-trips through JSON so it can live in a saved game.
15
+ */
16
+ export type SerializedBehaviorState = Record<string, BehaviorState>;
17
+ /**
18
+ * The reference an item stores for one composed behavior: a stable behavior id,
19
+ * optional config, and an optional order override. Pure data — the item core
20
+ * never holds the implementation, only this reference.
21
+ */
22
+ export interface UseBehaviorRef {
23
+ id: string;
24
+ config?: BehaviorConfig;
25
+ order?: number;
26
+ }
27
+ /**
28
+ * The context handed to each behavior hook: the shared folded `world`, this
29
+ * behavior's own `config` and `state` slice, and the triggering use input.
30
+ */
31
+ export interface UseBehaviorContext<TWorld> {
32
+ world: TWorld;
33
+ config: BehaviorConfig;
34
+ state: BehaviorState;
35
+ input: ItemUseInput;
36
+ }
37
+ /**
38
+ * The result of applying one behavior: the (possibly advanced) world, this
39
+ * behavior's updated state, an optional error that aborts the chain, and an
40
+ * optional `stop` that ends the chain after a successful apply.
41
+ */
42
+ export interface UseBehaviorOutcome<TWorld> {
43
+ world: TWorld;
44
+ state?: BehaviorState;
45
+ error?: string;
46
+ stop?: boolean;
47
+ }
48
+ /** A reason a behavior refused a use, surfaced from `can`. */
49
+ export interface UseBehaviorRejection {
50
+ reason: string;
51
+ }
52
+ /**
53
+ * A registered behavior implementation. The combat/game side registers these
54
+ * (charge, thrown-reload, projectile-replacement, …); the item core only ever
55
+ * stores a {@link UseBehaviorRef} to one by id. Hooks are the lifecycle: `init`
56
+ * builds serializable state, `can` gates, `apply` folds the world.
57
+ */
58
+ export interface UseBehaviorDef<TWorld> {
59
+ id: string;
60
+ /** Lower runs first; ties break on the item's ref order. Default 0. */
61
+ order?: number;
62
+ /** Capability tokens the host must supply at compose time for this behavior. */
63
+ requires?: readonly string[];
64
+ /** Behavior ids that cannot coexist with this one on the same item. */
65
+ conflicts?: readonly string[];
66
+ /** Build initial serializable state from config; defaults to an empty object. */
67
+ init?(config: BehaviorConfig): BehaviorState;
68
+ /** Gate the use before applying; return a rejection or null to allow. */
69
+ can?(ctx: UseBehaviorContext<TWorld>): UseBehaviorRejection | null;
70
+ /** Apply the behavior, folding the shared world and this behavior's state. */
71
+ apply(ctx: UseBehaviorContext<TWorld>): UseBehaviorOutcome<TWorld>;
72
+ }
73
+ /**
74
+ * A resolved, ordered composition of behaviors for one item. Dispatch is
75
+ * transactional: `apply` commits the folded world only if every behavior in the
76
+ * chain succeeds, otherwise it returns the original world and state plus the
77
+ * first error.
78
+ */
79
+ export interface ComposedUse<TWorld> {
80
+ /** The resolved run order as behavior ids. */
81
+ order(): readonly string[];
82
+ /** Fresh per-behavior state for a new item instance, keyed by behavior id. */
83
+ initialState(): SerializedBehaviorState;
84
+ /** First rejection across behaviors (in order), or null if all allow the use. */
85
+ can(world: TWorld, state: SerializedBehaviorState, input: ItemUseInput): UseBehaviorRejection | null;
86
+ /** Run the chain in order; commit folded world+state only on full success. */
87
+ apply(world: TWorld, state: SerializedBehaviorState, input: ItemUseInput): {
88
+ world: TWorld;
89
+ state: SerializedBehaviorState;
90
+ error?: string;
91
+ };
92
+ }
93
+ /**
94
+ * The outcome of composing an item's behavior refs: either a ready
95
+ * {@link ComposedUse} or a structured error naming the offending behavior.
96
+ */
97
+ export type CompositionResult<TWorld> = {
98
+ status: "ok";
99
+ composed: ComposedUse<TWorld>;
100
+ } | {
101
+ status: "error";
102
+ reason: "unknown-behavior";
103
+ id: string;
104
+ } | {
105
+ status: "error";
106
+ reason: "duplicate-behavior";
107
+ id: string;
108
+ } | {
109
+ status: "error";
110
+ reason: "missing-capability";
111
+ id: string;
112
+ capability: string;
113
+ } | {
114
+ status: "error";
115
+ reason: "conflict";
116
+ id: string;
117
+ conflictsWith: string;
118
+ };
119
+ /**
120
+ * A registry of use-behavior implementations plus a composer that turns an
121
+ * item's stored refs into an ordered, conflict-checked {@link ComposedUse}.
122
+ */
123
+ export interface UseBehaviorRegistry<TWorld> {
124
+ /** Register behavior implementations; throws on a duplicate id. */
125
+ register(defs: readonly UseBehaviorDef<TWorld>[]): void;
126
+ has(id: string): boolean;
127
+ get(id: string): UseBehaviorDef<TWorld> | null;
128
+ /** All registered behavior ids, in registration order. */
129
+ ids(): string[];
130
+ /** Resolve an item's refs into a composed dispatcher, or a structured error. */
131
+ compose(refs: readonly UseBehaviorRef[], options?: {
132
+ capabilities?: readonly string[];
133
+ }): CompositionResult<TWorld>;
134
+ }
135
+ /**
136
+ * Create an empty use-behavior registry. Games register their behaviors, then
137
+ * compose each item's stored refs into a dispatcher whose serializable state
138
+ * lives with the item.
139
+ *
140
+ * @capability item-use-composition compose pluggable, ordered item use-behaviors from serializable references
141
+ */
142
+ export declare function createUseBehaviorRegistry<TWorld>(): UseBehaviorRegistry<TWorld>;
@@ -0,0 +1,105 @@
1
+ function orderOf(entry) {
2
+ return entry.ref.order ?? entry.def.order ?? 0;
3
+ }
4
+ /**
5
+ * Create an empty use-behavior registry. Games register their behaviors, then
6
+ * compose each item's stored refs into a dispatcher whose serializable state
7
+ * lives with the item.
8
+ *
9
+ * @capability item-use-composition compose pluggable, ordered item use-behaviors from serializable references
10
+ */
11
+ export function createUseBehaviorRegistry() {
12
+ const defs = new Map();
13
+ function compose(refs, options) {
14
+ const capabilities = new Set(options?.capabilities ?? []);
15
+ const seen = new Set();
16
+ const resolved = [];
17
+ for (const ref of refs) {
18
+ if (seen.has(ref.id))
19
+ return { status: "error", reason: "duplicate-behavior", id: ref.id };
20
+ seen.add(ref.id);
21
+ const def = defs.get(ref.id);
22
+ if (def === undefined)
23
+ return { status: "error", reason: "unknown-behavior", id: ref.id };
24
+ for (const capability of def.requires ?? []) {
25
+ if (!capabilities.has(capability))
26
+ return { status: "error", reason: "missing-capability", id: ref.id, capability };
27
+ }
28
+ resolved.push({ ref, def });
29
+ }
30
+ for (const { def } of resolved) {
31
+ for (const conflict of def.conflicts ?? []) {
32
+ if (seen.has(conflict))
33
+ return { status: "error", reason: "conflict", id: def.id, conflictsWith: conflict };
34
+ }
35
+ }
36
+ const ordered = resolved
37
+ .map((entry, index) => ({ entry, index }))
38
+ .sort((a, b) => orderOf(a.entry) - orderOf(b.entry) || a.index - b.index)
39
+ .map(({ entry }) => entry);
40
+ const composed = {
41
+ order() {
42
+ return ordered.map((entry) => entry.def.id);
43
+ },
44
+ initialState() {
45
+ const state = {};
46
+ for (const entry of ordered)
47
+ state[entry.def.id] = entry.def.init?.(entry.ref.config ?? {}) ?? {};
48
+ return state;
49
+ },
50
+ can(world, state, input) {
51
+ for (const entry of ordered) {
52
+ const rejection = entry.def.can?.({
53
+ world,
54
+ config: entry.ref.config ?? {},
55
+ state: state[entry.def.id] ?? {},
56
+ input,
57
+ });
58
+ if (rejection)
59
+ return rejection;
60
+ }
61
+ return null;
62
+ },
63
+ apply(world, state, input) {
64
+ let nextWorld = world;
65
+ const nextState = { ...state };
66
+ for (const entry of ordered) {
67
+ const config = entry.ref.config ?? {};
68
+ const ctx = { world: nextWorld, config, state: nextState[entry.def.id] ?? {}, input };
69
+ const rejection = entry.def.can?.(ctx);
70
+ if (rejection)
71
+ return { world, state, error: rejection.reason };
72
+ const outcome = entry.def.apply(ctx);
73
+ if (outcome.error !== undefined)
74
+ return { world, state, error: outcome.error };
75
+ nextWorld = outcome.world;
76
+ if (outcome.state !== undefined)
77
+ nextState[entry.def.id] = outcome.state;
78
+ if (outcome.stop === true)
79
+ break;
80
+ }
81
+ return { world: nextWorld, state: nextState };
82
+ },
83
+ };
84
+ return { status: "ok", composed };
85
+ }
86
+ return {
87
+ register(newDefs) {
88
+ for (const def of newDefs) {
89
+ if (defs.has(def.id))
90
+ throw new Error(`Use behavior "${def.id}" is already registered.`);
91
+ defs.set(def.id, def);
92
+ }
93
+ },
94
+ has(id) {
95
+ return defs.has(id);
96
+ },
97
+ get(id) {
98
+ return defs.get(id) ?? null;
99
+ },
100
+ ids() {
101
+ return [...defs.keys()];
102
+ },
103
+ compose,
104
+ };
105
+ }
@@ -5,4 +5,9 @@ export declare function getWeaponStat(entry: WeaponEntry | null | undefined, sta
5
5
  export interface WeaponStats {
6
6
  getStat(itemId: string, stat: string): number | null;
7
7
  }
8
+ /**
9
+ * Resolve per-weapon stat values — damage, fire rate, spread — for combat math.
10
+ *
11
+ * @capability weapon-stats resolve per-weapon stat values for combat math
12
+ */
8
13
  export declare function createWeaponStats(resolveEntry: (itemId: string) => WeaponEntry | null | undefined): WeaponStats;
@@ -9,6 +9,11 @@ export function getWeaponStat(entry, stat) {
9
9
  }
10
10
  return typeof value === "number" ? value : null;
11
11
  }
12
+ /**
13
+ * Resolve per-weapon stat values — damage, fire rate, spread — for combat math.
14
+ *
15
+ * @capability weapon-stats resolve per-weapon stat values for combat math
16
+ */
12
17
  export function createWeaponStats(resolveEntry) {
13
18
  return {
14
19
  getStat(itemId, stat) {
@@ -0,0 +1,25 @@
1
+ export { lerp, clamp01, smoothstep } from "../anim/easing.js";
2
+ /** Constrain a value to the inclusive `[min, max]` range.
3
+ * @internal
4
+ */
5
+ export declare function clamp(value: number, min: number, max: number): number;
6
+ /** Fraction of the way `value` sits between `from` and `to`; inverse of `lerp`. Returns 0 when the span is empty.
7
+ * @internal
8
+ */
9
+ export declare function inverseLerp(from: number, to: number, value: number): number;
10
+ /** Map `value` from the `[inMin, inMax]` range onto `[outMin, outMax]`, optionally clamped to the output range.
11
+ * @internal
12
+ */
13
+ export declare function remap(value: number, inMin: number, inMax: number, outMin: number, outMax: number, clamped?: boolean): number;
14
+ /** Euclidean modulo that always returns a non-negative result in `[0, modulus)`, unlike the `%` operator.
15
+ * @internal
16
+ */
17
+ export declare function mod(value: number, modulus: number): number;
18
+ /** Step `current` toward `target` by at most `maxDelta`, without overshooting.
19
+ * @internal
20
+ */
21
+ export declare function moveTowards(current: number, target: number, maxDelta: number): number;
22
+ /** Wrap `value` into the half-open range `[min, max)`, cycling past either edge.
23
+ * @internal
24
+ */
25
+ export declare function wrap(value: number, min: number, max: number): number;