@jgengine/core 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/CHANGELOG.md +34 -3
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/spawnDirector.d.ts +19 -1
  21. package/dist/ai/spawnDirector.js +53 -26
  22. package/dist/ai/spawnPoint.d.ts +7 -0
  23. package/dist/ai/spawnPoint.js +7 -0
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/audio/audioFalloff.d.ts +5 -2
  35. package/dist/audio/music.d.ts +53 -0
  36. package/dist/audio/music.js +34 -0
  37. package/dist/audio/synth.d.ts +60 -0
  38. package/dist/audio/synth.js +8 -0
  39. package/dist/authoring.d.ts +15 -0
  40. package/dist/authoring.js +15 -0
  41. package/dist/board/laneBoard.d.ts +13 -0
  42. package/dist/board/laneBoard.js +13 -0
  43. package/dist/board/timelineBoard.d.ts +10 -0
  44. package/dist/board/timelineBoard.js +10 -0
  45. package/dist/combat/abilityKit.d.ts +18 -0
  46. package/dist/combat/abilityKit.js +24 -9
  47. package/dist/combat/animationState.d.ts +5 -0
  48. package/dist/combat/animationState.js +5 -0
  49. package/dist/combat/breakMeters.d.ts +10 -0
  50. package/dist/combat/breakMeters.js +10 -0
  51. package/dist/combat/castRunner.d.ts +5 -0
  52. package/dist/combat/castRunner.js +5 -0
  53. package/dist/combat/comboPoints.d.ts +5 -0
  54. package/dist/combat/comboPoints.js +5 -0
  55. package/dist/combat/comboString.d.ts +5 -0
  56. package/dist/combat/comboString.js +5 -0
  57. package/dist/combat/damageInterceptors.d.ts +192 -0
  58. package/dist/combat/damageInterceptors.js +251 -0
  59. package/dist/combat/damageMatchup.d.ts +68 -0
  60. package/dist/combat/damageMatchup.js +42 -0
  61. package/dist/combat/damageResolution.d.ts +63 -0
  62. package/dist/combat/damageResolution.js +50 -0
  63. package/dist/combat/death.d.ts +7 -1
  64. package/dist/combat/death.js +5 -0
  65. package/dist/combat/deathReason.d.ts +14 -0
  66. package/dist/combat/deathReason.js +1 -0
  67. package/dist/combat/defensiveWindow.d.ts +5 -0
  68. package/dist/combat/defensiveWindow.js +5 -0
  69. package/dist/combat/dotField.d.ts +47 -0
  70. package/dist/combat/dotField.js +52 -0
  71. package/dist/combat/downed.d.ts +5 -0
  72. package/dist/combat/downed.js +5 -0
  73. package/dist/combat/effects.d.ts +5 -0
  74. package/dist/combat/effects.js +5 -0
  75. package/dist/combat/encounterSequence.d.ts +258 -0
  76. package/dist/combat/encounterSequence.js +426 -0
  77. package/dist/combat/hitReaction.d.ts +57 -1
  78. package/dist/combat/hitReaction.js +45 -5
  79. package/dist/combat/magazine.d.ts +54 -0
  80. package/dist/combat/magazine.js +96 -0
  81. package/dist/combat/projectiles.d.ts +7 -2
  82. package/dist/combat/projectiles.js +48 -17
  83. package/dist/combat/receivedDamage.d.ts +117 -0
  84. package/dist/combat/receivedDamage.js +92 -0
  85. package/dist/combat/regenShield.d.ts +39 -0
  86. package/dist/combat/regenShield.js +49 -0
  87. package/dist/combat/renderCues.d.ts +51 -0
  88. package/dist/combat/renderCues.js +44 -0
  89. package/dist/combat/resourcePool.d.ts +5 -0
  90. package/dist/combat/resourcePool.js +5 -0
  91. package/dist/combat/rewardAllocation.d.ts +121 -0
  92. package/dist/combat/rewardAllocation.js +251 -0
  93. package/dist/combat/shotOrigin.d.ts +30 -1
  94. package/dist/combat/shotOrigin.js +70 -2
  95. package/dist/combat/statusApplication.d.ts +96 -0
  96. package/dist/combat/statusApplication.js +81 -0
  97. package/dist/combat/telegraph.d.ts +11 -2
  98. package/dist/combat/telegraph.js +11 -2
  99. package/dist/combat/thresholdCrossings.d.ts +85 -0
  100. package/dist/combat/thresholdCrossings.js +116 -0
  101. package/dist/combat.d.ts +34 -0
  102. package/dist/combat.js +34 -0
  103. package/dist/commands/commandRegistry.d.ts +11 -0
  104. package/dist/commands/commandRegistry.js +9 -2
  105. package/dist/crafting/crop.d.ts +18 -0
  106. package/dist/crafting/crop.js +18 -0
  107. package/dist/crafting/production.d.ts +5 -0
  108. package/dist/crafting/production.js +5 -0
  109. package/dist/devtools/rewriteTunables.d.ts +17 -0
  110. package/dist/devtools/rewriteTunables.js +276 -0
  111. package/dist/devtools/saveEndpoint.d.ts +46 -0
  112. package/dist/devtools/saveEndpoint.js +48 -0
  113. package/dist/devtools/transformTunables.d.ts +3 -0
  114. package/dist/devtools/transformTunables.js +3 -0
  115. package/dist/devtools/tunableSchema.d.ts +31 -0
  116. package/dist/devtools/tunableSchema.js +31 -0
  117. package/dist/economy/currency.d.ts +12 -1
  118. package/dist/economy/currency.js +12 -1
  119. package/dist/economy/listingBook.d.ts +91 -0
  120. package/dist/economy/listingBook.js +144 -0
  121. package/dist/economy/resourceLedger.d.ts +222 -0
  122. package/dist/economy/resourceLedger.js +353 -0
  123. package/dist/economy/sharedWallet.d.ts +14 -0
  124. package/dist/economy/sharedWallet.js +14 -0
  125. package/dist/economy/techTree.d.ts +12 -0
  126. package/dist/economy/techTree.js +12 -0
  127. package/dist/economy/wallet.d.ts +26 -2
  128. package/dist/economy/wallet.js +35 -6
  129. package/dist/editor/commands.d.ts +248 -0
  130. package/dist/editor/commands.js +865 -0
  131. package/dist/editor/document.d.ts +186 -0
  132. package/dist/editor/document.js +884 -0
  133. package/dist/editor/grid.d.ts +229 -0
  134. package/dist/editor/grid.js +366 -0
  135. package/dist/editor/gridAdapters.d.ts +80 -0
  136. package/dist/editor/gridAdapters.js +134 -0
  137. package/dist/editor/index.d.ts +97 -0
  138. package/dist/editor/index.js +10 -0
  139. package/dist/editor/liveSync.d.ts +127 -0
  140. package/dist/editor/liveSync.js +249 -0
  141. package/dist/editor/runtimeInspector.d.ts +88 -0
  142. package/dist/editor/runtimeInspector.js +239 -0
  143. package/dist/editor/types.d.ts +175 -0
  144. package/dist/editor/types.js +29 -0
  145. package/dist/faction/reputation.d.ts +5 -0
  146. package/dist/faction/reputation.js +5 -0
  147. package/dist/format/distance.d.ts +17 -0
  148. package/dist/format/distance.js +18 -0
  149. package/dist/format/duration.d.ts +27 -0
  150. package/dist/format/duration.js +45 -0
  151. package/dist/format/speed.d.ts +17 -0
  152. package/dist/format/speed.js +25 -0
  153. package/dist/game/connectedPlayers.d.ts +30 -0
  154. package/dist/game/connectedPlayers.js +21 -0
  155. package/dist/game/cosmetics.d.ts +9 -0
  156. package/dist/game/cosmetics.js +16 -0
  157. package/dist/game/defineGame.d.ts +141 -2
  158. package/dist/game/defineGame.js +39 -1
  159. package/dist/game/defineSystem.d.ts +88 -0
  160. package/dist/game/defineSystem.js +45 -0
  161. package/dist/game/dialogue.d.ts +33 -0
  162. package/dist/game/dialogue.js +21 -0
  163. package/dist/game/events.d.ts +50 -13
  164. package/dist/game/events.js +5 -0
  165. package/dist/game/feed.d.ts +33 -0
  166. package/dist/game/feed.js +35 -2
  167. package/dist/game/gamePhase.d.ts +11 -0
  168. package/dist/game/gamePhase.js +16 -0
  169. package/dist/game/keyValueStore.d.ts +25 -0
  170. package/dist/game/keyValueStore.js +61 -0
  171. package/dist/game/leaderboard.d.ts +5 -0
  172. package/dist/game/leaderboard.js +5 -0
  173. package/dist/game/levelSequence.d.ts +24 -2
  174. package/dist/game/levelSequence.js +51 -2
  175. package/dist/game/loadout.d.ts +5 -0
  176. package/dist/game/loadout.js +5 -0
  177. package/dist/game/lootFilter.d.ts +2 -0
  178. package/dist/game/lootFilter.js +2 -0
  179. package/dist/game/lootPipeline.d.ts +164 -0
  180. package/dist/game/lootPipeline.js +216 -0
  181. package/dist/game/lootTable.d.ts +21 -0
  182. package/dist/game/lootTable.js +15 -4
  183. package/dist/game/modelAnimation.d.ts +8 -0
  184. package/dist/game/modelAnimation.js +18 -0
  185. package/dist/game/objectives.d.ts +43 -0
  186. package/dist/game/objectives.js +36 -0
  187. package/dist/game/paramLayers.d.ts +148 -0
  188. package/dist/game/paramLayers.js +185 -0
  189. package/dist/game/ping.d.ts +5 -0
  190. package/dist/game/ping.js +5 -0
  191. package/dist/game/playableGame.d.ts +160 -12
  192. package/dist/game/quest.d.ts +8 -0
  193. package/dist/game/quest.js +29 -0
  194. package/dist/game/race.d.ts +141 -0
  195. package/dist/game/race.js +169 -0
  196. package/dist/game/recordBook.d.ts +5 -5
  197. package/dist/game/recordBook.js +4 -1
  198. package/dist/game/ruleSelection.d.ts +75 -0
  199. package/dist/game/ruleSelection.js +127 -0
  200. package/dist/game/runDraft.d.ts +5 -0
  201. package/dist/game/runDraft.js +5 -0
  202. package/dist/game/saveStore.d.ts +111 -0
  203. package/dist/game/saveStore.js +312 -0
  204. package/dist/game/snapshotHistory.d.ts +67 -0
  205. package/dist/game/snapshotHistory.js +95 -0
  206. package/dist/game/social.d.ts +38 -1
  207. package/dist/game/social.js +71 -0
  208. package/dist/game/spawnPoints.d.ts +5 -0
  209. package/dist/game/spawnPoints.js +5 -0
  210. package/dist/game/systemRuntime.d.ts +50 -0
  211. package/dist/game/systemRuntime.js +157 -0
  212. package/dist/game/systemSchedule.d.ts +72 -0
  213. package/dist/game/systemSchedule.js +242 -0
  214. package/dist/game/toasts.d.ts +43 -0
  215. package/dist/game/toasts.js +44 -0
  216. package/dist/game/trade.d.ts +10 -0
  217. package/dist/game/trade.js +10 -0
  218. package/dist/game/unlocks.d.ts +8 -0
  219. package/dist/game/unlocks.js +16 -0
  220. package/dist/game/vfxInstance.d.ts +138 -0
  221. package/dist/game/vfxInstance.js +96 -0
  222. package/dist/game/worldItem.d.ts +17 -4
  223. package/dist/game/worldItem.js +17 -4
  224. package/dist/gameplay.d.ts +91 -0
  225. package/dist/gameplay.js +91 -0
  226. package/dist/index.d.ts +5 -7
  227. package/dist/index.js +5 -7
  228. package/dist/input/actionBindings.d.ts +24 -5
  229. package/dist/input/actionBindings.js +23 -5
  230. package/dist/input/axisInput.d.ts +13 -1
  231. package/dist/input/axisInput.js +22 -1
  232. package/dist/input/controlGroups.d.ts +67 -0
  233. package/dist/input/controlGroups.js +41 -0
  234. package/dist/input/touchScheme.d.ts +82 -6
  235. package/dist/input/touchScheme.js +123 -10
  236. package/dist/interaction/contextMenu.d.ts +1 -0
  237. package/dist/interaction/contextMenu.js +1 -0
  238. package/dist/interaction/lockpick.d.ts +61 -0
  239. package/dist/interaction/lockpick.js +168 -0
  240. package/dist/interaction/proximityPrompt.d.ts +5 -1
  241. package/dist/interaction/proximityPrompt.js +5 -3
  242. package/dist/interaction/qte.d.ts +5 -0
  243. package/dist/interaction/qte.js +5 -0
  244. package/dist/interaction/skillCheck.d.ts +5 -0
  245. package/dist/interaction/skillCheck.js +5 -0
  246. package/dist/inventory/inventoryModel.d.ts +12 -0
  247. package/dist/inventory/inventoryModel.js +12 -0
  248. package/dist/inventory/shapedGrid.d.ts +16 -0
  249. package/dist/inventory/shapedGrid.js +16 -0
  250. package/dist/inventory/slotModel.d.ts +10 -0
  251. package/dist/inventory/slotModel.js +10 -0
  252. package/dist/item/durability.d.ts +5 -0
  253. package/dist/item/durability.js +5 -0
  254. package/dist/item/itemIdentity.d.ts +171 -0
  255. package/dist/item/itemIdentity.js +138 -0
  256. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  257. package/dist/item/itemInstanceRegistry.js +34 -0
  258. package/dist/item/itemgen.d.ts +163 -0
  259. package/dist/item/itemgen.js +151 -0
  260. package/dist/item/modularItem.d.ts +5 -0
  261. package/dist/item/modularItem.js +5 -0
  262. package/dist/item/use.d.ts +5 -0
  263. package/dist/item/use.js +5 -0
  264. package/dist/item/useBehavior.d.ts +142 -0
  265. package/dist/item/useBehavior.js +105 -0
  266. package/dist/item/weapon.d.ts +5 -0
  267. package/dist/item/weapon.js +5 -0
  268. package/dist/math/scalar.d.ts +25 -0
  269. package/dist/math/scalar.js +47 -0
  270. package/dist/meta/changelog.d.ts +4 -1
  271. package/dist/meta/changelog.js +36 -1
  272. package/dist/movement/avoidance.d.ts +45 -0
  273. package/dist/movement/avoidance.js +123 -0
  274. package/dist/movement/cameraRig.d.ts +8 -0
  275. package/dist/movement/cameraRig.js +8 -0
  276. package/dist/movement/dash.d.ts +11 -0
  277. package/dist/movement/dash.js +11 -0
  278. package/dist/movement/formation.d.ts +135 -0
  279. package/dist/movement/formation.js +194 -0
  280. package/dist/movement/glideModel.d.ts +5 -0
  281. package/dist/movement/glideModel.js +5 -0
  282. package/dist/movement/grappleSwing.d.ts +5 -0
  283. package/dist/movement/grappleSwing.js +5 -0
  284. package/dist/movement/leaderTrail.d.ts +5 -0
  285. package/dist/movement/leaderTrail.js +5 -0
  286. package/dist/movement/movementModel.d.ts +38 -7
  287. package/dist/movement/movementModel.js +54 -13
  288. package/dist/movement/playerMovement.d.ts +41 -0
  289. package/dist/movement/playerMovement.js +236 -0
  290. package/dist/movement/poseState.d.ts +13 -0
  291. package/dist/movement/poseState.js +16 -0
  292. package/dist/movement/steering.d.ts +8 -0
  293. package/dist/movement/steering.js +18 -0
  294. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  295. package/dist/multiplayer/combatSnapshot.js +3 -0
  296. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  297. package/dist/multiplayer/lagCompensation.js +5 -0
  298. package/dist/multiplayer/presenceModel.d.ts +9 -1
  299. package/dist/multiplayer/presenceModel.js +9 -1
  300. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  301. package/dist/multiplayer/simultaneousCommit.js +3 -0
  302. package/dist/multiplayer.d.ts +11 -0
  303. package/dist/multiplayer.js +11 -0
  304. package/dist/nav/pathFollow.d.ts +57 -0
  305. package/dist/nav/pathFollow.js +109 -0
  306. package/dist/orders/orderKinds.d.ts +156 -0
  307. package/dist/orders/orderKinds.js +197 -0
  308. package/dist/orders/orderQueue.d.ts +208 -0
  309. package/dist/orders/orderQueue.js +211 -0
  310. package/dist/physics/drivableVehicle.d.ts +29 -0
  311. package/dist/physics/drivableVehicle.js +16 -0
  312. package/dist/physics/kinematicVehicle.d.ts +21 -1
  313. package/dist/physics/kinematicVehicle.js +23 -8
  314. package/dist/physics/physicsWorld.d.ts +24 -12
  315. package/dist/physics/physicsWorld.js +11 -5
  316. package/dist/physics/radialImpulse.d.ts +25 -0
  317. package/dist/physics/radialImpulse.js +27 -0
  318. package/dist/procedural.d.ts +3 -0
  319. package/dist/procedural.js +3 -0
  320. package/dist/progression/statGraph.d.ts +116 -0
  321. package/dist/progression/statGraph.js +318 -0
  322. package/dist/puzzle/cellGrid.d.ts +9 -0
  323. package/dist/puzzle/cellGrid.js +9 -0
  324. package/dist/puzzle/fallingPiece.d.ts +9 -0
  325. package/dist/puzzle/fallingPiece.js +9 -0
  326. package/dist/puzzle/nonogram.d.ts +39 -0
  327. package/dist/puzzle/nonogram.js +136 -0
  328. package/dist/random/nameGen.d.ts +5 -0
  329. package/dist/random/nameGen.js +5 -0
  330. package/dist/random/pick.d.ts +8 -0
  331. package/dist/random/pick.js +31 -0
  332. package/dist/random/rng.d.ts +24 -0
  333. package/dist/random/rng.js +30 -8
  334. package/dist/random/seedLink.d.ts +4 -0
  335. package/dist/random/seedLink.js +4 -0
  336. package/dist/relation/keyedValues.d.ts +54 -0
  337. package/dist/relation/keyedValues.js +115 -0
  338. package/dist/relation/thresholds.d.ts +62 -0
  339. package/dist/relation/thresholds.js +62 -0
  340. package/dist/render/color.d.ts +12 -0
  341. package/dist/render/color.js +26 -0
  342. package/dist/render/lookPreset.d.ts +41 -0
  343. package/dist/render/lookPreset.js +29 -0
  344. package/dist/render/postProcessing.d.ts +76 -0
  345. package/dist/render/postProcessing.js +21 -0
  346. package/dist/rules/predicate.d.ts +53 -0
  347. package/dist/rules/predicate.js +64 -0
  348. package/dist/rules/ruleEffects.d.ts +38 -0
  349. package/dist/rules/ruleEffects.js +37 -0
  350. package/dist/rules/triggeredRules.d.ts +160 -0
  351. package/dist/rules/triggeredRules.js +241 -0
  352. package/dist/runtime/adapter.d.ts +58 -0
  353. package/dist/runtime/adapter.js +54 -5
  354. package/dist/runtime/cameraDirector.d.ts +1 -0
  355. package/dist/runtime/cameraDirector.js +1 -0
  356. package/dist/runtime/commandRunner.d.ts +1 -0
  357. package/dist/runtime/commandRunner.js +1 -0
  358. package/dist/runtime/context/combatFx.d.ts +23 -0
  359. package/dist/runtime/context/combatFx.js +161 -0
  360. package/dist/runtime/context/registries.d.ts +13 -0
  361. package/dist/runtime/context/registries.js +84 -0
  362. package/dist/runtime/context/worldItems.d.ts +21 -0
  363. package/dist/runtime/context/worldItems.js +37 -0
  364. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  365. package/dist/runtime/descriptors/baseline.js +134 -0
  366. package/dist/runtime/descriptors/features.d.ts +74 -0
  367. package/dist/runtime/descriptors/features.js +281 -0
  368. package/dist/runtime/gameContext.d.ts +163 -19
  369. package/dist/runtime/gameContext.js +385 -339
  370. package/dist/runtime/gameRuntime.d.ts +1 -0
  371. package/dist/runtime/gameRuntime.js +1 -0
  372. package/dist/runtime/headlessRunner.d.ts +60 -0
  373. package/dist/runtime/headlessRunner.js +44 -0
  374. package/dist/runtime/hostPersistence.d.ts +12 -0
  375. package/dist/runtime/hostPersistence.js +12 -0
  376. package/dist/runtime/hostedGameRunner.d.ts +54 -0
  377. package/dist/runtime/hostedGameRunner.js +85 -0
  378. package/dist/runtime/hostedWorldSession.d.ts +73 -0
  379. package/dist/runtime/hostedWorldSession.js +64 -0
  380. package/dist/runtime/inputSnapshot.d.ts +21 -3
  381. package/dist/runtime/inputSnapshot.js +8 -2
  382. package/dist/runtime/motionIntents.d.ts +12 -1
  383. package/dist/runtime/motionIntents.js +26 -1
  384. package/dist/runtime/perContext.d.ts +15 -0
  385. package/dist/runtime/perContext.js +21 -0
  386. package/dist/runtime/runtimeSave.d.ts +79 -0
  387. package/dist/runtime/runtimeSave.js +105 -0
  388. package/dist/runtime/save.d.ts +4 -0
  389. package/dist/runtime/save.js +4 -0
  390. package/dist/runtime/snapshot.d.ts +7 -0
  391. package/dist/runtime/snapshot.js +7 -0
  392. package/dist/runtime/visibility.d.ts +2 -1
  393. package/dist/runtime/visibility.js +2 -1
  394. package/dist/runtime/worldChannel.d.ts +62 -0
  395. package/dist/runtime/worldChannel.js +114 -0
  396. package/dist/runtime/worldMirror.d.ts +36 -0
  397. package/dist/runtime/worldMirror.js +44 -0
  398. package/dist/runtime/worldProjection.d.ts +47 -0
  399. package/dist/runtime/worldProjection.js +52 -0
  400. package/dist/runtime/worldReplication.d.ts +69 -0
  401. package/dist/runtime/worldReplication.js +217 -0
  402. package/dist/runtime/worldSnapshot.d.ts +44 -0
  403. package/dist/runtime/worldSnapshot.js +30 -0
  404. package/dist/scene/assetCatalog.d.ts +22 -0
  405. package/dist/scene/assetCatalog.js +4 -0
  406. package/dist/scene/assetDiagnostics.d.ts +69 -0
  407. package/dist/scene/assetDiagnostics.js +110 -0
  408. package/dist/scene/assetGenerator.d.ts +65 -0
  409. package/dist/scene/assetGenerator.js +64 -0
  410. package/dist/scene/assetSpace.d.ts +137 -0
  411. package/dist/scene/assetSpace.js +259 -0
  412. package/dist/scene/authoredTriggers.d.ts +169 -0
  413. package/dist/scene/authoredTriggers.js +340 -0
  414. package/dist/scene/behaviorRuntime.d.ts +75 -0
  415. package/dist/scene/behaviorRuntime.js +217 -0
  416. package/dist/scene/behaviors.d.ts +14 -2
  417. package/dist/scene/behaviors.js +7 -2
  418. package/dist/scene/bodyBind.d.ts +60 -0
  419. package/dist/scene/bodyBind.js +51 -0
  420. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  421. package/dist/scene/builtinSceneKinds.js +62 -0
  422. package/dist/scene/colliders.d.ts +18 -0
  423. package/dist/scene/colliders.js +61 -1
  424. package/dist/scene/entityStats.d.ts +13 -0
  425. package/dist/scene/entityStats.js +30 -0
  426. package/dist/scene/entityStore.d.ts +41 -1
  427. package/dist/scene/entityStore.js +75 -0
  428. package/dist/scene/facing.d.ts +18 -0
  429. package/dist/scene/facing.js +26 -0
  430. package/dist/scene/modelSockets.d.ts +33 -0
  431. package/dist/scene/modelSockets.js +29 -0
  432. package/dist/scene/objectQuery.d.ts +2 -0
  433. package/dist/scene/objectQuery.js +2 -0
  434. package/dist/scene/objectStore.d.ts +4 -0
  435. package/dist/scene/objectStore.js +6 -0
  436. package/dist/scene/possession.d.ts +8 -0
  437. package/dist/scene/possession.js +14 -0
  438. package/dist/scene/roster.d.ts +3 -0
  439. package/dist/scene/roster.js +12 -0
  440. package/dist/scene/sceneKinds.d.ts +240 -0
  441. package/dist/scene/sceneKinds.js +214 -0
  442. package/dist/scene/sceneOwnership.d.ts +169 -0
  443. package/dist/scene/sceneOwnership.js +179 -0
  444. package/dist/scene/selectionBookmarks.d.ts +93 -0
  445. package/dist/scene/selectionBookmarks.js +122 -0
  446. package/dist/scene/vehicleSeat.d.ts +68 -0
  447. package/dist/scene/vehicleSeat.js +59 -0
  448. package/dist/sensor/concealment.d.ts +3 -0
  449. package/dist/sensor/concealment.js +3 -0
  450. package/dist/sensor/freezeMonitor.d.ts +1 -0
  451. package/dist/sensor/freezeMonitor.js +1 -0
  452. package/dist/sensor/frustumSensor.d.ts +7 -3
  453. package/dist/sensor/frustumSensor.js +7 -3
  454. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  455. package/dist/sensor/hiddenStateProbe.js +5 -2
  456. package/dist/sensor/recordingBuffer.d.ts +2 -1
  457. package/dist/sensor/recordingBuffer.js +2 -1
  458. package/dist/sensor/replayLoop.d.ts +6 -2
  459. package/dist/sensor/replayLoop.js +6 -2
  460. package/dist/sensor/revealQuery.d.ts +2 -1
  461. package/dist/sensor/revealQuery.js +2 -1
  462. package/dist/sensor/visionCone.d.ts +10 -3
  463. package/dist/sensor/visionCone.js +10 -3
  464. package/dist/session/contestedChannel.d.ts +1 -0
  465. package/dist/session/contestedChannel.js +1 -0
  466. package/dist/session/extraction.d.ts +1 -0
  467. package/dist/session/extraction.js +1 -0
  468. package/dist/session/roles.d.ts +6 -0
  469. package/dist/session/roles.js +6 -0
  470. package/dist/session/roundState.d.ts +8 -0
  471. package/dist/session/roundState.js +2 -0
  472. package/dist/settings/settingsModel.d.ts +1 -0
  473. package/dist/settings/settingsModel.js +1 -0
  474. package/dist/stats/accumulatorMeter.d.ts +6 -0
  475. package/dist/stats/accumulatorMeter.js +6 -0
  476. package/dist/stats/eventMeter.d.ts +5 -0
  477. package/dist/stats/eventMeter.js +5 -0
  478. package/dist/stats/rollCheck.d.ts +5 -0
  479. package/dist/stats/rollCheck.js +5 -0
  480. package/dist/stats/statModifiers.d.ts +5 -0
  481. package/dist/stats/statModifiers.js +5 -0
  482. package/dist/store/defineKeyedStore.d.ts +38 -0
  483. package/dist/store/defineKeyedStore.js +42 -0
  484. package/dist/store/defineStore.d.ts +33 -0
  485. package/dist/store/defineStore.js +35 -0
  486. package/dist/store/observableKeyedStore.d.ts +9 -0
  487. package/dist/store/observableKeyedStore.js +43 -2
  488. package/dist/survival/decayMeter.d.ts +55 -0
  489. package/dist/survival/decayMeter.js +130 -55
  490. package/dist/survival/moodle.d.ts +2 -0
  491. package/dist/survival/regionHealth.d.ts +6 -0
  492. package/dist/survival/regionHealth.js +5 -0
  493. package/dist/tactics/fallingGrid.d.ts +6 -4
  494. package/dist/tactics/fallingGrid.js +6 -4
  495. package/dist/tactics/predictiveQuery.d.ts +3 -0
  496. package/dist/tactics/predictiveQuery.js +3 -0
  497. package/dist/tactics/snapshot.d.ts +2 -0
  498. package/dist/tactics/snapshot.js +2 -0
  499. package/dist/tactics/surface.d.ts +1 -0
  500. package/dist/tactics/surface.js +1 -0
  501. package/dist/tactics/tacticalGrid.d.ts +1 -0
  502. package/dist/tactics/tacticalGrid.js +1 -0
  503. package/dist/time/beatClock.d.ts +14 -4
  504. package/dist/time/beatClock.js +14 -4
  505. package/dist/time/calendarClock.d.ts +3 -0
  506. package/dist/time/calendarClock.js +3 -0
  507. package/dist/time/idleProgress.d.ts +4 -0
  508. package/dist/time/idleProgress.js +4 -0
  509. package/dist/time/simClock.d.ts +2 -0
  510. package/dist/time/simClock.js +20 -5
  511. package/dist/ui/actionModel.d.ts +110 -0
  512. package/dist/ui/actionModel.js +159 -0
  513. package/dist/ui/gameLayout.d.ts +144 -0
  514. package/dist/ui/gameLayout.js +148 -0
  515. package/dist/ui/hudDocument.d.ts +114 -0
  516. package/dist/ui/hudDocument.js +220 -0
  517. package/dist/ui/hudLayout.d.ts +33 -1
  518. package/dist/ui/hudLayout.js +204 -17
  519. package/dist/ui/orientation.d.ts +39 -0
  520. package/dist/ui/orientation.js +49 -0
  521. package/dist/ui/selectionModel.d.ts +92 -0
  522. package/dist/ui/selectionModel.js +88 -0
  523. package/dist/ui/swingTimer.d.ts +42 -0
  524. package/dist/ui/swingTimer.js +38 -0
  525. package/dist/ui/tooltipModel.d.ts +63 -0
  526. package/dist/ui/tooltipModel.js +82 -0
  527. package/dist/ui.d.ts +15 -0
  528. package/dist/ui.js +15 -0
  529. package/dist/visibility/bounds.d.ts +8 -1
  530. package/dist/visibility/bounds.js +8 -1
  531. package/dist/visibility/frustum.d.ts +12 -3
  532. package/dist/visibility/frustum.js +12 -3
  533. package/dist/visibility/spatialIndex.js +34 -20
  534. package/dist/work/jobQueue.d.ts +201 -0
  535. package/dist/work/jobQueue.js +253 -0
  536. package/dist/work/unitTraining.d.ts +58 -0
  537. package/dist/work/unitTraining.js +52 -0
  538. package/dist/world/authoredObjects.d.ts +58 -0
  539. package/dist/world/authoredObjects.js +69 -0
  540. package/dist/world/buildingGenerator.d.ts +18 -0
  541. package/dist/world/buildingGenerator.js +62 -0
  542. package/dist/world/buildings.d.ts +5 -0
  543. package/dist/world/buildings.js +5 -0
  544. package/dist/world/catenary.d.ts +22 -0
  545. package/dist/world/catenary.js +69 -0
  546. package/dist/world/environmentSummary.d.ts +11 -2
  547. package/dist/world/environmentSummary.js +11 -1
  548. package/dist/world/features.d.ts +244 -7
  549. package/dist/world/features.js +92 -4
  550. package/dist/world/footprintGrid.d.ts +59 -0
  551. package/dist/world/footprintGrid.js +141 -0
  552. package/dist/world/geometry.d.ts +64 -0
  553. package/dist/world/geometry.js +94 -0
  554. package/dist/world/grassKind.d.ts +51 -0
  555. package/dist/world/grassKind.js +101 -0
  556. package/dist/world/pathInstances.d.ts +27 -0
  557. package/dist/world/pathInstances.js +27 -0
  558. package/dist/world/pathTerrain.d.ts +80 -0
  559. package/dist/world/pathTerrain.js +142 -0
  560. package/dist/world/placeAsset.d.ts +81 -0
  561. package/dist/world/placeAsset.js +77 -0
  562. package/dist/world/placement.d.ts +4 -0
  563. package/dist/world/placement.js +4 -0
  564. package/dist/world/placementController.d.ts +6 -0
  565. package/dist/world/placementController.js +6 -0
  566. package/dist/world/polyline.d.ts +34 -0
  567. package/dist/world/polyline.js +81 -0
  568. package/dist/world/roads.d.ts +55 -0
  569. package/dist/world/roads.js +184 -0
  570. package/dist/world/scatterRegion.d.ts +164 -0
  571. package/dist/world/scatterRegion.js +409 -0
  572. package/dist/world/sceneShapes.d.ts +43 -0
  573. package/dist/world/sceneShapes.js +1 -0
  574. package/dist/world/segment.d.ts +27 -0
  575. package/dist/world/segment.js +43 -0
  576. package/dist/world/soilKind.d.ts +48 -0
  577. package/dist/world/soilKind.js +92 -0
  578. package/dist/world/spatialSample.d.ts +241 -0
  579. package/dist/world/spatialSample.js +465 -0
  580. package/dist/world/streets.d.ts +80 -0
  581. package/dist/world/streets.js +144 -0
  582. package/dist/world/terraform.d.ts +213 -1
  583. package/dist/world/terraform.js +655 -20
  584. package/dist/world/terrain.d.ts +138 -12
  585. package/dist/world/terrain.js +346 -28
  586. package/dist/world/terrainGuides.d.ts +182 -0
  587. package/dist/world/terrainGuides.js +343 -0
  588. package/dist/world/vec2.d.ts +81 -0
  589. package/dist/world/vec2.js +128 -0
  590. package/dist/world/vec3.d.ts +49 -0
  591. package/dist/world/vec3.js +76 -0
  592. package/dist/world/vegetation.d.ts +71 -0
  593. package/dist/world/vegetation.js +151 -0
  594. package/dist/world/visibilityField.d.ts +154 -0
  595. package/dist/world/visibilityField.js +271 -0
  596. package/dist/world/volumetricClouds.d.ts +52 -0
  597. package/dist/world/volumetricClouds.js +43 -0
  598. package/dist/world/walls.d.ts +9 -0
  599. package/dist/world/walls.js +9 -0
  600. package/dist/world/waterKind.d.ts +55 -0
  601. package/dist/world/waterKind.js +99 -0
  602. package/dist/world.d.ts +132 -0
  603. package/dist/world.js +132 -0
  604. package/package.json +32 -8
  605. package/skills/jgengine/SKILL.md +51 -0
  606. package/skills/jgengine/api.md +434 -0
  607. package/skills/jgengine/capabilities.md +29 -0
  608. package/skills/jgengine/reference-cartridge.md +72 -0
  609. package/skills/jgengine-combat/SKILL.md +34 -0
  610. package/skills/jgengine-combat/api.md +549 -0
  611. package/skills/jgengine-combat/capabilities.md +169 -0
  612. package/skills/jgengine-combat/reference.md +98 -0
  613. package/skills/jgengine-gameplay/SKILL.md +39 -0
  614. package/skills/jgengine-gameplay/api.md +1794 -0
  615. package/skills/jgengine-gameplay/capabilities.md +378 -0
  616. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  617. package/skills/jgengine-world/SKILL.md +38 -0
  618. package/skills/jgengine-world/api.md +2652 -0
  619. package/skills/jgengine-world/capabilities.md +370 -0
  620. package/skills/jgengine-world/reference.md +222 -0
  621. package/dist/cartridge/runtime.d.ts +0 -15
  622. package/dist/cartridge/runtime.js +0 -556
  623. package/dist/cartridge/spec.d.ts +0 -188
  624. package/dist/cartridge/spec.js +0 -19
  625. package/dist/cartridge/validate.d.ts +0 -2
  626. package/dist/cartridge/validate.js +0 -78
  627. package/dist/store/engineStore.d.ts +0 -22
  628. package/dist/store/engineStore.js +0 -50
  629. package/dist/store/features.d.ts +0 -10
  630. package/dist/store/features.js +0 -23
  631. package/llms.txt +0 -4983
@@ -0,0 +1,236 @@
1
+ import { applyHorizontalImpulses, applyMotionImpulses } from "../runtime/motionIntents.js";
2
+ import { groundFieldFor, hasEnvironmentTerrain, sampleSlope } from "../world/terrain.js";
3
+ import { advancePlayerMotion, constrainStepToAxis, createEmptyMovementKeys, createPlayerMotionState, nearbyObstacles, resolveMovementIntent, resolveObstacleStep, snapPositionToGrid, } from "./movementModel.js";
4
+ import { approachYaw, steerYaw } from "./steering.js";
5
+ import { advanceVoxelPlayer, createVoxelPlayerBody, } from "./voxelController.js";
6
+ const DEFAULT_TURN_SPEED = 2.4;
7
+ const DEFAULT_WALK_SPEED = 2;
8
+ const DEFAULT_SWIM_SPEED_MULTIPLIER = 0.65;
9
+ /** Minimum ground-normal `y` the player can stand on before slope-slide kicks in — cos(50°) ≈ 0.643. */
10
+ const DEFAULT_MAX_CLIMB_NORMAL_Y = Math.cos((50 * Math.PI) / 180);
11
+ /** Downhill slide speed (units/s) per unit of slope steepness while on too-steep ground. */
12
+ const SLOPE_SLIDE_SPEED = 4;
13
+ /**
14
+ * Maps a game's declared `physics` onto the movement controllers' tuning. `PhysicsConfig.gravity` is a signed
15
+ * world acceleration (negative points down), but the controllers integrate `velocityY -= gravityAcceleration * dt`
16
+ * and expect a positive downward magnitude — so gravity is negated here to keep down-pointing gravity pulling down.
17
+ */
18
+ export function resolvePhysicsTuning(physics) {
19
+ if (physics === undefined)
20
+ return undefined;
21
+ return {
22
+ get gravityAcceleration() {
23
+ return physics.gravity === undefined ? undefined : -physics.gravity;
24
+ },
25
+ get jumpVelocity() {
26
+ return physics.jumpVelocity;
27
+ },
28
+ };
29
+ }
30
+ /** Gather a game's collision/movement/physics/world config into a {@link PlayerMovementTuning} — call once per world; both the shell and a host pass the result to {@link stepPlayerMovement}. */
31
+ export function resolvePlayerMovementTuning(opts) {
32
+ const physics = resolvePhysicsTuning(opts.physics);
33
+ const backpedal = opts.movement?.backpedalMult;
34
+ const overrides = backpedal === undefined ? physics : { ...(physics ?? {}), backpedalSpeedMultiplier: backpedal };
35
+ return {
36
+ ...(opts.collision === undefined ? {} : { collision: opts.collision }),
37
+ ...(opts.movement === undefined ? {} : { movement: opts.movement }),
38
+ ...(overrides === undefined ? {} : { physics: overrides }),
39
+ ground: groundFieldFor(opts.world),
40
+ hasTerrain: hasEnvironmentTerrain(opts.world),
41
+ };
42
+ }
43
+ const stores = new WeakMap();
44
+ function storeFor(ctx) {
45
+ let store = stores.get(ctx);
46
+ if (store === undefined) {
47
+ store = { players: new Map(), solids: { count: -1, set: new Set() } };
48
+ stores.set(ctx, store);
49
+ }
50
+ return store;
51
+ }
52
+ function stateFor(store, userId) {
53
+ let state = store.players.get(userId);
54
+ if (state === undefined) {
55
+ state = { heading: 0, facing: null, voxelBody: null, motion: null };
56
+ store.players.set(userId, state);
57
+ }
58
+ return state;
59
+ }
60
+ /** One player's current heading (radians), integrated by {@link stepPlayerMovement} — the shell reads it back into its camera/aim yaw. */
61
+ export function playerMovementHeading(ctx, userId) {
62
+ return stores.get(ctx)?.players.get(userId)?.heading ?? 0;
63
+ }
64
+ /** Drop a player's retained movement state (heading + kinematic body) — call on leave so a rejoin starts fresh instead of resuming stale velocity. */
65
+ export function forgetPlayerMovement(ctx, userId) {
66
+ stores.get(ctx)?.players.delete(userId);
67
+ }
68
+ /**
69
+ * Rendered body yaw to commit this frame. With `turnSpeed` unset the body snaps
70
+ * to its movement heading exactly as before (no opt-in, no behavior change); with
71
+ * `turnSpeed` set it rotates toward that heading at `turnSpeed` rad/s along the
72
+ * shortest arc, so strafing and backpedalling read as a turning body rather than
73
+ * an instant flip. Retained per player so the smoothing is continuous across frames.
74
+ */
75
+ function resolveBodyFacing(state, moving, velocityX, velocityZ, fallbackYaw, turnSpeed, dt) {
76
+ if (turnSpeed === undefined) {
77
+ const snapped = moving ? Math.atan2(velocityX, velocityZ) : fallbackYaw;
78
+ state.facing = snapped;
79
+ return snapped;
80
+ }
81
+ const from = state.facing ?? fallbackYaw;
82
+ const target = moving ? Math.atan2(velocityX, velocityZ) : from;
83
+ const next = approachYaw(from, target, turnSpeed, dt);
84
+ state.facing = next;
85
+ return next;
86
+ }
87
+ /**
88
+ * Integrate one player's movement for a tick from their held-input frame and commit the pose — the single
89
+ * genre-agnostic controller both the shell (its local player) and a host (each connected player in `onTick`) call,
90
+ * so single-player and server-authoritative movement are identical. Reads the player's controlled entity, terrain,
91
+ * scene solids, and pending motion impulses; writes the entity pose via `setPose`. Retains heading + kinematic body
92
+ * per `userId` on the `ctx`. Pass `heading` to override the internally-integrated yaw (the shell owns yaw for its
93
+ * camera); omit it and the controller turns from the frame's `turnLeft`/`turnRight` actions.
94
+ */
95
+ export function stepPlayerMovement(ctx, userId, input, dt, tuning, heading) {
96
+ const playerId = ctx.player.possession.active(userId);
97
+ const player = ctx.scene.entity.get(playerId);
98
+ if (player === null)
99
+ return;
100
+ const store = storeFor(ctx);
101
+ const state = stateFor(store, userId);
102
+ const held = new Set(input.held);
103
+ const isDown = (action) => held.has(action);
104
+ if (heading !== undefined) {
105
+ state.heading = heading;
106
+ }
107
+ else {
108
+ const turnInput = (isDown("turnRight") ? 1 : 0) - (isDown("turnLeft") ? 1 : 0);
109
+ const turnSpeed = tuning.movement?.turnSpeed ?? DEFAULT_TURN_SPEED;
110
+ if (turnInput !== 0)
111
+ state.heading = steerYaw(state.heading, turnInput, turnSpeed, dt);
112
+ }
113
+ const forwardX = Math.sin(state.heading);
114
+ const forwardZ = Math.cos(state.heading);
115
+ const keys = createEmptyMovementKeys();
116
+ keys.w = isDown("moveForward");
117
+ keys.s = isDown("moveBack");
118
+ keys.a = isDown("moveLeft");
119
+ keys.d = isDown("moveRight");
120
+ keys.shift = isDown("sprint") && (tuning.movement?.canSprint?.(ctx) ?? true);
121
+ keys.space = isDown("jump");
122
+ const intent = resolveMovementIntent(keys, true);
123
+ const motionBatch = ctx.player.motionFor(userId).takePending();
124
+ const walkSpeed = player.movement?.walkSpeed ?? DEFAULT_WALK_SPEED;
125
+ if (tuning.collision?.voxel === true) {
126
+ let body = state.voxelBody;
127
+ if (body === null) {
128
+ body = createVoxelPlayerBody(player.position[0], player.position[1], player.position[2]);
129
+ state.voxelBody = body;
130
+ }
131
+ const objects = ctx.scene.object.list();
132
+ if (store.solids.count !== objects.length) {
133
+ store.solids.set = new Set(objects.map((o) => `${o.position[0]},${o.position[1]},${o.position[2]}`));
134
+ store.solids.count = objects.length;
135
+ }
136
+ const solids = store.solids.set;
137
+ const isSolid = (x, y, z) => solids.has(`${x},${y},${z}`);
138
+ const dims = {
139
+ halfWidth: tuning.collision.halfWidth ?? 0.3,
140
+ height: tuning.collision.height ?? 1.8,
141
+ stepHeight: tuning.collision.stepHeight ?? 0.6,
142
+ };
143
+ body.velocityY = applyMotionImpulses(body.velocityY, motionBatch);
144
+ [body.velocityX, body.velocityZ] = applyHorizontalImpulses(body.velocityX, body.velocityZ, motionBatch);
145
+ advanceVoxelPlayer(body, intent, forwardX, forwardZ, walkSpeed, dt, isSolid, dims, tuning.physics, tuning.hasTerrain ? (x, z) => tuning.ground.sampleHeight(x, z) : undefined);
146
+ if (motionBatch !== null && motionBatch.y !== null)
147
+ body.y = motionBatch.y;
148
+ ctx.scene.entity.setPose(playerId, {
149
+ position: [body.x, body.y, body.z],
150
+ rotationY: resolveBodyFacing(state, intent.moving, body.velocityX, body.velocityZ, player.rotationY, tuning.movement?.turnSpeed, dt),
151
+ dt,
152
+ });
153
+ return;
154
+ }
155
+ let motion = state.motion;
156
+ if (motion === null) {
157
+ motion = createPlayerMotionState();
158
+ state.motion = motion;
159
+ }
160
+ motion.verticalVelocity = applyMotionImpulses(motion.verticalVelocity, motionBatch);
161
+ [motion.horizontalVelocityX, motion.horizontalVelocityZ] = applyHorizontalImpulses(motion.horizontalVelocityX, motion.horizontalVelocityZ, motionBatch);
162
+ const swimCfg = tuning.movement?.swim;
163
+ const swimEnabled = swimCfg === true || (typeof swimCfg === "object" && swimCfg !== null);
164
+ const swimSpeedMultiplier = typeof swimCfg === "object" && swimCfg !== null
165
+ ? swimCfg.speedMultiplier ?? DEFAULT_SWIM_SPEED_MULTIPLIER
166
+ : DEFAULT_SWIM_SPEED_MULTIPLIER;
167
+ const waterLevel = tuning.ground.waterLevel;
168
+ const submerged = swimEnabled &&
169
+ waterLevel !== undefined &&
170
+ tuning.ground.sampleHeight(player.position[0], player.position[2]) < waterLevel;
171
+ const motionOptions = submerged
172
+ ? { speedScale: swimSpeedMultiplier, floating: true }
173
+ : undefined;
174
+ const step = advancePlayerMotion(motion, intent, forwardX, forwardZ, walkSpeed, dt, tuning.physics, motionOptions);
175
+ let stepX = step.stepX;
176
+ let stepZ = step.stepZ;
177
+ if (tuning.movement?.mode === "axis") {
178
+ const constrained = constrainStepToAxis(stepX, stepZ, tuning.movement.axis ?? "x");
179
+ stepX = constrained.stepX;
180
+ stepZ = constrained.stepZ;
181
+ }
182
+ if (tuning.movement?.collideObjects === true) {
183
+ const obstacles = nearbyObstacles(ctx.scene.object.list(), player.position);
184
+ const resolved = resolveObstacleStep(player.position, stepX, stepZ, obstacles);
185
+ stepX = resolved.stepX;
186
+ stepZ = resolved.stepZ;
187
+ }
188
+ let nextX = player.position[0] + stepX;
189
+ let nextZ = player.position[2] + stepZ;
190
+ if (tuning.movement?.mode === "grid") {
191
+ const snapped = snapPositionToGrid(nextX, nextZ, tuning.movement.cellSize ?? 1);
192
+ nextX = snapped[0];
193
+ nextZ = snapped[1];
194
+ }
195
+ const slideCfg = tuning.movement?.slopeSlide;
196
+ if (slideCfg === true || (typeof slideCfg === "object" && slideCfg !== null)) {
197
+ const maxClimbNormalY = typeof slideCfg === "object" && slideCfg.maxClimbSlope !== undefined
198
+ ? slideCfg.maxClimbSlope
199
+ : DEFAULT_MAX_CLIMB_NORMAL_Y;
200
+ if (tuning.ground.sampleNormal(nextX, nextZ)[1] < maxClimbNormalY) {
201
+ const slope = sampleSlope(tuning.ground, nextX, nextZ);
202
+ const slide = SLOPE_SLIDE_SPEED * slope.steepness * dt;
203
+ nextX += slope.downhill[0] * slide;
204
+ nextZ += slope.downhill[1] * slide;
205
+ }
206
+ }
207
+ const groundAtNext = tuning.ground.sampleHeight(nextX, nextZ);
208
+ let nextY = groundAtNext + motion.jumpOffset;
209
+ if (motionBatch !== null && motionBatch.y !== null) {
210
+ nextY = motionBatch.y;
211
+ motion.jumpOffset = motionBatch.y - groundAtNext;
212
+ }
213
+ else if (swimEnabled && waterLevel !== undefined && groundAtNext < waterLevel) {
214
+ nextY = waterLevel;
215
+ }
216
+ if (tuning.movement?.beforeCommit !== undefined) {
217
+ const frame = {
218
+ entityId: playerId,
219
+ current: player.position,
220
+ next: [nextX, nextY, nextZ],
221
+ dt,
222
+ ctx,
223
+ };
224
+ const replacement = tuning.movement.beforeCommit(frame);
225
+ if (replacement !== undefined) {
226
+ nextX = replacement[0];
227
+ nextY = replacement[1];
228
+ nextZ = replacement[2];
229
+ }
230
+ }
231
+ ctx.scene.entity.setPose(playerId, {
232
+ position: [nextX, nextY, nextZ],
233
+ rotationY: resolveBodyFacing(state, intent.moving, motion.horizontalVelocityX, motion.horizontalVelocityZ, player.rotationY, tuning.movement?.turnSpeed, dt),
234
+ dt,
235
+ });
236
+ }
@@ -13,11 +13,24 @@ export interface PoseAllowedStates {
13
13
  export interface PoseRejection {
14
14
  reason: string;
15
15
  }
16
+ export interface PoseSnapshot {
17
+ poses: Record<string, MovementPose>;
18
+ aims: Record<string, AimMode>;
19
+ }
16
20
  export interface PoseState {
17
21
  getPose(instanceId: string): MovementPose;
18
22
  setPose(instanceId: string, pose: MovementPose): PoseRejection | null;
19
23
  getAim(instanceId: string): AimMode;
20
24
  setAim(instanceId: string, mode: AimMode): PoseRejection | null;
21
25
  clear(instanceId: string): void;
26
+ /** Snapshot every entity's pose and aim for a whole-world save. */
27
+ snapshotAll(): PoseSnapshot;
28
+ /** Restore every entity's pose and aim from a {@link snapshotAll} payload. */
29
+ hydrateAll(state: PoseSnapshot): void;
22
30
  }
31
+ /**
32
+ * Stance/pose transitions — stand, crouch, prone — that change the hitbox and movement.
33
+ *
34
+ * @capability crouch-prone stance/pose transitions that change the hitbox
35
+ */
23
36
  export declare function createPoseState(resolveAllowed: (instanceId: string) => PoseAllowedStates | null | undefined): PoseState;
@@ -23,6 +23,11 @@ export const POSE_HITBOX = {
23
23
  speedMultiplier: MOVEMENT_TUNING.runSpeedMultiplier,
24
24
  },
25
25
  };
26
+ /**
27
+ * Stance/pose transitions — stand, crouch, prone — that change the hitbox and movement.
28
+ *
29
+ * @capability crouch-prone stance/pose transitions that change the hitbox
30
+ */
26
31
  export function createPoseState(resolveAllowed) {
27
32
  const poses = new Map();
28
33
  const aims = new Map();
@@ -57,5 +62,16 @@ export function createPoseState(resolveAllowed) {
57
62
  poses.delete(instanceId);
58
63
  aims.delete(instanceId);
59
64
  },
65
+ snapshotAll() {
66
+ return { poses: Object.fromEntries(poses), aims: Object.fromEntries(aims) };
67
+ },
68
+ hydrateAll(state) {
69
+ poses.clear();
70
+ for (const [id, pose] of Object.entries(state.poses))
71
+ poses.set(id, pose);
72
+ aims.clear();
73
+ for (const [id, aim] of Object.entries(state.aims))
74
+ aims.set(id, aim);
75
+ },
60
76
  };
61
77
  }
@@ -25,3 +25,11 @@ export declare function steerYaw(yaw: number, steerRight: number, turnRatePerSec
25
25
  * it into [-1, 1] at the call site.
26
26
  */
27
27
  export declare function steerToward(yaw: number, desiredYaw: number): number;
28
+ /**
29
+ * @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
30
+ * radians, always along the shortest arc, snapping exactly onto the target once
31
+ * within a single step so it converges without overshoot or jitter — the
32
+ * smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
33
+ * large enough rate (or `dt`) reaches the target in one call, matching a snap.
34
+ */
35
+ export declare function approachYaw(yaw: number, targetYaw: number, turnRatePerSecond: number, dt: number): number;
@@ -37,4 +37,22 @@ export function steerToward(yaw, desiredYaw) {
37
37
  delta += TWO_PI;
38
38
  return -delta;
39
39
  }
40
+ /**
41
+ * @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
42
+ * radians, always along the shortest arc, snapping exactly onto the target once
43
+ * within a single step so it converges without overshoot or jitter — the
44
+ * smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
45
+ * large enough rate (or `dt`) reaches the target in one call, matching a snap.
46
+ */
47
+ export function approachYaw(yaw, targetYaw, turnRatePerSecond, dt) {
48
+ let delta = (targetYaw - yaw) % TWO_PI;
49
+ if (delta > Math.PI)
50
+ delta -= TWO_PI;
51
+ if (delta <= -Math.PI)
52
+ delta += TWO_PI;
53
+ const maxStep = turnRatePerSecond * dt;
54
+ if (maxStep <= 0 || Math.abs(delta) <= maxStep)
55
+ return targetYaw;
56
+ return yaw + Math.sign(delta) * maxStep;
57
+ }
40
58
  const TWO_PI = Math.PI * 2;
@@ -16,7 +16,9 @@ export interface SerializeBoardArgs {
16
16
  seed?: number;
17
17
  capturedAt?: number;
18
18
  }
19
+ /** @internal */
19
20
  export declare function serializeBoard(args: SerializeBoardArgs): BoardSnapshot;
21
+ /** @internal */
20
22
  export declare function cloneSnapshot(snapshot: BoardSnapshot): BoardSnapshot;
21
23
  export interface CombatRules {
22
24
  attackStat: string;
@@ -42,4 +44,5 @@ export interface ReplayResult {
42
44
  survivorsA: readonly string[];
43
45
  survivorsB: readonly string[];
44
46
  }
47
+ /** @internal */
45
48
  export declare function replayCombat(a: BoardSnapshot, b: BoardSnapshot, rules: CombatRules): ReplayResult;
@@ -1,6 +1,7 @@
1
1
  function cloneStats(stats) {
2
2
  return { ...stats };
3
3
  }
4
+ /** @internal */
4
5
  export function serializeBoard(args) {
5
6
  return {
6
7
  ownerId: args.ownerId,
@@ -10,6 +11,7 @@ export function serializeBoard(args) {
10
11
  capturedAt: args.capturedAt ?? 0,
11
12
  };
12
13
  }
14
+ /** @internal */
13
15
  export function cloneSnapshot(snapshot) {
14
16
  return serializeBoard({
15
17
  ownerId: snapshot.ownerId,
@@ -36,6 +38,7 @@ function toLive(snapshot, rules) {
36
38
  health: unit.stats[rules.healthStat] ?? 0,
37
39
  }));
38
40
  }
41
+ /** @internal */
39
42
  export function replayCombat(a, b, rules) {
40
43
  const maxRounds = rules.maxRounds ?? 100;
41
44
  const critChance = rules.critChance ?? 0;
@@ -10,6 +10,7 @@ export interface PositionHistoryConfig {
10
10
  historyMs: number;
11
11
  maxSamples?: number;
12
12
  }
13
+ /** @internal */
13
14
  export declare class PositionHistory {
14
15
  private readonly historyMs;
15
16
  private readonly maxSamples;
@@ -23,7 +24,9 @@ export declare class PositionHistory {
23
24
  prune(now: number): void;
24
25
  forget(entityId: string): void;
25
26
  }
27
+ /** @internal */
26
28
  export declare function createPositionHistory(config: PositionHistoryConfig): PositionHistory;
29
+ /** @internal */
27
30
  export declare function rewindTimestamp(nowMs: number, rttMs: number, interpDelayMs: number): number;
28
31
  export interface HitscanRay {
29
32
  origin: Vec3;
@@ -39,5 +42,7 @@ export interface HitscanHit {
39
42
  distance: number;
40
43
  point: Vec3;
41
44
  }
45
+ /** @internal */
42
46
  export declare function raySphereDistance(ray: HitscanRay, center: Vec3, radius: number): number | null;
47
+ /** @internal */
43
48
  export declare function resolveHitscan(history: PositionHistory, targets: readonly HitscanTarget[], ray: HitscanRay, atMs: number): HitscanHit | null;
@@ -1,4 +1,5 @@
1
1
  const DEFAULT_MAX_SAMPLES = 256;
2
+ /** @internal */
2
3
  export class PositionHistory {
3
4
  historyMs;
4
5
  maxSamples;
@@ -90,9 +91,11 @@ export class PositionHistory {
90
91
  this.tracks.delete(entityId);
91
92
  }
92
93
  }
94
+ /** @internal */
93
95
  export function createPositionHistory(config) {
94
96
  return new PositionHistory(config);
95
97
  }
98
+ /** @internal */
96
99
  export function rewindTimestamp(nowMs, rttMs, interpDelayMs) {
97
100
  return nowMs - rttMs / 2 - interpDelayMs;
98
101
  }
@@ -102,6 +105,7 @@ function normalize(v) {
102
105
  return null;
103
106
  return { x: v.x / len, y: v.y / len, z: v.z / len };
104
107
  }
108
+ /** @internal */
105
109
  export function raySphereDistance(ray, center, radius) {
106
110
  const dir = normalize(ray.direction);
107
111
  if (dir === null)
@@ -126,6 +130,7 @@ export function raySphereDistance(ray, center, radius) {
126
130
  return null;
127
131
  return t;
128
132
  }
133
+ /** @internal */
129
134
  export function resolveHitscan(history, targets, ray, atMs) {
130
135
  const dir = normalize(ray.direction);
131
136
  if (dir === null)
@@ -51,25 +51,33 @@ export declare const DEFAULT_SPAWN_ORIGIN: {
51
51
  readonly y: 0;
52
52
  readonly z: 0;
53
53
  };
54
+ /** @internal */
54
55
  export declare function spawnPresenceState(origin: {
55
56
  x: number;
56
57
  y: number;
57
58
  z: number;
58
59
  } | undefined, nowMs: number, rules: Pick<PoseSyncRules, "maxElapsedSec">): PresencePoseState;
60
+ /** @internal */
59
61
  export declare function decidePoseSync(current: PresencePoseState, incoming: IncomingPose, rules: PoseSyncRules, nowMs: number, floorY?: number): PoseSyncDecision;
62
+ /** @internal */
60
63
  export declare function shouldRefreshKeepAlive(lastSeenAtMs: number | undefined, nowMs: number, rules: Pick<PoseSyncRules, "keepAliveRefreshMs">): boolean;
64
+ /** @internal */
61
65
  export declare function shouldPersistWorldSnapshot(lastSavedAtMs: number | undefined, nowMs: number, intervalMs: number): boolean;
62
66
  export interface ActivePresenceResolution<T> {
63
67
  active: T | null;
64
68
  /** Other unrevoked rows for the same actor — a session may only have one. */
65
69
  extras: T[];
66
70
  }
71
+ /** @internal */
67
72
  export declare function resolveActivePresence<T extends {
68
73
  revokedAt?: number;
69
74
  lastSeenAt?: number;
70
75
  }>(rows: readonly T[]): ActivePresenceResolution<T>;
76
+ /** @internal */
71
77
  export declare function isPresenceExpired(lastSeenAtMs: number, nowMs: number, idleCutoffMs: number): boolean;
72
- /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one. */
78
+ /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
79
+ * @internal
80
+ */
73
81
  export declare function pickReusablePresence<T extends {
74
82
  lastSeenAt?: number;
75
83
  }>(rows: readonly T[]): T | undefined;
@@ -10,6 +10,7 @@ function appearanceEqual(a, b) {
10
10
  return aKeys.every((key) => a[key] === b[key]);
11
11
  }
12
12
  export const DEFAULT_SPAWN_ORIGIN = { x: 0, y: 0, z: 0 };
13
+ /** @internal */
13
14
  export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules) {
14
15
  return {
15
16
  position: { x: origin.x, y: origin.y, z: origin.z },
@@ -18,6 +19,7 @@ export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules)
18
19
  lastSeenAtMs: nowMs - rules.maxElapsedSec * 1000,
19
20
  };
20
21
  }
22
+ /** @internal */
21
23
  export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
22
24
  const rawElapsedSec = Math.max(0, (nowMs - (current.lastSeenAtMs ?? nowMs)) / 1000);
23
25
  const elapsedSec = Math.min(rules.maxElapsedSec, rawElapsedSec);
@@ -55,12 +57,15 @@ export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
55
57
  refreshKeepAlive: !changed && shouldRefreshKeepAlive(current.lastSeenAtMs, nowMs, rules),
56
58
  };
57
59
  }
60
+ /** @internal */
58
61
  export function shouldRefreshKeepAlive(lastSeenAtMs, nowMs, rules) {
59
62
  return nowMs - (lastSeenAtMs ?? 0) >= rules.keepAliveRefreshMs;
60
63
  }
64
+ /** @internal */
61
65
  export function shouldPersistWorldSnapshot(lastSavedAtMs, nowMs, intervalMs) {
62
66
  return lastSavedAtMs === undefined || nowMs - lastSavedAtMs >= intervalMs;
63
67
  }
68
+ /** @internal */
64
69
  export function resolveActivePresence(rows) {
65
70
  const actives = rows.filter((row) => row.revokedAt === undefined);
66
71
  if (actives.length === 0)
@@ -68,10 +73,13 @@ export function resolveActivePresence(rows) {
68
73
  const sorted = [...actives].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0));
69
74
  return { active: sorted[0] ?? null, extras: sorted.slice(1) };
70
75
  }
76
+ /** @internal */
71
77
  export function isPresenceExpired(lastSeenAtMs, nowMs, idleCutoffMs) {
72
78
  return nowMs - lastSeenAtMs >= idleCutoffMs;
73
79
  }
74
- /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one. */
80
+ /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
81
+ * @internal
82
+ */
75
83
  export function pickReusablePresence(rows) {
76
84
  return [...rows].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0))[0];
77
85
  }
@@ -15,6 +15,7 @@ export type SealResult = {
15
15
  ok: false;
16
16
  reason: "unknown_participant" | "already_sealed" | "already_revealed";
17
17
  };
18
+ /** @internal */
18
19
  export declare class CommitRound<TAction> {
19
20
  private readonly order;
20
21
  private readonly participants;
@@ -30,5 +31,7 @@ export declare class CommitRound<TAction> {
30
31
  get phase(): CommitPhase;
31
32
  reveal(): readonly SealedCommit<TAction>[] | null;
32
33
  }
34
+ /** @internal */
33
35
  export declare function createCommitRound<TAction>(config: CommitRoundConfig): CommitRound<TAction>;
36
+ /** @internal */
34
37
  export declare function resolveCommits<TAction, TResult>(reveals: readonly SealedCommit<TAction>[], resolver: (ordered: readonly SealedCommit<TAction>[]) => TResult): TResult;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export class CommitRound {
2
3
  order;
3
4
  participants;
@@ -45,9 +46,11 @@ export class CommitRound {
45
46
  return this.order.map((id) => this.sealed.get(id));
46
47
  }
47
48
  }
49
+ /** @internal */
48
50
  export function createCommitRound(config) {
49
51
  return new CommitRound(config);
50
52
  }
53
+ /** @internal */
51
54
  export function resolveCommits(reveals, resolver) {
52
55
  return resolver(reveals);
53
56
  }
@@ -0,0 +1,11 @@
1
+ export { type ChatActions, type ChatSendOutcome, type ChatSync, type ChatTransport, } from "./multiplayer/chatContract.js";
2
+ export { type BoardSnapshot } from "./multiplayer/combatSnapshot.js";
3
+ export { createFeedWriteGate, validateFeedWrite, type FeedWriteGate } from "./multiplayer/feedWriteGate.js";
4
+ export { resolveGuestSession, sessionPlayer, type AuthSession, type PlayerIdentity } from "./multiplayer/identity.js";
5
+ export { type Vec3 } from "./multiplayer/lagCompensation.js";
6
+ export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, type MatchFilter, type SessionListing, type SessionVisibility, } from "./multiplayer/matchmaking.js";
7
+ export { createPoseSyncGate, type PlayerPose, type PoseSyncTuning } from "./multiplayer/poseSyncGate.js";
8
+ export { type EnsurePresenceResult, type PresenceActions, type PresenceFeeds, type PresenceSession, type PresenceTransport, } from "./multiplayer/presenceContract.js";
9
+ export { type PoseSyncRules, type PresencePoseState } from "./multiplayer/presenceModel.js";
10
+ export { createLocalVoiceTransport, createPushToTalk, type PushToTalkMode, type PushToTalkStatus, type VoiceParticipant, type VoiceRoute, type VoiceTransport, } from "./multiplayer/voiceContract.js";
11
+ export { type ReplicationPolicy } from "./runtime/worldProjection.js";
@@ -0,0 +1,11 @@
1
+ export {} from "./multiplayer/chatContract.js";
2
+ export {} from "./multiplayer/combatSnapshot.js";
3
+ export { createFeedWriteGate, validateFeedWrite } from "./multiplayer/feedWriteGate.js";
4
+ export { resolveGuestSession, sessionPlayer } from "./multiplayer/identity.js";
5
+ export {} from "./multiplayer/lagCompensation.js";
6
+ export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, } from "./multiplayer/matchmaking.js";
7
+ export { createPoseSyncGate } from "./multiplayer/poseSyncGate.js";
8
+ export {} from "./multiplayer/presenceContract.js";
9
+ export {} from "./multiplayer/presenceModel.js";
10
+ export { createLocalVoiceTransport, createPushToTalk, } from "./multiplayer/voiceContract.js";
11
+ export {} from "./runtime/worldProjection.js";
@@ -21,6 +21,63 @@ export interface HeightSampler {
21
21
  sampleHeight(x: number, z: number): number;
22
22
  }
23
23
  export declare function pathFromNav(points: readonly NavPoint[], elevation?: number | HeightSampler, offset?: number): Waypoint[];
24
+ /**
25
+ * Semantic seek target for {@link pathFollowSeek} — the caller-facing progress vocabulary a
26
+ * stateful path behavior restores from, so a follower can start at a distributed phase or resume
27
+ * a serialized route without knowing waypoint internals. `direction` (forward heading) falls out of
28
+ * the resulting {@link PathFollowState.heading}, so it is an output rather than a seek input.
29
+ */
30
+ export type PathProgress =
31
+ /** Fraction `0..1` of total path length (looping paths wrap; clamped otherwise). */
32
+ {
33
+ readonly kind: "normalized";
34
+ readonly value: number;
35
+ }
36
+ /** World-distance travelled from the first waypoint (looping paths wrap; clamped otherwise). */
37
+ | {
38
+ readonly kind: "distance";
39
+ readonly value: number;
40
+ }
41
+ /** Segment `index` (0-based) plus `fraction` `0..1` along that segment. */
42
+ | {
43
+ readonly kind: "segment";
44
+ readonly index: number;
45
+ readonly fraction: number;
46
+ };
47
+ /** Read-only progress readout for inspection/debug tooling, produced by {@link pathFollowProgress}. */
48
+ export interface PathFollowProgress {
49
+ /** Cumulative world-distance travelled (matches {@link PathFollowState.distanceTravelled}). */
50
+ distance: number;
51
+ /** Fraction `0..1` of total path length at the current position. */
52
+ normalized: number;
53
+ /** 0-based index of the segment the mover is currently on. */
54
+ segment: number;
55
+ /** Fraction `0..1` along the current segment. */
56
+ fraction: number;
57
+ }
58
+ /**
59
+ * Total world-distance of a path — sum of every segment, including the wrap segment back to the
60
+ * first waypoint when `loop` is set. Zero for a degenerate (0- or 1-waypoint) path.
61
+ *
62
+ * @capability path-length total polyline distance for progress math and seeding
63
+ */
64
+ export declare function pathLength(config: PathFollowConfig): number;
65
+ /**
66
+ * Place a follower at a semantic {@link PathProgress} without simulating from the start — the seek
67
+ * adapter behavior lifecycles use to seed distributed phases and restore serialized routes. Pure;
68
+ * returns a fresh {@link PathFollowState} whose `heading` gives travel direction. Looping paths wrap
69
+ * the distance; non-looping paths clamp to `[0, pathLength]` and report `done` at the end.
70
+ *
71
+ * @capability path-follow-seek jump a path-follower to normalized/distance/segment progress
72
+ */
73
+ export declare function pathFollowSeek(config: PathFollowConfig, target: PathProgress): PathFollowState;
74
+ /**
75
+ * Read a follower's current progress in every semantic form — the inverse of {@link pathFollowSeek},
76
+ * for editor/debug inspection and progress HUDs. Pure and allocation-light.
77
+ *
78
+ * @capability path-follow-progress read normalized/distance/segment progress from follow state
79
+ */
80
+ export declare function pathFollowProgress(config: PathFollowConfig, state: PathFollowState): PathFollowProgress;
24
81
  export declare function createPathFollow(config: PathFollowConfig): PathFollowState;
25
82
  /**
26
83
  * Advance a path-follower by `speed * dt` along its authored polyline. Pure — returns