@jgengine/core 0.10.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 (607) hide show
  1. package/CHANGELOG.md +13 -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/spawnDirector.d.ts +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  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/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -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;
@@ -0,0 +1,128 @@
1
+ /** Sum of two 2D vectors.
2
+ * @internal
3
+ */
4
+ export function add(a, b) {
5
+ return [a[0] + b[0], a[1] + b[1]];
6
+ }
7
+ /** Difference `a - b` of two 2D vectors.
8
+ * @internal
9
+ */
10
+ export function sub(a, b) {
11
+ return [a[0] - b[0], a[1] - b[1]];
12
+ }
13
+ /** Scale a 2D vector by a scalar.
14
+ * @internal
15
+ */
16
+ export function scale(a, s) {
17
+ return [a[0] * s, a[1] * s];
18
+ }
19
+ /** Negate a 2D vector.
20
+ * @internal
21
+ */
22
+ export function negate(a) {
23
+ return [-a[0], -a[1]];
24
+ }
25
+ /** Dot product of two 2D vectors.
26
+ * @internal
27
+ */
28
+ export function dot(a, b) {
29
+ return a[0] * b[0] + a[1] * b[1];
30
+ }
31
+ /** 2D cross product (scalar z of the 3D cross), positive when `b` is counter-clockwise from `a`.
32
+ * @internal
33
+ */
34
+ export function cross(a, b) {
35
+ return a[0] * b[1] - a[1] * b[0];
36
+ }
37
+ /** Euclidean length of a 2D vector.
38
+ * @internal
39
+ */
40
+ export function length(a) {
41
+ return Math.hypot(a[0], a[1]);
42
+ }
43
+ /** Squared length of a 2D vector; cheaper than `length` when only comparing magnitudes.
44
+ * @internal
45
+ */
46
+ export function lengthSquared(a) {
47
+ return a[0] * a[0] + a[1] * a[1];
48
+ }
49
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
50
+ * @internal
51
+ */
52
+ export function normalize(a) {
53
+ const len = Math.hypot(a[0], a[1]);
54
+ return len < 1e-9 ? [0, 0] : [a[0] / len, a[1] / len];
55
+ }
56
+ /** Distance between two points.
57
+ * @internal
58
+ */
59
+ export function distance(a, b) {
60
+ return Math.hypot(a[0] - b[0], a[1] - b[1]);
61
+ }
62
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons.
63
+ * @internal
64
+ */
65
+ export function distanceSquared(a, b) {
66
+ const dx = a[0] - b[0];
67
+ const dy = a[1] - b[1];
68
+ return dx * dx + dy * dy;
69
+ }
70
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
71
+ * @internal
72
+ */
73
+ export function lerp(a, b, t) {
74
+ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];
75
+ }
76
+ /** Left-hand perpendicular of `a` (rotated 90° counter-clockwise).
77
+ * @internal
78
+ */
79
+ export function perp(a) {
80
+ return [-a[1], a[0]];
81
+ }
82
+ /** Rotate a 2D vector by `radians` about the origin.
83
+ * @internal
84
+ */
85
+ export function rotate(a, radians) {
86
+ const c = Math.cos(radians);
87
+ const s = Math.sin(radians);
88
+ return [a[0] * c - a[1] * s, a[0] * s + a[1] * c];
89
+ }
90
+ /**
91
+ * Reflect a velocity off a surface with unit `normal`, losing energy by `restitution` (0..1). At
92
+ * `restitution` 1 the normal component mirrors elastically (`v − 2(v·n)n`); at 0 it is removed so the
93
+ * vector slides along the surface. Only the normal component is scaled — tangential motion is kept — so
94
+ * this is the wall/paddle/boundary bounce every arcade ball game hand-rolls.
95
+ * @internal
96
+ */
97
+ export function reflect(v, normal, restitution = 1) {
98
+ const vn = v[0] * normal[0] + v[1] * normal[1];
99
+ const j = (1 + restitution) * vn;
100
+ return [v[0] - j * normal[0], v[1] - j * normal[1]];
101
+ }
102
+ /** Unit vector for a heading measured clockwise from +Y (the engine's XZ-plane convention).
103
+ * @internal
104
+ */
105
+ export function fromHeading(headingRad) {
106
+ return [Math.sin(headingRad), Math.cos(headingRad)];
107
+ }
108
+ /** Heading in radians of a vector, measured clockwise from +Y to match `fromHeading`.
109
+ * @internal
110
+ */
111
+ export function heading(a) {
112
+ return Math.atan2(a[0], a[1]);
113
+ }
114
+ /** Wrap an angle in radians into `[0, 2π)`.
115
+ * @internal
116
+ */
117
+ export function normalizeAngle(angleRad) {
118
+ const twoPi = Math.PI * 2;
119
+ const a = angleRad % twoPi;
120
+ return a < 0 ? a + twoPi : a;
121
+ }
122
+ /** Wrap an angle in degrees into `[0, 360)`.
123
+ * @internal
124
+ */
125
+ export function normalizeAngleDeg(angleDeg) {
126
+ const a = angleDeg % 360;
127
+ return a < 0 ? a + 360 : a;
128
+ }
@@ -0,0 +1,49 @@
1
+ import type { Vec3 } from "./geometry.js";
2
+ /** Sum of two 3D vectors.
3
+ * @internal
4
+ */
5
+ export declare function add(a: Vec3, b: Vec3): Vec3;
6
+ /** Difference `a - b` of two 3D vectors.
7
+ * @internal
8
+ */
9
+ export declare function sub(a: Vec3, b: Vec3): Vec3;
10
+ /** Scale a 3D vector by a scalar.
11
+ * @internal
12
+ */
13
+ export declare function scale(a: Vec3, s: number): Vec3;
14
+ /** Negate a 3D vector.
15
+ * @internal
16
+ */
17
+ export declare function negate(a: Vec3): Vec3;
18
+ /** Dot product of two 3D vectors.
19
+ * @internal
20
+ */
21
+ export declare function dot(a: Vec3, b: Vec3): number;
22
+ /** Cross product `a × b` of two 3D vectors.
23
+ * @internal
24
+ */
25
+ export declare function cross(a: Vec3, b: Vec3): Vec3;
26
+ /** Euclidean length of a 3D vector.
27
+ * @internal
28
+ */
29
+ export declare function length(a: Vec3): number;
30
+ /** Squared length of a 3D vector; cheaper than `length` when only comparing magnitudes.
31
+ * @internal
32
+ */
33
+ export declare function lengthSquared(a: Vec3): 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: Vec3): Vec3;
38
+ /** Distance between two points.
39
+ * @internal
40
+ */
41
+ export declare function distance(a: Vec3, b: Vec3): number;
42
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons on hot paths.
43
+ * @internal
44
+ */
45
+ export declare function distanceSquared(a: Vec3, b: Vec3): number;
46
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
47
+ * @internal
48
+ */
49
+ export declare function lerp(a: Vec3, b: Vec3, t: number): Vec3;
@@ -0,0 +1,76 @@
1
+ /** Sum of two 3D vectors.
2
+ * @internal
3
+ */
4
+ export function add(a, b) {
5
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
6
+ }
7
+ /** Difference `a - b` of two 3D vectors.
8
+ * @internal
9
+ */
10
+ export function sub(a, b) {
11
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
12
+ }
13
+ /** Scale a 3D vector by a scalar.
14
+ * @internal
15
+ */
16
+ export function scale(a, s) {
17
+ return [a[0] * s, a[1] * s, a[2] * s];
18
+ }
19
+ /** Negate a 3D vector.
20
+ * @internal
21
+ */
22
+ export function negate(a) {
23
+ return [-a[0], -a[1], -a[2]];
24
+ }
25
+ /** Dot product of two 3D vectors.
26
+ * @internal
27
+ */
28
+ export function dot(a, b) {
29
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
30
+ }
31
+ /** Cross product `a × b` of two 3D vectors.
32
+ * @internal
33
+ */
34
+ export function cross(a, b) {
35
+ return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
36
+ }
37
+ /** Euclidean length of a 3D vector.
38
+ * @internal
39
+ */
40
+ export function length(a) {
41
+ return Math.hypot(a[0], a[1], a[2]);
42
+ }
43
+ /** Squared length of a 3D vector; cheaper than `length` when only comparing magnitudes.
44
+ * @internal
45
+ */
46
+ export function lengthSquared(a) {
47
+ return a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
48
+ }
49
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
50
+ * @internal
51
+ */
52
+ export function normalize(a) {
53
+ const len = Math.hypot(a[0], a[1], a[2]);
54
+ return len < 1e-9 ? [0, 0, 0] : [a[0] / len, a[1] / len, a[2] / len];
55
+ }
56
+ /** Distance between two points.
57
+ * @internal
58
+ */
59
+ export function distance(a, b) {
60
+ return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
61
+ }
62
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons on hot paths.
63
+ * @internal
64
+ */
65
+ export function distanceSquared(a, b) {
66
+ const dx = a[0] - b[0];
67
+ const dy = a[1] - b[1];
68
+ const dz = a[2] - b[2];
69
+ return dx * dx + dy * dy + dz * dz;
70
+ }
71
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
72
+ * @internal
73
+ */
74
+ export function lerp(a, b, t) {
75
+ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
76
+ }