@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
@@ -1,6 +1,7 @@
1
1
  function cellKey(cell) {
2
2
  return `${cell[0]},${cell[1]}`;
3
3
  }
4
+ /** @internal */
4
5
  export function normalizeFootprint(footprint) {
5
6
  if (footprint.length === 0)
6
7
  return [];
@@ -25,6 +26,7 @@ export function normalizeFootprint(footprint) {
25
26
  }
26
27
  return out;
27
28
  }
29
+ /** @internal */
28
30
  export function rotateFootprint(footprint, rotation) {
29
31
  const turns = ((rotation % 4) + 4) % 4;
30
32
  let cells = footprint.map(([c, r]) => [c, r]);
@@ -33,10 +35,17 @@ export function rotateFootprint(footprint, rotation) {
33
35
  }
34
36
  return normalizeFootprint(cells);
35
37
  }
38
+ /** @internal */
36
39
  export function occupiedCells(footprint, origin, rotation) {
37
40
  const rotated = rotateFootprint(footprint, rotation);
38
41
  return rotated.map(([c, r]) => [c + origin[0], r + origin[1]]);
39
42
  }
43
+ /**
44
+ * A spatial grid inventory that holds shaped multi-cell items, Resident-Evil/Tarkov style.
45
+ *
46
+ * @capability tetris-inventory a spatial grid inventory holding shaped multi-cell items
47
+ * @internal
48
+ */
40
49
  export function createShapedGrid(width, height) {
41
50
  if (width <= 0 || height <= 0)
42
51
  throw new Error("shaped grid needs positive dimensions");
@@ -56,6 +65,7 @@ function occupancyMap(grid, ignoreId) {
56
65
  }
57
66
  return map;
58
67
  }
68
+ /** @internal */
59
69
  export function canPlace(grid, footprint, origin, rotation, ignoreId) {
60
70
  const cells = occupiedCells(footprint, origin, rotation);
61
71
  if (!inBounds(grid, cells))
@@ -67,6 +77,7 @@ export function canPlace(grid, footprint, origin, rotation, ignoreId) {
67
77
  }
68
78
  return null;
69
79
  }
80
+ /** @internal */
70
81
  export function placeShaped(grid, item, origin, rotation = 0) {
71
82
  if (grid.placements.some((p) => p.id === item.id)) {
72
83
  return { status: "rejected", reason: "duplicate-id", detail: item.id };
@@ -83,12 +94,14 @@ export function placeShaped(grid, item, origin, rotation = 0) {
83
94
  };
84
95
  return { status: "ok", grid: { ...grid, placements: [...grid.placements, placement] } };
85
96
  }
97
+ /** @internal */
86
98
  export function removeShaped(grid, id) {
87
99
  if (!grid.placements.some((p) => p.id === id)) {
88
100
  return { status: "rejected", reason: "unknown-id", detail: id };
89
101
  }
90
102
  return { status: "ok", grid: { ...grid, placements: grid.placements.filter((p) => p.id !== id) } };
91
103
  }
104
+ /** @internal */
92
105
  export function moveShaped(grid, id, origin, rotation) {
93
106
  const existing = grid.placements.find((p) => p.id === id);
94
107
  if (existing === undefined)
@@ -105,6 +118,7 @@ export function moveShaped(grid, id, origin, rotation) {
105
118
  },
106
119
  };
107
120
  }
121
+ /** @internal */
108
122
  export function cellOccupant(grid, cell) {
109
123
  return occupancyMap(grid).get(cellKey(cell)) ?? null;
110
124
  }
@@ -120,6 +134,7 @@ const DIAGONAL = [
120
134
  [-1, 1],
121
135
  [-1, -1],
122
136
  ];
137
+ /** @internal */
123
138
  export function gridAdjacencyQuery(grid, options = {}) {
124
139
  const directions = options.diagonal ? [...ORTHOGONAL, ...DIAGONAL] : ORTHOGONAL;
125
140
  const cellsById = new Map();
@@ -168,6 +183,7 @@ export function gridAdjacencyQuery(grid, options = {}) {
168
183
  },
169
184
  };
170
185
  }
186
+ /** @internal */
171
187
  export function cellFromPoint(point, cellSize, gridOrigin = { x: 0, y: 0 }) {
172
188
  return [
173
189
  Math.floor((point.x - gridOrigin.x) / cellSize),
@@ -7,13 +7,23 @@ export type SlotResult<T> = {
7
7
  status: "rejected";
8
8
  reason: "invalid-slot" | "slot-occupied" | "empty-slot";
9
9
  };
10
+ /** @internal */
10
11
  export declare function createSlots<T>(size: number): Slot<T>[];
12
+ /** @internal */
11
13
  export declare function normalizeSlots<T>(values: SlotGrid<T>, size: number): Slot<T>[];
14
+ /** @internal */
12
15
  export declare function placeAt<T>(grid: SlotGrid<T>, index: number, value: T): SlotResult<T>;
16
+ /** @internal */
13
17
  export declare function removeAt<T>(grid: SlotGrid<T>, index: number): SlotResult<T>;
18
+ /** @internal */
14
19
  export declare function moveSlot<T>(grid: SlotGrid<T>, from: number, to: number): SlotResult<T>;
20
+ /** @internal */
15
21
  export declare function firstEmpty<T>(grid: SlotGrid<T>): number | null;
22
+ /** @internal */
16
23
  export declare function insertFirst<T>(grid: SlotGrid<T>, value: T): SlotResult<T>;
24
+ /** @internal */
17
25
  export declare function compactSlots<T>(grid: SlotGrid<T>): Slot<T>[];
26
+ /** @internal */
18
27
  export declare function countFilled<T>(grid: SlotGrid<T>): number;
28
+ /** @internal */
19
29
  export declare function indexOfSlot<T>(grid: SlotGrid<T>, match: (value: T, index: number) => boolean): number | null;
@@ -1,6 +1,8 @@
1
+ /** @internal */
1
2
  export function createSlots(size) {
2
3
  return new Array(Math.max(0, size)).fill(null);
3
4
  }
5
+ /** @internal */
4
6
  export function normalizeSlots(values, size) {
5
7
  const grid = createSlots(size);
6
8
  for (let index = 0; index < size; index++)
@@ -10,6 +12,7 @@ export function normalizeSlots(values, size) {
10
12
  function inRange(grid, index) {
11
13
  return Number.isInteger(index) && index >= 0 && index < grid.length;
12
14
  }
15
+ /** @internal */
13
16
  export function placeAt(grid, index, value) {
14
17
  if (!inRange(grid, index))
15
18
  return { status: "rejected", reason: "invalid-slot" };
@@ -19,6 +22,7 @@ export function placeAt(grid, index, value) {
19
22
  next[index] = value;
20
23
  return { status: "ok", grid: next };
21
24
  }
25
+ /** @internal */
22
26
  export function removeAt(grid, index) {
23
27
  if (!inRange(grid, index))
24
28
  return { status: "rejected", reason: "invalid-slot" };
@@ -28,6 +32,7 @@ export function removeAt(grid, index) {
28
32
  next[index] = null;
29
33
  return { status: "ok", grid: next };
30
34
  }
35
+ /** @internal */
31
36
  export function moveSlot(grid, from, to) {
32
37
  if (!inRange(grid, from) || !inRange(grid, to))
33
38
  return { status: "rejected", reason: "invalid-slot" };
@@ -39,6 +44,7 @@ export function moveSlot(grid, from, to) {
39
44
  next[to] = moved;
40
45
  return { status: "ok", grid: next };
41
46
  }
47
+ /** @internal */
42
48
  export function firstEmpty(grid) {
43
49
  for (let index = 0; index < grid.length; index++) {
44
50
  if (grid[index] === null)
@@ -46,12 +52,14 @@ export function firstEmpty(grid) {
46
52
  }
47
53
  return null;
48
54
  }
55
+ /** @internal */
49
56
  export function insertFirst(grid, value) {
50
57
  const index = firstEmpty(grid);
51
58
  if (index === null)
52
59
  return { status: "rejected", reason: "slot-occupied" };
53
60
  return placeAt(grid, index, value);
54
61
  }
62
+ /** @internal */
55
63
  export function compactSlots(grid) {
56
64
  const filled = grid.filter((slot) => slot !== null);
57
65
  const next = createSlots(grid.length);
@@ -59,6 +67,7 @@ export function compactSlots(grid) {
59
67
  next[index] = filled[index];
60
68
  return next;
61
69
  }
70
+ /** @internal */
62
71
  export function countFilled(grid) {
63
72
  let count = 0;
64
73
  for (const slot of grid)
@@ -66,6 +75,7 @@ export function countFilled(grid) {
66
75
  count += 1;
67
76
  return count;
68
77
  }
78
+ /** @internal */
69
79
  export function indexOfSlot(grid, match) {
70
80
  for (let index = 0; index < grid.length; index++) {
71
81
  const slot = grid[index];
@@ -33,6 +33,11 @@ export declare function durabilityFraction(state: DurabilityState): number;
33
33
  export declare function isBroken(state: DurabilityState): boolean;
34
34
  export declare function isDisabled(spec: DurabilitySpec, state: DurabilityState): boolean;
35
35
  export declare function wearAmount(spec: DurabilitySpec, kind: WearKind): number;
36
+ /**
37
+ * Apply wear to an item, tracking breakage and repair eligibility.
38
+ *
39
+ * @capability durability track item wear, breakage, and repair
40
+ */
36
41
  export declare function applyWear(state: DurabilityState, amount: number): DurabilityState;
37
42
  export declare function wear(spec: DurabilitySpec, state: DurabilityState, kind: WearKind, times?: number): DurabilityState;
38
43
  export declare function canRepairAt(spec: DurabilitySpec, stationId?: string): boolean;
@@ -17,6 +17,11 @@ export function isDisabled(spec, state) {
17
17
  export function wearAmount(spec, kind) {
18
18
  return kind === "use" ? spec.wearPerUse ?? 0 : spec.wearPerHit ?? 0;
19
19
  }
20
+ /**
21
+ * Apply wear to an item, tracking breakage and repair eligibility.
22
+ *
23
+ * @capability durability track item wear, breakage, and repair
24
+ */
20
25
  export function applyWear(state, amount) {
21
26
  if (amount <= 0)
22
27
  return state;
@@ -0,0 +1,171 @@
1
+ import type { InstalledPart, PartDef } from "./modularItem.js";
2
+ /**
3
+ * The declarative identity of a built modular item: a caller-named family, its
4
+ * provenance tags, and the parts occupying its slots. This is the "what an item
5
+ * is" layer above the raw stat rollup in ./modularItem — a plain, serializable
6
+ * value with no game noun baked in ("gun", "manufacturer", "potion" are all
7
+ * caller data in `family`/`tags`).
8
+ */
9
+ export interface ItemIdentity {
10
+ family: string;
11
+ tags: readonly string[];
12
+ parts: readonly InstalledPart[];
13
+ }
14
+ /**
15
+ * A predicate over an {@link ItemIdentity}, expressed as data so a whole rule
16
+ * set round-trips through JSON. An empty query matches every identity; each
17
+ * present field narrows the match and all present fields must hold (AND).
18
+ */
19
+ export interface IdentityQuery {
20
+ /** Match only this family id; omit to match any family. */
21
+ family?: string;
22
+ /** Every listed tag must be present on the identity. */
23
+ allTags?: readonly string[];
24
+ /** At least one listed tag must be present on the identity. */
25
+ anyTags?: readonly string[];
26
+ /** A part of this category must occupy some slot. */
27
+ hasCategory?: string;
28
+ /** A part with this id must occupy some slot. */
29
+ hasPart?: string;
30
+ }
31
+ /**
32
+ * A rule that requires a second condition to hold whenever the first matches —
33
+ * e.g. "a scoped rifle requires a stock". Checked at completeness time, not
34
+ * during incremental placement, because the `then` side may be satisfied by a
35
+ * part chosen later in a generation pass.
36
+ */
37
+ export interface RequireRule {
38
+ id: string;
39
+ kind: "require";
40
+ when: IdentityQuery;
41
+ then: IdentityQuery;
42
+ message?: string;
43
+ }
44
+ /**
45
+ * A rule that forbids a combination — e.g. "an incendiary barrel cannot pair
46
+ * with a cryo core". A forbid rule can never become satisfiable by adding more
47
+ * parts, so it is the check a backtracking generator runs on each candidate.
48
+ */
49
+ export interface ForbidRule {
50
+ id: string;
51
+ kind: "forbid";
52
+ when: IdentityQuery;
53
+ forbid: IdentityQuery;
54
+ message?: string;
55
+ }
56
+ /**
57
+ * A cross-slot compatibility rule constraining which part/tag/family
58
+ * combinations a modular item may hold.
59
+ */
60
+ export type CompatibilityRule = RequireRule | ForbidRule;
61
+ /**
62
+ * A match/set bonus: extra stats granted when enough parts (or a tag) of a
63
+ * given kind are present — e.g. "3 Blackwood parts grant +recoil control".
64
+ * Counting is declarative (`countBy`/`value`) so the whole catalog is data.
65
+ */
66
+ export interface SetBonus {
67
+ id: string;
68
+ /** Dimension counted for membership: a part category, a part id, or an identity tag. */
69
+ countBy: "category" | "partId" | "tag";
70
+ /** The value counted; membership is the number of matching parts (or 0/1 for a tag). */
71
+ value: string;
72
+ /** Minimum matching count for the bonus to activate. */
73
+ min: number;
74
+ /** Additive stat deltas applied when the bonus is active. */
75
+ stats: Record<string, number>;
76
+ /** Optional name fragment recorded in provenance/UI when active. */
77
+ namePart?: string;
78
+ }
79
+ /**
80
+ * One failed {@link CompatibilityRule}, carrying the rule id, its kind, and a
81
+ * human-readable message for UI or generator diagnostics.
82
+ */
83
+ export interface ConstraintViolation {
84
+ ruleId: string;
85
+ kind: "require" | "forbid";
86
+ message: string;
87
+ }
88
+ /**
89
+ * A part proposed for a slot during generation, before it is committed to an
90
+ * identity. Used by the backtracking contract to test a placement in isolation.
91
+ */
92
+ export interface CandidatePlacement {
93
+ slotId: string;
94
+ part: PartDef;
95
+ }
96
+ /**
97
+ * The serializable record of how an item was generated: its family, tags,
98
+ * per-slot part selection, applied set-bonus ids, and the deterministic seed.
99
+ * Enough for UI provenance display and byte-exact regeneration.
100
+ */
101
+ export interface ItemProvenance {
102
+ family: string;
103
+ tags: readonly string[];
104
+ /** slotId -> partId of the selected parts. */
105
+ parts: Readonly<Record<string, string>>;
106
+ /** Ids of the set bonuses that were active, for display and re-derivation. */
107
+ bonuses: readonly string[];
108
+ /** Seed of the roll that produced this item; omit for hand-authored items. */
109
+ seed?: number;
110
+ }
111
+ /**
112
+ * Assemble an {@link ItemIdentity} from a family, tags, and installed parts.
113
+ *
114
+ * @capability item-identity assemble a serializable modular-item identity from family, tags, and installed parts
115
+ */
116
+ export declare function identityOf(family: string, tags: readonly string[], parts: readonly InstalledPart[]): ItemIdentity;
117
+ /**
118
+ * Test whether an identity satisfies a declarative {@link IdentityQuery}.
119
+ *
120
+ * @capability item-identity evaluate a data-defined compatibility query against a modular-item identity
121
+ */
122
+ export declare function matchesQuery(identity: ItemIdentity, query: IdentityQuery): boolean;
123
+ /**
124
+ * Collect every compatibility rule a completed identity violates. An empty
125
+ * result means the identity is legal.
126
+ *
127
+ * @capability item-identity validate a completed modular item against its compatibility rule set
128
+ */
129
+ export declare function validateIdentity(identity: ItemIdentity, rules: readonly CompatibilityRule[]): ConstraintViolation[];
130
+ /**
131
+ * Convenience predicate: true when {@link validateIdentity} finds no violations.
132
+ *
133
+ * @capability item-identity check whether a completed modular item is compatibility-valid
134
+ */
135
+ export declare function isIdentityValid(identity: ItemIdentity, rules: readonly CompatibilityRule[]): boolean;
136
+ /**
137
+ * The generic backtracking contract for procedural generation (see #908): given
138
+ * a partial identity and a candidate part, return the first forbid rule the
139
+ * placement would violate, or null if it stays viable. Require rules are ignored
140
+ * here because they may still be satisfied by a later placement.
141
+ *
142
+ * @capability item-identity test a candidate part placement against forbid rules for generation backtracking
143
+ */
144
+ export declare function candidateViolatesForbid(partial: ItemIdentity, candidate: CandidatePlacement, rules: readonly CompatibilityRule[]): ForbidRule | null;
145
+ /**
146
+ * Count how many parts (or tags) contribute to a set bonus on an identity.
147
+ *
148
+ * @capability item-identity count set-bonus membership across an item's parts and tags
149
+ */
150
+ export declare function countSetMembers(identity: ItemIdentity, bonus: SetBonus): number;
151
+ /**
152
+ * Select the set bonuses whose membership count meets their threshold, in the
153
+ * order they were declared.
154
+ *
155
+ * @capability item-identity resolve which match/set bonuses an item qualifies for
156
+ */
157
+ export declare function activeSetBonuses(identity: ItemIdentity, bonuses: readonly SetBonus[]): SetBonus[];
158
+ /**
159
+ * Fold a set of active bonuses' additive stats onto a stat map, returning a new
160
+ * map (the input is not mutated).
161
+ *
162
+ * @capability item-identity apply active set-bonus stats onto an item's resolved stats
163
+ */
164
+ export declare function applySetBonuses(stats: Record<string, number>, bonuses: readonly SetBonus[]): Record<string, number>;
165
+ /**
166
+ * Capture the provenance of a generated item — family, tags, per-slot parts,
167
+ * active bonus ids, and optional seed — as a JSON-safe record.
168
+ *
169
+ * @capability item-identity capture serializable provenance for UI display and deterministic regeneration
170
+ */
171
+ export declare function captureProvenance(identity: ItemIdentity, activeBonuses: readonly SetBonus[], seed?: number): ItemProvenance;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Assemble an {@link ItemIdentity} from a family, tags, and installed parts.
3
+ *
4
+ * @capability item-identity assemble a serializable modular-item identity from family, tags, and installed parts
5
+ */
6
+ export function identityOf(family, tags, parts) {
7
+ return { family, tags, parts };
8
+ }
9
+ function hasCategory(identity, category) {
10
+ return identity.parts.some((installed) => installed.part.category === category);
11
+ }
12
+ function hasPart(identity, partId) {
13
+ return identity.parts.some((installed) => installed.part.id === partId);
14
+ }
15
+ /**
16
+ * Test whether an identity satisfies a declarative {@link IdentityQuery}.
17
+ *
18
+ * @capability item-identity evaluate a data-defined compatibility query against a modular-item identity
19
+ */
20
+ export function matchesQuery(identity, query) {
21
+ if (query.family !== undefined && query.family !== identity.family)
22
+ return false;
23
+ if (query.allTags !== undefined && !query.allTags.every((tag) => identity.tags.includes(tag)))
24
+ return false;
25
+ if (query.anyTags !== undefined && !query.anyTags.some((tag) => identity.tags.includes(tag)))
26
+ return false;
27
+ if (query.hasCategory !== undefined && !hasCategory(identity, query.hasCategory))
28
+ return false;
29
+ if (query.hasPart !== undefined && !hasPart(identity, query.hasPart))
30
+ return false;
31
+ return true;
32
+ }
33
+ function ruleFails(identity, rule) {
34
+ if (!matchesQuery(identity, rule.when))
35
+ return false;
36
+ return rule.kind === "require" ? !matchesQuery(identity, rule.then) : matchesQuery(identity, rule.forbid);
37
+ }
38
+ function defaultMessage(rule) {
39
+ return rule.message ?? (rule.kind === "require" ? `${rule.id}: required combination missing` : `${rule.id}: forbidden combination`);
40
+ }
41
+ /**
42
+ * Collect every compatibility rule a completed identity violates. An empty
43
+ * result means the identity is legal.
44
+ *
45
+ * @capability item-identity validate a completed modular item against its compatibility rule set
46
+ */
47
+ export function validateIdentity(identity, rules) {
48
+ const violations = [];
49
+ for (const rule of rules) {
50
+ if (ruleFails(identity, rule))
51
+ violations.push({ ruleId: rule.id, kind: rule.kind, message: defaultMessage(rule) });
52
+ }
53
+ return violations;
54
+ }
55
+ /**
56
+ * Convenience predicate: true when {@link validateIdentity} finds no violations.
57
+ *
58
+ * @capability item-identity check whether a completed modular item is compatibility-valid
59
+ */
60
+ export function isIdentityValid(identity, rules) {
61
+ return validateIdentity(identity, rules).length === 0;
62
+ }
63
+ /**
64
+ * The generic backtracking contract for procedural generation (see #908): given
65
+ * a partial identity and a candidate part, return the first forbid rule the
66
+ * placement would violate, or null if it stays viable. Require rules are ignored
67
+ * here because they may still be satisfied by a later placement.
68
+ *
69
+ * @capability item-identity test a candidate part placement against forbid rules for generation backtracking
70
+ */
71
+ export function candidateViolatesForbid(partial, candidate, rules) {
72
+ const projected = {
73
+ family: partial.family,
74
+ tags: partial.tags,
75
+ parts: [...partial.parts, { slotId: candidate.slotId, part: candidate.part }],
76
+ };
77
+ for (const rule of rules) {
78
+ if (rule.kind === "forbid" && ruleFails(projected, rule))
79
+ return rule;
80
+ }
81
+ return null;
82
+ }
83
+ /**
84
+ * Count how many parts (or tags) contribute to a set bonus on an identity.
85
+ *
86
+ * @capability item-identity count set-bonus membership across an item's parts and tags
87
+ */
88
+ export function countSetMembers(identity, bonus) {
89
+ switch (bonus.countBy) {
90
+ case "category":
91
+ return identity.parts.filter((installed) => installed.part.category === bonus.value).length;
92
+ case "partId":
93
+ return identity.parts.filter((installed) => installed.part.id === bonus.value).length;
94
+ case "tag":
95
+ return identity.tags.includes(bonus.value) ? 1 : 0;
96
+ }
97
+ }
98
+ /**
99
+ * Select the set bonuses whose membership count meets their threshold, in the
100
+ * order they were declared.
101
+ *
102
+ * @capability item-identity resolve which match/set bonuses an item qualifies for
103
+ */
104
+ export function activeSetBonuses(identity, bonuses) {
105
+ return bonuses.filter((bonus) => countSetMembers(identity, bonus) >= bonus.min);
106
+ }
107
+ /**
108
+ * Fold a set of active bonuses' additive stats onto a stat map, returning a new
109
+ * map (the input is not mutated).
110
+ *
111
+ * @capability item-identity apply active set-bonus stats onto an item's resolved stats
112
+ */
113
+ export function applySetBonuses(stats, bonuses) {
114
+ const out = { ...stats };
115
+ for (const bonus of bonuses) {
116
+ for (const [key, delta] of Object.entries(bonus.stats))
117
+ out[key] = (out[key] ?? 0) + delta;
118
+ }
119
+ return out;
120
+ }
121
+ /**
122
+ * Capture the provenance of a generated item — family, tags, per-slot parts,
123
+ * active bonus ids, and optional seed — as a JSON-safe record.
124
+ *
125
+ * @capability item-identity capture serializable provenance for UI display and deterministic regeneration
126
+ */
127
+ export function captureProvenance(identity, activeBonuses, seed) {
128
+ const parts = {};
129
+ for (const installed of identity.parts)
130
+ parts[installed.slotId] = installed.part.id;
131
+ return {
132
+ family: identity.family,
133
+ tags: [...identity.tags],
134
+ parts,
135
+ bonuses: activeBonuses.map((bonus) => bonus.id),
136
+ ...(seed === undefined ? {} : { seed }),
137
+ };
138
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A runtime store for procedurally generated item instances — a rolled unique gun, a rolled
3
+ * affixed relic — keyed by a generated id distinct from any static catalog id. The counterpart a
4
+ * game's `content.itemById` consults for ids `lootTable`'s `generate` entries hand back, so runtime
5
+ * rolls never need a hand-rolled parallel registry (#536.1).
6
+ */
7
+ export interface ItemInstanceRegistry<TDef> {
8
+ /** Stores `def` under a fresh generated id derived from `baseId`; returns that id. */
9
+ register(baseId: string, def: TDef): string;
10
+ get(id: string): TDef | undefined;
11
+ has(id: string): boolean;
12
+ /** Drop a generated instance once nothing references it (consumed, destroyed, sold). */
13
+ release(id: string): void;
14
+ count(): number;
15
+ }
16
+ /**
17
+ * Builds an {@link ItemInstanceRegistry}; generated ids are `"<prefix>:<baseId>:<n>"`, unique per
18
+ * registry instance.
19
+ *
20
+ * @capability item-instance-registry a runtime store for procedurally generated item instances
21
+ */
22
+ export declare function createItemInstanceRegistry<TDef>(prefix?: string): ItemInstanceRegistry<TDef>;
23
+ /**
24
+ * Bridges any procedural roller into a `LootEntry.generate` callback: rolls a `{ baseId, def }` pair
25
+ * and registers it, returning the runtime id the loot roll hands back as the drop's `item`.
26
+ *
27
+ * @capability item-instance-registry roll and register a procedural item as a loot-table drop
28
+ */
29
+ export declare function proceduralLootEntry<TDef>(registry: ItemInstanceRegistry<TDef>, roll: (rng: () => number) => {
30
+ baseId: string;
31
+ def: TDef;
32
+ }): (rng: () => number) => string;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Builds an {@link ItemInstanceRegistry}; generated ids are `"<prefix>:<baseId>:<n>"`, unique per
3
+ * registry instance.
4
+ *
5
+ * @capability item-instance-registry a runtime store for procedurally generated item instances
6
+ */
7
+ export function createItemInstanceRegistry(prefix = "item") {
8
+ let seq = 0;
9
+ const store = new Map();
10
+ return {
11
+ register(baseId, def) {
12
+ seq += 1;
13
+ const id = `${prefix}:${baseId}:${seq}`;
14
+ store.set(id, def);
15
+ return id;
16
+ },
17
+ get: (id) => store.get(id),
18
+ has: (id) => store.has(id),
19
+ release: (id) => void store.delete(id),
20
+ count: () => store.size,
21
+ };
22
+ }
23
+ /**
24
+ * Bridges any procedural roller into a `LootEntry.generate` callback: rolls a `{ baseId, def }` pair
25
+ * and registers it, returning the runtime id the loot roll hands back as the drop's `item`.
26
+ *
27
+ * @capability item-instance-registry roll and register a procedural item as a loot-table drop
28
+ */
29
+ export function proceduralLootEntry(registry, roll) {
30
+ return (rng) => {
31
+ const rolled = roll(rng);
32
+ return registry.register(rolled.baseId, rolled.def);
33
+ };
34
+ }