@jgengine/core 0.10.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 (607) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/spawnDirector.d.ts +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  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/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -1,9 +1,27 @@
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
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
19
  return { kind: "ws", topology: config?.topology ?? "shared", url: config?.url, authority: config?.authority };
6
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" };
24
+ }
7
25
  export function fly(config) {
8
26
  return {
9
27
  kind: "ws",
@@ -23,8 +41,33 @@ export function lan(config) {
23
41
  }
24
42
  /** True when the adapter opts into host-authoritative world replication (`authority: "server"`). */
25
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) {
26
69
  const adapter = adapterOf(multiplayer);
27
- return adapter !== null && "authority" in adapter && adapter.authority === "server";
70
+ return adapter === null || adapter.kind === "offline";
28
71
  }
29
72
  export function offline() {
30
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[];
@@ -0,0 +1,134 @@
1
+ import { hydrateEntityStats, snapshotEntityStats, } from "../../scene/entityStats.js";
2
+ /** @internal */
3
+ export const baselineDescriptors = [
4
+ {
5
+ key: "entities",
6
+ create: (d) => ({
7
+ replicate: {
8
+ key: "entities",
9
+ snapshot: () => d.entities.snapshot(),
10
+ hydrate: (data) => d.entities.hydrate(data),
11
+ },
12
+ }),
13
+ },
14
+ {
15
+ key: "stats",
16
+ create: (d) => ({
17
+ replicate: {
18
+ key: "stats",
19
+ snapshot: () => snapshotEntityStats(d.statsByInstance),
20
+ hydrate: (data) => hydrateEntityStats(d.statsByInstance, data),
21
+ },
22
+ }),
23
+ },
24
+ {
25
+ key: "store",
26
+ create: (d) => ({
27
+ replicate: {
28
+ key: "store",
29
+ snapshot: () => d.store.snapshot(),
30
+ hydrate: (data) => d.store.hydrate(data),
31
+ },
32
+ }),
33
+ },
34
+ {
35
+ key: "feed",
36
+ create: (d) => ({
37
+ replicate: {
38
+ key: "feed",
39
+ snapshot: () => d.feed.snapshot(),
40
+ hydrate: (data) => d.feed.hydrate(data),
41
+ },
42
+ }),
43
+ },
44
+ {
45
+ key: "inventory",
46
+ create: (d) => ({
47
+ replicate: {
48
+ key: "inventory",
49
+ snapshot: () => {
50
+ const byUser = {};
51
+ for (const [userId, set] of d.inventoryByUser) {
52
+ const states = {};
53
+ for (const inventoryId of d.inventoryIds)
54
+ states[inventoryId] = set.state(inventoryId);
55
+ byUser[userId] = states;
56
+ }
57
+ return byUser;
58
+ },
59
+ hydrate: (data) => {
60
+ for (const [userId, states] of Object.entries(data)) {
61
+ const set = d.inventoryFor(userId);
62
+ for (const [inventoryId, state] of Object.entries(states))
63
+ set.replaceState(inventoryId, state);
64
+ }
65
+ },
66
+ },
67
+ }),
68
+ },
69
+ {
70
+ key: "economy",
71
+ create: (d) => ({
72
+ save: {
73
+ key: "economy",
74
+ snapshot: () => Object.fromEntries(d.wallets),
75
+ hydrate: (data) => {
76
+ d.wallets.clear();
77
+ for (const [userId, state] of Object.entries(data)) {
78
+ d.wallets.set(userId, state);
79
+ }
80
+ d.signalNotify();
81
+ },
82
+ },
83
+ }),
84
+ },
85
+ {
86
+ key: "time",
87
+ create: (d) => ({
88
+ save: {
89
+ key: "time",
90
+ snapshot: () => d.time.snapshot(),
91
+ hydrate: (data) => d.time.hydrate(data),
92
+ },
93
+ }),
94
+ },
95
+ {
96
+ key: "pose",
97
+ create: (d) => ({
98
+ save: {
99
+ key: "pose",
100
+ snapshot: () => d.pose.snapshotAll(),
101
+ hydrate: (data) => d.pose.hydrateAll(data),
102
+ },
103
+ }),
104
+ },
105
+ {
106
+ key: "possession",
107
+ create: (d) => ({
108
+ save: {
109
+ key: "possession",
110
+ snapshot: () => d.possession.snapshotAll(),
111
+ hydrate: (data) => d.possession.hydrateAll(data),
112
+ },
113
+ }),
114
+ },
115
+ {
116
+ key: "motion",
117
+ create: (d) => ({
118
+ save: {
119
+ key: "motion",
120
+ snapshot: () => {
121
+ const out = {};
122
+ for (const [userId, queue] of d.motionByUser)
123
+ out[userId] = queue.snapshot();
124
+ return out;
125
+ },
126
+ hydrate: (data) => {
127
+ for (const [userId, batch] of Object.entries(data)) {
128
+ d.motionFor(userId).hydrate(batch);
129
+ }
130
+ },
131
+ },
132
+ }),
133
+ },
134
+ ];