@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
@@ -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,8 @@
1
+ import { randomSeedFrom, stepRandomSeed } from "../random/rng.js";
1
2
  function cloneStats(stats) {
2
3
  return { ...stats };
3
4
  }
5
+ /** @internal */
4
6
  export function serializeBoard(args) {
5
7
  return {
6
8
  ownerId: args.ownerId,
@@ -10,6 +12,7 @@ export function serializeBoard(args) {
10
12
  capturedAt: args.capturedAt ?? 0,
11
13
  };
12
14
  }
15
+ /** @internal */
13
16
  export function cloneSnapshot(snapshot) {
14
17
  return serializeBoard({
15
18
  ownerId: snapshot.ownerId,
@@ -19,14 +22,18 @@ export function cloneSnapshot(snapshot) {
19
22
  capturedAt: snapshot.capturedAt,
20
23
  });
21
24
  }
22
- function mulberry32(seed) {
23
- let a = seed >>> 0;
25
+ /**
26
+ * Deterministic per-replay PRNG built from the shared {@link randomSeedFrom} /
27
+ * {@link stepRandomSeed} primitives. `randomSeedFrom` takes the raw integer seed
28
+ * without string hashing, so the emitted sequence is byte-identical to the former
29
+ * inline mulberry32 — replay determinism across peers is preserved.
30
+ */
31
+ function seededPrng(seed) {
32
+ let cursor = randomSeedFrom(seed);
24
33
  return () => {
25
- a |= 0;
26
- a = (a + 0x6d2b79f5) | 0;
27
- let t = Math.imul(a ^ (a >>> 15), 1 | a);
28
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
29
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
34
+ const [value, next] = stepRandomSeed(cursor);
35
+ cursor = next;
36
+ return value;
30
37
  };
31
38
  }
32
39
  function toLive(snapshot, rules) {
@@ -36,11 +43,12 @@ function toLive(snapshot, rules) {
36
43
  health: unit.stats[rules.healthStat] ?? 0,
37
44
  }));
38
45
  }
46
+ /** @internal */
39
47
  export function replayCombat(a, b, rules) {
40
48
  const maxRounds = rules.maxRounds ?? 100;
41
49
  const critChance = rules.critChance ?? 0;
42
50
  const critMultiplier = rules.critMultiplier ?? 2;
43
- const prng = mulberry32((a.seed ^ (b.seed * 0x9e3779b1)) >>> 0);
51
+ const prng = seededPrng((a.seed ^ (b.seed * 0x9e3779b1)) >>> 0);
44
52
  const liveA = toLive(a, rules);
45
53
  const liveB = toLive(b, rules);
46
54
  const blows = [];
@@ -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)
@@ -32,6 +32,8 @@ export interface PoseSyncRules {
32
32
  /** Unchanged poses refresh the keep-alive stamp at most this often. */
33
33
  keepAliveRefreshMs: number;
34
34
  }
35
+ /** Canonical client-authoritative pose-sync tuning shared by every host transport (WS, Convex). */
36
+ export declare const DEFAULT_POSE_SYNC_RULES: PoseSyncRules;
35
37
  export interface PoseSyncDecision {
36
38
  position: {
37
39
  x: number;
@@ -51,25 +53,33 @@ export declare const DEFAULT_SPAWN_ORIGIN: {
51
53
  readonly y: 0;
52
54
  readonly z: 0;
53
55
  };
56
+ /** @internal */
54
57
  export declare function spawnPresenceState(origin: {
55
58
  x: number;
56
59
  y: number;
57
60
  z: number;
58
61
  } | undefined, nowMs: number, rules: Pick<PoseSyncRules, "maxElapsedSec">): PresencePoseState;
62
+ /** @internal */
59
63
  export declare function decidePoseSync(current: PresencePoseState, incoming: IncomingPose, rules: PoseSyncRules, nowMs: number, floorY?: number): PoseSyncDecision;
64
+ /** @internal */
60
65
  export declare function shouldRefreshKeepAlive(lastSeenAtMs: number | undefined, nowMs: number, rules: Pick<PoseSyncRules, "keepAliveRefreshMs">): boolean;
66
+ /** @internal */
61
67
  export declare function shouldPersistWorldSnapshot(lastSavedAtMs: number | undefined, nowMs: number, intervalMs: number): boolean;
62
68
  export interface ActivePresenceResolution<T> {
63
69
  active: T | null;
64
70
  /** Other unrevoked rows for the same actor — a session may only have one. */
65
71
  extras: T[];
66
72
  }
73
+ /** @internal */
67
74
  export declare function resolveActivePresence<T extends {
68
75
  revokedAt?: number;
69
76
  lastSeenAt?: number;
70
77
  }>(rows: readonly T[]): ActivePresenceResolution<T>;
78
+ /** @internal */
71
79
  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. */
80
+ /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
81
+ * @internal
82
+ */
73
83
  export declare function pickReusablePresence<T extends {
74
84
  lastSeenAt?: number;
75
85
  }>(rows: readonly T[]): T | undefined;
@@ -1,3 +1,11 @@
1
+ /** Canonical client-authoritative pose-sync tuning shared by every host transport (WS, Convex). */
2
+ export const DEFAULT_POSE_SYNC_RULES = {
3
+ maxSpeed: 12,
4
+ maxVerticalOffset: 3,
5
+ minElapsedSec: 0.05,
6
+ maxElapsedSec: 0.5,
7
+ keepAliveRefreshMs: 10_000,
8
+ };
1
9
  function appearanceEqual(a, b) {
2
10
  if (a === b)
3
11
  return true;
@@ -10,6 +18,7 @@ function appearanceEqual(a, b) {
10
18
  return aKeys.every((key) => a[key] === b[key]);
11
19
  }
12
20
  export const DEFAULT_SPAWN_ORIGIN = { x: 0, y: 0, z: 0 };
21
+ /** @internal */
13
22
  export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules) {
14
23
  return {
15
24
  position: { x: origin.x, y: origin.y, z: origin.z },
@@ -18,6 +27,7 @@ export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules)
18
27
  lastSeenAtMs: nowMs - rules.maxElapsedSec * 1000,
19
28
  };
20
29
  }
30
+ /** @internal */
21
31
  export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
22
32
  const rawElapsedSec = Math.max(0, (nowMs - (current.lastSeenAtMs ?? nowMs)) / 1000);
23
33
  const elapsedSec = Math.min(rules.maxElapsedSec, rawElapsedSec);
@@ -55,12 +65,15 @@ export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
55
65
  refreshKeepAlive: !changed && shouldRefreshKeepAlive(current.lastSeenAtMs, nowMs, rules),
56
66
  };
57
67
  }
68
+ /** @internal */
58
69
  export function shouldRefreshKeepAlive(lastSeenAtMs, nowMs, rules) {
59
70
  return nowMs - (lastSeenAtMs ?? 0) >= rules.keepAliveRefreshMs;
60
71
  }
72
+ /** @internal */
61
73
  export function shouldPersistWorldSnapshot(lastSavedAtMs, nowMs, intervalMs) {
62
74
  return lastSavedAtMs === undefined || nowMs - lastSavedAtMs >= intervalMs;
63
75
  }
76
+ /** @internal */
64
77
  export function resolveActivePresence(rows) {
65
78
  const actives = rows.filter((row) => row.revokedAt === undefined);
66
79
  if (actives.length === 0)
@@ -68,10 +81,13 @@ export function resolveActivePresence(rows) {
68
81
  const sorted = [...actives].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0));
69
82
  return { active: sorted[0] ?? null, extras: sorted.slice(1) };
70
83
  }
84
+ /** @internal */
71
85
  export function isPresenceExpired(lastSeenAtMs, nowMs, idleCutoffMs) {
72
86
  return nowMs - lastSeenAtMs >= idleCutoffMs;
73
87
  }
74
- /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one. */
88
+ /** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
89
+ * @internal
90
+ */
75
91
  export function pickReusablePresence(rows) {
76
92
  return [...rows].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0))[0];
77
93
  }
@@ -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
@@ -4,6 +4,115 @@ export function pathFromNav(points, elevation = 0, offset = 0) {
4
4
  }
5
5
  return points.map((point) => [point[0], elevation.sampleHeight(point[0], point[1]) + offset, point[1]]);
6
6
  }
7
+ function pathSegments(waypoints, loop) {
8
+ const count = waypoints.length;
9
+ const segments = [];
10
+ const limit = loop ? count : count - 1;
11
+ for (let i = 0; i < limit; i += 1) {
12
+ const from = waypoints[i];
13
+ const dest = (i + 1) % count;
14
+ const to = waypoints[dest];
15
+ segments.push({ from, to, len: Math.hypot(to[0] - from[0], to[1] - from[1], to[2] - from[2]), dest });
16
+ }
17
+ return segments;
18
+ }
19
+ function distanceForProgress(target, total, segments) {
20
+ if (target.kind === "distance")
21
+ return target.value;
22
+ if (target.kind === "normalized")
23
+ return target.value * total;
24
+ let distance = 0;
25
+ for (let i = 0; i < target.index && i < segments.length; i += 1)
26
+ distance += segments[i].len;
27
+ const seg = segments[target.index];
28
+ if (seg !== undefined)
29
+ distance += seg.len * target.fraction;
30
+ return distance;
31
+ }
32
+ /**
33
+ * Total world-distance of a path — sum of every segment, including the wrap segment back to the
34
+ * first waypoint when `loop` is set. Zero for a degenerate (0- or 1-waypoint) path.
35
+ *
36
+ * @capability path-length total polyline distance for progress math and seeding
37
+ */
38
+ export function pathLength(config) {
39
+ return pathSegments(config.waypoints, config.loop ?? false).reduce((sum, seg) => sum + seg.len, 0);
40
+ }
41
+ /**
42
+ * Place a follower at a semantic {@link PathProgress} without simulating from the start — the seek
43
+ * adapter behavior lifecycles use to seed distributed phases and restore serialized routes. Pure;
44
+ * returns a fresh {@link PathFollowState} whose `heading` gives travel direction. Looping paths wrap
45
+ * the distance; non-looping paths clamp to `[0, pathLength]` and report `done` at the end.
46
+ *
47
+ * @capability path-follow-seek jump a path-follower to normalized/distance/segment progress
48
+ */
49
+ export function pathFollowSeek(config, target) {
50
+ const { waypoints } = config;
51
+ const loop = config.loop ?? false;
52
+ const count = waypoints.length;
53
+ if (count <= 1)
54
+ return createPathFollow(config);
55
+ const segments = pathSegments(waypoints, loop);
56
+ const total = segments.reduce((sum, seg) => sum + seg.len, 0);
57
+ if (total <= EPSILON)
58
+ return createPathFollow(config);
59
+ const requested = distanceForProgress(target, total, segments);
60
+ const positioned = loop ? ((requested % total) + total) % total : Math.max(0, Math.min(total, requested));
61
+ let acc = 0;
62
+ for (let i = 0; i < segments.length; i += 1) {
63
+ const seg = segments[i];
64
+ const last = i === segments.length - 1;
65
+ if (positioned < acc + seg.len || last) {
66
+ const along = Math.max(0, Math.min(seg.len, positioned - acc));
67
+ const t = seg.len > EPSILON ? along / seg.len : 0;
68
+ const position = [
69
+ seg.from[0] + (seg.to[0] - seg.from[0]) * t,
70
+ seg.from[1] + (seg.to[1] - seg.from[1]) * t,
71
+ seg.from[2] + (seg.to[2] - seg.from[2]) * t,
72
+ ];
73
+ const heading = Math.atan2(seg.to[0] - seg.from[0], seg.to[2] - seg.from[2]);
74
+ const done = !loop && positioned >= total - EPSILON;
75
+ return {
76
+ position,
77
+ target: done ? count - 1 : seg.dest,
78
+ heading,
79
+ done,
80
+ distanceTravelled: loop ? requested : positioned,
81
+ };
82
+ }
83
+ acc += seg.len;
84
+ }
85
+ return createPathFollow(config);
86
+ }
87
+ /**
88
+ * Read a follower's current progress in every semantic form — the inverse of {@link pathFollowSeek},
89
+ * for editor/debug inspection and progress HUDs. Pure and allocation-light.
90
+ *
91
+ * @capability path-follow-progress read normalized/distance/segment progress from follow state
92
+ */
93
+ export function pathFollowProgress(config, state) {
94
+ const loop = config.loop ?? false;
95
+ const segments = pathSegments(config.waypoints, loop);
96
+ const total = segments.reduce((sum, seg) => sum + seg.len, 0);
97
+ let segment = segments.findIndex((seg) => seg.dest === state.target);
98
+ if (segment < 0)
99
+ segment = 0;
100
+ const seg = segments[segment];
101
+ let fraction = 0;
102
+ if (seg !== undefined && seg.len > EPSILON) {
103
+ const along = Math.hypot(state.position[0] - seg.from[0], state.position[1] - seg.from[1], state.position[2] - seg.from[2]);
104
+ fraction = Math.max(0, Math.min(1, along / seg.len));
105
+ }
106
+ let traversed = fraction * (seg?.len ?? 0);
107
+ for (let i = 0; i < segment; i += 1)
108
+ traversed += segments[i].len;
109
+ return {
110
+ distance: state.distanceTravelled,
111
+ normalized: total > EPSILON ? traversed / total : 0,
112
+ segment,
113
+ fraction,
114
+ };
115
+ }
7
116
  export function createPathFollow(config) {
8
117
  const first = config.waypoints[0];
9
118
  const start = first ?? [0, 0, 0];
@@ -0,0 +1,156 @@
1
+ /**
2
+ * The reusable order verbs every commandable game re-derives -- move, stop,
3
+ * hold, attack-move, targeted action, patrol -- built as ordinary
4
+ * `OrderKind`s over two narrow world adapters, not baked into the queue (#912).
5
+ * Each factory takes a configurable `kind` string, so a game re-skins a verb
6
+ * ("harvest", "board") without the engine ever knowing the name. Movement,
7
+ * target acquisition, pursuit/leash, and completion predicates compose here;
8
+ * effect execution stays game-side, driven off the intent each kind writes into
9
+ * `order.state`.
10
+ */
11
+ import type { OrderKind, OrderVec3 } from "./orderQueue.js";
12
+ /** Result of one movement step, from the game's motion adapter. */
13
+ export interface OrderMoveResult {
14
+ /** The mover reached the point within its arrive radius this step. */
15
+ arrived: boolean;
16
+ /** Remaining distance to the point after the step. */
17
+ distance: number;
18
+ }
19
+ /**
20
+ * Narrow motion adapter an order kind drives. The game implements it over its
21
+ * own controller/motor (`scene.moveToward`, a nav follower, physics) for one
22
+ * entity; the kind never touches the scene directly.
23
+ */
24
+ export interface OrderMover {
25
+ /** Current position, or `null` if the entity is gone (despawned) -- the kind then fails cleanly. */
26
+ position(): OrderVec3 | null;
27
+ /** Step toward `point` this tick and report arrival/remaining distance. */
28
+ moveToward(point: OrderVec3, options?: {
29
+ speedScale?: number;
30
+ arriveRadius?: number;
31
+ }): OrderMoveResult;
32
+ /** Stop moving (release throttle / clear steering) — used by stop/hold and on cancel. */
33
+ halt(): void;
34
+ }
35
+ /**
36
+ * Narrow targeting adapter for engagement verbs. `acquire` returns the id of a
37
+ * hostile within `radius` (nearest, or whatever policy the game injects), and
38
+ * `positionOf` locates a known target. Actual damage/effects stay game-side.
39
+ */
40
+ export interface OrderTargeting {
41
+ /** Acquire a hostile within `radius`, or `null` if none. */
42
+ acquire(radius: number): string | null;
43
+ /** Current position of a target id, or `null` if it is gone. */
44
+ positionOf(targetId: string): OrderVec3 | null;
45
+ }
46
+ /** Payload for a move order: go to a point and complete on arrival. */
47
+ export interface MoveOrderPayload {
48
+ point: OrderVec3;
49
+ /** Distance that counts as arrived; falls back to the factory default. */
50
+ arriveRadius?: number;
51
+ /** Per-order speed multiplier passed to the mover. */
52
+ speedScale?: number;
53
+ }
54
+ /** Payload for stop/hold orders — no data; the verb is the intent. */
55
+ export type EmptyOrderPayload = Record<string, never>;
56
+ /** Payload for an attack-move: advance toward `point`, engaging hostiles encountered en route. */
57
+ export interface AttackMoveOrderPayload {
58
+ point: OrderVec3;
59
+ /** Radius scanned for hostiles each tick; falls back to the factory default. */
60
+ aggroRadius?: number;
61
+ /** Distance at which an acquired target is "in range" to attack; falls back to the factory default. */
62
+ attackRange?: number;
63
+ /** Arrive radius for the destination when no hostile is engaged. */
64
+ arriveRadius?: number;
65
+ speedScale?: number;
66
+ }
67
+ /** Live intent an attack-move/targeted order writes into `Order.state`; the game reads it to run the actual attack. Serializable. */
68
+ export interface EngagementOrderState {
69
+ /** Target currently pursued/engaged, or `null` while travelling. */
70
+ engaging: string | null;
71
+ /** The engaged target is within attack range this tick — the swing/cast window. */
72
+ inRange: boolean;
73
+ }
74
+ /** Payload for a targeted action: pursue one target until in range, holding within a leash. */
75
+ export interface TargetedOrderPayload {
76
+ targetId: string;
77
+ /** Distance at which the target is "in range"; falls back to the factory default. */
78
+ range?: number;
79
+ speedScale?: number;
80
+ }
81
+ /** Serializable patrol progress. */
82
+ export interface PatrolOrderState {
83
+ /** Index of the waypoint currently being approached. */
84
+ index: number;
85
+ }
86
+ /** Payload for a patrol: walk a waypoint route, optionally looping forever. */
87
+ export interface PatrolOrderPayload {
88
+ waypoints: OrderVec3[];
89
+ /** Loop back to the first waypoint after the last; otherwise complete at the end. Default `true`. */
90
+ loop?: boolean;
91
+ arriveRadius?: number;
92
+ speedScale?: number;
93
+ }
94
+ /** Shared factory config: override the verb key so a game can register the composition under its own name. */
95
+ export interface OrderKindConfig {
96
+ /** Registry key / `Order.kind`; defaults to the natural verb name. */
97
+ kind?: string;
98
+ }
99
+ /** Move + engagement config carrying the default radii the payload may override. */
100
+ export interface EngagementKindConfig extends OrderKindConfig {
101
+ arriveRadius?: number;
102
+ aggroRadius?: number;
103
+ attackRange?: number;
104
+ range?: number;
105
+ }
106
+ /**
107
+ * The plain "go here" verb: step toward a point each tick, complete on arrival,
108
+ * fail if the entity despawns. The completion predicate is arrival within
109
+ * `arriveRadius`.
110
+ *
111
+ * @capability move-order go-to-point order that completes on arrival, composed over a motion adapter
112
+ */
113
+ export declare function defineMoveOrder<TCtx extends OrderMover>(config?: OrderKindConfig & {
114
+ arriveRadius?: number;
115
+ }): OrderKind<TCtx, MoveOrderPayload>;
116
+ /**
117
+ * Stop: halt immediately and complete the same tick — the interrupt that clears
118
+ * a unit's intent to standstill.
119
+ *
120
+ * @capability stop-order halt-and-complete order that brings a unit to an immediate standstill
121
+ */
122
+ export declare function defineStopOrder<TCtx extends OrderMover>(config?: OrderKindConfig): OrderKind<TCtx, EmptyOrderPayload>;
123
+ /**
124
+ * Hold position: stand ground indefinitely (never completes on its own) until
125
+ * preempted or canceled — the "guard here" verb.
126
+ *
127
+ * @capability hold-order stand-ground order that holds position until preempted or canceled
128
+ */
129
+ export declare function defineHoldOrder<TCtx extends OrderMover>(config?: OrderKindConfig): OrderKind<TCtx, EmptyOrderPayload>;
130
+ /**
131
+ * Attack-move: advance toward a destination but break off to engage any hostile
132
+ * acquired within `aggroRadius`, pursuing it to `attackRange` and writing the
133
+ * engagement intent into `order.state` for the game to act on. Completes on
134
+ * reaching the destination with nothing to engage.
135
+ *
136
+ * @capability attack-move-order advance-and-engage order that pursues hostiles en route and completes at its destination
137
+ */
138
+ export declare function defineAttackMoveOrder<TCtx extends OrderMover & OrderTargeting>(config?: EngagementKindConfig): OrderKind<TCtx, AttackMoveOrderPayload>;
139
+ /**
140
+ * Targeted action: pursue one specific target until within `range`, writing the
141
+ * engagement intent into `order.state`. Completes when the target is gone
142
+ * (despawned/dead), so the game's effect loop runs while `inRange` is true.
143
+ *
144
+ * @capability targeted-order pursue-a-target order with leash/standoff that ends when the target is gone
145
+ */
146
+ export declare function defineTargetedOrder<TCtx extends OrderMover & OrderTargeting>(config?: EngagementKindConfig): OrderKind<TCtx, TargetedOrderPayload>;
147
+ /**
148
+ * Patrol: walk a waypoint route, advancing the serialized `index` as each point
149
+ * is reached. Loops forever by default, or completes at the last waypoint when
150
+ * `loop` is `false`.
151
+ *
152
+ * @capability patrol-order waypoint-route order that cycles a path, looping or completing at the end
153
+ */
154
+ export declare function definePatrolOrder<TCtx extends OrderMover>(config?: OrderKindConfig & {
155
+ arriveRadius?: number;
156
+ }): OrderKind<TCtx, PatrolOrderPayload>;