@jgengine/core 0.9.0 → 0.11.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 (631) hide show
  1. package/CHANGELOG.md +34 -3
  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/spawnDirector.d.ts +19 -1
  21. package/dist/ai/spawnDirector.js +53 -26
  22. package/dist/ai/spawnPoint.d.ts +7 -0
  23. package/dist/ai/spawnPoint.js +7 -0
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/audio/audioFalloff.d.ts +5 -2
  35. package/dist/audio/music.d.ts +53 -0
  36. package/dist/audio/music.js +34 -0
  37. package/dist/audio/synth.d.ts +60 -0
  38. package/dist/audio/synth.js +8 -0
  39. package/dist/authoring.d.ts +15 -0
  40. package/dist/authoring.js +15 -0
  41. package/dist/board/laneBoard.d.ts +13 -0
  42. package/dist/board/laneBoard.js +13 -0
  43. package/dist/board/timelineBoard.d.ts +10 -0
  44. package/dist/board/timelineBoard.js +10 -0
  45. package/dist/combat/abilityKit.d.ts +18 -0
  46. package/dist/combat/abilityKit.js +24 -9
  47. package/dist/combat/animationState.d.ts +5 -0
  48. package/dist/combat/animationState.js +5 -0
  49. package/dist/combat/breakMeters.d.ts +10 -0
  50. package/dist/combat/breakMeters.js +10 -0
  51. package/dist/combat/castRunner.d.ts +5 -0
  52. package/dist/combat/castRunner.js +5 -0
  53. package/dist/combat/comboPoints.d.ts +5 -0
  54. package/dist/combat/comboPoints.js +5 -0
  55. package/dist/combat/comboString.d.ts +5 -0
  56. package/dist/combat/comboString.js +5 -0
  57. package/dist/combat/damageInterceptors.d.ts +192 -0
  58. package/dist/combat/damageInterceptors.js +251 -0
  59. package/dist/combat/damageMatchup.d.ts +68 -0
  60. package/dist/combat/damageMatchup.js +42 -0
  61. package/dist/combat/damageResolution.d.ts +63 -0
  62. package/dist/combat/damageResolution.js +50 -0
  63. package/dist/combat/death.d.ts +7 -1
  64. package/dist/combat/death.js +5 -0
  65. package/dist/combat/deathReason.d.ts +14 -0
  66. package/dist/combat/deathReason.js +1 -0
  67. package/dist/combat/defensiveWindow.d.ts +5 -0
  68. package/dist/combat/defensiveWindow.js +5 -0
  69. package/dist/combat/dotField.d.ts +47 -0
  70. package/dist/combat/dotField.js +52 -0
  71. package/dist/combat/downed.d.ts +5 -0
  72. package/dist/combat/downed.js +5 -0
  73. package/dist/combat/effects.d.ts +5 -0
  74. package/dist/combat/effects.js +5 -0
  75. package/dist/combat/encounterSequence.d.ts +258 -0
  76. package/dist/combat/encounterSequence.js +426 -0
  77. package/dist/combat/hitReaction.d.ts +57 -1
  78. package/dist/combat/hitReaction.js +45 -5
  79. package/dist/combat/magazine.d.ts +54 -0
  80. package/dist/combat/magazine.js +96 -0
  81. package/dist/combat/projectiles.d.ts +7 -2
  82. package/dist/combat/projectiles.js +48 -17
  83. package/dist/combat/receivedDamage.d.ts +117 -0
  84. package/dist/combat/receivedDamage.js +92 -0
  85. package/dist/combat/regenShield.d.ts +39 -0
  86. package/dist/combat/regenShield.js +49 -0
  87. package/dist/combat/renderCues.d.ts +51 -0
  88. package/dist/combat/renderCues.js +44 -0
  89. package/dist/combat/resourcePool.d.ts +5 -0
  90. package/dist/combat/resourcePool.js +5 -0
  91. package/dist/combat/rewardAllocation.d.ts +121 -0
  92. package/dist/combat/rewardAllocation.js +251 -0
  93. package/dist/combat/shotOrigin.d.ts +30 -1
  94. package/dist/combat/shotOrigin.js +70 -2
  95. package/dist/combat/statusApplication.d.ts +96 -0
  96. package/dist/combat/statusApplication.js +81 -0
  97. package/dist/combat/telegraph.d.ts +11 -2
  98. package/dist/combat/telegraph.js +11 -2
  99. package/dist/combat/thresholdCrossings.d.ts +85 -0
  100. package/dist/combat/thresholdCrossings.js +116 -0
  101. package/dist/combat.d.ts +34 -0
  102. package/dist/combat.js +34 -0
  103. package/dist/commands/commandRegistry.d.ts +11 -0
  104. package/dist/commands/commandRegistry.js +9 -2
  105. package/dist/crafting/crop.d.ts +18 -0
  106. package/dist/crafting/crop.js +18 -0
  107. package/dist/crafting/production.d.ts +5 -0
  108. package/dist/crafting/production.js +5 -0
  109. package/dist/devtools/rewriteTunables.d.ts +17 -0
  110. package/dist/devtools/rewriteTunables.js +276 -0
  111. package/dist/devtools/saveEndpoint.d.ts +46 -0
  112. package/dist/devtools/saveEndpoint.js +48 -0
  113. package/dist/devtools/transformTunables.d.ts +3 -0
  114. package/dist/devtools/transformTunables.js +3 -0
  115. package/dist/devtools/tunableSchema.d.ts +31 -0
  116. package/dist/devtools/tunableSchema.js +31 -0
  117. package/dist/economy/currency.d.ts +12 -1
  118. package/dist/economy/currency.js +12 -1
  119. package/dist/economy/listingBook.d.ts +91 -0
  120. package/dist/economy/listingBook.js +144 -0
  121. package/dist/economy/resourceLedger.d.ts +222 -0
  122. package/dist/economy/resourceLedger.js +353 -0
  123. package/dist/economy/sharedWallet.d.ts +14 -0
  124. package/dist/economy/sharedWallet.js +14 -0
  125. package/dist/economy/techTree.d.ts +12 -0
  126. package/dist/economy/techTree.js +12 -0
  127. package/dist/economy/wallet.d.ts +26 -2
  128. package/dist/economy/wallet.js +35 -6
  129. package/dist/editor/commands.d.ts +248 -0
  130. package/dist/editor/commands.js +865 -0
  131. package/dist/editor/document.d.ts +186 -0
  132. package/dist/editor/document.js +884 -0
  133. package/dist/editor/grid.d.ts +229 -0
  134. package/dist/editor/grid.js +366 -0
  135. package/dist/editor/gridAdapters.d.ts +80 -0
  136. package/dist/editor/gridAdapters.js +134 -0
  137. package/dist/editor/index.d.ts +97 -0
  138. package/dist/editor/index.js +10 -0
  139. package/dist/editor/liveSync.d.ts +127 -0
  140. package/dist/editor/liveSync.js +249 -0
  141. package/dist/editor/runtimeInspector.d.ts +88 -0
  142. package/dist/editor/runtimeInspector.js +239 -0
  143. package/dist/editor/types.d.ts +175 -0
  144. package/dist/editor/types.js +29 -0
  145. package/dist/faction/reputation.d.ts +5 -0
  146. package/dist/faction/reputation.js +5 -0
  147. package/dist/format/distance.d.ts +17 -0
  148. package/dist/format/distance.js +18 -0
  149. package/dist/format/duration.d.ts +27 -0
  150. package/dist/format/duration.js +45 -0
  151. package/dist/format/speed.d.ts +17 -0
  152. package/dist/format/speed.js +25 -0
  153. package/dist/game/connectedPlayers.d.ts +30 -0
  154. package/dist/game/connectedPlayers.js +21 -0
  155. package/dist/game/cosmetics.d.ts +9 -0
  156. package/dist/game/cosmetics.js +16 -0
  157. package/dist/game/defineGame.d.ts +141 -2
  158. package/dist/game/defineGame.js +39 -1
  159. package/dist/game/defineSystem.d.ts +88 -0
  160. package/dist/game/defineSystem.js +45 -0
  161. package/dist/game/dialogue.d.ts +33 -0
  162. package/dist/game/dialogue.js +21 -0
  163. package/dist/game/events.d.ts +50 -13
  164. package/dist/game/events.js +5 -0
  165. package/dist/game/feed.d.ts +33 -0
  166. package/dist/game/feed.js +35 -2
  167. package/dist/game/gamePhase.d.ts +11 -0
  168. package/dist/game/gamePhase.js +16 -0
  169. package/dist/game/keyValueStore.d.ts +25 -0
  170. package/dist/game/keyValueStore.js +61 -0
  171. package/dist/game/leaderboard.d.ts +5 -0
  172. package/dist/game/leaderboard.js +5 -0
  173. package/dist/game/levelSequence.d.ts +24 -2
  174. package/dist/game/levelSequence.js +51 -2
  175. package/dist/game/loadout.d.ts +5 -0
  176. package/dist/game/loadout.js +5 -0
  177. package/dist/game/lootFilter.d.ts +2 -0
  178. package/dist/game/lootFilter.js +2 -0
  179. package/dist/game/lootPipeline.d.ts +164 -0
  180. package/dist/game/lootPipeline.js +216 -0
  181. package/dist/game/lootTable.d.ts +21 -0
  182. package/dist/game/lootTable.js +15 -4
  183. package/dist/game/modelAnimation.d.ts +8 -0
  184. package/dist/game/modelAnimation.js +18 -0
  185. package/dist/game/objectives.d.ts +43 -0
  186. package/dist/game/objectives.js +36 -0
  187. package/dist/game/paramLayers.d.ts +148 -0
  188. package/dist/game/paramLayers.js +185 -0
  189. package/dist/game/ping.d.ts +5 -0
  190. package/dist/game/ping.js +5 -0
  191. package/dist/game/playableGame.d.ts +160 -12
  192. package/dist/game/quest.d.ts +8 -0
  193. package/dist/game/quest.js +29 -0
  194. package/dist/game/race.d.ts +141 -0
  195. package/dist/game/race.js +169 -0
  196. package/dist/game/recordBook.d.ts +5 -5
  197. package/dist/game/recordBook.js +4 -1
  198. package/dist/game/ruleSelection.d.ts +75 -0
  199. package/dist/game/ruleSelection.js +127 -0
  200. package/dist/game/runDraft.d.ts +5 -0
  201. package/dist/game/runDraft.js +5 -0
  202. package/dist/game/saveStore.d.ts +111 -0
  203. package/dist/game/saveStore.js +312 -0
  204. package/dist/game/snapshotHistory.d.ts +67 -0
  205. package/dist/game/snapshotHistory.js +95 -0
  206. package/dist/game/social.d.ts +38 -1
  207. package/dist/game/social.js +71 -0
  208. package/dist/game/spawnPoints.d.ts +5 -0
  209. package/dist/game/spawnPoints.js +5 -0
  210. package/dist/game/systemRuntime.d.ts +50 -0
  211. package/dist/game/systemRuntime.js +157 -0
  212. package/dist/game/systemSchedule.d.ts +72 -0
  213. package/dist/game/systemSchedule.js +242 -0
  214. package/dist/game/toasts.d.ts +43 -0
  215. package/dist/game/toasts.js +44 -0
  216. package/dist/game/trade.d.ts +10 -0
  217. package/dist/game/trade.js +10 -0
  218. package/dist/game/unlocks.d.ts +8 -0
  219. package/dist/game/unlocks.js +16 -0
  220. package/dist/game/vfxInstance.d.ts +138 -0
  221. package/dist/game/vfxInstance.js +96 -0
  222. package/dist/game/worldItem.d.ts +17 -4
  223. package/dist/game/worldItem.js +17 -4
  224. package/dist/gameplay.d.ts +91 -0
  225. package/dist/gameplay.js +91 -0
  226. package/dist/index.d.ts +5 -7
  227. package/dist/index.js +5 -7
  228. package/dist/input/actionBindings.d.ts +24 -5
  229. package/dist/input/actionBindings.js +23 -5
  230. package/dist/input/axisInput.d.ts +13 -1
  231. package/dist/input/axisInput.js +22 -1
  232. package/dist/input/controlGroups.d.ts +67 -0
  233. package/dist/input/controlGroups.js +41 -0
  234. package/dist/input/touchScheme.d.ts +82 -6
  235. package/dist/input/touchScheme.js +123 -10
  236. package/dist/interaction/contextMenu.d.ts +1 -0
  237. package/dist/interaction/contextMenu.js +1 -0
  238. package/dist/interaction/lockpick.d.ts +61 -0
  239. package/dist/interaction/lockpick.js +168 -0
  240. package/dist/interaction/proximityPrompt.d.ts +5 -1
  241. package/dist/interaction/proximityPrompt.js +5 -3
  242. package/dist/interaction/qte.d.ts +5 -0
  243. package/dist/interaction/qte.js +5 -0
  244. package/dist/interaction/skillCheck.d.ts +5 -0
  245. package/dist/interaction/skillCheck.js +5 -0
  246. package/dist/inventory/inventoryModel.d.ts +12 -0
  247. package/dist/inventory/inventoryModel.js +12 -0
  248. package/dist/inventory/shapedGrid.d.ts +16 -0
  249. package/dist/inventory/shapedGrid.js +16 -0
  250. package/dist/inventory/slotModel.d.ts +10 -0
  251. package/dist/inventory/slotModel.js +10 -0
  252. package/dist/item/durability.d.ts +5 -0
  253. package/dist/item/durability.js +5 -0
  254. package/dist/item/itemIdentity.d.ts +171 -0
  255. package/dist/item/itemIdentity.js +138 -0
  256. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  257. package/dist/item/itemInstanceRegistry.js +34 -0
  258. package/dist/item/itemgen.d.ts +163 -0
  259. package/dist/item/itemgen.js +151 -0
  260. package/dist/item/modularItem.d.ts +5 -0
  261. package/dist/item/modularItem.js +5 -0
  262. package/dist/item/use.d.ts +5 -0
  263. package/dist/item/use.js +5 -0
  264. package/dist/item/useBehavior.d.ts +142 -0
  265. package/dist/item/useBehavior.js +105 -0
  266. package/dist/item/weapon.d.ts +5 -0
  267. package/dist/item/weapon.js +5 -0
  268. package/dist/math/scalar.d.ts +25 -0
  269. package/dist/math/scalar.js +47 -0
  270. package/dist/meta/changelog.d.ts +4 -1
  271. package/dist/meta/changelog.js +36 -1
  272. package/dist/movement/avoidance.d.ts +45 -0
  273. package/dist/movement/avoidance.js +123 -0
  274. package/dist/movement/cameraRig.d.ts +8 -0
  275. package/dist/movement/cameraRig.js +8 -0
  276. package/dist/movement/dash.d.ts +11 -0
  277. package/dist/movement/dash.js +11 -0
  278. package/dist/movement/formation.d.ts +135 -0
  279. package/dist/movement/formation.js +194 -0
  280. package/dist/movement/glideModel.d.ts +5 -0
  281. package/dist/movement/glideModel.js +5 -0
  282. package/dist/movement/grappleSwing.d.ts +5 -0
  283. package/dist/movement/grappleSwing.js +5 -0
  284. package/dist/movement/leaderTrail.d.ts +5 -0
  285. package/dist/movement/leaderTrail.js +5 -0
  286. package/dist/movement/movementModel.d.ts +38 -7
  287. package/dist/movement/movementModel.js +54 -13
  288. package/dist/movement/playerMovement.d.ts +41 -0
  289. package/dist/movement/playerMovement.js +236 -0
  290. package/dist/movement/poseState.d.ts +13 -0
  291. package/dist/movement/poseState.js +16 -0
  292. package/dist/movement/steering.d.ts +8 -0
  293. package/dist/movement/steering.js +18 -0
  294. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  295. package/dist/multiplayer/combatSnapshot.js +3 -0
  296. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  297. package/dist/multiplayer/lagCompensation.js +5 -0
  298. package/dist/multiplayer/presenceModel.d.ts +9 -1
  299. package/dist/multiplayer/presenceModel.js +9 -1
  300. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  301. package/dist/multiplayer/simultaneousCommit.js +3 -0
  302. package/dist/multiplayer.d.ts +11 -0
  303. package/dist/multiplayer.js +11 -0
  304. package/dist/nav/pathFollow.d.ts +57 -0
  305. package/dist/nav/pathFollow.js +109 -0
  306. package/dist/orders/orderKinds.d.ts +156 -0
  307. package/dist/orders/orderKinds.js +197 -0
  308. package/dist/orders/orderQueue.d.ts +208 -0
  309. package/dist/orders/orderQueue.js +211 -0
  310. package/dist/physics/drivableVehicle.d.ts +29 -0
  311. package/dist/physics/drivableVehicle.js +16 -0
  312. package/dist/physics/kinematicVehicle.d.ts +21 -1
  313. package/dist/physics/kinematicVehicle.js +23 -8
  314. package/dist/physics/physicsWorld.d.ts +24 -12
  315. package/dist/physics/physicsWorld.js +11 -5
  316. package/dist/physics/radialImpulse.d.ts +25 -0
  317. package/dist/physics/radialImpulse.js +27 -0
  318. package/dist/procedural.d.ts +3 -0
  319. package/dist/procedural.js +3 -0
  320. package/dist/progression/statGraph.d.ts +116 -0
  321. package/dist/progression/statGraph.js +318 -0
  322. package/dist/puzzle/cellGrid.d.ts +9 -0
  323. package/dist/puzzle/cellGrid.js +9 -0
  324. package/dist/puzzle/fallingPiece.d.ts +9 -0
  325. package/dist/puzzle/fallingPiece.js +9 -0
  326. package/dist/puzzle/nonogram.d.ts +39 -0
  327. package/dist/puzzle/nonogram.js +136 -0
  328. package/dist/random/nameGen.d.ts +5 -0
  329. package/dist/random/nameGen.js +5 -0
  330. package/dist/random/pick.d.ts +8 -0
  331. package/dist/random/pick.js +31 -0
  332. package/dist/random/rng.d.ts +24 -0
  333. package/dist/random/rng.js +30 -8
  334. package/dist/random/seedLink.d.ts +4 -0
  335. package/dist/random/seedLink.js +4 -0
  336. package/dist/relation/keyedValues.d.ts +54 -0
  337. package/dist/relation/keyedValues.js +115 -0
  338. package/dist/relation/thresholds.d.ts +62 -0
  339. package/dist/relation/thresholds.js +62 -0
  340. package/dist/render/color.d.ts +12 -0
  341. package/dist/render/color.js +26 -0
  342. package/dist/render/lookPreset.d.ts +41 -0
  343. package/dist/render/lookPreset.js +29 -0
  344. package/dist/render/postProcessing.d.ts +76 -0
  345. package/dist/render/postProcessing.js +21 -0
  346. package/dist/rules/predicate.d.ts +53 -0
  347. package/dist/rules/predicate.js +64 -0
  348. package/dist/rules/ruleEffects.d.ts +38 -0
  349. package/dist/rules/ruleEffects.js +37 -0
  350. package/dist/rules/triggeredRules.d.ts +160 -0
  351. package/dist/rules/triggeredRules.js +241 -0
  352. package/dist/runtime/adapter.d.ts +58 -0
  353. package/dist/runtime/adapter.js +54 -5
  354. package/dist/runtime/cameraDirector.d.ts +1 -0
  355. package/dist/runtime/cameraDirector.js +1 -0
  356. package/dist/runtime/commandRunner.d.ts +1 -0
  357. package/dist/runtime/commandRunner.js +1 -0
  358. package/dist/runtime/context/combatFx.d.ts +23 -0
  359. package/dist/runtime/context/combatFx.js +161 -0
  360. package/dist/runtime/context/registries.d.ts +13 -0
  361. package/dist/runtime/context/registries.js +84 -0
  362. package/dist/runtime/context/worldItems.d.ts +21 -0
  363. package/dist/runtime/context/worldItems.js +37 -0
  364. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  365. package/dist/runtime/descriptors/baseline.js +134 -0
  366. package/dist/runtime/descriptors/features.d.ts +74 -0
  367. package/dist/runtime/descriptors/features.js +281 -0
  368. package/dist/runtime/gameContext.d.ts +163 -19
  369. package/dist/runtime/gameContext.js +385 -339
  370. package/dist/runtime/gameRuntime.d.ts +1 -0
  371. package/dist/runtime/gameRuntime.js +1 -0
  372. package/dist/runtime/headlessRunner.d.ts +60 -0
  373. package/dist/runtime/headlessRunner.js +44 -0
  374. package/dist/runtime/hostPersistence.d.ts +12 -0
  375. package/dist/runtime/hostPersistence.js +12 -0
  376. package/dist/runtime/hostedGameRunner.d.ts +54 -0
  377. package/dist/runtime/hostedGameRunner.js +85 -0
  378. package/dist/runtime/hostedWorldSession.d.ts +73 -0
  379. package/dist/runtime/hostedWorldSession.js +64 -0
  380. package/dist/runtime/inputSnapshot.d.ts +21 -3
  381. package/dist/runtime/inputSnapshot.js +8 -2
  382. package/dist/runtime/motionIntents.d.ts +12 -1
  383. package/dist/runtime/motionIntents.js +26 -1
  384. package/dist/runtime/perContext.d.ts +15 -0
  385. package/dist/runtime/perContext.js +21 -0
  386. package/dist/runtime/runtimeSave.d.ts +79 -0
  387. package/dist/runtime/runtimeSave.js +105 -0
  388. package/dist/runtime/save.d.ts +4 -0
  389. package/dist/runtime/save.js +4 -0
  390. package/dist/runtime/snapshot.d.ts +7 -0
  391. package/dist/runtime/snapshot.js +7 -0
  392. package/dist/runtime/visibility.d.ts +2 -1
  393. package/dist/runtime/visibility.js +2 -1
  394. package/dist/runtime/worldChannel.d.ts +62 -0
  395. package/dist/runtime/worldChannel.js +114 -0
  396. package/dist/runtime/worldMirror.d.ts +36 -0
  397. package/dist/runtime/worldMirror.js +44 -0
  398. package/dist/runtime/worldProjection.d.ts +47 -0
  399. package/dist/runtime/worldProjection.js +52 -0
  400. package/dist/runtime/worldReplication.d.ts +69 -0
  401. package/dist/runtime/worldReplication.js +217 -0
  402. package/dist/runtime/worldSnapshot.d.ts +44 -0
  403. package/dist/runtime/worldSnapshot.js +30 -0
  404. package/dist/scene/assetCatalog.d.ts +22 -0
  405. package/dist/scene/assetCatalog.js +4 -0
  406. package/dist/scene/assetDiagnostics.d.ts +69 -0
  407. package/dist/scene/assetDiagnostics.js +110 -0
  408. package/dist/scene/assetGenerator.d.ts +65 -0
  409. package/dist/scene/assetGenerator.js +64 -0
  410. package/dist/scene/assetSpace.d.ts +137 -0
  411. package/dist/scene/assetSpace.js +259 -0
  412. package/dist/scene/authoredTriggers.d.ts +169 -0
  413. package/dist/scene/authoredTriggers.js +340 -0
  414. package/dist/scene/behaviorRuntime.d.ts +75 -0
  415. package/dist/scene/behaviorRuntime.js +217 -0
  416. package/dist/scene/behaviors.d.ts +14 -2
  417. package/dist/scene/behaviors.js +7 -2
  418. package/dist/scene/bodyBind.d.ts +60 -0
  419. package/dist/scene/bodyBind.js +51 -0
  420. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  421. package/dist/scene/builtinSceneKinds.js +62 -0
  422. package/dist/scene/colliders.d.ts +18 -0
  423. package/dist/scene/colliders.js +61 -1
  424. package/dist/scene/entityStats.d.ts +13 -0
  425. package/dist/scene/entityStats.js +30 -0
  426. package/dist/scene/entityStore.d.ts +41 -1
  427. package/dist/scene/entityStore.js +75 -0
  428. package/dist/scene/facing.d.ts +18 -0
  429. package/dist/scene/facing.js +26 -0
  430. package/dist/scene/modelSockets.d.ts +33 -0
  431. package/dist/scene/modelSockets.js +29 -0
  432. package/dist/scene/objectQuery.d.ts +2 -0
  433. package/dist/scene/objectQuery.js +2 -0
  434. package/dist/scene/objectStore.d.ts +4 -0
  435. package/dist/scene/objectStore.js +6 -0
  436. package/dist/scene/possession.d.ts +8 -0
  437. package/dist/scene/possession.js +14 -0
  438. package/dist/scene/roster.d.ts +3 -0
  439. package/dist/scene/roster.js +12 -0
  440. package/dist/scene/sceneKinds.d.ts +240 -0
  441. package/dist/scene/sceneKinds.js +214 -0
  442. package/dist/scene/sceneOwnership.d.ts +169 -0
  443. package/dist/scene/sceneOwnership.js +179 -0
  444. package/dist/scene/selectionBookmarks.d.ts +93 -0
  445. package/dist/scene/selectionBookmarks.js +122 -0
  446. package/dist/scene/vehicleSeat.d.ts +68 -0
  447. package/dist/scene/vehicleSeat.js +59 -0
  448. package/dist/sensor/concealment.d.ts +3 -0
  449. package/dist/sensor/concealment.js +3 -0
  450. package/dist/sensor/freezeMonitor.d.ts +1 -0
  451. package/dist/sensor/freezeMonitor.js +1 -0
  452. package/dist/sensor/frustumSensor.d.ts +7 -3
  453. package/dist/sensor/frustumSensor.js +7 -3
  454. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  455. package/dist/sensor/hiddenStateProbe.js +5 -2
  456. package/dist/sensor/recordingBuffer.d.ts +2 -1
  457. package/dist/sensor/recordingBuffer.js +2 -1
  458. package/dist/sensor/replayLoop.d.ts +6 -2
  459. package/dist/sensor/replayLoop.js +6 -2
  460. package/dist/sensor/revealQuery.d.ts +2 -1
  461. package/dist/sensor/revealQuery.js +2 -1
  462. package/dist/sensor/visionCone.d.ts +10 -3
  463. package/dist/sensor/visionCone.js +10 -3
  464. package/dist/session/contestedChannel.d.ts +1 -0
  465. package/dist/session/contestedChannel.js +1 -0
  466. package/dist/session/extraction.d.ts +1 -0
  467. package/dist/session/extraction.js +1 -0
  468. package/dist/session/roles.d.ts +6 -0
  469. package/dist/session/roles.js +6 -0
  470. package/dist/session/roundState.d.ts +8 -0
  471. package/dist/session/roundState.js +2 -0
  472. package/dist/settings/settingsModel.d.ts +1 -0
  473. package/dist/settings/settingsModel.js +1 -0
  474. package/dist/stats/accumulatorMeter.d.ts +6 -0
  475. package/dist/stats/accumulatorMeter.js +6 -0
  476. package/dist/stats/eventMeter.d.ts +5 -0
  477. package/dist/stats/eventMeter.js +5 -0
  478. package/dist/stats/rollCheck.d.ts +5 -0
  479. package/dist/stats/rollCheck.js +5 -0
  480. package/dist/stats/statModifiers.d.ts +5 -0
  481. package/dist/stats/statModifiers.js +5 -0
  482. package/dist/store/defineKeyedStore.d.ts +38 -0
  483. package/dist/store/defineKeyedStore.js +42 -0
  484. package/dist/store/defineStore.d.ts +33 -0
  485. package/dist/store/defineStore.js +35 -0
  486. package/dist/store/observableKeyedStore.d.ts +9 -0
  487. package/dist/store/observableKeyedStore.js +43 -2
  488. package/dist/survival/decayMeter.d.ts +55 -0
  489. package/dist/survival/decayMeter.js +130 -55
  490. package/dist/survival/moodle.d.ts +2 -0
  491. package/dist/survival/regionHealth.d.ts +6 -0
  492. package/dist/survival/regionHealth.js +5 -0
  493. package/dist/tactics/fallingGrid.d.ts +6 -4
  494. package/dist/tactics/fallingGrid.js +6 -4
  495. package/dist/tactics/predictiveQuery.d.ts +3 -0
  496. package/dist/tactics/predictiveQuery.js +3 -0
  497. package/dist/tactics/snapshot.d.ts +2 -0
  498. package/dist/tactics/snapshot.js +2 -0
  499. package/dist/tactics/surface.d.ts +1 -0
  500. package/dist/tactics/surface.js +1 -0
  501. package/dist/tactics/tacticalGrid.d.ts +1 -0
  502. package/dist/tactics/tacticalGrid.js +1 -0
  503. package/dist/time/beatClock.d.ts +14 -4
  504. package/dist/time/beatClock.js +14 -4
  505. package/dist/time/calendarClock.d.ts +3 -0
  506. package/dist/time/calendarClock.js +3 -0
  507. package/dist/time/idleProgress.d.ts +4 -0
  508. package/dist/time/idleProgress.js +4 -0
  509. package/dist/time/simClock.d.ts +2 -0
  510. package/dist/time/simClock.js +20 -5
  511. package/dist/ui/actionModel.d.ts +110 -0
  512. package/dist/ui/actionModel.js +159 -0
  513. package/dist/ui/gameLayout.d.ts +144 -0
  514. package/dist/ui/gameLayout.js +148 -0
  515. package/dist/ui/hudDocument.d.ts +114 -0
  516. package/dist/ui/hudDocument.js +220 -0
  517. package/dist/ui/hudLayout.d.ts +33 -1
  518. package/dist/ui/hudLayout.js +204 -17
  519. package/dist/ui/orientation.d.ts +39 -0
  520. package/dist/ui/orientation.js +49 -0
  521. package/dist/ui/selectionModel.d.ts +92 -0
  522. package/dist/ui/selectionModel.js +88 -0
  523. package/dist/ui/swingTimer.d.ts +42 -0
  524. package/dist/ui/swingTimer.js +38 -0
  525. package/dist/ui/tooltipModel.d.ts +63 -0
  526. package/dist/ui/tooltipModel.js +82 -0
  527. package/dist/ui.d.ts +15 -0
  528. package/dist/ui.js +15 -0
  529. package/dist/visibility/bounds.d.ts +8 -1
  530. package/dist/visibility/bounds.js +8 -1
  531. package/dist/visibility/frustum.d.ts +12 -3
  532. package/dist/visibility/frustum.js +12 -3
  533. package/dist/visibility/spatialIndex.js +34 -20
  534. package/dist/work/jobQueue.d.ts +201 -0
  535. package/dist/work/jobQueue.js +253 -0
  536. package/dist/work/unitTraining.d.ts +58 -0
  537. package/dist/work/unitTraining.js +52 -0
  538. package/dist/world/authoredObjects.d.ts +58 -0
  539. package/dist/world/authoredObjects.js +69 -0
  540. package/dist/world/buildingGenerator.d.ts +18 -0
  541. package/dist/world/buildingGenerator.js +62 -0
  542. package/dist/world/buildings.d.ts +5 -0
  543. package/dist/world/buildings.js +5 -0
  544. package/dist/world/catenary.d.ts +22 -0
  545. package/dist/world/catenary.js +69 -0
  546. package/dist/world/environmentSummary.d.ts +11 -2
  547. package/dist/world/environmentSummary.js +11 -1
  548. package/dist/world/features.d.ts +244 -7
  549. package/dist/world/features.js +92 -4
  550. package/dist/world/footprintGrid.d.ts +59 -0
  551. package/dist/world/footprintGrid.js +141 -0
  552. package/dist/world/geometry.d.ts +64 -0
  553. package/dist/world/geometry.js +94 -0
  554. package/dist/world/grassKind.d.ts +51 -0
  555. package/dist/world/grassKind.js +101 -0
  556. package/dist/world/pathInstances.d.ts +27 -0
  557. package/dist/world/pathInstances.js +27 -0
  558. package/dist/world/pathTerrain.d.ts +80 -0
  559. package/dist/world/pathTerrain.js +142 -0
  560. package/dist/world/placeAsset.d.ts +81 -0
  561. package/dist/world/placeAsset.js +77 -0
  562. package/dist/world/placement.d.ts +4 -0
  563. package/dist/world/placement.js +4 -0
  564. package/dist/world/placementController.d.ts +6 -0
  565. package/dist/world/placementController.js +6 -0
  566. package/dist/world/polyline.d.ts +34 -0
  567. package/dist/world/polyline.js +81 -0
  568. package/dist/world/roads.d.ts +55 -0
  569. package/dist/world/roads.js +184 -0
  570. package/dist/world/scatterRegion.d.ts +164 -0
  571. package/dist/world/scatterRegion.js +409 -0
  572. package/dist/world/sceneShapes.d.ts +43 -0
  573. package/dist/world/sceneShapes.js +1 -0
  574. package/dist/world/segment.d.ts +27 -0
  575. package/dist/world/segment.js +43 -0
  576. package/dist/world/soilKind.d.ts +48 -0
  577. package/dist/world/soilKind.js +92 -0
  578. package/dist/world/spatialSample.d.ts +241 -0
  579. package/dist/world/spatialSample.js +465 -0
  580. package/dist/world/streets.d.ts +80 -0
  581. package/dist/world/streets.js +144 -0
  582. package/dist/world/terraform.d.ts +213 -1
  583. package/dist/world/terraform.js +655 -20
  584. package/dist/world/terrain.d.ts +138 -12
  585. package/dist/world/terrain.js +346 -28
  586. package/dist/world/terrainGuides.d.ts +182 -0
  587. package/dist/world/terrainGuides.js +343 -0
  588. package/dist/world/vec2.d.ts +81 -0
  589. package/dist/world/vec2.js +128 -0
  590. package/dist/world/vec3.d.ts +49 -0
  591. package/dist/world/vec3.js +76 -0
  592. package/dist/world/vegetation.d.ts +71 -0
  593. package/dist/world/vegetation.js +151 -0
  594. package/dist/world/visibilityField.d.ts +154 -0
  595. package/dist/world/visibilityField.js +271 -0
  596. package/dist/world/volumetricClouds.d.ts +52 -0
  597. package/dist/world/volumetricClouds.js +43 -0
  598. package/dist/world/walls.d.ts +9 -0
  599. package/dist/world/walls.js +9 -0
  600. package/dist/world/waterKind.d.ts +55 -0
  601. package/dist/world/waterKind.js +99 -0
  602. package/dist/world.d.ts +132 -0
  603. package/dist/world.js +132 -0
  604. package/package.json +32 -8
  605. package/skills/jgengine/SKILL.md +51 -0
  606. package/skills/jgengine/api.md +434 -0
  607. package/skills/jgengine/capabilities.md +29 -0
  608. package/skills/jgengine/reference-cartridge.md +72 -0
  609. package/skills/jgengine-combat/SKILL.md +34 -0
  610. package/skills/jgengine-combat/api.md +549 -0
  611. package/skills/jgengine-combat/capabilities.md +169 -0
  612. package/skills/jgengine-combat/reference.md +98 -0
  613. package/skills/jgengine-gameplay/SKILL.md +39 -0
  614. package/skills/jgengine-gameplay/api.md +1794 -0
  615. package/skills/jgengine-gameplay/capabilities.md +378 -0
  616. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  617. package/skills/jgengine-world/SKILL.md +38 -0
  618. package/skills/jgengine-world/api.md +2652 -0
  619. package/skills/jgengine-world/capabilities.md +370 -0
  620. package/skills/jgengine-world/reference.md +222 -0
  621. package/dist/cartridge/runtime.d.ts +0 -15
  622. package/dist/cartridge/runtime.js +0 -556
  623. package/dist/cartridge/spec.d.ts +0 -188
  624. package/dist/cartridge/spec.js +0 -19
  625. package/dist/cartridge/validate.d.ts +0 -2
  626. package/dist/cartridge/validate.js +0 -78
  627. package/dist/store/engineStore.d.ts +0 -22
  628. package/dist/store/engineStore.js +0 -50
  629. package/dist/store/features.d.ts +0 -10
  630. package/dist/store/features.js +0 -23
  631. package/llms.txt +0 -4983
@@ -0,0 +1,182 @@
1
+ import type { TerrainField } from "./terrain.js";
2
+ /** A world-space point on the ground plane as an `[x, z]` pair. */
3
+ export type GroundPoint = readonly [number, number];
4
+ /** A height sampler over the ground: world elevation at any `x`/`z`. */
5
+ export type HeightSampler = (x: number, z: number) => number;
6
+ /** An axis-aligned XZ rectangle to generate terrain-readability guides within. */
7
+ export interface GuideRegion {
8
+ minX: number;
9
+ minZ: number;
10
+ maxX: number;
11
+ maxZ: number;
12
+ }
13
+ /**
14
+ * A sampled height grid over a region — the shared substrate contour extraction and elevation
15
+ * summaries both read, so a caller can sample once and derive several guides from it.
16
+ * @internal — an intermediate; games call {@link extractContours} / {@link summarizeElevation} directly.
17
+ */
18
+ export interface HeightGrid {
19
+ region: GuideRegion;
20
+ /** Sample columns and rows (each is `resolution + 1` points across its axis). */
21
+ cols: number;
22
+ rows: number;
23
+ /** Row-major heights, length `cols * rows` (row `r`, column `c` at index `r * cols + c`). */
24
+ heights: Float64Array;
25
+ min: number;
26
+ max: number;
27
+ }
28
+ /**
29
+ * Samples `sampleHeight` on a `(resolution + 1)²` grid across `region`, capturing the min/max seen —
30
+ * the bounded, budget-capped scan every guide derives from. `resolution` is clamped to `[1, maxSamples]`.
31
+ * @internal — building block behind the public guide generators.
32
+ */
33
+ export declare function sampleHeightGrid(sampleHeight: HeightSampler, region: GuideRegion, resolution?: number, maxSamples?: number): HeightGrid;
34
+ /** A single iso-elevation contour traced across a region as a flat list of XZ line segments. */
35
+ export interface ContourLine {
36
+ /** The world elevation (`y`) this contour follows. */
37
+ level: number;
38
+ /** Whether this is a major (emphasised) contour rather than a minor one. */
39
+ major: boolean;
40
+ /**
41
+ * Flat segment endpoints `[x0, z0, x1, z1, ...]` — every four numbers is one XZ segment. Draw each
42
+ * at `y = level` to drape it on the surface; the contour is exact iso-height so it hugs terrain.
43
+ */
44
+ segments: readonly number[];
45
+ }
46
+ /** Shaping for {@link extractContours}: region, vertical spacing, emphasis cadence, and sample budget. */
47
+ export interface ContourOptions {
48
+ region: GuideRegion;
49
+ /** Vertical spacing between adjacent contour lines, in world units. Must be `> 0`. */
50
+ interval: number;
51
+ /** Every Nth line (counting from `y = 0`) is a major contour. Default `5`; `<= 1` makes all major. */
52
+ majorEvery?: number;
53
+ /** Samples per axis for the marching-squares grid. Default `128`, clamped to `[1, maxSamples]`. */
54
+ resolution?: number;
55
+ /** Hard per-axis sample cap so extraction stays within an explicit budget. Default `256`. */
56
+ maxSamples?: number;
57
+ }
58
+ /**
59
+ * Traces surface-following contour lines from a height field via marching squares: samples a bounded
60
+ * grid over the region, then for every multiple of `interval` strictly inside the sampled height range
61
+ * emits the iso-line as XZ segments (saddle cells disambiguated by the cell-center average). Because a
62
+ * contour is exact constant elevation, drawing each segment at `y = level` makes it hug the terrain —
63
+ * the readable, scale-bearing overlay a flat ground grid cannot give. Pure math, renderer-agnostic.
64
+ * @capability terrain-contours iso-elevation contour lines that drape on sculpted terrain
65
+ * @consumer editor terrain-readability overlay; any map/minimap wanting elevation contours
66
+ */
67
+ export declare function extractContours(sampleHeight: HeightSampler, options: ContourOptions): ContourLine[];
68
+ /**
69
+ * Picks a human-friendly contour interval — a `1/2/2.5/5 × 10ⁿ` step — so an elevation `range` splits
70
+ * into roughly `targetLines` bands. Drives adaptive contour density: a tall terrain gets a coarse
71
+ * interval, a shallow one a fine interval, without the author choosing a number. Returns `0` when the
72
+ * range is non-positive (nothing to contour).
73
+ * @capability contour-interval readable auto-spacing for elevation contours
74
+ * @consumer editor terrain-readability overlay density control
75
+ */
76
+ export declare function chooseContourInterval(range: number, targetLines?: number): number;
77
+ /** Measurable elevation readout at a single world point — the cursor/hover feedback value. */
78
+ export interface ElevationReadout {
79
+ x: number;
80
+ z: number;
81
+ /** Ground elevation at the point. */
82
+ height: number;
83
+ /** `height - reference` — signed distance above (+) or below (−) the reference plane. */
84
+ delta: number;
85
+ /** The reference-plane height the delta was measured against. */
86
+ reference: number;
87
+ }
88
+ /**
89
+ * Reads the ground elevation under a world point and its signed delta from a reference plane — the
90
+ * measurable cursor/hover feedback ("+3.4 above the pad") an author needs to judge sculpted height.
91
+ * @capability elevation-readout cursor height and delta-from-reference feedback
92
+ * @consumer editor terrain-readability HUD readout
93
+ */
94
+ export declare function sampleElevation(sampleHeight: HeightSampler, x: number, z: number, reference?: number): ElevationReadout;
95
+ /** Aggregate elevation statistics over a region — the selection min/max/mean and legend range. */
96
+ export interface ElevationSummary {
97
+ min: number;
98
+ max: number;
99
+ mean: number;
100
+ /** `max - min` — the vertical relief across the region. */
101
+ range: number;
102
+ /** World point where the lowest sample was found. */
103
+ minAt: GroundPoint;
104
+ /** World point where the highest sample was found. */
105
+ maxAt: GroundPoint;
106
+ /** Number of grid samples taken. */
107
+ samples: number;
108
+ }
109
+ /**
110
+ * Summarises elevation across a region on a bounded sample grid: min, max, mean, relief range, and the
111
+ * world points of the extremes — the selection min/max and legend feedback the readability overlay
112
+ * reports, and the input to {@link chooseContourInterval}. Pure math, renderer-agnostic.
113
+ * @capability elevation-summary selection min/max/mean and relief over a region
114
+ * @consumer editor terrain-readability legend and selection stats
115
+ */
116
+ export declare function summarizeElevation(sampleHeight: HeightSampler, region: GuideRegion, resolution?: number, maxSamples?: number): ElevationSummary;
117
+ /** Shaping for surface draping: subdivision spacing and a lift to keep the line off the ground. */
118
+ export interface DrapeOptions {
119
+ /** Max world spacing between draped vertices; longer spans are subdivided so the line hugs the surface. Default `1`. */
120
+ spacing?: number;
121
+ /** Lift each draped vertex this far above the sampled surface, to avoid z-fighting. Default `0`. */
122
+ offset?: number;
123
+ }
124
+ /**
125
+ * Drapes an XZ polyline onto the surface: subdivides each span to at most `spacing` and lifts every
126
+ * vertex to `sampleHeight + offset`, returning flat `[x, y, z, ...]` world triples. The reusable seam
127
+ * behind surface-following placement guides and grid lines — a straight guide bends to follow terrain.
128
+ * @capability surface-drape lift an XZ polyline onto sculpted terrain
129
+ * @consumer editor placement guides and surface grid overlay
130
+ */
131
+ export declare function drapePolyline(sampleHeight: HeightSampler, points: readonly GroundPoint[], options?: DrapeOptions): number[];
132
+ /**
133
+ * A closed circle draped on the surface — the surface-following placement guide ring under a cursor or
134
+ * a selected object. Returns flat `[x, y, z, ...]` world triples forming a loop (last vertex repeats
135
+ * the first). `segments` sets the smoothness of the ring.
136
+ * @capability surface-ring surface-following placement guide ring
137
+ * @consumer editor cursor/placement guide
138
+ */
139
+ export declare function surfaceRing(sampleHeight: HeightSampler, center: GroundPoint, radius: number, segments?: number, options?: DrapeOptions): number[];
140
+ /** One draped grid line from {@link surfaceGridLines}: its axis, emphasis, and draped vertices. */
141
+ export interface SurfaceGridLine {
142
+ /** Which axis the line runs constant along: an `"x"` line holds `x` fixed and spans `z`, and vice versa. */
143
+ axis: "x" | "z";
144
+ /** The constant coordinate value the line holds. */
145
+ at: number;
146
+ /** Whether this is a major (emphasised) grid line. */
147
+ major: boolean;
148
+ /** Flat `[x, y, z, ...]` world triples draped on the surface. */
149
+ points: readonly number[];
150
+ }
151
+ /** Shaping for {@link surfaceGridLines}: region, spacing, emphasis cadence, and draping. */
152
+ export interface SurfaceGridOptions {
153
+ region: GuideRegion;
154
+ /** World distance between adjacent grid lines. Must be `> 0`. */
155
+ spacing: number;
156
+ /** Every Nth line (counting from origin) is a major line. Default `5`; `<= 1` makes all major. */
157
+ majorEvery?: number;
158
+ /** Draping options for each line. */
159
+ drape?: DrapeOptions;
160
+ }
161
+ /**
162
+ * Builds a surface-following major/minor grid over a region: constant-`x` and constant-`z` lines at
163
+ * `spacing`, each draped onto the terrain so the reference grid climbs sculpted surfaces instead of
164
+ * being occluded by them (the flat `y = 0` grid's core failure). Draping subdivides to
165
+ * `drape.spacing`. Pure math, renderer-agnostic.
166
+ * @capability surface-grid terrain-following reference grid that is not occluded by relief
167
+ * @consumer editor terrain-readability grid overlay
168
+ */
169
+ export declare function surfaceGridLines(sampleHeight: HeightSampler, options: SurfaceGridOptions): SurfaceGridLine[];
170
+ /**
171
+ * Convenience over {@link extractContours} that auto-picks the interval from the field's own relief:
172
+ * summarises the region, chooses a readable interval for `targetLines` bands, and traces the contours —
173
+ * the one call the editor overlay makes to turn a `TerrainField` into ready-to-draw guides. Returns an
174
+ * empty list for flat ground.
175
+ * @capability terrain-guides one-call adaptive contours for a terrain field
176
+ * @consumer editor terrain-readability overlay
177
+ */
178
+ export declare function terrainContourGuides(field: Pick<TerrainField, "sampleHeight">, region: GuideRegion, targetLines?: number, resolution?: number): {
179
+ interval: number;
180
+ summary: ElevationSummary;
181
+ contours: ContourLine[];
182
+ };
@@ -0,0 +1,343 @@
1
+ function assertRegion(region) {
2
+ if (!(region.maxX > region.minX) || !(region.maxZ > region.minZ)) {
3
+ throw new Error("terrainGuides: region must have maxX > minX and maxZ > minZ");
4
+ }
5
+ }
6
+ function clampInt(value, min, max) {
7
+ const v = Math.round(value);
8
+ return v < min ? min : v > max ? max : v;
9
+ }
10
+ /**
11
+ * Samples `sampleHeight` on a `(resolution + 1)²` grid across `region`, capturing the min/max seen —
12
+ * the bounded, budget-capped scan every guide derives from. `resolution` is clamped to `[1, maxSamples]`.
13
+ * @internal — building block behind the public guide generators.
14
+ */
15
+ export function sampleHeightGrid(sampleHeight, region, resolution = 128, maxSamples = 256) {
16
+ assertRegion(region);
17
+ const res = clampInt(resolution, 1, Math.max(1, Math.round(maxSamples)));
18
+ const cols = res + 1;
19
+ const rows = res + 1;
20
+ const heights = new Float64Array(cols * rows);
21
+ const spanX = region.maxX - region.minX;
22
+ const spanZ = region.maxZ - region.minZ;
23
+ let min = Infinity;
24
+ let max = -Infinity;
25
+ for (let r = 0; r < rows; r += 1) {
26
+ const z = region.minZ + (r / res) * spanZ;
27
+ for (let c = 0; c < cols; c += 1) {
28
+ const x = region.minX + (c / res) * spanX;
29
+ const h = sampleHeight(x, z);
30
+ heights[r * cols + c] = h;
31
+ if (h < min)
32
+ min = h;
33
+ if (h > max)
34
+ max = h;
35
+ }
36
+ }
37
+ return { region, cols, rows, heights, min, max };
38
+ }
39
+ function lerpPoint(ax, az, av, bx, bz, bv, level) {
40
+ const denom = bv - av;
41
+ const t = denom === 0 ? 0.5 : (level - av) / denom;
42
+ const clamped = t < 0 ? 0 : t > 1 ? 1 : t;
43
+ return [ax + (bx - ax) * clamped, az + (bz - az) * clamped];
44
+ }
45
+ /**
46
+ * Traces surface-following contour lines from a height field via marching squares: samples a bounded
47
+ * grid over the region, then for every multiple of `interval` strictly inside the sampled height range
48
+ * emits the iso-line as XZ segments (saddle cells disambiguated by the cell-center average). Because a
49
+ * contour is exact constant elevation, drawing each segment at `y = level` makes it hug the terrain —
50
+ * the readable, scale-bearing overlay a flat ground grid cannot give. Pure math, renderer-agnostic.
51
+ * @capability terrain-contours iso-elevation contour lines that drape on sculpted terrain
52
+ * @consumer editor terrain-readability overlay; any map/minimap wanting elevation contours
53
+ */
54
+ export function extractContours(sampleHeight, options) {
55
+ const { interval } = options;
56
+ if (!(interval > 0))
57
+ throw new Error("extractContours: interval must be > 0");
58
+ const majorEvery = Math.max(1, Math.floor(options.majorEvery ?? 5));
59
+ const grid = sampleHeightGrid(sampleHeight, options.region, options.resolution ?? 128, options.maxSamples ?? 256);
60
+ const { cols, heights, region } = grid;
61
+ const res = cols - 1;
62
+ const spanX = region.maxX - region.minX;
63
+ const spanZ = region.maxZ - region.minZ;
64
+ const worldX = (c) => region.minX + (c / res) * spanX;
65
+ const worldZ = (r) => region.minZ + (r / res) * spanZ;
66
+ const lines = [];
67
+ if (grid.max - grid.min < 1e-9)
68
+ return lines;
69
+ const firstStep = Math.ceil(grid.min / interval + 1e-9);
70
+ const lastStep = Math.floor(grid.max / interval - 1e-9);
71
+ for (let step = firstStep; step <= lastStep; step += 1) {
72
+ const level = step * interval;
73
+ const segments = [];
74
+ for (let r = 0; r < res; r += 1) {
75
+ for (let c = 0; c < res; c += 1) {
76
+ const blv = heights[r * cols + c];
77
+ const brv = heights[r * cols + c + 1];
78
+ const trv = heights[(r + 1) * cols + c + 1];
79
+ const tlv = heights[(r + 1) * cols + c];
80
+ let code = 0;
81
+ if (blv > level)
82
+ code |= 1;
83
+ if (brv > level)
84
+ code |= 2;
85
+ if (trv > level)
86
+ code |= 4;
87
+ if (tlv > level)
88
+ code |= 8;
89
+ if (code === 0 || code === 15)
90
+ continue;
91
+ const x0 = worldX(c);
92
+ const x1 = worldX(c + 1);
93
+ const z0 = worldZ(r);
94
+ const z1 = worldZ(r + 1);
95
+ const eBottom = () => lerpPoint(x0, z0, blv, x1, z0, brv, level);
96
+ const eRight = () => lerpPoint(x1, z0, brv, x1, z1, trv, level);
97
+ const eTop = () => lerpPoint(x1, z1, trv, x0, z1, tlv, level);
98
+ const eLeft = () => lerpPoint(x0, z1, tlv, x0, z0, blv, level);
99
+ const push = (a, b) => {
100
+ segments.push(a[0], a[1], b[0], b[1]);
101
+ };
102
+ switch (code) {
103
+ case 1:
104
+ case 14:
105
+ push(eLeft(), eBottom());
106
+ break;
107
+ case 2:
108
+ case 13:
109
+ push(eBottom(), eRight());
110
+ break;
111
+ case 3:
112
+ case 12:
113
+ push(eLeft(), eRight());
114
+ break;
115
+ case 4:
116
+ case 11:
117
+ push(eRight(), eTop());
118
+ break;
119
+ case 6:
120
+ case 9:
121
+ push(eBottom(), eTop());
122
+ break;
123
+ case 7:
124
+ case 8:
125
+ push(eLeft(), eTop());
126
+ break;
127
+ case 5: {
128
+ const center = (blv + brv + trv + tlv) / 4;
129
+ if (center > level) {
130
+ push(eLeft(), eTop());
131
+ push(eBottom(), eRight());
132
+ }
133
+ else {
134
+ push(eLeft(), eBottom());
135
+ push(eRight(), eTop());
136
+ }
137
+ break;
138
+ }
139
+ case 10: {
140
+ const center = (blv + brv + trv + tlv) / 4;
141
+ if (center > level) {
142
+ push(eLeft(), eBottom());
143
+ push(eRight(), eTop());
144
+ }
145
+ else {
146
+ push(eLeft(), eTop());
147
+ push(eBottom(), eRight());
148
+ }
149
+ break;
150
+ }
151
+ default:
152
+ break;
153
+ }
154
+ }
155
+ }
156
+ if (segments.length > 0) {
157
+ lines.push({ level, major: step % majorEvery === 0, segments });
158
+ }
159
+ }
160
+ return lines;
161
+ }
162
+ const NICE_STEPS = [1, 2, 2.5, 5];
163
+ /**
164
+ * Picks a human-friendly contour interval — a `1/2/2.5/5 × 10ⁿ` step — so an elevation `range` splits
165
+ * into roughly `targetLines` bands. Drives adaptive contour density: a tall terrain gets a coarse
166
+ * interval, a shallow one a fine interval, without the author choosing a number. Returns `0` when the
167
+ * range is non-positive (nothing to contour).
168
+ * @capability contour-interval readable auto-spacing for elevation contours
169
+ * @consumer editor terrain-readability overlay density control
170
+ */
171
+ export function chooseContourInterval(range, targetLines = 12) {
172
+ if (!(range > 0) || !(targetLines > 0))
173
+ return 0;
174
+ const rough = range / targetLines;
175
+ const magnitude = 10 ** Math.floor(Math.log10(rough));
176
+ let best = NICE_STEPS[0] * magnitude;
177
+ let bestErr = Infinity;
178
+ for (const stepBase of NICE_STEPS) {
179
+ for (const scale of [magnitude, magnitude * 10]) {
180
+ const candidate = stepBase * scale;
181
+ const err = Math.abs(range / candidate - targetLines);
182
+ if (err < bestErr) {
183
+ bestErr = err;
184
+ best = candidate;
185
+ }
186
+ }
187
+ }
188
+ return best;
189
+ }
190
+ /**
191
+ * Reads the ground elevation under a world point and its signed delta from a reference plane — the
192
+ * measurable cursor/hover feedback ("+3.4 above the pad") an author needs to judge sculpted height.
193
+ * @capability elevation-readout cursor height and delta-from-reference feedback
194
+ * @consumer editor terrain-readability HUD readout
195
+ */
196
+ export function sampleElevation(sampleHeight, x, z, reference = 0) {
197
+ const height = sampleHeight(x, z);
198
+ return { x, z, height, delta: height - reference, reference };
199
+ }
200
+ /**
201
+ * Summarises elevation across a region on a bounded sample grid: min, max, mean, relief range, and the
202
+ * world points of the extremes — the selection min/max and legend feedback the readability overlay
203
+ * reports, and the input to {@link chooseContourInterval}. Pure math, renderer-agnostic.
204
+ * @capability elevation-summary selection min/max/mean and relief over a region
205
+ * @consumer editor terrain-readability legend and selection stats
206
+ */
207
+ export function summarizeElevation(sampleHeight, region, resolution = 64, maxSamples = 256) {
208
+ const grid = sampleHeightGrid(sampleHeight, region, resolution, maxSamples);
209
+ const { cols, rows, heights } = grid;
210
+ const res = cols - 1;
211
+ const spanX = region.maxX - region.minX;
212
+ const spanZ = region.maxZ - region.minZ;
213
+ let sum = 0;
214
+ let minAt = [region.minX, region.minZ];
215
+ let maxAt = [region.minX, region.minZ];
216
+ for (let r = 0; r < rows; r += 1) {
217
+ for (let c = 0; c < cols; c += 1) {
218
+ const h = heights[r * cols + c];
219
+ sum += h;
220
+ if (h === grid.min)
221
+ minAt = [region.minX + (c / res) * spanX, region.minZ + (r / res) * spanZ];
222
+ if (h === grid.max)
223
+ maxAt = [region.minX + (c / res) * spanX, region.minZ + (r / res) * spanZ];
224
+ }
225
+ }
226
+ const samples = cols * rows;
227
+ return {
228
+ min: grid.min,
229
+ max: grid.max,
230
+ mean: sum / samples,
231
+ range: grid.max - grid.min,
232
+ minAt,
233
+ maxAt,
234
+ samples,
235
+ };
236
+ }
237
+ /**
238
+ * Drapes an XZ polyline onto the surface: subdivides each span to at most `spacing` and lifts every
239
+ * vertex to `sampleHeight + offset`, returning flat `[x, y, z, ...]` world triples. The reusable seam
240
+ * behind surface-following placement guides and grid lines — a straight guide bends to follow terrain.
241
+ * @capability surface-drape lift an XZ polyline onto sculpted terrain
242
+ * @consumer editor placement guides and surface grid overlay
243
+ */
244
+ export function drapePolyline(sampleHeight, points, options = {}) {
245
+ const spacing = options.spacing !== undefined && options.spacing > 0 ? options.spacing : 1;
246
+ const offset = options.offset ?? 0;
247
+ const out = [];
248
+ if (points.length === 0)
249
+ return out;
250
+ const push = (x, z) => {
251
+ out.push(x, sampleHeight(x, z) + offset, z);
252
+ };
253
+ if (points.length === 1) {
254
+ push(points[0][0], points[0][1]);
255
+ return out;
256
+ }
257
+ push(points[0][0], points[0][1]);
258
+ for (let i = 1; i < points.length; i += 1) {
259
+ const [ax, az] = points[i - 1];
260
+ const [bx, bz] = points[i];
261
+ const dist = Math.hypot(bx - ax, bz - az);
262
+ const steps = Math.max(1, Math.ceil(dist / spacing));
263
+ for (let s = 1; s <= steps; s += 1) {
264
+ const t = s / steps;
265
+ push(ax + (bx - ax) * t, az + (bz - az) * t);
266
+ }
267
+ }
268
+ return out;
269
+ }
270
+ /**
271
+ * A closed circle draped on the surface — the surface-following placement guide ring under a cursor or
272
+ * a selected object. Returns flat `[x, y, z, ...]` world triples forming a loop (last vertex repeats
273
+ * the first). `segments` sets the smoothness of the ring.
274
+ * @capability surface-ring surface-following placement guide ring
275
+ * @consumer editor cursor/placement guide
276
+ */
277
+ export function surfaceRing(sampleHeight, center, radius, segments = 48, options = {}) {
278
+ const n = Math.max(3, Math.floor(segments));
279
+ const points = [];
280
+ for (let i = 0; i <= n; i += 1) {
281
+ const angle = (i / n) * Math.PI * 2;
282
+ points.push([center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius]);
283
+ }
284
+ return drapePolyline(sampleHeight, points, options);
285
+ }
286
+ function gridStops(min, max, spacing) {
287
+ const stops = [];
288
+ const first = Math.ceil(min / spacing - 1e-9);
289
+ const last = Math.floor(max / spacing + 1e-9);
290
+ for (let step = first; step <= last; step += 1)
291
+ stops.push(step);
292
+ return stops;
293
+ }
294
+ /**
295
+ * Builds a surface-following major/minor grid over a region: constant-`x` and constant-`z` lines at
296
+ * `spacing`, each draped onto the terrain so the reference grid climbs sculpted surfaces instead of
297
+ * being occluded by them (the flat `y = 0` grid's core failure). Draping subdivides to
298
+ * `drape.spacing`. Pure math, renderer-agnostic.
299
+ * @capability surface-grid terrain-following reference grid that is not occluded by relief
300
+ * @consumer editor terrain-readability grid overlay
301
+ */
302
+ export function surfaceGridLines(sampleHeight, options) {
303
+ const { region, spacing } = options;
304
+ assertRegion(region);
305
+ if (!(spacing > 0))
306
+ throw new Error("surfaceGridLines: spacing must be > 0");
307
+ const majorEvery = Math.max(1, Math.floor(options.majorEvery ?? 5));
308
+ const drape = options.drape ?? {};
309
+ const lines = [];
310
+ for (const step of gridStops(region.minX, region.maxX, spacing)) {
311
+ const x = step * spacing;
312
+ lines.push({
313
+ axis: "x",
314
+ at: x,
315
+ major: step % majorEvery === 0,
316
+ points: drapePolyline(sampleHeight, [[x, region.minZ], [x, region.maxZ]], drape),
317
+ });
318
+ }
319
+ for (const step of gridStops(region.minZ, region.maxZ, spacing)) {
320
+ const z = step * spacing;
321
+ lines.push({
322
+ axis: "z",
323
+ at: z,
324
+ major: step % majorEvery === 0,
325
+ points: drapePolyline(sampleHeight, [[region.minX, z], [region.maxX, z]], drape),
326
+ });
327
+ }
328
+ return lines;
329
+ }
330
+ /**
331
+ * Convenience over {@link extractContours} that auto-picks the interval from the field's own relief:
332
+ * summarises the region, chooses a readable interval for `targetLines` bands, and traces the contours —
333
+ * the one call the editor overlay makes to turn a `TerrainField` into ready-to-draw guides. Returns an
334
+ * empty list for flat ground.
335
+ * @capability terrain-guides one-call adaptive contours for a terrain field
336
+ * @consumer editor terrain-readability overlay
337
+ */
338
+ export function terrainContourGuides(field, region, targetLines = 12, resolution = 128) {
339
+ const summary = summarizeElevation(field.sampleHeight, region, Math.min(resolution, 96));
340
+ const interval = chooseContourInterval(summary.range, targetLines);
341
+ const contours = interval > 0 ? extractContours(field.sampleHeight, { region, interval, resolution }) : [];
342
+ return { interval, summary, contours };
343
+ }
@@ -0,0 +1,81 @@
1
+ import type { Vec2 } from "./geometry.js";
2
+ /** Sum of two 2D vectors.
3
+ * @internal
4
+ */
5
+ export declare function add(a: Vec2, b: Vec2): Vec2;
6
+ /** Difference `a - b` of two 2D vectors.
7
+ * @internal
8
+ */
9
+ export declare function sub(a: Vec2, b: Vec2): Vec2;
10
+ /** Scale a 2D vector by a scalar.
11
+ * @internal
12
+ */
13
+ export declare function scale(a: Vec2, s: number): Vec2;
14
+ /** Negate a 2D vector.
15
+ * @internal
16
+ */
17
+ export declare function negate(a: Vec2): Vec2;
18
+ /** Dot product of two 2D vectors.
19
+ * @internal
20
+ */
21
+ export declare function dot(a: Vec2, b: Vec2): number;
22
+ /** 2D cross product (scalar z of the 3D cross), positive when `b` is counter-clockwise from `a`.
23
+ * @internal
24
+ */
25
+ export declare function cross(a: Vec2, b: Vec2): number;
26
+ /** Euclidean length of a 2D vector.
27
+ * @internal
28
+ */
29
+ export declare function length(a: Vec2): number;
30
+ /** Squared length of a 2D vector; cheaper than `length` when only comparing magnitudes.
31
+ * @internal
32
+ */
33
+ export declare function lengthSquared(a: Vec2): number;
34
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
35
+ * @internal
36
+ */
37
+ export declare function normalize(a: Vec2): Vec2;
38
+ /** Distance between two points.
39
+ * @internal
40
+ */
41
+ export declare function distance(a: Vec2, b: Vec2): number;
42
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons.
43
+ * @internal
44
+ */
45
+ export declare function distanceSquared(a: Vec2, b: Vec2): number;
46
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
47
+ * @internal
48
+ */
49
+ export declare function lerp(a: Vec2, b: Vec2, t: number): Vec2;
50
+ /** Left-hand perpendicular of `a` (rotated 90° counter-clockwise).
51
+ * @internal
52
+ */
53
+ export declare function perp(a: Vec2): Vec2;
54
+ /** Rotate a 2D vector by `radians` about the origin.
55
+ * @internal
56
+ */
57
+ export declare function rotate(a: Vec2, radians: number): Vec2;
58
+ /**
59
+ * Reflect a velocity off a surface with unit `normal`, losing energy by `restitution` (0..1). At
60
+ * `restitution` 1 the normal component mirrors elastically (`v − 2(v·n)n`); at 0 it is removed so the
61
+ * vector slides along the surface. Only the normal component is scaled — tangential motion is kept — so
62
+ * this is the wall/paddle/boundary bounce every arcade ball game hand-rolls.
63
+ * @internal
64
+ */
65
+ export declare function reflect(v: Vec2, normal: Vec2, restitution?: number): Vec2;
66
+ /** Unit vector for a heading measured clockwise from +Y (the engine's XZ-plane convention).
67
+ * @internal
68
+ */
69
+ export declare function fromHeading(headingRad: number): Vec2;
70
+ /** Heading in radians of a vector, measured clockwise from +Y to match `fromHeading`.
71
+ * @internal
72
+ */
73
+ export declare function heading(a: Vec2): number;
74
+ /** Wrap an angle in radians into `[0, 2π)`.
75
+ * @internal
76
+ */
77
+ export declare function normalizeAngle(angleRad: number): number;
78
+ /** Wrap an angle in degrees into `[0, 360)`.
79
+ * @internal
80
+ */
81
+ export declare function normalizeAngleDeg(angleDeg: number): number;