@jgengine/core 0.10.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 (607) hide show
  1. package/CHANGELOG.md +13 -2
  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 +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  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/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Generic timed work queue — a pure-data model for discrete jobs that reserve
3
+ * inputs, advance over game time, can be paused/cancelled, and emit an output on
4
+ * completion. It backs unit training, crafting jobs, construction, research,
5
+ * respawns, downloads, and fabrication without any of them re-implementing the
6
+ * reservation → progress → completion → output-routing loop.
7
+ *
8
+ * The state ({@link WorkQueueState}) is plain serializable data; all policy —
9
+ * duration, ordering, capacity, concurrency, input reservation, refund, and
10
+ * output mapping — lives in {@link WorkQueueConfig}, which is supplied by the
11
+ * caller and is never serialized. Side effects (charging a wallet, spawning an
12
+ * entity) are the caller's: reservations and refunds are returned as data, and
13
+ * completion emits a typed event carrying a pure output payload for an external
14
+ * completion adapter to route.
15
+ */
16
+ export type JobId = string;
17
+ /** Lifecycle phase of a single queued job. Terminal jobs are removed from state. */
18
+ export type JobStatus = "queued" | "active" | "paused";
19
+ /** One unit of timed work. Plain serializable data (given serializable `TSpec`/`TReserve`). */
20
+ export interface Job<TSpec, TReserve = undefined> {
21
+ /** Stable id, unique within the queue for its lifetime. */
22
+ readonly id: JobId;
23
+ /** Caller-owned description of the work (e.g. `{ unitId }`). */
24
+ readonly spec: TSpec;
25
+ /** Reserved inputs computed at enqueue time (e.g. resource cost, population). */
26
+ readonly reservation: TReserve;
27
+ readonly status: JobStatus;
28
+ /** Seconds of work the job requires. */
29
+ readonly duration: number;
30
+ /** Seconds of work completed so far (0…duration). */
31
+ readonly elapsed: number;
32
+ /** Higher runs sooner under priority ordering; FIFO within equal priority. */
33
+ readonly priority: number;
34
+ /** Monotonic enqueue index — the FIFO tiebreak. */
35
+ readonly seq: number;
36
+ }
37
+ /** Serializable queue state. Holds only non-terminal jobs, so it stays bounded. */
38
+ export interface WorkQueueState<TSpec, TReserve = undefined> {
39
+ readonly jobs: readonly Job<TSpec, TReserve>[];
40
+ readonly nextId: number;
41
+ readonly seq: number;
42
+ }
43
+ /** Comparator over jobs; negative means the first job runs sooner. */
44
+ export type JobOrdering<TSpec, TReserve = undefined> = (a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>) => number;
45
+ /** Result of pre-enqueue validation (population caps, prerequisites, affordability). */
46
+ export interface JobValidation {
47
+ readonly ok: boolean;
48
+ readonly reason?: string;
49
+ }
50
+ /** Optional per-enqueue overrides. */
51
+ export interface EnqueueOptions {
52
+ /** Higher runs sooner under priority ordering. Defaults to 0. */
53
+ readonly priority?: number;
54
+ /** Explicit id; defaults to a queue-assigned `job-<n>`. */
55
+ readonly id?: string;
56
+ }
57
+ /**
58
+ * Injected policy for a queue. Never serialized — pass the same config to every
59
+ * {@link enqueue}/{@link tick}/{@link cancelJob} call for a given queue.
60
+ */
61
+ export interface WorkQueueConfig<TSpec, TReserve = undefined, TOutput = undefined> {
62
+ /** Seconds of work a spec requires. Negative values clamp to 0 (instant). */
63
+ duration: (spec: TSpec) => number;
64
+ /** Max concurrent active jobs (multi-server queue). Defaults to 1. */
65
+ concurrency?: number;
66
+ /** Max non-terminal jobs; further enqueues are rejected with `"capacity"`. */
67
+ capacity?: number;
68
+ /** Selection order for queued jobs. Defaults to {@link priorityOrdering}. */
69
+ ordering?: JobOrdering<TSpec, TReserve>;
70
+ /** Compute the reservation stored on the job (charge-now is the caller's job). */
71
+ reserve?: (spec: TSpec) => TReserve;
72
+ /** Validate before enqueue; a non-ok result rejects with its reason. */
73
+ validate?: (spec: TSpec, state: WorkQueueState<TSpec, TReserve>) => JobValidation;
74
+ /** Map a completed job to its output payload for a completion adapter to route. */
75
+ output?: (job: Job<TSpec, TReserve>) => TOutput;
76
+ /** Compute a refund on cancellation from the reservation and progress (0…1). */
77
+ refund?: (job: Job<TSpec, TReserve>, progress: number) => TReserve | null;
78
+ }
79
+ /** Typed lifecycle event emitted from {@link tick}. */
80
+ export type WorkQueueEvent<TSpec, TReserve = undefined, TOutput = undefined> = {
81
+ readonly type: "started";
82
+ readonly job: Job<TSpec, TReserve>;
83
+ } | {
84
+ readonly type: "completed";
85
+ readonly job: Job<TSpec, TReserve>;
86
+ readonly output: TOutput;
87
+ };
88
+ /** Outcome of {@link tick}: advanced state plus the events produced. */
89
+ export interface TickResult<TSpec, TReserve = undefined, TOutput = undefined> {
90
+ readonly state: WorkQueueState<TSpec, TReserve>;
91
+ readonly events: readonly WorkQueueEvent<TSpec, TReserve, TOutput>[];
92
+ }
93
+ /** Outcome of {@link enqueue}. On rejection the state is returned unchanged. */
94
+ export type EnqueueResult<TSpec, TReserve = undefined> = {
95
+ readonly ok: true;
96
+ readonly state: WorkQueueState<TSpec, TReserve>;
97
+ readonly job: Job<TSpec, TReserve>;
98
+ } | {
99
+ readonly ok: false;
100
+ readonly state: WorkQueueState<TSpec, TReserve>;
101
+ readonly reason: string;
102
+ };
103
+ /** Outcome of {@link cancelJob}, carrying the removed job and its computed refund. */
104
+ export type CancelResult<TSpec, TReserve = undefined> = {
105
+ readonly ok: true;
106
+ readonly state: WorkQueueState<TSpec, TReserve>;
107
+ readonly job: Job<TSpec, TReserve>;
108
+ readonly refund: TReserve | null;
109
+ } | {
110
+ readonly ok: false;
111
+ readonly state: WorkQueueState<TSpec, TReserve>;
112
+ readonly reason: string;
113
+ };
114
+ /**
115
+ * Pure FIFO ordering by enqueue sequence.
116
+ *
117
+ * @capability work-order-fifo order queued jobs by enqueue sequence
118
+ */
119
+ export declare function fifoOrdering<TSpec, TReserve = undefined>(a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>): number;
120
+ /**
121
+ * Priority-first ordering (higher priority sooner), FIFO within equal priority.
122
+ *
123
+ * @capability work-order-priority order queued jobs by priority, then FIFO within equal priority
124
+ */
125
+ export declare function priorityOrdering<TSpec, TReserve = undefined>(a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>): number;
126
+ /**
127
+ * Create an empty timed work queue.
128
+ *
129
+ * @capability work-queue a serializable timed job queue with reservation, cancellation, completion, and output routing
130
+ */
131
+ export declare function createWorkQueue<TSpec, TReserve = undefined>(): WorkQueueState<TSpec, TReserve>;
132
+ /**
133
+ * Non-terminal job count (queued + active + paused).
134
+ *
135
+ * @capability work-queue-size count non-terminal jobs in a work queue
136
+ */
137
+ export declare function queueSize<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>): number;
138
+ /**
139
+ * Look up a job by id, or `null` if absent/terminal.
140
+ *
141
+ * @capability work-job-by-id look up a queued job by id
142
+ */
143
+ export declare function jobById<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): Job<TSpec, TReserve> | null;
144
+ /**
145
+ * Jobs waiting for a slot, in selection order.
146
+ *
147
+ * @capability work-queued-jobs list jobs waiting for a slot, in selection order
148
+ */
149
+ export declare function queuedJobs<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, ordering?: JobOrdering<TSpec, TReserve>): Job<TSpec, TReserve>[];
150
+ /**
151
+ * Jobs currently progressing.
152
+ *
153
+ * @capability work-active-jobs list jobs currently progressing in a work queue
154
+ */
155
+ export declare function activeJobs<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>): Job<TSpec, TReserve>[];
156
+ /**
157
+ * Fractional progress of a job (0…1); a zero-duration job reads as complete.
158
+ *
159
+ * @capability work-job-progress compute a job's fractional progress
160
+ */
161
+ export declare function jobProgress<TSpec, TReserve>(job: Job<TSpec, TReserve>): number;
162
+ /**
163
+ * Enqueue a new job. Validates capacity and the injected `validate` policy, then
164
+ * computes and stores the reservation. Charging the reservation (now or later) is
165
+ * the caller's responsibility using {@link EnqueueResult.job}'s `reservation`.
166
+ *
167
+ * @capability enqueue-work reserve inputs and add a timed job, honoring capacity and validation policy
168
+ */
169
+ export declare function enqueue<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, spec: TSpec, options?: EnqueueOptions): EnqueueResult<TSpec, TReserve>;
170
+ /**
171
+ * Cancel a job and compute its refund. Removes the job from the queue and returns
172
+ * a refund payload (full reservation by default, or `config.refund` applied to the
173
+ * job's progress for partial/no refund). Applying the refund is the caller's job.
174
+ *
175
+ * @capability cancel-work remove a job and compute its refund from reservation and progress
176
+ */
177
+ export declare function cancelJob<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, id: JobId): CancelResult<TSpec, TReserve>;
178
+ /**
179
+ * Pause a queued or active job in place; a paused job keeps its progress and yields its slot.
180
+ *
181
+ * @capability pause-work pause a queued or active job in place, retaining its progress
182
+ */
183
+ export declare function pauseJob<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): WorkQueueState<TSpec, TReserve>;
184
+ /**
185
+ * Resume a paused job; it re-enters the queue and competes for a slot by ordering.
186
+ *
187
+ * @capability resume-work resume a paused job back into the queue's slot competition
188
+ */
189
+ export declare function resumeJob<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): WorkQueueState<TSpec, TReserve>;
190
+ /**
191
+ * Advance the queue by `dt` seconds. Promotes queued jobs into up to `concurrency`
192
+ * active slots, advances active jobs, and completes those that reach their
193
+ * duration — emitting `started`/`completed` events in deterministic order. A large
194
+ * `dt` catches up across many jobs in one call: when a job completes with leftover
195
+ * time, the freed slot promotes the next queued job and applies the remainder, so a
196
+ * reconnect or save/load gap resolves in a single bounded pass. Completed jobs are
197
+ * removed from the returned state.
198
+ *
199
+ * @capability tick-work advance jobs over time, completing work and emitting typed lifecycle events
200
+ */
201
+ export declare function tick<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, dt: number): TickResult<TSpec, TReserve, TOutput>;
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Generic timed work queue — a pure-data model for discrete jobs that reserve
3
+ * inputs, advance over game time, can be paused/cancelled, and emit an output on
4
+ * completion. It backs unit training, crafting jobs, construction, research,
5
+ * respawns, downloads, and fabrication without any of them re-implementing the
6
+ * reservation → progress → completion → output-routing loop.
7
+ *
8
+ * The state ({@link WorkQueueState}) is plain serializable data; all policy —
9
+ * duration, ordering, capacity, concurrency, input reservation, refund, and
10
+ * output mapping — lives in {@link WorkQueueConfig}, which is supplied by the
11
+ * caller and is never serialized. Side effects (charging a wallet, spawning an
12
+ * entity) are the caller's: reservations and refunds are returned as data, and
13
+ * completion emits a typed event carrying a pure output payload for an external
14
+ * completion adapter to route.
15
+ */
16
+ /**
17
+ * Pure FIFO ordering by enqueue sequence.
18
+ *
19
+ * @capability work-order-fifo order queued jobs by enqueue sequence
20
+ */
21
+ export function fifoOrdering(a, b) {
22
+ return a.seq - b.seq;
23
+ }
24
+ /**
25
+ * Priority-first ordering (higher priority sooner), FIFO within equal priority.
26
+ *
27
+ * @capability work-order-priority order queued jobs by priority, then FIFO within equal priority
28
+ */
29
+ export function priorityOrdering(a, b) {
30
+ return b.priority - a.priority || a.seq - b.seq;
31
+ }
32
+ /**
33
+ * Create an empty timed work queue.
34
+ *
35
+ * @capability work-queue a serializable timed job queue with reservation, cancellation, completion, and output routing
36
+ */
37
+ export function createWorkQueue() {
38
+ return { jobs: [], nextId: 1, seq: 0 };
39
+ }
40
+ /**
41
+ * Non-terminal job count (queued + active + paused).
42
+ *
43
+ * @capability work-queue-size count non-terminal jobs in a work queue
44
+ */
45
+ export function queueSize(state) {
46
+ return state.jobs.length;
47
+ }
48
+ /**
49
+ * Look up a job by id, or `null` if absent/terminal.
50
+ *
51
+ * @capability work-job-by-id look up a queued job by id
52
+ */
53
+ export function jobById(state, id) {
54
+ return state.jobs.find((job) => job.id === id) ?? null;
55
+ }
56
+ /**
57
+ * Jobs waiting for a slot, in selection order.
58
+ *
59
+ * @capability work-queued-jobs list jobs waiting for a slot, in selection order
60
+ */
61
+ export function queuedJobs(state, ordering = priorityOrdering) {
62
+ return state.jobs.filter((job) => job.status === "queued").sort(ordering);
63
+ }
64
+ /**
65
+ * Jobs currently progressing.
66
+ *
67
+ * @capability work-active-jobs list jobs currently progressing in a work queue
68
+ */
69
+ export function activeJobs(state) {
70
+ return state.jobs.filter((job) => job.status === "active");
71
+ }
72
+ /**
73
+ * Fractional progress of a job (0…1); a zero-duration job reads as complete.
74
+ *
75
+ * @capability work-job-progress compute a job's fractional progress
76
+ */
77
+ export function jobProgress(job) {
78
+ if (job.duration <= 0)
79
+ return 1;
80
+ return Math.min(1, Math.max(0, job.elapsed / job.duration));
81
+ }
82
+ /**
83
+ * Enqueue a new job. Validates capacity and the injected `validate` policy, then
84
+ * computes and stores the reservation. Charging the reservation (now or later) is
85
+ * the caller's responsibility using {@link EnqueueResult.job}'s `reservation`.
86
+ *
87
+ * @capability enqueue-work reserve inputs and add a timed job, honoring capacity and validation policy
88
+ */
89
+ export function enqueue(state, config, spec, options) {
90
+ if (config.capacity !== undefined && state.jobs.length >= config.capacity) {
91
+ return { ok: false, state, reason: "capacity" };
92
+ }
93
+ const validation = config.validate?.(spec, state);
94
+ if (validation !== undefined && !validation.ok) {
95
+ return { ok: false, state, reason: validation.reason ?? "invalid" };
96
+ }
97
+ const reservation = (config.reserve ? config.reserve(spec) : undefined);
98
+ const job = {
99
+ id: options?.id ?? `job-${state.nextId}`,
100
+ spec,
101
+ reservation,
102
+ status: "queued",
103
+ duration: Math.max(0, config.duration(spec)),
104
+ elapsed: 0,
105
+ priority: options?.priority ?? 0,
106
+ seq: state.seq,
107
+ };
108
+ return {
109
+ ok: true,
110
+ job,
111
+ state: { jobs: [...state.jobs, job], nextId: state.nextId + 1, seq: state.seq + 1 },
112
+ };
113
+ }
114
+ /**
115
+ * Cancel a job and compute its refund. Removes the job from the queue and returns
116
+ * a refund payload (full reservation by default, or `config.refund` applied to the
117
+ * job's progress for partial/no refund). Applying the refund is the caller's job.
118
+ *
119
+ * @capability cancel-work remove a job and compute its refund from reservation and progress
120
+ */
121
+ export function cancelJob(state, config, id) {
122
+ const job = state.jobs.find((entry) => entry.id === id);
123
+ if (job === undefined)
124
+ return { ok: false, state, reason: "not-found" };
125
+ const refund = config.refund
126
+ ? config.refund(job, jobProgress(job))
127
+ : (job.reservation ?? null);
128
+ return { ok: true, state: { ...state, jobs: state.jobs.filter((entry) => entry.id !== id) }, job, refund };
129
+ }
130
+ function setStatus(state, id, from, to) {
131
+ let changed = false;
132
+ const jobs = state.jobs.map((job) => {
133
+ if (job.id === id && job.status === from) {
134
+ changed = true;
135
+ return { ...job, status: to };
136
+ }
137
+ return job;
138
+ });
139
+ return changed ? { ...state, jobs } : state;
140
+ }
141
+ /**
142
+ * Pause a queued or active job in place; a paused job keeps its progress and yields its slot.
143
+ *
144
+ * @capability pause-work pause a queued or active job in place, retaining its progress
145
+ */
146
+ export function pauseJob(state, id) {
147
+ const active = setStatus(state, id, "active", "paused");
148
+ return active !== state ? active : setStatus(state, id, "queued", "paused");
149
+ }
150
+ /**
151
+ * Resume a paused job; it re-enters the queue and competes for a slot by ordering.
152
+ *
153
+ * @capability resume-work resume a paused job back into the queue's slot competition
154
+ */
155
+ export function resumeJob(state, id) {
156
+ return setStatus(state, id, "paused", "queued");
157
+ }
158
+ /**
159
+ * Advance the queue by `dt` seconds. Promotes queued jobs into up to `concurrency`
160
+ * active slots, advances active jobs, and completes those that reach their
161
+ * duration — emitting `started`/`completed` events in deterministic order. A large
162
+ * `dt` catches up across many jobs in one call: when a job completes with leftover
163
+ * time, the freed slot promotes the next queued job and applies the remainder, so a
164
+ * reconnect or save/load gap resolves in a single bounded pass. Completed jobs are
165
+ * removed from the returned state.
166
+ *
167
+ * @capability tick-work advance jobs over time, completing work and emitting typed lifecycle events
168
+ */
169
+ export function tick(state, config, dt) {
170
+ if (dt <= 0 || state.jobs.length === 0)
171
+ return { state, events: [] };
172
+ const concurrency = Math.max(1, Math.floor(config.concurrency ?? 1));
173
+ const ordering = config.ordering ?? priorityOrdering;
174
+ const jobs = state.jobs.map((job) => ({ ...job }));
175
+ const events = [];
176
+ const budget = new Map();
177
+ const completedIds = new Set();
178
+ const activeCount = () => jobs.reduce((n, job) => (job.status === "active" ? n + 1 : n), 0);
179
+ const nextQueued = () => {
180
+ let best;
181
+ for (const job of jobs) {
182
+ if (job.status !== "queued")
183
+ continue;
184
+ if (best === undefined || ordering(job, best) < 0)
185
+ best = job;
186
+ }
187
+ return best;
188
+ };
189
+ const promote = (job, slotBudget) => {
190
+ job.status = "active";
191
+ budget.set(job.id, Math.max(0, slotBudget));
192
+ events.push({ type: "started", job: { ...job } });
193
+ };
194
+ // Jobs already active from a prior tick get a fresh full budget this tick.
195
+ for (const job of jobs) {
196
+ if (job.status === "active")
197
+ budget.set(job.id, dt);
198
+ }
199
+ // Fill idle slots up to concurrency with a full tick budget each.
200
+ while (activeCount() < concurrency) {
201
+ const next = nextQueued();
202
+ if (next === undefined)
203
+ break;
204
+ promote(next, dt);
205
+ }
206
+ // Step through completions in time order; each freed slot pulls the next queued
207
+ // job forward with the leftover time. Bounded by the job count.
208
+ const guardMax = jobs.length * 2 + concurrency + 8;
209
+ for (let guard = 0; guard <= guardMax; guard += 1) {
210
+ let chosen;
211
+ let chosenRemaining = Infinity;
212
+ for (const job of jobs) {
213
+ if (job.status !== "active")
214
+ continue;
215
+ const available = budget.get(job.id) ?? 0;
216
+ if (available <= 0)
217
+ continue;
218
+ const remaining = job.duration - job.elapsed;
219
+ if (remaining > available)
220
+ continue;
221
+ if (chosen === undefined ||
222
+ remaining < chosenRemaining ||
223
+ (remaining === chosenRemaining && ordering(job, chosen) < 0)) {
224
+ chosen = job;
225
+ chosenRemaining = remaining;
226
+ }
227
+ }
228
+ if (chosen === undefined)
229
+ break;
230
+ const leftover = (budget.get(chosen.id) ?? 0) - Math.max(0, chosenRemaining);
231
+ chosen.elapsed = chosen.duration;
232
+ budget.delete(chosen.id);
233
+ completedIds.add(chosen.id);
234
+ const finished = { ...chosen, status: "active" };
235
+ const output = (config.output ? config.output(finished) : undefined);
236
+ events.push({ type: "completed", job: finished, output });
237
+ const next = nextQueued();
238
+ if (next !== undefined)
239
+ promote(next, leftover);
240
+ }
241
+ // Advance any active job that still holds budget but did not complete.
242
+ for (const job of jobs) {
243
+ if (job.status !== "active" || completedIds.has(job.id))
244
+ continue;
245
+ const available = budget.get(job.id) ?? 0;
246
+ if (available > 0)
247
+ job.elapsed = Math.min(job.duration, job.elapsed + available);
248
+ }
249
+ const remaining = jobs
250
+ .filter((job) => !completedIds.has(job.id))
251
+ .map((job) => ({ ...job }));
252
+ return { state: { ...state, jobs: remaining }, events };
253
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Thin unit-training composition over the generic {@link WorkQueueConfig}. Turns a
3
+ * catalog of trainable units into a queue config whose reservation is the unit's
4
+ * cost/population, whose duration is its train time, and whose completion output is
5
+ * a plain spawn descriptor. The queue never spawns or moves anything: routing the
6
+ * descriptor to a spawn primitive (and rally movement) is the caller's completion
7
+ * adapter, keeping this genre-agnostic across RTS producers, respawn bays, and any
8
+ * "make one of X after T seconds" flow.
9
+ */
10
+ import type { JobValidation, WorkQueueConfig, WorkQueueState } from "./jobQueue.js";
11
+ /** Resource costs keyed by currency/resource id. */
12
+ export type ResourceCost = Readonly<Record<string, number>>;
13
+ /** A unit the producer can train. */
14
+ export interface TrainableUnitDef {
15
+ /** Catalog id of the produced unit. */
16
+ readonly id: string;
17
+ /** Seconds to train. */
18
+ readonly trainSeconds: number;
19
+ /** Resources reserved at enqueue. */
20
+ readonly cost?: ResourceCost;
21
+ /** Population/supply reserved at enqueue. */
22
+ readonly population?: number;
23
+ }
24
+ /** What the caller asks the queue to build. */
25
+ export interface UnitTrainingSpec {
26
+ readonly unitId: string;
27
+ }
28
+ /** Reservation stored on a training job — the inputs to charge and refund. */
29
+ export interface UnitReservation {
30
+ readonly cost: ResourceCost;
31
+ readonly population: number;
32
+ }
33
+ /** Completion payload: everything a spawn/rally adapter needs, and nothing it doesn't. */
34
+ export interface UnitSpawnOrder {
35
+ readonly unitId: string;
36
+ readonly reservation: UnitReservation;
37
+ }
38
+ /** Config knobs for {@link unitTrainingConfig}. */
39
+ export interface UnitTrainingOptions {
40
+ /** Trainable units by id. */
41
+ readonly units: Record<string, TrainableUnitDef>;
42
+ /** Producers building at once (default 1 — a classic single build queue). */
43
+ readonly concurrency?: number;
44
+ /** Max queued+building units. */
45
+ readonly capacity?: number;
46
+ /** Refund fraction of cost on cancel (0 = none, 1 = full). Defaults to 1. */
47
+ readonly refundFraction?: number;
48
+ /** Extra pre-enqueue gate (affordability, tech, population cap). */
49
+ readonly canEnqueue?: (spec: UnitTrainingSpec, state: WorkQueueState<UnitTrainingSpec, UnitReservation>) => JobValidation;
50
+ }
51
+ /**
52
+ * Build a {@link WorkQueueConfig} for training units from a catalog. Reservation is
53
+ * the unit's cost + population; duration is its train time; completion output is a
54
+ * {@link UnitSpawnOrder} for the caller to route to its spawn primitive.
55
+ *
56
+ * @capability unit-training compose a timed work queue that trains catalog units into spawn orders
57
+ */
58
+ export declare function unitTrainingConfig(options: UnitTrainingOptions): WorkQueueConfig<UnitTrainingSpec, UnitReservation, UnitSpawnOrder>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Thin unit-training composition over the generic {@link WorkQueueConfig}. Turns a
3
+ * catalog of trainable units into a queue config whose reservation is the unit's
4
+ * cost/population, whose duration is its train time, and whose completion output is
5
+ * a plain spawn descriptor. The queue never spawns or moves anything: routing the
6
+ * descriptor to a spawn primitive (and rally movement) is the caller's completion
7
+ * adapter, keeping this genre-agnostic across RTS producers, respawn bays, and any
8
+ * "make one of X after T seconds" flow.
9
+ */
10
+ function scaleCost(cost, fraction) {
11
+ if (fraction >= 1)
12
+ return cost;
13
+ if (fraction <= 0)
14
+ return {};
15
+ const out = {};
16
+ for (const [resource, amount] of Object.entries(cost))
17
+ out[resource] = Math.floor(amount * fraction);
18
+ return out;
19
+ }
20
+ /**
21
+ * Build a {@link WorkQueueConfig} for training units from a catalog. Reservation is
22
+ * the unit's cost + population; duration is its train time; completion output is a
23
+ * {@link UnitSpawnOrder} for the caller to route to its spawn primitive.
24
+ *
25
+ * @capability unit-training compose a timed work queue that trains catalog units into spawn orders
26
+ */
27
+ export function unitTrainingConfig(options) {
28
+ const refundFraction = options.refundFraction ?? 1;
29
+ const unitFor = (unitId) => options.units[unitId];
30
+ return {
31
+ concurrency: options.concurrency,
32
+ capacity: options.capacity,
33
+ duration: (spec) => Math.max(0, unitFor(spec.unitId)?.trainSeconds ?? 0),
34
+ reserve: (spec) => {
35
+ const def = unitFor(spec.unitId);
36
+ return { cost: def?.cost ?? {}, population: def?.population ?? 0 };
37
+ },
38
+ validate: (spec, state) => {
39
+ if (unitFor(spec.unitId) === undefined)
40
+ return { ok: false, reason: "unknown-unit" };
41
+ return options.canEnqueue?.(spec, state) ?? { ok: true };
42
+ },
43
+ output: (job) => ({
44
+ unitId: job.spec.unitId,
45
+ reservation: job.reservation,
46
+ }),
47
+ refund: (job) => ({
48
+ cost: scaleCost(job.reservation.cost, refundFraction),
49
+ population: job.reservation.population,
50
+ }),
51
+ };
52
+ }
@@ -0,0 +1,58 @@
1
+ import type { SceneMarkerLike } from "./sceneShapes.js";
2
+ /**
3
+ * One authored catalog prop resolved from an editor marker — grounded at `x`/`z` with yaw, ready
4
+ * for `ctx.scene.object.place` or {@link placeAuthoredObjects}.
5
+ */
6
+ export interface AuthoredObject {
7
+ catalogId: string;
8
+ x: number;
9
+ z: number;
10
+ rotationY: number;
11
+ instanceId: string;
12
+ /** Extra lift in meters from the marker (`catalogId` field / meta), applied on top of terrain height. */
13
+ verticalOffset: number;
14
+ }
15
+ /** Minimal marker shape {@link resolveAuthoredObjects} reads; any `EditorMarker` satisfies it. */
16
+ export interface AuthoredObjectMarkerLike extends SceneMarkerLike {
17
+ catalogId?: string;
18
+ rotationY?: number;
19
+ }
20
+ /** Minimal document shape {@link resolveAuthoredObjects} walks; any `EditorDocument` satisfies it. */
21
+ export interface AuthoredObjectsDocumentLike {
22
+ markers: readonly AuthoredObjectMarkerLike[];
23
+ }
24
+ /** Structural place target — any `ObjectStore` satisfies it. */
25
+ export interface AuthoredObjectPlaceTarget {
26
+ place(catalogId: string, x: number, y: number, z: number, options?: {
27
+ instanceId?: string;
28
+ rotation?: number;
29
+ onExisting?: "throw" | "replace" | "keep";
30
+ }): string;
31
+ }
32
+ /** Options for {@link placeAuthoredObjects}. */
33
+ export interface PlaceAuthoredObjectsOptions {
34
+ /** Extra lift in meters applied to every placement after terrain height + per-object offset. */
35
+ verticalOffset?: number;
36
+ /** How to treat instance ids already in the store. Default `"throw"` (ObjectStore default). */
37
+ onExisting?: "throw" | "replace" | "keep";
38
+ }
39
+ /**
40
+ * Catalog id for a marker: first-class `catalogId` field, else `meta.catalogId` migration alias.
41
+ * Returns null when the marker is not an authored catalog prop (spawn, mob, generator, …).
42
+ * @capability authored-objects place catalog mesh props from an editor document
43
+ */
44
+ export declare function markerCatalogId(marker: AuthoredObjectMarkerLike): string | null;
45
+ /**
46
+ * Every marker carrying a catalog id, as placeable props — pure, no terrain sample. Parallel to
47
+ * {@link resolveScatter}: games and headless tests read the same list `<AuthoredObjects>` places.
48
+ * @capability authored-objects place catalog mesh props from an editor document
49
+ */
50
+ export declare function resolveAuthoredObjects(document: AuthoredObjectsDocumentLike): AuthoredObject[];
51
+ /**
52
+ * Places resolved authored objects into an object store, grounding each on `sampleHeight(x,z)` plus
53
+ * per-object and options vertical offsets. Returns the instance ids that were placed (or kept).
54
+ * @capability authored-objects place catalog mesh props from an editor document
55
+ */
56
+ export declare function placeAuthoredObjects(store: AuthoredObjectPlaceTarget, objects: readonly AuthoredObject[], sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];
57
+ /** Convenience: resolve a document then place every authored catalog prop. */
58
+ export declare function placeAuthoredObjectsFromDocument(store: AuthoredObjectPlaceTarget, document: AuthoredObjectsDocumentLike, sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];