@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,47 @@
1
+ export { lerp, clamp01, smoothstep } from "../anim/easing.js";
2
+ /** Constrain a value to the inclusive `[min, max]` range.
3
+ * @internal
4
+ */
5
+ export function clamp(value, min, max) {
6
+ return value < min ? min : value > max ? max : value;
7
+ }
8
+ /** Fraction of the way `value` sits between `from` and `to`; inverse of `lerp`. Returns 0 when the span is empty.
9
+ * @internal
10
+ */
11
+ export function inverseLerp(from, to, value) {
12
+ return from === to ? 0 : (value - from) / (to - from);
13
+ }
14
+ /** Map `value` from the `[inMin, inMax]` range onto `[outMin, outMax]`, optionally clamped to the output range.
15
+ * @internal
16
+ */
17
+ export function remap(value, inMin, inMax, outMin, outMax, clamped = false) {
18
+ const t = inMin === inMax ? 0 : (value - inMin) / (inMax - inMin);
19
+ const mapped = outMin + (outMax - outMin) * t;
20
+ if (!clamped)
21
+ return mapped;
22
+ const lo = Math.min(outMin, outMax);
23
+ const hi = Math.max(outMin, outMax);
24
+ return mapped < lo ? lo : mapped > hi ? hi : mapped;
25
+ }
26
+ /** Euclidean modulo that always returns a non-negative result in `[0, modulus)`, unlike the `%` operator.
27
+ * @internal
28
+ */
29
+ export function mod(value, modulus) {
30
+ return ((value % modulus) + modulus) % modulus;
31
+ }
32
+ /** Step `current` toward `target` by at most `maxDelta`, without overshooting.
33
+ * @internal
34
+ */
35
+ export function moveTowards(current, target, maxDelta) {
36
+ const diff = target - current;
37
+ if (Math.abs(diff) <= maxDelta)
38
+ return target;
39
+ return current + Math.sign(diff) * maxDelta;
40
+ }
41
+ /** Wrap `value` into the half-open range `[min, max)`, cycling past either edge.
42
+ * @internal
43
+ */
44
+ export function wrap(value, min, max) {
45
+ const span = max - min;
46
+ return span <= 0 ? min : min + mod(value - min, span);
47
+ }
@@ -1,8 +1,11 @@
1
- export declare const VERSION = "0.10.0";
1
+ /** Installed `@jgengine/core` semver — compare against {@link CHANGELOG} keys when migrating. */
2
+ export declare const VERSION = "0.11.0";
3
+ /** One release's migrate steps plus added/changed/removed notes (typed mirror of CHANGELOG.md). */
2
4
  export interface ChangelogEntry {
3
5
  migrate: readonly string[];
4
6
  added: readonly string[];
5
7
  changed: readonly string[];
6
8
  removed: readonly string[];
7
9
  }
10
+ /** Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`). */
8
11
  export declare const CHANGELOG: Record<string, ChangelogEntry>;
@@ -1,14 +1,28 @@
1
- export const VERSION = "0.10.0";
1
+ /** Installed `@jgengine/core` semver — compare against {@link CHANGELOG} keys when migrating. */
2
+ export const VERSION = "0.11.0";
3
+ /** Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`). */
2
4
  export const CHANGELOG = {
5
+ "0.11.0": {
6
+ migrate: [
7
+ "Bump lockstep SDK packages to ^0.11.0: @jgengine/{core,react,ws,node,sql,convex,shell,editor,assets}. CLI jgengine and @jgengine/github may lag on their own version lines.",
8
+ "Nothing required — classic loop.onTick fan-out still runs after systems. Prefer moving per-frame work into defineGame({ systems: [...] }) with defineSystem (@jgengine/core/game/defineSystem); install a system with feature: \"quest\" (etc.) instead of a redundant features flag.",
9
+ ],
10
+ added: [
11
+ "Composable game systems (#842) — defineSystem / compileSystemSchedule / composeGameLoop / installSystems. defineGame({ systems }) is the single authoring path: fixed / frame / interval / event-only / manual ticks, multi-subscribe channels, deterministic stage order + optional before/after/dependsOn, system-owned save / replicate / reset / dispose. Installing a system activates its feature without a separate flag. GameLoop gains optional onReset / onDispose. ctx.game.registerSave / registerReplicate for system modules. Adopters: tower-guard, claudecraft (runtime without a giant tick fan-out).",
12
+ ],
13
+ changed: [],
14
+ removed: [],
15
+ },
3
16
  "0.10.0": {
4
17
  migrate: [
5
- "Bump every @jgengine/* dependency to ^0.10.0 (the eight packages version in lockstep).",
18
+ "Bump lockstep SDK packages to ^0.10.0: @jgengine/{core,react,ws,node,sql,convex,shell,editor,assets}. CLI jgengine and @jgengine/github may lag on their own version lines.",
6
19
  "Nothing to change for existing games — the shared mobile-composition system (viewport allocation, region collision, --jg-* viewport vars) is wired automatically by the shell; HudPanels inside a HudCanvas register themselves. Legacy orientation: \"landscape\" | \"portrait\" keeps its advisory dismissible-hint behavior.",
7
20
  "Opt a driving/landscape game into the strict gate: replace advisory orientation with the contract form orientation: { mobile: \"landscape-required\" } (rules: any · portrait/landscape advisory · portrait-required/landscape-required · unsupported). In portrait the engine shows a polished RotateDeviceScreen, suppresses input, freezes the sim, and unmounts the HUD/controls until the device is landscape.",
8
21
  "Declare HUD intent where useful: HudPanel gains priority (critical/secondary/tertiary), mobileBehavior (hidden unmounts on phones, transient softens collision), allowOverlapWith, and collisionGroup — all optional; omitting them keeps prior behavior.",
9
22
  "Mobile validation now also fails on overlap: bun run shoot <game> --device mobile|mobile-landscape|both exits non-zero on forbidden inter-element collisions, naming both regions.",
10
23
  ],
11
24
  added: [
25
+ "Authored behavior triggers — schema'd `on`/`action` meta vocabulary on editor volumes and markers (`registerTriggerAction`, `collectAuthoredTriggers`, `createAuthoredTriggerRuntime`, `pointInVolume` in `@jgengine/core/scene/authoredTriggers` / `@jgengine/core/world`). Games declare typed actions via ParamSchema; the editor inspector renders trigger fields; runtime watches enter/exit/interact and dispatches to handlers. studio-showcase adopts with an announce zone.",
12
26
  "Shared mobile layout composition — @jgengine/core/ui/gameLayout (resolveLayoutMode, intersects, overlapArea, detectLayoutCollisions, computeGameplayRect, LayoutRegion, GameViewportLayout) and @jgengine/core/ui/orientation (resolveOrientationRequirement, orientationGateActive, MobileOrientationRule); @jgengine/react adds GameViewportProvider (mounted by the shell), hooks (useGameViewportLayout, useGameLayoutMode, useGameOrientation, useReservedControlZones, useLayoutCollisions, useRegisterLayoutRegion), and a headless RotateDeviceScreen. The provider tracks window.visualViewport, publishes --jg-viewport-*/--jg-visual-viewport-*/--jg-safe-* CSS vars, resolves the explicit layout mode, and detects forbidden region overlaps.",
13
27
  "Mandatory orientation contract — PlayableGame.orientation accepts { mobile: <rule> }; landscape-required/portrait-required render an engine-owned rotate gate that blocks gameplay (input suppressed, simulation frozen, HUD/controls unmounted), self-correcting when the device is turned. Reduced-motion and safe-area respected; visualViewport-sized for mobile Safari/PWA.",
14
28
  "Reserved touch-control zones — the touch dock registers its joystick / action-cluster / utility rectangles (runtime-measured) as control regions, so HUD placement and collision validation know exactly where controls sit.",
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Local collision avoidance: nudge a set of circular agents apart so they stop
3
+ * overlapping, kept deliberately separate from route planning so a game can
4
+ * pair it with nav paths, flow fields, direct seek, or vehicle steering. It is a
5
+ * short symmetric relaxation (Jacobi position correction) over a bounded uniform
6
+ * hash grid — each agent only tests the 3×3 cells around it, so cost scales with
7
+ * local density, never O(n²) across the whole world. Corrections are summed per
8
+ * agent and applied after each pass, so the result is order-independent and
9
+ * deterministic for a given agent list. Different radii and per-agent weights
10
+ * (inverse mass; `0` = immovable anchor/obstacle) are honored.
11
+ */
12
+ import type { Vec2 } from "./formation.js";
13
+ /** A circular agent that avoidance may push on the XZ plane. */
14
+ export interface AvoidanceAgent {
15
+ /** Current XZ position; reassigned in place by {@link resolveLocalAvoidance}. */
16
+ position: Vec2;
17
+ /** Collision radius (world units). */
18
+ radius: number;
19
+ }
20
+ /** Tuning for {@link resolveLocalAvoidance}. */
21
+ export interface LocalAvoidanceOptions {
22
+ /** Relaxation passes; more converges denser packs. Default `2`. */
23
+ iterations?: number;
24
+ /** Fraction of each overlap resolved per pass, `0..1`. Lower is softer/less jittery. Default `1`. */
25
+ strength?: number;
26
+ /** Extra gap enforced beyond the two radii (world units). Default `0`. */
27
+ padding?: number;
28
+ /**
29
+ * Per-agent inverse mass, parallel to the agent list. `0` pins an agent
30
+ * (obstacle/leader); a heavier agent (smaller value) yields less. Omitted or
31
+ * negative entries default to `1`. Two pinned agents never push each other.
32
+ */
33
+ weights?: readonly number[];
34
+ }
35
+ /**
36
+ * Resolve overlaps in `agents` in place and return how many overlapping pairs
37
+ * remained on the final pass (`0` = fully separated). Uses a bounded uniform
38
+ * hash grid sized to the largest agent, so only nearby agents are ever compared.
39
+ * Deterministic: corrections are accumulated then applied per pass, independent
40
+ * of agent order. Pass `weights` to pin or differentially push agents.
41
+ *
42
+ * @capability local-avoidance bounded deterministic local collision avoidance for moving agents
43
+ * @consumer squad/crowd movement — keep grouped agents from overlapping without a whole-world scan
44
+ */
45
+ export declare function resolveLocalAvoidance(agents: AvoidanceAgent[], options?: LocalAvoidanceOptions): number;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Local collision avoidance: nudge a set of circular agents apart so they stop
3
+ * overlapping, kept deliberately separate from route planning so a game can
4
+ * pair it with nav paths, flow fields, direct seek, or vehicle steering. It is a
5
+ * short symmetric relaxation (Jacobi position correction) over a bounded uniform
6
+ * hash grid — each agent only tests the 3×3 cells around it, so cost scales with
7
+ * local density, never O(n²) across the whole world. Corrections are summed per
8
+ * agent and applied after each pass, so the result is order-independent and
9
+ * deterministic for a given agent list. Different radii and per-agent weights
10
+ * (inverse mass; `0` = immovable anchor/obstacle) are honored.
11
+ */
12
+ const CELL_KEY_STRIDE = 0x40000000;
13
+ function cellKey(cx, cz) {
14
+ return cx * CELL_KEY_STRIDE + cz;
15
+ }
16
+ /**
17
+ * Resolve overlaps in `agents` in place and return how many overlapping pairs
18
+ * remained on the final pass (`0` = fully separated). Uses a bounded uniform
19
+ * hash grid sized to the largest agent, so only nearby agents are ever compared.
20
+ * Deterministic: corrections are accumulated then applied per pass, independent
21
+ * of agent order. Pass `weights` to pin or differentially push agents.
22
+ *
23
+ * @capability local-avoidance bounded deterministic local collision avoidance for moving agents
24
+ * @consumer squad/crowd movement — keep grouped agents from overlapping without a whole-world scan
25
+ */
26
+ export function resolveLocalAvoidance(agents, options = {}) {
27
+ const count = agents.length;
28
+ if (count < 2)
29
+ return 0;
30
+ const iterations = Math.max(1, Math.floor(options.iterations ?? 2));
31
+ const strength = options.strength ?? 1;
32
+ const padding = options.padding ?? 0;
33
+ const weights = options.weights;
34
+ let maxRadius = 0;
35
+ for (let i = 0; i < count; i += 1) {
36
+ if (agents[i].radius > maxRadius)
37
+ maxRadius = agents[i].radius;
38
+ }
39
+ const cell = Math.max(2 * maxRadius + padding, 1e-6);
40
+ const invCell = 1 / cell;
41
+ const corrX = new Float64Array(count);
42
+ const corrZ = new Float64Array(count);
43
+ const grid = new Map();
44
+ let overlaps = 0;
45
+ for (let pass = 0; pass < iterations; pass += 1) {
46
+ grid.clear();
47
+ for (let i = 0; i < count; i += 1) {
48
+ const p = agents[i].position;
49
+ const key = cellKey(Math.floor(p[0] * invCell), Math.floor(p[1] * invCell));
50
+ let bucket = grid.get(key);
51
+ if (bucket === undefined) {
52
+ bucket = [];
53
+ grid.set(key, bucket);
54
+ }
55
+ bucket.push(i);
56
+ }
57
+ corrX.fill(0);
58
+ corrZ.fill(0);
59
+ overlaps = 0;
60
+ for (let i = 0; i < count; i += 1) {
61
+ const a = agents[i];
62
+ const cx = Math.floor(a.position[0] * invCell);
63
+ const cz = Math.floor(a.position[1] * invCell);
64
+ const wi = weightOf(weights, i);
65
+ for (let dz = -1; dz <= 1; dz += 1) {
66
+ for (let dx = -1; dx <= 1; dx += 1) {
67
+ const bucket = grid.get(cellKey(cx + dx, cz + dz));
68
+ if (bucket === undefined)
69
+ continue;
70
+ for (let b = 0; b < bucket.length; b += 1) {
71
+ const j = bucket[b];
72
+ if (j <= i)
73
+ continue;
74
+ const wj = weightOf(weights, j);
75
+ const totalWeight = wi + wj;
76
+ if (totalWeight <= 0)
77
+ continue;
78
+ const bAgent = agents[j];
79
+ const minDist = a.radius + bAgent.radius + padding;
80
+ let ndx = bAgent.position[0] - a.position[0];
81
+ let ndz = bAgent.position[1] - a.position[1];
82
+ let dist = Math.hypot(ndx, ndz);
83
+ if (dist >= minDist)
84
+ continue;
85
+ overlaps += 1;
86
+ if (dist < 1e-9) {
87
+ // Coincident: separate along a deterministic axis by index order.
88
+ ndx = 1;
89
+ ndz = 0;
90
+ dist = 0;
91
+ }
92
+ else {
93
+ ndx /= dist;
94
+ ndz /= dist;
95
+ }
96
+ const penetration = (minDist - dist) * strength;
97
+ const shareA = (wi / totalWeight) * penetration;
98
+ const shareB = (wj / totalWeight) * penetration;
99
+ corrX[i] -= ndx * shareA;
100
+ corrZ[i] -= ndz * shareA;
101
+ corrX[j] += ndx * shareB;
102
+ corrZ[j] += ndz * shareB;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ for (let i = 0; i < count; i += 1) {
108
+ const cxi = corrX[i];
109
+ const czi = corrZ[i];
110
+ if (cxi === 0 && czi === 0)
111
+ continue;
112
+ const p = agents[i].position;
113
+ agents[i].position = [p[0] + cxi, p[1] + czi];
114
+ }
115
+ }
116
+ return overlaps;
117
+ }
118
+ function weightOf(weights, index) {
119
+ if (weights === undefined)
120
+ return 1;
121
+ const w = weights[index];
122
+ return w === undefined || w < 0 ? 1 : w;
123
+ }
@@ -5,11 +5,19 @@
5
5
  * apply the results to its own three.js camera/vectors without owning the math.
6
6
  */
7
7
  export declare const CAMERA_PITCH_LIMIT = 1.45;
8
+ /** @internal */
8
9
  export declare function clampCameraPitch(pitch: number): number;
10
+ /** @internal */
9
11
  export declare function resolveTargetEyeHeight(crouching: boolean, grounded: boolean): number;
12
+ /** @internal */
10
13
  export declare function advanceEyeHeight(currentEyeHeight: number, targetEyeHeight: number, deltaSeconds: number): number;
14
+ /** @internal */
11
15
  export declare function resolveHeadBobRate(crouching: boolean, running: boolean): number;
16
+ /** @internal */
12
17
  export declare function resolveHeadBobAmplitude(crouching: boolean, running: boolean, grounded: boolean): number;
18
+ /** @internal */
13
19
  export declare function advanceHeadBobTime(currentHeadBobTime: number, moving: boolean, grounded: boolean, bobRate: number, deltaSeconds: number): number;
20
+ /** @internal */
14
21
  export declare function resolveHeadBobOffset(headBobTime: number, bobAmplitude: number): number;
22
+ /** @internal */
15
23
  export declare function resolveCameraTrackingBlend(deltaSeconds: number): number;
@@ -6,16 +6,20 @@
6
6
  */
7
7
  import { MOVEMENT_TUNING } from "./movementModel.js";
8
8
  export const CAMERA_PITCH_LIMIT = 1.45;
9
+ /** @internal */
9
10
  export function clampCameraPitch(pitch) {
10
11
  return Math.max(-CAMERA_PITCH_LIMIT, Math.min(CAMERA_PITCH_LIMIT, pitch));
11
12
  }
13
+ /** @internal */
12
14
  export function resolveTargetEyeHeight(crouching, grounded) {
13
15
  return crouching && grounded ? MOVEMENT_TUNING.crouchEyeHeight : MOVEMENT_TUNING.standEyeHeight;
14
16
  }
17
+ /** @internal */
15
18
  export function advanceEyeHeight(currentEyeHeight, targetEyeHeight, deltaSeconds) {
16
19
  const blend = 1 - Math.exp(-MOVEMENT_TUNING.crouchTransitionSpeed * deltaSeconds);
17
20
  return currentEyeHeight + (targetEyeHeight - currentEyeHeight) * blend;
18
21
  }
22
+ /** @internal */
19
23
  export function resolveHeadBobRate(crouching, running) {
20
24
  return crouching
21
25
  ? MOVEMENT_TUNING.crouchBobRate
@@ -23,6 +27,7 @@ export function resolveHeadBobRate(crouching, running) {
23
27
  ? MOVEMENT_TUNING.runBobRate
24
28
  : MOVEMENT_TUNING.walkBobRate;
25
29
  }
30
+ /** @internal */
26
31
  export function resolveHeadBobAmplitude(crouching, running, grounded) {
27
32
  if (!grounded)
28
33
  return 0;
@@ -32,12 +37,15 @@ export function resolveHeadBobAmplitude(crouching, running, grounded) {
32
37
  ? MOVEMENT_TUNING.runBobAmplitude
33
38
  : MOVEMENT_TUNING.walkBobAmplitude;
34
39
  }
40
+ /** @internal */
35
41
  export function advanceHeadBobTime(currentHeadBobTime, moving, grounded, bobRate, deltaSeconds) {
36
42
  return moving && grounded ? currentHeadBobTime + deltaSeconds * bobRate : 0;
37
43
  }
44
+ /** @internal */
38
45
  export function resolveHeadBobOffset(headBobTime, bobAmplitude) {
39
46
  return Math.sin(headBobTime * Math.PI * 2) * bobAmplitude;
40
47
  }
48
+ /** @internal */
41
49
  export function resolveCameraTrackingBlend(deltaSeconds) {
42
50
  return 1 - Math.exp(-MOVEMENT_TUNING.cameraTrackingSpeed * deltaSeconds);
43
51
  }
@@ -22,10 +22,20 @@ export interface DashBurst {
22
22
  durationMs: number;
23
23
  distance: number;
24
24
  }
25
+ /** @internal */
25
26
  export declare function iframeActive(config: DashConfig, elapsedMs: number): boolean;
27
+ /** @internal */
26
28
  export declare function dashEase(t: number): number;
29
+ /**
30
+ * Compute a dash/dodge burst's displacement over its window, with i-frame timing for dodges.
31
+ *
32
+ * @capability dash-move a dash/dodge burst with i-frames and cooldown
33
+ * @internal
34
+ */
27
35
  export declare function dashDisplacement(config: DashConfig, dir: DashDirection, elapsedMs: number): [number, number, number];
36
+ /** @internal */
28
37
  export declare function dashOffset(config: DashConfig, dir: DashDirection, elapsedMs: number): [number, number, number];
38
+ /** @internal */
29
39
  export declare function dashFrameDelta(config: DashConfig, dir: DashDirection, previousElapsedMs: number, elapsedMs: number): [number, number, number];
30
40
  export interface DashState {
31
41
  tryDash(direction: DashDirection, nowMs: number): DashRejection | DashBurst;
@@ -37,4 +47,5 @@ export interface DashState {
37
47
  displacement(nowMs: number): [number, number, number];
38
48
  offset(nowMs: number): [number, number, number];
39
49
  }
50
+ /** @internal */
40
51
  export declare function createDashState(config: DashConfig): DashState;
@@ -1,10 +1,18 @@
1
+ /** @internal */
1
2
  export function iframeActive(config, elapsedMs) {
2
3
  return elapsedMs >= config.iframes.fromMs && elapsedMs < config.iframes.toMs;
3
4
  }
5
+ /** @internal */
4
6
  export function dashEase(t) {
5
7
  const clamped = Math.max(0, Math.min(1, t));
6
8
  return 1 - (1 - clamped) * (1 - clamped);
7
9
  }
10
+ /**
11
+ * Compute a dash/dodge burst's displacement over its window, with i-frame timing for dodges.
12
+ *
13
+ * @capability dash-move a dash/dodge burst with i-frames and cooldown
14
+ * @internal
15
+ */
8
16
  export function dashDisplacement(config, dir, elapsedMs) {
9
17
  const traveled = dashEase(elapsedMs / config.durationMs) * config.distance;
10
18
  const len = Math.hypot(dir.x, dir.z);
@@ -12,14 +20,17 @@ export function dashDisplacement(config, dir, elapsedMs) {
12
20
  return [0, 0, 0];
13
21
  return [(dir.x / len) * traveled, 0, (dir.z / len) * traveled];
14
22
  }
23
+ /** @internal */
15
24
  export function dashOffset(config, dir, elapsedMs) {
16
25
  return dashDisplacement(config, dir, elapsedMs);
17
26
  }
27
+ /** @internal */
18
28
  export function dashFrameDelta(config, dir, previousElapsedMs, elapsedMs) {
19
29
  const previous = dashDisplacement(config, dir, previousElapsedMs);
20
30
  const current = dashDisplacement(config, dir, elapsedMs);
21
31
  return [current[0] - previous[0], current[1] - previous[1], current[2] - previous[2]];
22
32
  }
33
+ /** @internal */
23
34
  export function createDashState(config) {
24
35
  let stamina = config.staminaMax;
25
36
  let dashStartMs = null;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Group destination assignment: slot a moving group into a formation around a
3
+ * target point, then match members to slots. Shape is caller data — a
4
+ * {@link FormationSlotGenerator} emits slot offsets in the group's local frame
5
+ * ("right" = +x, "forward" = +y) and the engine ships line/box/wedge/circle
6
+ * only as samples; a custom generator needs no engine change. Placement and
7
+ * matching are pure and deterministic so the same inputs always yield the same
8
+ * world slots and the same assignment, which keeps them replay- and
9
+ * network-safe. Route planning and local collision avoidance are deliberately
10
+ * separate seams (`movement/avoidance`, `nav/pathFollow`): this module answers
11
+ * only "where should each member stand", not "how does it get there".
12
+ */
13
+ /** A point or offset on the XZ ground plane: `[x, z]`. */
14
+ export type Vec2 = readonly [number, number];
15
+ /**
16
+ * Produces `count` slot offsets in the group's local frame — `[right, forward]`
17
+ * where `+forward` points where the group faces. Index order is the slot order;
18
+ * a generator must be pure (same `count` → same offsets) so placement stays
19
+ * deterministic. Sample generators below cover common shapes; games pass their
20
+ * own for anything else (crowds, convoys, sports positions) with no engine edit.
21
+ */
22
+ export type FormationSlotGenerator = (count: number) => Vec2[];
23
+ /**
24
+ * Engine yaw (`rotationY`, radians) that faces from `from` toward `to` on the
25
+ * XZ plane, matching the `forward = (sin yaw, cos yaw)` convention. Feed the
26
+ * result as the `facing` of {@link placeFormation} to orient a formation along
27
+ * its travel direction. Returns `0` when the points coincide.
28
+ *
29
+ * @capability formation-facing group facing yaw from a travel direction on the XZ plane
30
+ * @consumer squad and crowd movement — orient a destination formation along its heading
31
+ */
32
+ export declare function facingYaw(from: Vec2, to: Vec2): number;
33
+ /**
34
+ * Transform a generator's local slot offsets into world XZ positions around a
35
+ * `destination`, rotated by `facing` (engine yaw). Slot `i` in the returned
36
+ * array is `generator(count)[i]` mapped through the group frame, so it stays
37
+ * aligned with {@link assignFormationSlots}' slot indices. Pure and allocation-
38
+ * light: one array of `count` points, no per-call closures retained.
39
+ *
40
+ * @capability formation-placement place a group formation's world slots around a destination
41
+ * @consumer squad/party/convoy movement — generate per-member destination slots around a target
42
+ */
43
+ export declare function placeFormation(destination: Vec2, facing: number, count: number, generator: FormationSlotGenerator): Vec2[];
44
+ /** Tuning for {@link assignFormationSlots}' stable, low-churn matching. */
45
+ export interface SlotAssignmentOptions {
46
+ /**
47
+ * Last tick's result (`previous[member] = slot`). When supplied, a member is
48
+ * biased toward keeping its previous slot so the formation does not reshuffle
49
+ * every frame. Entries out of range for the current slot count are ignored.
50
+ */
51
+ previous?: readonly number[];
52
+ /**
53
+ * Squared-distance bonus (world units²) for keeping the previous slot; higher
54
+ * values reduce churn at the cost of tighter travel. Default `0` (pure
55
+ * nearest matching). Ignored without `previous`.
56
+ */
57
+ stickiness?: number;
58
+ }
59
+ /**
60
+ * Match `members` to `slots` by a deterministic greedy nearest assignment:
61
+ * every (member, slot) pair is ranked by squared travel distance (minus a
62
+ * stickiness bonus for a member's previous slot) and assigned in order while
63
+ * both ends are free. Returns `assignment[member] = slot`, or `-1` for members
64
+ * left unmatched when there are fewer slots than members. Ties break by member
65
+ * then slot index, so the result is stable across runs and independent of input
66
+ * ordering — the property replay and lockstep multiplayer rely on. Groups are
67
+ * bounded, so the `O(members·slots·log)` sort is fine; this is not a per-frame
68
+ * whole-world pass.
69
+ *
70
+ * @capability formation-assignment stable deterministic member-to-slot matching for a group formation
71
+ * @consumer squad/party movement — assign each member a destination slot with low reshuffle churn
72
+ */
73
+ export declare function assignFormationSlots(members: readonly Vec2[], slots: readonly Vec2[], options?: SlotAssignmentOptions): number[];
74
+ /** Options for {@link lineFormation}. */
75
+ export interface LineFormationOptions {
76
+ /** Gap between adjacent members (world units). */
77
+ spacing: number;
78
+ }
79
+ /**
80
+ * A single rank abreast, centered on the destination and facing forward — a
81
+ * skirmish line or a chorus row. Slots run left→right along the group's right
82
+ * axis.
83
+ *
84
+ * @capability formation-line line (abreast) slot generator for group destinations
85
+ * @consumer squad movement — line formation sample policy for {@link placeFormation}
86
+ */
87
+ export declare function lineFormation(options: LineFormationOptions): FormationSlotGenerator;
88
+ /** Options for {@link boxFormation}. */
89
+ export interface BoxFormationOptions {
90
+ /** Gap between adjacent members along both axes (world units). */
91
+ spacing: number;
92
+ /** Members per row; defaults to a near-square `ceil(sqrt(count))`. */
93
+ columns?: number;
94
+ }
95
+ /**
96
+ * A rectangular grid centered on the destination, front row toward `+forward` —
97
+ * a marching block or a phalanx. Rows fill front-to-back, left-to-right.
98
+ *
99
+ * @capability formation-box box/grid slot generator for group destinations
100
+ * @consumer squad movement — box formation sample policy for {@link placeFormation}
101
+ */
102
+ export declare function boxFormation(options: BoxFormationOptions): FormationSlotGenerator;
103
+ /** Options for {@link wedgeFormation}. */
104
+ export interface WedgeFormationOptions {
105
+ /** Gap between successive ranks along each arm (world units). */
106
+ spacing: number;
107
+ }
108
+ /**
109
+ * A "V"/arrowhead with the apex at the destination and arms trailing back — a
110
+ * flying-wedge charge or a goose skein. Slot 0 is the tip; later slots alternate
111
+ * right then left, each rank stepping one `spacing` outward and backward.
112
+ *
113
+ * @capability formation-wedge wedge/arrowhead slot generator for group destinations
114
+ * @consumer squad movement — wedge formation sample policy for {@link placeFormation}
115
+ */
116
+ export declare function wedgeFormation(options: WedgeFormationOptions): FormationSlotGenerator;
117
+ /** Options for {@link circleFormation}. */
118
+ export interface CircleFormationOptions {
119
+ /** Ring radius from the destination center (world units). */
120
+ radius: number;
121
+ /**
122
+ * Start angle offset (radians) around the ring; default `0` places slot 0
123
+ * directly forward. Angles advance counterclockwise.
124
+ */
125
+ startAngle?: number;
126
+ }
127
+ /**
128
+ * An evenly spaced ring around the destination — a guard cordon, a huddle, or a
129
+ * surround. Slot 0 sits `startAngle` from forward; slots advance evenly around
130
+ * the circle.
131
+ *
132
+ * @capability formation-circle ring/cordon slot generator for group destinations
133
+ * @consumer squad/crowd movement — circle formation sample policy for {@link placeFormation}
134
+ */
135
+ export declare function circleFormation(options: CircleFormationOptions): FormationSlotGenerator;