@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,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;
@@ -0,0 +1,242 @@
1
+ /** Default fixed-sim stage order — systems pick a stage; most need only this. */
2
+ export const DEFAULT_FIXED_STAGES = [
3
+ "input",
4
+ "movement",
5
+ "combat",
6
+ "ai",
7
+ "activities",
8
+ "cleanup",
9
+ ];
10
+ /**
11
+ * Default frame stage order. Gameplay stages mirror the fixed table so once-per-frame systems
12
+ * (`type: "frame"`) can pick `combat`/`ai`/… without falling into the unknown-stage bucket;
13
+ * presentation stages follow.
14
+ */
15
+ export const DEFAULT_FRAME_STAGES = [
16
+ "input",
17
+ "movement",
18
+ "combat",
19
+ "ai",
20
+ "activities",
21
+ "cleanup",
22
+ "animation",
23
+ "camera",
24
+ "effects",
25
+ ];
26
+ const DEFAULT_FIXED_RATE = 60;
27
+ function asList(value) {
28
+ if (value === undefined)
29
+ return [];
30
+ return typeof value === "string" ? [value] : value;
31
+ }
32
+ function channelOf(tick) {
33
+ if (tick === undefined)
34
+ return "event";
35
+ return tick.type;
36
+ }
37
+ function stageOf(tick, channel) {
38
+ if (tick === undefined || tick.type === "manual")
39
+ return "";
40
+ if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
41
+ return tick.stage ?? defaultStage(channel);
42
+ }
43
+ return "";
44
+ }
45
+ function defaultStage(channel) {
46
+ if (channel === "fixed")
47
+ return "combat";
48
+ if (channel === "frame")
49
+ return "effects";
50
+ if (channel === "interval")
51
+ return "activities";
52
+ return "";
53
+ }
54
+ function rateOf(tick, defaultFixedRate) {
55
+ if (tick?.type === "fixed")
56
+ return tick.rate ?? defaultFixedRate;
57
+ return undefined;
58
+ }
59
+ function everyOf(tick) {
60
+ if (tick?.type === "interval")
61
+ return tick.every;
62
+ return undefined;
63
+ }
64
+ function afterOf(tick) {
65
+ if (tick === undefined || tick.type === "manual")
66
+ return [];
67
+ if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
68
+ return asList(tick.after);
69
+ }
70
+ return [];
71
+ }
72
+ function beforeOf(tick) {
73
+ if (tick === undefined || tick.type === "manual")
74
+ return [];
75
+ if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
76
+ return asList(tick.before);
77
+ }
78
+ return [];
79
+ }
80
+ /**
81
+ * Topological sort with a stable tie-break on original declaration index, then id.
82
+ * Edges: `after: "x"` means this runs after x (x → this); `before: "y"` means this → y.
83
+ * @internal
84
+ */
85
+ export function orderWithConstraints(ids, after, before, indexOf) {
86
+ const idSet = new Set(ids);
87
+ const preds = new Map();
88
+ const succs = new Map();
89
+ for (const id of ids) {
90
+ preds.set(id, new Set());
91
+ succs.set(id, new Set());
92
+ }
93
+ const addEdge = (from, to) => {
94
+ if (!idSet.has(from) || !idSet.has(to) || from === to)
95
+ return;
96
+ succs.get(from).add(to);
97
+ preds.get(to).add(from);
98
+ };
99
+ for (const id of ids) {
100
+ for (const a of after.get(id) ?? [])
101
+ addEdge(a, id);
102
+ for (const b of before.get(id) ?? [])
103
+ addEdge(id, b);
104
+ }
105
+ const ready = ids
106
+ .filter((id) => preds.get(id).size === 0)
107
+ .sort((a, b) => {
108
+ const ia = indexOf.get(a) ?? 0;
109
+ const ib = indexOf.get(b) ?? 0;
110
+ if (ia !== ib)
111
+ return ia - ib;
112
+ return a < b ? -1 : a > b ? 1 : 0;
113
+ });
114
+ const ordered = [];
115
+ while (ready.length > 0) {
116
+ const next = ready.shift();
117
+ ordered.push(next);
118
+ for (const succ of succs.get(next) ?? []) {
119
+ const set = preds.get(succ);
120
+ set.delete(next);
121
+ if (set.size === 0) {
122
+ ready.push(succ);
123
+ ready.sort((a, b) => {
124
+ const ia = indexOf.get(a) ?? 0;
125
+ const ib = indexOf.get(b) ?? 0;
126
+ if (ia !== ib)
127
+ return ia - ib;
128
+ return a < b ? -1 : a > b ? 1 : 0;
129
+ });
130
+ }
131
+ }
132
+ }
133
+ if (ordered.length !== ids.length) {
134
+ const leftover = ids.filter((id) => !ordered.includes(id));
135
+ throw new Error(`system schedule: cyclic before/after constraints among: ${leftover.join(", ")}`);
136
+ }
137
+ return ordered;
138
+ }
139
+ function bucketByStage(items, stageOrder, indexOf) {
140
+ const stageIndex = new Map();
141
+ stageOrder.forEach((s, i) => stageIndex.set(s, i));
142
+ const unknownStages = new Set();
143
+ for (const item of items) {
144
+ if (item.stage !== "" && !stageIndex.has(item.stage))
145
+ unknownStages.add(item.stage);
146
+ }
147
+ const stages = [...stageOrder, ...[...unknownStages].sort()];
148
+ const buckets = [];
149
+ for (const stage of stages) {
150
+ const inStage = items.filter((s) => s.stage === stage);
151
+ if (inStage.length === 0)
152
+ continue;
153
+ const after = new Map();
154
+ const before = new Map();
155
+ for (const s of inStage) {
156
+ after.set(s.id, s.after);
157
+ before.set(s.id, s.before);
158
+ }
159
+ const order = orderWithConstraints(inStage.map((s) => s.id), after, before, indexOf);
160
+ buckets.push({ stage, systems: order });
161
+ }
162
+ return buckets;
163
+ }
164
+ /**
165
+ * Compile system definitions into a deterministic schedule.
166
+ * Validates unique ids, `dependsOn`, and before/after cycles.
167
+ *
168
+ * @capability system-schedule compile fixed/frame/interval system ticks into deterministic ordered stages
169
+ */
170
+ export function compileSystemSchedule(systems, options) {
171
+ const fixedStages = options?.fixedStages ?? DEFAULT_FIXED_STAGES;
172
+ const frameStages = options?.frameStages ?? DEFAULT_FRAME_STAGES;
173
+ const defaultFixedRate = options?.defaultFixedRate ?? DEFAULT_FIXED_RATE;
174
+ const systemsById = new Map();
175
+ const indexOf = new Map();
176
+ systems.forEach((system, index) => {
177
+ if (systemsById.has(system.id)) {
178
+ throw new Error(`system schedule: duplicate system id "${system.id}"`);
179
+ }
180
+ systemsById.set(system.id, system);
181
+ indexOf.set(system.id, index);
182
+ });
183
+ for (const system of systems) {
184
+ for (const dep of system.dependsOn ?? []) {
185
+ if (!systemsById.has(dep)) {
186
+ throw new Error(`system schedule: "${system.id}" dependsOn unknown system "${dep}"`);
187
+ }
188
+ }
189
+ }
190
+ const scheduled = systems.map((system) => {
191
+ const channel = channelOf(system.tick);
192
+ return {
193
+ id: system.id,
194
+ channel,
195
+ stage: stageOf(system.tick, channel),
196
+ rate: rateOf(system.tick, defaultFixedRate),
197
+ every: everyOf(system.tick),
198
+ after: afterOf(system.tick),
199
+ before: beforeOf(system.tick),
200
+ dependsOn: system.dependsOn ?? [],
201
+ };
202
+ });
203
+ const fixedItems = scheduled.filter((s) => s.channel === "fixed");
204
+ const rates = [...new Set(fixedItems.map((s) => s.rate ?? defaultFixedRate))].sort((a, b) => b - a);
205
+ const fixed = rates.map((rate) => {
206
+ const group = fixedItems.filter((s) => (s.rate ?? defaultFixedRate) === rate);
207
+ const stages = bucketByStage(group, fixedStages, indexOf);
208
+ return {
209
+ rate,
210
+ stages,
211
+ order: stages.flatMap((b) => b.systems),
212
+ };
213
+ });
214
+ const frameItems = scheduled.filter((s) => s.channel === "frame");
215
+ const frame = bucketByStage(frameItems, frameStages, indexOf);
216
+ const frameOrder = frame.flatMap((b) => b.systems);
217
+ const intervals = scheduled.filter((s) => s.channel === "interval");
218
+ // Stable order for intervals: stage buckets then constraints across all interval systems
219
+ const intervalBuckets = bucketByStage(intervals, fixedStages, indexOf);
220
+ const intervalOrder = intervalBuckets.flatMap((b) => b.systems);
221
+ const intervalsOrdered = intervalOrder.map((id) => intervals.find((s) => s.id === id));
222
+ const manual = scheduled.filter((s) => s.channel === "manual").map((s) => s.id);
223
+ const eventOnly = scheduled
224
+ .filter((s) => s.channel === "event")
225
+ .map((s) => s.id);
226
+ const tickOrder = [
227
+ ...fixed.flatMap((g) => g.order),
228
+ ...frameOrder,
229
+ ...intervalOrder,
230
+ ];
231
+ return {
232
+ systemsById,
233
+ scheduled,
234
+ fixed,
235
+ frame,
236
+ frameOrder,
237
+ intervals: intervalsOrdered,
238
+ manual,
239
+ eventOnly,
240
+ tickOrder,
241
+ };
242
+ }
@@ -0,0 +1,43 @@
1
+ /** A transient HUD message that expires on its own — banner, pickup note, alert. */
2
+ export interface Toast<T = string> {
3
+ /** Stable id for keying in a UI list. */
4
+ id: string;
5
+ /** Message payload (a string, or any structured content the HUD renders). */
6
+ body: T;
7
+ /** Wall-clock time (seconds) after which the toast should be dropped. */
8
+ expiresAt: number;
9
+ }
10
+ /**
11
+ * Append `toast`, keeping only the newest `cap` entries.
12
+ *
13
+ * @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
14
+ */
15
+ export declare function appendToast<T>(toasts: readonly Toast<T>[], toast: Toast<T>, cap: number): readonly Toast<T>[];
16
+ /** Drop every toast whose `expiresAt` is at or before `now`. Returns the same array when nothing expired. */
17
+ export declare function pruneToasts<T>(toasts: readonly Toast<T>[], now: number): readonly Toast<T>[];
18
+ /** Stateful transient-toast list with a size cap and time-to-live eviction. */
19
+ export interface ToastQueue<T = string> {
20
+ /** Raise a toast at `now` living `ttlSeconds` (falling back to the queue default); returns it. */
21
+ push(body: T, now: number, ttlSeconds?: number): Toast<T>;
22
+ /** Evict toasts that have expired as of `now`. */
23
+ prune(now: number): void;
24
+ /** Current live toasts, oldest first. */
25
+ list(): readonly Toast<T>[];
26
+ /** Remove all toasts. */
27
+ clear(): void;
28
+ }
29
+ /** Options for {@link createToastQueue}. */
30
+ export interface ToastQueueOptions {
31
+ /** Maximum toasts retained; older ones fall off. Defaults to 4. */
32
+ cap?: number;
33
+ /** Default lifetime in seconds when `push` is not given one. Defaults to 3. */
34
+ ttlSeconds?: number;
35
+ }
36
+ /**
37
+ * A capped, self-expiring toast queue — the append-with-limit plus TTL-prune list every HUD hand-rolled
38
+ * on top of a plain array. Feed it game time: `push` raises a message, `prune(now)` drops expired ones,
39
+ * `list()` is what the HUD renders. Unlike the append-only event feed, toasts evict themselves.
40
+ *
41
+ * @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
42
+ */
43
+ export declare function createToastQueue<T = string>(options?: ToastQueueOptions): ToastQueue<T>;