@jgengine/core 0.10.0 → 0.12.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 (727) hide show
  1. package/CHANGELOG.md +39 -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/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -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;
@@ -0,0 +1,194 @@
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
+ import { yawForward, yawRight } from "./steering.js";
14
+ /**
15
+ * Engine yaw (`rotationY`, radians) that faces from `from` toward `to` on the
16
+ * XZ plane, matching the `forward = (sin yaw, cos yaw)` convention. Feed the
17
+ * result as the `facing` of {@link placeFormation} to orient a formation along
18
+ * its travel direction. Returns `0` when the points coincide.
19
+ *
20
+ * @capability formation-facing group facing yaw from a travel direction on the XZ plane
21
+ * @consumer squad and crowd movement — orient a destination formation along its heading
22
+ */
23
+ export function facingYaw(from, to) {
24
+ const dx = to[0] - from[0];
25
+ const dz = to[1] - from[1];
26
+ if (dx * dx + dz * dz <= 1e-18)
27
+ return 0;
28
+ return Math.atan2(dx, dz);
29
+ }
30
+ /**
31
+ * Transform a generator's local slot offsets into world XZ positions around a
32
+ * `destination`, rotated by `facing` (engine yaw). Slot `i` in the returned
33
+ * array is `generator(count)[i]` mapped through the group frame, so it stays
34
+ * aligned with {@link assignFormationSlots}' slot indices. Pure and allocation-
35
+ * light: one array of `count` points, no per-call closures retained.
36
+ *
37
+ * @capability formation-placement place a group formation's world slots around a destination
38
+ * @consumer squad/party/convoy movement — generate per-member destination slots around a target
39
+ */
40
+ export function placeFormation(destination, facing, count, generator) {
41
+ if (count <= 0)
42
+ return [];
43
+ const forward = yawForward(facing);
44
+ const right = yawRight(facing);
45
+ const local = generator(count);
46
+ const slots = [];
47
+ for (let i = 0; i < count; i += 1) {
48
+ const offset = local[i] ?? ZERO;
49
+ const r = offset[0];
50
+ const f = offset[1];
51
+ slots.push([
52
+ destination[0] + right[0] * r + forward[0] * f,
53
+ destination[1] + right[1] * r + forward[1] * f,
54
+ ]);
55
+ }
56
+ return slots;
57
+ }
58
+ /**
59
+ * Match `members` to `slots` by a deterministic greedy nearest assignment:
60
+ * every (member, slot) pair is ranked by squared travel distance (minus a
61
+ * stickiness bonus for a member's previous slot) and assigned in order while
62
+ * both ends are free. Returns `assignment[member] = slot`, or `-1` for members
63
+ * left unmatched when there are fewer slots than members. Ties break by member
64
+ * then slot index, so the result is stable across runs and independent of input
65
+ * ordering — the property replay and lockstep multiplayer rely on. Groups are
66
+ * bounded, so the `O(members·slots·log)` sort is fine; this is not a per-frame
67
+ * whole-world pass.
68
+ *
69
+ * @capability formation-assignment stable deterministic member-to-slot matching for a group formation
70
+ * @consumer squad/party movement — assign each member a destination slot with low reshuffle churn
71
+ */
72
+ export function assignFormationSlots(members, slots, options = {}) {
73
+ const memberCount = members.length;
74
+ const slotCount = slots.length;
75
+ const assignment = new Array(memberCount).fill(-1);
76
+ if (memberCount === 0 || slotCount === 0)
77
+ return assignment;
78
+ const previous = options.previous;
79
+ const stickiness = options.stickiness ?? 0;
80
+ const pairs = [];
81
+ for (let m = 0; m < memberCount; m += 1) {
82
+ const member = members[m];
83
+ const keepSlot = previous?.[m];
84
+ for (let s = 0; s < slotCount; s += 1) {
85
+ const slot = slots[s];
86
+ const dx = slot[0] - member[0];
87
+ const dz = slot[1] - member[1];
88
+ let cost = dx * dx + dz * dz;
89
+ if (stickiness > 0 && keepSlot === s)
90
+ cost -= stickiness;
91
+ pairs.push({ member: m, slot: s, cost });
92
+ }
93
+ }
94
+ pairs.sort((a, b) => a.cost !== b.cost ? a.cost - b.cost : a.member !== b.member ? a.member - b.member : a.slot - b.slot);
95
+ const slotTaken = new Array(slotCount).fill(false);
96
+ let filled = 0;
97
+ const need = Math.min(memberCount, slotCount);
98
+ for (let p = 0; p < pairs.length && filled < need; p += 1) {
99
+ const pair = pairs[p];
100
+ if (assignment[pair.member] !== -1 || slotTaken[pair.slot])
101
+ continue;
102
+ assignment[pair.member] = pair.slot;
103
+ slotTaken[pair.slot] = true;
104
+ filled += 1;
105
+ }
106
+ return assignment;
107
+ }
108
+ const ZERO = [0, 0];
109
+ /**
110
+ * A single rank abreast, centered on the destination and facing forward — a
111
+ * skirmish line or a chorus row. Slots run left→right along the group's right
112
+ * axis.
113
+ *
114
+ * @capability formation-line line (abreast) slot generator for group destinations
115
+ * @consumer squad movement — line formation sample policy for {@link placeFormation}
116
+ */
117
+ export function lineFormation(options) {
118
+ const spacing = options.spacing;
119
+ return (count) => {
120
+ const slots = [];
121
+ const mid = (count - 1) / 2;
122
+ for (let i = 0; i < count; i += 1)
123
+ slots.push([(i - mid) * spacing, 0]);
124
+ return slots;
125
+ };
126
+ }
127
+ /**
128
+ * A rectangular grid centered on the destination, front row toward `+forward` —
129
+ * a marching block or a phalanx. Rows fill front-to-back, left-to-right.
130
+ *
131
+ * @capability formation-box box/grid slot generator for group destinations
132
+ * @consumer squad movement — box formation sample policy for {@link placeFormation}
133
+ */
134
+ export function boxFormation(options) {
135
+ const spacing = options.spacing;
136
+ const fixedColumns = options.columns;
137
+ return (count) => {
138
+ const columns = Math.max(1, fixedColumns ?? Math.ceil(Math.sqrt(count)));
139
+ const rows = Math.ceil(count / columns);
140
+ const midCol = (columns - 1) / 2;
141
+ const midRow = (rows - 1) / 2;
142
+ const slots = [];
143
+ for (let i = 0; i < count; i += 1) {
144
+ const row = Math.floor(i / columns);
145
+ const col = i % columns;
146
+ slots.push([(col - midCol) * spacing, (midRow - row) * spacing]);
147
+ }
148
+ return slots;
149
+ };
150
+ }
151
+ /**
152
+ * A "V"/arrowhead with the apex at the destination and arms trailing back — a
153
+ * flying-wedge charge or a goose skein. Slot 0 is the tip; later slots alternate
154
+ * right then left, each rank stepping one `spacing` outward and backward.
155
+ *
156
+ * @capability formation-wedge wedge/arrowhead slot generator for group destinations
157
+ * @consumer squad movement — wedge formation sample policy for {@link placeFormation}
158
+ */
159
+ export function wedgeFormation(options) {
160
+ const spacing = options.spacing;
161
+ return (count) => {
162
+ const slots = [];
163
+ for (let i = 0; i < count; i += 1) {
164
+ if (i === 0) {
165
+ slots.push([0, 0]);
166
+ continue;
167
+ }
168
+ const rank = Math.ceil(i / 2);
169
+ const side = i % 2 === 1 ? 1 : -1;
170
+ slots.push([side * rank * spacing, -rank * spacing]);
171
+ }
172
+ return slots;
173
+ };
174
+ }
175
+ /**
176
+ * An evenly spaced ring around the destination — a guard cordon, a huddle, or a
177
+ * surround. Slot 0 sits `startAngle` from forward; slots advance evenly around
178
+ * the circle.
179
+ *
180
+ * @capability formation-circle ring/cordon slot generator for group destinations
181
+ * @consumer squad/crowd movement — circle formation sample policy for {@link placeFormation}
182
+ */
183
+ export function circleFormation(options) {
184
+ const radius = options.radius;
185
+ const startAngle = options.startAngle ?? 0;
186
+ return (count) => {
187
+ const slots = [];
188
+ for (let i = 0; i < count; i += 1) {
189
+ const angle = startAngle + (2 * Math.PI * i) / count;
190
+ slots.push([radius * Math.sin(angle), radius * Math.cos(angle)]);
191
+ }
192
+ return slots;
193
+ };
194
+ }
@@ -41,4 +41,9 @@ export interface GlideModel {
41
41
  pose(): GlideStep;
42
42
  launch(position: GlideVec3, heading: number, initialSpeed?: number): void;
43
43
  }
44
+ /**
45
+ * Gliding/wingsuit descent control — lift, drag, and steering from a launch.
46
+ *
47
+ * @capability glide gliding/wingsuit descent control from a launch
48
+ */
44
49
  export declare function createGlideModel(config?: GlideModelConfig): GlideModel;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Gliding/wingsuit descent control — lift, drag, and steering from a launch.
3
+ *
4
+ * @capability glide gliding/wingsuit descent control from a launch
5
+ */
1
6
  export function createGlideModel(config = {}) {
2
7
  const gravity = (config.gravity ?? 20) * (config.gravityScale ?? 0.25);
3
8
  const thrustAccel = config.thrustAccel ?? 10;
@@ -31,4 +31,9 @@ export interface GrappleSwing {
31
31
  /** Constrain one frame. `reeling` shortens the rope; returns the corrected position/velocity. */
32
32
  step(position: SwingVec3, velocity: SwingVec3, dt: number, reeling?: boolean): GrappleSwingStep;
33
33
  }
34
+ /**
35
+ * Grappling-hook rope swing physics with anchor, pendulum motion, and reel-in.
36
+ *
37
+ * @capability grapple-swing grappling-hook rope swing physics with reel-in
38
+ */
34
39
  export declare function createGrappleSwing(config?: GrappleSwingConfig): GrappleSwing;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Grappling-hook rope swing physics with anchor, pendulum motion, and reel-in.
3
+ *
4
+ * @capability grapple-swing grappling-hook rope swing physics with reel-in
5
+ */
1
6
  export function createGrappleSwing(config = {}) {
2
7
  const reelSpeed = config.reelSpeed ?? 0;
3
8
  const minLength = config.minLength ?? 1;
@@ -26,4 +26,9 @@ export interface LeaderTrail {
26
26
  /** Drop all history (teleport, respawn) and optionally restart from a position. */
27
27
  reset(position?: TrailPoint): void;
28
28
  }
29
+ /**
30
+ * A trailing follower formation that chases a leader along its past path — snake/convoy trails.
31
+ *
32
+ * @capability follow-trail trailing follower/snake formation that chases a leader
33
+ */
29
34
  export declare function createLeaderTrail(config: LeaderTrailConfig): LeaderTrail;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * A trailing follower formation that chases a leader along its past path — snake/convoy trails.
3
+ *
4
+ * @capability follow-trail trailing follower/snake formation that chases a leader
5
+ */
1
6
  export function createLeaderTrail(config) {
2
7
  if (!(config.spacing > 0))
3
8
  throw new Error(`leader trail spacing must be positive, got ${config.spacing}`);