@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,208 @@
1
+ import { pointInPolygon } from "./scatterRegion.js";
2
+ /** The built-in height→color ramp and water color a bake uses when no palette override is given. */
3
+ export const DEFAULT_MINIMAP_PALETTE = {
4
+ low: "#3f5d34",
5
+ high: "#cdbb93",
6
+ water: "#2f5d78",
7
+ };
8
+ function parseHex(hex) {
9
+ let value = hex.trim().replace(/^#/, "");
10
+ if (value.length === 3)
11
+ value = value.split("").map((c) => c + c).join("");
12
+ const int = Number.parseInt(value, 16);
13
+ if (!Number.isFinite(int) || value.length !== 6)
14
+ return { r: 0, g: 0, b: 0 };
15
+ return { r: (int >> 16) & 0xff, g: (int >> 8) & 0xff, b: int & 0xff };
16
+ }
17
+ function mix(a, b, t) {
18
+ const k = Math.max(0, Math.min(1, t));
19
+ return {
20
+ r: Math.round(a.r + (b.r - a.r) * k),
21
+ g: Math.round(a.g + (b.g - a.g) * k),
22
+ b: Math.round(a.b + (b.b - a.b) * k),
23
+ };
24
+ }
25
+ /**
26
+ * Rasterizes a top-down terrain image: height maps onto a low→high color ramp (normalized over the
27
+ * sampled height range), slope darkens the shade, water fills below `waterLevel`, and each zone
28
+ * polygon tints the ground it covers. Deterministic for a fixed source. The bounds are preserved so
29
+ * a player-centered minimap pans the image correctly.
30
+ * @capability minimap-bake rasterize authored terrain + zones into a top-down minimap image
31
+ */
32
+ export function bakeMinimapImage(source, options = {}) {
33
+ const resolution = Math.max(8, Math.floor(options.resolution ?? 128));
34
+ const palette = { ...DEFAULT_MINIMAP_PALETTE, ...options.palette };
35
+ const low = parseHex(palette.low);
36
+ const high = parseHex(palette.high);
37
+ const water = parseHex(palette.water);
38
+ const { minX, minZ, maxX, maxZ } = source.bounds;
39
+ const spanX = Math.max(1e-6, maxX - minX);
40
+ const spanZ = Math.max(1e-6, maxZ - minZ);
41
+ // Longer world axis gets `resolution` pixels; the other keeps aspect.
42
+ const width = spanX >= spanZ ? resolution : Math.max(8, Math.round((spanX / spanZ) * resolution));
43
+ const height = spanZ >= spanX ? resolution : Math.max(8, Math.round((spanZ / spanX) * resolution));
44
+ const worldX = (px) => minX + ((px + 0.5) / width) * spanX;
45
+ const worldZ = (py) => minZ + ((py + 0.5) / height) * spanZ;
46
+ // First pass: height range for a stable ramp.
47
+ let hMin = Infinity;
48
+ let hMax = -Infinity;
49
+ const heights = new Float64Array(width * height);
50
+ for (let py = 0; py < height; py += 1) {
51
+ for (let px = 0; px < width; px += 1) {
52
+ const h = source.sampleHeight(worldX(px), worldZ(py));
53
+ heights[py * width + px] = h;
54
+ if (h < hMin)
55
+ hMin = h;
56
+ if (h > hMax)
57
+ hMax = h;
58
+ }
59
+ }
60
+ const hSpan = Math.max(1e-6, hMax - hMin);
61
+ const pixels = new Uint8ClampedArray(width * height * 4);
62
+ const zones = source.zones ?? [];
63
+ for (let py = 0; py < height; py += 1) {
64
+ for (let px = 0; px < width; px += 1) {
65
+ const wx = worldX(px);
66
+ const wz = worldZ(py);
67
+ const h = heights[py * width + px];
68
+ let color;
69
+ if (source.waterLevel !== undefined && h <= source.waterLevel) {
70
+ color = water;
71
+ }
72
+ else {
73
+ color = mix(low, high, (h - hMin) / hSpan);
74
+ if (source.sampleNormal !== undefined) {
75
+ const n = source.sampleNormal(wx, wz);
76
+ const shade = 0.62 + 0.38 * Math.max(0, Math.min(1, n[1]));
77
+ color = { r: Math.round(color.r * shade), g: Math.round(color.g * shade), b: Math.round(color.b * shade) };
78
+ }
79
+ }
80
+ for (const zone of zones) {
81
+ if (pointInPolygon([wx, wz], zone.polygon)) {
82
+ color = mix(color, parseHex(zone.color), zone.alpha ?? 0.5);
83
+ }
84
+ }
85
+ const index = (py * width + px) * 4;
86
+ pixels[index] = color.r;
87
+ pixels[index + 1] = color.g;
88
+ pixels[index + 2] = color.b;
89
+ pixels[index + 3] = 255;
90
+ }
91
+ }
92
+ return { width, height, pixels, bounds: { minX, minZ, maxX, maxZ } };
93
+ }
94
+ // --- Minimal pure PNG encoder (RGBA, stored/uncompressed DEFLATE) ------------------------------
95
+ const CRC_TABLE = (() => {
96
+ const table = new Uint32Array(256);
97
+ for (let n = 0; n < 256; n += 1) {
98
+ let c = n;
99
+ for (let k = 0; k < 8; k += 1)
100
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
101
+ table[n] = c >>> 0;
102
+ }
103
+ return table;
104
+ })();
105
+ function crc32(bytes) {
106
+ let c = 0xffffffff;
107
+ for (let i = 0; i < bytes.length; i += 1)
108
+ c = CRC_TABLE[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);
109
+ return (c ^ 0xffffffff) >>> 0;
110
+ }
111
+ function adler32(bytes) {
112
+ let a = 1;
113
+ let b = 0;
114
+ for (let i = 0; i < bytes.length; i += 1) {
115
+ a = (a + bytes[i]) % 65521;
116
+ b = (b + a) % 65521;
117
+ }
118
+ return ((b << 16) | a) >>> 0;
119
+ }
120
+ /** Wraps raw bytes in a zlib stream using only stored (uncompressed) DEFLATE blocks. */
121
+ function zlibStore(data) {
122
+ const blocks = [0x78, 0x01]; // zlib header (no compression)
123
+ let offset = 0;
124
+ while (offset < data.length) {
125
+ const chunk = Math.min(0xffff, data.length - offset);
126
+ const final = offset + chunk >= data.length ? 1 : 0;
127
+ blocks.push(final, chunk & 0xff, (chunk >> 8) & 0xff, ~chunk & 0xff, (~chunk >> 8) & 0xff);
128
+ for (let i = 0; i < chunk; i += 1)
129
+ blocks.push(data[offset + i]);
130
+ offset += chunk;
131
+ }
132
+ const checksum = adler32(data);
133
+ blocks.push((checksum >>> 24) & 0xff, (checksum >>> 16) & 0xff, (checksum >>> 8) & 0xff, checksum & 0xff);
134
+ return Uint8Array.from(blocks);
135
+ }
136
+ function chunk(type, data) {
137
+ const typeBytes = Uint8Array.from([...type].map((c) => c.charCodeAt(0)));
138
+ const body = new Uint8Array(typeBytes.length + data.length);
139
+ body.set(typeBytes, 0);
140
+ body.set(data, typeBytes.length);
141
+ const crc = crc32(body);
142
+ const out = new Uint8Array(4 + body.length + 4);
143
+ const view = new DataView(out.buffer);
144
+ view.setUint32(0, data.length);
145
+ out.set(body, 4);
146
+ view.setUint32(4 + body.length, crc);
147
+ return out;
148
+ }
149
+ function base64(bytes) {
150
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
151
+ let out = "";
152
+ for (let i = 0; i < bytes.length; i += 3) {
153
+ const b0 = bytes[i];
154
+ const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;
155
+ const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;
156
+ out += chars[b0 >> 2];
157
+ out += chars[((b0 & 3) << 4) | (b1 >> 4)];
158
+ out += i + 1 < bytes.length ? chars[((b1 & 15) << 2) | (b2 >> 6)] : "=";
159
+ out += i + 2 < bytes.length ? chars[b2 & 63] : "=";
160
+ }
161
+ return out;
162
+ }
163
+ /** Encodes an RGBA bake to raw PNG bytes (pure; stored DEFLATE, valid for any decoder). */
164
+ export function encodeBakePng(bake) {
165
+ const { width, height, pixels } = bake;
166
+ const ihdr = new Uint8Array(13);
167
+ const ihdrView = new DataView(ihdr.buffer);
168
+ ihdrView.setUint32(0, width);
169
+ ihdrView.setUint32(4, height);
170
+ ihdr[8] = 8; // bit depth
171
+ ihdr[9] = 6; // color type RGBA
172
+ // 10,11,12 = compression/filter/interlace = 0
173
+ // Filtered scanlines: filter byte 0 (none) per row.
174
+ const raw = new Uint8Array(height * (1 + width * 4));
175
+ for (let y = 0; y < height; y += 1) {
176
+ const rowStart = y * (1 + width * 4);
177
+ raw[rowStart] = 0;
178
+ raw.set(pixels.subarray(y * width * 4, (y + 1) * width * 4), rowStart + 1);
179
+ }
180
+ const signature = Uint8Array.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
181
+ const parts = [
182
+ signature,
183
+ chunk("IHDR", ihdr),
184
+ chunk("IDAT", zlibStore(raw)),
185
+ chunk("IEND", new Uint8Array(0)),
186
+ ];
187
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
188
+ const out = new Uint8Array(total);
189
+ let offset = 0;
190
+ for (const part of parts) {
191
+ out.set(part, offset);
192
+ offset += part.length;
193
+ }
194
+ return out;
195
+ }
196
+ /**
197
+ * Encodes a bake as a `data:image/png;base64,...` URI — the exact string the `Minimap` /
198
+ * `WorldMap` `background` prop takes. Deterministic for a fixed bake.
199
+ * @capability minimap-bake encode a baked minimap as a PNG data URI for the Minimap background
200
+ */
201
+ export function minimapBakeToPngDataUri(bake) {
202
+ return `data:image/png;base64,${base64(encodeBakePng(bake))}`;
203
+ }
204
+ /** One-call convenience: rasterize a source and return `{ background, mapBounds }` for a minimap. */
205
+ export function bakeMinimapBackground(source, options = {}) {
206
+ const bake = bakeMinimapImage(source, options);
207
+ return { background: minimapBakeToPngDataUri(bake), mapBounds: bake.bounds };
208
+ }
@@ -0,0 +1,17 @@
1
+ import type { WorldXZ } from "./minimap.js";
2
+ /** A world-space segment defining a linear "track" minimap — points are projected onto the `from`→`to` axis. */
3
+ export interface TrackAxis {
4
+ from: WorldXZ;
5
+ to: WorldXZ;
6
+ }
7
+ /**
8
+ * Project a world point onto the `from`→`to` segment of `axis` and return the
9
+ * clamped 0..1 fraction of how far along the track it lies (0 at `from`, 1 at
10
+ * `to`). The linear analogue of `projectToMinimap` — feeds a horizontal
11
+ * corridor/route progress rail. Accepts XZ (`[x, z]`) or XYZ (`[x, y, z]`)
12
+ * points (index 0 = x, index 2 when length 3 else index 1 = z). A zero-length
13
+ * axis returns 0.
14
+ *
15
+ * @capability minimap-track project a world point to a 0..1 fraction along a linear track axis
16
+ */
17
+ export declare function trackFraction(point: WorldXZ | readonly [number, number, number], axis: TrackAxis): number;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Project a world point onto the `from`→`to` segment of `axis` and return the
3
+ * clamped 0..1 fraction of how far along the track it lies (0 at `from`, 1 at
4
+ * `to`). The linear analogue of `projectToMinimap` — feeds a horizontal
5
+ * corridor/route progress rail. Accepts XZ (`[x, z]`) or XYZ (`[x, y, z]`)
6
+ * points (index 0 = x, index 2 when length 3 else index 1 = z). A zero-length
7
+ * axis returns 0.
8
+ *
9
+ * @capability minimap-track project a world point to a 0..1 fraction along a linear track axis
10
+ */
11
+ export function trackFraction(point, axis) {
12
+ const px = point[0];
13
+ const pz = point.length === 3 ? point[2] : point[1];
14
+ const ax = axis.to[0] - axis.from[0];
15
+ const az = axis.to[1] - axis.from[1];
16
+ const lengthSq = ax * ax + az * az;
17
+ if (lengthSq === 0)
18
+ return 0;
19
+ const dot = (px - axis.from[0]) * ax + (pz - axis.from[1]) * az;
20
+ const fraction = dot / lengthSq;
21
+ return fraction < 0 ? 0 : fraction > 1 ? 1 : fraction;
22
+ }
@@ -0,0 +1,27 @@
1
+ /** One placed transform along a path: grounded position, facing yaw, and its ordinal + arc distance. */
2
+ export interface PathInstance {
3
+ index: number;
4
+ /** Arc-length distance from the path start, meters. */
5
+ distance: number;
6
+ position: readonly [number, number, number];
7
+ /** Yaw (radians) facing along the direction of travel. */
8
+ yaw: number;
9
+ }
10
+ /** Options for {@link placeAlongPath}. */
11
+ export interface PlaceAlongPathOptions {
12
+ /** Target meters between instances. The run is divided into equal spans nearest this spacing. */
13
+ spacing: number;
14
+ /** Ground each instance to this height sampler (else y = 0). */
15
+ sampleHeight?: (x: number, z: number) => number;
16
+ /** Force at least this many instances regardless of length. Default 1 (endpoints only when short). */
17
+ minCount?: number;
18
+ }
19
+ /**
20
+ * Evenly place transforms along `points` (XZ polyline). The run length is divided into the whole
21
+ * number of equal spans closest to `spacing`, so instances always land on both endpoints and stay
22
+ * evenly distributed. Returns `spans + 1` instances. Empty for fewer than 2 points.
23
+ */
24
+ export declare function placeAlongPath(points: readonly {
25
+ x: number;
26
+ z: number;
27
+ }[], options: PlaceAlongPathOptions): PathInstance[];
@@ -0,0 +1,27 @@
1
+ import { pointAtDistance, polyline, tangentAtDistance } from "./polyline.js";
2
+ /**
3
+ * Evenly place transforms along `points` (XZ polyline). The run length is divided into the whole
4
+ * number of equal spans closest to `spacing`, so instances always land on both endpoints and stay
5
+ * evenly distributed. Returns `spans + 1` instances. Empty for fewer than 2 points.
6
+ */
7
+ export function placeAlongPath(points, options) {
8
+ if (points.length < 2)
9
+ return [];
10
+ const line = polyline(points.map((point) => [point.x, point.z]));
11
+ const total = line.length;
12
+ if (total <= 0)
13
+ return [];
14
+ const spacing = Math.max(0.01, options.spacing);
15
+ const minSpans = Math.max(1, (options.minCount ?? 1) - 1);
16
+ const spans = Math.max(minSpans, Math.round(total / spacing), 1);
17
+ const step = total / spans;
18
+ const out = [];
19
+ for (let i = 0; i <= spans; i += 1) {
20
+ const distance = i * step;
21
+ const [x, z] = pointAtDistance(line, distance);
22
+ const [tx, tz] = tangentAtDistance(line, Math.min(distance, total - 1e-4));
23
+ const y = options.sampleHeight?.(x, z) ?? 0;
24
+ out.push({ index: i, distance, position: [x, y, z], yaw: Math.atan2(tx, tz) });
25
+ }
26
+ return out;
27
+ }
@@ -0,0 +1,159 @@
1
+ /** A path vertex in the volume-local XZ frame. */
2
+ export type PathVec2 = readonly [number, number];
3
+ /** Road hierarchy, widest to narrowest — shared by the city fabric and the renderer. */
4
+ export type PathLevel = "boulevard" | "avenue" | "street" | "lane";
5
+ /** A path feature spanning part of an edge/street: a bridge deck over a gap or a tunnel bore under a ridge. */
6
+ export type PathFeatureKind = "bridge" | "tunnel";
7
+ /** The generator's chosen topology family: an open street `net`, or a closed `circuit` loop. */
8
+ export type PathNetworkMode = "net" | "circuit";
9
+ /** One graph node: a junction, a dead end, or a mid-street bend, with its connection count. */
10
+ export interface PathNode {
11
+ id: number;
12
+ x: number;
13
+ z: number;
14
+ degree: number;
15
+ }
16
+ /** One atomic node-to-node edge — the fabric graph consumes these (welds at shared node coords). */
17
+ export interface PathEdge {
18
+ id: number;
19
+ /** Endpoint node ids. */
20
+ a: number;
21
+ b: number;
22
+ /** Sampled centerline; `points[0]` sits exactly on node `a`, the last on node `b`. */
23
+ points: PathVec2[];
24
+ width: number;
25
+ level: PathLevel;
26
+ /** True when this edge belongs to the main closed loop (circuit mode). */
27
+ loop: boolean;
28
+ }
29
+ /** A feature span carried by a street: a `[from, to]` index window into the street's `points`. */
30
+ export interface PathFeatureSpan {
31
+ kind: PathFeatureKind;
32
+ from: number;
33
+ to: number;
34
+ /** Ground height at each bank/portal — the deck/floor reference the renderer drapes to. */
35
+ bankHeight: number;
36
+ }
37
+ /** One chained through-street: a maximal run of edges through degree-2 nodes, for rendering + furniture. */
38
+ export interface PathStreet {
39
+ id: number;
40
+ /** Ordered node ids the chain visits; first === last when `loop`. */
41
+ nodes: number[];
42
+ /** Smoothed, turn-clamped centerline. */
43
+ points: PathVec2[];
44
+ width: number;
45
+ level: PathLevel;
46
+ /** Closed chain (a circuit lap or an inner ring). */
47
+ loop: boolean;
48
+ /** Cul-de-sac turning bulb when the street ends at a dangling node. */
49
+ bulb?: PathVec2;
50
+ /** Bridge/tunnel spans along this street, if any. */
51
+ features: PathFeatureSpan[];
52
+ }
53
+ /** One crossing of three or more streets: patch center/radius plus outgoing arm directions. */
54
+ export interface PathJunction {
55
+ x: number;
56
+ z: number;
57
+ radius: number;
58
+ level: PathLevel;
59
+ /** Outgoing arm directions (radians) with the crossing street width, for crosswalks/patches. */
60
+ arms: {
61
+ angle: number;
62
+ width: number;
63
+ }[];
64
+ }
65
+ /** One dangling street end kept as a cul-de-sac: node position plus the heading pointing off the road. */
66
+ export interface PathDeadEnd {
67
+ node: number;
68
+ x: number;
69
+ z: number;
70
+ /** Yaw (radians) facing outward, away from the network. */
71
+ heading: number;
72
+ width: number;
73
+ }
74
+ /** A resolved path feature in world-of-the-volume space: a bridge deck or tunnel bore centerline. */
75
+ export interface PathFeature {
76
+ kind: PathFeatureKind;
77
+ points: PathVec2[];
78
+ width: number;
79
+ bankHeight: number;
80
+ }
81
+ /** The fully-resolved network in volume-local coords. */
82
+ export interface PathNetwork {
83
+ mode: PathNetworkMode;
84
+ nodes: PathNode[];
85
+ /** Atomic edges — feed to the block/parcel fabric. */
86
+ edges: PathEdge[];
87
+ /** Chained through-streets — feed to the renderer, furniture, and analysis. */
88
+ streets: PathStreet[];
89
+ junctions: PathJunction[];
90
+ deadEnds: PathDeadEnd[];
91
+ bridges: PathFeature[];
92
+ tunnels: PathFeature[];
93
+ /** Independent cycle count (E − V + components): 0 = pure tree, ≥1 = has loops. */
94
+ loops: number;
95
+ }
96
+ /** Fully-defaulted slider set the generator reads. */
97
+ export interface PathNetworkRules {
98
+ seed: string;
99
+ /** 1 = regular lattice nodes; 0 = organic scatter. */
100
+ gridness: number;
101
+ /** 0 = tree (dead-ends); 1 = a single closed circuit. */
102
+ loopiness: number;
103
+ /** Extra chord edges between neighbors → mesh density. */
104
+ connectivity: number;
105
+ /** Spur-lane density forking off the mains. */
106
+ branching: number;
107
+ /** Fraction of dangling ends kept as cul-de-sacs (vs reconnected). */
108
+ deadEnds: number;
109
+ /** Target node spacing / block size, world units. */
110
+ segmentLength: number;
111
+ /** Cross-axis spacing multiplier (≥1 = long skinny Manhattan blocks). */
112
+ aspect: number;
113
+ /** Sideways wander amplitude, 0..1. */
114
+ winding: number;
115
+ /** Minimum curve radius (m) — caps wander curvature and corner tightness. */
116
+ minCurveRadius: number;
117
+ /** Shallowest corner (degrees) a street keeps — gentler bends are straightened. */
118
+ minTurnAngle: number;
119
+ /** Sharpest corner (degrees) a street may take — tighter ones are beveled away. */
120
+ maxTurnAngle: number;
121
+ /** Base street width; the hierarchy scales off it. */
122
+ width: number;
123
+ /** Share of avenues upgraded to boulevards, 0..1. */
124
+ boulevards: number;
125
+ }
126
+ /** Ground sampler + feature toggles enabling bridges/tunnels; omit for a flat, feature-free network. */
127
+ export interface PathNetworkContext {
128
+ /** Volume-local ground height sampler. */
129
+ heightAt?: (x: number, z: number) => number;
130
+ /** Ground below this (local) height is a gap streets bridge over. */
131
+ minElevation?: number;
132
+ /** Emit bridge decks over sub-`minElevation` gaps. */
133
+ bridges?: boolean;
134
+ /** Emit tunnel bores where the ground rises this far above a span's banks. */
135
+ tunnels?: boolean;
136
+ /** Ridge height above the banks that triggers a tunnel. Default 6. */
137
+ tunnelClearance?: number;
138
+ }
139
+ /**
140
+ * Hard turn-angle clamp on a polyline with fixed endpoints: interior corners gentler than `minRad`
141
+ * are straightened away (deliberate winding only, no micro-wiggle) and corners sharper than `maxRad`
142
+ * are beveled — the corner vertex is replaced by two points pulled back along each leg, which
143
+ * strictly reduces the angle. Endpoints never move, so a graph node stays welded.
144
+ * @internal
145
+ */
146
+ export declare function clampTurns(points: readonly PathVec2[], minRad: number, maxRad: number): PathVec2[];
147
+ /** Decide which topology family the sliders call for. Circuit wins when loops dominate and both
148
+ * branching and mesh connectivity are low — exactly the "race track" corner of the slider space.
149
+ * @internal */
150
+ export declare function pathNetworkMode(rules: PathNetworkRules): PathNetworkMode;
151
+ /**
152
+ * Resolve a full path network from its rules inside a volume of half-extents `hx`×`hz`. Deterministic
153
+ * per `(rules.seed, hx, hz, context)`. Pass a {@link PathNetworkContext} with a ground sampler to turn
154
+ * water gaps into bridges and ridges into tunnels. Coordinates are volume-local; the caller maps to
155
+ * world space.
156
+ *
157
+ * @capability path-network build a deterministic road/track graph (nodes, edges, streets, junctions, bridges, tunnels) from sliders
158
+ */
159
+ export declare function buildPathNetwork(rules: PathNetworkRules, hx: number, hz: number, context?: PathNetworkContext): PathNetwork;