@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,366 @@
1
+ /** The grid-layer cell-schema version this build writes and migrates toward. */
2
+ export const CURRENT_GRID_SCHEMA_VERSION = 1;
3
+ /**
4
+ * The value id a layer treats as empty/background (default `""`). Cells holding this value are
5
+ * never stored, so it is what {@link getGridCell} returns for any unset cell.
6
+ * @capability editor-grids Resolve a grid layer's empty/background value id.
7
+ */
8
+ export function gridEmptyValue(layer) {
9
+ return layer.empty ?? "";
10
+ }
11
+ /** Builds the sparse-map key for a cell. @internal */
12
+ export function gridCellKey(col, row) {
13
+ return `${col},${row}`;
14
+ }
15
+ /**
16
+ * Parses a `"col,row"` sparse-map key back into integer coordinates, or `null` when malformed.
17
+ * @capability editor-grids Decode a grid layer's sparse cell key.
18
+ */
19
+ export function parseGridCellKey(key) {
20
+ const comma = key.indexOf(",");
21
+ if (comma <= 0)
22
+ return null;
23
+ const col = Number.parseInt(key.slice(0, comma), 10);
24
+ const row = Number.parseInt(key.slice(comma + 1), 10);
25
+ if (!Number.isInteger(col) || !Number.isInteger(row))
26
+ return null;
27
+ return { col, row };
28
+ }
29
+ /**
30
+ * True when `col,row` falls inside the layer's declared bounds.
31
+ * @capability editor-grids Bounds-check a grid coordinate before reading or writing it.
32
+ */
33
+ export function inGridBounds(layer, col, row) {
34
+ return col >= 0 && row >= 0 && col < layer.cols && row < layer.rows;
35
+ }
36
+ /**
37
+ * Reads the value id at `col,row`, returning the layer's empty value for any unset or
38
+ * out-of-bounds cell. The one read path both gameplay and rendering share.
39
+ * @capability editor-grids Read a grid cell's value id.
40
+ */
41
+ export function getGridCell(layer, col, row) {
42
+ if (!inGridBounds(layer, col, row))
43
+ return gridEmptyValue(layer);
44
+ return layer.cells[gridCellKey(col, row)] ?? gridEmptyValue(layer);
45
+ }
46
+ /**
47
+ * Samples the value id at `col,row` — the eyedropper. Identical to {@link getGridCell}, named for
48
+ * the authoring op that picks up a cell's value to paint with.
49
+ * @capability editor-grids Eyedrop (sample) a grid cell's value for painting.
50
+ */
51
+ export function eyedropGridCell(layer, col, row) {
52
+ return getGridCell(layer, col, row);
53
+ }
54
+ /**
55
+ * Returns a copy of the layer with `col,row` set to `value`, dropping the cell when `value` is the
56
+ * empty value (that is the erase op). Out-of-bounds writes and no-op writes return the layer
57
+ * unchanged, so callers can diff by identity.
58
+ * @capability editor-grids Paint or erase a single grid cell (immutable).
59
+ */
60
+ export function setGridCell(layer, col, row, value) {
61
+ if (!inGridBounds(layer, col, row))
62
+ return layer;
63
+ const empty = gridEmptyValue(layer);
64
+ const key = gridCellKey(col, row);
65
+ const cells = { ...layer.cells };
66
+ if (value === empty) {
67
+ if (!(key in cells))
68
+ return layer;
69
+ delete cells[key];
70
+ }
71
+ else {
72
+ if (cells[key] === value)
73
+ return layer;
74
+ cells[key] = value;
75
+ }
76
+ return { ...layer, cells };
77
+ }
78
+ /**
79
+ * Erases `col,row` back to the layer's empty value — {@link setGridCell} with the empty value.
80
+ * @capability editor-grids Erase a single grid cell (immutable).
81
+ */
82
+ export function eraseGridCell(layer, col, row) {
83
+ return setGridCell(layer, col, row, gridEmptyValue(layer));
84
+ }
85
+ /**
86
+ * Applies a batch of cell edits in one pass, returning the same layer when nothing changed. The
87
+ * op the editor uses for a drag stroke, a paste, or any multi-cell paint/erase.
88
+ * @capability editor-grids Paint or erase many grid cells in one immutable update.
89
+ */
90
+ export function paintGridCells(layer, edits) {
91
+ const empty = gridEmptyValue(layer);
92
+ const cells = { ...layer.cells };
93
+ let changed = false;
94
+ for (const edit of edits) {
95
+ if (!inGridBounds(layer, edit.col, edit.row))
96
+ continue;
97
+ const key = gridCellKey(edit.col, edit.row);
98
+ if (edit.value === empty) {
99
+ if (key in cells) {
100
+ delete cells[key];
101
+ changed = true;
102
+ }
103
+ }
104
+ else if (cells[key] !== edit.value) {
105
+ cells[key] = edit.value;
106
+ changed = true;
107
+ }
108
+ }
109
+ return changed ? { ...layer, cells } : layer;
110
+ }
111
+ /**
112
+ * Fills the inclusive rectangle spanning the two corners with `value` (the rectangle tool). Corners
113
+ * may be given in any order; the clamped in-bounds portion is painted.
114
+ * @capability editor-grids Fill a grid rectangle with one value (immutable).
115
+ */
116
+ export function fillGridRect(layer, col0, row0, col1, row1, value) {
117
+ const cLo = Math.max(0, Math.min(col0, col1));
118
+ const cHi = Math.min(layer.cols - 1, Math.max(col0, col1));
119
+ const rLo = Math.max(0, Math.min(row0, row1));
120
+ const rHi = Math.min(layer.rows - 1, Math.max(row0, row1));
121
+ const edits = [];
122
+ for (let row = rLo; row <= rHi; row += 1) {
123
+ for (let col = cLo; col <= cHi; col += 1)
124
+ edits.push({ col, row, value });
125
+ }
126
+ return paintGridCells(layer, edits);
127
+ }
128
+ /**
129
+ * Flood-fills the 4-connected region of cells sharing the seed cell's value, replacing it with
130
+ * `value` (the bucket tool). Bounded by the layer's declared bounds, so it never scans the world.
131
+ * @capability editor-grids Bucket flood-fill a contiguous grid region (immutable).
132
+ */
133
+ export function floodFillGrid(layer, col, row, value) {
134
+ if (!inGridBounds(layer, col, row))
135
+ return layer;
136
+ const target = getGridCell(layer, col, row);
137
+ if (target === value)
138
+ return layer;
139
+ const edits = [];
140
+ const seen = new Set();
141
+ const stack = [[col, row]];
142
+ while (stack.length > 0) {
143
+ const [c, r] = stack.pop();
144
+ if (!inGridBounds(layer, c, r))
145
+ continue;
146
+ const key = gridCellKey(c, r);
147
+ if (seen.has(key))
148
+ continue;
149
+ seen.add(key);
150
+ if (getGridCell(layer, c, r) !== target)
151
+ continue;
152
+ edits.push({ col: c, row: r, value });
153
+ stack.push([c + 1, r], [c - 1, r], [c, r + 1], [c, r - 1]);
154
+ }
155
+ return paintGridCells(layer, edits);
156
+ }
157
+ /**
158
+ * Resizes the layer's bounds to `cols`×`rows`, dropping any cells that fall outside the new extent
159
+ * (values are anchored at the origin corner). Negative or fractional sizes are floored to `≥ 0`.
160
+ * @capability editor-grids Resize a grid layer's bounds, trimming out-of-range cells (immutable).
161
+ */
162
+ export function resizeGridLayer(layer, cols, rows) {
163
+ const nextCols = Math.max(0, Math.floor(cols));
164
+ const nextRows = Math.max(0, Math.floor(rows));
165
+ if (nextCols === layer.cols && nextRows === layer.rows)
166
+ return layer;
167
+ const cells = {};
168
+ for (const [key, value] of Object.entries(layer.cells)) {
169
+ const parsed = parseGridCellKey(key);
170
+ if (parsed !== null && parsed.col < nextCols && parsed.row < nextRows)
171
+ cells[key] = value;
172
+ }
173
+ return { ...layer, cols: nextCols, rows: nextRows, cells };
174
+ }
175
+ /**
176
+ * Every non-empty, in-bounds cell of a layer, sorted row-major (rendering-independent iteration).
177
+ * @capability editor-grids Iterate a grid layer's non-empty cells, row-major.
178
+ */
179
+ export function gridCellEntries(layer) {
180
+ const out = [];
181
+ for (const [key, value] of Object.entries(layer.cells)) {
182
+ const parsed = parseGridCellKey(key);
183
+ if (parsed === null || !inGridBounds(layer, parsed.col, parsed.row))
184
+ continue;
185
+ out.push({ col: parsed.col, row: parsed.row, value });
186
+ }
187
+ out.sort((a, b) => a.row - b.row || a.col - b.col);
188
+ return out;
189
+ }
190
+ /**
191
+ * Visits every non-empty cell of a layer row-major. Allocation-light convenience over
192
+ * {@link gridCellEntries} for runtime scans that only need a callback.
193
+ * @capability editor-grids Walk a grid layer's non-empty cells with a callback.
194
+ */
195
+ export function forEachGridCell(layer, visit) {
196
+ for (const cell of gridCellEntries(layer))
197
+ visit(cell);
198
+ }
199
+ /**
200
+ * Counts the non-empty, in-bounds cells of a layer.
201
+ * @capability editor-grids Count a grid layer's non-empty cells.
202
+ */
203
+ export function gridCellCount(layer) {
204
+ let count = 0;
205
+ for (const [key, value] of Object.entries(layer.cells)) {
206
+ if (value === gridEmptyValue(layer))
207
+ continue;
208
+ const parsed = parseGridCellKey(key);
209
+ if (parsed !== null && inGridBounds(layer, parsed.col, parsed.row))
210
+ count += 1;
211
+ }
212
+ return count;
213
+ }
214
+ /**
215
+ * Every in-bounds cell holding `value`, sorted row-major — the query gameplay uses to find all
216
+ * spawns, hazards, gates, etc. of one kind without touching a renderer.
217
+ * @capability editor-grids Query all grid cells holding a given value.
218
+ */
219
+ export function gridCellsOfValue(layer, value) {
220
+ return gridCellEntries(layer).filter((cell) => cell.value === value);
221
+ }
222
+ /**
223
+ * World-space center of cell `col,row`, honoring the layer's origin, cell size, and axis mapping.
224
+ * The shared cell→world map for both placement and rendering.
225
+ * @capability editor-grids Map a grid cell to its world-space center.
226
+ */
227
+ export function gridCellToWorld(layer, col, row) {
228
+ const primary = col * layer.cellSize;
229
+ const secondary = row * layer.cellSize;
230
+ if ((layer.axes ?? "xz") === "xy") {
231
+ return { x: layer.origin.x + primary, y: layer.origin.y + secondary, z: layer.origin.z };
232
+ }
233
+ return { x: layer.origin.x + primary, y: layer.origin.y, z: layer.origin.z + secondary };
234
+ }
235
+ /**
236
+ * Inverse of {@link gridCellToWorld}: the nearest cell to a world point (may be out of bounds).
237
+ * The shared world→cell map runtime uses to answer "which cell is the player standing on".
238
+ * @capability editor-grids Map a world-space point to its nearest grid cell.
239
+ */
240
+ export function worldToGridCell(layer, x, y, z) {
241
+ const col = Math.round((x - layer.origin.x) / layer.cellSize);
242
+ if ((layer.axes ?? "xz") === "xy") {
243
+ return { col, row: Math.round((y - layer.origin.y) / layer.cellSize) };
244
+ }
245
+ return { col, row: Math.round((z - layer.origin.z) / layer.cellSize) };
246
+ }
247
+ /**
248
+ * The value id at the grid cell nearest a world point — {@link worldToGridCell} then
249
+ * {@link getGridCell}. Answers "what tile is here" straight from a world position.
250
+ * @capability editor-grids Read the grid value at a world-space point.
251
+ */
252
+ export function getGridCellAtWorld(layer, x, y, z) {
253
+ const { col, row } = worldToGridCell(layer, x, y, z);
254
+ return getGridCell(layer, col, row);
255
+ }
256
+ /**
257
+ * Looks up a palette entry by value id.
258
+ * @capability editor-grids Find a grid palette entry by value id.
259
+ */
260
+ export function findGridPaletteEntry(layer, value) {
261
+ return layer.palette?.find((entry) => entry.id === value);
262
+ }
263
+ /**
264
+ * Builds the value-id → glyph map from a layer's palette, for ASCII/glyph export.
265
+ * @capability editor-grids Derive a value→glyph legend from a grid layer's palette.
266
+ */
267
+ export function gridGlyphMap(layer) {
268
+ const map = {};
269
+ for (const entry of layer.palette ?? []) {
270
+ if (entry.glyph !== undefined)
271
+ map[entry.id] = entry.glyph;
272
+ }
273
+ return map;
274
+ }
275
+ /**
276
+ * Creates a grid layer from a partial init, defaulting cell size to `1`, origin to the world
277
+ * origin, and axes to `"xz"`. Runs the result through {@link migrateGridLayer} so it is normalized
278
+ * and bounds-clean.
279
+ * @capability editor-grids Create a normalized, empty grid layer to author into.
280
+ */
281
+ export function createGridLayer(init) {
282
+ return migrateGridLayer({
283
+ id: init.id,
284
+ kind: init.kind,
285
+ ...(init.label === undefined ? {} : { label: init.label }),
286
+ origin: init.origin ?? { x: 0, y: 0, z: 0 },
287
+ ...(init.axes === undefined ? {} : { axes: init.axes }),
288
+ cellSize: init.cellSize ?? 1,
289
+ cols: init.cols,
290
+ rows: init.rows,
291
+ ...(init.empty === undefined ? {} : { empty: init.empty }),
292
+ cells: init.cells ?? {},
293
+ ...(init.palette === undefined ? {} : { palette: init.palette.map((entry) => ({ ...entry })) }),
294
+ ...(init.visible === undefined ? {} : { visible: init.visible }),
295
+ ...(init.meta === undefined ? {} : { meta: { ...init.meta } }),
296
+ });
297
+ }
298
+ /**
299
+ * Normalizes a grid layer forward to the current cell-schema version: clamps `cols`/`rows` to
300
+ * non-negative integers, drops out-of-bounds and empty-valued cells, and stamps `schemaVersion`.
301
+ * The single migration seam every loader and authoring op funnels new/old layers through, so a
302
+ * layer from an older document or an import adapter always lands in a valid, minimal shape.
303
+ * @capability editor-grids Migrate/normalize a grid layer to the current cell schema.
304
+ */
305
+ export function migrateGridLayer(layer) {
306
+ const cols = Math.max(0, Math.floor(layer.cols));
307
+ const rows = Math.max(0, Math.floor(layer.rows));
308
+ const empty = layer.empty ?? "";
309
+ const cells = {};
310
+ for (const [key, value] of Object.entries(layer.cells)) {
311
+ if (value === empty)
312
+ continue;
313
+ const parsed = parseGridCellKey(key);
314
+ if (parsed === null || parsed.col < 0 || parsed.row < 0 || parsed.col >= cols || parsed.row >= rows) {
315
+ continue;
316
+ }
317
+ cells[gridCellKey(parsed.col, parsed.row)] = value;
318
+ }
319
+ return {
320
+ id: layer.id,
321
+ kind: layer.kind,
322
+ ...(layer.label === undefined ? {} : { label: layer.label }),
323
+ origin: { x: layer.origin.x, y: layer.origin.y, z: layer.origin.z },
324
+ ...(layer.axes === undefined ? {} : { axes: layer.axes }),
325
+ cellSize: layer.cellSize,
326
+ cols,
327
+ rows,
328
+ ...(empty === "" ? {} : { empty }),
329
+ cells,
330
+ ...(layer.palette === undefined ? {} : { palette: layer.palette.map((entry) => ({ ...entry })) }),
331
+ ...(layer.visible === undefined ? {} : { visible: layer.visible }),
332
+ ...(layer.parentId === undefined ? {} : { parentId: layer.parentId }),
333
+ ...(layer.meta === undefined ? {} : { meta: { ...layer.meta } }),
334
+ schemaVersion: CURRENT_GRID_SCHEMA_VERSION,
335
+ };
336
+ }
337
+ /**
338
+ * Deep-clones a grid layer so authoring edits and history snapshots never alias source cells.
339
+ * @capability editor-grids Deep-clone a grid layer.
340
+ */
341
+ export function cloneGridLayer(layer) {
342
+ return {
343
+ id: layer.id,
344
+ kind: layer.kind,
345
+ ...(layer.label === undefined ? {} : { label: layer.label }),
346
+ origin: { ...layer.origin },
347
+ ...(layer.axes === undefined ? {} : { axes: layer.axes }),
348
+ cellSize: layer.cellSize,
349
+ cols: layer.cols,
350
+ rows: layer.rows,
351
+ ...(layer.empty === undefined ? {} : { empty: layer.empty }),
352
+ cells: { ...layer.cells },
353
+ ...(layer.palette === undefined
354
+ ? {}
355
+ : {
356
+ palette: layer.palette.map((entry) => ({
357
+ ...entry,
358
+ ...(entry.meta === undefined ? {} : { meta: { ...entry.meta } }),
359
+ })),
360
+ }),
361
+ ...(layer.visible === undefined ? {} : { visible: layer.visible }),
362
+ ...(layer.parentId === undefined ? {} : { parentId: layer.parentId }),
363
+ ...(layer.meta === undefined ? {} : { meta: { ...layer.meta } }),
364
+ ...(layer.schemaVersion === undefined ? {} : { schemaVersion: layer.schemaVersion }),
365
+ };
366
+ }
@@ -0,0 +1,80 @@
1
+ import { type EditorGridAxes, type EditorGridLayer, type EditorGridPaletteEntry } from "./grid.js";
2
+ import type { EditorVec3 } from "./types.js";
3
+ /**
4
+ * Options for importing an ASCII/glyph map into a grid layer. Provide `glyphMap` (char → value id)
5
+ * or a `palette` whose entries carry `glyph`s (or both — `glyphMap` wins on conflict). Any glyph
6
+ * not mapped, and any short-row padding, resolves to `empty`.
7
+ * @capability editor-grid-import Configure an ASCII/glyph → grid-layer import.
8
+ */
9
+ export interface AsciiGridImportOptions {
10
+ id: string;
11
+ kind: string;
12
+ label?: string;
13
+ /** Explicit char → value id map. Merged over glyphs derived from `palette`. */
14
+ glyphMap?: Record<string, string>;
15
+ palette?: readonly EditorGridPaletteEntry[];
16
+ /** Value id for unmapped glyphs and ragged-row padding. Default `""`. */
17
+ empty?: string;
18
+ cellSize?: number;
19
+ origin?: EditorVec3;
20
+ axes?: EditorGridAxes;
21
+ meta?: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Parses an ASCII/glyph map — one row per text line, one char per cell — into a grid layer. Each
25
+ * glyph is resolved to a value id via the palette/`glyphMap`; unmapped glyphs and padding become
26
+ * the empty value, so a mostly-open room stays sparse. The canonical representation is the
27
+ * returned {@link EditorGridLayer}; ASCII is just this import path into it, never the source of
28
+ * truth. Bounds are the row count × longest row.
29
+ * @capability editor-grid-import Import an ASCII/glyph map into a grid layer.
30
+ */
31
+ export declare function importAsciiGrid(text: string, options: AsciiGridImportOptions): EditorGridLayer;
32
+ /** Options for rendering a grid layer back out as an ASCII/glyph map. */
33
+ export interface AsciiGridExportOptions {
34
+ /** value id → char. Defaults to the layer's palette glyphs. */
35
+ glyphMap?: Record<string, string>;
36
+ /** Char emitted for empty cells. Default `"."`. */
37
+ emptyGlyph?: string;
38
+ }
39
+ /**
40
+ * Renders a grid layer back to an ASCII/glyph map (rows top to bottom). Value ids map to chars via
41
+ * the layer palette (or an override map); empty cells become `emptyGlyph`. Round-trips with
42
+ * {@link importAsciiGrid} when the glyph legend matches.
43
+ * @capability editor-grid-import Export a grid layer as an ASCII/glyph map.
44
+ */
45
+ export declare function exportAsciiGrid(layer: EditorGridLayer, options?: AsciiGridExportOptions): string;
46
+ /** Options for importing a CSV grid (one value id per cell). */
47
+ export interface CsvGridImportOptions {
48
+ id: string;
49
+ kind: string;
50
+ label?: string;
51
+ /** Field separator. Default `","`. */
52
+ delimiter?: string;
53
+ /** Value id for blank fields and ragged-row padding. Default `""`. */
54
+ empty?: string;
55
+ cellSize?: number;
56
+ origin?: EditorVec3;
57
+ axes?: EditorGridAxes;
58
+ palette?: readonly EditorGridPaletteEntry[];
59
+ meta?: Record<string, unknown>;
60
+ }
61
+ /**
62
+ * Parses a CSV grid — one row per line, one value id per comma-separated field — into a grid
63
+ * layer. Blank fields become the empty value. Unlike ASCII this carries multi-character value ids
64
+ * directly, so it suits grids whose cell values are names rather than single glyphs.
65
+ * @capability editor-grid-import Import a CSV grid (value id per cell) into a grid layer.
66
+ */
67
+ export declare function importCsvGrid(text: string, options: CsvGridImportOptions): EditorGridLayer;
68
+ /** Options for exporting a grid layer as CSV. */
69
+ export interface CsvGridExportOptions {
70
+ /** Field separator. Default `","`. */
71
+ delimiter?: string;
72
+ /** Text emitted for empty cells. Default `""`. */
73
+ emptyField?: string;
74
+ }
75
+ /**
76
+ * Renders a grid layer as CSV — one row per line, each cell's value id as a field, empty cells as
77
+ * `emptyField`. Round-trips with {@link importCsvGrid}.
78
+ * @capability editor-grid-import Export a grid layer as CSV.
79
+ */
80
+ export declare function exportCsvGrid(layer: EditorGridLayer, options?: CsvGridExportOptions): string;
@@ -0,0 +1,134 @@
1
+ import { createGridLayer, getGridCell, gridCellKey, gridEmptyValue, gridGlyphMap, } from "./grid.js";
2
+ function normalizeLines(text) {
3
+ const lines = text.replace(/\r\n?/g, "\n").split("\n");
4
+ while (lines.length > 0 && lines[lines.length - 1] === "")
5
+ lines.pop();
6
+ return lines;
7
+ }
8
+ function glyphToValue(options) {
9
+ const map = {};
10
+ for (const entry of options.palette ?? []) {
11
+ if (entry.glyph !== undefined)
12
+ map[entry.glyph] = entry.id;
13
+ }
14
+ return { ...map, ...(options.glyphMap ?? {}) };
15
+ }
16
+ /**
17
+ * Parses an ASCII/glyph map — one row per text line, one char per cell — into a grid layer. Each
18
+ * glyph is resolved to a value id via the palette/`glyphMap`; unmapped glyphs and padding become
19
+ * the empty value, so a mostly-open room stays sparse. The canonical representation is the
20
+ * returned {@link EditorGridLayer}; ASCII is just this import path into it, never the source of
21
+ * truth. Bounds are the row count × longest row.
22
+ * @capability editor-grid-import Import an ASCII/glyph map into a grid layer.
23
+ */
24
+ export function importAsciiGrid(text, options) {
25
+ const lines = normalizeLines(text);
26
+ const rows = lines.length;
27
+ let cols = 0;
28
+ for (const line of lines)
29
+ cols = Math.max(cols, line.length);
30
+ const map = glyphToValue(options);
31
+ const empty = options.empty ?? "";
32
+ const cells = {};
33
+ lines.forEach((line, row) => {
34
+ for (let col = 0; col < line.length; col += 1) {
35
+ const value = map[line[col]] ?? empty;
36
+ if (value !== empty)
37
+ cells[gridCellKey(col, row)] = value;
38
+ }
39
+ });
40
+ return createGridLayer({
41
+ id: options.id,
42
+ kind: options.kind,
43
+ ...(options.label === undefined ? {} : { label: options.label }),
44
+ cols,
45
+ rows,
46
+ ...(options.cellSize === undefined ? {} : { cellSize: options.cellSize }),
47
+ ...(options.origin === undefined ? {} : { origin: options.origin }),
48
+ ...(options.axes === undefined ? {} : { axes: options.axes }),
49
+ ...(empty === "" ? {} : { empty }),
50
+ cells,
51
+ ...(options.palette === undefined ? {} : { palette: options.palette }),
52
+ ...(options.meta === undefined ? {} : { meta: options.meta }),
53
+ });
54
+ }
55
+ /**
56
+ * Renders a grid layer back to an ASCII/glyph map (rows top to bottom). Value ids map to chars via
57
+ * the layer palette (or an override map); empty cells become `emptyGlyph`. Round-trips with
58
+ * {@link importAsciiGrid} when the glyph legend matches.
59
+ * @capability editor-grid-import Export a grid layer as an ASCII/glyph map.
60
+ */
61
+ export function exportAsciiGrid(layer, options = {}) {
62
+ const glyphMap = options.glyphMap ?? gridGlyphMap(layer);
63
+ const emptyGlyph = options.emptyGlyph ?? ".";
64
+ const empty = gridEmptyValue(layer);
65
+ const lines = [];
66
+ for (let row = 0; row < layer.rows; row += 1) {
67
+ let line = "";
68
+ for (let col = 0; col < layer.cols; col += 1) {
69
+ const value = getGridCell(layer, col, row);
70
+ line += value === empty ? emptyGlyph : (glyphMap[value] ?? (value.charAt(0) || emptyGlyph));
71
+ }
72
+ lines.push(line);
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ /**
77
+ * Parses a CSV grid — one row per line, one value id per comma-separated field — into a grid
78
+ * layer. Blank fields become the empty value. Unlike ASCII this carries multi-character value ids
79
+ * directly, so it suits grids whose cell values are names rather than single glyphs.
80
+ * @capability editor-grid-import Import a CSV grid (value id per cell) into a grid layer.
81
+ */
82
+ export function importCsvGrid(text, options) {
83
+ const delimiter = options.delimiter ?? ",";
84
+ const empty = options.empty ?? "";
85
+ const lines = normalizeLines(text);
86
+ const rows = lines.length;
87
+ let cols = 0;
88
+ const parsed = lines.map((line) => {
89
+ const fields = line.split(delimiter).map((field) => field.trim());
90
+ cols = Math.max(cols, fields.length);
91
+ return fields;
92
+ });
93
+ const cells = {};
94
+ parsed.forEach((fields, row) => {
95
+ fields.forEach((value, col) => {
96
+ if (value !== "" && value !== empty)
97
+ cells[gridCellKey(col, row)] = value;
98
+ });
99
+ });
100
+ return createGridLayer({
101
+ id: options.id,
102
+ kind: options.kind,
103
+ ...(options.label === undefined ? {} : { label: options.label }),
104
+ cols,
105
+ rows,
106
+ ...(options.cellSize === undefined ? {} : { cellSize: options.cellSize }),
107
+ ...(options.origin === undefined ? {} : { origin: options.origin }),
108
+ ...(options.axes === undefined ? {} : { axes: options.axes }),
109
+ ...(empty === "" ? {} : { empty }),
110
+ cells,
111
+ ...(options.palette === undefined ? {} : { palette: options.palette }),
112
+ ...(options.meta === undefined ? {} : { meta: options.meta }),
113
+ });
114
+ }
115
+ /**
116
+ * Renders a grid layer as CSV — one row per line, each cell's value id as a field, empty cells as
117
+ * `emptyField`. Round-trips with {@link importCsvGrid}.
118
+ * @capability editor-grid-import Export a grid layer as CSV.
119
+ */
120
+ export function exportCsvGrid(layer, options = {}) {
121
+ const delimiter = options.delimiter ?? ",";
122
+ const emptyField = options.emptyField ?? "";
123
+ const empty = gridEmptyValue(layer);
124
+ const lines = [];
125
+ for (let row = 0; row < layer.rows; row += 1) {
126
+ const fields = [];
127
+ for (let col = 0; col < layer.cols; col += 1) {
128
+ const value = getGridCell(layer, col, row);
129
+ fields.push(value === empty ? emptyField : value);
130
+ }
131
+ lines.push(fields.join(delimiter));
132
+ }
133
+ return lines.join("\n");
134
+ }