@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
package/README.md CHANGED
@@ -10,4 +10,4 @@ import { createGameRuntime } from "@jgengine/core/runtime/gameRuntime";
10
10
 
11
11
  The renderer-free world layer includes a Gerstner `waterSurface` (`world/water`) and a seeded `generateBuilding` kit (`world/buildings`), whose wave math and building component vocabulary were shaped from **[achrefelouafi](https://github.com/achrefelouafi)**'s MIT [OceanThreejs](https://github.com/achrefelouafi/OceanThreejs) and [BuildingGeneratorThreeJS](https://github.com/achrefelouafi/BuildingGeneratorThreeJS) — see [CREDITS.md](../../CREDITS.md).
12
12
 
13
- Part of [JGengine](https://github.com/Noisemaker111/jgengine). AGPL-3.0-only.
13
+ Part of [JGengine](https://github.com/Noisemaker111/jgengine). Apache-2.0.
@@ -1,4 +1,11 @@
1
1
  import type { NavGrid, NavPoint } from "../nav/navGrid.js";
2
+ /**
3
+ * Deterministic 2D offset uniformly within a disc of `radius`, stable per `id` — so a crowd converging
4
+ * on one target (a flank point, a rally banner, a boss) fans out to distinct spots instead of all
5
+ * stacking on the same coordinate. Same `id` always yields the same offset, no per-entity state to store.
6
+ * @internal
7
+ */
8
+ export declare function spreadOffset(id: string, radius: number): readonly [number, number];
2
9
  export interface FlowFieldOptions {
3
10
  clearance?: number;
4
11
  congestion?: (col: number, row: number) => number;
@@ -11,6 +18,7 @@ export interface FlowField {
11
18
  direction(point: NavPoint): NavPoint;
12
19
  next(point: NavPoint): NavPoint | null;
13
20
  }
21
+ /** @internal */
14
22
  export declare function computeFlowField(grid: NavGrid, goals: readonly NavPoint[], options?: FlowFieldOptions): FlowField;
15
23
  export interface CrowdField {
16
24
  enter(point: NavPoint): void;
@@ -20,6 +28,7 @@ export interface CrowdField {
20
28
  penalty(weight?: number): (col: number, row: number) => number;
21
29
  reset(): void;
22
30
  }
31
+ /** @internal */
23
32
  export declare function createCrowdField(grid: NavGrid): CrowdField;
24
33
  export interface Poi {
25
34
  id: string;
@@ -33,4 +42,50 @@ export interface SelectPoiOptions {
33
42
  distanceBias?: number;
34
43
  distance?: (from: NavPoint, poi: Poi) => number;
35
44
  }
45
+ /** @internal */
36
46
  export declare function selectPoi(pois: readonly Poi[], from: NavPoint, options: SelectPoiOptions): Poi | null;
47
+ /** A many-agent visitor's current step of the seek→travel→arrive→dwell→depart loop. */
48
+ export type VisitorPhase = "seeking" | "traveling" | "dwelling" | "departing" | "done";
49
+ /** One tick's result from a {@link VisitorLoop}: current phase, where to steer, and which POI it concerns. */
50
+ export interface VisitorStep {
51
+ phase: VisitorPhase;
52
+ /** Where to steer this tick (feed `scene.entity.moveToward`/`moveTowardCommit`), or `null` once `done` or stuck `seeking` with no eligible POI. */
53
+ target: NavPoint | null;
54
+ poiId: string | null;
55
+ }
56
+ /** Config for {@link createVisitorLoop}: the POI catalog, dwell duration, and exit point every agent shares. */
57
+ export interface VisitorLoopOptions {
58
+ pois: readonly Poi[];
59
+ /** How long (ms, sim time) a visitor lingers once it arrives at a POI. */
60
+ dwellMs: (poi: Poi) => number;
61
+ /** Where a visitor heads once its dwell ends — a fixed exit/despawn point, or one resolved per agent (multiple gates). */
62
+ exitPoint: NavPoint | ((agentId: string) => NavPoint);
63
+ /** Distance under which "traveling"/"departing" counts as arrived. Default 1. */
64
+ arriveRadius?: number;
65
+ occupancy?: (poiId: string) => number;
66
+ distanceBias?: number;
67
+ distance?: (from: NavPoint, poi: Poi) => number;
68
+ /** Fires once, on the traveling→dwelling transition (e.g. `crowdField.enter(poi.point)`). */
69
+ onArrive?: (agentId: string, poiId: string) => void;
70
+ /** Fires once, on the dwelling→departing transition (e.g. `crowdField.leave(poi.point)`). */
71
+ onDepart?: (agentId: string, poiId: string) => void;
72
+ }
73
+ /** Handle returned by {@link createVisitorLoop}: per-agent seek/travel/dwell/depart state machine. */
74
+ export interface VisitorLoop {
75
+ /** Registers `agentId` in the `"seeking"` phase; `tick` also auto-spawns on first call. */
76
+ spawn(agentId: string): VisitorStep;
77
+ /** Advances one agent by `dtMs` from its current `position`; `roll()` feeds `selectPoi`'s weighted pick. */
78
+ tick(agentId: string, position: NavPoint, dtMs: number, roll: () => number): VisitorStep;
79
+ get(agentId: string): VisitorStep | null;
80
+ remove(agentId: string): void;
81
+ clear(): void;
82
+ }
83
+ /**
84
+ * A many-agent seek→travel→arrive→dwell→depart loop over weighted points of interest (park visitors,
85
+ * shoppers, tavern patrons) — `ai/crowd`'s `selectPoi` covers only the weighted-pick step; this owns
86
+ * the per-agent phase machine around it so the caller only supplies positions and drives movement.
87
+ *
88
+ * @capability visitor-loop many-agent seek/travel/dwell/depart state machine over weighted POIs
89
+ * @internal
90
+ */
91
+ export declare function createVisitorLoop(options: VisitorLoopOptions): VisitorLoop;
package/dist/ai/crowd.js CHANGED
@@ -1,4 +1,17 @@
1
+ import { seededRng } from "../random/rng.js";
1
2
  const SQRT2 = Math.SQRT2;
3
+ /**
4
+ * Deterministic 2D offset uniformly within a disc of `radius`, stable per `id` — so a crowd converging
5
+ * on one target (a flank point, a rally banner, a boss) fans out to distinct spots instead of all
6
+ * stacking on the same coordinate. Same `id` always yields the same offset, no per-entity state to store.
7
+ * @internal
8
+ */
9
+ export function spreadOffset(id, radius) {
10
+ const rng = seededRng(id);
11
+ const angle = rng() * Math.PI * 2;
12
+ const r = Math.sqrt(rng()) * radius;
13
+ return [Math.cos(angle) * r, Math.sin(angle) * r];
14
+ }
2
15
  function heapPush(heap, node) {
3
16
  heap.push(node);
4
17
  let i = heap.length - 1;
@@ -46,6 +59,7 @@ function passableWithClearance(grid, clearance) {
46
59
  return true;
47
60
  };
48
61
  }
62
+ /** @internal */
49
63
  export function computeFlowField(grid, goals, options = {}) {
50
64
  const { cols, rows } = grid;
51
65
  const passable = passableWithClearance(grid, options.clearance ?? 0);
@@ -150,6 +164,7 @@ export function computeFlowField(grid, goals, options = {}) {
150
164
  };
151
165
  return field;
152
166
  }
167
+ /** @internal */
153
168
  export function createCrowdField(grid) {
154
169
  const { cols, rows } = grid;
155
170
  const occupancy = new Int32Array(cols * rows);
@@ -183,6 +198,7 @@ export function createCrowdField(grid) {
183
198
  function euclidean(from, poi) {
184
199
  return Math.hypot(poi.point[0] - from[0], poi.point[1] - from[1]);
185
200
  }
201
+ /** @internal */
186
202
  export function selectPoi(pois, from, options) {
187
203
  const distanceBias = options.distanceBias ?? 1;
188
204
  const distanceOf = options.distance ?? euclidean;
@@ -211,3 +227,101 @@ export function selectPoi(pois, from, options) {
211
227
  }
212
228
  return eligible[eligible.length - 1];
213
229
  }
230
+ function toStep(state, poiOf, exitOf, agentId) {
231
+ if (state.phase === "seeking" || state.phase === "done") {
232
+ return { phase: state.phase, target: null, poiId: null };
233
+ }
234
+ if (state.phase === "departing") {
235
+ return { phase: "departing", target: exitOf(agentId), poiId: state.poiId };
236
+ }
237
+ const poi = state.poiId === null ? undefined : poiOf(state.poiId);
238
+ return { phase: state.phase, target: poi?.point ?? null, poiId: state.poiId };
239
+ }
240
+ /**
241
+ * A many-agent seek→travel→arrive→dwell→depart loop over weighted points of interest (park visitors,
242
+ * shoppers, tavern patrons) — `ai/crowd`'s `selectPoi` covers only the weighted-pick step; this owns
243
+ * the per-agent phase machine around it so the caller only supplies positions and drives movement.
244
+ *
245
+ * @capability visitor-loop many-agent seek/travel/dwell/depart state machine over weighted POIs
246
+ * @internal
247
+ */
248
+ export function createVisitorLoop(options) {
249
+ const { pois, dwellMs, exitPoint, occupancy, distanceBias, distance } = options;
250
+ const arriveRadius = options.arriveRadius ?? 1;
251
+ const agents = new Map();
252
+ const poiById = new Map(pois.map((poi) => [poi.id, poi]));
253
+ function poiOf(id) {
254
+ return poiById.get(id);
255
+ }
256
+ function exitOf(agentId) {
257
+ return typeof exitPoint === "function" ? exitPoint(agentId) : exitPoint;
258
+ }
259
+ function ensure(agentId) {
260
+ let state = agents.get(agentId);
261
+ if (state === undefined) {
262
+ state = { phase: "seeking", poiId: null, dwellRemaining: 0 };
263
+ agents.set(agentId, state);
264
+ }
265
+ return state;
266
+ }
267
+ return {
268
+ spawn(agentId) {
269
+ const state = ensure(agentId);
270
+ return toStep(state, poiOf, exitOf, agentId);
271
+ },
272
+ tick(agentId, position, dtMs, roll) {
273
+ const state = ensure(agentId);
274
+ if (state.phase === "seeking") {
275
+ const poi = selectPoi(pois, position, {
276
+ roll: roll(),
277
+ ...(occupancy === undefined ? {} : { occupancy }),
278
+ ...(distanceBias === undefined ? {} : { distanceBias }),
279
+ ...(distance === undefined ? {} : { distance }),
280
+ });
281
+ if (poi !== null) {
282
+ state.poiId = poi.id;
283
+ state.phase = "traveling";
284
+ }
285
+ }
286
+ else if (state.phase === "traveling") {
287
+ const poi = state.poiId === null ? undefined : poiOf(state.poiId);
288
+ if (poi === undefined) {
289
+ state.phase = "departing";
290
+ state.poiId = null;
291
+ }
292
+ else if ((distance ?? euclidean)(position, poi) <= arriveRadius) {
293
+ state.phase = "dwelling";
294
+ state.dwellRemaining = dwellMs(poi);
295
+ options.onArrive?.(agentId, poi.id);
296
+ }
297
+ }
298
+ else if (state.phase === "dwelling") {
299
+ state.dwellRemaining -= dtMs;
300
+ if (state.dwellRemaining <= 0) {
301
+ const poiId = state.poiId;
302
+ state.phase = "departing";
303
+ if (poiId !== null)
304
+ options.onDepart?.(agentId, poiId);
305
+ }
306
+ }
307
+ else if (state.phase === "departing") {
308
+ const exit = exitOf(agentId);
309
+ if (Math.hypot(exit[0] - position[0], exit[1] - position[1]) <= arriveRadius) {
310
+ state.phase = "done";
311
+ state.poiId = null;
312
+ }
313
+ }
314
+ return toStep(state, poiOf, exitOf, agentId);
315
+ },
316
+ get(agentId) {
317
+ const state = agents.get(agentId);
318
+ return state === undefined ? null : toStep(state, poiOf, exitOf, agentId);
319
+ },
320
+ remove(agentId) {
321
+ agents.delete(agentId);
322
+ },
323
+ clear() {
324
+ agents.clear();
325
+ },
326
+ };
327
+ }
@@ -26,11 +26,14 @@ export interface FlockConfig {
26
26
  * (many-agents-to-POI) deliberately isn't. Pure: returns the desired acceleration for one agent;
27
27
  * `stepFlock` is the convenience integrator. O(neighbors) per agent — pre-filter with a spatial
28
28
  * grid past a few hundred agents.
29
- */
29
+ * @internal
30
+ */
30
31
  export declare function flockSteer(agent: FlockAgent, neighbors: readonly FlockAgent[], config: FlockConfig, target?: FlockVec3): FlockVec3;
31
32
  export interface FlockStepAgent {
32
33
  position: FlockVec3;
33
34
  velocity: FlockVec3;
34
35
  }
35
- /** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions. */
36
+ /** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
37
+ * @internal
38
+ */
36
39
  export declare function stepFlock(agents: FlockStepAgent[], config: FlockConfig, dt: number, target?: FlockVec3): void;
package/dist/ai/flock.js CHANGED
@@ -4,7 +4,8 @@
4
4
  * (many-agents-to-POI) deliberately isn't. Pure: returns the desired acceleration for one agent;
5
5
  * `stepFlock` is the convenience integrator. O(neighbors) per agent — pre-filter with a spatial
6
6
  * grid past a few hundred agents.
7
- */
7
+ * @internal
8
+ */
8
9
  export function flockSteer(agent, neighbors, config, target) {
9
10
  const separationWeight = config.separationWeight ?? 1.5;
10
11
  const cohesionWeight = config.cohesionWeight ?? 1;
@@ -142,7 +143,9 @@ function fillNeighbors(agents, agentIndex, invCell) {
142
143
  neighborScratch.length = count;
143
144
  return count;
144
145
  }
145
- /** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions. */
146
+ /** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
147
+ * @internal
148
+ */
146
149
  export function stepFlock(agents, config, dt, target) {
147
150
  const count = agents.length;
148
151
  if (count === 0)
@@ -16,4 +16,5 @@ export interface AssistNetwork {
16
16
  assistersOf(memberId: string): string[];
17
17
  addThreat(memberId: string, sourceId: string, amount: number): string[];
18
18
  }
19
+ /** @internal */
19
20
  export declare function createAssistNetwork(config?: AssistNetworkConfig): AssistNetwork;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function createAssistNetwork(config = {}) {
2
3
  const radius = config.radius;
3
4
  const shareFraction = Math.max(0, config.shareFraction ?? 1);
@@ -0,0 +1,76 @@
1
+ import { type RandomSeed } from "../random/rng.js";
2
+ /** A world-space `[x, z]` used for the heat system's spawn ring and witness proximity checks. */
3
+ export type HeatPoint = readonly [number, number];
4
+ /** One escalation tier — the heat threshold it begins at and the pursuer count it wants active. */
5
+ export interface HeatLevelDef {
6
+ /** Ascending level number (1, 2, 3, ...); level 0 is implicit below the first threshold. */
7
+ level: number;
8
+ /** Cumulative heat at which this level begins. */
9
+ threshold: number;
10
+ /** Active pursuers this level wants once reached. */
11
+ pursuerBudget: number;
12
+ }
13
+ /** Tuning for {@link createHeatState}/{@link advanceHeat} — levels, decay, and pursuit-spawn ring. */
14
+ export interface HeatConfig {
15
+ /** Sorted ascending by `threshold`. */
16
+ levels: readonly HeatLevelDef[];
17
+ maxHeat?: number;
18
+ /** Heat bled per second once decay is unblocked. */
19
+ decayPerSecond: number;
20
+ /** Seconds after the last witnessed gain before decay starts (a beat of "still hot" after the last crime). */
21
+ decayDelaySeconds?: number;
22
+ /** Seconds at level 0 with pursuers still alive before {@link HeatStep.standDown} fires. */
23
+ standDownSeconds?: number;
24
+ /** `[min, max]` radius for {@link HeatStep.spawnPoints}; omit to skip ring generation. */
25
+ spawnRingRadius?: readonly [number, number];
26
+ seed?: number;
27
+ }
28
+ /** Serializable heat-system state — round-trips through `createHeatState`/`advanceHeat` each tick. */
29
+ export interface HeatState {
30
+ heat: number;
31
+ level: number;
32
+ sinceGain: number;
33
+ standDownElapsed: number;
34
+ /** Opaque PRNG cursor — round-trip it as part of the state, never read or set it directly. */
35
+ rng: RandomSeed;
36
+ }
37
+ /** One crime tick's contribution — only `witnessed` gains raise heat (unseen crimes are free, GTA-style). */
38
+ export interface HeatGain {
39
+ amount: number;
40
+ witnessed: boolean;
41
+ }
42
+ /** Per-tick world facts {@link advanceHeat} needs but can't derive itself — witness proximity, pursuer count, origin. */
43
+ export interface HeatTickContext {
44
+ /** True blocks decay this tick (a witness/pursuer is still close enough to keep the heat hot). */
45
+ nearWitness: boolean;
46
+ activePursuers: number;
47
+ around: HeatPoint;
48
+ }
49
+ /** One `advanceHeat` tick's result — updated state plus what the caller should spawn/despawn. */
50
+ export interface HeatStep {
51
+ state: HeatState;
52
+ levelChanged: boolean;
53
+ pursuerBudget: number;
54
+ /** `max(0, pursuerBudget - activePursuers)` — how many more pursuers to spawn this tick. */
55
+ wantSpawns: number;
56
+ /** `wantSpawns` points on the configured ring around `ctx.around`; empty without `spawnRingRadius`. */
57
+ spawnPoints: HeatPoint[];
58
+ /** True exactly the tick pursuit should fully clear — despawn every remaining pursuer. */
59
+ standDown: boolean;
60
+ }
61
+ /**
62
+ * Escalating crime/heat/pursuit state machine (#533.4) — the star-meter every open-world crime sandbox
63
+ * hand-rolls: witness-scoped gain (unseen crimes don't raise heat), proximity-gated decay (still hot
64
+ * while a witness or pursuer is close), tiered pursuer budgets, ring-shaped spawn points around the
65
+ * player, and a stand-down countdown once heat clears so pursuit doesn't vanish instantly. Pure and
66
+ * seeded like `ai/spawnDirector` — the caller owns spawning/despawning the actual entities.
67
+ * @internal
68
+ */
69
+ export declare function createHeatState(config: HeatConfig): HeatState;
70
+ /**
71
+ * Advances {@link HeatState} by one tick: sums this tick's witnessed gains, bleeds heat once clear of
72
+ * witnesses past `decayDelaySeconds`, resolves the current {@link HeatLevelDef}, and reports how many
73
+ * pursuers to spawn (with ring points) or whether to stand pursuit down entirely.
74
+ * @internal
75
+ */
76
+ export declare function advanceHeat(config: HeatConfig, state: HeatState, dt: number, gains: readonly HeatGain[], ctx: HeatTickContext): HeatStep;
@@ -0,0 +1,97 @@
1
+ import { randomSeedFrom, stepRandomSeed } from "../random/rng.js";
2
+ function levelFor(levels, heat) {
3
+ let current = null;
4
+ for (const level of levels) {
5
+ if (heat >= level.threshold)
6
+ current = level;
7
+ }
8
+ return current;
9
+ }
10
+ /**
11
+ * Escalating crime/heat/pursuit state machine (#533.4) — the star-meter every open-world crime sandbox
12
+ * hand-rolls: witness-scoped gain (unseen crimes don't raise heat), proximity-gated decay (still hot
13
+ * while a witness or pursuer is close), tiered pursuer budgets, ring-shaped spawn points around the
14
+ * player, and a stand-down countdown once heat clears so pursuit doesn't vanish instantly. Pure and
15
+ * seeded like `ai/spawnDirector` — the caller owns spawning/despawning the actual entities.
16
+ * @internal
17
+ */
18
+ export function createHeatState(config) {
19
+ return {
20
+ heat: 0,
21
+ level: 0,
22
+ sinceGain: Number.POSITIVE_INFINITY,
23
+ standDownElapsed: 0,
24
+ rng: randomSeedFrom(config.seed ?? 1),
25
+ };
26
+ }
27
+ function ringPoints(around, count, radius, rng) {
28
+ const points = [];
29
+ let seed = rng;
30
+ const [minR, maxR] = radius;
31
+ for (let i = 0; i < count; i += 1) {
32
+ let roll;
33
+ [roll, seed] = stepRandomSeed(seed);
34
+ const angle = roll * Math.PI * 2;
35
+ let spread;
36
+ [spread, seed] = stepRandomSeed(seed);
37
+ const distance = minR + spread * Math.max(0, maxR - minR);
38
+ points.push([around[0] + Math.sin(angle) * distance, around[1] + Math.cos(angle) * distance]);
39
+ }
40
+ return { points, rng: seed };
41
+ }
42
+ /**
43
+ * Advances {@link HeatState} by one tick: sums this tick's witnessed gains, bleeds heat once clear of
44
+ * witnesses past `decayDelaySeconds`, resolves the current {@link HeatLevelDef}, and reports how many
45
+ * pursuers to spawn (with ring points) or whether to stand pursuit down entirely.
46
+ * @internal
47
+ */
48
+ export function advanceHeat(config, state, dt, gains, ctx) {
49
+ const maxHeat = config.maxHeat ?? Number.POSITIVE_INFINITY;
50
+ const decayDelay = config.decayDelaySeconds ?? 0;
51
+ const gained = gains.reduce((sum, gain) => (gain.witnessed ? sum + gain.amount : sum), 0);
52
+ let heat = state.heat;
53
+ let sinceGain = state.sinceGain;
54
+ if (gained > 0) {
55
+ heat = Math.min(maxHeat, heat + gained);
56
+ sinceGain = 0;
57
+ }
58
+ else {
59
+ sinceGain += dt;
60
+ if (sinceGain >= decayDelay && !ctx.nearWitness) {
61
+ heat = Math.max(0, heat - config.decayPerSecond * dt);
62
+ }
63
+ }
64
+ const resolvedLevel = levelFor(config.levels, heat);
65
+ const level = resolvedLevel?.level ?? 0;
66
+ const pursuerBudget = resolvedLevel?.pursuerBudget ?? 0;
67
+ const levelChanged = level !== state.level;
68
+ let standDownElapsed = state.standDownElapsed;
69
+ let standDown = false;
70
+ if (level === 0 && ctx.activePursuers > 0) {
71
+ standDownElapsed += dt;
72
+ const limit = config.standDownSeconds ?? 0;
73
+ if (standDownElapsed >= limit) {
74
+ standDown = true;
75
+ standDownElapsed = 0;
76
+ }
77
+ }
78
+ else {
79
+ standDownElapsed = 0;
80
+ }
81
+ const wantSpawns = Math.max(0, pursuerBudget - ctx.activePursuers);
82
+ let spawnPoints = [];
83
+ let rng = state.rng;
84
+ if (wantSpawns > 0 && config.spawnRingRadius !== undefined) {
85
+ const rolled = ringPoints(ctx.around, wantSpawns, config.spawnRingRadius, rng);
86
+ spawnPoints = rolled.points;
87
+ rng = rolled.rng;
88
+ }
89
+ return {
90
+ state: { heat, level, sinceGain, standDownElapsed, rng },
91
+ levelChanged,
92
+ pursuerBudget,
93
+ wantSpawns,
94
+ spawnPoints,
95
+ standDown,
96
+ };
97
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Interest scheduling: the scale primitive that lets far-away agents sleep instead of running
3
+ * acquisition and pathing every frame. A per-agent gate decides — from proximity to the nearest
4
+ * interest source plus explicit wake signals — whether this tick does expensive work, at what
5
+ * cadence, with hysteresis so it never thrashes at the boundary and deterministic staggering so a
6
+ * thousand siblings do not all wake on the same frame. State is a plain serializable object; the
7
+ * caller drives it from a bounded spatial query, never a full-world scan.
8
+ */
9
+ /** Whether an agent's gate is doing work (`active`) or culled (`dormant`). */
10
+ export type InterestState = "active" | "dormant";
11
+ /** A distance-keyed cadence tier: nearer agents tick faster, farther-but-awake agents tick slower. */
12
+ export interface InterestTier {
13
+ /** Applies when proximity is at or below this distance. */
14
+ readonly within: number;
15
+ /** Seconds between active ticks in this tier (`0` = every tick). */
16
+ readonly interval: number;
17
+ }
18
+ /** Static configuration shared by every gate of one behavior class. */
19
+ export interface InterestSchedulerConfig {
20
+ /** Proximity at or below which a dormant agent wakes. */
21
+ readonly wakeRadius: number;
22
+ /**
23
+ * Proximity above which an active agent sleeps. Must be >= `wakeRadius`; the gap between them is
24
+ * the hysteresis band that stops sleep/wake thrash at the edge. Default: `wakeRadius` (no band).
25
+ */
26
+ readonly sleepRadius?: number;
27
+ /** Seconds between active ticks while awake (`0` = every tick). Overridden by a matching tier. */
28
+ readonly activeInterval?: number;
29
+ /**
30
+ * Distance-keyed cadence tiers, checked in array order with the first `proximity <= within` match
31
+ * winning — so order them nearest-first (smallest `within` first). Overrides `activeInterval`.
32
+ */
33
+ readonly tiers?: readonly InterestTier[];
34
+ /** After any wake signal, stay active at least this long regardless of proximity. Default `0`. */
35
+ readonly stayAwakeSeconds?: number;
36
+ }
37
+ /** Per-agent serializable gate state. Round-trip the whole object; never read fields to drive logic. */
38
+ export interface InterestGateState {
39
+ state: InterestState;
40
+ /** Time accrued toward the next active tick. */
41
+ clock: number;
42
+ /** Remaining forced-awake time from the last wake signal. */
43
+ awakeHold: number;
44
+ /** Deterministic `[0,1)` cadence offset so sibling agents fire on different frames. */
45
+ phase: number;
46
+ }
47
+ /** Per-tick input the caller supplies to a gate. */
48
+ export interface InterestGateInput {
49
+ /** Distance to the nearest interest source (player, threat, owner); `null` when none / unknown. */
50
+ readonly proximity?: number | null;
51
+ /** Explicit wake trigger — damage, event, ownership change, caller override. Forces active. */
52
+ readonly wake?: boolean;
53
+ }
54
+ /** Per-tick output that tells the caller whether to run expensive work. */
55
+ export interface InterestGateStep {
56
+ /** The gate's state after this tick. */
57
+ readonly state: InterestState;
58
+ /** Run the expensive work (acquisition, pathing) this tick? */
59
+ readonly active: boolean;
60
+ /** Transitioned dormant→active this tick — the single-frame wake edge. */
61
+ readonly woke: boolean;
62
+ /** Transitioned active→dormant this tick — the single-frame sleep edge. */
63
+ readonly slept: boolean;
64
+ }
65
+ /**
66
+ * A deterministic `[0,1)` cadence phase derived from a stable id, for staggering sibling gates so a
67
+ * batch of agents spawned together does not fire their first active tick on the same frame. Pass the
68
+ * result as the `phase` argument to {@link createInterestGateState}.
69
+ *
70
+ * @capability interest-stagger deterministic per-id cadence phase that spreads sibling gate ticks across frames
71
+ */
72
+ export declare function interestPhase(seed: string | number): number;
73
+ /**
74
+ * Create a dormant gate state, staggered by `phase` (`[0,1)`, typically {@link interestPhase} of the
75
+ * agent id) so siblings created together do not all fire their first active tick on the same frame.
76
+ *
77
+ * @capability interest-gate per-agent sleep/wake + cadence gate state so far agents skip expensive ticks
78
+ */
79
+ export declare function createInterestGateState(config: InterestSchedulerConfig, phase?: number): InterestGateState;
80
+ /**
81
+ * Advance one gate by `dt` seconds against this tick's `input`, mutating `state` in place and
82
+ * returning what the caller should do. Sleeping skips the expensive work (`active: false`) while the
83
+ * gate's timers keep advancing, so state is preserved; a `wake` signal or crossing `wakeRadius`
84
+ * flips it back to active and fires an immediate tick.
85
+ *
86
+ * @capability interest-scheduler advance a sleep/wake gate with hysteresis, cadence tiers, and stagger
87
+ */
88
+ export declare function advanceInterestGate(state: InterestGateState, config: InterestSchedulerConfig, dt: number, input?: InterestGateInput): InterestGateStep;
89
+ /** Aggregate counts of active vs dormant gates — the metric the issue asks a scheduler to expose. */
90
+ export interface InterestCensus {
91
+ active: number;
92
+ dormant: number;
93
+ total: number;
94
+ }
95
+ /** A running census accumulator; call `record` inside the caller's existing tick loop (no extra pass). */
96
+ export interface InterestCensusAccumulator {
97
+ record(state: InterestState | InterestGateState): void;
98
+ snapshot(): InterestCensus;
99
+ reset(): void;
100
+ }
101
+ /**
102
+ * Create a census accumulator so the caller can tally active/dormant gates during the loop it already
103
+ * runs, avoiding any separate full-world scan just to report scheduler metrics.
104
+ *
105
+ * @capability interest-census running active/dormant gate tally folded into the caller's tick loop
106
+ */
107
+ export declare function createInterestCensus(): InterestCensusAccumulator;