@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
@@ -31,5 +31,6 @@ export interface RecordingBuffer<T> {
31
31
  * then seek/scrub the recording independent of the live sim. Frames are
32
32
  * expected in non-decreasing `t` order (one push per tick); `seek`/`range`
33
33
  * binary-search on that assumption.
34
- */
34
+ * @internal
35
+ */
35
36
  export declare function createRecordingBuffer<T>(options?: RecordingBufferOptions): RecordingBuffer<T>;
@@ -17,7 +17,8 @@ function evict(frames, options) {
17
17
  * then seek/scrub the recording independent of the live sim. Frames are
18
18
  * expected in non-decreasing `t` order (one push per tick); `seek`/`range`
19
19
  * binary-search on that assumption.
20
- */
20
+ * @internal
21
+ */
21
22
  export function createRecordingBuffer(options = {}) {
22
23
  const frames = [];
23
24
  function floorIndex(t) {
@@ -14,6 +14,7 @@ export interface ReplayLoop<T> {
14
14
  duration(): number;
15
15
  sample(t: number): T | null;
16
16
  }
17
+ /** @internal */
17
18
  export declare function createReplayLoop<T>(buffer: RecordingBuffer<T>, options?: ReplayLoopOptions<T>): ReplayLoop<T>;
18
19
  export interface ReplayEntityDeps {
19
20
  has(id: string): boolean;
@@ -29,11 +30,14 @@ export interface RecordedPoseLike {
29
30
  position: readonly [number, number, number];
30
31
  rotationY?: number;
31
32
  }
32
- /** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw. */
33
+ /** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
34
+ * @internal
35
+ */
33
36
  export declare function interpolateRecordedPose<T extends RecordedPoseLike>(before: T, after: T, alpha: number): T;
34
37
  /**
35
38
  * Reconcile a replayed pose against an entity store: spawns the ghost on the first non-null sample,
36
39
  * poses it while samples flow, despawns it through grace gaps or after the recording empties.
37
40
  * `deps` matches `ctx.scene.entity` structurally — pass `{ has: (id) => ctx.scene.entity.get(id) !== null, spawn, setPose, despawn }`.
38
- */
41
+ * @internal
42
+ */
39
43
  export declare function syncReplayEntity(deps: ReplayEntityDeps, id: string, pose: RecordedPoseLike | null, dt?: number): void;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function createReplayLoop(buffer, options = {}) {
2
3
  const grace = Math.max(0, options.spawnGraceSeconds ?? 0);
3
4
  const interpolate = options.interpolate;
@@ -26,7 +27,9 @@ export function createReplayLoop(buffer, options = {}) {
26
27
  },
27
28
  };
28
29
  }
29
- /** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw. */
30
+ /** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
31
+ * @internal
32
+ */
30
33
  export function interpolateRecordedPose(before, after, alpha) {
31
34
  let yawDelta = (after.rotationY ?? 0) - (before.rotationY ?? 0);
32
35
  while (yawDelta > Math.PI)
@@ -47,7 +50,8 @@ export function interpolateRecordedPose(before, after, alpha) {
47
50
  * Reconcile a replayed pose against an entity store: spawns the ghost on the first non-null sample,
48
51
  * poses it while samples flow, despawns it through grace gaps or after the recording empties.
49
52
  * `deps` matches `ctx.scene.entity` structurally — pass `{ has: (id) => ctx.scene.entity.get(id) !== null, spawn, setPose, despawn }`.
50
- */
53
+ * @internal
54
+ */
51
55
  export function syncReplayEntity(deps, id, pose, dt) {
52
56
  if (pose === null) {
53
57
  if (deps.has(id))
@@ -18,5 +18,6 @@ export interface RevealQuery {
18
18
  * the same unfiltered radius query, scoped to catalog-declared tags and shaped
19
19
  * for a vision readout (Dark Sight / detective-vision reveal) instead of damage
20
20
  * resolution — it never consults an occluder, by design.
21
- */
21
+ * @internal
22
+ */
22
23
  export declare function createRevealQuery(options: RevealQueryOptions): RevealQuery;
@@ -5,7 +5,8 @@ import { distanceBetween } from "../scene/spatial.js";
5
5
  * the same unfiltered radius query, scoped to catalog-declared tags and shaped
6
6
  * for a vision readout (Dark Sight / detective-vision reveal) instead of damage
7
7
  * resolution — it never consults an occluder, by design.
8
- */
8
+ * @internal
9
+ */
9
10
  export function createRevealQuery(options) {
10
11
  const { resolvePosition, resolveTags, candidates } = options;
11
12
  return {
@@ -9,11 +9,17 @@ export interface VisionConeConfig {
9
9
  /** Full cone opening angle in radians (matches `TelegraphShape`'s cone `angle`). */
10
10
  angle: number;
11
11
  }
12
- /** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5). */
12
+ /** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
13
+ * @internal
14
+ */
13
15
  export declare function segmentsIntersect(a1: VisionPoint, a2: VisionPoint, b1: VisionPoint, b2: VisionPoint): boolean;
14
- /** True when no wall segment crosses the sight line. */
16
+ /** True when no wall segment crosses the sight line.
17
+ * @internal
18
+ */
15
19
  export declare function hasWallLineOfSight(from: VisionPoint, to: VisionPoint, walls: readonly VisionWall[]): boolean;
16
- /** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`). */
20
+ /** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
21
+ * @internal
22
+ */
17
23
  export declare function pointInCone(origin: VisionPoint, heading: number, config: VisionConeConfig, point: VisionPoint): boolean;
18
24
  export interface VisionTarget<TId extends string = string> {
19
25
  id: TId;
@@ -28,4 +34,5 @@ export interface VisionCone {
28
34
  canSee(origin: VisionPoint, heading: number, target: VisionPoint): boolean;
29
35
  visibleTargets<TId extends string>(origin: VisionPoint, heading: number, targets: readonly VisionTarget<TId>[]): TId[];
30
36
  }
37
+ /** @internal */
31
38
  export declare function createVisionCone(config: VisionConeConfig, walls?: readonly VisionWall[]): VisionCone;
@@ -12,7 +12,9 @@ function onSegment(ax, az, bx, bz, cx, cz) {
12
12
  Math.min(az, bz) - 1e-9 <= cz &&
13
13
  cz <= Math.max(az, bz) + 1e-9);
14
14
  }
15
- /** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5). */
15
+ /** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
16
+ * @internal
17
+ */
16
18
  export function segmentsIntersect(a1, a2, b1, b2) {
17
19
  const o1 = orientation(a1[0], a1[1], a2[0], a2[1], b1[0], b1[1]);
18
20
  const o2 = orientation(a1[0], a1[1], a2[0], a2[1], b2[0], b2[1]);
@@ -30,7 +32,9 @@ export function segmentsIntersect(a1, a2, b1, b2) {
30
32
  return true;
31
33
  return false;
32
34
  }
33
- /** True when no wall segment crosses the sight line. */
35
+ /** True when no wall segment crosses the sight line.
36
+ * @internal
37
+ */
34
38
  export function hasWallLineOfSight(from, to, walls) {
35
39
  for (const wall of walls) {
36
40
  if (segmentsIntersect(from, to, wall.from, wall.to))
@@ -38,7 +42,9 @@ export function hasWallLineOfSight(from, to, walls) {
38
42
  }
39
43
  return true;
40
44
  }
41
- /** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`). */
45
+ /** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
46
+ * @internal
47
+ */
42
48
  export function pointInCone(origin, heading, config, point) {
43
49
  const dx = point[0] - origin[0];
44
50
  const dz = point[1] - origin[1];
@@ -54,6 +60,7 @@ export function pointInCone(origin, heading, config, point) {
54
60
  delta += Math.PI * 2;
55
61
  return Math.abs(delta) <= config.angle / 2;
56
62
  }
63
+ /** @internal */
57
64
  export function createVisionCone(config, walls = []) {
58
65
  function canSee(origin, heading, target) {
59
66
  return pointInCone(origin, heading, config, target) && hasWallLineOfSight(origin, target, walls);
@@ -33,4 +33,5 @@ export interface ContestedChannel {
33
33
  remaining(): number;
34
34
  snapshot(): ContestedSnapshot;
35
35
  }
36
+ /** @internal */
36
37
  export declare function createContestedChannel(config: ContestedChannelConfig): ContestedChannel;
@@ -10,6 +10,7 @@ function anyContester(occupants, owner) {
10
10
  }
11
11
  return false;
12
12
  }
13
+ /** @internal */
13
14
  export function createContestedChannel(config) {
14
15
  const duration = config.duration > 0 ? config.duration : Number.EPSILON;
15
16
  const interruptOnDamage = config.interruptOnDamage ?? true;
@@ -51,4 +51,5 @@ export interface RaidSession {
51
51
  status(userId: string): RaidStatus;
52
52
  playerSnapshot(userId: string): RaidPlayerSnapshot;
53
53
  }
54
+ /** @internal */
54
55
  export declare function createRaidSession(config: RaidSessionConfig): RaidSession;
@@ -18,6 +18,7 @@ function mergeAll(containers) {
18
18
  out.push({ itemId, count });
19
19
  return out;
20
20
  }
21
+ /** @internal */
21
22
  export function createRaidSession(config) {
22
23
  const points = new Map();
23
24
  for (const point of config.extracts)
@@ -3,4 +3,10 @@ export interface RoleSpec {
3
3
  count?: number;
4
4
  ratio?: number;
5
5
  }
6
+ /**
7
+ * Assign hidden or team roles across players by ratio — social-deduction and team-shuffle setups.
8
+ *
9
+ * @capability role-assign assign hidden or team roles to players by ratio
10
+ * @internal
11
+ */
6
12
  export declare function assignRoles(userIds: readonly string[], roles: readonly RoleSpec[], rng?: () => number): Record<string, string>;
@@ -1,4 +1,10 @@
1
1
  import { shuffleWithRng } from "../cards/cardPile.js";
2
+ /**
3
+ * Assign hidden or team roles across players by ratio — social-deduction and team-shuffle setups.
4
+ *
5
+ * @capability role-assign assign hidden or team roles to players by ratio
6
+ * @internal
7
+ */
2
8
  export function assignRoles(userIds, roles, rng = Math.random) {
3
9
  if (roles.length === 0)
4
10
  throw new Error("assignRoles needs at least one role");
@@ -72,8 +72,16 @@ export interface RoundState<TPhase extends string = RoundPhase> {
72
72
  roleOf(team: string): string | undefined;
73
73
  snapshot(): RoundSnapshot<TPhase>;
74
74
  }
75
+ /** @internal */
75
76
  export declare function lossBonusFor(rule: LossBonusRule | undefined, streak: number): number;
77
+ /**
78
+ * Run a match as repeating buy/action/end round phases with per-round win rewards and loss-streak economy.
79
+ *
80
+ * @capability match-rounds run buy/action/end round phases with per-round economy
81
+ * @internal
82
+ */
76
83
  export declare function createRoundState(config: RoundConfig<RoundPhase>): RoundState<RoundPhase>;
84
+ /** @internal */
77
85
  export declare function createRoundState<TPhase extends string>(config: RoundConfig<TPhase> & {
78
86
  phaseOrder: readonly TPhase[];
79
87
  }): RoundState<TPhase>;
@@ -1,4 +1,5 @@
1
1
  const DEFAULT_PHASE_ORDER = ["buy", "live", "end"];
2
+ /** @internal */
2
3
  export function lossBonusFor(rule, streak) {
3
4
  if (rule === undefined)
4
5
  return 0;
@@ -17,6 +18,7 @@ function isConcludable(order, phase) {
17
18
  const idx = order.indexOf(phase);
18
19
  return idx > 0 && idx < order.length - 1;
19
20
  }
21
+ /** @internal */
20
22
  export function createRoundState(config) {
21
23
  const order = config.phaseOrder ?? DEFAULT_PHASE_ORDER;
22
24
  const durations = config.phases;
@@ -67,6 +67,7 @@ export declare const SETTING_IDS: {
67
67
  readonly graphicsQuality: "graphics.quality";
68
68
  readonly graphicsShadows: "graphics.shadows";
69
69
  readonly graphicsUiScale: "graphics.uiScale";
70
+ readonly touchStyle: "controls.touchStyle";
70
71
  };
71
72
  export type GraphicsQuality = "low" | "medium" | "high";
72
73
  export declare const GRAPHICS_QUALITY_OPTIONS: readonly SettingOption[];
@@ -11,6 +11,7 @@ export const SETTING_IDS = {
11
11
  graphicsQuality: "graphics.quality",
12
12
  graphicsShadows: "graphics.shadows",
13
13
  graphicsUiScale: "graphics.uiScale",
14
+ touchStyle: "controls.touchStyle",
14
15
  };
15
16
  export const GRAPHICS_QUALITY_OPTIONS = [
16
17
  { value: "low", label: "Low" },
@@ -27,5 +27,11 @@ export interface AccumulatorMeter {
27
27
  reset(): void;
28
28
  tick(dtSeconds: number): void;
29
29
  }
30
+ /** The highest tier id whose `at` threshold `value` has reached, or `null` below every tier — the pure lookup `createAccumulatorMeter`/`createEventMeter` call on every `add`/`tick`. */
30
31
  export declare function tierAt(value: number, tiers: readonly MeterTier[]): string | null;
32
+ /**
33
+ * A raw accumulating gauge that crosses named tier thresholds as a value builds, with optional decay — the primitive under charge, rage, and combo meters.
34
+ *
35
+ * @capability charge-meter fill a gauge toward named tier thresholds as a value accumulates
36
+ */
31
37
  export declare function createAccumulatorMeter(config: AccumulatorMeterConfig): AccumulatorMeter;
@@ -3,6 +3,7 @@ function sortedTiers(tiers) {
3
3
  return [];
4
4
  return [...tiers].sort((a, b) => a.at - b.at);
5
5
  }
6
+ /** The highest tier id whose `at` threshold `value` has reached, or `null` below every tier — the pure lookup `createAccumulatorMeter`/`createEventMeter` call on every `add`/`tick`. */
6
7
  export function tierAt(value, tiers) {
7
8
  let current = null;
8
9
  for (const tier of tiers) {
@@ -13,6 +14,11 @@ export function tierAt(value, tiers) {
13
14
  }
14
15
  return current;
15
16
  }
17
+ /**
18
+ * A raw accumulating gauge that crosses named tier thresholds as a value builds, with optional decay — the primitive under charge, rage, and combo meters.
19
+ *
20
+ * @capability charge-meter fill a gauge toward named tier thresholds as a value accumulates
21
+ */
16
22
  export function createAccumulatorMeter(config) {
17
23
  const mode = config.mode ?? "hold";
18
24
  const tiers = sortedTiers(config.tiers);
@@ -31,4 +31,9 @@ export interface EventMeter {
31
31
  reset(): void;
32
32
  tick(dtSeconds: number): void;
33
33
  }
34
+ /**
35
+ * A heat/hype gauge that rises as tagged events land and cools between them, firing when it fills or breaks — the streak/overdrive meter shooters and fighters hand-roll.
36
+ *
37
+ * @capability event-meter a heat/streak gauge that builds from repeated hits and cools down over time
38
+ */
34
39
  export declare function createEventMeter(config: EventMeterConfig): EventMeter;
@@ -2,6 +2,11 @@ import { createAccumulatorMeter, } from "./accumulatorMeter.js";
2
2
  function readyOf(meter, mode) {
3
3
  return mode === "hold" ? meter.broke() : meter.value() >= 0 && meter.fraction() >= 1;
4
4
  }
5
+ /**
6
+ * A heat/hype gauge that rises as tagged events land and cools between them, firing when it fills or breaks — the streak/overdrive meter shooters and fighters hand-roll.
7
+ *
8
+ * @capability event-meter a heat/streak gauge that builds from repeated hits and cools down over time
9
+ */
5
10
  export function createEventMeter(config) {
6
11
  const mode = config.mode ?? "hold";
7
12
  const resets = new Set(config.resets ?? []);
@@ -12,4 +12,9 @@ export interface CheckResult {
12
12
  success: boolean;
13
13
  critical: "success" | "failure" | null;
14
14
  }
15
+ /**
16
+ * Resolve a tabletop-style pass/fail roll against a target number with modifiers and crit/fumble bands.
17
+ *
18
+ * @capability dice-check resolve a pass/fail roll against a target number with modifiers and crits
19
+ */
15
20
  export declare function rollCheck(input: CheckInput, rng?: () => number): CheckResult;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Resolve a tabletop-style pass/fail roll against a target number with modifiers and crit/fumble bands.
3
+ *
4
+ * @capability dice-check resolve a pass/fail roll against a target number with modifiers and crits
5
+ */
1
6
  export function rollCheck(input, rng = Math.random) {
2
7
  const sides = input.diceSides ?? 20;
3
8
  const advantage = input.advantage ?? "normal";
@@ -18,4 +18,9 @@ export interface Stats<TStat extends string> {
18
18
  pruneExpired(nowMs: number): string[];
19
19
  sources(): string[];
20
20
  }
21
+ /**
22
+ * A stat block whose base values take stacking, timed buffs and debuffs, resolving the modified value on read.
23
+ *
24
+ * @capability stat-block base stats with stacking, expiring buffs and debuffs applied on read
25
+ */
21
26
  export declare function createStats<TStat extends string>(base: Record<TStat, number>, options?: CreateStatsOptions): Stats<TStat>;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * A stat block whose base values take stacking, timed buffs and debuffs, resolving the modified value on read.
3
+ *
4
+ * @capability stat-block base stats with stacking, expiring buffs and debuffs applied on read
5
+ */
1
6
  export function createStats(base, options) {
2
7
  const baseValues = { ...base };
3
8
  const sourceEntries = new Map();
@@ -0,0 +1,38 @@
1
+ import type { GameContext } from "../runtime/gameContext.js";
2
+ /**
3
+ * A typed, cast-free handle onto a per-owner keyed family of slots on the reactive game store
4
+ * (`ctx.game.store`) — the {@link StoreHandle} shape widened with an `id` (userId, instanceId, …)
5
+ * so one definition covers every owner instead of one `defineStore` call per key. `keyFor` composes
6
+ * the underlying store key from the id; call sites never see it. Writes flow through the engine
7
+ * store, so they bump `ctx.version()`, serialize into a {@link WorldSnapshot}, and replay under host
8
+ * authority — the same guarantees a hand-rolled `` `prefix:${id}` `` string plus `store.get(key) as T`
9
+ * gives up.
10
+ */
11
+ export interface KeyedStoreHandle<T> {
12
+ /** Compose the underlying store key for one owner. Exposed for snapshot/debug tooling; call sites use {@link read}/{@link write}. */
13
+ keyFor(id: string): string;
14
+ /** The current value for `id`, or the definition's initial when that slot has never been written. */
15
+ read(ctx: GameContext, id: string): T;
16
+ /** The raw stored value for `id`, or `undefined` when unset — distinguishes "never written" from the initial. */
17
+ peek(ctx: GameContext, id: string): T | undefined;
18
+ /** Overwrite `id`'s slot; bumps `ctx.version()` and notifies `ctx.subscribe`. */
19
+ write(ctx: GameContext, id: string, value: T): void;
20
+ /** Read-modify-write `id`'s slot in one step, returning the next value. `mutate` receives the current value (or initial when unset). */
21
+ update(ctx: GameContext, id: string, mutate: (previous: T) => T): T;
22
+ /** Delete `id`'s slot, so the next {@link read} for that id returns the initial again. */
23
+ clear(ctx: GameContext, id: string): void;
24
+ }
25
+ /**
26
+ * Define a typed per-owner keyed family on the game store: game code expresses
27
+ * `read(ctx, userId)`/`write(ctx, userId, v)`/`update(...)` with the value type it means, and both the
28
+ * `` `prefix:${id}` `` key composition and the `unknown → T` cast live once, here, behind the boundary.
29
+ * Reach for this over N separate `defineStore` calls whenever the owning id varies at runtime (per-user
30
+ * class, per-instance auras) — `defineStore` stays the right call for a single fixed slot.
31
+ *
32
+ * Pass a factory for `initial` when the fallback is a fresh mutable object; the factory runs at most
33
+ * once **per id** and its result is reused, so an unwritten id's slot keeps a stable identity across
34
+ * reads (no per-read churn for a React selector, no allocation on a hot path).
35
+ *
36
+ * @capability typed-keyed-store a cast-free typed handle onto a per-owner keyed family of reactive game-store slots, replayable and host-authoritative
37
+ */
38
+ export declare function defineKeyedStore<T>(keyFor: (id: string) => string, initial: T | (() => T)): KeyedStoreHandle<T>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Define a typed per-owner keyed family on the game store: game code expresses
3
+ * `read(ctx, userId)`/`write(ctx, userId, v)`/`update(...)` with the value type it means, and both the
4
+ * `` `prefix:${id}` `` key composition and the `unknown → T` cast live once, here, behind the boundary.
5
+ * Reach for this over N separate `defineStore` calls whenever the owning id varies at runtime (per-user
6
+ * class, per-instance auras) — `defineStore` stays the right call for a single fixed slot.
7
+ *
8
+ * Pass a factory for `initial` when the fallback is a fresh mutable object; the factory runs at most
9
+ * once **per id** and its result is reused, so an unwritten id's slot keeps a stable identity across
10
+ * reads (no per-read churn for a React selector, no allocation on a hot path).
11
+ *
12
+ * @capability typed-keyed-store a cast-free typed handle onto a per-owner keyed family of reactive game-store slots, replayable and host-authoritative
13
+ */
14
+ export function defineKeyedStore(keyFor, initial) {
15
+ const resolved = new Map();
16
+ const initialValue = (id) => {
17
+ if (typeof initial !== "function")
18
+ return initial;
19
+ let entry = resolved.get(id);
20
+ if (entry === undefined) {
21
+ entry = { value: initial() };
22
+ resolved.set(id, entry);
23
+ }
24
+ return entry.value;
25
+ };
26
+ const read = (ctx, id) => {
27
+ const value = ctx.game.store.get(keyFor(id));
28
+ return value === undefined ? initialValue(id) : value;
29
+ };
30
+ return {
31
+ keyFor,
32
+ read,
33
+ peek: (ctx, id) => ctx.game.store.get(keyFor(id)),
34
+ write: (ctx, id, value) => ctx.game.store.set(keyFor(id), value),
35
+ update: (ctx, id, mutate) => {
36
+ const next = mutate(read(ctx, id));
37
+ ctx.game.store.set(keyFor(id), next);
38
+ return next;
39
+ },
40
+ clear: (ctx, id) => ctx.game.store.delete(keyFor(id)),
41
+ };
42
+ }
@@ -0,0 +1,33 @@
1
+ import type { GameContext } from "../runtime/gameContext.js";
2
+ /**
3
+ * A typed, cast-free handle onto one slot of the reactive game store (`ctx.game.store`). The single
4
+ * type parameter is fixed at definition; `read`/`write`/`update` never widen to `unknown`, so no call
5
+ * site repeats `store.get(key) as T`. Writes flow through the engine store, so they bump
6
+ * `ctx.version()`, serialize into a {@link WorldSnapshot}, and replay under host authority — the same
7
+ * guarantees a hand-rolled `store.get`/`store.set` pair gives up the moment it forks run state into a
8
+ * module-level singleton.
9
+ */
10
+ export interface StoreHandle<T> {
11
+ /** The underlying store key. Exposed for snapshot/debug tooling; call sites use {@link read}/{@link write}. */
12
+ readonly key: string;
13
+ /** The current value, or the definition's initial when the slot has never been written. */
14
+ read(ctx: GameContext): T;
15
+ /** The raw stored value, or `undefined` when unset — for callers that need to distinguish "never written" from the initial. */
16
+ peek(ctx: GameContext): T | undefined;
17
+ /** Overwrite the slot; bumps `ctx.version()` and notifies `ctx.subscribe`. */
18
+ write(ctx: GameContext, value: T): void;
19
+ /** Read-modify-write in one step, returning the next value. `mutate` receives the current value (or initial when unset). */
20
+ update(ctx: GameContext, mutate: (previous: T) => T): T;
21
+ /** Delete the slot, so the next {@link read} returns the initial again. */
22
+ clear(ctx: GameContext): void;
23
+ }
24
+ /**
25
+ * Define a typed slot on the game store: game code expresses `read(ctx)`/`write(ctx, v)`/`update(...)`
26
+ * with the value type it means, and the `unknown → T` cast lives once, here, behind the boundary. Pass
27
+ * a factory for `initial` when the fallback is a fresh mutable object; the factory runs at most once and
28
+ * its result is reused, so an unwritten slot keeps a stable identity across reads (no per-read churn for
29
+ * a React selector, no allocation on a hot path).
30
+ *
31
+ * @capability typed-store a cast-free typed handle onto one reactive game-store slot, replayable and host-authoritative
32
+ */
33
+ export declare function defineStore<T>(key: string, initial: T | (() => T)): StoreHandle<T>;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Define a typed slot on the game store: game code expresses `read(ctx)`/`write(ctx, v)`/`update(...)`
3
+ * with the value type it means, and the `unknown → T` cast lives once, here, behind the boundary. Pass
4
+ * a factory for `initial` when the fallback is a fresh mutable object; the factory runs at most once and
5
+ * its result is reused, so an unwritten slot keeps a stable identity across reads (no per-read churn for
6
+ * a React selector, no allocation on a hot path).
7
+ *
8
+ * @capability typed-store a cast-free typed handle onto one reactive game-store slot, replayable and host-authoritative
9
+ */
10
+ export function defineStore(key, initial) {
11
+ let resolved = null;
12
+ const initialValue = () => {
13
+ if (typeof initial !== "function")
14
+ return initial;
15
+ if (resolved === null)
16
+ resolved = { value: initial() };
17
+ return resolved.value;
18
+ };
19
+ const read = (ctx) => {
20
+ const value = ctx.game.store.get(key);
21
+ return value === undefined ? initialValue() : value;
22
+ };
23
+ return {
24
+ key,
25
+ read,
26
+ peek: (ctx) => ctx.game.store.get(key),
27
+ write: (ctx, value) => ctx.game.store.set(key, value),
28
+ update: (ctx, mutate) => {
29
+ const next = mutate(read(ctx));
30
+ ctx.game.store.set(key, next);
31
+ return next;
32
+ },
33
+ clear: (ctx) => ctx.game.store.delete(key),
34
+ };
35
+ }
@@ -4,7 +4,16 @@ export interface ObservableKeyedStore<T> {
4
4
  get(key: string): T | undefined;
5
5
  has(key: string): boolean;
6
6
  subscribe(listener: () => void): () => void;
7
+ /** Notified only when membership changes (a key is added, deleted, or hydrated) — value updates on an existing key do not fire. Pair with {@link keysSnapshot}. */
8
+ subscribeMembership(listener: () => void): () => void;
9
+ /** An owned copy of the store's entries — mutating the returned map never reaches the store. Stable identity until the next write, like {@link arraySnapshot}. */
7
10
  mapSnapshot(): ReadonlyMap<string, T>;
8
11
  arraySnapshot(): readonly T[];
12
+ /** Stable-identity list of keys; identity changes only when membership changes, so a per-frame `set` on an existing key does not churn it. */
13
+ keysSnapshot(): readonly string[];
14
+ /** Serializable `[key, value]` entries — the transport counterpart of {@link hydrate} for host→client mirroring. */
15
+ snapshot(): readonly (readonly [string, T])[];
16
+ /** Replace all entries with `data` (clears keys absent from it), emitting once. */
17
+ hydrate(data: readonly (readonly [string, T])[]): void;
9
18
  }
10
19
  export declare function createObservableKeyedStore<T>(areEqual?: (previous: T, next: T) => boolean): ObservableKeyedStore<T>;
@@ -1,28 +1,44 @@
1
1
  export function createObservableKeyedStore(areEqual) {
2
2
  const store = new Map();
3
3
  const listeners = new Set();
4
+ const membershipListeners = new Set();
4
5
  const EMPTY = [];
6
+ const EMPTY_KEYS = [];
5
7
  let arrayCache = EMPTY;
6
8
  let arrayDirty = false;
9
+ let keysCache = EMPTY_KEYS;
10
+ let keysDirty = false;
11
+ let mapCache = new Map();
12
+ let mapDirty = false;
7
13
  function emit() {
8
14
  arrayDirty = true;
15
+ mapDirty = true;
9
16
  for (const listener of listeners)
10
17
  listener();
11
18
  }
19
+ function emitMembership() {
20
+ keysDirty = true;
21
+ for (const listener of membershipListeners)
22
+ listener();
23
+ }
12
24
  return {
13
25
  set(key, value) {
26
+ const had = store.has(key);
14
27
  const previous = store.get(key);
15
- if (previous !== undefined && areEqual?.(previous, value))
28
+ if (had && areEqual?.(previous, value))
16
29
  return;
17
30
  if (previous !== value)
18
31
  store.set(key, value);
19
32
  emit();
33
+ if (!had)
34
+ emitMembership();
20
35
  },
21
36
  delete(key) {
22
37
  if (!store.has(key))
23
38
  return;
24
39
  store.delete(key);
25
40
  emit();
41
+ emitMembership();
26
42
  },
27
43
  get(key) {
28
44
  return store.get(key);
@@ -34,8 +50,16 @@ export function createObservableKeyedStore(areEqual) {
34
50
  listeners.add(listener);
35
51
  return () => listeners.delete(listener);
36
52
  },
53
+ subscribeMembership(listener) {
54
+ membershipListeners.add(listener);
55
+ return () => membershipListeners.delete(listener);
56
+ },
37
57
  mapSnapshot() {
38
- return store;
58
+ if (mapDirty) {
59
+ mapCache = new Map(store);
60
+ mapDirty = false;
61
+ }
62
+ return mapCache;
39
63
  },
40
64
  arraySnapshot() {
41
65
  if (arrayDirty) {
@@ -44,5 +68,22 @@ export function createObservableKeyedStore(areEqual) {
44
68
  }
45
69
  return arrayCache;
46
70
  },
71
+ keysSnapshot() {
72
+ if (keysDirty) {
73
+ keysCache = store.size === 0 ? EMPTY_KEYS : Array.from(store.keys());
74
+ keysDirty = false;
75
+ }
76
+ return keysCache;
77
+ },
78
+ snapshot() {
79
+ return Array.from(store.entries());
80
+ },
81
+ hydrate(data) {
82
+ store.clear();
83
+ for (const [key, value] of data)
84
+ store.set(key, value);
85
+ emit();
86
+ emitMembership();
87
+ },
47
88
  };
48
89
  }