@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
@@ -1,8 +1,61 @@
1
+ function bandInfluence(dist, radius, feather) {
2
+ if (dist >= radius)
3
+ return 0;
4
+ const inner = radius - Math.max(0, feather);
5
+ return dist <= inner || feather <= 0 ? 1 : (radius - dist) / feather;
6
+ }
7
+ /** Perpendicular distance from a point to a polyline segment [a,b] on the XZ plane. */
8
+ function distanceToSegment(px, pz, a, b) {
9
+ const dx = b[0] - a[0];
10
+ const dz = b[1] - a[1];
11
+ const lenSq = dx * dx + dz * dz || 1;
12
+ let t = ((px - a[0]) * dx + (pz - a[1]) * dz) / lenSq;
13
+ t = t < 0 ? 0 : t > 1 ? 1 : t;
14
+ return Math.hypot(px - (a[0] + dx * t), pz - (a[1] + dz * t));
15
+ }
16
+ /**
17
+ * How strongly a point falls inside a clearance zone: 1 at/inside the solid core, ramping to 0 at
18
+ * the zone's outer `radius` across its `feather` band, 0 outside. The max over all zones.
19
+ * @internal — the falloff math behind scatter avoid and terrain flatten.
20
+ */
21
+ export function zoneInfluence(x, z, zones) {
22
+ let best = 0;
23
+ for (const zone of zones) {
24
+ const t = bandInfluence(Math.hypot(x - zone.x, z - zone.z), zone.radius, zone.feather ?? 0);
25
+ if (t > best)
26
+ best = t;
27
+ }
28
+ return best;
29
+ }
30
+ /** Clearance influence of a corridor: nearest-segment distance vs `halfWidth`, feathered. @internal */
31
+ export function corridorInfluence(x, z, corridor) {
32
+ const { points, halfWidth } = corridor;
33
+ const feather = corridor.feather ?? 0;
34
+ let best = 0;
35
+ for (let i = 1; i < points.length; i += 1) {
36
+ const t = bandInfluence(distanceToSegment(x, z, points[i - 1], points[i]), halfWidth, feather);
37
+ if (t > best)
38
+ best = t;
39
+ }
40
+ return best;
41
+ }
42
+ /** Combined clearance influence of discs + corridors — the max over every mask. @internal */
43
+ export function masksInfluence(x, z, masks) {
44
+ let best = zoneInfluence(x, z, masks.discs);
45
+ for (const corridor of masks.corridors) {
46
+ const t = corridorInfluence(x, z, corridor);
47
+ if (t > best)
48
+ best = t;
49
+ }
50
+ return best;
51
+ }
52
+ /** @internal */
1
53
  export function snapToGrid(point, size) {
2
54
  if (!(size > 0))
3
55
  return point;
4
56
  return [Math.round(point[0] / size) * size, Math.round(point[1] / size) * size];
5
57
  }
58
+ /** @internal */
6
59
  export function footprintAabb(center, footprint, quarterTurns = 0) {
7
60
  const turned = ((quarterTurns % 2) + 2) % 2 === 1;
8
61
  const halfW = (turned ? footprint.d : footprint.w) / 2;
@@ -14,6 +67,7 @@ export function footprintAabb(center, footprint, quarterTurns = 0) {
14
67
  maxZ: center[1] + halfD,
15
68
  };
16
69
  }
70
+ /** @internal */
17
71
  export function expandAabb(aabb, margin) {
18
72
  return {
19
73
  minX: aabb.minX - margin,
@@ -22,18 +76,22 @@ export function expandAabb(aabb, margin) {
22
76
  maxZ: aabb.maxZ + margin,
23
77
  };
24
78
  }
79
+ /** @internal */
25
80
  export function aabbOverlap(a, b) {
26
81
  return a.minX < b.maxX && a.maxX > b.minX && a.minZ < b.maxZ && a.maxZ > b.minZ;
27
82
  }
83
+ /** @internal */
28
84
  export function aabbContains(outer, inner) {
29
85
  return (inner.minX >= outer.minX &&
30
86
  inner.maxX <= outer.maxX &&
31
87
  inner.minZ >= outer.minZ &&
32
88
  inner.maxZ <= outer.maxZ);
33
89
  }
90
+ /** @internal */
34
91
  export function pointInAabb(point, aabb) {
35
92
  return point[0] >= aabb.minX && point[0] <= aabb.maxX && point[1] >= aabb.minZ && point[1] <= aabb.maxZ;
36
93
  }
94
+ /** @internal */
37
95
  export function clampToAabb(point, aabb) {
38
96
  return [
39
97
  Math.min(Math.max(point[0], aabb.minX), aabb.maxX),
@@ -62,6 +120,7 @@ function resolveAxis(main, cross, delta, blockers, axisX) {
62
120
  }
63
121
  return next;
64
122
  }
123
+ /** @internal */
65
124
  export function resolveMove(from, delta, blockers, options = {}) {
66
125
  const radius = options.radius ?? 0;
67
126
  const expanded = radius === 0 ? blockers : blockers.map((blocker) => expandAabb(blocker, radius));
@@ -73,3 +132,38 @@ export function resolveMove(from, delta, blockers, options = {}) {
73
132
  z = Math.min(Math.max(z, options.bounds.minZ + radius), options.bounds.maxZ - radius);
74
133
  return [x, z];
75
134
  }
135
+ function normalizedRadius2(point, ellipse) {
136
+ const nx = ellipse.radiusX > 0 ? (point[0] - ellipse.center[0]) / ellipse.radiusX : 0;
137
+ const ny = ellipse.radiusY > 0 ? (point[1] - ellipse.center[1]) / ellipse.radiusY : 0;
138
+ return nx * nx + ny * ny;
139
+ }
140
+ /** True when `point` sits inside (or on) the ellipse — the oval-arena containment test.
141
+ * @internal
142
+ */
143
+ export function pointInEllipse(point, ellipse) {
144
+ return normalizedRadius2(point, ellipse) <= 1;
145
+ }
146
+ /** Clamp `point` to the ellipse boundary when it strays outside, else return it unchanged.
147
+ * @internal
148
+ */
149
+ export function clampToEllipse(point, ellipse) {
150
+ const r2 = normalizedRadius2(point, ellipse);
151
+ if (r2 <= 1)
152
+ return point;
153
+ const scale = 1 / Math.sqrt(r2);
154
+ return [
155
+ ellipse.center[0] + (point[0] - ellipse.center[0]) * scale,
156
+ ellipse.center[1] + (point[1] - ellipse.center[1]) * scale,
157
+ ];
158
+ }
159
+ /** Outward unit normal of the ellipse at the point nearest `point` — the boundary bounce direction.
160
+ * @internal
161
+ */
162
+ export function ellipseNormal(point, ellipse) {
163
+ const nx = ellipse.radiusX > 0 ? (point[0] - ellipse.center[0]) / (ellipse.radiusX * ellipse.radiusX) : 0;
164
+ const ny = ellipse.radiusY > 0 ? (point[1] - ellipse.center[1]) / (ellipse.radiusY * ellipse.radiusY) : 0;
165
+ const len = Math.hypot(nx, ny);
166
+ if (len < 1e-6)
167
+ return [1, 0];
168
+ return [nx / len, ny / len];
169
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `grass_field` studio: a GPU grass patch authored as a box volume — its XZ footprint is the grass
3
+ * area, its top the ground height. Pure config here (blade/wind/color params + a footprint resolver);
4
+ * the instanced vertex-wind grass mesh lives in the `shell` renderer, which drives the existing
5
+ * `GrassField`. An engine environment kind (like water/scatter) so grass wind and colours are
6
+ * slider-authorable in the editor and persisted in `editor.scene.json` — the #813 grass studio.
7
+ *
8
+ * @capability grass-field editor-authorable GPU grass patch
9
+ */
10
+ import { type ParamSchema, type SceneKindObject } from "../scene/sceneKinds.js";
11
+ /** The editor volume kind marking a box as a GPU grass patch. */
12
+ export declare const GRASS_FIELD_KIND = "grass_field";
13
+ /** Fully-defaulted grass params parsed from a volume's `meta`. */
14
+ export interface GrassRules {
15
+ /** Blades per square meter (the shell caps by an instance budget). */
16
+ density: number;
17
+ /** Blade height in meters. */
18
+ bladeHeight: number;
19
+ /** Base (root) color, hex. */
20
+ colorBase: string;
21
+ /** Tip color, hex. */
22
+ colorTip: string;
23
+ /** Per-blade color jitter, 0..1. */
24
+ colorVariation: number;
25
+ /** Vertex-wind sway strength, 0..1. */
26
+ windStrength: number;
27
+ /** Wind animation speed. */
28
+ windSpeed: number;
29
+ /** Gust patch scale (spatial frequency of gusts). */
30
+ windGust: number;
31
+ /** Blade material roughness, 0..1. */
32
+ roughness: number;
33
+ /** Seed string; same seed reproduces the same blade layout. */
34
+ seed: string;
35
+ }
36
+ /** Grass defaults: a lush, lightly-swaying meadow. */
37
+ export declare const GRASS_DEFAULTS: GrassRules;
38
+ /** The grass parameter schema — drives the inspector and `meta` parse via the studio seam. */
39
+ export declare const GRASS_SCHEMA: ParamSchema;
40
+ /** Parse a volume's `meta` into fully-defaulted grass rules. @internal */
41
+ export declare function readGrassRules(meta: Record<string, unknown> | undefined): GrassRules;
42
+ /** A resolved grass patch: world-space area center at ground height, footprint size (XZ), and rules. */
43
+ export interface ResolvedGrass {
44
+ center: readonly [number, number, number];
45
+ size: readonly [number, number];
46
+ rules: GrassRules;
47
+ }
48
+ /** Resolve a grass volume into an area footprint (from box half-extents / radius) at the box base. @internal */
49
+ export declare function resolveGrassObject(object: SceneKindObject): ResolvedGrass | null;
50
+ /** Registers the `grass_field` scene kind (schema + resolver). Called by {@link registerBuiltinSceneKinds}. @internal */
51
+ export declare function registerGrassKind(): void;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * `grass_field` studio: a GPU grass patch authored as a box volume — its XZ footprint is the grass
3
+ * area, its top the ground height. Pure config here (blade/wind/color params + a footprint resolver);
4
+ * the instanced vertex-wind grass mesh lives in the `shell` renderer, which drives the existing
5
+ * `GrassField`. An engine environment kind (like water/scatter) so grass wind and colours are
6
+ * slider-authorable in the editor and persisted in `editor.scene.json` — the #813 grass studio.
7
+ *
8
+ * @capability grass-field editor-authorable GPU grass patch
9
+ */
10
+ import { registerSceneKind } from "../scene/sceneKinds.js";
11
+ /** The editor volume kind marking a box as a GPU grass patch. */
12
+ export const GRASS_FIELD_KIND = "grass_field";
13
+ /** Grass defaults: a lush, lightly-swaying meadow. */
14
+ export const GRASS_DEFAULTS = {
15
+ density: 12,
16
+ bladeHeight: 0.6,
17
+ colorBase: "#3f6f37",
18
+ colorTip: "#9ac25a",
19
+ colorVariation: 0.35,
20
+ windStrength: 0.22,
21
+ windSpeed: 1.6,
22
+ windGust: 0.16,
23
+ roughness: 0.85,
24
+ seed: "",
25
+ };
26
+ /** The grass parameter schema — drives the inspector and `meta` parse via the studio seam. */
27
+ export const GRASS_SCHEMA = {
28
+ fields: [
29
+ { type: "range", key: "density", label: "density", min: 0.5, max: 160, step: 0.5, default: GRASS_DEFAULTS.density, unit: "/m²" },
30
+ { type: "range", key: "bladeHeight", label: "blade height", min: 0.1, max: 2, step: 0.05, default: GRASS_DEFAULTS.bladeHeight, unit: "m" },
31
+ { type: "color", key: "colorBase", label: "base color", default: GRASS_DEFAULTS.colorBase },
32
+ { type: "color", key: "colorTip", label: "tip color", default: GRASS_DEFAULTS.colorTip },
33
+ { type: "range", key: "colorVariation", label: "color variation", min: 0, max: 1, step: 0.02, default: GRASS_DEFAULTS.colorVariation },
34
+ { type: "range", key: "windStrength", label: "wind strength", min: 0, max: 1, step: 0.01, default: GRASS_DEFAULTS.windStrength },
35
+ { type: "range", key: "windSpeed", label: "wind speed", min: 0, max: 4, step: 0.05, default: GRASS_DEFAULTS.windSpeed },
36
+ { type: "range", key: "windGust", label: "gust scale", min: 0, max: 1, step: 0.02, default: GRASS_DEFAULTS.windGust },
37
+ { type: "range", key: "roughness", label: "roughness", min: 0, max: 1, step: 0.02, default: GRASS_DEFAULTS.roughness },
38
+ { type: "seed", key: "seed", label: "seed", default: "" },
39
+ ],
40
+ };
41
+ function metaNumber(meta, key, fallback) {
42
+ const value = meta?.[key];
43
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
44
+ }
45
+ function metaString(meta, key, fallback) {
46
+ const value = meta?.[key];
47
+ return typeof value === "string" ? value : fallback;
48
+ }
49
+ /** Parse a volume's `meta` into fully-defaulted grass rules. @internal */
50
+ export function readGrassRules(meta) {
51
+ return {
52
+ density: Math.max(0, metaNumber(meta, "density", GRASS_DEFAULTS.density)),
53
+ bladeHeight: Math.max(0.05, metaNumber(meta, "bladeHeight", GRASS_DEFAULTS.bladeHeight)),
54
+ colorBase: metaString(meta, "colorBase", GRASS_DEFAULTS.colorBase),
55
+ colorTip: metaString(meta, "colorTip", GRASS_DEFAULTS.colorTip),
56
+ colorVariation: metaNumber(meta, "colorVariation", GRASS_DEFAULTS.colorVariation),
57
+ windStrength: metaNumber(meta, "windStrength", GRASS_DEFAULTS.windStrength),
58
+ windSpeed: metaNumber(meta, "windSpeed", GRASS_DEFAULTS.windSpeed),
59
+ windGust: metaNumber(meta, "windGust", GRASS_DEFAULTS.windGust),
60
+ roughness: metaNumber(meta, "roughness", GRASS_DEFAULTS.roughness),
61
+ seed: metaString(meta, "seed", GRASS_DEFAULTS.seed),
62
+ };
63
+ }
64
+ function axis(value) {
65
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
66
+ }
67
+ /** Resolve a grass volume into an area footprint (from box half-extents / radius) at the box base. @internal */
68
+ export function resolveGrassObject(object) {
69
+ const center = object.center ?? object.position;
70
+ if (center === undefined)
71
+ return null;
72
+ const he = object.halfExtents;
73
+ const radius = object.radius;
74
+ const halfX = axis(he?.x) ?? radius ?? 10;
75
+ const halfZ = axis(he?.z) ?? radius ?? 10;
76
+ const halfY = axis(he?.y) ?? 0;
77
+ return {
78
+ center: [center.x, center.y - halfY, center.z],
79
+ size: [Math.max(0.5, halfX * 2), Math.max(0.5, halfZ * 2)],
80
+ rules: readGrassRules(object.meta),
81
+ };
82
+ }
83
+ /** Registers the `grass_field` scene kind (schema + resolver). Called by {@link registerBuiltinSceneKinds}. @internal */
84
+ export function registerGrassKind() {
85
+ registerSceneKind({
86
+ kind: GRASS_FIELD_KIND,
87
+ target: "volume",
88
+ label: "Grass field",
89
+ addCategory: "Studios",
90
+ accent: "#7fbf4d",
91
+ schema: GRASS_SCHEMA,
92
+ resolve: (object) => resolveGrassObject(object),
93
+ note: (object) => {
94
+ const resolved = resolveGrassObject(object);
95
+ if (resolved === null)
96
+ return "Give the volume a box footprint.";
97
+ const area = resolved.size[0] * resolved.size[1];
98
+ return `${Math.round(resolved.size[0])}×${Math.round(resolved.size[1])} m · ≈${Math.round(area * resolved.rules.density).toLocaleString()} blades`;
99
+ },
100
+ });
101
+ }
@@ -1,19 +1,32 @@
1
1
  export type MarkerPosition = readonly [number, number, number];
2
- export interface MapMarker<TMeta = unknown> {
2
+ /**
3
+ * Small, display-only marker shape consumed by map renderers. Existing games
4
+ * can project their own entities to this view without adopting marker
5
+ * lifecycle storage or duplicating them into a {@link MarkerSet}.
6
+ */
7
+ export interface MarkerView<TMeta = unknown> {
3
8
  id: string;
4
- kind: string;
5
9
  position: MarkerPosition;
10
+ kind?: string;
6
11
  label?: string;
12
+ /** Optional world heading in radians for presentations that draw directional markers. */
13
+ heading?: number;
14
+ meta?: TMeta;
15
+ }
16
+ /** A marker owned by {@link MarkerSet}, including its lifecycle and query fields. */
17
+ export interface MapMarker<TMeta = unknown> extends MarkerView<TMeta> {
18
+ kind: string;
7
19
  owner?: string;
8
20
  createdAt: number;
9
21
  expiresAt?: number;
10
- meta?: TMeta;
11
22
  }
12
23
  export interface MarkerInput<TMeta = unknown> {
13
24
  id?: string;
14
25
  kind: string;
15
26
  position: MarkerPosition;
16
27
  label?: string;
28
+ /** Optional world heading in radians for directional map presentations. */
29
+ heading?: number;
17
30
  owner?: string;
18
31
  createdAt?: number;
19
32
  expiresAt?: number;
@@ -37,7 +50,7 @@ export interface MarkerKindStyle {
37
50
  priority: number;
38
51
  }
39
52
  export declare const DEFAULT_MARKER_KINDS: Record<string, MarkerKindStyle>;
40
- export declare function markerKindStyle(kind: string, styles?: Record<string, MarkerKindStyle>): MarkerKindStyle;
53
+ export declare function markerKindStyle(kind: string | undefined, styles?: Record<string, MarkerKindStyle>): MarkerKindStyle;
41
54
  export interface MarkerSet<TMeta = unknown> {
42
55
  add(marker: MarkerInput<TMeta>): string;
43
56
  remove(id: string): boolean;
@@ -49,4 +62,37 @@ export interface MarkerSet<TMeta = unknown> {
49
62
  subscribe(listener: () => void): () => void;
50
63
  snapshot(): readonly MapMarker<TMeta>[];
51
64
  }
65
+ /**
66
+ * Observable marker snapshots owned by an external project. `getSnapshot`
67
+ * must return the same array identity until the source changes and calls its
68
+ * subscribers, matching React's external-store contract.
69
+ */
70
+ export interface MarkerSource<TMarker extends MarkerView = MarkerView> {
71
+ subscribe(listener: () => void): () => void;
72
+ getSnapshot(): readonly TMarker[];
73
+ /** Optional hydration snapshot; omit when the client snapshot is also valid during SSR. */
74
+ getServerSnapshot?: () => readonly TMarker[];
75
+ }
76
+ /** Marker data accepted by portable consumers: static views, an external source, or a native set. */
77
+ export type MarkerCollection<TMarker extends MarkerView = MarkerView> = readonly TMarker[] | MarkerSource<TMarker> | MarkerSet;
78
+ /** Configuration for projecting a caller-owned collection into display-only markers. */
79
+ export interface MarkerSourceOptions<TEntity, TMarker extends MarkerView = MarkerView> {
80
+ /** Subscribe to changes in the caller-owned collection. Static collections may omit this. */
81
+ subscribe?: (listener: () => void) => () => void;
82
+ /** Read the current caller-owned collection. Keep its identity stable between changes. */
83
+ getSnapshot: () => readonly TEntity[];
84
+ /** Optional server collection used to keep hydration output deterministic. */
85
+ getServerSnapshot?: () => readonly TEntity[];
86
+ /** Project one caller-owned record into the minimal marker view. */
87
+ project: (value: TEntity, index: number) => TMarker;
88
+ }
89
+ /**
90
+ * Adapt a caller-owned array/store to an observable marker source. Projection
91
+ * is cached between source changes, so React reads do not copy the collection
92
+ * per frame. The caller retains ownership of entities, updates, persistence,
93
+ * and subscription scheduling.
94
+ *
95
+ * @capability portable-marker-source project caller-owned arrays or subscribable stores into cached minimap marker snapshots without a MarkerSet
96
+ */
97
+ export declare function createMarkerSource<TEntity, TMarker extends MarkerView = MarkerView>(options: MarkerSourceOptions<TEntity, TMarker>): MarkerSource<TMarker>;
52
98
  export declare function createMarkerSet<TMeta = unknown>(now?: () => number): MarkerSet<TMeta>;
@@ -10,8 +10,55 @@ export const DEFAULT_MARKER_KINDS = {
10
10
  ping: { id: "ping", color: "#22d3ee", glyph: "◎", priority: 65 },
11
11
  };
12
12
  export function markerKindStyle(kind, styles = DEFAULT_MARKER_KINDS) {
13
+ if (kind === undefined)
14
+ return { id: "marker", color: "#e2e8f0", glyph: "\u2022", priority: 30 };
13
15
  return styles[kind] ?? { id: kind, color: "#e2e8f0", glyph: "•", priority: 30 };
14
16
  }
17
+ function projectedSnapshot(readSource, project) {
18
+ let dirty = true;
19
+ let source;
20
+ let snapshot = [];
21
+ return {
22
+ invalidate() {
23
+ dirty = true;
24
+ },
25
+ read() {
26
+ const next = readSource();
27
+ if (dirty || next !== source) {
28
+ source = next;
29
+ snapshot = next.map(project);
30
+ dirty = false;
31
+ }
32
+ return snapshot;
33
+ },
34
+ };
35
+ }
36
+ /**
37
+ * Adapt a caller-owned array/store to an observable marker source. Projection
38
+ * is cached between source changes, so React reads do not copy the collection
39
+ * per frame. The caller retains ownership of entities, updates, persistence,
40
+ * and subscription scheduling.
41
+ *
42
+ * @capability portable-marker-source project caller-owned arrays or subscribable stores into cached minimap marker snapshots without a MarkerSet
43
+ */
44
+ export function createMarkerSource(options) {
45
+ const client = projectedSnapshot(options.getSnapshot, options.project);
46
+ const server = options.getServerSnapshot === undefined
47
+ ? client
48
+ : projectedSnapshot(options.getServerSnapshot, options.project);
49
+ return {
50
+ subscribe(listener) {
51
+ if (options.subscribe === undefined)
52
+ return () => undefined;
53
+ return options.subscribe(() => {
54
+ client.invalidate();
55
+ listener();
56
+ });
57
+ },
58
+ getSnapshot: client.read,
59
+ getServerSnapshot: server.read,
60
+ };
61
+ }
15
62
  function distanceXZ(a, b) {
16
63
  return Math.hypot(a[0] - b[0], a[2] - b[2]);
17
64
  }
@@ -38,6 +85,8 @@ export function createMarkerSet(now = Date.now) {
38
85
  };
39
86
  if (input.label !== undefined)
40
87
  marker.label = input.label;
88
+ if (input.heading !== undefined)
89
+ marker.heading = input.heading;
41
90
  if (input.owner !== undefined)
42
91
  marker.owner = input.owner;
43
92
  if (input.expiresAt !== undefined)
@@ -1,3 +1,4 @@
1
+ import { clamp } from "../math/scalar.js";
1
2
  export const MASSING_COMPOSITIONS = [
2
3
  "bar",
3
4
  "split",
@@ -17,7 +18,6 @@ export const MASSING_PROFILES = [
17
18
  "offset",
18
19
  "twisted",
19
20
  ];
20
- const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
21
21
  export const hashMassingSeed = (text) => [...text].reduce((sum, ch) => sum + ch.charCodeAt(0), 0);
22
22
  export const massingBase = (spec, cap = 0.28) => Math.min(Math.max(0, spec.pilotis), Math.max(0, spec.height) * cap);
23
23
  export const isVillageMassing = (spec) => spec.composition === "cluster" && spec.height < 36 && spec.articulation > 56 && spec.moduleDensity > 2;
@@ -0,0 +1,78 @@
1
+ import type { Vec2 } from "./geometry.js";
2
+ /**
3
+ * Deterministic minimap terrain bake (#1036): rasterize an authored world's terrain (plus optional
4
+ * biome zones and water) into a top-down RGBA image and a matching world-bounds rectangle, then
5
+ * encode it as a PNG data URI. The editor runs this as a bake action and stores the result on the
6
+ * scene document; runtime feeds it straight into the existing `Minimap` / `WorldMap` `background` +
7
+ * `mapBounds` props — no new runtime render path, and the same authored world always bakes the same
8
+ * image (safe for verify/CI). Pure: no canvas, no DOM, `core` still imports nothing external.
9
+ */
10
+ /** World-space rectangle the bake spans (matches the react `MapBounds` shape structurally). */
11
+ export interface MinimapBakeBounds {
12
+ minX: number;
13
+ minZ: number;
14
+ maxX: number;
15
+ maxZ: number;
16
+ }
17
+ /** One biome/region tint painted over the terrain shade where the ground falls inside its polygon. */
18
+ export interface MinimapBakeZone {
19
+ /** Closed XZ polygon in world space. */
20
+ polygon: readonly Vec2[];
21
+ /** `#rgb` / `#rrggbb` tint. */
22
+ color: string;
23
+ /** Blend strength 0..1. Default 0.5. */
24
+ alpha?: number;
25
+ }
26
+ /** The authored world a bake reads — a height sampler, its bounds, and optional zones/water. */
27
+ export interface MinimapBakeSource {
28
+ bounds: MinimapBakeBounds;
29
+ sampleHeight(x: number, z: number): number;
30
+ /** Optional surface normal for slope shading; flat shading when omitted. */
31
+ sampleNormal?(x: number, z: number): readonly [number, number, number];
32
+ zones?: readonly MinimapBakeZone[];
33
+ /** Ground at or below this height renders as water. */
34
+ waterLevel?: number;
35
+ }
36
+ /** The height→color ramp and water color used by the bake. */
37
+ export interface MinimapBakePalette {
38
+ low: string;
39
+ high: string;
40
+ water: string;
41
+ }
42
+ /** The built-in height→color ramp and water color a bake uses when no palette override is given. */
43
+ export declare const DEFAULT_MINIMAP_PALETTE: MinimapBakePalette;
44
+ /** Options for {@link bakeMinimapImage}. */
45
+ export interface MinimapBakeOptions {
46
+ /** Pixel resolution of the longer axis; the shorter axis keeps world aspect. Default 128. */
47
+ resolution?: number;
48
+ palette?: Partial<MinimapBakePalette>;
49
+ }
50
+ /** A baked minimap image: RGBA pixels plus the world bounds they span. */
51
+ export interface MinimapBake {
52
+ width: number;
53
+ height: number;
54
+ /** Row-major RGBA, length `width * height * 4`. */
55
+ pixels: Uint8ClampedArray;
56
+ bounds: MinimapBakeBounds;
57
+ }
58
+ /**
59
+ * Rasterizes a top-down terrain image: height maps onto a low→high color ramp (normalized over the
60
+ * sampled height range), slope darkens the shade, water fills below `waterLevel`, and each zone
61
+ * polygon tints the ground it covers. Deterministic for a fixed source. The bounds are preserved so
62
+ * a player-centered minimap pans the image correctly.
63
+ * @capability minimap-bake rasterize authored terrain + zones into a top-down minimap image
64
+ */
65
+ export declare function bakeMinimapImage(source: MinimapBakeSource, options?: MinimapBakeOptions): MinimapBake;
66
+ /** Encodes an RGBA bake to raw PNG bytes (pure; stored DEFLATE, valid for any decoder). */
67
+ export declare function encodeBakePng(bake: MinimapBake): Uint8Array;
68
+ /**
69
+ * Encodes a bake as a `data:image/png;base64,...` URI — the exact string the `Minimap` /
70
+ * `WorldMap` `background` prop takes. Deterministic for a fixed bake.
71
+ * @capability minimap-bake encode a baked minimap as a PNG data URI for the Minimap background
72
+ */
73
+ export declare function minimapBakeToPngDataUri(bake: MinimapBake): string;
74
+ /** One-call convenience: rasterize a source and return `{ background, mapBounds }` for a minimap. */
75
+ export declare function bakeMinimapBackground(source: MinimapBakeSource, options?: MinimapBakeOptions): {
76
+ background: string;
77
+ mapBounds: MinimapBakeBounds;
78
+ };