@jgengine/core 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -0,0 +1,95 @@
1
+ /** Empty history stacks for state `T`.
2
+ * @internal
3
+ */
4
+ export function emptyHistory() {
5
+ return { past: [], future: [] };
6
+ }
7
+ /** True when there is a prior state to undo to.
8
+ * @internal
9
+ */
10
+ export function canUndo(stacks) {
11
+ return stacks.past.length > 0;
12
+ }
13
+ /** True when there is an undone state to redo.
14
+ * @internal
15
+ */
16
+ export function canRedo(stacks) {
17
+ return stacks.future.length > 0;
18
+ }
19
+ /**
20
+ * Record `present` as the newest undo step and clear the redo future (a fresh action forks history).
21
+ * The oldest past entries beyond `limit` are dropped so the stack stays bounded for save/transport.
22
+ * @internal
23
+ */
24
+ export function recordSnapshot(stacks, present, limit = 100) {
25
+ const past = [...stacks.past, present];
26
+ const trimmed = limit > 0 && past.length > limit ? past.slice(past.length - limit) : past;
27
+ return { past: trimmed, future: [] };
28
+ }
29
+ /**
30
+ * Step back: pop the newest past snapshot to apply as the new present, and push the given `present`
31
+ * onto the future for a later redo. Returns `null` when there is nothing to undo.
32
+ * @internal
33
+ */
34
+ export function undoSnapshot(stacks, present) {
35
+ if (stacks.past.length === 0)
36
+ return null;
37
+ const snapshot = stacks.past[stacks.past.length - 1];
38
+ return {
39
+ snapshot,
40
+ stacks: { past: stacks.past.slice(0, -1), future: [...stacks.future, present] },
41
+ };
42
+ }
43
+ /**
44
+ * Step forward: pop the newest future snapshot to apply as the new present, and push the given
45
+ * `present` back onto the past. Returns `null` when there is nothing to redo.
46
+ * @internal
47
+ */
48
+ export function redoSnapshot(stacks, present) {
49
+ if (stacks.future.length === 0)
50
+ return null;
51
+ const snapshot = stacks.future[stacks.future.length - 1];
52
+ return {
53
+ snapshot,
54
+ stacks: { past: [...stacks.past, present], future: stacks.future.slice(0, -1) },
55
+ };
56
+ }
57
+ /**
58
+ * Stateful undo/redo handle wrapping the pure snapshot functions. Call `record(state)` before each
59
+ * mutation; `undo`/`redo` return the state to apply. `limit` bounds the past stack.
60
+ * @internal
61
+ */
62
+ export function createSnapshotHistory(limit = 100) {
63
+ let stacks = emptyHistory();
64
+ return {
65
+ record(present) {
66
+ stacks = recordSnapshot(stacks, present, limit);
67
+ },
68
+ undo(present) {
69
+ const step = undoSnapshot(stacks, present);
70
+ if (step === null)
71
+ return null;
72
+ stacks = step.stacks;
73
+ return step.snapshot;
74
+ },
75
+ redo(present) {
76
+ const step = redoSnapshot(stacks, present);
77
+ if (step === null)
78
+ return null;
79
+ stacks = step.stacks;
80
+ return step.snapshot;
81
+ },
82
+ canUndo() {
83
+ return canUndo(stacks);
84
+ },
85
+ canRedo() {
86
+ return canRedo(stacks);
87
+ },
88
+ clear() {
89
+ stacks = emptyHistory();
90
+ },
91
+ stacks() {
92
+ return stacks;
93
+ },
94
+ };
95
+ }
@@ -135,6 +135,36 @@ export interface WorldInvites {
135
135
  decline(userId: string, inviteId: string): void;
136
136
  listFor(userId: string): WorldInvite[];
137
137
  }
138
+ /** One party's replicated membership — id, current leader, and ordered member ids. */
139
+ export interface SocialPartySnapshot {
140
+ id: string;
141
+ leader: string;
142
+ members: string[];
143
+ }
144
+ /**
145
+ * Full friends/party/world-invite state as one serializable baseline — the host→client replication
146
+ * payload behind the `social` snapshot module. Presence and emotes are derived from live deps, not stored.
147
+ */
148
+ export interface SocialSnapshot {
149
+ friendships: Record<string, string[]>;
150
+ blocked: Record<string, string[]>;
151
+ friendRequests: Record<string, {
152
+ from: string;
153
+ to: string;
154
+ }>;
155
+ requestCounter: number;
156
+ partyConfig: PartyConfig | null;
157
+ parties: SocialPartySnapshot[];
158
+ partyInvites: Record<string, {
159
+ from: string;
160
+ to: string;
161
+ createdAt: number;
162
+ }>;
163
+ partyCounter: number;
164
+ inviteCounter: number;
165
+ worldInvites: WorldInvite[];
166
+ worldInviteCounter: number;
167
+ }
138
168
  export interface Social {
139
169
  friends: Friends;
140
170
  party: Party;
@@ -143,5 +173,12 @@ export interface Social {
143
173
  };
144
174
  emotes: Emotes;
145
175
  worldInvites: WorldInvites;
146
- }
176
+ snapshot(): SocialSnapshot;
177
+ hydrate(data: SocialSnapshot): void;
178
+ }
179
+ /**
180
+ * Emotes and lightweight social interactions between nearby players.
181
+ *
182
+ * @capability social-emotes emotes and social interactions between nearby players
183
+ */
147
184
  export declare function createSocial(deps: SocialDeps): Social;
@@ -1,5 +1,10 @@
1
1
  export const DEFAULT_EMOTE_RADIUS = 20;
2
2
  const DEFAULT_INVITE_TTL_MS = 60_000;
3
+ /**
4
+ * Emotes and lightweight social interactions between nearby players.
5
+ *
6
+ * @capability social-emotes emotes and social interactions between nearby players
7
+ */
3
8
  export function createSocial(deps) {
4
9
  const now = deps.now ?? Date.now;
5
10
  const events = deps.events;
@@ -351,6 +356,70 @@ export function createSocial(deps) {
351
356
  return result;
352
357
  },
353
358
  };
359
+ function snapshot() {
360
+ const friendshipsOut = {};
361
+ for (const [userId, set] of friendships)
362
+ friendshipsOut[userId] = Array.from(set);
363
+ const blockedOut = {};
364
+ for (const [userId, set] of blocked)
365
+ blockedOut[userId] = Array.from(set);
366
+ const friendRequestsOut = {};
367
+ for (const [id, request] of friendRequests)
368
+ friendRequestsOut[id] = { from: request.from, to: request.to };
369
+ const partyInvitesOut = {};
370
+ for (const [id, invite] of partyInvites) {
371
+ partyInvitesOut[id] = { from: invite.from, to: invite.to, createdAt: invite.createdAt };
372
+ }
373
+ return {
374
+ friendships: friendshipsOut,
375
+ blocked: blockedOut,
376
+ friendRequests: friendRequestsOut,
377
+ requestCounter,
378
+ partyConfig,
379
+ parties: Array.from(parties.values(), (state) => ({
380
+ id: state.id,
381
+ leader: state.leader,
382
+ members: state.members.slice(),
383
+ })),
384
+ partyInvites: partyInvitesOut,
385
+ partyCounter,
386
+ inviteCounter,
387
+ worldInvites: Array.from(worldInviteEntries.values(), (entry) => ({ ...entry })),
388
+ worldInviteCounter,
389
+ };
390
+ }
391
+ function hydrate(data) {
392
+ friendships.clear();
393
+ for (const [userId, list] of Object.entries(data.friendships))
394
+ friendships.set(userId, new Set(list));
395
+ blocked.clear();
396
+ for (const [userId, list] of Object.entries(data.blocked))
397
+ blocked.set(userId, new Set(list));
398
+ friendRequests.clear();
399
+ for (const [id, request] of Object.entries(data.friendRequests)) {
400
+ friendRequests.set(id, { from: request.from, to: request.to });
401
+ }
402
+ requestCounter = data.requestCounter;
403
+ partyConfig = data.partyConfig;
404
+ parties.clear();
405
+ memberToParty.clear();
406
+ for (const state of data.parties) {
407
+ const restored = { id: state.id, leader: state.leader, members: state.members.slice() };
408
+ parties.set(restored.id, restored);
409
+ for (const member of restored.members)
410
+ memberToParty.set(member, restored.id);
411
+ }
412
+ partyInvites.clear();
413
+ for (const [id, invite] of Object.entries(data.partyInvites)) {
414
+ partyInvites.set(id, { from: invite.from, to: invite.to, createdAt: invite.createdAt });
415
+ }
416
+ partyCounter = data.partyCounter;
417
+ inviteCounter = data.inviteCounter;
418
+ worldInviteEntries.clear();
419
+ for (const entry of data.worldInvites)
420
+ worldInviteEntries.set(entry.id, { ...entry });
421
+ worldInviteCounter = data.worldInviteCounter;
422
+ }
354
423
  return {
355
424
  friends,
356
425
  party,
@@ -361,5 +430,7 @@ export function createSocial(deps) {
361
430
  },
362
431
  emotes,
363
432
  worldInvites,
433
+ snapshot,
434
+ hydrate,
364
435
  };
365
436
  }
@@ -16,4 +16,9 @@ export interface SpawnPoints {
16
16
  })[];
17
17
  respawn(entities: RespawnTarget, entityId: string, spawnId: string): boolean;
18
18
  }
19
+ /**
20
+ * Register spawn locations and choose where entities spawn or respawn.
21
+ *
22
+ * @capability spawn-points register spawn locations and pick where entities respawn
23
+ */
19
24
  export declare function createSpawnPoints(): SpawnPoints;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Register spawn locations and choose where entities spawn or respawn.
3
+ *
4
+ * @capability spawn-points register spawn locations and pick where entities respawn
5
+ */
1
6
  export function createSpawnPoints() {
2
7
  const points = new Map();
3
8
  return {
@@ -0,0 +1,50 @@
1
+ import type { GameLoop } from "./defineGame.js";
2
+ import type { SystemDefinition } from "./defineSystem.js";
3
+ import { type CompiledSystemSchedule, type CompileSystemScheduleOptions } from "./systemSchedule.js";
4
+ import type { GameContext } from "../runtime/gameContext.js";
5
+ import type { SnapshotModule } from "../runtime/worldSnapshot.js";
6
+ /** @internal */
7
+ export interface SystemModuleRegistration {
8
+ registerSave(module: SnapshotModule): void;
9
+ registerReplicate(module: SnapshotModule): void;
10
+ }
11
+ /** @internal */
12
+ export interface InstalledSystems {
13
+ readonly schedule: CompiledSystemSchedule;
14
+ /** Advance fixed/frame/interval systems for one game-time step of `dt` seconds. */
15
+ tick(ctx: GameContext, dt: number): void;
16
+ /** Invoke every system's `reset` (scenario/run wipe). */
17
+ reset(ctx: GameContext): void;
18
+ /** Invoke every system's `dispose` in reverse install order. */
19
+ dispose(ctx: GameContext): void;
20
+ /** Run one manual system by id (no-op if missing or not manual). */
21
+ runManual(ctx: GameContext, id: string, dt?: number): void;
22
+ }
23
+ /**
24
+ * Install systems on a live context: `create` → bind events → register save/replicate → `start`.
25
+ * Call once per world boot (from the composed loop's `onInit`).
26
+ * @internal
27
+ */
28
+ export declare function installSystems(ctx: GameContext, systems: readonly SystemDefinition[], options?: CompileSystemScheduleOptions & {
29
+ modules?: SystemModuleRegistration;
30
+ }): InstalledSystems;
31
+ /**
32
+ * Look up systems installed on `ctx` (if any). Used by hosts that need `reset`/`dispose` after boot.
33
+ * @internal
34
+ */
35
+ export declare function systemsOf(ctx: GameContext): InstalledSystems | undefined;
36
+ /** @internal */
37
+ export interface ComposeGameLoopOptions extends CompileSystemScheduleOptions {
38
+ /**
39
+ * When true, the user loop's `onTick` runs before system ticks (default: systems first, then
40
+ * residual loop work — the incremental-migration path).
41
+ */
42
+ loopBeforeSystems?: boolean;
43
+ }
44
+ /**
45
+ * Merge a system list with an optional classic `GameLoop` into one loop the shell/runners drive.
46
+ * Systems install on first `onInit`; classic hooks still run for incremental migration.
47
+ *
48
+ * @capability compose-game-loop fold composable systems into the game loop without a manual tick fan-out
49
+ */
50
+ export declare function composeGameLoop(systems: readonly SystemDefinition[] | undefined, loop: GameLoop<GameContext> | undefined, options?: ComposeGameLoopOptions): GameLoop<GameContext>;
@@ -0,0 +1,157 @@
1
+ import { compileSystemSchedule, } from "./systemSchedule.js";
2
+ function resolveModule(spec, ctx) {
3
+ if (spec === undefined)
4
+ return undefined;
5
+ return typeof spec === "function" ? spec(ctx) : spec;
6
+ }
7
+ /**
8
+ * Install systems on a live context: `create` → bind events → register save/replicate → `start`.
9
+ * Call once per world boot (from the composed loop's `onInit`).
10
+ * @internal
11
+ */
12
+ export function installSystems(ctx, systems, options) {
13
+ const schedule = compileSystemSchedule(systems, options);
14
+ const list = systems;
15
+ const unsubs = [];
16
+ const intervalAcc = new Map();
17
+ const fixedAcc = new Map();
18
+ for (const system of list) {
19
+ system.create?.(ctx);
20
+ }
21
+ for (const system of list) {
22
+ if (system.events !== undefined) {
23
+ for (const [name, handler] of Object.entries(system.events)) {
24
+ if (handler === undefined)
25
+ continue;
26
+ const off = ctx.game.events.on(name, ((event) => {
27
+ handler(ctx, event);
28
+ }));
29
+ unsubs.push(off);
30
+ }
31
+ }
32
+ const save = resolveModule(system.save, ctx);
33
+ if (save !== undefined)
34
+ options?.modules?.registerSave(save);
35
+ const replicate = resolveModule(system.replicate, ctx);
36
+ if (replicate !== undefined)
37
+ options?.modules?.registerReplicate(replicate);
38
+ }
39
+ for (const system of list) {
40
+ system.start?.(ctx);
41
+ }
42
+ for (const group of schedule.fixed) {
43
+ fixedAcc.set(group.rate, 0);
44
+ }
45
+ for (const interval of schedule.intervals) {
46
+ intervalAcc.set(interval.id, 0);
47
+ }
48
+ function runIds(ctx, ids, dt) {
49
+ for (const id of ids) {
50
+ schedule.systemsById.get(id)?.update?.(ctx, dt);
51
+ }
52
+ }
53
+ function tick(ctx, dt) {
54
+ if (!(dt > 0))
55
+ return;
56
+ for (const group of schedule.fixed) {
57
+ const step = 1 / group.rate;
58
+ let acc = (fixedAcc.get(group.rate) ?? 0) + dt;
59
+ while (acc >= step) {
60
+ runIds(ctx, group.order, step);
61
+ acc -= step;
62
+ }
63
+ fixedAcc.set(group.rate, acc);
64
+ }
65
+ runIds(ctx, schedule.frameOrder, dt);
66
+ for (const interval of schedule.intervals) {
67
+ const every = interval.every ?? 1;
68
+ let acc = (intervalAcc.get(interval.id) ?? 0) + dt;
69
+ while (acc >= every) {
70
+ schedule.systemsById.get(interval.id)?.update?.(ctx, every);
71
+ acc -= every;
72
+ }
73
+ intervalAcc.set(interval.id, acc);
74
+ }
75
+ }
76
+ function reset(ctx) {
77
+ for (const system of list)
78
+ system.reset?.(ctx);
79
+ for (const group of schedule.fixed)
80
+ fixedAcc.set(group.rate, 0);
81
+ for (const interval of schedule.intervals)
82
+ intervalAcc.set(interval.id, 0);
83
+ }
84
+ function dispose(ctx) {
85
+ for (const off of unsubs)
86
+ off();
87
+ unsubs.length = 0;
88
+ for (let i = list.length - 1; i >= 0; i -= 1) {
89
+ list[i]?.dispose?.(ctx);
90
+ }
91
+ }
92
+ function runManual(ctx, id, dt = 0) {
93
+ if (!schedule.manual.includes(id))
94
+ return;
95
+ schedule.systemsById.get(id)?.update?.(ctx, dt);
96
+ }
97
+ return { schedule, tick, reset, dispose, runManual };
98
+ }
99
+ const installedByCtx = new WeakMap();
100
+ /**
101
+ * Look up systems installed on `ctx` (if any). Used by hosts that need `reset`/`dispose` after boot.
102
+ * @internal
103
+ */
104
+ export function systemsOf(ctx) {
105
+ return installedByCtx.get(ctx);
106
+ }
107
+ /**
108
+ * Merge a system list with an optional classic `GameLoop` into one loop the shell/runners drive.
109
+ * Systems install on first `onInit`; classic hooks still run for incremental migration.
110
+ *
111
+ * @capability compose-game-loop fold composable systems into the game loop without a manual tick fan-out
112
+ */
113
+ export function composeGameLoop(systems, loop, options) {
114
+ if (systems === undefined || systems.length === 0) {
115
+ return loop ?? {};
116
+ }
117
+ let installed;
118
+ const loopBefore = options?.loopBeforeSystems === true;
119
+ return {
120
+ onInit(ctx) {
121
+ const modules = ctx.game.registerSave !== undefined && ctx.game.registerReplicate !== undefined
122
+ ? {
123
+ registerSave: (m) => ctx.game.registerSave(m),
124
+ registerReplicate: (m) => ctx.game.registerReplicate(m),
125
+ }
126
+ : undefined;
127
+ installed = installSystems(ctx, systems, { ...options, modules });
128
+ installedByCtx.set(ctx, installed);
129
+ loop?.onInit?.(ctx);
130
+ },
131
+ onNewPlayer(ctx, player) {
132
+ loop?.onNewPlayer?.(ctx, player);
133
+ },
134
+ onTick(ctx, dt) {
135
+ if (loopBefore) {
136
+ loop?.onTick?.(ctx, dt);
137
+ installed?.tick(ctx, dt);
138
+ }
139
+ else {
140
+ installed?.tick(ctx, dt);
141
+ loop?.onTick?.(ctx, dt);
142
+ }
143
+ },
144
+ onPlayerLeave(ctx, player) {
145
+ loop?.onPlayerLeave?.(ctx, player);
146
+ },
147
+ onReset(ctx) {
148
+ installed?.reset(ctx);
149
+ loop?.onReset?.(ctx);
150
+ },
151
+ onDispose(ctx) {
152
+ installed?.dispose(ctx);
153
+ installedByCtx.delete(ctx);
154
+ loop?.onDispose?.(ctx);
155
+ },
156
+ };
157
+ }
@@ -0,0 +1,72 @@
1
+ import type { SystemDefinition } from "./defineSystem.js";
2
+ /** Default fixed-sim stage order — systems pick a stage; most need only this. */
3
+ export declare const DEFAULT_FIXED_STAGES: readonly ["input", "movement", "combat", "ai", "activities", "cleanup"];
4
+ /**
5
+ * Default frame stage order. Gameplay stages mirror the fixed table so once-per-frame systems
6
+ * (`type: "frame"`) can pick `combat`/`ai`/… without falling into the unknown-stage bucket;
7
+ * presentation stages follow.
8
+ */
9
+ export declare const DEFAULT_FRAME_STAGES: readonly ["input", "movement", "combat", "ai", "activities", "cleanup", "animation", "camera", "effects"];
10
+ /** @internal */
11
+ export type TimingChannel = "fixed" | "frame" | "interval" | "manual" | "event";
12
+ /** @internal */
13
+ export interface ScheduledSystem {
14
+ readonly id: string;
15
+ readonly channel: TimingChannel;
16
+ readonly stage: string;
17
+ readonly rate?: number;
18
+ readonly every?: number;
19
+ readonly after: readonly string[];
20
+ readonly before: readonly string[];
21
+ readonly dependsOn: readonly string[];
22
+ }
23
+ /** @internal */
24
+ export interface StageBucket {
25
+ readonly stage: string;
26
+ /** System ids in deterministic order within this stage. */
27
+ readonly systems: readonly string[];
28
+ }
29
+ /** @internal */
30
+ export interface FixedRateGroup {
31
+ readonly rate: number;
32
+ readonly stages: readonly StageBucket[];
33
+ /** Flat ordered ids for this rate (all stages). */
34
+ readonly order: readonly string[];
35
+ }
36
+ /**
37
+ * Deterministic compiled schedule: stage buckets, multi-subscribe channels, dependency validation.
38
+ * Order never depends on import order — only stage tables + explicit before/after constraints.
39
+ */
40
+ export interface CompiledSystemSchedule {
41
+ readonly systemsById: ReadonlyMap<string, SystemDefinition>;
42
+ readonly scheduled: readonly ScheduledSystem[];
43
+ /** Fixed-sim groups keyed by rate (Hz); multiple systems may share a rate. */
44
+ readonly fixed: readonly FixedRateGroup[];
45
+ readonly frame: readonly StageBucket[];
46
+ readonly frameOrder: readonly string[];
47
+ /** Interval systems — each keeps its own period; multi-subscribe is per-system. */
48
+ readonly intervals: readonly ScheduledSystem[];
49
+ readonly manual: readonly string[];
50
+ readonly eventOnly: readonly string[];
51
+ /** All auto-ticking systems in a diagnostic flat order (fixed rates → frame → intervals). */
52
+ readonly tickOrder: readonly string[];
53
+ }
54
+ /** @internal */
55
+ export interface CompileSystemScheduleOptions {
56
+ fixedStages?: readonly string[];
57
+ frameStages?: readonly string[];
58
+ defaultFixedRate?: number;
59
+ }
60
+ /**
61
+ * Topological sort with a stable tie-break on original declaration index, then id.
62
+ * Edges: `after: "x"` means this runs after x (x → this); `before: "y"` means this → y.
63
+ * @internal
64
+ */
65
+ export declare function orderWithConstraints(ids: readonly string[], after: ReadonlyMap<string, readonly string[]>, before: ReadonlyMap<string, readonly string[]>, indexOf: ReadonlyMap<string, number>): string[];
66
+ /**
67
+ * Compile system definitions into a deterministic schedule.
68
+ * Validates unique ids, `dependsOn`, and before/after cycles.
69
+ *
70
+ * @capability system-schedule compile fixed/frame/interval system ticks into deterministic ordered stages
71
+ */
72
+ export declare function compileSystemSchedule(systems: readonly SystemDefinition[], options?: CompileSystemScheduleOptions): CompiledSystemSchedule;