@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
@@ -1,52 +1,110 @@
1
1
  export type MultiplayerTopology = "shared" | "lobbies" | "private";
2
+ /**
3
+ * Where the world simulation is authoritative.
4
+ *
5
+ * - `"client"` (default when omitted) — **presence-only multiplayer**: each client runs its own `onTick` and
6
+ * syncs presence / feeds / chat. Not competitive-safe; do not treat it as a shared sim.
7
+ * - `"server"` — host-authoritative world replication: the host runs the loop; the shell mirrors the host's
8
+ * world into the local `ctx` instead of simulating locally.
9
+ *
10
+ * Prefer naming the product intent in game code: pass `authority: "server"` for shared worlds, leave unset or
11
+ * `"client"` only for co-op presence / lobbies that intentionally tick independently.
12
+ */
13
+ export type MultiplayerAuthority = "server" | "client";
2
14
  export type MultiplayerAdapterConfig = {
3
15
  kind: "convex";
4
16
  topology?: MultiplayerTopology;
17
+ authority?: MultiplayerAuthority;
5
18
  } | {
6
19
  kind: "ws";
7
20
  topology?: MultiplayerTopology;
8
21
  url?: string;
22
+ authority?: MultiplayerAuthority;
9
23
  } | {
10
24
  kind: "socketio";
11
25
  topology?: MultiplayerTopology;
12
26
  url?: string;
27
+ authority?: MultiplayerAuthority;
13
28
  } | {
14
29
  kind: "p2p";
15
30
  topology?: MultiplayerTopology;
16
31
  room?: string;
32
+ authority?: MultiplayerAuthority;
17
33
  } | {
18
34
  kind: "lan";
19
35
  topology?: MultiplayerTopology;
20
36
  port?: number;
21
37
  path?: string;
38
+ authority?: MultiplayerAuthority;
22
39
  } | {
23
40
  kind: "offline";
24
41
  };
42
+ /**
43
+ * Convex transport. Omitting `authority` (or passing `"client"`) is **presence-only** — prefer
44
+ * `convexPresence()` to name that intent explicitly. Pass `{ authority: "server" }` for a shared,
45
+ * host-authoritative world — see `examples/HOSTED.md`.
46
+ */
25
47
  export declare function convex(config?: {
26
48
  topology?: MultiplayerTopology;
49
+ authority?: MultiplayerAuthority;
27
50
  }): MultiplayerAdapterConfig;
51
+ /** Presence-only Convex transport — each client runs its own `onTick`; only presence/feeds/chat sync. Sugar for `convex({ ...config, authority: "client" })`. */
52
+ export declare function convexPresence(config?: {
53
+ topology?: MultiplayerTopology;
54
+ }): MultiplayerAdapterConfig;
55
+ /**
56
+ * WebSocket transport. Omitting `authority` (or passing `"client"`) is **presence-only** — prefer
57
+ * `wsPresence()` to name that intent explicitly. Pass `{ authority: "server" }` for a shared,
58
+ * host-authoritative world — see `examples/HOSTED.md`.
59
+ */
28
60
  export declare function ws(config?: {
29
61
  topology?: MultiplayerTopology;
30
62
  url?: string;
63
+ authority?: MultiplayerAuthority;
64
+ }): MultiplayerAdapterConfig;
65
+ /** Presence-only WebSocket transport — each client runs its own `onTick`; only presence/feeds/chat sync. Sugar for `ws({ ...config, authority: "client" })`. */
66
+ export declare function wsPresence(config?: {
67
+ topology?: MultiplayerTopology;
68
+ url?: string;
31
69
  }): MultiplayerAdapterConfig;
32
70
  export declare function fly(config: {
33
71
  app: string;
34
72
  topology?: MultiplayerTopology;
35
73
  path?: string;
74
+ authority?: MultiplayerAuthority;
36
75
  }): MultiplayerAdapterConfig;
37
76
  export declare function socketIo(config?: {
38
77
  topology?: MultiplayerTopology;
39
78
  url?: string;
79
+ authority?: MultiplayerAuthority;
40
80
  }): MultiplayerAdapterConfig;
41
81
  export declare function p2p(config?: {
42
82
  topology?: MultiplayerTopology;
43
83
  room?: string;
84
+ authority?: MultiplayerAuthority;
44
85
  }): MultiplayerAdapterConfig;
45
86
  export declare function lan(config?: {
46
87
  topology?: MultiplayerTopology;
47
88
  port?: number;
48
89
  path?: string;
90
+ authority?: MultiplayerAuthority;
49
91
  }): MultiplayerAdapterConfig;
92
+ /** True when the adapter opts into host-authoritative world replication (`authority: "server"`). */
93
+ export declare function isServerAuthoritative(multiplayer: unknown): boolean;
94
+ /**
95
+ * Resolved authority for a multiplayer config.
96
+ * - `offline` / missing adapter → `null` (single-player; not multiplayer authority).
97
+ * - unset or `"client"` → `"client"` (presence-only; each client ticks).
98
+ * - `"server"` → host-authoritative shared sim.
99
+ */
100
+ export declare function resolveAuthority(multiplayer: unknown): MultiplayerAuthority | null;
101
+ /**
102
+ * True when multiplayer is on but the world sim is not host-authoritative — presence/feeds/chat only.
103
+ * Equivalent to `resolveAuthority(m) === "client"`.
104
+ */
105
+ export declare function isPresenceOnly(multiplayer: unknown): boolean;
106
+ /** True for a single-player world — no adapter, or an explicit `offline()` one. Gates offline-only wiring like local whole-world save. */
107
+ export declare function isOffline(multiplayer: unknown): boolean;
50
108
  export declare function offline(): MultiplayerAdapterConfig;
51
109
  export declare function adapterOf(multiplayer: unknown): MultiplayerAdapterConfig | null;
52
110
  export declare function multiplayerAdapterKind(multiplayer: unknown): string | null;
@@ -1,24 +1,73 @@
1
+ /**
2
+ * Convex transport. Omitting `authority` (or passing `"client"`) is **presence-only** — prefer
3
+ * `convexPresence()` to name that intent explicitly. Pass `{ authority: "server" }` for a shared,
4
+ * host-authoritative world — see `examples/HOSTED.md`.
5
+ */
1
6
  export function convex(config) {
2
- return { kind: "convex", topology: config?.topology ?? "shared" };
7
+ return { kind: "convex", topology: config?.topology ?? "shared", authority: config?.authority };
3
8
  }
9
+ /** Presence-only Convex transport — each client runs its own `onTick`; only presence/feeds/chat sync. Sugar for `convex({ ...config, authority: "client" })`. */
10
+ export function convexPresence(config) {
11
+ return { kind: "convex", topology: config?.topology ?? "shared", authority: "client" };
12
+ }
13
+ /**
14
+ * WebSocket transport. Omitting `authority` (or passing `"client"`) is **presence-only** — prefer
15
+ * `wsPresence()` to name that intent explicitly. Pass `{ authority: "server" }` for a shared,
16
+ * host-authoritative world — see `examples/HOSTED.md`.
17
+ */
4
18
  export function ws(config) {
5
- return { kind: "ws", topology: config?.topology ?? "shared", url: config?.url };
19
+ return { kind: "ws", topology: config?.topology ?? "shared", url: config?.url, authority: config?.authority };
20
+ }
21
+ /** Presence-only WebSocket transport — each client runs its own `onTick`; only presence/feeds/chat sync. Sugar for `ws({ ...config, authority: "client" })`. */
22
+ export function wsPresence(config) {
23
+ return { kind: "ws", topology: config?.topology ?? "shared", url: config?.url, authority: "client" };
6
24
  }
7
25
  export function fly(config) {
8
26
  return {
9
27
  kind: "ws",
10
28
  topology: config.topology ?? "shared",
11
29
  url: `wss://${config.app}.fly.dev${config.path ?? "/ws"}`,
30
+ authority: config.authority,
12
31
  };
13
32
  }
14
33
  export function socketIo(config) {
15
- return { kind: "socketio", topology: config?.topology ?? "shared", url: config?.url };
34
+ return { kind: "socketio", topology: config?.topology ?? "shared", url: config?.url, authority: config?.authority };
16
35
  }
17
36
  export function p2p(config) {
18
- return { kind: "p2p", topology: config?.topology ?? "private", room: config?.room };
37
+ return { kind: "p2p", topology: config?.topology ?? "private", room: config?.room, authority: config?.authority };
19
38
  }
20
39
  export function lan(config) {
21
- return { kind: "lan", topology: config?.topology ?? "shared", port: config?.port, path: config?.path };
40
+ return { kind: "lan", topology: config?.topology ?? "shared", port: config?.port, path: config?.path, authority: config?.authority };
41
+ }
42
+ /** True when the adapter opts into host-authoritative world replication (`authority: "server"`). */
43
+ export function isServerAuthoritative(multiplayer) {
44
+ return resolveAuthority(multiplayer) === "server";
45
+ }
46
+ /**
47
+ * Resolved authority for a multiplayer config.
48
+ * - `offline` / missing adapter → `null` (single-player; not multiplayer authority).
49
+ * - unset or `"client"` → `"client"` (presence-only; each client ticks).
50
+ * - `"server"` → host-authoritative shared sim.
51
+ */
52
+ export function resolveAuthority(multiplayer) {
53
+ const adapter = adapterOf(multiplayer);
54
+ if (adapter === null || adapter.kind === "offline")
55
+ return null;
56
+ if ("authority" in adapter && adapter.authority === "server")
57
+ return "server";
58
+ return "client";
59
+ }
60
+ /**
61
+ * True when multiplayer is on but the world sim is not host-authoritative — presence/feeds/chat only.
62
+ * Equivalent to `resolveAuthority(m) === "client"`.
63
+ */
64
+ export function isPresenceOnly(multiplayer) {
65
+ return resolveAuthority(multiplayer) === "client";
66
+ }
67
+ /** True for a single-player world — no adapter, or an explicit `offline()` one. Gates offline-only wiring like local whole-world save. */
68
+ export function isOffline(multiplayer) {
69
+ const adapter = adapterOf(multiplayer);
70
+ return adapter === null || adapter.kind === "offline";
22
71
  }
23
72
  export function offline() {
24
73
  return { kind: "offline" };
@@ -12,4 +12,5 @@ export interface CameraDirector {
12
12
  chaseTuning(): ChaseCameraTuning | null;
13
13
  subscribe(listener: () => void): () => void;
14
14
  }
15
+ /** @internal */
15
16
  export declare function createCameraDirector(): CameraDirector;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function createCameraDirector() {
2
3
  const listeners = new Set();
3
4
  let followEntity = undefined;
@@ -12,4 +12,5 @@ export type RunCommandResult = {
12
12
  ok: false;
13
13
  reason: string;
14
14
  };
15
+ /** @internal */
15
16
  export declare function runCommand<TInput>(snapshot: import("./snapshot.js").GameRuntimeSnapshot, commands: Record<string, CommandDef<TInput>>, commandName: string, input: TInput, actorUserId: string): RunCommandResult;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function runCommand(snapshot, commands, commandName, input, actorUserId) {
2
3
  const command = commands[commandName];
3
4
  if (!command) {
@@ -0,0 +1,23 @@
1
+ import type { EffectInput, EffectResult } from "../../combat/effects.js";
2
+ import { type HitReaction } from "../../combat/hitReaction.js";
3
+ import type { GameEvents } from "../../game/events.js";
4
+ import type { EntityStore } from "../../scene/entityStore.js";
5
+ import type { SimClock } from "../../time/simClock.js";
6
+ import type { FloatTextInput, HitReactionInput, TelegraphInput, VfxInput } from "../gameContext.js";
7
+ /** @internal What the combat-presentation helpers need from the live context: entity poses, the event bus, the sim clock (telegraph windups), and the raw effect application. */
8
+ export interface CombatFxDeps {
9
+ entities: EntityStore;
10
+ events: GameEvents;
11
+ time: SimClock;
12
+ applyEffect: (input: EffectInput) => EffectResult[];
13
+ }
14
+ /** @internal Combat presentation surface registered under `ctx.scene.entity`: float text, VFX bursts, telegraphs, hit reactions, and the effect wrapper that emits damage/heal float text. */
15
+ export interface CombatFx {
16
+ emitFloatText(input: FloatTextInput): void;
17
+ emitVfx(input: VfxInput): void;
18
+ fireTelegraph(input: TelegraphInput): () => void;
19
+ applyHitReaction(input: HitReactionInput): HitReaction | null;
20
+ applyEffectAndFloat(input: EffectInput): EffectResult[];
21
+ }
22
+ /** @internal */
23
+ export declare function createCombatFx(d: CombatFxDeps): CombatFx;
@@ -0,0 +1,161 @@
1
+ import { resolveHitReaction } from "../../combat/hitReaction.js";
2
+ import { pointInTelegraph } from "../../combat/telegraph.js";
3
+ /** @internal */
4
+ export function createCombatFx(d) {
5
+ const { entities, events, time } = d;
6
+ function emitFloatText(input) {
7
+ const position = input.position ??
8
+ (input.instanceId === undefined ? undefined : entities.get(input.instanceId)?.position);
9
+ if (position === undefined)
10
+ return;
11
+ const text = input.text ?? (input.amount === undefined ? "" : String(Math.round(input.amount)));
12
+ const event = {
13
+ position: [position[0], position[1], position[2]],
14
+ text,
15
+ kind: input.kind ?? "info",
16
+ };
17
+ if (input.instanceId !== undefined)
18
+ event.instanceId = input.instanceId;
19
+ if (input.amount !== undefined)
20
+ event.amount = input.amount;
21
+ if (input.hitType !== undefined)
22
+ event.hitType = input.hitType;
23
+ if (input.element !== undefined)
24
+ event.element = input.element;
25
+ if (input.crit !== undefined)
26
+ event.crit = input.crit;
27
+ if (input.scale !== undefined)
28
+ event.scale = input.scale;
29
+ events.emit("entity.floatText", event);
30
+ }
31
+ const vfxDefaultDurationMs = {
32
+ projectile: 380,
33
+ beam: 260,
34
+ nova: 520,
35
+ glow: 700,
36
+ spark: 240,
37
+ };
38
+ let vfxSeq = 0;
39
+ function resolveVfxPoint(ref) {
40
+ if (ref === undefined)
41
+ return undefined;
42
+ if (typeof ref === "string") {
43
+ const entity = entities.get(ref);
44
+ if (entity === null)
45
+ return undefined;
46
+ return [entity.position[0], entity.position[1], entity.position[2]];
47
+ }
48
+ return [ref[0], ref[1], ref[2]];
49
+ }
50
+ function emitVfx(input) {
51
+ const to = resolveVfxPoint(input.to);
52
+ const from = resolveVfxPoint(input.from) ?? to;
53
+ if (from === undefined)
54
+ return;
55
+ const event = {
56
+ id: vfxSeq++,
57
+ kind: input.kind,
58
+ color: input.color,
59
+ from,
60
+ durationMs: input.durationMs ?? vfxDefaultDurationMs[input.kind],
61
+ };
62
+ if (to !== undefined)
63
+ event.to = to;
64
+ if (input.radius !== undefined)
65
+ event.radius = input.radius;
66
+ events.emit("combat.vfx", event);
67
+ }
68
+ let telegraphSeq = 0;
69
+ function fireTelegraph(input) {
70
+ const id = telegraphSeq++;
71
+ const telegraphEvent = {
72
+ id,
73
+ shape: input.shape,
74
+ position: [input.at[0], input.at[1], input.at[2]],
75
+ windupMs: input.windupMs,
76
+ kind: input.kind ?? "danger",
77
+ };
78
+ if (input.dir !== undefined)
79
+ telegraphEvent.dir = input.dir;
80
+ events.emit("combat.telegraph", telegraphEvent);
81
+ const cancelVisual = () => events.emit("combat.telegraphCancelled", { id });
82
+ const bound = input.effect;
83
+ if (bound === undefined)
84
+ return cancelVisual;
85
+ const config = { shape: input.shape, at: input.at, windupMs: input.windupMs };
86
+ if (input.dir !== undefined)
87
+ config.dir = input.dir;
88
+ const cancelEffect = time.after(input.windupMs / 1000, () => {
89
+ const targets = entities.list().filter((entity) => pointInTelegraph(config, entity.position));
90
+ for (const target of targets) {
91
+ applyEffectAndFloat({
92
+ from: input.from,
93
+ to: target.id,
94
+ effect: bound.effect,
95
+ ...(bound.via === undefined ? {} : { via: bound.via }),
96
+ });
97
+ }
98
+ });
99
+ return () => {
100
+ cancelEffect();
101
+ cancelVisual();
102
+ };
103
+ }
104
+ function applyHitReaction(input) {
105
+ const attacker = entities.get(input.from);
106
+ const target = entities.get(input.to);
107
+ if (target === null)
108
+ return null;
109
+ const attackerPos = attacker?.position ?? target.position;
110
+ const reaction = resolveHitReaction(input.config, {
111
+ attackerPos,
112
+ targetPos: target.position,
113
+ ...(input.power === undefined ? {} : { power: input.power }),
114
+ });
115
+ entities.setPose(input.to, {
116
+ position: [
117
+ target.position[0] + reaction.impulse[0],
118
+ target.position[1] + reaction.impulse[1],
119
+ target.position[2] + reaction.impulse[2],
120
+ ],
121
+ rotationY: target.rotationY,
122
+ });
123
+ const reactionEvent = {
124
+ instanceId: input.to,
125
+ position: [target.position[0], target.position[1], target.position[2]],
126
+ hitstopMs: reaction.hitstopMs,
127
+ };
128
+ if (reaction.shake !== null)
129
+ reactionEvent.shake = reaction.shake;
130
+ if (reaction.trauma !== null)
131
+ reactionEvent.trauma = reaction.trauma;
132
+ events.emit("combat.hitReaction", reactionEvent);
133
+ return reaction;
134
+ }
135
+ function applyEffectAndFloat(input) {
136
+ const positionsBefore = new Map();
137
+ for (const entity of entities.list())
138
+ positionsBefore.set(entity.id, entity.position);
139
+ const results = d.applyEffect(input);
140
+ for (const result of results) {
141
+ let total = 0;
142
+ for (const delta of result.applied)
143
+ total += delta.delta;
144
+ if (total === 0)
145
+ continue;
146
+ const position = entities.get(result.instanceId)?.position ?? positionsBefore.get(result.instanceId);
147
+ if (position === undefined)
148
+ continue;
149
+ const magnitude = Math.abs(total);
150
+ emitFloatText({
151
+ instanceId: result.instanceId,
152
+ position: [position[0], position[1], position[2]],
153
+ text: String(Math.round(magnitude)),
154
+ kind: total < 0 ? "damage" : "heal",
155
+ amount: magnitude,
156
+ });
157
+ }
158
+ return results;
159
+ }
160
+ return { emitFloatText, emitVfx, fireTelegraph, applyHitReaction, applyEffectAndFloat };
161
+ }
@@ -0,0 +1,13 @@
1
+ import { type CardPile, type CardPileConfig } from "../../cards/cardPile.js";
2
+ import { RaceState, type RaceStateConfig } from "../../game/race.js";
3
+ import { type TurnLoop, type TurnLoopConfig } from "../../turn/turnLoop.js";
4
+ /** @internal Lazily-created, id-keyed card-pile / turn-loop / race registries shared by `ctx.game.cards|turn|race` and their save modules. */
5
+ export interface ContextRegistries {
6
+ pile(id: string, config?: CardPileConfig): CardPile;
7
+ loop(id: string, config?: TurnLoopConfig): TurnLoop;
8
+ raceState(id: string, config?: RaceStateConfig): RaceState;
9
+ cardPiles: ReadonlyMap<string, CardPile>;
10
+ turnLoops: ReadonlyMap<string, TurnLoop>;
11
+ }
12
+ /** @internal */
13
+ export declare function createContextRegistries(signalNotify: () => void): ContextRegistries;
@@ -0,0 +1,84 @@
1
+ import { createCardPile } from "../../cards/cardPile.js";
2
+ import { RaceState } from "../../game/race.js";
3
+ import { notifyAfter } from "../../store/changeSignal.js";
4
+ import { createTurnLoop } from "../../turn/turnLoop.js";
5
+ /** @internal */
6
+ export function createContextRegistries(signalNotify) {
7
+ const cardPiles = new Map();
8
+ function pile(id, config) {
9
+ const existing = cardPiles.get(id);
10
+ if (existing !== undefined)
11
+ return existing;
12
+ if (config === undefined) {
13
+ throw new Error(`cardPile "${id}" has not been created yet; pass a config on first access`);
14
+ }
15
+ const created = notifyAfter(createCardPile(config), ["shuffle", "draw", "discard", "exhaust", "move", "reset"], signalNotify);
16
+ cardPiles.set(id, created);
17
+ return created;
18
+ }
19
+ const turnLoops = new Map();
20
+ function loop(id, config) {
21
+ const existing = turnLoops.get(id);
22
+ if (existing !== undefined)
23
+ return existing;
24
+ if (config === undefined) {
25
+ throw new Error(`turn loop "${id}" has not been created yet; pass a config on first access`);
26
+ }
27
+ const raw = createTurnLoop(config);
28
+ const wrappedCommit = notifyAfter(raw.commit, ["submit", "expected", "commit", "discard", "clear"], signalNotify);
29
+ const wrapped = {
30
+ ...notifyAfter(raw, [
31
+ "setOrder",
32
+ "addParticipant",
33
+ "removeParticipant",
34
+ "advancePhase",
35
+ "advanceTurn",
36
+ "advanceRound",
37
+ "spend",
38
+ "gain",
39
+ "refill",
40
+ "restore",
41
+ ], signalNotify),
42
+ commit: wrappedCommit,
43
+ };
44
+ turnLoops.set(id, wrapped);
45
+ return wrapped;
46
+ }
47
+ class NotifyingRaceState extends RaceState {
48
+ addRacer(racerId, startTime) {
49
+ super.addRacer(racerId, startTime);
50
+ signalNotify();
51
+ }
52
+ removeRacer(racerId) {
53
+ super.removeRacer(racerId);
54
+ signalNotify();
55
+ }
56
+ reset() {
57
+ super.reset();
58
+ signalNotify();
59
+ }
60
+ eliminate(racerId) {
61
+ super.eliminate(racerId);
62
+ signalNotify();
63
+ }
64
+ update(now, positions) {
65
+ const raceEvents = super.update(now, positions);
66
+ if (raceEvents.length > 0)
67
+ signalNotify();
68
+ return raceEvents;
69
+ }
70
+ }
71
+ const raceStates = new Map();
72
+ function raceState(id, config) {
73
+ const existing = raceStates.get(id);
74
+ if (existing !== undefined)
75
+ return existing;
76
+ if (config === undefined) {
77
+ throw new Error(`race "${id}" has not been created yet; pass a config on first access`);
78
+ }
79
+ const created = new NotifyingRaceState(config);
80
+ raceStates.set(id, created);
81
+ return created;
82
+ }
83
+ return { pile, loop, raceState, cardPiles, turnLoops };
84
+ }
@@ -0,0 +1,21 @@
1
+ import type { GameEvents } from "../../game/events.js";
2
+ import { type WorldItemRecord, type WorldItemSpawnInput, type WorldItemStore } from "../../game/worldItem.js";
3
+ import type { Drop } from "../../game/lootTable.js";
4
+ import type { EntityStore } from "../../scene/entityStore.js";
5
+ import type { WorldItemPickupResult } from "../gameContext.js";
6
+ /** @internal What the ground-item surface needs from the live context: entity spawn/despawn, the event bus, loot granting, and change notification. */
7
+ export interface WorldItemContextDeps {
8
+ entities: EntityStore;
9
+ events: GameEvents;
10
+ despawnEntity: (instanceId: string) => boolean;
11
+ grantToPlayer: (userId: string, drops: Drop[], source?: string) => void;
12
+ signalNotify: () => void;
13
+ }
14
+ /** @internal The `ctx.scene.worldItem` wiring: the reactive store plus the spawn/pickup verbs that emit `worldItem.*` events and route pickups through loot. */
15
+ export interface WorldItemContext {
16
+ worldItems: WorldItemStore;
17
+ spawnWorldItem(input: WorldItemSpawnInput): WorldItemRecord;
18
+ pickupWorldItem(instanceId: string, userId: string): WorldItemPickupResult;
19
+ }
20
+ /** @internal */
21
+ export declare function createWorldItemContext(d: WorldItemContextDeps): WorldItemContext;
@@ -0,0 +1,37 @@
1
+ import { createWorldItemStore, WORLD_ITEM_ENTITY_NAME, } from "../../game/worldItem.js";
2
+ import { notifyAfter } from "../../store/changeSignal.js";
3
+ /** @internal */
4
+ export function createWorldItemContext(d) {
5
+ const worldItems = notifyAfter(createWorldItemStore({
6
+ spawnEntity: (position) => d.entities.spawn(WORLD_ITEM_ENTITY_NAME, { position, role: "prop" }),
7
+ despawnEntity: d.despawnEntity,
8
+ resolvePosition: (instanceId) => d.entities.get(instanceId)?.position,
9
+ }), ["spawn", "take", "remove"], d.signalNotify);
10
+ function spawnWorldItem(input) {
11
+ const record = worldItems.spawn(input);
12
+ d.events.emit("worldItem.dropped", {
13
+ instanceId: record.instanceId,
14
+ itemId: record.itemId,
15
+ rarity: record.rarity,
16
+ count: record.count,
17
+ position: [input.position[0], input.position[1], input.position[2]],
18
+ ...(record.source !== undefined ? { source: record.source } : {}),
19
+ });
20
+ return record;
21
+ }
22
+ function pickupWorldItem(instanceId, userId) {
23
+ const record = worldItems.take(instanceId);
24
+ if (record === null)
25
+ return { status: "rejected", reason: "not-found" };
26
+ d.grantToPlayer(userId, [{ item: record.itemId, count: record.count }], "worldItem.pickup");
27
+ d.events.emit("worldItem.picked_up", {
28
+ instanceId,
29
+ userId,
30
+ itemId: record.itemId,
31
+ rarity: record.rarity,
32
+ count: record.count,
33
+ });
34
+ return { status: "ok", record };
35
+ }
36
+ return { worldItems, spawnWorldItem, pickupWorldItem };
37
+ }
@@ -0,0 +1,48 @@
1
+ import type { WalletState } from "../../economy/wallet.js";
2
+ import type { GameFeed } from "../../game/feed.js";
3
+ import type { InventorySet } from "../../inventory/inventoryModel.js";
4
+ import type { PoseState } from "../../movement/poseState.js";
5
+ import { type StatValueMap } from "../../scene/entityStats.js";
6
+ import type { EntityStore } from "../../scene/entityStore.js";
7
+ import type { Possession } from "../../scene/possession.js";
8
+ import type { ObservableKeyedStore } from "../../store/observableKeyedStore.js";
9
+ import type { SimClock } from "../../time/simClock.js";
10
+ import type { MotionIntents } from "../motionIntents.js";
11
+ import type { SnapshotModule } from "../worldSnapshot.js";
12
+ /** @internal The live always-on subsystems the baseline descriptors serialize — handed in by `createGameContext`. */
13
+ export interface BaselineDeps {
14
+ signalNotify: () => void;
15
+ entities: EntityStore;
16
+ statsByInstance: Map<string, StatValueMap>;
17
+ store: ObservableKeyedStore<unknown>;
18
+ feed: GameFeed;
19
+ inventoryIds: readonly string[];
20
+ inventoryByUser: ReadonlyMap<string, InventorySet<string>>;
21
+ inventoryFor: (userId: string) => InventorySet<string>;
22
+ wallets: Map<string, WalletState>;
23
+ time: SimClock;
24
+ pose: PoseState;
25
+ possession: Possession;
26
+ motionByUser: ReadonlyMap<string, MotionIntents>;
27
+ motionFor: (userId: string) => MotionIntents;
28
+ }
29
+ /** @internal What an always-on baseline descriptor contributes: a replication module, a save-only module, or both. */
30
+ export interface BaselineBuild {
31
+ /** Registered into the host→client replication set (`ctx.snapshot`/`ctx.hydrate`), and therefore also into the save set. */
32
+ replicate?: SnapshotModule;
33
+ /** Registered into the whole-world save-only set (`ctx.game.save`) — persisted but never sent to clients. */
34
+ save?: SnapshotModule;
35
+ }
36
+ /**
37
+ * Always-on counterpart to {@link featureDescriptors}: each baseline subsystem (entities, stats,
38
+ * store, feed, inventory, economy, time, pose, possession, motion) owns its own serialization here
39
+ * instead of `createGameContext` hand-maintaining two distant module arrays. Order is
40
+ * load-bearing — it fixes the snapshot key order, so it must stay stable.
41
+ * @internal
42
+ */
43
+ export interface BaselineDescriptor {
44
+ readonly key: string;
45
+ create(deps: BaselineDeps): BaselineBuild;
46
+ }
47
+ /** @internal */
48
+ export declare const baselineDescriptors: readonly BaselineDescriptor[];