@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,42 @@
1
+ import type { GameContextEntityEntry } from "../runtime/gameContext.js";
2
+ import { type ParamSchema } from "../scene/sceneKinds.js";
3
+ import type { EditorCatalogData, EditorCatalogDefinition } from "./types.js";
4
+ /**
5
+ * Well-known catalog id for authored entity definitions. A `mob`/`boss` marker's `catalogId`
6
+ * references an entry (row) in this catalog, and {@link entityEntryFromCatalog} turns that row into
7
+ * the runtime {@link GameContextEntityEntry} a spawn consumes — so an entity's stats and speed are
8
+ * authored in the editor Data tab, not hardcoded in game TS.
9
+ */
10
+ export declare const ENTITY_CATALOG_ID = "entities";
11
+ /**
12
+ * The default {@link ParamSchema} for an authored entity definition — role, health, movement speed,
13
+ * and visual scale. Drives the editor Data-tab inspector for the `entities` catalog and is the shape
14
+ * {@link entityEntryFromCatalog} reads. A game exports it as an `editorCatalogs` schema; the scaffold
15
+ * ships a starter one so the tab is never empty.
16
+ * @capability editor-entities Author entity stats/movement per catalog row instead of hardcoding TS.
17
+ */
18
+ export declare const entityDefinitionSchema: ParamSchema;
19
+ /** Minimal document shape {@link entityEntryFromCatalog} reads — any `EditorDocument` satisfies it. */
20
+ export interface EntityCatalogDocumentLike {
21
+ catalogs: readonly EditorCatalogData[];
22
+ }
23
+ /**
24
+ * Turns an authored entity row into the runtime {@link GameContextEntityEntry} a spawn consumes:
25
+ * looks up `entityId` in the document's {@link ENTITY_CATALOG_ID} catalog (falling back to the
26
+ * game-exported `definitions` defaults), parses it against {@link entityDefinitionSchema}, and maps
27
+ * the fields onto stats/movement/role. Returns `null` when no row defines the entity, so the default
28
+ * `content.ts` path can chain other resolvers. The single seam that makes "place a mob, tune its
29
+ * stats/speed in the editor, save — it spawns with those stats" work with zero game code.
30
+ * @capability editor-entities Consume authored entity definitions from the scene document at runtime.
31
+ */
32
+ export declare function entityEntryFromCatalog(document: EntityCatalogDocumentLike, entityId: string, definitions?: readonly EditorCatalogDefinition[]): GameContextEntityEntry | null;
33
+ /**
34
+ * Merges game-exported catalog definitions with editor-authored ones carried on the scene document.
35
+ * A document catalog that carries its own `schema` and has no matching game definition is synthesized
36
+ * into a full {@link EditorCatalogDefinition} (label falls back to the id) so the Data panel, the
37
+ * `list_catalogs` RPC, and the count all see it. A game definition always wins on id collision — its
38
+ * schema lives in code and is authoritative. Document catalogs without a schema (plain value bags for
39
+ * a game-declared catalog) are ignored here; they are addressed through their game definition.
40
+ * @capability editor-catalogs Merge game-exported and editor-authored catalogs into one addressable set.
41
+ */
42
+ export declare function resolveCatalogDefinitions(document: EntityCatalogDocumentLike, gameDefinitions: readonly EditorCatalogDefinition[]): EditorCatalogDefinition[];
@@ -0,0 +1,101 @@
1
+ import { parseParams } from "../scene/sceneKinds.js";
2
+ /**
3
+ * Well-known catalog id for authored entity definitions. A `mob`/`boss` marker's `catalogId`
4
+ * references an entry (row) in this catalog, and {@link entityEntryFromCatalog} turns that row into
5
+ * the runtime {@link GameContextEntityEntry} a spawn consumes — so an entity's stats and speed are
6
+ * authored in the editor Data tab, not hardcoded in game TS.
7
+ */
8
+ export const ENTITY_CATALOG_ID = "entities";
9
+ const ENTITY_ROLES = ["player", "enemy", "hostile", "npc", "vehicle"];
10
+ /**
11
+ * The default {@link ParamSchema} for an authored entity definition — role, health, movement speed,
12
+ * and visual scale. Drives the editor Data-tab inspector for the `entities` catalog and is the shape
13
+ * {@link entityEntryFromCatalog} reads. A game exports it as an `editorCatalogs` schema; the scaffold
14
+ * ships a starter one so the tab is never empty.
15
+ * @capability editor-entities Author entity stats/movement per catalog row instead of hardcoding TS.
16
+ */
17
+ export const entityDefinitionSchema = {
18
+ fields: [
19
+ {
20
+ key: "role",
21
+ type: "select",
22
+ label: "Role",
23
+ default: "enemy",
24
+ options: ENTITY_ROLES.map((role) => ({ value: role })),
25
+ },
26
+ { key: "maxHealth", type: "number", label: "Max health", default: 20, min: 1, max: 100000, step: 1 },
27
+ { key: "walkSpeed", type: "range", label: "Walk speed", default: 3, min: 0, max: 20, step: 0.1, unit: "m/s" },
28
+ { key: "scale", type: "range", label: "Scale", default: 1, min: 0.1, max: 10, step: 0.1 },
29
+ ],
30
+ };
31
+ function entityCatalogDefinition(definitions) {
32
+ return definitions?.find((definition) => definition.id === ENTITY_CATALOG_ID);
33
+ }
34
+ /**
35
+ * Resolves the merged `meta` for one entity row: game-exported defaults (from `definitions`, if
36
+ * given) overlaid by the values persisted on the scene document. Returns `undefined` when neither
37
+ * source carries the row, so callers can distinguish "no such entity" from "default entity".
38
+ */
39
+ function mergedEntityMeta(document, entityId, definitions) {
40
+ const defaultEntry = entityCatalogDefinition(definitions)?.entries.find((entry) => entry.id === entityId);
41
+ const authored = document.catalogs
42
+ .find((catalog) => catalog.id === ENTITY_CATALOG_ID)
43
+ ?.entries.find((entry) => entry.id === entityId);
44
+ if (defaultEntry === undefined && authored === undefined)
45
+ return undefined;
46
+ return { ...defaultEntry?.meta, ...authored?.meta };
47
+ }
48
+ /**
49
+ * Turns an authored entity row into the runtime {@link GameContextEntityEntry} a spawn consumes:
50
+ * looks up `entityId` in the document's {@link ENTITY_CATALOG_ID} catalog (falling back to the
51
+ * game-exported `definitions` defaults), parses it against {@link entityDefinitionSchema}, and maps
52
+ * the fields onto stats/movement/role. Returns `null` when no row defines the entity, so the default
53
+ * `content.ts` path can chain other resolvers. The single seam that makes "place a mob, tune its
54
+ * stats/speed in the editor, save — it spawns with those stats" work with zero game code.
55
+ * @capability editor-entities Consume authored entity definitions from the scene document at runtime.
56
+ */
57
+ export function entityEntryFromCatalog(document, entityId, definitions) {
58
+ const meta = mergedEntityMeta(document, entityId, definitions);
59
+ if (meta === undefined)
60
+ return null;
61
+ // Prefer a document-carried schema for the entities catalog (an editor-authored schema) over the
62
+ // hardcoded default, so a game that re-authored the entity fields in the editor drives the parse.
63
+ const schema = document.catalogs.find((catalog) => catalog.id === ENTITY_CATALOG_ID)?.schema ?? entityDefinitionSchema;
64
+ const params = parseParams(schema, meta);
65
+ const role = params.role;
66
+ const maxHealth = params.maxHealth;
67
+ const walkSpeed = params.walkSpeed;
68
+ const scale = params.scale;
69
+ const entry = {
70
+ role,
71
+ stats: { health: { max: maxHealth, min: 0 } },
72
+ receive: { damage: { order: ["health"] } },
73
+ movement: { walkSpeed },
74
+ };
75
+ if (scale !== 1)
76
+ entry.scale = scale;
77
+ return entry;
78
+ }
79
+ /**
80
+ * Merges game-exported catalog definitions with editor-authored ones carried on the scene document.
81
+ * A document catalog that carries its own `schema` and has no matching game definition is synthesized
82
+ * into a full {@link EditorCatalogDefinition} (label falls back to the id) so the Data panel, the
83
+ * `list_catalogs` RPC, and the count all see it. A game definition always wins on id collision — its
84
+ * schema lives in code and is authoritative. Document catalogs without a schema (plain value bags for
85
+ * a game-declared catalog) are ignored here; they are addressed through their game definition.
86
+ * @capability editor-catalogs Merge game-exported and editor-authored catalogs into one addressable set.
87
+ */
88
+ export function resolveCatalogDefinitions(document, gameDefinitions) {
89
+ const byId = new Map(gameDefinitions.map((definition) => [definition.id, definition]));
90
+ for (const catalog of document.catalogs) {
91
+ if (catalog.schema === undefined || byId.has(catalog.id))
92
+ continue;
93
+ byId.set(catalog.id, {
94
+ id: catalog.id,
95
+ label: catalog.label ?? catalog.id,
96
+ schema: catalog.schema,
97
+ entries: catalog.entries,
98
+ });
99
+ }
100
+ return [...byId.values()];
101
+ }
@@ -0,0 +1,74 @@
1
+ import type { SkyEnvironmentConfig, WorldBounds } from "../world/features.js";
2
+ import type { AvoidZone } from "../world/geometry.js";
3
+ import { type ClearanceOptions } from "../world/scatterRegion.js";
4
+ import type { TerraformSnapshot } from "../world/terraform.js";
5
+ import type { EditorDocument, EditorEnvironment } from "./types.js";
6
+ /**
7
+ * World-authoring convergence (#1018, epic #1006 Phase 4): derive the **coordinate/placement**
8
+ * content of an `environment()` world from the scene document, so a game with an authored document
9
+ * needs no coordinate arrays in `world.ts` — the remaining `world.ts` surface is engine tuning
10
+ * (noise, materials, sky preset, physics). Terrain footprint follows the authored objects, ground
11
+ * clearings come from authored spawns/POIs (`clearanceZonesFrom`), and the sculpt snapshot is the
12
+ * document's own terrain overlay. Pure and serializable; consumers pass the result straight to
13
+ * `environment({ terrain: terrain({ bounds }), clearings, sculpt })`.
14
+ */
15
+ /** Options controlling how {@link environmentContentFromDocument} sizes and clears the world. */
16
+ export interface EnvironmentContentOptions extends ClearanceOptions {
17
+ /** Padding (m) added around the authored objects' extent when sizing the terrain. Default 24. */
18
+ padding?: number;
19
+ /** Minimum terrain footprint so a sparse document still yields a walkable world. Default 64×64. */
20
+ minBounds?: WorldBounds;
21
+ }
22
+ /** The coordinate/placement content of a world, derived from its scene document. */
23
+ export interface EnvironmentContent {
24
+ /** Terrain footprint (origin-centered) sized to cover every authored object plus padding. */
25
+ bounds: WorldBounds;
26
+ /** Ground-flatten discs under authored spawns/plots/POIs — feed `environment({ clearings })`. */
27
+ clearings: AvoidZone[];
28
+ /** The document's authored sculpt snapshot, when it has one — feed `environment({ sculpt })`. */
29
+ sculpt?: TerraformSnapshot;
30
+ /**
31
+ * Scene-document sky/fog/lighting (#1110), when authored. Feed into `environment({ sky: sky(sky) })`
32
+ * so the lighting workspace owns the look without hardcoding coordinates in world.ts.
33
+ */
34
+ sky?: SkyEnvironmentConfig;
35
+ }
36
+ /**
37
+ * Maps the scene document's serializable environment bag onto the runtime sky config consumed by
38
+ * `sky()` / `environment({ sky })`. Returns `undefined` when the document has no environment field
39
+ * so callers can fall back to a world.ts default without inventing values.
40
+ * @capability editor-environment project document lighting onto the runtime sky descriptor
41
+ */
42
+ export declare function skyFromDocument(doc: EditorDocument): SkyEnvironmentConfig | undefined;
43
+ /**
44
+ * Projects a validated {@link EditorEnvironment} bag onto {@link SkyEnvironmentConfig}.
45
+ *
46
+ * @internal
47
+ */
48
+ export declare function skyConfigFromEnvironment(env: EditorEnvironment): SkyEnvironmentConfig;
49
+ /**
50
+ * The origin-centered terrain footprint that covers every authored object in a document, padded and
51
+ * floored to `minBounds`. An empty document yields exactly `minBounds`. Because `environment()`
52
+ * terrain is centered on the origin, the footprint is sized symmetrically to the farthest object on
53
+ * each axis, so no authored object falls off the ground.
54
+ * @capability world-convergence size terrain to the authored document instead of a hardcoded bounds
55
+ */
56
+ export declare function terrainBoundsFromDocument(doc: EditorDocument, options?: EnvironmentContentOptions): WorldBounds;
57
+ /**
58
+ * Derives a terrain-depression sculpt snapshot from the document's authored `water` volumes: each
59
+ * water box carves a lake bed that ramps from the shoreline down to below the box's bottom face, so
60
+ * an editor-authored pond/lake sits *in* the ground instead of floating as a sheet on top of it (and
61
+ * ground-sampled vegetation sinks below the surface rather than growing through it). Returns
62
+ * `undefined` when the document has no water volumes.
63
+ * @capability world-convergence carve lake beds under authored water volumes
64
+ */
65
+ export declare function lakebedFromWaterVolumes(doc: EditorDocument): TerraformSnapshot | undefined;
66
+ /**
67
+ * Derives the coordinate/placement content of an `environment()` world from its scene document:
68
+ * terrain footprint (via {@link terrainBoundsFromDocument}), ground clearings under authored
69
+ * spawns/POIs (via `clearanceZonesFrom`), and the document's sculpt snapshot. This is the seam that
70
+ * lets a game author its world footprint and flatten regions in the editor instead of hardcoding
71
+ * them — the `world.ts` that consumes it carries only engine tuning.
72
+ * @capability world-convergence derive environment coordinate content from the scene document
73
+ */
74
+ export declare function environmentContentFromDocument(doc: EditorDocument, options?: EnvironmentContentOptions): EnvironmentContent;
@@ -0,0 +1,169 @@
1
+ import { clearanceZonesFrom, DEFAULT_CLEARANCE_KINDS } from "../world/scatterRegion.js";
2
+ import { editorDocumentBounds } from "./document.js";
3
+ /**
4
+ * Maps the scene document's serializable environment bag onto the runtime sky config consumed by
5
+ * `sky()` / `environment({ sky })`. Returns `undefined` when the document has no environment field
6
+ * so callers can fall back to a world.ts default without inventing values.
7
+ * @capability editor-environment project document lighting onto the runtime sky descriptor
8
+ */
9
+ export function skyFromDocument(doc) {
10
+ const env = doc.environment;
11
+ if (env === undefined)
12
+ return undefined;
13
+ return skyConfigFromEnvironment(env);
14
+ }
15
+ /**
16
+ * Projects a validated {@link EditorEnvironment} bag onto {@link SkyEnvironmentConfig}.
17
+ *
18
+ * @internal
19
+ */
20
+ export function skyConfigFromEnvironment(env) {
21
+ return {
22
+ ...(env.preset === undefined ? {} : { preset: env.preset }),
23
+ ...(env.timeOfDay === undefined ? {} : { timeOfDay: env.timeOfDay }),
24
+ ...(env.horizonColor === undefined ? {} : { horizonColor: env.horizonColor }),
25
+ ...(env.zenithColor === undefined ? {} : { zenithColor: env.zenithColor }),
26
+ ...(env.sunIntensity === undefined ? {} : { sunIntensity: env.sunIntensity }),
27
+ ...(env.ambientIntensity === undefined ? {} : { ambientIntensity: env.ambientIntensity }),
28
+ ...(env.fog === undefined ? {} : { fog: { ...env.fog } }),
29
+ };
30
+ }
31
+ /**
32
+ * The origin-centered terrain footprint that covers every authored object in a document, padded and
33
+ * floored to `minBounds`. An empty document yields exactly `minBounds`. Because `environment()`
34
+ * terrain is centered on the origin, the footprint is sized symmetrically to the farthest object on
35
+ * each axis, so no authored object falls off the ground.
36
+ * @capability world-convergence size terrain to the authored document instead of a hardcoded bounds
37
+ */
38
+ export function terrainBoundsFromDocument(doc, options = {}) {
39
+ const padding = options.padding ?? 24;
40
+ const min = options.minBounds ?? { w: 64, d: 64 };
41
+ const bounds = editorDocumentBounds(doc);
42
+ if (bounds === null)
43
+ return { w: min.w, d: min.d };
44
+ const halfX = Math.max(Math.abs(bounds.min.x), Math.abs(bounds.max.x));
45
+ const halfZ = Math.max(Math.abs(bounds.min.z), Math.abs(bounds.max.z));
46
+ return {
47
+ w: Math.max(min.w, halfX * 2 + padding * 2),
48
+ d: Math.max(min.d, halfZ * 2 + padding * 2),
49
+ };
50
+ }
51
+ const LAKEBED_CELL = 1.5;
52
+ /** Meters the bed drops below the water box's bottom face at full depth. */
53
+ const LAKEBED_UNDERCUT = 1.2;
54
+ /** Meters from the shoreline over which the bed ramps to full depth. */
55
+ const LAKEBED_SHORE_RAMP = 4;
56
+ /** Wavelength (m) of the seeded shore-ramp modulation that keeps the waterline organic. */
57
+ const LAKEBED_SHORE_NOISE_SCALE = 5.5;
58
+ /** Deterministic 2D value noise in [0,1] — the shoreline wobble must be stable across runs. */
59
+ function lakebedShoreNoise(x, z) {
60
+ const lattice = (ix, iz) => {
61
+ let h = (Math.imul(ix, 374761393) + Math.imul(iz, 668265263)) ^ 0x5bf03635;
62
+ h = Math.imul(h ^ (h >>> 13), 1274126177);
63
+ return ((h ^ (h >>> 16)) >>> 0) / 4294967296;
64
+ };
65
+ const ix = Math.floor(x);
66
+ const iz = Math.floor(z);
67
+ const fx = x - ix;
68
+ const fz = z - iz;
69
+ const ux = fx * fx * (3 - 2 * fx);
70
+ const uz = fz * fz * (3 - 2 * fz);
71
+ const a = lattice(ix, iz);
72
+ const b = lattice(ix + 1, iz);
73
+ const c = lattice(ix, iz + 1);
74
+ const d = lattice(ix + 1, iz + 1);
75
+ return a + (b - a) * ux + (c - a) * uz + (a - b - c + d) * ux * uz;
76
+ }
77
+ /**
78
+ * Derives a terrain-depression sculpt snapshot from the document's authored `water` volumes: each
79
+ * water box carves a lake bed that ramps from the shoreline down to below the box's bottom face, so
80
+ * an editor-authored pond/lake sits *in* the ground instead of floating as a sheet on top of it (and
81
+ * ground-sampled vegetation sinks below the surface rather than growing through it). Returns
82
+ * `undefined` when the document has no water volumes.
83
+ * @capability world-convergence carve lake beds under authored water volumes
84
+ */
85
+ export function lakebedFromWaterVolumes(doc) {
86
+ const waters = doc.volumes.filter((volume) => volume.kind === "water" && volume.halfExtents !== undefined);
87
+ if (waters.length === 0)
88
+ return undefined;
89
+ let minX = Infinity;
90
+ let minZ = Infinity;
91
+ let maxX = -Infinity;
92
+ let maxZ = -Infinity;
93
+ for (const water of waters) {
94
+ const he = water.halfExtents;
95
+ minX = Math.min(minX, water.center.x - he.x - LAKEBED_SHORE_RAMP);
96
+ minZ = Math.min(minZ, water.center.z - he.z - LAKEBED_SHORE_RAMP);
97
+ maxX = Math.max(maxX, water.center.x + he.x + LAKEBED_SHORE_RAMP);
98
+ maxZ = Math.max(maxZ, water.center.z + he.z + LAKEBED_SHORE_RAMP);
99
+ }
100
+ const cols = Math.max(1, Math.ceil((maxX - minX) / LAKEBED_CELL));
101
+ const rows = Math.max(1, Math.ceil((maxZ - minZ) / LAKEBED_CELL));
102
+ const vertsX = cols + 1;
103
+ const vertsZ = rows + 1;
104
+ const offsets = new Array(vertsX * vertsZ).fill(0);
105
+ for (let iz = 0; iz < vertsZ; iz += 1) {
106
+ for (let ix = 0; ix < vertsX; ix += 1) {
107
+ const x = minX + (ix / cols) * (maxX - minX);
108
+ const z = minZ + (iz / rows) * (maxZ - minZ);
109
+ let offset = 0;
110
+ for (const water of waters) {
111
+ const he = water.halfExtents;
112
+ // Rounded-rectangle signed distance on XZ (negative inside): the carve — and with it the
113
+ // waterline — rounds the box corners instead of stamping a sharp rectangle in the ground.
114
+ const rr = Math.min(he.x, he.z) * 0.3;
115
+ const ax = Math.abs(x - water.center.x) - he.x + rr;
116
+ const az = Math.abs(z - water.center.z) - he.z + rr;
117
+ const raw = Math.hypot(Math.max(ax, 0), Math.max(az, 0)) + Math.min(Math.max(ax, az), 0) - rr;
118
+ if (raw >= 0)
119
+ continue;
120
+ // Seeded wobble wanders the shoreline up to ±0.8 m, ramped in from the box edge so the
121
+ // carve never escapes the authored footprint.
122
+ const wobble = (lakebedShoreNoise(x / LAKEBED_SHORE_NOISE_SCALE, z / LAKEBED_SHORE_NOISE_SCALE) - 0.5) * 1.6;
123
+ const dist = raw + wobble * Math.min(1, -raw / 1.5);
124
+ if (dist >= 0)
125
+ continue;
126
+ const depth = he.y * 2 + LAKEBED_UNDERCUT;
127
+ const t = Math.min(1, -dist / LAKEBED_SHORE_RAMP);
128
+ // Smoothstep the shore ramp so the bed curves like a basin, not a funnel.
129
+ const w = t * t * (3 - 2 * t);
130
+ offset = Math.min(offset, -depth * w);
131
+ }
132
+ offsets[iz * vertsX + ix] = offset;
133
+ }
134
+ }
135
+ return {
136
+ bounds: { minX, minZ, maxX, maxZ },
137
+ cellSize: LAKEBED_CELL,
138
+ cols,
139
+ rows,
140
+ offsets,
141
+ surfaces: new Array(cols * rows).fill(null),
142
+ };
143
+ }
144
+ /**
145
+ * Derives the coordinate/placement content of an `environment()` world from its scene document:
146
+ * terrain footprint (via {@link terrainBoundsFromDocument}), ground clearings under authored
147
+ * spawns/POIs (via `clearanceZonesFrom`), and the document's sculpt snapshot. This is the seam that
148
+ * lets a game author its world footprint and flatten regions in the editor instead of hardcoding
149
+ * them — the `world.ts` that consumes it carries only engine tuning.
150
+ * @capability world-convergence derive environment coordinate content from the scene document
151
+ */
152
+ export function environmentContentFromDocument(doc, options = {}) {
153
+ const clearanceOptions = {
154
+ kinds: options.kinds ?? DEFAULT_CLEARANCE_KINDS,
155
+ ...(options.ids === undefined ? {} : { ids: options.ids }),
156
+ ...(options.defaultClearance === undefined ? {} : { defaultClearance: options.defaultClearance }),
157
+ ...(options.feather === undefined ? {} : { feather: options.feather }),
158
+ };
159
+ // The authored sculpt snapshot wins outright when the document carries one (the author owns the
160
+ // ground); otherwise water volumes derive their own lake-bed depression.
161
+ const sculpt = doc.terrain ?? lakebedFromWaterVolumes(doc);
162
+ const sky = skyFromDocument(doc);
163
+ return {
164
+ bounds: terrainBoundsFromDocument(doc, options),
165
+ clearings: clearanceZonesFrom(doc, clearanceOptions),
166
+ ...(sculpt === undefined ? {} : { sculpt }),
167
+ ...(sky === undefined ? {} : { sky }),
168
+ };
169
+ }
@@ -0,0 +1,229 @@
1
+ import type { EditorVec3 } from "./types.js";
2
+ /**
3
+ * How a grid layer's columns and rows map onto world axes.
4
+ * - `"xz"` (default): columns advance +X, rows advance +Z — a top-down floor plan / board.
5
+ * - `"xy"`: columns advance +X, rows advance +Y — a vertical slice / side-view board.
6
+ * @capability editor-grids Choose how grid columns/rows project onto world axes.
7
+ */
8
+ export type EditorGridAxes = "xz" | "xy";
9
+ /**
10
+ * One selectable value in a grid layer's palette: the cell value id plus how it reads (label,
11
+ * color) and how ASCII import/export maps it (`glyph`). Games register these so the editor and
12
+ * the import adapters share one legend. `meta` carries the typed payload (cost, damage, tags, …)
13
+ * a runtime attaches to every cell holding this value.
14
+ * @capability editor-grids Register a cell value's legend, glyph, color, and typed payload.
15
+ */
16
+ export interface EditorGridPaletteEntry {
17
+ id: string;
18
+ label?: string;
19
+ /** Single character this value maps to for ASCII/glyph import/export. */
20
+ glyph?: string;
21
+ color?: string;
22
+ meta?: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * A sparse, editor-owned tile grid serialized on the scene document. Only non-empty cells are
26
+ * stored (a `col,row` → value-id map), so a mostly empty grid stays small no matter how large its
27
+ * declared `cols`/`rows` bounds are. `kind` names the game schema the cells belong to (`room`,
28
+ * `tactics`, `nav`, `farm`, …); `palette` carries the typed cell payloads by value id; `empty`
29
+ * is the value id treated as background (cells holding it are dropped from `cells`). Runtime and
30
+ * rendering both read the same layer through the query helpers in this module — renderers are
31
+ * registered adapters over this data, never baked into it.
32
+ * @capability editor-grids Serialize grid-addressed tile content on the scene document.
33
+ */
34
+ export interface EditorGridLayer {
35
+ id: string;
36
+ kind: string;
37
+ label?: string;
38
+ /** World position of cell (0, 0)'s center; `cellSize` and `axes` place every other cell. */
39
+ origin: EditorVec3;
40
+ /** Column/row → world-axis mapping; defaults to `"xz"` when absent. */
41
+ axes?: EditorGridAxes;
42
+ /** World size of one cell along both grid axes. */
43
+ cellSize: number;
44
+ cols: number;
45
+ rows: number;
46
+ /** Value id treated as empty/background; cells holding it are omitted from `cells`. Default `""`. */
47
+ empty?: string;
48
+ /** Sparse cells keyed `"col,row"` → palette value id. Only non-empty, in-bounds cells appear. */
49
+ cells: Record<string, string>;
50
+ palette?: EditorGridPaletteEntry[];
51
+ visible?: boolean;
52
+ /** Id of the object this layer is parented under (mirrors marker/volume/path parenting). */
53
+ parentId?: string;
54
+ meta?: Record<string, unknown>;
55
+ /** Cell-semantics schema version; {@link migrateGridLayer} normalizes older layers forward. */
56
+ schemaVersion?: number;
57
+ }
58
+ /** One resolved cell of a grid layer — its column, row, and value id. */
59
+ export interface EditorGridCell {
60
+ col: number;
61
+ row: number;
62
+ value: string;
63
+ }
64
+ /** A single paint/erase edit: set cell `col,row` to `value` (the layer's empty value erases it). */
65
+ export interface EditorGridCellEdit {
66
+ col: number;
67
+ row: number;
68
+ value: string;
69
+ }
70
+ /** The grid-layer cell-schema version this build writes and migrates toward. */
71
+ export declare const CURRENT_GRID_SCHEMA_VERSION = 1;
72
+ /**
73
+ * The value id a layer treats as empty/background (default `""`). Cells holding this value are
74
+ * never stored, so it is what {@link getGridCell} returns for any unset cell.
75
+ * @capability editor-grids Resolve a grid layer's empty/background value id.
76
+ */
77
+ export declare function gridEmptyValue(layer: EditorGridLayer): string;
78
+ /** Builds the sparse-map key for a cell. @internal */
79
+ export declare function gridCellKey(col: number, row: number): string;
80
+ /**
81
+ * Parses a `"col,row"` sparse-map key back into integer coordinates, or `null` when malformed.
82
+ * @capability editor-grids Decode a grid layer's sparse cell key.
83
+ */
84
+ export declare function parseGridCellKey(key: string): {
85
+ col: number;
86
+ row: number;
87
+ } | null;
88
+ /**
89
+ * True when `col,row` falls inside the layer's declared bounds.
90
+ * @capability editor-grids Bounds-check a grid coordinate before reading or writing it.
91
+ */
92
+ export declare function inGridBounds(layer: EditorGridLayer, col: number, row: number): boolean;
93
+ /**
94
+ * Reads the value id at `col,row`, returning the layer's empty value for any unset or
95
+ * out-of-bounds cell. The one read path both gameplay and rendering share.
96
+ * @capability editor-grids Read a grid cell's value id.
97
+ */
98
+ export declare function getGridCell(layer: EditorGridLayer, col: number, row: number): string;
99
+ /**
100
+ * Samples the value id at `col,row` — the eyedropper. Identical to {@link getGridCell}, named for
101
+ * the authoring op that picks up a cell's value to paint with.
102
+ * @capability editor-grids Eyedrop (sample) a grid cell's value for painting.
103
+ */
104
+ export declare function eyedropGridCell(layer: EditorGridLayer, col: number, row: number): string;
105
+ /**
106
+ * Returns a copy of the layer with `col,row` set to `value`, dropping the cell when `value` is the
107
+ * empty value (that is the erase op). Out-of-bounds writes and no-op writes return the layer
108
+ * unchanged, so callers can diff by identity.
109
+ * @capability editor-grids Paint or erase a single grid cell (immutable).
110
+ */
111
+ export declare function setGridCell(layer: EditorGridLayer, col: number, row: number, value: string): EditorGridLayer;
112
+ /**
113
+ * Erases `col,row` back to the layer's empty value — {@link setGridCell} with the empty value.
114
+ * @capability editor-grids Erase a single grid cell (immutable).
115
+ */
116
+ export declare function eraseGridCell(layer: EditorGridLayer, col: number, row: number): EditorGridLayer;
117
+ /**
118
+ * Applies a batch of cell edits in one pass, returning the same layer when nothing changed. The
119
+ * op the editor uses for a drag stroke, a paste, or any multi-cell paint/erase.
120
+ * @capability editor-grids Paint or erase many grid cells in one immutable update.
121
+ */
122
+ export declare function paintGridCells(layer: EditorGridLayer, edits: readonly EditorGridCellEdit[]): EditorGridLayer;
123
+ /**
124
+ * Fills the inclusive rectangle spanning the two corners with `value` (the rectangle tool). Corners
125
+ * may be given in any order; the clamped in-bounds portion is painted.
126
+ * @capability editor-grids Fill a grid rectangle with one value (immutable).
127
+ */
128
+ export declare function fillGridRect(layer: EditorGridLayer, col0: number, row0: number, col1: number, row1: number, value: string): EditorGridLayer;
129
+ /**
130
+ * Flood-fills the 4-connected region of cells sharing the seed cell's value, replacing it with
131
+ * `value` (the bucket tool). Bounded by the layer's declared bounds, so it never scans the world.
132
+ * @capability editor-grids Bucket flood-fill a contiguous grid region (immutable).
133
+ */
134
+ export declare function floodFillGrid(layer: EditorGridLayer, col: number, row: number, value: string): EditorGridLayer;
135
+ /**
136
+ * Resizes the layer's bounds to `cols`×`rows`, dropping any cells that fall outside the new extent
137
+ * (values are anchored at the origin corner). Negative or fractional sizes are floored to `≥ 0`.
138
+ * @capability editor-grids Resize a grid layer's bounds, trimming out-of-range cells (immutable).
139
+ */
140
+ export declare function resizeGridLayer(layer: EditorGridLayer, cols: number, rows: number): EditorGridLayer;
141
+ /**
142
+ * Every non-empty, in-bounds cell of a layer, sorted row-major (rendering-independent iteration).
143
+ * @capability editor-grids Iterate a grid layer's non-empty cells, row-major.
144
+ */
145
+ export declare function gridCellEntries(layer: EditorGridLayer): EditorGridCell[];
146
+ /**
147
+ * Visits every non-empty cell of a layer row-major. Allocation-light convenience over
148
+ * {@link gridCellEntries} for runtime scans that only need a callback.
149
+ * @capability editor-grids Walk a grid layer's non-empty cells with a callback.
150
+ */
151
+ export declare function forEachGridCell(layer: EditorGridLayer, visit: (cell: EditorGridCell) => void): void;
152
+ /**
153
+ * Counts the non-empty, in-bounds cells of a layer.
154
+ * @capability editor-grids Count a grid layer's non-empty cells.
155
+ */
156
+ export declare function gridCellCount(layer: EditorGridLayer): number;
157
+ /**
158
+ * Every in-bounds cell holding `value`, sorted row-major — the query gameplay uses to find all
159
+ * spawns, hazards, gates, etc. of one kind without touching a renderer.
160
+ * @capability editor-grids Query all grid cells holding a given value.
161
+ */
162
+ export declare function gridCellsOfValue(layer: EditorGridLayer, value: string): EditorGridCell[];
163
+ /**
164
+ * World-space center of cell `col,row`, honoring the layer's origin, cell size, and axis mapping.
165
+ * The shared cell→world map for both placement and rendering.
166
+ * @capability editor-grids Map a grid cell to its world-space center.
167
+ */
168
+ export declare function gridCellToWorld(layer: EditorGridLayer, col: number, row: number): EditorVec3;
169
+ /**
170
+ * Inverse of {@link gridCellToWorld}: the nearest cell to a world point (may be out of bounds).
171
+ * The shared world→cell map runtime uses to answer "which cell is the player standing on".
172
+ * @capability editor-grids Map a world-space point to its nearest grid cell.
173
+ */
174
+ export declare function worldToGridCell(layer: EditorGridLayer, x: number, y: number, z: number): {
175
+ col: number;
176
+ row: number;
177
+ };
178
+ /**
179
+ * The value id at the grid cell nearest a world point — {@link worldToGridCell} then
180
+ * {@link getGridCell}. Answers "what tile is here" straight from a world position.
181
+ * @capability editor-grids Read the grid value at a world-space point.
182
+ */
183
+ export declare function getGridCellAtWorld(layer: EditorGridLayer, x: number, y: number, z: number): string;
184
+ /**
185
+ * Looks up a palette entry by value id.
186
+ * @capability editor-grids Find a grid palette entry by value id.
187
+ */
188
+ export declare function findGridPaletteEntry(layer: EditorGridLayer, value: string): EditorGridPaletteEntry | undefined;
189
+ /**
190
+ * Builds the value-id → glyph map from a layer's palette, for ASCII/glyph export.
191
+ * @capability editor-grids Derive a value→glyph legend from a grid layer's palette.
192
+ */
193
+ export declare function gridGlyphMap(layer: EditorGridLayer): Record<string, string>;
194
+ /** Fields accepted when constructing a grid layer; sensible defaults fill the rest. */
195
+ export interface CreateGridLayerInit {
196
+ id: string;
197
+ kind: string;
198
+ cols: number;
199
+ rows: number;
200
+ label?: string;
201
+ cellSize?: number;
202
+ origin?: EditorVec3;
203
+ axes?: EditorGridAxes;
204
+ empty?: string;
205
+ cells?: Record<string, string>;
206
+ palette?: readonly EditorGridPaletteEntry[];
207
+ visible?: boolean;
208
+ meta?: Record<string, unknown>;
209
+ }
210
+ /**
211
+ * Creates a grid layer from a partial init, defaulting cell size to `1`, origin to the world
212
+ * origin, and axes to `"xz"`. Runs the result through {@link migrateGridLayer} so it is normalized
213
+ * and bounds-clean.
214
+ * @capability editor-grids Create a normalized, empty grid layer to author into.
215
+ */
216
+ export declare function createGridLayer(init: CreateGridLayerInit): EditorGridLayer;
217
+ /**
218
+ * Normalizes a grid layer forward to the current cell-schema version: clamps `cols`/`rows` to
219
+ * non-negative integers, drops out-of-bounds and empty-valued cells, and stamps `schemaVersion`.
220
+ * The single migration seam every loader and authoring op funnels new/old layers through, so a
221
+ * layer from an older document or an import adapter always lands in a valid, minimal shape.
222
+ * @capability editor-grids Migrate/normalize a grid layer to the current cell schema.
223
+ */
224
+ export declare function migrateGridLayer(layer: EditorGridLayer): EditorGridLayer;
225
+ /**
226
+ * Deep-clones a grid layer so authoring edits and history snapshots never alias source cells.
227
+ * @capability editor-grids Deep-clone a grid layer.
228
+ */
229
+ export declare function cloneGridLayer(layer: EditorGridLayer): EditorGridLayer;