@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
@@ -1,4 +1,8 @@
1
- import type { EditorDocument, EditorMarker, EditorVec3, EditorVolume } from "./types.js";
1
+ import { type SurfaceDelta, type TerraformDelta, type TerrainMaterialLayer, type WeightDelta } from "../world/terraform.js";
2
+ import type { EditorUiDocument, EditorUiPanelLayout } from "../ui/hudDocument.js";
3
+ import type { EditorGridCellEdit, EditorGridLayer } from "./grid.js";
4
+ import type { ParamSchema } from "../scene/sceneKinds.js";
5
+ import type { EditorCatalogEntry, EditorDocument, EditorEnvironment, EditorMarker, EditorMinimapBake, EditorNote, EditorPath, EditorTerrain, EditorVec3, EditorVolume } from "./types.js";
2
6
  /** A single editor mutation — select, move, add, remove, undo/redo — dispatched to a session. */
3
7
  export type EditorCommand = {
4
8
  type: "select";
@@ -10,19 +14,85 @@ export type EditorCommand = {
10
14
  id: string;
11
15
  position?: EditorVec3;
12
16
  rotationY?: number;
17
+ } | {
18
+ type: "translate";
19
+ ids: readonly string[];
20
+ delta: EditorVec3;
21
+ } | {
22
+ type: "setParent";
23
+ ids: readonly string[];
24
+ parentId: string | null;
13
25
  } | {
14
26
  type: "addMarker";
15
27
  marker: EditorMarker;
16
28
  } | {
17
- type: "remove";
29
+ type: "addVolume";
30
+ volume: EditorVolume;
31
+ } | {
32
+ type: "addPath";
33
+ path: EditorPath;
34
+ } | {
35
+ type: "addNote";
36
+ note: EditorNote;
37
+ } | {
38
+ type: "setMarker";
18
39
  id: string;
40
+ patch: Partial<Omit<EditorMarker, "id">>;
19
41
  } | {
20
42
  type: "setVolume";
21
43
  id: string;
22
44
  patch: Partial<Omit<EditorVolume, "id">>;
23
45
  } | {
24
- type: "addVolume";
25
- volume: EditorVolume;
46
+ type: "setPath";
47
+ id: string;
48
+ patch: Partial<Omit<EditorPath, "id">>;
49
+ } | {
50
+ type: "setNote";
51
+ id: string;
52
+ patch: Partial<Omit<EditorNote, "id">>;
53
+ } | {
54
+ type: "setCatalogEntry";
55
+ catalogId: string;
56
+ entryId: string;
57
+ patch: {
58
+ label?: string;
59
+ meta?: Record<string, unknown>;
60
+ };
61
+ } | {
62
+ type: "addCatalogEntry";
63
+ catalogId: string;
64
+ entry: EditorCatalogEntry;
65
+ } | {
66
+ type: "removeCatalogEntry";
67
+ catalogId: string;
68
+ entryId: string;
69
+ } | {
70
+ type: "addCatalog";
71
+ id: string;
72
+ label?: string;
73
+ schema?: ParamSchema;
74
+ } | {
75
+ type: "removeCatalog";
76
+ id: string;
77
+ } | {
78
+ type: "setCatalogSchema";
79
+ id: string;
80
+ schema: ParamSchema;
81
+ label?: string;
82
+ } | {
83
+ type: "remove";
84
+ id: string;
85
+ } | {
86
+ type: "removeMany";
87
+ ids: readonly string[];
88
+ } | {
89
+ type: "duplicate";
90
+ ids: readonly string[];
91
+ offset?: EditorVec3;
92
+ } | {
93
+ type: "addFragment";
94
+ fragment: EditorDocument;
95
+ offset?: EditorVec3;
26
96
  } | {
27
97
  type: "importDocument";
28
98
  document: EditorDocument;
@@ -32,11 +102,165 @@ export type EditorCommand = {
32
102
  } | {
33
103
  type: "replaceDocument";
34
104
  document: EditorDocument;
105
+ } | {
106
+ type: "setTerrain";
107
+ terrain: EditorTerrain;
108
+ } | {
109
+ type: "sculptTerrain";
110
+ delta: TerraformDelta;
111
+ } | {
112
+ type: "paintTerrain";
113
+ delta: SurfaceDelta;
114
+ } | {
115
+ type: "setTerrainLayers";
116
+ layers: readonly TerrainMaterialLayer[];
117
+ } | {
118
+ type: "blendTerrain";
119
+ delta: WeightDelta;
120
+ } | {
121
+ type: "clearTerrain";
122
+ } | {
123
+ type: "setMinimapBake";
124
+ minimap: EditorMinimapBake;
125
+ }
126
+ /**
127
+ * Replace the scene-document environment/lighting bag. Pass `undefined` to clear authored sky/fog
128
+ * so world.ts fallbacks apply again. The lighting workspace writes the full merged bag so
129
+ * undo restores the previous snapshot as one step (use `coalesce` while scrubbing sliders).
130
+ */
131
+ | {
132
+ type: "setEnvironment";
133
+ environment: EditorEnvironment | undefined;
134
+ } | {
135
+ type: "convertScatterToObjects";
136
+ pathId: string;
137
+ markers: readonly EditorMarker[];
138
+ } | {
139
+ type: "createPrefab";
140
+ id: string;
141
+ name: string;
142
+ ids: readonly string[];
143
+ } | {
144
+ type: "insertPrefab";
145
+ prefabId: string;
146
+ at: EditorVec3;
147
+ instanceId?: string;
148
+ } | {
149
+ type: "detachPrefabInstance";
150
+ instanceId: string;
151
+ } | {
152
+ type: "deletePrefab";
153
+ prefabId: string;
154
+ } | {
155
+ type: "createCollection";
156
+ id: string;
157
+ name: string;
158
+ memberIds?: readonly string[];
159
+ } | {
160
+ type: "renameCollection";
161
+ id: string;
162
+ name: string;
163
+ } | {
164
+ type: "deleteCollection";
165
+ id: string;
166
+ } | {
167
+ type: "setCollectionMembers";
168
+ id: string;
169
+ memberIds: readonly string[];
170
+ } | {
171
+ type: "addToCollection";
172
+ id: string;
173
+ ids: readonly string[];
174
+ } | {
175
+ type: "removeFromCollection";
176
+ id: string;
177
+ ids: readonly string[];
178
+ } | {
179
+ type: "setCollectionFlags";
180
+ id: string;
181
+ patch: {
182
+ color?: string;
183
+ locked?: boolean;
184
+ visible?: boolean;
185
+ };
186
+ } | {
187
+ /**
188
+ * Per-object lock/visibility flags on placeables. `locked: false` / `hidden: false` clear the
189
+ * field so the document stays compact; collection locks are unchanged.
190
+ */
191
+ type: "setObjectFlags";
192
+ ids: readonly string[];
193
+ patch: {
194
+ locked?: boolean;
195
+ hidden?: boolean;
196
+ };
197
+ } | {
198
+ type: "selectCollection";
199
+ id: string;
200
+ } | {
201
+ type: "batchSetProperties";
202
+ ids: readonly string[];
203
+ patch: {
204
+ color?: string;
205
+ label?: string;
206
+ meta?: Record<string, unknown>;
207
+ };
208
+ } | {
209
+ type: "assignMaterial";
210
+ ids: readonly string[];
211
+ materialId: string;
212
+ } | {
213
+ type: "addGridLayer";
214
+ layer: EditorGridLayer;
215
+ } | {
216
+ type: "removeGridLayer";
217
+ id: string;
218
+ } | {
219
+ type: "setGridLayer";
220
+ id: string;
221
+ patch: Partial<Omit<EditorGridLayer, "id" | "cells">>;
222
+ } | {
223
+ type: "paintGridCells";
224
+ id: string;
225
+ cells: readonly EditorGridCellEdit[];
226
+ } | {
227
+ type: "fillGridRect";
228
+ id: string;
229
+ col0: number;
230
+ row0: number;
231
+ col1: number;
232
+ row1: number;
233
+ value: string;
234
+ } | {
235
+ type: "floodFillGrid";
236
+ id: string;
237
+ col: number;
238
+ row: number;
239
+ value: string;
240
+ } | {
241
+ type: "resizeGridLayer";
242
+ id: string;
243
+ cols: number;
244
+ rows: number;
245
+ } | {
246
+ type: "setUiPanel";
247
+ id: string;
248
+ patch: Partial<EditorUiPanelLayout>;
249
+ } | {
250
+ type: "removeUiPanel";
251
+ id: string;
252
+ } | {
253
+ type: "setUi";
254
+ ui: EditorUiDocument | undefined;
35
255
  } | {
36
256
  type: "undo";
37
257
  } | {
38
258
  type: "redo";
39
259
  };
260
+ /** Per-dispatch options; `coalesce` merges consecutive same-key edits into one undo step. */
261
+ export interface EditorDispatchOptions {
262
+ coalesce?: string;
263
+ }
40
264
  /** The document plus current selection at a point in editor history. */
41
265
  export interface EditorSessionState {
42
266
  document: EditorDocument;
@@ -46,14 +270,18 @@ export interface EditorSessionState {
46
270
  export interface EditorSession {
47
271
  getState(): EditorSessionState;
48
272
  subscribe(listener: (state: EditorSessionState) => void): () => void;
49
- dispatch(command: EditorCommand): EditorSessionState;
273
+ dispatch(command: EditorCommand, options?: EditorDispatchOptions): EditorSessionState;
50
274
  exportJson(pretty?: boolean): string;
51
275
  canUndo(): boolean;
52
276
  canRedo(): boolean;
53
277
  }
54
- /** Creates an editor session with undo/redo history seeded from an initial document. */
278
+ /** Creates an editor session with undo/redo history seeded from an initial document.
279
+ * @internal
280
+ */
55
281
  export declare function createEditorSession(initial: EditorDocument, historyLimit?: number): EditorSession;
56
- /** Compact snapshot of a session state — counts, selection, and the selected object. */
282
+ /** Compact snapshot of a session state — counts, selection, and the selected object.
283
+ * @internal
284
+ */
57
285
  export declare function summarizeEditorSession(state: EditorSessionState): {
58
286
  markers: number;
59
287
  volumes: number;
@@ -1,120 +1,30 @@
1
- import { cloneEditorDocument, findEditorMarker, findEditorVolume, importEditorDocumentJson, } from "./document.js";
1
+ import { applyDeltaToSnapshot, applySurfaceDeltaToSnapshot, applyWeightDeltaToSnapshot, revertDeltaFromSnapshot, revertSurfaceDeltaFromSnapshot, revertWeightDeltaFromSnapshot, } from "../world/terraform.js";
2
+ import { cloneEditorDocument, findEditorMarker, findEditorVolume, } from "./document.js";
3
+ import { applyMutating, isStructural } from "./commandApply.js";
2
4
  function snapshotState(state) {
3
5
  return {
4
6
  document: cloneEditorDocument(state.document),
5
7
  selection: [...state.selection],
6
8
  };
7
9
  }
8
- function removeById(doc, id) {
9
- return {
10
- version: 1,
11
- markers: doc.markers.filter((marker) => marker.id !== id),
12
- volumes: doc.volumes.filter((volume) => volume.id !== id),
13
- paths: doc.paths.filter((path) => path.id !== id),
14
- annotations: doc.annotations.filter((note) => note.id !== id),
15
- };
16
- }
17
- function applyMutating(state, command) {
18
- switch (command.type) {
19
- case "select":
20
- return { ...state, selection: [...command.ids] };
21
- case "clearSelection":
22
- return { ...state, selection: [] };
23
- case "setTransform": {
24
- const markers = state.document.markers.map((marker) => {
25
- if (marker.id !== command.id)
26
- return marker;
27
- return {
28
- ...marker,
29
- position: command.position === undefined ? marker.position : { ...command.position },
30
- ...(command.rotationY === undefined ? {} : { rotationY: command.rotationY }),
31
- };
32
- });
33
- const volumes = state.document.volumes.map((volume) => {
34
- if (volume.id !== command.id)
35
- return volume;
36
- if (command.position === undefined)
37
- return volume;
38
- return { ...volume, center: { ...command.position } };
39
- });
40
- const annotations = state.document.annotations.map((note) => {
41
- if (note.id !== command.id)
42
- return note;
43
- if (command.position === undefined)
44
- return note;
45
- return { ...note, position: { ...command.position } };
46
- });
47
- return {
48
- ...state,
49
- document: { ...state.document, markers, volumes, annotations },
50
- };
51
- }
52
- case "addMarker":
53
- return {
54
- ...state,
55
- document: {
56
- ...state.document,
57
- markers: [...state.document.markers.filter((m) => m.id !== command.marker.id), command.marker],
58
- },
59
- selection: [command.marker.id],
60
- };
61
- case "addVolume":
62
- return {
63
- ...state,
64
- document: {
65
- ...state.document,
66
- volumes: [...state.document.volumes.filter((v) => v.id !== command.volume.id), command.volume],
67
- },
68
- selection: [command.volume.id],
69
- };
70
- case "setVolume": {
71
- const volumes = state.document.volumes.map((volume) => {
72
- if (volume.id !== command.id)
73
- return volume;
74
- return {
75
- ...volume,
76
- ...command.patch,
77
- center: command.patch.center === undefined ? volume.center : { ...command.patch.center },
78
- halfExtents: command.patch.halfExtents === undefined
79
- ? volume.halfExtents
80
- : { ...command.patch.halfExtents },
81
- meta: command.patch.meta === undefined ? volume.meta : { ...command.patch.meta },
82
- };
83
- });
84
- return { ...state, document: { ...state.document, volumes } };
85
- }
86
- case "remove":
87
- return {
88
- document: removeById(state.document, command.id),
89
- selection: state.selection.filter((id) => id !== command.id),
90
- };
91
- case "importDocument":
92
- case "replaceDocument":
93
- return {
94
- document: cloneEditorDocument(command.document),
95
- selection: [],
96
- };
97
- case "importJson":
98
- return {
99
- document: importEditorDocumentJson(command.json),
100
- selection: [],
101
- };
102
- case "undo":
103
- case "redo":
104
- return null;
105
- }
106
- }
107
- function isStructural(command) {
108
- return (command.type === "setTransform" ||
109
- command.type === "addMarker" ||
110
- command.type === "addVolume" ||
111
- command.type === "setVolume" ||
112
- command.type === "remove" ||
113
- command.type === "importDocument" ||
114
- command.type === "importJson" ||
115
- command.type === "replaceDocument");
116
- }
117
- /** Creates an editor session with undo/redo history seeded from an initial document. */
10
+ /**
11
+ * Per-brush apply/revert pair over the heightfield snapshot. One registry drives every terrain
12
+ * command, push, and undo/redo path, so the three brushes never fork into parallel code.
13
+ */
14
+ const terrainStrokes = {
15
+ sculpt: { apply: applyDeltaToSnapshot, revert: revertDeltaFromSnapshot },
16
+ paint: { apply: applySurfaceDeltaToSnapshot, revert: revertSurfaceDeltaFromSnapshot },
17
+ blend: { apply: applyWeightDeltaToSnapshot, revert: revertWeightDeltaFromSnapshot },
18
+ };
19
+ /** Maps a terrain-brush command type to its stroke kind. */
20
+ const terrainStrokeKind = {
21
+ sculptTerrain: "sculpt",
22
+ paintTerrain: "paint",
23
+ blendTerrain: "blend",
24
+ };
25
+ /** Creates an editor session with undo/redo history seeded from an initial document.
26
+ * @internal
27
+ */
118
28
  export function createEditorSession(initial, historyLimit = 100) {
119
29
  let state = {
120
30
  document: cloneEditorDocument(initial),
@@ -122,11 +32,27 @@ export function createEditorSession(initial, historyLimit = 100) {
122
32
  };
123
33
  const past = [];
124
34
  const future = [];
35
+ let lastCoalesce = null;
125
36
  const listeners = new Set();
126
37
  const emit = () => {
127
38
  for (const listener of listeners)
128
39
  listener(state);
129
40
  };
41
+ const applyStroke = (entry, direction, selection) => {
42
+ const terrain = state.document.terrain;
43
+ if (terrain === undefined)
44
+ return state;
45
+ const next = terrainStrokes[entry.kind][direction](terrain, entry.delta);
46
+ return { document: { ...state.document, terrain: next }, selection };
47
+ };
48
+ const pushTerrainStroke = (entry) => {
49
+ past.push(entry);
50
+ if (past.length > historyLimit)
51
+ past.shift();
52
+ future.length = 0;
53
+ lastCoalesce = null;
54
+ state = applyStroke(entry, "apply", entry.selection);
55
+ };
130
56
  return {
131
57
  getState: () => state,
132
58
  subscribe(listener) {
@@ -137,22 +63,47 @@ export function createEditorSession(initial, historyLimit = 100) {
137
63
  },
138
64
  canUndo: () => past.length > 0,
139
65
  canRedo: () => future.length > 0,
140
- dispatch(command) {
66
+ dispatch(command, options) {
141
67
  if (command.type === "undo") {
142
- const previous = past.pop();
143
- if (previous === undefined)
68
+ const entry = past.pop();
69
+ if (entry === undefined)
144
70
  return state;
145
- future.push(snapshotState(state));
146
- state = previous;
71
+ if (entry.kind === "snapshot") {
72
+ future.push({ kind: "snapshot", state: snapshotState(state) });
73
+ state = entry.state;
74
+ }
75
+ else {
76
+ future.push({ ...entry, selection: [...state.selection] });
77
+ state = applyStroke(entry, "revert", entry.selection);
78
+ }
79
+ lastCoalesce = null;
147
80
  emit();
148
81
  return state;
149
82
  }
150
83
  if (command.type === "redo") {
151
- const next = future.pop();
152
- if (next === undefined)
84
+ const entry = future.pop();
85
+ if (entry === undefined)
86
+ return state;
87
+ if (entry.kind === "snapshot") {
88
+ past.push({ kind: "snapshot", state: snapshotState(state) });
89
+ state = entry.state;
90
+ }
91
+ else {
92
+ past.push({ ...entry, selection: [...state.selection] });
93
+ state = applyStroke(entry, "apply", entry.selection);
94
+ }
95
+ lastCoalesce = null;
96
+ emit();
97
+ return state;
98
+ }
99
+ if (command.type === "sculptTerrain" || command.type === "paintTerrain" || command.type === "blendTerrain") {
100
+ if (state.document.terrain === undefined || command.delta.indices.length === 0)
153
101
  return state;
154
- past.push(snapshotState(state));
155
- state = next;
102
+ pushTerrainStroke({
103
+ kind: terrainStrokeKind[command.type],
104
+ delta: command.delta,
105
+ selection: [...state.selection],
106
+ });
156
107
  emit();
157
108
  return state;
158
109
  }
@@ -160,10 +111,15 @@ export function createEditorSession(initial, historyLimit = 100) {
160
111
  if (next === null)
161
112
  return state;
162
113
  if (isStructural(command)) {
163
- past.push(snapshotState(state));
164
- if (past.length > historyLimit)
165
- past.shift();
114
+ const coalesce = options?.coalesce;
115
+ const merge = coalesce !== undefined && coalesce === lastCoalesce && past.length > 0;
116
+ if (!merge) {
117
+ past.push({ kind: "snapshot", state: snapshotState(state) });
118
+ if (past.length > historyLimit)
119
+ past.shift();
120
+ }
166
121
  future.length = 0;
122
+ lastCoalesce = coalesce ?? null;
167
123
  }
168
124
  state = next;
169
125
  emit();
@@ -174,7 +130,9 @@ export function createEditorSession(initial, historyLimit = 100) {
174
130
  },
175
131
  };
176
132
  }
177
- /** Compact snapshot of a session state — counts, selection, and the selected object. */
133
+ /** Compact snapshot of a session state — counts, selection, and the selected object.
134
+ * @internal
135
+ */
178
136
  export function summarizeEditorSession(state) {
179
137
  const selectedId = state.selection[0];
180
138
  return {
@@ -0,0 +1,94 @@
1
+ import type { Aabb, Vec2 } from "../world/geometry.js";
2
+ import type { EditorDirective, EditorDirectiveKind, EditorDocument, EditorPopulationDirective, EditorScatterDirective } from "./types.js";
3
+ /**
4
+ * The deterministic materializer for scene {@link EditorDirective}s — the bake side of the
5
+ * bake/patch seam in #985. A directive is one authored line ("scatter rocks across the north
6
+ * ridge"); this expands it into many placements with **stable per-instance ids** (`<directiveId>#
7
+ * <index>`) so a sparse overlay can hand-tweak or delete individual instances by id without every
8
+ * re-materialize orphaning those edits. Fully deterministic: same directive + seed + region ⇒ the
9
+ * same field, every time (safe for verify/CI). Built on the existing `scatter` primitive.
10
+ */
11
+ /** One materialized placement from a directive — grounded XZ, deterministic scale/yaw, stable id. */
12
+ export interface MaterializedInstance {
13
+ /** Stable id `<directiveId>#<index>` — the key an overlay patches or deletes. */
14
+ id: string;
15
+ /** The directive that minted this instance. */
16
+ directiveId: string;
17
+ kind: EditorDirectiveKind;
18
+ /** What to place: a `scatter` directive's catalog asset, or a `population` directive's species id. */
19
+ asset: string;
20
+ x: number;
21
+ z: number;
22
+ /** Vertical offset in meters (0 unless an overlay sets it); grounding on terrain stays the caller's job. */
23
+ y: number;
24
+ rotationY: number;
25
+ scale: number;
26
+ }
27
+ /** A resolved directive footprint: the XZ bounds to scatter within, plus an optional clip polygon. */
28
+ export interface DirectiveFootprint {
29
+ area: Aabb;
30
+ polygon?: Vec2[];
31
+ }
32
+ /**
33
+ * Resolves the footprint a directive fills: an explicit `area`, else the footprint of the named
34
+ * `region` — a scatter/closed path (as a clip polygon) or a volume (its XZ AABB). Null when neither
35
+ * is present or the region id does not resolve.
36
+ * @capability world-directives resolve a directive's region footprint from the scene document
37
+ */
38
+ export declare function resolveDirectiveFootprint(doc: EditorDocument, directive: EditorDirective): DirectiveFootprint | null;
39
+ /**
40
+ * Materializes a scatter directive into deterministic catalog-prop placements across its footprint,
41
+ * clipped to the region polygon when one is present. Per-instance scale and yaw derive from the
42
+ * directive id + seed + point index, so ids are stable across re-materializes.
43
+ * @capability world-directives materialize a scatter directive into placements
44
+ */
45
+ export declare function materializeScatterDirective(directive: EditorScatterDirective, footprint: DirectiveFootprint): MaterializedInstance[];
46
+ /**
47
+ * Materializes a population directive into deterministic mob spawn placements: at most `cap` of each
48
+ * weighted species, distributed across the footprint. Each placement carries a stable id and its
49
+ * species id in `asset`, ready to feed `ctx.scene.entity.spawn` / `ai/populationDirector`.
50
+ * @capability world-directives materialize a population directive into spawns
51
+ */
52
+ export declare function materializePopulationDirective(directive: EditorPopulationDirective, footprint: DirectiveFootprint): MaterializedInstance[];
53
+ /**
54
+ * Materializes one directive against a document, resolving its footprint first. Returns an empty
55
+ * list when the region does not resolve.
56
+ * @capability world-directives materialize one scene directive into instances
57
+ */
58
+ export declare function materializeDirective(doc: EditorDocument, directive: EditorDirective): MaterializedInstance[];
59
+ /** A per-instance hand-tweak over a materialized directive, keyed by the minted instance id. */
60
+ export interface DirectiveInstancePatch {
61
+ /** Override the placement's XZ position. */
62
+ position?: {
63
+ x: number;
64
+ z: number;
65
+ };
66
+ /** Override the vertical offset. */
67
+ y?: number;
68
+ scale?: number;
69
+ rotationY?: number;
70
+ /** Remove this instance from the materialized set. */
71
+ deleted?: boolean;
72
+ }
73
+ /**
74
+ * A sparse overlay over one directive's materialized instances — the "nudge *that one* rock" answer.
75
+ * Hand-edits are keyed by the stable instance id the materializer mints, so they survive re-bakes.
76
+ */
77
+ export interface EditorDirectiveOverlay {
78
+ /** The directive id whose instances this overlay patches. */
79
+ over: string;
80
+ patches: Record<string, DirectiveInstancePatch>;
81
+ }
82
+ /**
83
+ * Applies a directive overlay to its materialized instances: patched fields override, `deleted`
84
+ * drops the instance. Instances with no patch pass through untouched.
85
+ * @capability world-directives apply a sparse overlay over materialized directive instances
86
+ */
87
+ export declare function applyDirectiveOverlay(instances: readonly MaterializedInstance[], overlay: EditorDirectiveOverlay): MaterializedInstance[];
88
+ /**
89
+ * Materializes every directive on a document into one flat instance list, applying each directive's
90
+ * overlay (matched by `over` === directive id) as it goes. The bulk-content counterpart to
91
+ * `resolveAuthoredObjects` / `resolveScatter`: games and headless tests read the same list.
92
+ * @capability world-directives materialize all scene directives with their overlays
93
+ */
94
+ export declare function materializeDirectives(doc: EditorDocument, overlays?: readonly EditorDirectiveOverlay[]): MaterializedInstance[];