@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,291 @@
1
+ import { createBodyBind } from "../../scene/bodyBind.js";
2
+ import { createEntityStatsApi, seedStatValues, } from "../../scene/entityStats.js";
3
+ import { createEntityStore, } from "../../scene/entityStore.js";
4
+ import { createForms } from "../../scene/form.js";
5
+ import { fittedEntityColliders, fittedObjectColliders, scaledEntityColliders, scaledObjectColliders, } from "../../scene/colliders.js";
6
+ import { raycastObjects, raycastObjectsAll } from "../../scene/objectQuery.js";
7
+ import { createObjectStore, objectVisualScale } from "../../scene/objectStore.js";
8
+ import { createPaintLayer } from "../../scene/paintLayer.js";
9
+ import { createSelectionSet } from "../../scene/selection.js";
10
+ import { createSceneRaycast, } from "../../scene/sceneRaycast.js";
11
+ import { createSpatialApi } from "../../scene/spatial.js";
12
+ import { createTargeting } from "../../scene/targeting.js";
13
+ import { notifyAfter } from "../../store/changeSignal.js";
14
+ /** @internal */
15
+ export function createSceneSubsystem(d) {
16
+ const { content, signalNotify, ground, events, time, occluder } = d;
17
+ const entities = createEntityStore();
18
+ const objects = createObjectStore();
19
+ entities.subscribe(signalNotify);
20
+ objects.subscribe(signalNotify);
21
+ const statsByInstance = new Map();
22
+ const entityStats = notifyAfter(createEntityStatsApi((instanceId) => statsByInstance.get(instanceId)), ["set", "delta"], signalNotify);
23
+ function ensureInstanceStats(instanceId) {
24
+ let map = statsByInstance.get(instanceId);
25
+ if (map === undefined) {
26
+ map = {};
27
+ statsByInstance.set(instanceId, map);
28
+ }
29
+ return map;
30
+ }
31
+ function catalogEntry(instanceId) {
32
+ const entity = entities.get(instanceId);
33
+ return entity === null ? undefined : content.entityById?.(entity.name);
34
+ }
35
+ function catalogObject(instanceId) {
36
+ const object = objects.get(instanceId);
37
+ return object === null ? undefined : content.objectById?.(object.catalogId);
38
+ }
39
+ let spatialGeneration = 0;
40
+ const candidateIds = [];
41
+ let candidateIdsDirty = true;
42
+ function refreshCandidateIds() {
43
+ if (!candidateIdsDirty)
44
+ return candidateIds;
45
+ candidateIds.length = 0;
46
+ for (const entity of entities.list())
47
+ candidateIds.push(entity.id);
48
+ candidateIdsDirty = false;
49
+ return candidateIds;
50
+ }
51
+ const spatial = createSpatialApi({
52
+ resolvePosition: (instanceId) => entities.get(instanceId)?.position,
53
+ candidates: refreshCandidateIds,
54
+ grid: { cellSize: 8 },
55
+ getVersion: () => spatialGeneration,
56
+ ...(occluder !== undefined ? { occluder } : {}),
57
+ });
58
+ entities.subscribe(() => {
59
+ candidateIdsDirty = true;
60
+ spatialGeneration += 1;
61
+ spatial.invalidate();
62
+ });
63
+ const entityColliders = new Map();
64
+ const objectColliders = new Map();
65
+ const fittedEntityByKind = new Map();
66
+ const fittedObjectByCatalogId = new Map();
67
+ function fittedEntitySetFor(kind) {
68
+ const cached = fittedEntityByKind.get(kind);
69
+ if (cached !== undefined)
70
+ return cached;
71
+ const model = d.models?.entity?.(kind);
72
+ const fitted = model === null || model === undefined ? null : fittedEntityColliders(model);
73
+ fittedEntityByKind.set(kind, fitted);
74
+ return fitted;
75
+ }
76
+ function fittedObjectSetFor(catalogId) {
77
+ const cached = fittedObjectByCatalogId.get(catalogId);
78
+ if (cached !== undefined)
79
+ return cached;
80
+ const model = d.models?.object?.(catalogId);
81
+ const fitted = model === null || model === undefined ? null : fittedObjectColliders(model);
82
+ fittedObjectByCatalogId.set(catalogId, fitted);
83
+ return fitted;
84
+ }
85
+ function entityCollidersOf(instanceId) {
86
+ const override = entityColliders.get(instanceId);
87
+ if (override !== undefined)
88
+ return override;
89
+ const entry = catalogEntry(instanceId);
90
+ if (entry?.colliders !== undefined)
91
+ return entry.colliders;
92
+ const kind = entities.get(instanceId)?.name;
93
+ if (kind !== undefined) {
94
+ const fitted = fittedEntitySetFor(kind);
95
+ if (fitted !== null)
96
+ return fitted;
97
+ }
98
+ const scale = entry?.scale;
99
+ if (scale !== undefined && scale !== 1)
100
+ return scaledEntityColliders(scale);
101
+ return null;
102
+ }
103
+ function entityVisualScaleOf(instanceId) {
104
+ return catalogEntry(instanceId)?.scale ?? 1;
105
+ }
106
+ function objectCollidersOf(instanceId) {
107
+ const override = objectColliders.get(instanceId);
108
+ if (override !== undefined)
109
+ return override;
110
+ const catalog = catalogObject(instanceId);
111
+ if (catalog?.colliders !== undefined)
112
+ return catalog.colliders;
113
+ if (catalog?.halfExtents !== undefined)
114
+ return null;
115
+ const object = objects.get(instanceId);
116
+ if (object === null)
117
+ return null;
118
+ const fitted = fittedObjectSetFor(object.catalogId);
119
+ if (fitted !== null)
120
+ return fitted;
121
+ if (object.visual?.scale === undefined)
122
+ return null;
123
+ return scaledObjectColliders(objectVisualScale(object.visual));
124
+ }
125
+ const targeting = notifyAfter(createTargeting({
126
+ candidates: () => [...refreshCandidateIds()],
127
+ classify(_fromId, toId) {
128
+ const role = catalogEntry(toId)?.role;
129
+ return role === "enemy" || role === "hostile" ? "hostile" : "friendly";
130
+ },
131
+ distance: (fromId, toId) => spatial.distance(fromId, toId),
132
+ }), ["setTarget", "cycleTarget"], signalNotify);
133
+ const combatSpatial = {
134
+ inRadius: (center, radius) => spatial.inRadius(center, radius),
135
+ hasLineOfSight: (from, to) => {
136
+ if (typeof from === "string")
137
+ return spatial.hasLineOfSight(from, to);
138
+ const toPos = entities.get(to)?.position;
139
+ if (toPos === undefined)
140
+ return false;
141
+ if (occluder === undefined)
142
+ return true;
143
+ return !occluder(from, toPos);
144
+ },
145
+ positionOf: (instanceId) => entities.get(instanceId)?.position,
146
+ };
147
+ const sceneRaycast = createSceneRaycast({
148
+ entities: {
149
+ list: () => entities.list().map((entity) => ({
150
+ id: entity.id,
151
+ position: entity.position,
152
+ rotationY: entity.rotationY,
153
+ name: entity.name,
154
+ })),
155
+ collidersOf: entityCollidersOf,
156
+ inRadius: (center, radius) => spatial.inRadius(center, radius),
157
+ get: (id) => {
158
+ const entity = entities.get(id);
159
+ if (entity === null)
160
+ return null;
161
+ return { id: entity.id, position: entity.position, rotationY: entity.rotationY, name: entity.name };
162
+ },
163
+ },
164
+ objects: {
165
+ list: () => objects.list(),
166
+ inBox: (min, max) => objects.inBox(min, max),
167
+ collidersOf: objectCollidersOf,
168
+ halfExtentsOf: (catalogId) => content.objectById?.(catalogId)?.halfExtents ?? null,
169
+ },
170
+ terrain: ground,
171
+ });
172
+ const forms = notifyAfter(createForms({ entities, time, events }), ["shapeshift", "revert"], signalNotify);
173
+ const paintLayer = notifyAfter(createPaintLayer(), ["paint", "clear"], signalNotify);
174
+ let onAfterSpawn = () => { };
175
+ let onAfterDespawn = () => { };
176
+ function spawnEntity(name, spawnOptions) {
177
+ const entry = content.entityById?.(name);
178
+ const walkSpeed = spawnOptions?.movement?.walkSpeed ?? entry?.movement?.walkSpeed;
179
+ const options = walkSpeed === undefined
180
+ ? spawnOptions
181
+ : { ...spawnOptions, movement: { ...spawnOptions?.movement, walkSpeed } };
182
+ const instanceId = entities.spawn(name, options);
183
+ onAfterSpawn(instanceId);
184
+ statsByInstance.set(instanceId, entry?.stats === undefined ? {} : seedStatValues(entry.stats));
185
+ return instanceId;
186
+ }
187
+ function despawnEntity(instanceId) {
188
+ const existed = entities.despawn(instanceId);
189
+ statsByInstance.delete(instanceId);
190
+ targeting.clearAll(instanceId);
191
+ entityColliders.delete(instanceId);
192
+ onAfterDespawn(instanceId);
193
+ return existed;
194
+ }
195
+ function moveEntityTowardCommit(instanceId, target, options) {
196
+ const next = spatial.moveToward(instanceId, target, options);
197
+ if (next === null)
198
+ return null;
199
+ const current = entities.get(instanceId);
200
+ if (current === null)
201
+ return null;
202
+ let rotationY = current.rotationY;
203
+ if (options.face === true) {
204
+ const dx = next[0] - current.position[0];
205
+ const dz = next[2] - current.position[2];
206
+ if (Math.hypot(dx, dz) > 1e-9)
207
+ rotationY = Math.atan2(dx, dz);
208
+ }
209
+ entities.setPose(instanceId, { position: next, rotationY });
210
+ return next;
211
+ }
212
+ function resetAllToSpawn(filter) {
213
+ let count = 0;
214
+ for (const entity of entities.list()) {
215
+ if (filter !== undefined && !filter(entity))
216
+ continue;
217
+ if (entities.resetToSpawn(entity.id))
218
+ count += 1;
219
+ }
220
+ return count;
221
+ }
222
+ const bodyBinds = new Map();
223
+ function bind(key) {
224
+ const existing = bodyBinds.get(key);
225
+ if (existing !== undefined)
226
+ return existing;
227
+ const created = createBodyBind({
228
+ has: (id) => entities.get(id) !== null,
229
+ spawn: spawnEntity,
230
+ despawn: despawnEntity,
231
+ setPose: entities.setPose,
232
+ update: entities.update,
233
+ });
234
+ bodyBinds.set(key, created);
235
+ return created;
236
+ }
237
+ const objectSelection = notifyAfter(createSelectionSet(), ["add", "remove", "toggle", "replace", "clear"], signalNotify);
238
+ const sceneObjects = {
239
+ ...objects,
240
+ remove(instanceId) {
241
+ const existed = objects.remove(instanceId);
242
+ if (existed)
243
+ objectSelection.remove(instanceId);
244
+ return existed;
245
+ },
246
+ catalog: (instanceId) => catalogObject(instanceId) ?? null,
247
+ raycast: (input) => raycastObjects(objects, input),
248
+ raycastAll: (input) => raycastObjectsAll(objects, input),
249
+ setColliders(instanceId, colliders) {
250
+ if (colliders === null)
251
+ objectColliders.delete(instanceId);
252
+ else
253
+ objectColliders.set(instanceId, colliders);
254
+ signalNotify();
255
+ },
256
+ collidersOf: objectCollidersOf,
257
+ selection: objectSelection,
258
+ };
259
+ return {
260
+ entities,
261
+ objects,
262
+ statsByInstance,
263
+ entityStats,
264
+ ensureInstanceStats,
265
+ catalogEntry,
266
+ catalogObject,
267
+ spatial,
268
+ combatSpatial,
269
+ sceneRaycast,
270
+ targeting,
271
+ entityColliders,
272
+ objectColliders,
273
+ entityCollidersOf,
274
+ objectCollidersOf,
275
+ entityVisualScaleOf,
276
+ forms,
277
+ paintLayer,
278
+ spawnEntity,
279
+ despawnEntity,
280
+ moveEntityTowardCommit,
281
+ resetAllToSpawn,
282
+ bind,
283
+ sceneObjects,
284
+ setOnAfterSpawn(fn) {
285
+ onAfterSpawn = fn;
286
+ },
287
+ setOnAfterDespawn(fn) {
288
+ onAfterDespawn = fn;
289
+ },
290
+ };
291
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shallow wire codecs for {@link SnapshotModule.decode} — reject obviously wrong shapes so hydrate
3
+ * never receives bare casts of garbage. Fail soft (return `null`); deeper field validation stays with
4
+ * each subsystem's hydrate.
5
+ * @internal
6
+ */
7
+ /** @internal Reject non-arrays; return a typed array or null. */
8
+ export declare function decodeArray<T = unknown>(raw: unknown): T[] | null;
9
+ /** @internal Reject non-plain objects; return a typed record or null. */
10
+ export declare function decodeRecord<T = unknown>(raw: unknown): Record<string, T> | null;
11
+ /** @internal Reject non-[string, T][] entry lists; return entries or null. */
12
+ export declare function decodeEntries<T = unknown>(raw: unknown): readonly (readonly [string, T])[] | null;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shallow wire codecs for {@link SnapshotModule.decode} — reject obviously wrong shapes so hydrate
3
+ * never receives bare casts of garbage. Fail soft (return `null`); deeper field validation stays with
4
+ * each subsystem's hydrate.
5
+ * @internal
6
+ */
7
+ /** @internal Reject non-arrays; return a typed array or null. */
8
+ export function decodeArray(raw) {
9
+ return Array.isArray(raw) ? raw : null;
10
+ }
11
+ /** @internal Reject non-plain objects; return a typed record or null. */
12
+ export function decodeRecord(raw) {
13
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw))
14
+ return null;
15
+ return raw;
16
+ }
17
+ /** @internal Reject non-[string, T][] entry lists; return entries or null. */
18
+ export function decodeEntries(raw) {
19
+ if (!Array.isArray(raw))
20
+ return null;
21
+ for (const entry of raw) {
22
+ if (!Array.isArray(entry) || entry.length < 2 || typeof entry[0] !== "string")
23
+ return null;
24
+ }
25
+ return raw;
26
+ }
@@ -0,0 +1,21 @@
1
+ import type { GameEvents } from "../../game/events.js";
2
+ import { type WorldItemRecord, type WorldItemSpawnInput, type WorldItemStore } from "../../game/worldItem.js";
3
+ import type { Drop } from "../../game/lootTable.js";
4
+ import type { EntityStore } from "../../scene/entityStore.js";
5
+ import type { WorldItemPickupResult } from "../gameContext.js";
6
+ /** @internal What the ground-item surface needs from the live context: entity spawn/despawn, the event bus, loot granting, and change notification. */
7
+ export interface WorldItemContextDeps {
8
+ entities: EntityStore;
9
+ events: GameEvents;
10
+ despawnEntity: (instanceId: string) => boolean;
11
+ grantToPlayer: (userId: string, drops: Drop[], source?: string) => void;
12
+ signalNotify: () => void;
13
+ }
14
+ /** @internal The `ctx.scene.worldItem` wiring: the reactive store plus the spawn/pickup verbs that emit `worldItem.*` events and route pickups through loot. */
15
+ export interface WorldItemContext {
16
+ worldItems: WorldItemStore;
17
+ spawnWorldItem(input: WorldItemSpawnInput): WorldItemRecord;
18
+ pickupWorldItem(instanceId: string, userId: string): WorldItemPickupResult;
19
+ }
20
+ /** @internal */
21
+ export declare function createWorldItemContext(d: WorldItemContextDeps): WorldItemContext;
@@ -0,0 +1,37 @@
1
+ import { createWorldItemStore, WORLD_ITEM_ENTITY_NAME, } from "../../game/worldItem.js";
2
+ import { notifyAfter } from "../../store/changeSignal.js";
3
+ /** @internal */
4
+ export function createWorldItemContext(d) {
5
+ const worldItems = notifyAfter(createWorldItemStore({
6
+ spawnEntity: (position) => d.entities.spawn(WORLD_ITEM_ENTITY_NAME, { position, role: "prop" }),
7
+ despawnEntity: d.despawnEntity,
8
+ resolvePosition: (instanceId) => d.entities.get(instanceId)?.position,
9
+ }), ["spawn", "take", "remove"], d.signalNotify);
10
+ function spawnWorldItem(input) {
11
+ const record = worldItems.spawn(input);
12
+ d.events.emit("worldItem.dropped", {
13
+ instanceId: record.instanceId,
14
+ itemId: record.itemId,
15
+ rarity: record.rarity,
16
+ count: record.count,
17
+ position: [input.position[0], input.position[1], input.position[2]],
18
+ ...(record.source !== undefined ? { source: record.source } : {}),
19
+ });
20
+ return record;
21
+ }
22
+ function pickupWorldItem(instanceId, userId) {
23
+ const record = worldItems.take(instanceId);
24
+ if (record === null)
25
+ return { status: "rejected", reason: "not-found" };
26
+ d.grantToPlayer(userId, [{ item: record.itemId, count: record.count }], "worldItem.pickup");
27
+ d.events.emit("worldItem.picked_up", {
28
+ instanceId,
29
+ userId,
30
+ itemId: record.itemId,
31
+ rarity: record.rarity,
32
+ count: record.count,
33
+ });
34
+ return { status: "ok", record };
35
+ }
36
+ return { worldItems, spawnWorldItem, pickupWorldItem };
37
+ }
@@ -0,0 +1,48 @@
1
+ import type { WalletState } from "../../economy/wallet.js";
2
+ import type { GameFeed } from "../../game/feed.js";
3
+ import type { InventorySet } from "../../inventory/inventoryModel.js";
4
+ import type { PoseState } from "../../movement/poseState.js";
5
+ import { type StatValueMap } from "../../scene/entityStats.js";
6
+ import type { EntityStore } from "../../scene/entityStore.js";
7
+ import type { Possession } from "../../scene/possession.js";
8
+ import type { ObservableKeyedStore } from "../../store/observableKeyedStore.js";
9
+ import type { SimClock } from "../../time/simClock.js";
10
+ import type { MotionIntents } from "../motionIntents.js";
11
+ import type { SnapshotModule } from "../worldSnapshot.js";
12
+ /** @internal The live always-on subsystems the baseline descriptors serialize — handed in by `createGameContext`. */
13
+ export interface BaselineDeps {
14
+ signalNotify: () => void;
15
+ entities: EntityStore;
16
+ statsByInstance: Map<string, StatValueMap>;
17
+ store: ObservableKeyedStore<unknown>;
18
+ feed: GameFeed;
19
+ inventoryIds: readonly string[];
20
+ inventoryByUser: ReadonlyMap<string, InventorySet<string>>;
21
+ inventoryFor: (userId: string) => InventorySet<string>;
22
+ wallets: Map<string, WalletState>;
23
+ time: SimClock;
24
+ pose: PoseState;
25
+ possession: Possession;
26
+ motionByUser: ReadonlyMap<string, MotionIntents>;
27
+ motionFor: (userId: string) => MotionIntents;
28
+ }
29
+ /** @internal What an always-on baseline descriptor contributes: a replication module, a save-only module, or both. */
30
+ export interface BaselineBuild {
31
+ /** Registered into the host→client replication set (`ctx.snapshot`/`ctx.hydrate`), and therefore also into the save set. */
32
+ replicate?: SnapshotModule;
33
+ /** Registered into the whole-world save-only set (`ctx.game.save`) — persisted but never sent to clients. */
34
+ save?: SnapshotModule;
35
+ }
36
+ /**
37
+ * Always-on counterpart to {@link featureDescriptors}: each baseline subsystem (entities, stats,
38
+ * store, feed, inventory, economy, time, pose, possession, motion) owns its own serialization here
39
+ * instead of `createGameContext` hand-maintaining two distant module arrays. Order is
40
+ * load-bearing — it fixes the snapshot key order, so it must stay stable.
41
+ * @internal
42
+ */
43
+ export interface BaselineDescriptor {
44
+ readonly key: string;
45
+ create(deps: BaselineDeps): BaselineBuild;
46
+ }
47
+ /** @internal */
48
+ export declare const baselineDescriptors: readonly BaselineDescriptor[];
@@ -0,0 +1,157 @@
1
+ import { hydrateEntityStats, snapshotEntityStats, } from "../../scene/entityStats.js";
2
+ import { decodeArray, decodeEntries, decodeRecord } from "../context/snapshotCodecs.js";
3
+ /** @internal */
4
+ export const baselineDescriptors = [
5
+ {
6
+ key: "entities",
7
+ create: (d) => ({
8
+ replicate: {
9
+ key: "entities",
10
+ snapshot: () => d.entities.snapshot(),
11
+ decode: (raw) => decodeArray(raw),
12
+ hydrate: (data) => d.entities.hydrate(data),
13
+ },
14
+ }),
15
+ },
16
+ {
17
+ key: "stats",
18
+ create: (d) => ({
19
+ replicate: {
20
+ key: "stats",
21
+ snapshot: () => snapshotEntityStats(d.statsByInstance),
22
+ decode: (raw) => decodeRecord(raw),
23
+ hydrate: (data) => hydrateEntityStats(d.statsByInstance, data),
24
+ },
25
+ }),
26
+ },
27
+ {
28
+ key: "store",
29
+ create: (d) => ({
30
+ replicate: {
31
+ key: "store",
32
+ snapshot: () => d.store.snapshot(),
33
+ decode: (raw) => decodeEntries(raw),
34
+ hydrate: (data) => d.store.hydrate(data),
35
+ },
36
+ }),
37
+ },
38
+ {
39
+ key: "feed",
40
+ create: (d) => ({
41
+ replicate: {
42
+ key: "feed",
43
+ snapshot: () => d.feed.snapshot(),
44
+ decode: (raw) => decodeRecord(raw),
45
+ hydrate: (data) => d.feed.hydrate(data),
46
+ },
47
+ }),
48
+ },
49
+ {
50
+ key: "inventory",
51
+ create: (d) => ({
52
+ replicate: {
53
+ key: "inventory",
54
+ snapshot: () => {
55
+ const byUser = {};
56
+ for (const [userId, set] of d.inventoryByUser) {
57
+ const states = {};
58
+ for (const inventoryId of d.inventoryIds)
59
+ states[inventoryId] = set.state(inventoryId);
60
+ byUser[userId] = states;
61
+ }
62
+ return byUser;
63
+ },
64
+ decode: (raw) => decodeRecord(raw),
65
+ hydrate: (data) => {
66
+ const byUser = data;
67
+ for (const [userId, states] of Object.entries(byUser)) {
68
+ const set = d.inventoryFor(userId);
69
+ for (const [inventoryId, state] of Object.entries(states))
70
+ set.replaceState(inventoryId, state);
71
+ }
72
+ },
73
+ },
74
+ }),
75
+ },
76
+ {
77
+ key: "economy",
78
+ create: (d) => ({
79
+ save: {
80
+ key: "economy",
81
+ snapshot: () => Object.fromEntries(d.wallets),
82
+ decode: (raw) => decodeRecord(raw),
83
+ hydrate: (data) => {
84
+ const wallets = data;
85
+ d.wallets.clear();
86
+ for (const [userId, state] of Object.entries(wallets)) {
87
+ d.wallets.set(userId, state);
88
+ }
89
+ d.signalNotify();
90
+ },
91
+ },
92
+ }),
93
+ },
94
+ {
95
+ key: "time",
96
+ create: (d) => ({
97
+ save: {
98
+ key: "time",
99
+ snapshot: () => d.time.snapshot(),
100
+ decode: (raw) => {
101
+ const rec = decodeRecord(raw);
102
+ return rec === null ? null : rec;
103
+ },
104
+ hydrate: (data) => d.time.hydrate(data),
105
+ },
106
+ }),
107
+ },
108
+ {
109
+ key: "pose",
110
+ create: (d) => ({
111
+ save: {
112
+ key: "pose",
113
+ snapshot: () => d.pose.snapshotAll(),
114
+ decode: (raw) => {
115
+ const rec = decodeRecord(raw);
116
+ return rec === null ? null : rec;
117
+ },
118
+ hydrate: (data) => d.pose.hydrateAll(data),
119
+ },
120
+ }),
121
+ },
122
+ {
123
+ key: "possession",
124
+ create: (d) => ({
125
+ save: {
126
+ key: "possession",
127
+ snapshot: () => d.possession.snapshotAll(),
128
+ decode: (raw) => {
129
+ const rec = decodeRecord(raw);
130
+ return rec === null ? null : rec;
131
+ },
132
+ hydrate: (data) => d.possession.hydrateAll(data),
133
+ },
134
+ }),
135
+ },
136
+ {
137
+ key: "motion",
138
+ create: (d) => ({
139
+ save: {
140
+ key: "motion",
141
+ snapshot: () => {
142
+ const out = {};
143
+ for (const [userId, queue] of d.motionByUser)
144
+ out[userId] = queue.snapshot();
145
+ return out;
146
+ },
147
+ decode: (raw) => decodeRecord(raw),
148
+ hydrate: (data) => {
149
+ const batches = data;
150
+ for (const [userId, batch] of Object.entries(batches)) {
151
+ d.motionFor(userId).hydrate(batch);
152
+ }
153
+ },
154
+ },
155
+ }),
156
+ },
157
+ ];
@@ -0,0 +1,79 @@
1
+ import type { CardPile, CardPileConfig } from "../../cards/cardPile.js";
2
+ import type { CommandRegistry } from "../../commands/commandRegistry.js";
3
+ import { type WalletState } from "../../economy/wallet.js";
4
+ import type { GameFeatures } from "../../game/defineGame.js";
5
+ import type { GameEvents } from "../../game/events.js";
6
+ import { type Social } from "../../game/social.js";
7
+ import type { InventoryLayout, InventorySet } from "../../inventory/inventoryModel.js";
8
+ import type { StatValueMap } from "../../scene/entityStats.js";
9
+ import type { EntityStore } from "../../scene/entityStore.js";
10
+ import type { SpatialApi } from "../../scene/spatial.js";
11
+ import type { ObservableKeyedStore } from "../../store/observableKeyedStore.js";
12
+ import type { SnapshotModule } from "../worldSnapshot.js";
13
+ import type { TurnLoop, TurnLoopConfig } from "../../turn/turnLoop.js";
14
+ import type { RaceState, RaceStateConfig } from "../../game/race.js";
15
+ import type { GameContext, GameContextContent, GameContextEconomy } from "../gameContext.js";
16
+ /**
17
+ * Shared wiring every optional-feature descriptor draws from — the live core subsystems (entities,
18
+ * spatial, economy, inventory) plus reactive plumbing (`signalNotify`) and a `feature` reader for the
19
+ * few features that reference another (quest reads unlocks). Handed to each {@link FeatureDescriptor}'s
20
+ * `create` so a new opt-in subsystem plugs into one registration, never a new `features.x ?` branch.
21
+ * @internal
22
+ */
23
+ export interface FeatureDeps {
24
+ features: GameFeatures;
25
+ signalNotify: () => void;
26
+ events: GameEvents;
27
+ now: () => number;
28
+ entities: EntityStore;
29
+ spatial: SpatialApi;
30
+ store: ObservableKeyedStore<unknown>;
31
+ commandRegistry: CommandRegistry<GameContext>;
32
+ economy: GameContextEconomy;
33
+ content: GameContextContent;
34
+ activeUserId: () => string;
35
+ walletOf: (userId: string) => WalletState;
36
+ setWallet: (userId: string, state: WalletState) => void;
37
+ layouts: Record<string, InventoryLayout>;
38
+ inventoryFor: (userId: string) => InventorySet<string>;
39
+ ensureInstanceStats: (instanceId: string) => StatValueMap;
40
+ seedUserPool: (userId: string, statId: string, pool: {
41
+ current: number;
42
+ max?: number;
43
+ min?: number;
44
+ }) => void;
45
+ sharedSocial: () => Social;
46
+ pile: (id: string, config?: CardPileConfig) => CardPile;
47
+ loop: (id: string, config?: TurnLoopConfig) => TurnLoop;
48
+ cardPiles: ReadonlyMap<string, CardPile>;
49
+ turnLoops: ReadonlyMap<string, TurnLoop>;
50
+ raceState: (id: string, config?: RaceStateConfig) => RaceState;
51
+ feature: <T>(key: keyof GameFeatures) => T | undefined;
52
+ }
53
+ /** @internal What a descriptor produces: the `ctx`-facing value plus its optional replication/save modules. */
54
+ export interface FeatureBuild {
55
+ value: unknown;
56
+ /** Registered into the host→client replication set when present (`ctx.snapshot`/`ctx.hydrate`). */
57
+ replicate?: SnapshotModule;
58
+ /** Registered into the whole-world save-only set when present (`ctx.game.save`). */
59
+ save?: SnapshotModule;
60
+ }
61
+ /**
62
+ * One opt-in subsystem expressed as data: which `features` flag turns it on, how it wires itself from
63
+ * {@link FeatureDeps}, and whether it replicates or persists. `createGameContext` iterates the
64
+ * descriptor list instead of hand-wiring each `features.x ? create : undefined` branch — the seam a
65
+ * new feature extends through.
66
+ *
67
+ * Feature activation has **one path**: `definition.features` after `defineGame` has already
68
+ * OR-merged explicit `features: { quest: true }` sugar with system-implied flags via
69
+ * `mergeSystemFeatures`. Descriptors only call `enabled(features)` against that final map — never
70
+ * re-check systems or a second flag source.
71
+ * @internal
72
+ */
73
+ export interface FeatureDescriptor {
74
+ readonly key: keyof GameFeatures;
75
+ enabled(features: GameFeatures): boolean;
76
+ create(deps: FeatureDeps): FeatureBuild;
77
+ }
78
+ /** @internal */
79
+ export declare const featureDescriptors: readonly FeatureDescriptor[];