@jgengine/core 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Data-driven modular build-piece snap system: a catalog of piece types, each declaring named
3
+ * sockets (local position + outward facing + a generic "kind"), plus a connection-rule table saying
4
+ * which socket kinds may mate. Given a placed piece and a candidate type it resolves every valid
5
+ * snap — the world transform that lands the candidate's socket exactly on the placed piece's socket,
6
+ * facing back into it. Genre-agnostic: foundation/wall/ceiling/pillar/edge snapping falls out of the
7
+ * catalog data, with no game-specific piece names baked in. Pure and serializable; composes with
8
+ * `world/footprintGrid` occupancy (via an injected `isFree` predicate — never imported) and with
9
+ * `scene/modelSockets` named attach points (via {@link pieceSocketsFromModel}).
10
+ */
11
+ /** Length-prefixed composite key (avoids delimiter collisions without any control characters). */
12
+ function pairKey(a, b) {
13
+ return `${a.length}:${a}:${b}`;
14
+ }
15
+ /** Rotate a local offset about +Y by `yaw` radians (affects X/Z, leaves Y). */
16
+ function rotateY(v, yaw) {
17
+ if (yaw === 0)
18
+ return [v[0], v[1], v[2]];
19
+ const cos = Math.cos(yaw);
20
+ const sin = Math.sin(yaw);
21
+ return [v[0] * cos - v[2] * sin, v[1], v[0] * sin + v[2] * cos];
22
+ }
23
+ function cloneSocket(socket) {
24
+ return {
25
+ name: socket.name,
26
+ kind: socket.kind,
27
+ position: [socket.position[0], socket.position[1], socket.position[2]],
28
+ ...(socket.yaw === undefined ? {} : { yaw: socket.yaw }),
29
+ };
30
+ }
31
+ function clonePiece(piece) {
32
+ return {
33
+ type: piece.type,
34
+ sockets: piece.sockets.map(cloneSocket),
35
+ ...(piece.footprint === undefined ? {} : { footprint: { w: piece.footprint.w, d: piece.footprint.d } }),
36
+ };
37
+ }
38
+ /**
39
+ * The grid cells a piece `footprint` centered on `position` (world units) covers, honoring `yaw`
40
+ * (snapped to the nearest quarter turn). Mirrors `world/footprintGrid`'s `cellsFor` so a game can
41
+ * feed the result straight into `grid.isFree`/`grid.reserve` after committing a resolved snap —
42
+ * without this module importing the grid.
43
+ *
44
+ * @capability build-footprint-cells grid cells a snapped build piece footprint covers (footprintGrid occupancy bridge)
45
+ */
46
+ export function footprintCells(position, footprint, yaw = 0, cellSize = 1) {
47
+ const quarterTurns = Math.round(yaw / (Math.PI / 2));
48
+ const turned = (((quarterTurns % 2) + 2) % 2) === 1;
49
+ const cols = Math.max(1, Math.round((turned ? footprint.d : footprint.w) / cellSize));
50
+ const rows = Math.max(1, Math.round((turned ? footprint.w : footprint.d) / cellSize));
51
+ const originCol = Math.round(position[0] / cellSize - cols / 2);
52
+ const originRow = Math.round(position[2] / cellSize - rows / 2);
53
+ const cells = [];
54
+ for (let row = 0; row < rows; row += 1) {
55
+ for (let col = 0; col < cols; col += 1)
56
+ cells.push({ col: originCol + col, row: originRow + row });
57
+ }
58
+ return cells;
59
+ }
60
+ /**
61
+ * Turn a model's named attach points (from `scene/modelSockets`' `readNamedSockets`) into
62
+ * {@link SocketDef}s, classifying each into a connection `kind` via `kindOf` and, optionally, an
63
+ * outward `yaw` via `yawOf`. Lets an artist author snap sockets as empties in a GLB instead of by
64
+ * hand in the catalog. Pure and structural — no three.js or scene import.
65
+ *
66
+ * @capability piece-sockets-from-model derive build-piece snap sockets from a model's named attach points
67
+ */
68
+ export function pieceSocketsFromModel(sockets, kindOf, yawOf) {
69
+ return sockets.map((socket) => ({
70
+ name: socket.name,
71
+ kind: kindOf(socket.name),
72
+ position: [socket.offset[0], socket.offset[1], socket.offset[2]],
73
+ ...(yawOf === undefined ? {} : { yaw: yawOf(socket.name) }),
74
+ }));
75
+ }
76
+ /**
77
+ * Build a modular snap catalog from piece definitions and a connection-rule table. Resolves the set
78
+ * of valid snap transforms when hovering a candidate piece near a placed one: for every compatible
79
+ * socket pair it computes the world transform that seats the candidate's socket onto the placed
80
+ * socket, oriented to face back into it. Deterministic ordering (nearest a cursor when given, else
81
+ * declaration order) and an optional occupancy predicate keep it drop-in for a build-mode controller.
82
+ *
83
+ * @capability build-socket-catalog data-driven named-socket snap catalog for modular base building
84
+ */
85
+ export function createBuildSocketCatalog(config) {
86
+ const cellSize = config.cellSize ?? 1;
87
+ const pieces = new Map();
88
+ const order = [];
89
+ for (const piece of config.pieces) {
90
+ const clone = clonePiece(piece);
91
+ pieces.set(clone.type, clone);
92
+ order.push(clone.type);
93
+ }
94
+ const compatible = new Set();
95
+ const rules = [];
96
+ for (const rule of config.rules) {
97
+ compatible.add(pairKey(rule.a, rule.b));
98
+ if (rule.mutual !== false)
99
+ compatible.add(pairKey(rule.b, rule.a));
100
+ rules.push({ a: rule.a, b: rule.b, ...(rule.mutual === undefined ? {} : { mutual: rule.mutual }) });
101
+ }
102
+ const canConnect = (candidateKind, placedKind) => compatible.has(pairKey(candidateKind, placedKind));
103
+ const worldSockets = (placed) => {
104
+ const def = pieces.get(placed.type);
105
+ if (def === undefined)
106
+ return [];
107
+ const baseYaw = placed.transform.yaw ?? 0;
108
+ const origin = placed.transform.position;
109
+ return def.sockets.map((socket) => {
110
+ const rotated = rotateY(socket.position, baseYaw);
111
+ return {
112
+ name: socket.name,
113
+ kind: socket.kind,
114
+ position: [origin[0] + rotated[0], origin[1] + rotated[1], origin[2] + rotated[2]],
115
+ yaw: baseYaw + (socket.yaw ?? 0),
116
+ };
117
+ });
118
+ };
119
+ return {
120
+ cellSize,
121
+ has(type) {
122
+ return pieces.has(type);
123
+ },
124
+ piece(type) {
125
+ const def = pieces.get(type);
126
+ return def === undefined ? null : clonePiece(def);
127
+ },
128
+ types() {
129
+ return order.slice();
130
+ },
131
+ canConnect,
132
+ worldSockets,
133
+ resolveSnaps(placed, candidateType, options = {}) {
134
+ const candidateDef = pieces.get(candidateType);
135
+ if (candidateDef === undefined)
136
+ return [];
137
+ const targets = worldSockets(placed);
138
+ const cursor = options.cursor;
139
+ const isFree = options.isFree;
140
+ const out = [];
141
+ for (const target of targets) {
142
+ for (const socket of candidateDef.sockets) {
143
+ if (!canConnect(socket.kind, target.kind))
144
+ continue;
145
+ // Seat the candidate socket onto the target: same world point, facing opposite.
146
+ const candidateYaw = target.yaw + Math.PI - (socket.yaw ?? 0);
147
+ const rotated = rotateY(socket.position, candidateYaw);
148
+ const positionX = target.position[0] - rotated[0];
149
+ const positionY = target.position[1] - rotated[1];
150
+ const positionZ = target.position[2] - rotated[2];
151
+ const position = [positionX, positionY, positionZ];
152
+ if (isFree !== undefined && candidateDef.footprint !== undefined) {
153
+ const cells = footprintCells(position, candidateDef.footprint, candidateYaw, cellSize);
154
+ if (!cells.every((cell) => isFree(cell)))
155
+ continue;
156
+ }
157
+ const distance = cursor === undefined
158
+ ? 0
159
+ : Math.hypot(target.position[0] - cursor[0], target.position[1] - cursor[1], target.position[2] - cursor[2]);
160
+ out.push({
161
+ candidateType,
162
+ targetSocket: target.name,
163
+ candidateSocket: socket.name,
164
+ transform: { position, yaw: candidateYaw },
165
+ point: [target.position[0], target.position[1], target.position[2]],
166
+ distance,
167
+ });
168
+ }
169
+ }
170
+ // Nearest-first when a cursor is given; Array.sort is stable so equal distances keep
171
+ // declaration order. Without a cursor the array is already in declaration order.
172
+ if (cursor !== undefined)
173
+ out.sort((x, y) => x.distance - y.distance);
174
+ return out;
175
+ },
176
+ toJSON() {
177
+ return {
178
+ cellSize,
179
+ pieces: order.map((type) => clonePiece(pieces.get(type))),
180
+ rules: rules.map((rule) => ({
181
+ a: rule.a,
182
+ b: rule.b,
183
+ ...(rule.mutual === undefined ? {} : { mutual: rule.mutual }),
184
+ })),
185
+ };
186
+ },
187
+ };
188
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The building generator registered against the {@link registerAssetGenerator} seam — the one engine
3
+ * adopter, proving the seeded config→parts building generator ({@link generateBuilding}) drops into
4
+ * the parametric-asset catalog with a slider schema and nothing bespoke. Domain generators (bookcase,
5
+ * …) register the same way from example/game code.
6
+ *
7
+ * @capability building-generator seeded building as a placeable parametric asset
8
+ */
9
+ import { type GeneratedAsset } from "../scene/assetGenerator.js";
10
+ import type { ParamSchema, ParsedParams } from "../scene/sceneKinds.js";
11
+ /** The generator id a catalog entry / placed marker references. */
12
+ export declare const BUILDING_GENERATOR_ID = "building";
13
+ /** The building generator's slider schema — drives the inspector via #809. */
14
+ export declare const BUILDING_GENERATOR_SCHEMA: ParamSchema;
15
+ /** Generate a building's parts from validated params + seed — the {@link registerAssetGenerator} hook. @internal */
16
+ export declare function generateBuildingAsset(params: ParsedParams, seed: string): GeneratedAsset;
17
+ /** Register the building generator asset. Called by {@link registerBuiltinSceneKinds}. @internal */
18
+ export declare function registerBuildingGenerator(): void;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The building generator registered against the {@link registerAssetGenerator} seam — the one engine
3
+ * adopter, proving the seeded config→parts building generator ({@link generateBuilding}) drops into
4
+ * the parametric-asset catalog with a slider schema and nothing bespoke. Domain generators (bookcase,
5
+ * …) register the same way from example/game code.
6
+ *
7
+ * @capability building-generator seeded building as a placeable parametric asset
8
+ */
9
+ import { registerAssetGenerator, partsBounds } from "../scene/assetGenerator.js";
10
+ import { BUILDING_STYLE_PALETTES, DEFAULT_BUILDING_CONFIG, generateBuilding, resolveBuildingPalette } from "./buildings.js";
11
+ /** The generator id a catalog entry / placed marker references. */
12
+ export const BUILDING_GENERATOR_ID = "building";
13
+ /** The building generator's slider schema — drives the inspector via #809. */
14
+ export const BUILDING_GENERATOR_SCHEMA = {
15
+ fields: [
16
+ { type: "range", key: "floors", label: "floors", min: 1, max: 20, step: 1, default: DEFAULT_BUILDING_CONFIG.floors },
17
+ { type: "range", key: "baysWide", label: "bays wide", min: 1, max: 12, step: 1, default: DEFAULT_BUILDING_CONFIG.baysWide },
18
+ { type: "range", key: "baysDeep", label: "bays deep", min: 1, max: 12, step: 1, default: DEFAULT_BUILDING_CONFIG.baysDeep },
19
+ { type: "range", key: "bayWidth", label: "bay width", min: 1, max: 5, step: 0.1, default: DEFAULT_BUILDING_CONFIG.bayWidth, unit: "m" },
20
+ { type: "range", key: "floorHeight", label: "floor height", min: 2, max: 5, step: 0.1, default: DEFAULT_BUILDING_CONFIG.floorHeight, unit: "m" },
21
+ {
22
+ type: "select",
23
+ key: "style",
24
+ label: "style",
25
+ default: "generic",
26
+ options: Object.keys(BUILDING_STYLE_PALETTES).map((style) => ({ value: style })),
27
+ },
28
+ { type: "seed", key: "seed", label: "seed", default: "" },
29
+ ],
30
+ };
31
+ /** Generate a building's parts from validated params + seed — the {@link registerAssetGenerator} hook. @internal */
32
+ export function generateBuildingAsset(params, seed) {
33
+ const style = params["style"];
34
+ const palette = resolveBuildingPalette(style);
35
+ const building = generateBuilding({
36
+ seed,
37
+ center: [0, 0],
38
+ floors: params["floors"],
39
+ baysWide: params["baysWide"],
40
+ baysDeep: params["baysDeep"],
41
+ bayWidth: params["bayWidth"],
42
+ floorHeight: params["floorHeight"],
43
+ });
44
+ const parts = building.parts.map((part) => ({
45
+ id: part.id,
46
+ kind: part.kind,
47
+ position: part.position,
48
+ size: part.scale,
49
+ rotationY: part.rotationY,
50
+ color: palette[part.kind],
51
+ }));
52
+ return { parts, bounds: partsBounds(parts) };
53
+ }
54
+ /** Register the building generator asset. Called by {@link registerBuiltinSceneKinds}. @internal */
55
+ export function registerBuildingGenerator() {
56
+ registerAssetGenerator({
57
+ id: BUILDING_GENERATOR_ID,
58
+ label: "Building",
59
+ schema: BUILDING_GENERATOR_SCHEMA,
60
+ generate: generateBuildingAsset,
61
+ });
62
+ }
@@ -97,8 +97,13 @@ export type BuildingPaletteOverrides = Partial<BuildingPalette>;
97
97
  export type BuildingStyle = "generic" | "capital" | "village" | "desert" | "industrial" | "coastal" | "neon" | "ruin" | "frontier" | "aerial";
98
98
  export declare const DEFAULT_BUILDING_STYLE: BuildingStyle;
99
99
  export declare const BUILDING_STYLE_PALETTES: Record<BuildingStyle, BuildingPalette>;
100
+ /** @internal */
100
101
  export declare function resolveBuildingPalette(style?: BuildingStyle, overrides?: BuildingPaletteOverrides): BuildingPalette;
102
+ /** @internal */
101
103
  export declare function createBuildingConfig(input?: BuildingConfigInput): BuildingConfig;
104
+ /** @internal */
102
105
  export declare function generateBuilding(input?: BuildingConfigInput): GeneratedBuilding;
106
+ /** @internal */
103
107
  export declare function createBuildingGrid(config: BuildingGridConfig): BuildingLot[];
108
+ /** @internal */
104
109
  export declare function generateBuildingDistrict(config: BuildingGridConfig): GeneratedBuilding[];
@@ -176,6 +176,7 @@ export const BUILDING_STYLE_PALETTES = {
176
176
  corner: "#c3d0d7",
177
177
  },
178
178
  };
179
+ /** @internal */
179
180
  export function resolveBuildingPalette(style = DEFAULT_BUILDING_STYLE, overrides) {
180
181
  const preset = BUILDING_STYLE_PALETTES[style];
181
182
  if (preset === undefined) {
@@ -228,6 +229,7 @@ function rangeInt(seed, key, min, max) {
228
229
  const hi = Math.max(min, max);
229
230
  return lo + Math.floor(hash01(seed, key) * (hi - lo + 1));
230
231
  }
232
+ /** @internal */
231
233
  export function createBuildingConfig(input = {}) {
232
234
  return {
233
235
  id: input.id ?? DEFAULT_BUILDING_CONFIG.id,
@@ -406,6 +408,7 @@ function pushCorners(parts, config, width, depth) {
406
408
  parts.push(part(config, "corner", index < 2 ? "back" : "front", position, [config.facadeDepth * 1.35, height, config.facadeDepth * 1.35], `corner:${index}`, undefined, ["structure"]));
407
409
  });
408
410
  }
411
+ /** @internal */
409
412
  export function generateBuilding(input = {}) {
410
413
  const config = createBuildingConfig(input);
411
414
  const width = config.baysWide * config.bayWidth;
@@ -429,6 +432,7 @@ export function generateBuilding(input = {}) {
429
432
  parts,
430
433
  };
431
434
  }
435
+ /** @internal */
432
436
  export function createBuildingGrid(config) {
433
437
  const rows = positiveInt(config.rows, 1);
434
438
  const columns = positiveInt(config.columns, 1);
@@ -467,6 +471,7 @@ export function createBuildingGrid(config) {
467
471
  }
468
472
  return lots;
469
473
  }
474
+ /** @internal */
470
475
  export function generateBuildingDistrict(config) {
471
476
  return createBuildingGrid(config).map((lot) => generateBuilding(lot.config));
472
477
  }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Generic sag/catenary curve → point string, ready to loft into a tube. Genre-agnostic — power lines,
3
+ * suspension-bridge cables, ziplines, ropes, hanging chains, festoon lights all hang the same way.
4
+ * `sagCurve` is a cheap quadratic-Bézier droop; `catenaryCurve` is the true cosh hyperbolic cable.
5
+ *
6
+ * @capability catenary sagging cable curve between two anchors
7
+ */
8
+ export type { Vec3 } from "./geometry.js";
9
+ import type { Vec3 } from "./geometry.js";
10
+ /**
11
+ * Quadratic-Bézier sag between two anchors: the control point is pulled straight down so the mid-span
12
+ * lowest point droops by exactly `sag` meters below the chord. Cheap and stable; the go-to for cables
13
+ * where exact catenary physics don't matter. Returns `segments + 1` points.
14
+ */
15
+ export declare function sagCurve(a: Vec3, b: Vec3, sag: number, segments: number): Vec3[];
16
+ /**
17
+ * True hyperbolic catenary between two anchors — the shape a uniform cable actually takes under
18
+ * gravity. `slack` is the extra length beyond the straight-line distance, as a fraction (0.1 = 10%
19
+ * longer than taut); larger slack droops deeper. Falls back to {@link sagCurve} for a near-taut cable.
20
+ * Returns `segments + 1` points. Anchors may differ in height; the curve interpolates the chord.
21
+ */
22
+ export declare function catenaryCurve(a: Vec3, b: Vec3, slack: number, segments: number): Vec3[];
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Generic sag/catenary curve → point string, ready to loft into a tube. Genre-agnostic — power lines,
3
+ * suspension-bridge cables, ziplines, ropes, hanging chains, festoon lights all hang the same way.
4
+ * `sagCurve` is a cheap quadratic-Bézier droop; `catenaryCurve` is the true cosh hyperbolic cable.
5
+ *
6
+ * @capability catenary sagging cable curve between two anchors
7
+ */
8
+ /**
9
+ * Quadratic-Bézier sag between two anchors: the control point is pulled straight down so the mid-span
10
+ * lowest point droops by exactly `sag` meters below the chord. Cheap and stable; the go-to for cables
11
+ * where exact catenary physics don't matter. Returns `segments + 1` points.
12
+ */
13
+ export function sagCurve(a, b, sag, segments) {
14
+ const steps = Math.max(2, Math.round(segments));
15
+ const cx = (a[0] + b[0]) / 2;
16
+ const cy = (a[1] + b[1]) / 2 - 2 * sag;
17
+ const cz = (a[2] + b[2]) / 2;
18
+ const points = [];
19
+ for (let i = 0; i <= steps; i += 1) {
20
+ const t = i / steps;
21
+ const u = 1 - t;
22
+ const w0 = u * u;
23
+ const w1 = 2 * u * t;
24
+ const w2 = t * t;
25
+ points.push([w0 * a[0] + w1 * cx + w2 * b[0], w0 * a[1] + w1 * cy + w2 * b[1], w0 * a[2] + w1 * cz + w2 * b[2]]);
26
+ }
27
+ return points;
28
+ }
29
+ /**
30
+ * True hyperbolic catenary between two anchors — the shape a uniform cable actually takes under
31
+ * gravity. `slack` is the extra length beyond the straight-line distance, as a fraction (0.1 = 10%
32
+ * longer than taut); larger slack droops deeper. Falls back to {@link sagCurve} for a near-taut cable.
33
+ * Returns `segments + 1` points. Anchors may differ in height; the curve interpolates the chord.
34
+ */
35
+ export function catenaryCurve(a, b, slack, segments) {
36
+ const steps = Math.max(2, Math.round(segments));
37
+ const dx = b[0] - a[0];
38
+ const dz = b[2] - a[2];
39
+ const horizontal = Math.hypot(dx, dz);
40
+ if (horizontal < 1e-4 || slack <= 0)
41
+ return sagCurve(a, b, Math.max(0, slack) * horizontal * 0.5, steps);
42
+ const length = horizontal * (1 + slack);
43
+ // Solve the catenary parameter `p` (= a in y=p·cosh(x/p)) for the required arc length via bisection.
44
+ const targetRatio = length / horizontal;
45
+ let lo = 1e-3;
46
+ let hi = 1e6;
47
+ for (let i = 0; i < 48; i += 1) {
48
+ const mid = (lo + hi) / 2;
49
+ const ratio = (2 * mid * Math.sinh(horizontal / (2 * mid))) / horizontal;
50
+ if (ratio > targetRatio)
51
+ lo = mid;
52
+ else
53
+ hi = mid;
54
+ }
55
+ const p = (lo + hi) / 2;
56
+ const edge = p * Math.cosh(horizontal / (2 * p));
57
+ const points = [];
58
+ for (let i = 0; i <= steps; i += 1) {
59
+ const t = i / steps;
60
+ const x = a[0] + dx * t;
61
+ const z = a[2] + dz * t;
62
+ // Local horizontal coordinate centered at mid-span → catenary drop below the chord (0 at ends).
63
+ const local = (t - 0.5) * horizontal;
64
+ const drop = p * Math.cosh(local / p) - edge;
65
+ const chordY = a[1] + (b[1] - a[1]) * t;
66
+ points.push([x, chordY + drop, z]);
67
+ }
68
+ return points;
69
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Block-first city fabric for the `city` studio: turns the synthesized street network into a
3
+ * planar graph, extracts its faces as CLOSED BLOCK POLYGONS (a curved street yields a curved
4
+ * block edge, a diagonal one a diagonal edge), insets each block by its bordering roads'
5
+ * half-widths into curb and land rings (the sidewalk band lives between them), classifies every
6
+ * block (buildable, park, plaza, field, buffer sliver), subdivides buildable block frontage into
7
+ * POLYGONAL PARCELS with street references and corner status, and computes per-parcel BUILDABLE
8
+ * polygons after setbacks. Buildings then derive from parcel geometry instead of nearest-road
9
+ * guesses. Pure seeded math over `cityGeometry` primitives — no rendering, bounded work.
10
+ *
11
+ * @capability city-district road-derived block polygons, parcel subdivision, buildable footprints
12
+ */
13
+ import { type Vec2 } from "./cityGeometry.js";
14
+ /** How a block (a face of the road graph) is used. */
15
+ export type CityBlockKind = "buildable" | "park" | "plaza" | "field" | "buffer";
16
+ /** One closed block: a face of the road network, inset to its curb and land boundaries. */
17
+ export interface CityBlockLocal {
18
+ id: string;
19
+ /** Face polygon on road CENTERLINES (CCW) — the raw graph face. */
20
+ face: Vec2[];
21
+ /** Street index bordering each face edge (edge i = face[i]→face[i+1]); -1 = district boundary. */
22
+ faceStreets: number[];
23
+ /** Pavement edge: face inset by each bordering road's half width (+ curb margin). */
24
+ curb: Vec2[];
25
+ /** Land edge: curb inset further by the sidewalk band where the bordering street has one. */
26
+ polygon: Vec2[];
27
+ kind: CityBlockKind;
28
+ area: number;
29
+ }
30
+ /** One street-frontage reference of a parcel. */
31
+ export interface CityParcelFrontage {
32
+ /** Index into the resolved city's street list. */
33
+ street: number;
34
+ /** Frontage chord endpoints on the parcel boundary. */
35
+ edgeStart: Vec2;
36
+ edgeEnd: Vec2;
37
+ /** Unit tangent along the frontage chord. */
38
+ tangent: Vec2;
39
+ }
40
+ /** How a parcel is used after occupancy/fitting rolls. */
41
+ export type CityParcelKind = "built" | "vacant" | "yard";
42
+ /** One polygonal parcel subdivided out of a block's street frontage. */
43
+ export interface CityParcelLocal {
44
+ id: string;
45
+ block: number;
46
+ polygon: Vec2[];
47
+ /** Buildable polygon after front/side/rear setbacks; [] when setbacks consume the parcel. */
48
+ buildable: Vec2[];
49
+ frontage: CityParcelFrontage[];
50
+ area: number;
51
+ /** Usable depth from the frontage chord to the parcel rear. */
52
+ depth: number;
53
+ isCorner: boolean;
54
+ kind: CityParcelKind;
55
+ }
56
+ /** Minimal street shape the fabric needs (matches cityKind's LocalStreet). */
57
+ export interface FabricStreet {
58
+ points: readonly (readonly [number, number])[];
59
+ width: number;
60
+ level: "boulevard" | "avenue" | "street" | "lane";
61
+ sidewalk: boolean;
62
+ }
63
+ /** Sidewalk band width by street hierarchy (base = the district's street-level width). */
64
+ export declare function sidewalkWidthFor(level: FabricStreet["level"], base: number): number;
65
+ /** One extracted face: closed centerline polygon + the street index along each polygon edge. */
66
+ export interface GraphFace {
67
+ polygon: Vec2[];
68
+ streets: number[];
69
+ }
70
+ /** Everything block extraction needs from the district rules. */
71
+ export interface FabricParams {
72
+ streetWidthBase: number;
73
+ /** Base sidewalk band width in meters at "street" hierarchy level. */
74
+ sidewalkBase: number;
75
+ /** Curb strip between pavement edge and sidewalk, meters. */
76
+ curbMargin: number;
77
+ }
78
+ /** A block's derived rings plus the sidewalk band (outer = curb line, inner = land line). */
79
+ export interface BlockRings {
80
+ face: Vec2[];
81
+ faceStreets: number[];
82
+ curb: Vec2[];
83
+ land: Vec2[];
84
+ }
85
+ /**
86
+ * Extract closed blocks from the street network: planar faces of the graph, each inset to its
87
+ * curb ring (pavement edge) and land ring (behind the sidewalk band). Faces that collapse under
88
+ * the inset come back with an empty `land` and are the caller's slivers/buffers.
89
+ */
90
+ export declare function extractBlocks(streets: readonly FabricStreet[], hx: number, hz: number, params: FabricParams): {
91
+ blocks: BlockRings[];
92
+ deadEnds: {
93
+ pts: Vec2[];
94
+ width: number;
95
+ }[];
96
+ };
97
+ /** Arc-length station lookup along a closed ring. */
98
+ export declare class RingWalker {
99
+ readonly ring: readonly Vec2[];
100
+ readonly cum: number[];
101
+ readonly total: number;
102
+ constructor(ring: readonly Vec2[]);
103
+ /** Point, unit tangent, and inward normal (CCW ring: interior on the left) at arc length `s`. */
104
+ at(s: number): {
105
+ p: Vec2;
106
+ tangent: Vec2;
107
+ normal: Vec2;
108
+ edge: number;
109
+ };
110
+ /** Ring vertex indices whose arc position lies strictly inside (s0, s1) (wrapping). */
111
+ verticesBetween(s0: number, s1: number): number[];
112
+ /** Interior angle (radians) at ring vertex i — π on straight runs, < π at convex corners. */
113
+ interiorAngle(i: number): number;
114
+ }
115
+ /** Inputs for one parcel strip cut from a block ring. */
116
+ export interface ParcelCut {
117
+ /** Arc-length start/end stations along the block's land ring. */
118
+ s0: number;
119
+ s1: number;
120
+ /** Strip depth from the frontage inward. */
121
+ depth: number;
122
+ }
123
+ /**
124
+ * Cut one polygonal parcel out of a block land ring: the frontage arc between two stations,
125
+ * extruded inward along the station normals, clipped back to the block. Returns null when the
126
+ * strip collapses (over-tight corner, sliver arc).
127
+ */
128
+ export declare function cutParcel(walker: RingWalker, blockRing: readonly Vec2[], cut: ParcelCut): Vec2[] | null;
129
+ /**
130
+ * Conform a polygon to a containing ring: sample every edge (a straight edge can bulge across a
131
+ * concave notch even when its endpoints hug the boundary), then pull each escaping point to its
132
+ * nearest boundary point. Callers re-run this after any operation that adds mid-edge vertices.
133
+ */
134
+ export declare function conformPolygonToRing(poly: readonly Vec2[], ring: readonly Vec2[]): Vec2[];
135
+ /**
136
+ * Buildable polygon for a parcel: the parcel clipped by the front setback (a half-plane pushed in
137
+ * from the frontage chord), side gaps along both cut lines, and a rear margin. Works on any
138
+ * parcel polygon — no vertex correspondence needed.
139
+ */
140
+ export declare function buildablePolygon(parcel: readonly Vec2[], frontA: Vec2, frontB: Vec2, frontSetback: number, sideGap: number, rearMargin: number, depth: number): Vec2[];
141
+ /**
142
+ * Carve dead-end road corridors (cul-de-sac lanes pruned from the face graph) out of a polygon:
143
+ * for every corridor segment crossing it, keep the polygon piece on the side where `keep` lies.
144
+ */
145
+ export declare function carveCorridors(poly: Vec2[], keep: Vec2, corridors: readonly {
146
+ pts: readonly Vec2[];
147
+ width: number;
148
+ }[], margin: number): Vec2[];
149
+ /** Deterministic sliver verdict shared by classification and tests. */
150
+ export declare function isSliverBlock(land: readonly Vec2[], minArea: number, minWidth: number): boolean;
151
+ /** Sample deterministic points inside a polygon by seeded rejection over its bounds. */
152
+ export declare function pointsInPolygon(ring: readonly Vec2[], count: number, rng: () => number, margin?: number): Vec2[];