@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
@@ -2,17 +2,20 @@ import { type CardPile, type CardPileConfig } from "../cards/cardPile.js";
2
2
  import { type OnDeathSpec } from "../combat/death.js";
3
3
  import { type EffectInput, type EffectResult, type EffectVia, type ReceiveMap, type SingleTargetEffectInput } from "../combat/effects.js";
4
4
  import { type ProjectileSystem } from "../combat/projectiles.js";
5
- import { type HitReaction, type HitReactionConfig } from "../combat/hitReaction.js";
5
+ import { type HitReaction, type HitReactionConfig, type ImpactPresetName } from "../combat/hitReaction.js";
6
6
  import { type TelegraphShape } from "../combat/telegraph.js";
7
7
  import { type CommandDefinition, type CommandResult } from "../commands/commandRegistry.js";
8
+ import { type ChargeOptions as WalletChargeOptions } from "../economy/wallet.js";
8
9
  import { type Cosmetics } from "../game/cosmetics.js";
9
10
  import type { GameDefinition } from "../game/defineGame.js";
10
11
  import { type TerrainField } from "../world/terrain.js";
11
- import { type GameEventMap, type GameEvents } from "../game/events.js";
12
+ import { type GameEventMap, type GameEvents, type VfxKind } from "../game/events.js";
13
+ import { type VfxInstanceStore } from "../game/vfxInstance.js";
12
14
  import { type GameFeed } from "../game/feed.js";
13
15
  import { type Leaderboard } from "../game/leaderboard.js";
14
16
  import { type Loadouts } from "../game/loadout.js";
15
17
  import { type Drop, type LootTableDef } from "../game/lootTable.js";
18
+ import { type GameDialogue } from "../game/dialogue.js";
16
19
  import { type QuestJournal } from "../game/quest.js";
17
20
  import { type WorldItemRecord, type WorldItemSpawnInput } from "../game/worldItem.js";
18
21
  import { type Chat } from "../game/chat.js";
@@ -26,20 +29,26 @@ import { type ItemUseHandler, type ItemUseInput, type ItemUseRejection, type Ite
26
29
  import { type WeaponStats } from "../item/weapon.js";
27
30
  import { type PoseAllowedStates, type PoseState } from "../movement/poseState.js";
28
31
  import type { ModelAssetRef } from "../scene/assetCatalog.js";
32
+ import { type BodyBind } from "../scene/bodyBind.js";
29
33
  import { type PaintLayer } from "../scene/paintLayer.js";
30
34
  import { type EntityStatsApi, type StatCatalog } from "../scene/entityStats.js";
31
- import type { EntityPose, EntityPosition, EntityStore, SceneEntity, SpawnOptions, SpawnPose } from "../scene/entityStore.js";
35
+ import { type EntityBlackboard, type EntityPose, type EntityPosition, type EntityStore, type SceneEntity, type SpawnOptions, type SpawnPose } from "../scene/entityStore.js";
32
36
  import { type Forms } from "../scene/form.js";
33
- import type { EntityColliderSet } from "../scene/colliders.js";
37
+ import { type EntityColliderSet } from "../scene/colliders.js";
34
38
  import { type ObjectRaycastHit, type ObjectRaycastInput } from "../scene/objectQuery.js";
35
39
  import { type ObjectStore } from "../scene/objectStore.js";
36
40
  import { type Roster } from "../scene/roster.js";
41
+ import { type SelectionSet } from "../scene/selection.js";
42
+ import { type ConnectedPlayers } from "../game/connectedPlayers.js";
37
43
  import { type Possession } from "../scene/possession.js";
38
44
  import { type SceneRaycastHit, type SceneRaycastInput } from "../scene/sceneRaycast.js";
39
- import { type SpatialApi } from "../scene/spatial.js";
45
+ import { type MoveTowardOptions, type SpatialApi } from "../scene/spatial.js";
40
46
  import { type CycleTargetOptions } from "../scene/targeting.js";
41
47
  import { type Stats } from "../stats/statModifiers.js";
42
48
  import { type ObservableKeyedStore } from "../store/observableKeyedStore.js";
49
+ import { type SnapshotModule, type SnapshotViewer, type WorldSnapshot } from "./worldSnapshot.js";
50
+ import { type ReplicationPolicy } from "./worldProjection.js";
51
+ import { type RuntimeSave, type RuntimeSaveOptions } from "./runtimeSave.js";
43
52
  import { type SimClock } from "../time/simClock.js";
44
53
  import { type TurnLoop, type TurnLoopConfig } from "../turn/turnLoop.js";
45
54
  import { RaceState, type RaceStateConfig } from "../game/race.js";
@@ -68,6 +77,8 @@ export interface GameContextEntityEntry {
68
77
  verbs?: readonly ContextVerb[];
69
78
  /** Purpose-specific colliders (physical body + named damage hitboxes). */
70
79
  colliders?: EntityColliderSet;
80
+ /** Uniform visual scale of the rendered mesh; derives a matching hitbox (and eye-height) when no explicit `colliders` are set. */
81
+ scale?: number;
71
82
  }
72
83
  export interface GameContextObjectEntry {
73
84
  proximityPrompt?: ProximityPrompt;
@@ -94,6 +105,14 @@ export interface GameContextOptions<TAssetRef extends ModelAssetRef = ModelAsset
94
105
  };
95
106
  now?: () => number;
96
107
  occluder?: (from: EntityPosition, to: EntityPosition) => boolean;
108
+ /** Bind `ctx.game.save` to a pluggable backend (offline/single-player whole-world save). The shell resolves this from `defineGame({ save })`; multiplayer leaves it off (the host persists). */
109
+ save?: RuntimeSaveOptions;
110
+ /**
111
+ * Host-side per-viewer replication policy — private-state and area-of-interest projection over the
112
+ * wire. Bound on the authoritative host only. Unset (the default) replicates the whole world to every
113
+ * client, exactly as before; the simulation is identical either way, so a game plays the same.
114
+ */
115
+ replication?: ReplicationPolicy;
97
116
  }
98
117
  export interface SceneObjectContext extends ObjectStore {
99
118
  catalog(instanceId: string): GameContextObjectEntry | null;
@@ -101,6 +120,15 @@ export interface SceneObjectContext extends ObjectStore {
101
120
  raycastAll(input: ObjectRaycastInput): readonly ObjectRaycastHit[];
102
121
  setColliders(instanceId: string, colliders: EntityColliderSet | null): void;
103
122
  collidersOf(instanceId: string): EntityColliderSet | null;
123
+ /**
124
+ * Per-instance selection/highlight state for placed objects — the reactive counterpart to
125
+ * `worldHealthBars`/`nameplates` (entities), so a build-mode or RTS selection ring reads
126
+ * `ctx.scene.object.selection` instead of hand-rolling one through `WorldOverlay` against external
127
+ * state. Mutations (`add`/`remove`/`toggle`/`replace`/`clear`) bump `ctx.version()`/notify
128
+ * `ctx.subscribe` like every other `ctx` surface. Render it with `WorldObjectHighlights`
129
+ * (`@jgengine/shell/world/WorldHud`).
130
+ */
131
+ selection: SelectionSet;
104
132
  }
105
133
  export interface FloatTextInput {
106
134
  instanceId?: string;
@@ -113,6 +141,15 @@ export interface FloatTextInput {
113
141
  crit?: boolean;
114
142
  scale?: number;
115
143
  }
144
+ /** Request a transient spell/ability VFX burst; `from`/`to` accept an instance id or a world point, `color` is a `0xRRGGBB` tint, and `durationMs` defaults per `kind`. */
145
+ export interface VfxInput {
146
+ kind: VfxKind;
147
+ color: number;
148
+ from?: string | readonly [number, number, number];
149
+ to?: string | readonly [number, number, number];
150
+ radius?: number;
151
+ durationMs?: number;
152
+ }
116
153
  export interface TelegraphInput {
117
154
  from: string;
118
155
  shape: TelegraphShape;
@@ -131,9 +168,14 @@ export interface TelegraphInput {
131
168
  export interface HitReactionInput {
132
169
  from: string;
133
170
  to: string;
134
- config: HitReactionConfig;
171
+ config: HitReactionConfig | ImpactPresetName;
135
172
  power?: number;
136
173
  }
174
+ /** Options for {@link SceneEntityContext.moveTowardCommit}: {@link MoveTowardOptions} plus an optional facing turn. */
175
+ export interface MoveTowardCommitOptions extends MoveTowardOptions {
176
+ /** Rotate the entity to face its direction of travel instead of preserving its current `rotationY`. Default false. */
177
+ face?: boolean;
178
+ }
137
179
  export interface SceneEntityContext {
138
180
  spawn(name: string, options?: SpawnOptions): string;
139
181
  despawn(instanceId: string): boolean;
@@ -142,11 +184,22 @@ export interface SceneEntityContext {
142
184
  setPoseConstraint: EntityStore["setPoseConstraint"];
143
185
  get(instanceId: string): SceneEntity | null;
144
186
  list(): readonly SceneEntity[];
187
+ ids: EntityStore["ids"];
188
+ subscribeMembership: EntityStore["subscribeMembership"];
145
189
  spawnPoseOf(instanceId: string): SpawnPose | null;
146
190
  resetToSpawn(instanceId: string): boolean;
147
191
  resetAllToSpawn(filter?: (entity: SceneEntity) => boolean): number;
192
+ blackboard: EntityBlackboard;
148
193
  stats: EntityStatsApi;
149
194
  floatText(input: FloatTextInput): void;
195
+ vfx(input: VfxInput): void;
196
+ /**
197
+ * Retained VFX registry for long-lived, updatable effects (held beams, tethers, zones, target lines) whose
198
+ * endpoints and params change over time — the persistent complement to the one-shot {@link SceneEntityContext.vfx}
199
+ * burst. `upsert` creates/replaces by stable id, `update` nudges dynamic params, `stop` disposes with an optional
200
+ * fade; endpoints given as an entity instance id are followed live by the renderer without per-frame commands.
201
+ */
202
+ vfxInstance: VfxInstanceStore;
150
203
  telegraph(input: TelegraphInput): () => void;
151
204
  hitReaction(input: HitReactionInput): HitReaction | null;
152
205
  setTarget(fromId: string, toId: string | null): void;
@@ -163,11 +216,29 @@ export interface SceneEntityContext {
163
216
  hasLineOfSight: SpatialApi["hasLineOfSight"];
164
217
  queryArc: SpatialApi["queryArc"];
165
218
  moveToward: SpatialApi["moveToward"];
219
+ /**
220
+ * `moveToward` plus commit: steps `instanceId` toward `target` and immediately `setPose`s the
221
+ * result, so a per-tick mover no longer pairs `moveToward` with a hand-written `setPose`.
222
+ * `options.face` turns the entity to its direction of travel; omitted preserves the current
223
+ * `rotationY`. Returns the committed position (`null`, committing nothing, when `moveToward` would
224
+ * — unknown instance/target).
225
+ */
226
+ moveTowardCommit(instanceId: string, target: EntityPosition | string, options: MoveTowardCommitOptions): EntityPosition | null;
166
227
  invalidateSpatial: SpatialApi["invalidate"];
167
228
  setColliders(instanceId: string, colliders: EntityColliderSet | null): void;
168
229
  collidersOf(instanceId: string): EntityColliderSet | null;
230
+ /** Uniform visual scale from the entity's catalog entry (1 when unscaled). */
231
+ visualScaleOf(instanceId: string): number;
169
232
  form: Forms;
170
233
  paint: PaintLayer;
234
+ /**
235
+ * Lazily creates (on first call) or returns the existing declarative bind for `key` — the sim-snapshot →
236
+ * scene-entity pose mirror (#673). Call `bind(key).sync(bodies, dt)` once per tick with every sim body's
237
+ * current snapshot instead of hand-writing `setPose` per body: an id seen for the first time is spawned
238
+ * from its `kind`, an id already bound is posed, and a previously-bound id absent from this tick's
239
+ * `bodies` is despawned — no per-game spawn/despawn dance.
240
+ */
241
+ bind(key: string): BodyBind;
171
242
  }
172
243
  export type WorldItemPickupResult = {
173
244
  status: "ok";
@@ -189,6 +260,10 @@ export interface GameContextCommands {
189
260
  has(name: string): boolean;
190
261
  names(): string[];
191
262
  run(name: string, input: unknown): CommandResult<GameContext>;
263
+ /** Run a command attributed to `actorUserId` — a shared-world host routes each client's command through this so the handler can read {@link actor}. */
264
+ runAs(actorUserId: string, name: string, input: unknown): CommandResult<GameContext>;
265
+ /** The user a command is running on behalf of, or `null` outside a {@link runAs} call — commands default to `ctx.player.userId` when this is `null`. */
266
+ actor(): string | null;
192
267
  }
193
268
  export interface GameContextFeed extends Omit<GameFeed, "bind"> {
194
269
  bind(action: keyof GameEventMap): () => void;
@@ -202,9 +277,12 @@ export interface GameContextLoot {
202
277
  export interface GameContextEconomy {
203
278
  balance(userId: string, currencyId: string): number;
204
279
  grant(userId: string, currencyId: string, amount: number): void;
205
- charge(userId: string, currencyId: string, amount: number): {
280
+ /** `options.overdraft` opts this charge into carrying a negative balance (`true` unlimited, `{ max }` capped) — omitted keeps the strict no-debt default. */
281
+ charge(userId: string, currencyId: string, amount: number, options?: WalletChargeOptions): {
206
282
  reason: string;
207
283
  } | null;
284
+ /** True once `balance(userId, currencyId)` has gone negative under an overdraft-enabled charge. */
285
+ isOverdrawn(userId: string, currencyId: string): boolean;
208
286
  }
209
287
  export interface GameContextItemUse {
210
288
  register(handlers: Record<string, ItemUseHandler<GameContext>>): void;
@@ -228,6 +306,13 @@ export interface GameContextRace {
228
306
  /** Lazily creates (on first call, `config` required) or returns the existing reactive race for `id` — discrete mutations and eventful `update` calls bump `ctx.version()`, so HUDs stop hand-managing `store.set` (#286.2). */
229
307
  state(id: string, config?: RaceStateConfig): RaceState;
230
308
  }
309
+ /** Reachable audio seam on `ctx.game`: `play`, `music`, and `resume` route through the `audio.play`/`audio.music`/`audio.resume` events the shell's audio engine listens on, so game code triggers sound without importing the shell. */
310
+ export interface GameAudio {
311
+ play(sound: string, at?: readonly [number, number, number]): void;
312
+ /** Crossfade the procedural soundtrack to `theme` (null fades out); `transpose` shifts the incoming theme's key in semitones. */
313
+ music(theme: string | null, transpose?: number): void;
314
+ resume(): void;
315
+ }
231
316
  export interface GameContext {
232
317
  scene: {
233
318
  object: SceneObjectContext;
@@ -240,36 +325,75 @@ export interface GameContext {
240
325
  game: {
241
326
  commands: GameContextCommands;
242
327
  events: GameEvents;
328
+ audio: GameAudio;
329
+ /** Play a model's one-shot animation clip bound to `event` in its `animation.oneShots` (e.g. an attack swing) — emits `entity.animation` for the shell to pick up. */
330
+ playEntityAnimation(instanceId: string, event: string): void;
243
331
  feed: GameContextFeed;
244
332
  loot: GameContextLoot;
245
- trade: TradeSystem;
246
- quest: QuestJournal;
247
- social: Social;
248
- chat: Chat;
249
- unlocks: Unlocks;
333
+ /** Shop/vendor barter — present only when `features.trade` is set. */
334
+ trade?: TradeSystem;
335
+ /** Quest/mission journal — present only when `features.quest` is set. */
336
+ quest?: QuestJournal;
337
+ /** Talkable-NPC dialogue open/close bridge — present only when `features.dialogue` is set. */
338
+ dialogue?: GameDialogue;
339
+ /** Friends/party/presence/emotes/world-invites — present only when `features.social` is set. */
340
+ social?: Social;
341
+ /** Channels + messages — present only when `features.chat` is set (implies `social`). */
342
+ chat?: Chat;
343
+ /** Earned unlockable content — present only when `features.unlocks` is set. */
344
+ unlocks?: Unlocks;
250
345
  economy: GameContextEconomy;
251
- leaderboard: Leaderboard;
252
- roster: Roster;
346
+ /** Competitive score tracking — present only when `features.leaderboard` is set. */
347
+ leaderboard?: Leaderboard;
348
+ /** Owned-entity roster — present only when `features.roster` is set. */
349
+ roster?: Roster;
253
350
  /** Game-defined keyed reactive store slot (#163.1); mutations bump `ctx.version()`/notify `ctx.subscribe`. */
254
351
  store: ObservableKeyedStore<unknown>;
255
- cards: GameContextCards;
256
- turn: GameContextTurn;
257
- race: GameContextRace;
352
+ /** Card pile zones — present only when `features.cards` is set. */
353
+ cards?: GameContextCards;
354
+ /** Turn/phase loop — present only when `features.turn` is set. */
355
+ turn?: GameContextTurn;
356
+ /** Lap/checkpoint race state — present only when `features.race` is set. */
357
+ race?: GameContextRace;
358
+ /** Connected-player set for a shared world — present only when `features.players` is set. */
359
+ players?: ConnectedPlayers;
360
+ /** Whole-world save/load bound to a pluggable backend — present only when `defineGame({ save })` is set (offline/single-player). Drive save points and quest/area checkpoints with `checkpoint()`, restore on boot with `load()`. */
361
+ save?: RuntimeSave;
362
+ /**
363
+ * Register a save-only snapshot module after boot (system-owned persistence).
364
+ * Used by `composeGameLoop` / `installSystems` when a system declares `save`.
365
+ */
366
+ registerSave?(module: SnapshotModule): void;
367
+ /**
368
+ * Register a host→client replication module after boot (system-owned replication).
369
+ * Used by `composeGameLoop` / `installSystems` when a system declares `replicate`.
370
+ */
371
+ registerReplicate?(module: SnapshotModule): void;
258
372
  };
259
373
  player: {
374
+ /** The acting player's id — the command actor inside `runAs`, the local player everywhere else. */
260
375
  userId: string;
261
376
  isNew: boolean;
377
+ /** The acting player's inventory set — the command actor's bags inside `runAs`, the local player's everywhere else. */
262
378
  inventory: InventorySet<string>;
379
+ /** A specific player's inventory set — how a host reads or grants into any connected player's bags. */
380
+ inventoryFor(userId: string): InventorySet<string>;
381
+ /** The acting player's stat modifiers — the command actor's inside `runAs`, the local player's everywhere else. */
263
382
  stats: Stats<string>;
383
+ /** A specific player's stat modifiers — how a host reads or buffs any connected player's stats. */
384
+ statsFor(userId: string): Stats<string>;
264
385
  loadout: Loadouts;
265
386
  applyLoadout(userId: string, loadoutId: string): {
266
387
  reason: string;
267
388
  } | null;
268
389
  movement: PoseState;
269
390
  possession: Possession;
270
- cosmetics: Cosmetics;
271
- /** Vertical-motion seam into the shell-owned FrameDriver (#162.4); see `MotionIntents`. */
391
+ /** Cosmetic skins/customization — present only when `features.cosmetics` is set. */
392
+ cosmetics?: Cosmetics;
393
+ /** Motion seam into the movement integrator (#162.4); routes to the command actor's queue (or the local player outside a command), so a command's impulse lands on whoever ran it. See `MotionIntents`. */
272
394
  motion: MotionIntents;
395
+ /** A specific player's motion queue — how the host-side per-player movement integrator drains each connected player's impulses. */
396
+ motionFor(userId: string): MotionIntents;
273
397
  };
274
398
  item: {
275
399
  use: GameContextItemUse;
@@ -282,5 +406,25 @@ export interface GameContext {
282
406
  input: InputSnapshot;
283
407
  subscribe(listener: () => void): () => void;
284
408
  version(): number;
409
+ /**
410
+ * Bump {@link version}/notify {@link subscribe} directly — the escape hatch for a command that only
411
+ * mutates game-owned state outside the entity/object/economy/store layers (an external session map,
412
+ * a plain closure variable) and needs to force a reactive HUD refresh without faking a `ctx.game.store.set`.
413
+ */
414
+ touch(): void;
415
+ /**
416
+ * Gather every opted-in live subsystem into one {@link WorldSnapshot} — entities, entity stats, the
417
+ * keyed store, the action feed, plus leaderboard/chat when those features are on. The full-world
418
+ * baseline a host sends a joining client; {@link hydrate} is its inverse. Pass a `viewer` and the host
419
+ * projects the snapshot to only what that viewer may see (private state, area of interest) when a
420
+ * {@link GameContextOptions.replication} policy is set; without one the viewer argument is a no-op.
421
+ */
422
+ snapshot(viewer?: SnapshotViewer): WorldSnapshot;
423
+ /** Apply a {@link WorldSnapshot} from an authoritative host, hydrating each subsystem key present in it. */
424
+ hydrate(snapshot: WorldSnapshot): void;
425
+ /** Aggregate world-dirty version summed across replicated modules; the host replicator skips an unchanged commit. @internal */
426
+ replicationVersion(): number;
427
+ /** True when a {@link GameContextOptions.replication} policy makes {@link snapshot} viewer-dependent (private/AOI projection is active). @internal */
428
+ replicatesPerViewer(): boolean;
285
429
  }
286
430
  export declare function createGameContext<TAssetRef extends ModelAssetRef, TMultiplayer>(options: GameContextOptions<TAssetRef, TMultiplayer>): GameContext;