@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,128 @@
1
+ /** Sum of two 2D vectors.
2
+ * @internal
3
+ */
4
+ export function add(a, b) {
5
+ return [a[0] + b[0], a[1] + b[1]];
6
+ }
7
+ /** Difference `a - b` of two 2D vectors.
8
+ * @internal
9
+ */
10
+ export function sub(a, b) {
11
+ return [a[0] - b[0], a[1] - b[1]];
12
+ }
13
+ /** Scale a 2D vector by a scalar.
14
+ * @internal
15
+ */
16
+ export function scale(a, s) {
17
+ return [a[0] * s, a[1] * s];
18
+ }
19
+ /** Negate a 2D vector.
20
+ * @internal
21
+ */
22
+ export function negate(a) {
23
+ return [-a[0], -a[1]];
24
+ }
25
+ /** Dot product of two 2D vectors.
26
+ * @internal
27
+ */
28
+ export function dot(a, b) {
29
+ return a[0] * b[0] + a[1] * b[1];
30
+ }
31
+ /** 2D cross product (scalar z of the 3D cross), positive when `b` is counter-clockwise from `a`.
32
+ * @internal
33
+ */
34
+ export function cross(a, b) {
35
+ return a[0] * b[1] - a[1] * b[0];
36
+ }
37
+ /** Euclidean length of a 2D vector.
38
+ * @internal
39
+ */
40
+ export function length(a) {
41
+ return Math.hypot(a[0], a[1]);
42
+ }
43
+ /** Squared length of a 2D vector; cheaper than `length` when only comparing magnitudes.
44
+ * @internal
45
+ */
46
+ export function lengthSquared(a) {
47
+ return a[0] * a[0] + a[1] * a[1];
48
+ }
49
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
50
+ * @internal
51
+ */
52
+ export function normalize(a) {
53
+ const len = Math.hypot(a[0], a[1]);
54
+ return len < 1e-9 ? [0, 0] : [a[0] / len, a[1] / len];
55
+ }
56
+ /** Distance between two points.
57
+ * @internal
58
+ */
59
+ export function distance(a, b) {
60
+ return Math.hypot(a[0] - b[0], a[1] - b[1]);
61
+ }
62
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons.
63
+ * @internal
64
+ */
65
+ export function distanceSquared(a, b) {
66
+ const dx = a[0] - b[0];
67
+ const dy = a[1] - b[1];
68
+ return dx * dx + dy * dy;
69
+ }
70
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
71
+ * @internal
72
+ */
73
+ export function lerp(a, b, t) {
74
+ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];
75
+ }
76
+ /** Left-hand perpendicular of `a` (rotated 90° counter-clockwise).
77
+ * @internal
78
+ */
79
+ export function perp(a) {
80
+ return [-a[1], a[0]];
81
+ }
82
+ /** Rotate a 2D vector by `radians` about the origin.
83
+ * @internal
84
+ */
85
+ export function rotate(a, radians) {
86
+ const c = Math.cos(radians);
87
+ const s = Math.sin(radians);
88
+ return [a[0] * c - a[1] * s, a[0] * s + a[1] * c];
89
+ }
90
+ /**
91
+ * Reflect a velocity off a surface with unit `normal`, losing energy by `restitution` (0..1). At
92
+ * `restitution` 1 the normal component mirrors elastically (`v − 2(v·n)n`); at 0 it is removed so the
93
+ * vector slides along the surface. Only the normal component is scaled — tangential motion is kept — so
94
+ * this is the wall/paddle/boundary bounce every arcade ball game hand-rolls.
95
+ * @internal
96
+ */
97
+ export function reflect(v, normal, restitution = 1) {
98
+ const vn = v[0] * normal[0] + v[1] * normal[1];
99
+ const j = (1 + restitution) * vn;
100
+ return [v[0] - j * normal[0], v[1] - j * normal[1]];
101
+ }
102
+ /** Unit vector for a heading measured clockwise from +Y (the engine's XZ-plane convention).
103
+ * @internal
104
+ */
105
+ export function fromHeading(headingRad) {
106
+ return [Math.sin(headingRad), Math.cos(headingRad)];
107
+ }
108
+ /** Heading in radians of a vector, measured clockwise from +Y to match `fromHeading`.
109
+ * @internal
110
+ */
111
+ export function heading(a) {
112
+ return Math.atan2(a[0], a[1]);
113
+ }
114
+ /** Wrap an angle in radians into `[0, 2π)`.
115
+ * @internal
116
+ */
117
+ export function normalizeAngle(angleRad) {
118
+ const twoPi = Math.PI * 2;
119
+ const a = angleRad % twoPi;
120
+ return a < 0 ? a + twoPi : a;
121
+ }
122
+ /** Wrap an angle in degrees into `[0, 360)`.
123
+ * @internal
124
+ */
125
+ export function normalizeAngleDeg(angleDeg) {
126
+ const a = angleDeg % 360;
127
+ return a < 0 ? a + 360 : a;
128
+ }
@@ -0,0 +1,49 @@
1
+ import type { Vec3 } from "./geometry.js";
2
+ /** Sum of two 3D vectors.
3
+ * @internal
4
+ */
5
+ export declare function add(a: Vec3, b: Vec3): Vec3;
6
+ /** Difference `a - b` of two 3D vectors.
7
+ * @internal
8
+ */
9
+ export declare function sub(a: Vec3, b: Vec3): Vec3;
10
+ /** Scale a 3D vector by a scalar.
11
+ * @internal
12
+ */
13
+ export declare function scale(a: Vec3, s: number): Vec3;
14
+ /** Negate a 3D vector.
15
+ * @internal
16
+ */
17
+ export declare function negate(a: Vec3): Vec3;
18
+ /** Dot product of two 3D vectors.
19
+ * @internal
20
+ */
21
+ export declare function dot(a: Vec3, b: Vec3): number;
22
+ /** Cross product `a × b` of two 3D vectors.
23
+ * @internal
24
+ */
25
+ export declare function cross(a: Vec3, b: Vec3): Vec3;
26
+ /** Euclidean length of a 3D vector.
27
+ * @internal
28
+ */
29
+ export declare function length(a: Vec3): number;
30
+ /** Squared length of a 3D vector; cheaper than `length` when only comparing magnitudes.
31
+ * @internal
32
+ */
33
+ export declare function lengthSquared(a: Vec3): number;
34
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
35
+ * @internal
36
+ */
37
+ export declare function normalize(a: Vec3): Vec3;
38
+ /** Distance between two points.
39
+ * @internal
40
+ */
41
+ export declare function distance(a: Vec3, b: Vec3): number;
42
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons on hot paths.
43
+ * @internal
44
+ */
45
+ export declare function distanceSquared(a: Vec3, b: Vec3): number;
46
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
47
+ * @internal
48
+ */
49
+ export declare function lerp(a: Vec3, b: Vec3, t: number): Vec3;
@@ -0,0 +1,76 @@
1
+ /** Sum of two 3D vectors.
2
+ * @internal
3
+ */
4
+ export function add(a, b) {
5
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
6
+ }
7
+ /** Difference `a - b` of two 3D vectors.
8
+ * @internal
9
+ */
10
+ export function sub(a, b) {
11
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
12
+ }
13
+ /** Scale a 3D vector by a scalar.
14
+ * @internal
15
+ */
16
+ export function scale(a, s) {
17
+ return [a[0] * s, a[1] * s, a[2] * s];
18
+ }
19
+ /** Negate a 3D vector.
20
+ * @internal
21
+ */
22
+ export function negate(a) {
23
+ return [-a[0], -a[1], -a[2]];
24
+ }
25
+ /** Dot product of two 3D vectors.
26
+ * @internal
27
+ */
28
+ export function dot(a, b) {
29
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
30
+ }
31
+ /** Cross product `a × b` of two 3D vectors.
32
+ * @internal
33
+ */
34
+ export function cross(a, b) {
35
+ return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
36
+ }
37
+ /** Euclidean length of a 3D vector.
38
+ * @internal
39
+ */
40
+ export function length(a) {
41
+ return Math.hypot(a[0], a[1], a[2]);
42
+ }
43
+ /** Squared length of a 3D vector; cheaper than `length` when only comparing magnitudes.
44
+ * @internal
45
+ */
46
+ export function lengthSquared(a) {
47
+ return a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
48
+ }
49
+ /** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
50
+ * @internal
51
+ */
52
+ export function normalize(a) {
53
+ const len = Math.hypot(a[0], a[1], a[2]);
54
+ return len < 1e-9 ? [0, 0, 0] : [a[0] / len, a[1] / len, a[2] / len];
55
+ }
56
+ /** Distance between two points.
57
+ * @internal
58
+ */
59
+ export function distance(a, b) {
60
+ return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
61
+ }
62
+ /** Squared distance between two points; cheaper than `distance` for radius comparisons on hot paths.
63
+ * @internal
64
+ */
65
+ export function distanceSquared(a, b) {
66
+ const dx = a[0] - b[0];
67
+ const dy = a[1] - b[1];
68
+ const dz = a[2] - b[2];
69
+ return dx * dx + dy * dy + dz * dz;
70
+ }
71
+ /** Linearly interpolate between points `a` and `b` by fraction `t`.
72
+ * @internal
73
+ */
74
+ export function lerp(a, b, t) {
75
+ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
76
+ }
@@ -0,0 +1,71 @@
1
+ import type { Aabb } from "./geometry.js";
2
+ import type { GrassEnvironmentConfig } from "./features.js";
3
+ import type { SceneDocumentLike, SceneVolumeLike } from "./sceneShapes.js";
4
+ /** The editor volume kind that marks an area as vegetation fill. */
5
+ export declare const VEGETATION_VOLUME_KIND = "vegetation";
6
+ /**
7
+ * How a vegetation volume fills its area, read from the volume's `meta`.
8
+ * `density` is items per square meter — the one slider number: grass blades,
9
+ * trees, bushes, rocks all scale with it. Every field has a default, so a
10
+ * freshly placed `kind: "vegetation"` volume already grows grass.
11
+ */
12
+ export interface VegetationSettings {
13
+ /** `"grass"` for shell-rendered blades, otherwise an asset/catalog item id the game maps to a model. */
14
+ item: string;
15
+ /** Items per square meter (grass blades: ~4; trees: ~0.02; bushes: ~0.08). */
16
+ density: number;
17
+ /** Random uniform scale range applied per placement. */
18
+ minScale: number;
19
+ maxScale: number;
20
+ /** Minimum spacing between placements in meters; 0 allows clumping. */
21
+ minDistance: number;
22
+ /** Extra seed folded into the volume id so re-rolls are one string away. */
23
+ seed: string;
24
+ }
25
+ /** Defaults a bare `kind: "vegetation"` volume grows with: grass at 4 blades/m². */
26
+ export declare const VEGETATION_DEFAULTS: VegetationSettings;
27
+ /** True when an editor volume is a vegetation fill area.
28
+ * @internal
29
+ */
30
+ export declare function isVegetationVolume(volume: SceneVolumeLike): boolean;
31
+ /** The volume's vegetation settings with defaults filled in; null for non-vegetation volumes.
32
+ * @internal
33
+ */
34
+ export declare function readVegetationSettings(volume: SceneVolumeLike): VegetationSettings | null;
35
+ /** The ground-plane footprint of a volume: box half-extents or sphere/cylinder radius.
36
+ * @internal
37
+ */
38
+ export declare function vegetationFootprint(volume: SceneVolumeLike): Aabb;
39
+ /** One placed vegetation instance — position on the ground plane plus per-instance variation. */
40
+ export interface VegetationPlacement {
41
+ id: string;
42
+ volumeId: string;
43
+ item: string;
44
+ x: number;
45
+ z: number;
46
+ scale: number;
47
+ rotation: number;
48
+ }
49
+ /**
50
+ * Deterministic placements for one vegetation volume: scatter its footprint at
51
+ * `density` items/m² (respecting `minDistance`), clip round shapes to their
52
+ * radius, and derive per-instance scale/rotation from the volume id + seed, so
53
+ * the same saved scene always grows the same field.
54
+ * @internal
55
+ */
56
+ export declare function resolveVegetationVolume(volume: SceneVolumeLike): VegetationPlacement[];
57
+ /**
58
+ * All model-item placements in a document (every vegetation volume except
59
+ * `item: "grass"`, which the shell renders as blades — see
60
+ * `grassPatchesFromVegetation`). A game maps each placement's `item` to a
61
+ * mesh/entity via its render catalog and places it grounded.
62
+ * @internal
63
+ */
64
+ export declare function resolveVegetation(doc: SceneDocumentLike): VegetationPlacement[];
65
+ /**
66
+ * Grass-blade patches for every `item: "grass"` vegetation volume, ready to
67
+ * spread into `environment()`'s `grass` list — the volume's density number is
68
+ * the blades-per-m² the shell renders, so the editor slider drives it directly.
69
+ * @internal
70
+ */
71
+ export declare function grassPatchesFromVegetation(doc: SceneDocumentLike): GrassEnvironmentConfig[];
@@ -0,0 +1,151 @@
1
+ import { scatter } from "./scatter.js";
2
+ /** The editor volume kind that marks an area as vegetation fill. */
3
+ export const VEGETATION_VOLUME_KIND = "vegetation";
4
+ /** Defaults a bare `kind: "vegetation"` volume grows with: grass at 4 blades/m². */
5
+ export const VEGETATION_DEFAULTS = {
6
+ item: "grass",
7
+ density: 4,
8
+ minScale: 0.8,
9
+ maxScale: 1.2,
10
+ minDistance: 0,
11
+ seed: "",
12
+ };
13
+ function metaNumber(meta, key, fallback) {
14
+ const value = meta?.[key];
15
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
16
+ }
17
+ function metaString(meta, key, fallback) {
18
+ const value = meta?.[key];
19
+ return typeof value === "string" && value.length > 0 ? value : fallback;
20
+ }
21
+ /** True when an editor volume is a vegetation fill area.
22
+ * @internal
23
+ */
24
+ export function isVegetationVolume(volume) {
25
+ return volume.kind === VEGETATION_VOLUME_KIND;
26
+ }
27
+ /** The volume's vegetation settings with defaults filled in; null for non-vegetation volumes.
28
+ * @internal
29
+ */
30
+ export function readVegetationSettings(volume) {
31
+ if (!isVegetationVolume(volume))
32
+ return null;
33
+ return {
34
+ item: metaString(volume.meta, "item", VEGETATION_DEFAULTS.item),
35
+ density: Math.max(0, metaNumber(volume.meta, "density", VEGETATION_DEFAULTS.density)),
36
+ minScale: metaNumber(volume.meta, "minScale", VEGETATION_DEFAULTS.minScale),
37
+ maxScale: metaNumber(volume.meta, "maxScale", VEGETATION_DEFAULTS.maxScale),
38
+ minDistance: Math.max(0, metaNumber(volume.meta, "minDistance", VEGETATION_DEFAULTS.minDistance)),
39
+ seed: metaString(volume.meta, "seed", VEGETATION_DEFAULTS.seed),
40
+ };
41
+ }
42
+ /** The ground-plane footprint of a volume: box half-extents or sphere/cylinder radius.
43
+ * @internal
44
+ */
45
+ export function vegetationFootprint(volume) {
46
+ const halfW = volume.shape === "box" ? (volume.halfExtents?.x ?? 5) : (volume.radius ?? 5);
47
+ const halfD = volume.shape === "box" ? (volume.halfExtents?.z ?? 5) : (volume.radius ?? 5);
48
+ return {
49
+ minX: volume.center.x - halfW,
50
+ minZ: volume.center.z - halfD,
51
+ maxX: volume.center.x + halfW,
52
+ maxZ: volume.center.z + halfD,
53
+ };
54
+ }
55
+ function placementHash(volumeId, seed, index, salt) {
56
+ const text = `${volumeId}:${seed}:${index}:${salt}`;
57
+ let h = 2166136261 >>> 0;
58
+ for (let i = 0; i < text.length; i++) {
59
+ h ^= text.charCodeAt(i);
60
+ h = Math.imul(h, 16777619);
61
+ }
62
+ return (h >>> 0) / 4294967296;
63
+ }
64
+ /**
65
+ * Deterministic placements for one vegetation volume: scatter its footprint at
66
+ * `density` items/m² (respecting `minDistance`), clip round shapes to their
67
+ * radius, and derive per-instance scale/rotation from the volume id + seed, so
68
+ * the same saved scene always grows the same field.
69
+ * @internal
70
+ */
71
+ export function resolveVegetationVolume(volume) {
72
+ const settings = readVegetationSettings(volume);
73
+ if (settings === null || settings.density <= 0)
74
+ return [];
75
+ const area = vegetationFootprint(volume);
76
+ const points = scatter({
77
+ area,
78
+ density: settings.density,
79
+ minDistance: settings.minDistance,
80
+ seed: `${volume.id}:${settings.seed}`,
81
+ });
82
+ const round = volume.shape !== "box";
83
+ const radius = volume.radius ?? 5;
84
+ const radiusSq = radius * radius;
85
+ const placements = [];
86
+ for (const point of points) {
87
+ if (round) {
88
+ const dx = point.x - volume.center.x;
89
+ const dz = point.z - volume.center.z;
90
+ if (dx * dx + dz * dz > radiusSq)
91
+ continue;
92
+ }
93
+ const t = placementHash(volume.id, settings.seed, point.index, 0x51);
94
+ placements.push({
95
+ id: `${volume.id}/${point.index}`,
96
+ volumeId: volume.id,
97
+ item: settings.item,
98
+ x: point.x,
99
+ z: point.z,
100
+ scale: settings.minScale + (settings.maxScale - settings.minScale) * t,
101
+ rotation: placementHash(volume.id, settings.seed, point.index, 0x9e) * Math.PI * 2,
102
+ });
103
+ }
104
+ return placements;
105
+ }
106
+ /**
107
+ * All model-item placements in a document (every vegetation volume except
108
+ * `item: "grass"`, which the shell renders as blades — see
109
+ * `grassPatchesFromVegetation`). A game maps each placement's `item` to a
110
+ * mesh/entity via its render catalog and places it grounded.
111
+ * @internal
112
+ */
113
+ export function resolveVegetation(doc) {
114
+ const out = [];
115
+ for (const volume of doc.volumes) {
116
+ if (!isVegetationVolume(volume))
117
+ continue;
118
+ const settings = readVegetationSettings(volume);
119
+ if (settings === null || settings.item === "grass")
120
+ continue;
121
+ out.push(...resolveVegetationVolume(volume));
122
+ }
123
+ return out;
124
+ }
125
+ /**
126
+ * Grass-blade patches for every `item: "grass"` vegetation volume, ready to
127
+ * spread into `environment()`'s `grass` list — the volume's density number is
128
+ * the blades-per-m² the shell renders, so the editor slider drives it directly.
129
+ * @internal
130
+ */
131
+ export function grassPatchesFromVegetation(doc) {
132
+ const patches = [];
133
+ for (const volume of doc.volumes) {
134
+ if (!isVegetationVolume(volume))
135
+ continue;
136
+ const settings = readVegetationSettings(volume);
137
+ if (settings === null || settings.item !== "grass" || settings.density <= 0)
138
+ continue;
139
+ const area = vegetationFootprint(volume);
140
+ patches.push({
141
+ area: {
142
+ w: area.maxX - area.minX,
143
+ d: area.maxZ - area.minZ,
144
+ position: [volume.center.x, volume.center.z],
145
+ },
146
+ density: settings.density,
147
+ seed: `${volume.id}:${settings.seed}`,
148
+ });
149
+ }
150
+ return patches;
151
+ }
@@ -0,0 +1,154 @@
1
+ import type { FogBounds } from "./fog.js";
2
+ /** Numeric code for a cell no group member has seen, or has fully forgotten. */
3
+ export declare const VISIBILITY_HIDDEN = 0;
4
+ /** Numeric code for a cell seen before but not currently in view (last-known). */
5
+ export declare const VISIBILITY_REMEMBERED = 1;
6
+ /** Numeric code for a cell a group currently observes. */
7
+ export declare const VISIBILITY_OBSERVED = 2;
8
+ /** One viewer group's knowledge of a cell: never/forgotten, last-known, or live. */
9
+ export type VisibilityState = "hidden" | "remembered" | "observed";
10
+ /**
11
+ * How a cell decays after a group stops observing it — the terrain-memory policy.
12
+ * `permanent` keeps last-known terrain forever (RTS explored map); `none` drops
13
+ * it straight back to hidden the moment it leaves view (pure line-of-sight
14
+ * stealth); `decay` remembers it for `updates` observe cycles, then hides it.
15
+ * Day/night, height, sensor, and stealth rules are NOT encoded here — the caller
16
+ * bakes those into which cells it reports as observed each update.
17
+ */
18
+ export type VisibilityMemory = {
19
+ readonly kind: "permanent";
20
+ } | {
21
+ readonly kind: "none";
22
+ } | {
23
+ readonly kind: "decay";
24
+ readonly updates: number;
25
+ };
26
+ /** Construction options for {@link createVisibilityField}. */
27
+ export interface VisibilityFieldConfig {
28
+ /** World-space rectangle the grid covers (reused from `world/fog`). */
29
+ readonly bounds: FogBounds;
30
+ /** World units per grid cell. Must be positive. */
31
+ readonly cellSize: number;
32
+ /** Default memory policy applied to every group. Default `{ kind: "permanent" }`. */
33
+ readonly memory?: VisibilityMemory;
34
+ /** Rehydrate from a previously serialized field (see {@link VisibilityField.toState}). */
35
+ readonly restore?: VisibilityFieldState;
36
+ }
37
+ /**
38
+ * The cells that changed state for one group in a single {@link VisibilityField.observe}
39
+ * call — a pure incremental readout for rendering, minimaps, AI, UI, and
40
+ * authoritative replication. Never lists unchanged cells, so it stays bounded by
41
+ * how much the group's view actually moved.
42
+ */
43
+ export interface VisibilityDelta {
44
+ readonly group: string;
45
+ /** Cells that entered observation this update. */
46
+ readonly observed: readonly number[];
47
+ /** Cells that left observation into remembered (last-known) state. */
48
+ readonly remembered: readonly number[];
49
+ /** Cells that fell out of memory entirely (decay expiry or `none` policy). */
50
+ readonly hidden: readonly number[];
51
+ }
52
+ /** Sparse serialized knowledge for one group — only non-hidden cells are stored. */
53
+ export interface VisibilityGroupState {
54
+ /** Currently observed cell indices. */
55
+ readonly observed: readonly number[];
56
+ /** Remembered cells as `[cellIndex, lastObservedTick]` pairs. */
57
+ readonly remembered: readonly (readonly [number, number])[];
58
+ /** Monotonic update counter, used to age remembered cells under a decay policy. */
59
+ readonly tick: number;
60
+ /** Per-group memory override, when it differs from the field default. */
61
+ readonly memory?: VisibilityMemory;
62
+ }
63
+ /** Serializable snapshot of a whole field — JSON round-trips losslessly. */
64
+ export interface VisibilityFieldState {
65
+ readonly cols: number;
66
+ readonly rows: number;
67
+ readonly minX: number;
68
+ readonly minZ: number;
69
+ readonly cellSize: number;
70
+ readonly memory: VisibilityMemory;
71
+ readonly groups: Readonly<Record<string, VisibilityGroupState>>;
72
+ }
73
+ /** Dense per-cell readout for one group, shaped for minimap/overlay drawing. */
74
+ export interface VisibilityCells {
75
+ readonly cols: number;
76
+ readonly rows: number;
77
+ readonly minX: number;
78
+ readonly minZ: number;
79
+ readonly cellSize: number;
80
+ /** Row-major `VISIBILITY_*` codes; index = row * cols + col. */
81
+ readonly codes: Uint8Array;
82
+ }
83
+ /**
84
+ * A gameplay (fog-of-war) knowledge field: per viewer group, every grid cell is
85
+ * hidden, remembered, or observed. Distinct from render culling in
86
+ * `core/visibility` — this models what a team KNOWS, not what a camera can draw.
87
+ * It generalizes `world/fog`'s single-group reveal-once model to many groups
88
+ * with configurable terrain memory, and keeps each group's knowledge isolated so
89
+ * one group's hidden state can never be derived from another's.
90
+ */
91
+ export interface VisibilityField {
92
+ readonly cols: number;
93
+ readonly rows: number;
94
+ cellCount(): number;
95
+ colOf(x: number): number;
96
+ rowOf(z: number): number;
97
+ /** Row-major cell index for a world point, clamped into the grid. */
98
+ cellIndex(x: number, z: number): number;
99
+ /** Register a viewer group, optionally with its own memory policy. Idempotent. */
100
+ ensureGroup(group: string, memory?: VisibilityMemory): void;
101
+ hasGroup(group: string): boolean;
102
+ groups(): string[];
103
+ /** Forget everything for a group and drop it. */
104
+ removeGroup(group: string): void;
105
+ /**
106
+ * Cell indices whose centers fall within `radius` of a world point (bounded
107
+ * disc), appended into `out` when supplied. Feed these into {@link observe};
108
+ * union several sources' discs before observing to model overlapping observers.
109
+ */
110
+ cellsInRadius(x: number, z: number, radius: number, out?: number[]): number[];
111
+ /**
112
+ * Replace a group's observed set for this update. Cells newly covered become
113
+ * observed; cells that dropped out become remembered (or hidden under `none`);
114
+ * decayed memory expires. Work is bounded by the observed + remembered working
115
+ * sets — it never scans the whole grid. Returns the resulting {@link VisibilityDelta}.
116
+ */
117
+ observe(group: string, cells: Iterable<number>): VisibilityDelta;
118
+ /** Convenience {@link observe} over a single disc around a source. */
119
+ observeCircle(group: string, x: number, z: number, radius: number): VisibilityDelta;
120
+ stateAtCell(group: string, cell: number): VisibilityState;
121
+ stateAt(group: string, x: number, z: number): VisibilityState;
122
+ isObserved(group: string, x: number, z: number): boolean;
123
+ isRemembered(group: string, x: number, z: number): boolean;
124
+ /** Terrain disclosure: observed OR remembered (anything the group has ever mapped). */
125
+ isKnown(group: string, x: number, z: number): boolean;
126
+ observedCount(group: string): number;
127
+ knownCount(group: string): number;
128
+ /**
129
+ * Authoritative entity-disclosure filter: keep only entities standing in a cell
130
+ * the group currently OBSERVES. Remembered and hidden cells never disclose live
131
+ * entities, so a unit that moved away or was destroyed re-hides. Reads only this
132
+ * group's state, so it is the seam that stops one group's hidden entities from
133
+ * leaking into another group's replicated view.
134
+ */
135
+ visibleTo<T>(group: string, entities: readonly T[], positionOf: (entity: T) => {
136
+ readonly x: number;
137
+ readonly z: number;
138
+ }): T[];
139
+ /** Dense per-cell codes for a group, for minimap/overlay rendering. */
140
+ cells(group: string): VisibilityCells;
141
+ /** Sparse serializable snapshot; round-trips through {@link createVisibilityField}'s `restore`. */
142
+ toState(): VisibilityFieldState;
143
+ /** Forget one group's knowledge, or every group when `group` is omitted. */
144
+ reset(group?: string): void;
145
+ }
146
+ /**
147
+ * Build a per-group gameplay visibility field. First adopters: an RTS/stealth
148
+ * team whose scout observes terrain (which stays remembered after it leaves)
149
+ * while enemy units re-hide once no scout observes their cell, and any
150
+ * authoritative host that must filter hidden entities out of a client's replica.
151
+ *
152
+ * @capability visibility-field per-viewer-group observed/remembered/hidden fog-of-war knowledge with terrain memory and authoritative entity disclosure
153
+ */
154
+ export declare function createVisibilityField(config: VisibilityFieldConfig): VisibilityField;