@jgengine/core 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/CHANGELOG.md +34 -3
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/spawnDirector.d.ts +19 -1
  21. package/dist/ai/spawnDirector.js +53 -26
  22. package/dist/ai/spawnPoint.d.ts +7 -0
  23. package/dist/ai/spawnPoint.js +7 -0
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/audio/audioFalloff.d.ts +5 -2
  35. package/dist/audio/music.d.ts +53 -0
  36. package/dist/audio/music.js +34 -0
  37. package/dist/audio/synth.d.ts +60 -0
  38. package/dist/audio/synth.js +8 -0
  39. package/dist/authoring.d.ts +15 -0
  40. package/dist/authoring.js +15 -0
  41. package/dist/board/laneBoard.d.ts +13 -0
  42. package/dist/board/laneBoard.js +13 -0
  43. package/dist/board/timelineBoard.d.ts +10 -0
  44. package/dist/board/timelineBoard.js +10 -0
  45. package/dist/combat/abilityKit.d.ts +18 -0
  46. package/dist/combat/abilityKit.js +24 -9
  47. package/dist/combat/animationState.d.ts +5 -0
  48. package/dist/combat/animationState.js +5 -0
  49. package/dist/combat/breakMeters.d.ts +10 -0
  50. package/dist/combat/breakMeters.js +10 -0
  51. package/dist/combat/castRunner.d.ts +5 -0
  52. package/dist/combat/castRunner.js +5 -0
  53. package/dist/combat/comboPoints.d.ts +5 -0
  54. package/dist/combat/comboPoints.js +5 -0
  55. package/dist/combat/comboString.d.ts +5 -0
  56. package/dist/combat/comboString.js +5 -0
  57. package/dist/combat/damageInterceptors.d.ts +192 -0
  58. package/dist/combat/damageInterceptors.js +251 -0
  59. package/dist/combat/damageMatchup.d.ts +68 -0
  60. package/dist/combat/damageMatchup.js +42 -0
  61. package/dist/combat/damageResolution.d.ts +63 -0
  62. package/dist/combat/damageResolution.js +50 -0
  63. package/dist/combat/death.d.ts +7 -1
  64. package/dist/combat/death.js +5 -0
  65. package/dist/combat/deathReason.d.ts +14 -0
  66. package/dist/combat/deathReason.js +1 -0
  67. package/dist/combat/defensiveWindow.d.ts +5 -0
  68. package/dist/combat/defensiveWindow.js +5 -0
  69. package/dist/combat/dotField.d.ts +47 -0
  70. package/dist/combat/dotField.js +52 -0
  71. package/dist/combat/downed.d.ts +5 -0
  72. package/dist/combat/downed.js +5 -0
  73. package/dist/combat/effects.d.ts +5 -0
  74. package/dist/combat/effects.js +5 -0
  75. package/dist/combat/encounterSequence.d.ts +258 -0
  76. package/dist/combat/encounterSequence.js +426 -0
  77. package/dist/combat/hitReaction.d.ts +57 -1
  78. package/dist/combat/hitReaction.js +45 -5
  79. package/dist/combat/magazine.d.ts +54 -0
  80. package/dist/combat/magazine.js +96 -0
  81. package/dist/combat/projectiles.d.ts +7 -2
  82. package/dist/combat/projectiles.js +48 -17
  83. package/dist/combat/receivedDamage.d.ts +117 -0
  84. package/dist/combat/receivedDamage.js +92 -0
  85. package/dist/combat/regenShield.d.ts +39 -0
  86. package/dist/combat/regenShield.js +49 -0
  87. package/dist/combat/renderCues.d.ts +51 -0
  88. package/dist/combat/renderCues.js +44 -0
  89. package/dist/combat/resourcePool.d.ts +5 -0
  90. package/dist/combat/resourcePool.js +5 -0
  91. package/dist/combat/rewardAllocation.d.ts +121 -0
  92. package/dist/combat/rewardAllocation.js +251 -0
  93. package/dist/combat/shotOrigin.d.ts +30 -1
  94. package/dist/combat/shotOrigin.js +70 -2
  95. package/dist/combat/statusApplication.d.ts +96 -0
  96. package/dist/combat/statusApplication.js +81 -0
  97. package/dist/combat/telegraph.d.ts +11 -2
  98. package/dist/combat/telegraph.js +11 -2
  99. package/dist/combat/thresholdCrossings.d.ts +85 -0
  100. package/dist/combat/thresholdCrossings.js +116 -0
  101. package/dist/combat.d.ts +34 -0
  102. package/dist/combat.js +34 -0
  103. package/dist/commands/commandRegistry.d.ts +11 -0
  104. package/dist/commands/commandRegistry.js +9 -2
  105. package/dist/crafting/crop.d.ts +18 -0
  106. package/dist/crafting/crop.js +18 -0
  107. package/dist/crafting/production.d.ts +5 -0
  108. package/dist/crafting/production.js +5 -0
  109. package/dist/devtools/rewriteTunables.d.ts +17 -0
  110. package/dist/devtools/rewriteTunables.js +276 -0
  111. package/dist/devtools/saveEndpoint.d.ts +46 -0
  112. package/dist/devtools/saveEndpoint.js +48 -0
  113. package/dist/devtools/transformTunables.d.ts +3 -0
  114. package/dist/devtools/transformTunables.js +3 -0
  115. package/dist/devtools/tunableSchema.d.ts +31 -0
  116. package/dist/devtools/tunableSchema.js +31 -0
  117. package/dist/economy/currency.d.ts +12 -1
  118. package/dist/economy/currency.js +12 -1
  119. package/dist/economy/listingBook.d.ts +91 -0
  120. package/dist/economy/listingBook.js +144 -0
  121. package/dist/economy/resourceLedger.d.ts +222 -0
  122. package/dist/economy/resourceLedger.js +353 -0
  123. package/dist/economy/sharedWallet.d.ts +14 -0
  124. package/dist/economy/sharedWallet.js +14 -0
  125. package/dist/economy/techTree.d.ts +12 -0
  126. package/dist/economy/techTree.js +12 -0
  127. package/dist/economy/wallet.d.ts +26 -2
  128. package/dist/economy/wallet.js +35 -6
  129. package/dist/editor/commands.d.ts +248 -0
  130. package/dist/editor/commands.js +865 -0
  131. package/dist/editor/document.d.ts +186 -0
  132. package/dist/editor/document.js +884 -0
  133. package/dist/editor/grid.d.ts +229 -0
  134. package/dist/editor/grid.js +366 -0
  135. package/dist/editor/gridAdapters.d.ts +80 -0
  136. package/dist/editor/gridAdapters.js +134 -0
  137. package/dist/editor/index.d.ts +97 -0
  138. package/dist/editor/index.js +10 -0
  139. package/dist/editor/liveSync.d.ts +127 -0
  140. package/dist/editor/liveSync.js +249 -0
  141. package/dist/editor/runtimeInspector.d.ts +88 -0
  142. package/dist/editor/runtimeInspector.js +239 -0
  143. package/dist/editor/types.d.ts +175 -0
  144. package/dist/editor/types.js +29 -0
  145. package/dist/faction/reputation.d.ts +5 -0
  146. package/dist/faction/reputation.js +5 -0
  147. package/dist/format/distance.d.ts +17 -0
  148. package/dist/format/distance.js +18 -0
  149. package/dist/format/duration.d.ts +27 -0
  150. package/dist/format/duration.js +45 -0
  151. package/dist/format/speed.d.ts +17 -0
  152. package/dist/format/speed.js +25 -0
  153. package/dist/game/connectedPlayers.d.ts +30 -0
  154. package/dist/game/connectedPlayers.js +21 -0
  155. package/dist/game/cosmetics.d.ts +9 -0
  156. package/dist/game/cosmetics.js +16 -0
  157. package/dist/game/defineGame.d.ts +141 -2
  158. package/dist/game/defineGame.js +39 -1
  159. package/dist/game/defineSystem.d.ts +88 -0
  160. package/dist/game/defineSystem.js +45 -0
  161. package/dist/game/dialogue.d.ts +33 -0
  162. package/dist/game/dialogue.js +21 -0
  163. package/dist/game/events.d.ts +50 -13
  164. package/dist/game/events.js +5 -0
  165. package/dist/game/feed.d.ts +33 -0
  166. package/dist/game/feed.js +35 -2
  167. package/dist/game/gamePhase.d.ts +11 -0
  168. package/dist/game/gamePhase.js +16 -0
  169. package/dist/game/keyValueStore.d.ts +25 -0
  170. package/dist/game/keyValueStore.js +61 -0
  171. package/dist/game/leaderboard.d.ts +5 -0
  172. package/dist/game/leaderboard.js +5 -0
  173. package/dist/game/levelSequence.d.ts +24 -2
  174. package/dist/game/levelSequence.js +51 -2
  175. package/dist/game/loadout.d.ts +5 -0
  176. package/dist/game/loadout.js +5 -0
  177. package/dist/game/lootFilter.d.ts +2 -0
  178. package/dist/game/lootFilter.js +2 -0
  179. package/dist/game/lootPipeline.d.ts +164 -0
  180. package/dist/game/lootPipeline.js +216 -0
  181. package/dist/game/lootTable.d.ts +21 -0
  182. package/dist/game/lootTable.js +15 -4
  183. package/dist/game/modelAnimation.d.ts +8 -0
  184. package/dist/game/modelAnimation.js +18 -0
  185. package/dist/game/objectives.d.ts +43 -0
  186. package/dist/game/objectives.js +36 -0
  187. package/dist/game/paramLayers.d.ts +148 -0
  188. package/dist/game/paramLayers.js +185 -0
  189. package/dist/game/ping.d.ts +5 -0
  190. package/dist/game/ping.js +5 -0
  191. package/dist/game/playableGame.d.ts +160 -12
  192. package/dist/game/quest.d.ts +8 -0
  193. package/dist/game/quest.js +29 -0
  194. package/dist/game/race.d.ts +141 -0
  195. package/dist/game/race.js +169 -0
  196. package/dist/game/recordBook.d.ts +5 -5
  197. package/dist/game/recordBook.js +4 -1
  198. package/dist/game/ruleSelection.d.ts +75 -0
  199. package/dist/game/ruleSelection.js +127 -0
  200. package/dist/game/runDraft.d.ts +5 -0
  201. package/dist/game/runDraft.js +5 -0
  202. package/dist/game/saveStore.d.ts +111 -0
  203. package/dist/game/saveStore.js +312 -0
  204. package/dist/game/snapshotHistory.d.ts +67 -0
  205. package/dist/game/snapshotHistory.js +95 -0
  206. package/dist/game/social.d.ts +38 -1
  207. package/dist/game/social.js +71 -0
  208. package/dist/game/spawnPoints.d.ts +5 -0
  209. package/dist/game/spawnPoints.js +5 -0
  210. package/dist/game/systemRuntime.d.ts +50 -0
  211. package/dist/game/systemRuntime.js +157 -0
  212. package/dist/game/systemSchedule.d.ts +72 -0
  213. package/dist/game/systemSchedule.js +242 -0
  214. package/dist/game/toasts.d.ts +43 -0
  215. package/dist/game/toasts.js +44 -0
  216. package/dist/game/trade.d.ts +10 -0
  217. package/dist/game/trade.js +10 -0
  218. package/dist/game/unlocks.d.ts +8 -0
  219. package/dist/game/unlocks.js +16 -0
  220. package/dist/game/vfxInstance.d.ts +138 -0
  221. package/dist/game/vfxInstance.js +96 -0
  222. package/dist/game/worldItem.d.ts +17 -4
  223. package/dist/game/worldItem.js +17 -4
  224. package/dist/gameplay.d.ts +91 -0
  225. package/dist/gameplay.js +91 -0
  226. package/dist/index.d.ts +5 -7
  227. package/dist/index.js +5 -7
  228. package/dist/input/actionBindings.d.ts +24 -5
  229. package/dist/input/actionBindings.js +23 -5
  230. package/dist/input/axisInput.d.ts +13 -1
  231. package/dist/input/axisInput.js +22 -1
  232. package/dist/input/controlGroups.d.ts +67 -0
  233. package/dist/input/controlGroups.js +41 -0
  234. package/dist/input/touchScheme.d.ts +82 -6
  235. package/dist/input/touchScheme.js +123 -10
  236. package/dist/interaction/contextMenu.d.ts +1 -0
  237. package/dist/interaction/contextMenu.js +1 -0
  238. package/dist/interaction/lockpick.d.ts +61 -0
  239. package/dist/interaction/lockpick.js +168 -0
  240. package/dist/interaction/proximityPrompt.d.ts +5 -1
  241. package/dist/interaction/proximityPrompt.js +5 -3
  242. package/dist/interaction/qte.d.ts +5 -0
  243. package/dist/interaction/qte.js +5 -0
  244. package/dist/interaction/skillCheck.d.ts +5 -0
  245. package/dist/interaction/skillCheck.js +5 -0
  246. package/dist/inventory/inventoryModel.d.ts +12 -0
  247. package/dist/inventory/inventoryModel.js +12 -0
  248. package/dist/inventory/shapedGrid.d.ts +16 -0
  249. package/dist/inventory/shapedGrid.js +16 -0
  250. package/dist/inventory/slotModel.d.ts +10 -0
  251. package/dist/inventory/slotModel.js +10 -0
  252. package/dist/item/durability.d.ts +5 -0
  253. package/dist/item/durability.js +5 -0
  254. package/dist/item/itemIdentity.d.ts +171 -0
  255. package/dist/item/itemIdentity.js +138 -0
  256. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  257. package/dist/item/itemInstanceRegistry.js +34 -0
  258. package/dist/item/itemgen.d.ts +163 -0
  259. package/dist/item/itemgen.js +151 -0
  260. package/dist/item/modularItem.d.ts +5 -0
  261. package/dist/item/modularItem.js +5 -0
  262. package/dist/item/use.d.ts +5 -0
  263. package/dist/item/use.js +5 -0
  264. package/dist/item/useBehavior.d.ts +142 -0
  265. package/dist/item/useBehavior.js +105 -0
  266. package/dist/item/weapon.d.ts +5 -0
  267. package/dist/item/weapon.js +5 -0
  268. package/dist/math/scalar.d.ts +25 -0
  269. package/dist/math/scalar.js +47 -0
  270. package/dist/meta/changelog.d.ts +4 -1
  271. package/dist/meta/changelog.js +36 -1
  272. package/dist/movement/avoidance.d.ts +45 -0
  273. package/dist/movement/avoidance.js +123 -0
  274. package/dist/movement/cameraRig.d.ts +8 -0
  275. package/dist/movement/cameraRig.js +8 -0
  276. package/dist/movement/dash.d.ts +11 -0
  277. package/dist/movement/dash.js +11 -0
  278. package/dist/movement/formation.d.ts +135 -0
  279. package/dist/movement/formation.js +194 -0
  280. package/dist/movement/glideModel.d.ts +5 -0
  281. package/dist/movement/glideModel.js +5 -0
  282. package/dist/movement/grappleSwing.d.ts +5 -0
  283. package/dist/movement/grappleSwing.js +5 -0
  284. package/dist/movement/leaderTrail.d.ts +5 -0
  285. package/dist/movement/leaderTrail.js +5 -0
  286. package/dist/movement/movementModel.d.ts +38 -7
  287. package/dist/movement/movementModel.js +54 -13
  288. package/dist/movement/playerMovement.d.ts +41 -0
  289. package/dist/movement/playerMovement.js +236 -0
  290. package/dist/movement/poseState.d.ts +13 -0
  291. package/dist/movement/poseState.js +16 -0
  292. package/dist/movement/steering.d.ts +8 -0
  293. package/dist/movement/steering.js +18 -0
  294. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  295. package/dist/multiplayer/combatSnapshot.js +3 -0
  296. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  297. package/dist/multiplayer/lagCompensation.js +5 -0
  298. package/dist/multiplayer/presenceModel.d.ts +9 -1
  299. package/dist/multiplayer/presenceModel.js +9 -1
  300. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  301. package/dist/multiplayer/simultaneousCommit.js +3 -0
  302. package/dist/multiplayer.d.ts +11 -0
  303. package/dist/multiplayer.js +11 -0
  304. package/dist/nav/pathFollow.d.ts +57 -0
  305. package/dist/nav/pathFollow.js +109 -0
  306. package/dist/orders/orderKinds.d.ts +156 -0
  307. package/dist/orders/orderKinds.js +197 -0
  308. package/dist/orders/orderQueue.d.ts +208 -0
  309. package/dist/orders/orderQueue.js +211 -0
  310. package/dist/physics/drivableVehicle.d.ts +29 -0
  311. package/dist/physics/drivableVehicle.js +16 -0
  312. package/dist/physics/kinematicVehicle.d.ts +21 -1
  313. package/dist/physics/kinematicVehicle.js +23 -8
  314. package/dist/physics/physicsWorld.d.ts +24 -12
  315. package/dist/physics/physicsWorld.js +11 -5
  316. package/dist/physics/radialImpulse.d.ts +25 -0
  317. package/dist/physics/radialImpulse.js +27 -0
  318. package/dist/procedural.d.ts +3 -0
  319. package/dist/procedural.js +3 -0
  320. package/dist/progression/statGraph.d.ts +116 -0
  321. package/dist/progression/statGraph.js +318 -0
  322. package/dist/puzzle/cellGrid.d.ts +9 -0
  323. package/dist/puzzle/cellGrid.js +9 -0
  324. package/dist/puzzle/fallingPiece.d.ts +9 -0
  325. package/dist/puzzle/fallingPiece.js +9 -0
  326. package/dist/puzzle/nonogram.d.ts +39 -0
  327. package/dist/puzzle/nonogram.js +136 -0
  328. package/dist/random/nameGen.d.ts +5 -0
  329. package/dist/random/nameGen.js +5 -0
  330. package/dist/random/pick.d.ts +8 -0
  331. package/dist/random/pick.js +31 -0
  332. package/dist/random/rng.d.ts +24 -0
  333. package/dist/random/rng.js +30 -8
  334. package/dist/random/seedLink.d.ts +4 -0
  335. package/dist/random/seedLink.js +4 -0
  336. package/dist/relation/keyedValues.d.ts +54 -0
  337. package/dist/relation/keyedValues.js +115 -0
  338. package/dist/relation/thresholds.d.ts +62 -0
  339. package/dist/relation/thresholds.js +62 -0
  340. package/dist/render/color.d.ts +12 -0
  341. package/dist/render/color.js +26 -0
  342. package/dist/render/lookPreset.d.ts +41 -0
  343. package/dist/render/lookPreset.js +29 -0
  344. package/dist/render/postProcessing.d.ts +76 -0
  345. package/dist/render/postProcessing.js +21 -0
  346. package/dist/rules/predicate.d.ts +53 -0
  347. package/dist/rules/predicate.js +64 -0
  348. package/dist/rules/ruleEffects.d.ts +38 -0
  349. package/dist/rules/ruleEffects.js +37 -0
  350. package/dist/rules/triggeredRules.d.ts +160 -0
  351. package/dist/rules/triggeredRules.js +241 -0
  352. package/dist/runtime/adapter.d.ts +58 -0
  353. package/dist/runtime/adapter.js +54 -5
  354. package/dist/runtime/cameraDirector.d.ts +1 -0
  355. package/dist/runtime/cameraDirector.js +1 -0
  356. package/dist/runtime/commandRunner.d.ts +1 -0
  357. package/dist/runtime/commandRunner.js +1 -0
  358. package/dist/runtime/context/combatFx.d.ts +23 -0
  359. package/dist/runtime/context/combatFx.js +161 -0
  360. package/dist/runtime/context/registries.d.ts +13 -0
  361. package/dist/runtime/context/registries.js +84 -0
  362. package/dist/runtime/context/worldItems.d.ts +21 -0
  363. package/dist/runtime/context/worldItems.js +37 -0
  364. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  365. package/dist/runtime/descriptors/baseline.js +134 -0
  366. package/dist/runtime/descriptors/features.d.ts +74 -0
  367. package/dist/runtime/descriptors/features.js +281 -0
  368. package/dist/runtime/gameContext.d.ts +163 -19
  369. package/dist/runtime/gameContext.js +385 -339
  370. package/dist/runtime/gameRuntime.d.ts +1 -0
  371. package/dist/runtime/gameRuntime.js +1 -0
  372. package/dist/runtime/headlessRunner.d.ts +60 -0
  373. package/dist/runtime/headlessRunner.js +44 -0
  374. package/dist/runtime/hostPersistence.d.ts +12 -0
  375. package/dist/runtime/hostPersistence.js +12 -0
  376. package/dist/runtime/hostedGameRunner.d.ts +54 -0
  377. package/dist/runtime/hostedGameRunner.js +85 -0
  378. package/dist/runtime/hostedWorldSession.d.ts +73 -0
  379. package/dist/runtime/hostedWorldSession.js +64 -0
  380. package/dist/runtime/inputSnapshot.d.ts +21 -3
  381. package/dist/runtime/inputSnapshot.js +8 -2
  382. package/dist/runtime/motionIntents.d.ts +12 -1
  383. package/dist/runtime/motionIntents.js +26 -1
  384. package/dist/runtime/perContext.d.ts +15 -0
  385. package/dist/runtime/perContext.js +21 -0
  386. package/dist/runtime/runtimeSave.d.ts +79 -0
  387. package/dist/runtime/runtimeSave.js +105 -0
  388. package/dist/runtime/save.d.ts +4 -0
  389. package/dist/runtime/save.js +4 -0
  390. package/dist/runtime/snapshot.d.ts +7 -0
  391. package/dist/runtime/snapshot.js +7 -0
  392. package/dist/runtime/visibility.d.ts +2 -1
  393. package/dist/runtime/visibility.js +2 -1
  394. package/dist/runtime/worldChannel.d.ts +62 -0
  395. package/dist/runtime/worldChannel.js +114 -0
  396. package/dist/runtime/worldMirror.d.ts +36 -0
  397. package/dist/runtime/worldMirror.js +44 -0
  398. package/dist/runtime/worldProjection.d.ts +47 -0
  399. package/dist/runtime/worldProjection.js +52 -0
  400. package/dist/runtime/worldReplication.d.ts +69 -0
  401. package/dist/runtime/worldReplication.js +217 -0
  402. package/dist/runtime/worldSnapshot.d.ts +44 -0
  403. package/dist/runtime/worldSnapshot.js +30 -0
  404. package/dist/scene/assetCatalog.d.ts +22 -0
  405. package/dist/scene/assetCatalog.js +4 -0
  406. package/dist/scene/assetDiagnostics.d.ts +69 -0
  407. package/dist/scene/assetDiagnostics.js +110 -0
  408. package/dist/scene/assetGenerator.d.ts +65 -0
  409. package/dist/scene/assetGenerator.js +64 -0
  410. package/dist/scene/assetSpace.d.ts +137 -0
  411. package/dist/scene/assetSpace.js +259 -0
  412. package/dist/scene/authoredTriggers.d.ts +169 -0
  413. package/dist/scene/authoredTriggers.js +340 -0
  414. package/dist/scene/behaviorRuntime.d.ts +75 -0
  415. package/dist/scene/behaviorRuntime.js +217 -0
  416. package/dist/scene/behaviors.d.ts +14 -2
  417. package/dist/scene/behaviors.js +7 -2
  418. package/dist/scene/bodyBind.d.ts +60 -0
  419. package/dist/scene/bodyBind.js +51 -0
  420. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  421. package/dist/scene/builtinSceneKinds.js +62 -0
  422. package/dist/scene/colliders.d.ts +18 -0
  423. package/dist/scene/colliders.js +61 -1
  424. package/dist/scene/entityStats.d.ts +13 -0
  425. package/dist/scene/entityStats.js +30 -0
  426. package/dist/scene/entityStore.d.ts +41 -1
  427. package/dist/scene/entityStore.js +75 -0
  428. package/dist/scene/facing.d.ts +18 -0
  429. package/dist/scene/facing.js +26 -0
  430. package/dist/scene/modelSockets.d.ts +33 -0
  431. package/dist/scene/modelSockets.js +29 -0
  432. package/dist/scene/objectQuery.d.ts +2 -0
  433. package/dist/scene/objectQuery.js +2 -0
  434. package/dist/scene/objectStore.d.ts +4 -0
  435. package/dist/scene/objectStore.js +6 -0
  436. package/dist/scene/possession.d.ts +8 -0
  437. package/dist/scene/possession.js +14 -0
  438. package/dist/scene/roster.d.ts +3 -0
  439. package/dist/scene/roster.js +12 -0
  440. package/dist/scene/sceneKinds.d.ts +240 -0
  441. package/dist/scene/sceneKinds.js +214 -0
  442. package/dist/scene/sceneOwnership.d.ts +169 -0
  443. package/dist/scene/sceneOwnership.js +179 -0
  444. package/dist/scene/selectionBookmarks.d.ts +93 -0
  445. package/dist/scene/selectionBookmarks.js +122 -0
  446. package/dist/scene/vehicleSeat.d.ts +68 -0
  447. package/dist/scene/vehicleSeat.js +59 -0
  448. package/dist/sensor/concealment.d.ts +3 -0
  449. package/dist/sensor/concealment.js +3 -0
  450. package/dist/sensor/freezeMonitor.d.ts +1 -0
  451. package/dist/sensor/freezeMonitor.js +1 -0
  452. package/dist/sensor/frustumSensor.d.ts +7 -3
  453. package/dist/sensor/frustumSensor.js +7 -3
  454. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  455. package/dist/sensor/hiddenStateProbe.js +5 -2
  456. package/dist/sensor/recordingBuffer.d.ts +2 -1
  457. package/dist/sensor/recordingBuffer.js +2 -1
  458. package/dist/sensor/replayLoop.d.ts +6 -2
  459. package/dist/sensor/replayLoop.js +6 -2
  460. package/dist/sensor/revealQuery.d.ts +2 -1
  461. package/dist/sensor/revealQuery.js +2 -1
  462. package/dist/sensor/visionCone.d.ts +10 -3
  463. package/dist/sensor/visionCone.js +10 -3
  464. package/dist/session/contestedChannel.d.ts +1 -0
  465. package/dist/session/contestedChannel.js +1 -0
  466. package/dist/session/extraction.d.ts +1 -0
  467. package/dist/session/extraction.js +1 -0
  468. package/dist/session/roles.d.ts +6 -0
  469. package/dist/session/roles.js +6 -0
  470. package/dist/session/roundState.d.ts +8 -0
  471. package/dist/session/roundState.js +2 -0
  472. package/dist/settings/settingsModel.d.ts +1 -0
  473. package/dist/settings/settingsModel.js +1 -0
  474. package/dist/stats/accumulatorMeter.d.ts +6 -0
  475. package/dist/stats/accumulatorMeter.js +6 -0
  476. package/dist/stats/eventMeter.d.ts +5 -0
  477. package/dist/stats/eventMeter.js +5 -0
  478. package/dist/stats/rollCheck.d.ts +5 -0
  479. package/dist/stats/rollCheck.js +5 -0
  480. package/dist/stats/statModifiers.d.ts +5 -0
  481. package/dist/stats/statModifiers.js +5 -0
  482. package/dist/store/defineKeyedStore.d.ts +38 -0
  483. package/dist/store/defineKeyedStore.js +42 -0
  484. package/dist/store/defineStore.d.ts +33 -0
  485. package/dist/store/defineStore.js +35 -0
  486. package/dist/store/observableKeyedStore.d.ts +9 -0
  487. package/dist/store/observableKeyedStore.js +43 -2
  488. package/dist/survival/decayMeter.d.ts +55 -0
  489. package/dist/survival/decayMeter.js +130 -55
  490. package/dist/survival/moodle.d.ts +2 -0
  491. package/dist/survival/regionHealth.d.ts +6 -0
  492. package/dist/survival/regionHealth.js +5 -0
  493. package/dist/tactics/fallingGrid.d.ts +6 -4
  494. package/dist/tactics/fallingGrid.js +6 -4
  495. package/dist/tactics/predictiveQuery.d.ts +3 -0
  496. package/dist/tactics/predictiveQuery.js +3 -0
  497. package/dist/tactics/snapshot.d.ts +2 -0
  498. package/dist/tactics/snapshot.js +2 -0
  499. package/dist/tactics/surface.d.ts +1 -0
  500. package/dist/tactics/surface.js +1 -0
  501. package/dist/tactics/tacticalGrid.d.ts +1 -0
  502. package/dist/tactics/tacticalGrid.js +1 -0
  503. package/dist/time/beatClock.d.ts +14 -4
  504. package/dist/time/beatClock.js +14 -4
  505. package/dist/time/calendarClock.d.ts +3 -0
  506. package/dist/time/calendarClock.js +3 -0
  507. package/dist/time/idleProgress.d.ts +4 -0
  508. package/dist/time/idleProgress.js +4 -0
  509. package/dist/time/simClock.d.ts +2 -0
  510. package/dist/time/simClock.js +20 -5
  511. package/dist/ui/actionModel.d.ts +110 -0
  512. package/dist/ui/actionModel.js +159 -0
  513. package/dist/ui/gameLayout.d.ts +144 -0
  514. package/dist/ui/gameLayout.js +148 -0
  515. package/dist/ui/hudDocument.d.ts +114 -0
  516. package/dist/ui/hudDocument.js +220 -0
  517. package/dist/ui/hudLayout.d.ts +33 -1
  518. package/dist/ui/hudLayout.js +204 -17
  519. package/dist/ui/orientation.d.ts +39 -0
  520. package/dist/ui/orientation.js +49 -0
  521. package/dist/ui/selectionModel.d.ts +92 -0
  522. package/dist/ui/selectionModel.js +88 -0
  523. package/dist/ui/swingTimer.d.ts +42 -0
  524. package/dist/ui/swingTimer.js +38 -0
  525. package/dist/ui/tooltipModel.d.ts +63 -0
  526. package/dist/ui/tooltipModel.js +82 -0
  527. package/dist/ui.d.ts +15 -0
  528. package/dist/ui.js +15 -0
  529. package/dist/visibility/bounds.d.ts +8 -1
  530. package/dist/visibility/bounds.js +8 -1
  531. package/dist/visibility/frustum.d.ts +12 -3
  532. package/dist/visibility/frustum.js +12 -3
  533. package/dist/visibility/spatialIndex.js +34 -20
  534. package/dist/work/jobQueue.d.ts +201 -0
  535. package/dist/work/jobQueue.js +253 -0
  536. package/dist/work/unitTraining.d.ts +58 -0
  537. package/dist/work/unitTraining.js +52 -0
  538. package/dist/world/authoredObjects.d.ts +58 -0
  539. package/dist/world/authoredObjects.js +69 -0
  540. package/dist/world/buildingGenerator.d.ts +18 -0
  541. package/dist/world/buildingGenerator.js +62 -0
  542. package/dist/world/buildings.d.ts +5 -0
  543. package/dist/world/buildings.js +5 -0
  544. package/dist/world/catenary.d.ts +22 -0
  545. package/dist/world/catenary.js +69 -0
  546. package/dist/world/environmentSummary.d.ts +11 -2
  547. package/dist/world/environmentSummary.js +11 -1
  548. package/dist/world/features.d.ts +244 -7
  549. package/dist/world/features.js +92 -4
  550. package/dist/world/footprintGrid.d.ts +59 -0
  551. package/dist/world/footprintGrid.js +141 -0
  552. package/dist/world/geometry.d.ts +64 -0
  553. package/dist/world/geometry.js +94 -0
  554. package/dist/world/grassKind.d.ts +51 -0
  555. package/dist/world/grassKind.js +101 -0
  556. package/dist/world/pathInstances.d.ts +27 -0
  557. package/dist/world/pathInstances.js +27 -0
  558. package/dist/world/pathTerrain.d.ts +80 -0
  559. package/dist/world/pathTerrain.js +142 -0
  560. package/dist/world/placeAsset.d.ts +81 -0
  561. package/dist/world/placeAsset.js +77 -0
  562. package/dist/world/placement.d.ts +4 -0
  563. package/dist/world/placement.js +4 -0
  564. package/dist/world/placementController.d.ts +6 -0
  565. package/dist/world/placementController.js +6 -0
  566. package/dist/world/polyline.d.ts +34 -0
  567. package/dist/world/polyline.js +81 -0
  568. package/dist/world/roads.d.ts +55 -0
  569. package/dist/world/roads.js +184 -0
  570. package/dist/world/scatterRegion.d.ts +164 -0
  571. package/dist/world/scatterRegion.js +409 -0
  572. package/dist/world/sceneShapes.d.ts +43 -0
  573. package/dist/world/sceneShapes.js +1 -0
  574. package/dist/world/segment.d.ts +27 -0
  575. package/dist/world/segment.js +43 -0
  576. package/dist/world/soilKind.d.ts +48 -0
  577. package/dist/world/soilKind.js +92 -0
  578. package/dist/world/spatialSample.d.ts +241 -0
  579. package/dist/world/spatialSample.js +465 -0
  580. package/dist/world/streets.d.ts +80 -0
  581. package/dist/world/streets.js +144 -0
  582. package/dist/world/terraform.d.ts +213 -1
  583. package/dist/world/terraform.js +655 -20
  584. package/dist/world/terrain.d.ts +138 -12
  585. package/dist/world/terrain.js +346 -28
  586. package/dist/world/terrainGuides.d.ts +182 -0
  587. package/dist/world/terrainGuides.js +343 -0
  588. package/dist/world/vec2.d.ts +81 -0
  589. package/dist/world/vec2.js +128 -0
  590. package/dist/world/vec3.d.ts +49 -0
  591. package/dist/world/vec3.js +76 -0
  592. package/dist/world/vegetation.d.ts +71 -0
  593. package/dist/world/vegetation.js +151 -0
  594. package/dist/world/visibilityField.d.ts +154 -0
  595. package/dist/world/visibilityField.js +271 -0
  596. package/dist/world/volumetricClouds.d.ts +52 -0
  597. package/dist/world/volumetricClouds.js +43 -0
  598. package/dist/world/walls.d.ts +9 -0
  599. package/dist/world/walls.js +9 -0
  600. package/dist/world/waterKind.d.ts +55 -0
  601. package/dist/world/waterKind.js +99 -0
  602. package/dist/world.d.ts +132 -0
  603. package/dist/world.js +132 -0
  604. package/package.json +32 -8
  605. package/skills/jgengine/SKILL.md +51 -0
  606. package/skills/jgengine/api.md +434 -0
  607. package/skills/jgengine/capabilities.md +29 -0
  608. package/skills/jgengine/reference-cartridge.md +72 -0
  609. package/skills/jgengine-combat/SKILL.md +34 -0
  610. package/skills/jgengine-combat/api.md +549 -0
  611. package/skills/jgengine-combat/capabilities.md +169 -0
  612. package/skills/jgengine-combat/reference.md +98 -0
  613. package/skills/jgengine-gameplay/SKILL.md +39 -0
  614. package/skills/jgengine-gameplay/api.md +1794 -0
  615. package/skills/jgengine-gameplay/capabilities.md +378 -0
  616. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  617. package/skills/jgengine-world/SKILL.md +38 -0
  618. package/skills/jgengine-world/api.md +2652 -0
  619. package/skills/jgengine-world/capabilities.md +370 -0
  620. package/skills/jgengine-world/reference.md +222 -0
  621. package/dist/cartridge/runtime.d.ts +0 -15
  622. package/dist/cartridge/runtime.js +0 -556
  623. package/dist/cartridge/spec.d.ts +0 -188
  624. package/dist/cartridge/spec.js +0 -19
  625. package/dist/cartridge/validate.d.ts +0 -2
  626. package/dist/cartridge/validate.js +0 -78
  627. package/dist/store/engineStore.d.ts +0 -22
  628. package/dist/store/engineStore.js +0 -50
  629. package/dist/store/features.d.ts +0 -10
  630. package/dist/store/features.js +0 -23
  631. package/llms.txt +0 -4983
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Authored behavior triggers on editor volumes and markers — a small `on`/`action` meta vocabulary
3
+ * so "when player enters this volume, spawn wave 2" is scene data, not game code. Games declare
4
+ * actions (typed via ParamSchema); the editor inspector renders their fields; a pure runtime
5
+ * watches membership and dispatches to handlers.
6
+ */
7
+ import type { SceneDocumentLike, SceneMarkerLike, SceneVolumeLike } from "../world/sceneShapes.js";
8
+ import { type ParamSchema, type ParsedParams } from "./sceneKinds.js";
9
+ /** Event edge that can fire an authored trigger. */
10
+ export type TriggerEvent = "enter" | "exit" | "interact";
11
+ /** Document collection a trigger source lives on. */
12
+ export type TriggerSourceKind = "marker" | "volume";
13
+ /** Reserved meta keys for the trigger vocabulary — action params use every other schema field. @internal */
14
+ export declare const TRIGGER_ON_KEY = "on";
15
+ /** @internal */
16
+ export declare const TRIGGER_ACTION_KEY = "action";
17
+ /** @internal */
18
+ export declare const TRIGGER_RADIUS_KEY = "triggerRadius";
19
+ /** @internal */
20
+ export declare const TRIGGER_LIST_KEY = "triggers";
21
+ /** Default proximity radius (m) for marker enter/exit/interact when neither triggerRadius nor radius is set. @internal */
22
+ export declare const DEFAULT_TRIGGER_RADIUS = 2.5;
23
+ /**
24
+ * A game-declared action the editor can assign to a volume/marker trigger. Schema drives the
25
+ * inspector params; `targets`/`events` optionally narrow where it appears.
26
+ */
27
+ export interface TriggerActionDefinition {
28
+ id: string;
29
+ /** Human label for the inspector action dropdown. */
30
+ label: string;
31
+ /** Param surface for this action — fields land flat on the object's `meta` (alongside `on`/`action`). */
32
+ schema: ParamSchema;
33
+ /** Which document collections accept this action. Default both. */
34
+ targets?: readonly TriggerSourceKind[];
35
+ /** Which events this action accepts. Default all (`enter`/`exit`/`interact`). */
36
+ events?: readonly TriggerEvent[];
37
+ }
38
+ /** One resolved trigger binding from a document object. */
39
+ export interface AuthoredTrigger {
40
+ sourceId: string;
41
+ sourceKind: TriggerSourceKind;
42
+ objectKind: string;
43
+ on: TriggerEvent;
44
+ action: string;
45
+ params: ParsedParams;
46
+ /** Proximity radius for marker sources; unused for volumes (shape owns containment). */
47
+ radius: number;
48
+ }
49
+ /** Fired when a watched actor trips an authored trigger edge. */
50
+ export interface TriggerDispatchEvent {
51
+ on: TriggerEvent;
52
+ action: string;
53
+ sourceId: string;
54
+ sourceKind: TriggerSourceKind;
55
+ objectKind: string;
56
+ actorId: string;
57
+ params: ParsedParams;
58
+ }
59
+ /** Handler map keyed by action id — unknown actions are skipped unless `onDispatch` is set. */
60
+ export type TriggerHandlers = Readonly<Record<string, (event: TriggerDispatchEvent) => void>>;
61
+ /**
62
+ * Declare a game action the editor can assign to volume/marker triggers. Idempotent per `id`
63
+ * (last registration wins). Call at module load next to catalogs.
64
+ *
65
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
66
+ */
67
+ export declare function registerTriggerAction(definition: TriggerActionDefinition): void;
68
+ /** Registered definition for an action id, or undefined when the game never declared it. */
69
+ export declare function getTriggerAction(id: string): TriggerActionDefinition | undefined;
70
+ /** Every registered action, optionally filtered by target collection. */
71
+ export declare function listTriggerActions(target?: TriggerSourceKind): TriggerActionDefinition[];
72
+ /** Clears the action registry — tests only. @internal */
73
+ export declare function clearTriggerActions(): void;
74
+ /** Resolve the proximity radius for a marker trigger from meta. @internal */
75
+ export declare function triggerRadiusOf(meta: Record<string, unknown> | undefined, fallback?: number): number;
76
+ /**
77
+ * Read every valid `on`/`action` binding off a raw meta bag. Unknown events/actions are dropped;
78
+ * params are schema-parsed when the action is registered, else empty.
79
+ * @internal
80
+ */
81
+ export declare function readTriggerSpecs(meta: Record<string, unknown> | undefined): readonly {
82
+ on: TriggerEvent;
83
+ action: string;
84
+ params: ParsedParams;
85
+ }[];
86
+ /**
87
+ * Collect every authored trigger on a document's markers and volumes. Pure — no runtime state.
88
+ * Action params use the live {@link registerTriggerAction} registry when present.
89
+ *
90
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
91
+ */
92
+ export declare function collectAuthoredTriggers(document: SceneDocumentLike): AuthoredTrigger[];
93
+ /**
94
+ * True when `point` is inside an editor volume (sphere / cylinder / box). Cylinder height defaults
95
+ * to diameter when omitted; sphere ignores y for the common ground-plane case only when the volume
96
+ * radius covers the full vertical span — here y is tested for sphere and box too.
97
+ */
98
+ export declare function pointInVolume(volume: SceneVolumeLike, point: {
99
+ x: number;
100
+ y: number;
101
+ z: number;
102
+ }): boolean;
103
+ /** True when `point` is within `radius` of a marker's position (sphere for enter/exit/interact). @internal */
104
+ export declare function pointNearMarker(marker: SceneMarkerLike, point: {
105
+ x: number;
106
+ y: number;
107
+ z: number;
108
+ }, radius: number): boolean;
109
+ /** @internal */
110
+ export interface TriggerActor {
111
+ id: string;
112
+ position: readonly [number, number, number] | {
113
+ x: number;
114
+ y: number;
115
+ z: number;
116
+ };
117
+ }
118
+ /** @internal */
119
+ export interface AuthoredTriggerStepInput {
120
+ actors: readonly TriggerActor[];
121
+ /** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
122
+ interact?: readonly string[];
123
+ }
124
+ /** Runtime handle that watches authored triggers against moving actors each tick. */
125
+ export interface AuthoredTriggerRuntime {
126
+ /** Advance membership one tick; returns every edge fired and invokes handlers. */
127
+ step(input: {
128
+ actors: readonly {
129
+ id: string;
130
+ position: readonly [number, number, number] | {
131
+ x: number;
132
+ y: number;
133
+ z: number;
134
+ };
135
+ }[];
136
+ /** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
137
+ interact?: readonly string[];
138
+ }): readonly TriggerDispatchEvent[];
139
+ /** Drop membership so the next step re-fires enters for still-inside actors. */
140
+ reset(): void;
141
+ /** Snapshot of the triggers this runtime was built from. */
142
+ triggers(): readonly AuthoredTrigger[];
143
+ }
144
+ /**
145
+ * Build a runtime that watches a document's authored triggers against moving actors and dispatches
146
+ * to per-action handlers (and optional catch-all). Pure membership math; the game supplies actors
147
+ * each tick from its own player/entity poses.
148
+ *
149
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
150
+ */
151
+ export declare function createAuthoredTriggerRuntime(options: {
152
+ document: SceneDocumentLike;
153
+ handlers?: TriggerHandlers;
154
+ /** Invoked for every dispatch after the matching handler (if any). */
155
+ onDispatch?: (event: TriggerDispatchEvent) => void;
156
+ /** Override the collected trigger list (tests / hot-reload). Default: {@link collectAuthoredTriggers}. */
157
+ triggers?: readonly AuthoredTrigger[];
158
+ }): AuthoredTriggerRuntime;
159
+ /**
160
+ * Build a meta patch that sets a single flat trigger (`on` + `action` + optional param fields) and
161
+ * clears a multi-trigger list if present. Used by the editor inspector.
162
+ * @internal
163
+ */
164
+ export declare function triggerMetaPatch(on: TriggerEvent | "", action: string, params?: Record<string, unknown>): Record<string, unknown>;
165
+ /** Read the single flat trigger (`on`/`action`) from meta for the inspector, ignoring non-empty multi-lists. @internal */
166
+ export declare function readFlatTrigger(meta: Record<string, unknown> | undefined): {
167
+ on: TriggerEvent | "";
168
+ action: string;
169
+ };
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Authored behavior triggers on editor volumes and markers — a small `on`/`action` meta vocabulary
3
+ * so "when player enters this volume, spawn wave 2" is scene data, not game code. Games declare
4
+ * actions (typed via ParamSchema); the editor inspector renders their fields; a pure runtime
5
+ * watches membership and dispatches to handlers.
6
+ */
7
+ import { parseParams } from "./sceneKinds.js";
8
+ /** Reserved meta keys for the trigger vocabulary — action params use every other schema field. @internal */
9
+ export const TRIGGER_ON_KEY = "on";
10
+ /** @internal */
11
+ export const TRIGGER_ACTION_KEY = "action";
12
+ /** @internal */
13
+ export const TRIGGER_RADIUS_KEY = "triggerRadius";
14
+ /** @internal */
15
+ export const TRIGGER_LIST_KEY = "triggers";
16
+ const TRIGGER_EVENTS = ["enter", "exit", "interact"];
17
+ /** Default proximity radius (m) for marker enter/exit/interact when neither triggerRadius nor radius is set. @internal */
18
+ export const DEFAULT_TRIGGER_RADIUS = 2.5;
19
+ const actionRegistry = new Map();
20
+ /**
21
+ * Declare a game action the editor can assign to volume/marker triggers. Idempotent per `id`
22
+ * (last registration wins). Call at module load next to catalogs.
23
+ *
24
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
25
+ */
26
+ export function registerTriggerAction(definition) {
27
+ actionRegistry.set(definition.id, definition);
28
+ }
29
+ /** Registered definition for an action id, or undefined when the game never declared it. */
30
+ export function getTriggerAction(id) {
31
+ return actionRegistry.get(id);
32
+ }
33
+ /** Every registered action, optionally filtered by target collection. */
34
+ export function listTriggerActions(target) {
35
+ const all = [...actionRegistry.values()];
36
+ if (target === undefined)
37
+ return all;
38
+ return all.filter((definition) => definition.targets === undefined || definition.targets.includes(target));
39
+ }
40
+ /** Clears the action registry — tests only. @internal */
41
+ export function clearTriggerActions() {
42
+ actionRegistry.clear();
43
+ }
44
+ function isTriggerEvent(value) {
45
+ return typeof value === "string" && TRIGGER_EVENTS.includes(value);
46
+ }
47
+ function metaNumber(meta, key) {
48
+ const value = meta?.[key];
49
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
50
+ }
51
+ /** Resolve the proximity radius for a marker trigger from meta. @internal */
52
+ export function triggerRadiusOf(meta, fallback = DEFAULT_TRIGGER_RADIUS) {
53
+ const explicit = metaNumber(meta, TRIGGER_RADIUS_KEY) ?? metaNumber(meta, "radius");
54
+ if (explicit === undefined)
55
+ return fallback;
56
+ return Math.max(0, explicit);
57
+ }
58
+ function specsFromMeta(meta) {
59
+ if (meta === undefined)
60
+ return [];
61
+ const list = meta[TRIGGER_LIST_KEY];
62
+ if (Array.isArray(list)) {
63
+ if (list.length === 0) {
64
+ // Empty multi-list is the inspector's "cleared" sentinel — fall through to flat on/action.
65
+ }
66
+ else {
67
+ const out = [];
68
+ for (const entry of list) {
69
+ if (typeof entry !== "object" || entry === null)
70
+ continue;
71
+ const row = entry;
72
+ if (!isTriggerEvent(row[TRIGGER_ON_KEY]))
73
+ continue;
74
+ const action = row[TRIGGER_ACTION_KEY];
75
+ if (typeof action !== "string" || action.length === 0)
76
+ continue;
77
+ out.push({ on: row[TRIGGER_ON_KEY], action, paramsMeta: row });
78
+ }
79
+ return out;
80
+ }
81
+ }
82
+ if (!isTriggerEvent(meta[TRIGGER_ON_KEY]))
83
+ return [];
84
+ const action = meta[TRIGGER_ACTION_KEY];
85
+ if (typeof action !== "string" || action.length === 0)
86
+ return [];
87
+ return [{ on: meta[TRIGGER_ON_KEY], action, paramsMeta: meta }];
88
+ }
89
+ function resolveParams(actionId, paramsMeta) {
90
+ const definition = actionRegistry.get(actionId);
91
+ if (definition === undefined)
92
+ return {};
93
+ return parseParams(definition.schema, paramsMeta);
94
+ }
95
+ /**
96
+ * Read every valid `on`/`action` binding off a raw meta bag. Unknown events/actions are dropped;
97
+ * params are schema-parsed when the action is registered, else empty.
98
+ * @internal
99
+ */
100
+ export function readTriggerSpecs(meta) {
101
+ return specsFromMeta(meta).map((spec) => ({
102
+ on: spec.on,
103
+ action: spec.action,
104
+ params: resolveParams(spec.action, spec.paramsMeta),
105
+ }));
106
+ }
107
+ /**
108
+ * Collect every authored trigger on a document's markers and volumes. Pure — no runtime state.
109
+ * Action params use the live {@link registerTriggerAction} registry when present.
110
+ *
111
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
112
+ */
113
+ export function collectAuthoredTriggers(document) {
114
+ const out = [];
115
+ for (const marker of document.markers) {
116
+ const radius = triggerRadiusOf(marker.meta);
117
+ for (const spec of readTriggerSpecs(marker.meta)) {
118
+ out.push({
119
+ sourceId: marker.id,
120
+ sourceKind: "marker",
121
+ objectKind: marker.kind,
122
+ on: spec.on,
123
+ action: spec.action,
124
+ params: spec.params,
125
+ radius,
126
+ });
127
+ }
128
+ }
129
+ for (const volume of document.volumes) {
130
+ for (const spec of readTriggerSpecs(volume.meta)) {
131
+ out.push({
132
+ sourceId: volume.id,
133
+ sourceKind: "volume",
134
+ objectKind: volume.kind,
135
+ on: spec.on,
136
+ action: spec.action,
137
+ params: spec.params,
138
+ radius: 0,
139
+ });
140
+ }
141
+ }
142
+ return out;
143
+ }
144
+ /**
145
+ * True when `point` is inside an editor volume (sphere / cylinder / box). Cylinder height defaults
146
+ * to diameter when omitted; sphere ignores y for the common ground-plane case only when the volume
147
+ * radius covers the full vertical span — here y is tested for sphere and box too.
148
+ */
149
+ export function pointInVolume(volume, point) {
150
+ const dx = point.x - volume.center.x;
151
+ const dy = point.y - volume.center.y;
152
+ const dz = point.z - volume.center.z;
153
+ if (volume.shape === "box") {
154
+ const hx = volume.halfExtents?.x ?? 5;
155
+ const hy = volume.halfExtents?.y ?? 5;
156
+ const hz = volume.halfExtents?.z ?? 5;
157
+ return Math.abs(dx) <= hx && Math.abs(dy) <= hy && Math.abs(dz) <= hz;
158
+ }
159
+ const radius = volume.radius ?? 5;
160
+ if (volume.shape === "cylinder") {
161
+ const height = volume.height ?? radius * 2;
162
+ if (Math.hypot(dx, dz) > radius)
163
+ return false;
164
+ return Math.abs(dy) <= height / 2;
165
+ }
166
+ return Math.hypot(dx, dy, dz) <= radius;
167
+ }
168
+ /** True when `point` is within `radius` of a marker's position (sphere for enter/exit/interact). @internal */
169
+ export function pointNearMarker(marker, point, radius) {
170
+ const dx = point.x - marker.position.x;
171
+ const dy = point.y - marker.position.y;
172
+ const dz = point.z - marker.position.z;
173
+ return Math.hypot(dx, dy, dz) <= radius;
174
+ }
175
+ function membershipKey(sourceId, actorId) {
176
+ return `${sourceId}\0${actorId}`;
177
+ }
178
+ function actorPoint(actor) {
179
+ const p = actor.position;
180
+ if (Array.isArray(p))
181
+ return { x: p[0], y: p[1], z: p[2] };
182
+ return p;
183
+ }
184
+ function insideSource(document, trigger, point) {
185
+ if (trigger.sourceKind === "volume") {
186
+ const volume = document.volumes.find((entry) => entry.id === trigger.sourceId);
187
+ return volume !== undefined && pointInVolume(volume, point);
188
+ }
189
+ const marker = document.markers.find((entry) => entry.id === trigger.sourceId);
190
+ return marker !== undefined && pointNearMarker(marker, point, trigger.radius);
191
+ }
192
+ /**
193
+ * Build a runtime that watches a document's authored triggers against moving actors and dispatches
194
+ * to per-action handlers (and optional catch-all). Pure membership math; the game supplies actors
195
+ * each tick from its own player/entity poses.
196
+ *
197
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
198
+ */
199
+ export function createAuthoredTriggerRuntime(options) {
200
+ const document = options.document;
201
+ const triggers = options.triggers ?? collectAuthoredTriggers(document);
202
+ let members = new Set();
203
+ const sourceIds = new Map();
204
+ for (const trigger of triggers) {
205
+ const list = sourceIds.get(trigger.sourceId) ?? [];
206
+ list.push(trigger);
207
+ sourceIds.set(trigger.sourceId, list);
208
+ }
209
+ function emit(events) {
210
+ for (const event of events) {
211
+ options.handlers?.[event.action]?.(event);
212
+ options.onDispatch?.(event);
213
+ }
214
+ }
215
+ return {
216
+ triggers: () => triggers,
217
+ reset() {
218
+ members = new Set();
219
+ },
220
+ step(input) {
221
+ const next = new Set();
222
+ const insideNow = new Map();
223
+ for (const actor of input.actors) {
224
+ const point = actorPoint(actor);
225
+ for (const [sourceId, sourceTriggers] of sourceIds) {
226
+ const probe = sourceTriggers[0];
227
+ if (!insideSource(document, probe, point))
228
+ continue;
229
+ const key = membershipKey(sourceId, actor.id);
230
+ next.add(key);
231
+ let set = insideNow.get(sourceId);
232
+ if (set === undefined) {
233
+ set = new Set();
234
+ insideNow.set(sourceId, set);
235
+ }
236
+ set.add(actor.id);
237
+ }
238
+ }
239
+ const events = [];
240
+ for (const [sourceId, actorsInside] of insideNow) {
241
+ const sourceTriggers = sourceIds.get(sourceId) ?? [];
242
+ for (const actorId of actorsInside) {
243
+ const key = membershipKey(sourceId, actorId);
244
+ const wasInside = members.has(key);
245
+ if (!wasInside) {
246
+ for (const trigger of sourceTriggers) {
247
+ if (trigger.on !== "enter")
248
+ continue;
249
+ events.push({
250
+ on: "enter",
251
+ action: trigger.action,
252
+ sourceId: trigger.sourceId,
253
+ sourceKind: trigger.sourceKind,
254
+ objectKind: trigger.objectKind,
255
+ actorId,
256
+ params: trigger.params,
257
+ });
258
+ }
259
+ }
260
+ }
261
+ }
262
+ for (const key of members) {
263
+ if (next.has(key))
264
+ continue;
265
+ const sep = key.indexOf("\0");
266
+ const sourceId = key.slice(0, sep);
267
+ const actorId = key.slice(sep + 1);
268
+ for (const trigger of sourceIds.get(sourceId) ?? []) {
269
+ if (trigger.on !== "exit")
270
+ continue;
271
+ events.push({
272
+ on: "exit",
273
+ action: trigger.action,
274
+ sourceId: trigger.sourceId,
275
+ sourceKind: trigger.sourceKind,
276
+ objectKind: trigger.objectKind,
277
+ actorId,
278
+ params: trigger.params,
279
+ });
280
+ }
281
+ }
282
+ const interactActors = new Set(input.interact ?? []);
283
+ if (interactActors.size > 0) {
284
+ for (const actor of input.actors) {
285
+ if (!interactActors.has(actor.id))
286
+ continue;
287
+ const point = actorPoint(actor);
288
+ for (const sourceTriggers of sourceIds.values()) {
289
+ const probe = sourceTriggers[0];
290
+ if (!insideSource(document, probe, point))
291
+ continue;
292
+ for (const trigger of sourceTriggers) {
293
+ if (trigger.on !== "interact")
294
+ continue;
295
+ events.push({
296
+ on: "interact",
297
+ action: trigger.action,
298
+ sourceId: trigger.sourceId,
299
+ sourceKind: trigger.sourceKind,
300
+ objectKind: trigger.objectKind,
301
+ actorId: actor.id,
302
+ params: trigger.params,
303
+ });
304
+ }
305
+ }
306
+ }
307
+ }
308
+ members = next;
309
+ emit(events);
310
+ return events;
311
+ },
312
+ };
313
+ }
314
+ /**
315
+ * Build a meta patch that sets a single flat trigger (`on` + `action` + optional param fields) and
316
+ * clears a multi-trigger list if present. Used by the editor inspector.
317
+ * @internal
318
+ */
319
+ export function triggerMetaPatch(on, action, params = {}) {
320
+ if (on === "" || action.length === 0) {
321
+ return { [TRIGGER_ON_KEY]: undefined, [TRIGGER_ACTION_KEY]: undefined, [TRIGGER_LIST_KEY]: undefined };
322
+ }
323
+ return {
324
+ [TRIGGER_ON_KEY]: on,
325
+ [TRIGGER_ACTION_KEY]: action,
326
+ [TRIGGER_LIST_KEY]: undefined,
327
+ ...params,
328
+ };
329
+ }
330
+ /** Read the single flat trigger (`on`/`action`) from meta for the inspector, ignoring non-empty multi-lists. @internal */
331
+ export function readFlatTrigger(meta) {
332
+ if (meta === undefined)
333
+ return { on: "", action: "" };
334
+ const list = meta[TRIGGER_LIST_KEY];
335
+ if (Array.isArray(list) && list.length > 0)
336
+ return { on: "", action: "" };
337
+ const on = isTriggerEvent(meta[TRIGGER_ON_KEY]) ? meta[TRIGGER_ON_KEY] : "";
338
+ const action = typeof meta[TRIGGER_ACTION_KEY] === "string" ? meta[TRIGGER_ACTION_KEY] : "";
339
+ return { on, action };
340
+ }
@@ -0,0 +1,75 @@
1
+ import { type PathFollowState, type PathProgress, type Waypoint } from "../nav/pathFollow.js";
2
+ import type { GameContext } from "../runtime/gameContext.js";
3
+ /** Whether a behavior instance advances and writes pose (`active`), is temporarily suspended retaining
4
+ * state (`paused`), or is held off until re-enabled (`disabled`). */
5
+ export type BehaviorStatus = "active" | "paused" | "disabled";
6
+ /**
7
+ * Catch-up policy applied when a paused instance resumes. `freeze` (default, deterministic) discards
8
+ * the time spent paused; `advance` silently fast-forwards the instance by the paused duration without
9
+ * emitting intermediate pose writes. Only patrol honors `advance`; wander treats it as `freeze`.
10
+ */
11
+ export type BehaviorResumePolicy = "freeze" | "advance";
12
+ /** Serializable snapshot of one behavior instance — round-trips exactly through
13
+ * {@link BehaviorControl.serialize}/{@link BehaviorControl.restore}. */
14
+ export type BehaviorSnapshot = {
15
+ readonly kind: "patrol";
16
+ readonly state: PathFollowState;
17
+ } | {
18
+ readonly kind: "wander";
19
+ readonly origin: Waypoint;
20
+ readonly target: Waypoint | null;
21
+ };
22
+ /** Inspection readout for editor/debug tooling, from {@link BehaviorControl.inspect}/{@link BehaviorControl.list}. */
23
+ export interface BehaviorInspection {
24
+ id: string;
25
+ kind: "patrol" | "wander";
26
+ status: BehaviorStatus;
27
+ reason: string | null;
28
+ }
29
+ /**
30
+ * Per-entity control surface for the behavior runtime — pause/resume/disable/enable an instance,
31
+ * seek it to semantic progress, serialize/restore its state, and inspect it, all keyed by stable
32
+ * entity id without a full-world scan. Obtain it with {@link behaviorControl}.
33
+ */
34
+ export interface BehaviorControl {
35
+ /** Current status of the instance, or `null` if the entity has no live behavior. */
36
+ status(id: string): BehaviorStatus | null;
37
+ /** Human-readable reason attached to the last pause/disable, or `null`. */
38
+ reason(id: string): string | null;
39
+ /** Suspend advancement and pose writes, retaining state. No-op (`false`) if not active. */
40
+ pause(id: string, reason?: string): boolean;
41
+ /** Resume a paused instance, applying the catch-up `policy` (default `freeze`). */
42
+ resume(id: string, policy?: BehaviorResumePolicy): boolean;
43
+ /** Hold the instance off (no advance, no pose) until {@link enable}. Retains state. */
44
+ disable(id: string, reason?: string): boolean;
45
+ /** Re-activate a disabled instance from its retained state (no catch-up). */
46
+ enable(id: string): boolean;
47
+ /** Jump a patrol instance to semantic {@link PathProgress}. Returns `false` for non-patrol instances. */
48
+ seek(id: string, progress: PathProgress): boolean;
49
+ /** Capture the instance's exact serializable state, or `null` if absent. */
50
+ serialize(id: string): BehaviorSnapshot | null;
51
+ /** Restore an instance from a {@link BehaviorSnapshot} of the matching kind. */
52
+ restore(id: string, snapshot: BehaviorSnapshot): boolean;
53
+ /** Inspect one instance, or `null` if absent. */
54
+ inspect(id: string): BehaviorInspection | null;
55
+ /** Inspect every live instance (bounded by spawned behavior entities). */
56
+ list(): BehaviorInspection[];
57
+ }
58
+ /**
59
+ * Advance every spawned entity carrying a `patrol` or `wander` {@link BehaviorDescriptor} one tick — the
60
+ * engine reads the descriptor, keeps the per-entity nav state itself, and poses the entity, so ambient
61
+ * traffic and idle NPC routes are register-once (attach the behavior at spawn) instead of a per-game
62
+ * per-frame `advancePathFollow` + `setPose` loop. Instances that are paused or disabled through
63
+ * {@link behaviorControl} retain their state and are skipped. The shell/host call this each frame; a game never does.
64
+ *
65
+ * @capability behavior-tick auto-advance patrol/wander behaviors on spawned entities, no per-game route loop
66
+ */
67
+ export declare function advanceBehaviors(ctx: GameContext, dt: number): void;
68
+ /**
69
+ * Obtain the per-context {@link BehaviorControl} surface for suspending, resuming, seeking, serializing,
70
+ * and inspecting behavior instances by entity id — the lifecycle contract games use to hand pose
71
+ * ownership to possession/streaming/staggering code instead of bypassing the behavior runtime.
72
+ *
73
+ * @capability behavior-control pause/disable/resume/seek/inspect behavior instances per entity
74
+ */
75
+ export declare function behaviorControl(ctx: GameContext): BehaviorControl;