@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
@@ -11,6 +11,11 @@ export interface StaggerMeter {
11
11
  recover(): void;
12
12
  tick(dtSeconds: number): void;
13
13
  }
14
+ /**
15
+ * Build a stagger/poise gauge from landed hits toward a break threshold that staggers the target.
16
+ *
17
+ * @capability stagger-meter build toward a stagger/poise-break threshold from landed hits
18
+ */
14
19
  export declare function createStaggerMeter(config: StaggerMeterConfig): StaggerMeter;
15
20
  export interface BuildupMeterConfig {
16
21
  status: string;
@@ -29,4 +34,9 @@ export interface BuildupMeter {
29
34
  fraction(): number;
30
35
  tick(dtSeconds: number): void;
31
36
  }
37
+ /**
38
+ * Accumulate an ailment buildup — bleed, freeze, poison — that procs a status once it fills, then decays.
39
+ *
40
+ * @capability stagger-meter accumulate an ailment buildup (bleed, freeze) until it procs
41
+ */
32
42
  export declare function createBuildupMeter(config: BuildupMeterConfig): BuildupMeter;
@@ -1,4 +1,9 @@
1
1
  import { createAccumulatorMeter } from "../stats/accumulatorMeter.js";
2
+ /**
3
+ * Build a stagger/poise gauge from landed hits toward a break threshold that staggers the target.
4
+ *
5
+ * @capability stagger-meter build toward a stagger/poise-break threshold from landed hits
6
+ */
2
7
  export function createStaggerMeter(config) {
3
8
  const meter = createAccumulatorMeter({
4
9
  max: config.max,
@@ -27,6 +32,11 @@ export function createStaggerMeter(config) {
27
32
  },
28
33
  };
29
34
  }
35
+ /**
36
+ * Accumulate an ailment buildup — bleed, freeze, poison — that procs a status once it fills, then decays.
37
+ *
38
+ * @capability stagger-meter accumulate an ailment buildup (bleed, freeze) until it procs
39
+ */
30
40
  export function createBuildupMeter(config) {
31
41
  const meter = createAccumulatorMeter({
32
42
  max: config.max,
@@ -37,4 +37,9 @@ export interface CastRunner {
37
37
  /** Advance by `dtSeconds`; `movedDistance` accumulates toward the config's `moveTolerance`. */
38
38
  tick(dtSeconds: number, movedDistance?: number): CastEvent | null;
39
39
  }
40
+ /**
41
+ * Run a channeled cast/charge timer that movement or damage can interrupt — the spell cast bar.
42
+ *
43
+ * @capability cast-bar run a channeled cast timer that movement or damage can interrupt
44
+ */
40
45
  export declare function createCastRunner(): CastRunner;
@@ -1,4 +1,9 @@
1
1
  const DEFAULT_MOVE_TOLERANCE = 0.04;
2
+ /**
3
+ * Run a channeled cast/charge timer that movement or damage can interrupt — the spell cast bar.
4
+ *
5
+ * @capability cast-bar run a channeled cast timer that movement or damage can interrupt
6
+ */
2
7
  export function createCastRunner() {
3
8
  let active = null;
4
9
  function snapshot() {
@@ -11,4 +11,9 @@ export interface ComboPoints {
11
11
  expiresIn(): number | null;
12
12
  clear(): void;
13
13
  }
14
+ /**
15
+ * Build and spend finisher points — the combo-point economy behind rogue-style builders and spenders.
16
+ *
17
+ * @capability combo-points build up and spend finisher/combo points
18
+ */
14
19
  export declare function createComboPoints(config: ComboPointsConfig): ComboPoints;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Build and spend finisher points — the combo-point economy behind rogue-style builders and spenders.
3
+ *
4
+ * @capability combo-points build up and spend finisher/combo points
5
+ */
1
6
  export function createComboPoints(config) {
2
7
  const max = config.max;
3
8
  const expireAfterSeconds = config.expireAfterSeconds;
@@ -32,4 +32,9 @@ export interface ComboRunner {
32
32
  request(stepId: string, stance?: string): AdvanceComboResult;
33
33
  reset(): void;
34
34
  }
35
+ /**
36
+ * Advance a chained melee string from timed inputs, tracking the current step and its cancel/continue windows.
37
+ *
38
+ * @capability combo-chain advance a chained melee string from timed button inputs
39
+ */
35
40
  export declare function createComboRunner(combo: ComboString, anim: AnimationState): ComboRunner;
@@ -32,6 +32,11 @@ export function advanceCombo(input) {
32
32
  }
33
33
  return { accepted: true, step: requested };
34
34
  }
35
+ /**
36
+ * Advance a chained melee string from timed inputs, tracking the current step and its cancel/continue windows.
37
+ *
38
+ * @capability combo-chain advance a chained melee string from timed button inputs
39
+ */
35
40
  export function createComboRunner(combo, anim) {
36
41
  let current = null;
37
42
  return {
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Ordered, inspectable damage-resolution interception (#931).
3
+ *
4
+ * A pending damage application flows through an ordered list of interceptors
5
+ * BEFORE lethality is resolved. Each interceptor may pass, transform, clamp,
6
+ * redirect, split, defer, or reject the application, and every decision is
7
+ * recorded as provenance so combat resolution stays auditable — no hidden
8
+ * callbacks. Invulnerability, i-frames, and anti-one-shot clamps are ordinary
9
+ * interceptors installed and removed by state transitions, not a boss branch.
10
+ *
11
+ * All state is serializable (`Record<string, number>` maps), all randomness is
12
+ * absent (pure), and work is bounded by `MAX_INTERCEPT_STEPS` so split/redirect
13
+ * can never recurse without limit.
14
+ */
15
+ /** A damage application queued for resolution against a target. `amount` is always non-negative; healing is a separate concern. */
16
+ export interface PendingDamage {
17
+ /** Instance receiving the damage. */
18
+ target: string;
19
+ /** Instance dealing the damage. */
20
+ source: string;
21
+ /** Damage magnitude, non-negative. */
22
+ amount: number;
23
+ /** Optional caller tag (weapon id, effect id, channel) carried through for provenance and downstream routing. */
24
+ tag?: string;
25
+ }
26
+ /**
27
+ * What an interceptor decides to do with the pending application it was handed.
28
+ * `split` parts continue at the NEXT interceptor (never re-entering the splitter),
29
+ * which is what keeps the pipeline bounded and recursion-free.
30
+ */
31
+ export type InterceptDecision = {
32
+ kind: "pass";
33
+ } | {
34
+ kind: "transform";
35
+ amount: number;
36
+ note?: string;
37
+ } | {
38
+ kind: "clamp";
39
+ max: number;
40
+ note?: string;
41
+ } | {
42
+ kind: "redirect";
43
+ target: string;
44
+ note?: string;
45
+ } | {
46
+ kind: "split";
47
+ parts: readonly PendingDamage[];
48
+ note?: string;
49
+ } | {
50
+ kind: "defer";
51
+ note?: string;
52
+ } | {
53
+ kind: "reject";
54
+ note?: string;
55
+ };
56
+ /** Read-only context an interceptor may consult — deterministic clock and optional health lookup for HP-relative policies. */
57
+ export interface InterceptContext {
58
+ /** Deterministic current time in milliseconds; interceptors never read a wall clock. */
59
+ nowMs: number;
60
+ /** Optional current/max pool lookup for the target, enabling HP-relative clamps like anti-one-shot. */
61
+ healthOf?(target: string): {
62
+ current: number;
63
+ max: number;
64
+ } | undefined;
65
+ }
66
+ /** A named stage in the interception pipeline. The `id` is stable so it can be installed, removed, and cited in provenance. */
67
+ export interface DamageInterceptor {
68
+ /** Stable identifier used for install/remove and provenance. */
69
+ id: string;
70
+ /** Decide what happens to `pending`; must be deterministic given `ctx`. */
71
+ intercept(pending: PendingDamage, ctx: InterceptContext): InterceptDecision;
72
+ }
73
+ /** One row of provenance: which interceptor acted, what it decided, and the amount before/after it acted. */
74
+ export interface InterceptRecord {
75
+ interceptor: string;
76
+ kind: InterceptDecision["kind"];
77
+ target: string;
78
+ before: number;
79
+ after: number;
80
+ note?: string;
81
+ }
82
+ /** The outcome of running a pending application through the pipeline: what to apply, what was deferred, and why each value changed. */
83
+ export interface DamageResolution {
84
+ /** Final applications to commit (0..n after splits/rejections). */
85
+ applications: PendingDamage[];
86
+ /** Applications held back by a `defer` decision for the caller to resubmit later. */
87
+ deferred: PendingDamage[];
88
+ /** Ordered record of every interceptor decision. */
89
+ provenance: InterceptRecord[];
90
+ }
91
+ /** Upper bound on interceptor evaluations for a single resolution; guards against runaway `split`/`redirect` loops. */
92
+ export declare const MAX_INTERCEPT_STEPS = 256;
93
+ /**
94
+ * Run one pending damage application through an ordered interceptor list before
95
+ * lethality resolves, returning the final applications, any deferred ones, and
96
+ * full provenance. Pure and deterministic; bounded by `MAX_INTERCEPT_STEPS`.
97
+ *
98
+ * @capability damage-interception intercept a pending damage application before lethal resolution with ordered, inspectable stages
99
+ */
100
+ export declare function resolveDamage(interceptors: readonly DamageInterceptor[], pending: PendingDamage, ctx: InterceptContext): DamageResolution;
101
+ /** A mutable ordered interceptor chain that transitions can install into and remove from at runtime. */
102
+ export interface DamagePipeline {
103
+ /** Append an interceptor, or replace an existing one with the same `id` in place. */
104
+ install(interceptor: DamageInterceptor): void;
105
+ /** Remove the interceptor with `id`; returns whether one was removed. */
106
+ remove(id: string): boolean;
107
+ /** Whether an interceptor with `id` is currently installed. */
108
+ has(id: string): boolean;
109
+ /** Installed interceptor ids in evaluation order (serializable install record). */
110
+ interceptorIds(): string[];
111
+ /** Resolve one pending application through the current chain. */
112
+ resolve(pending: PendingDamage, ctx: InterceptContext): DamageResolution;
113
+ }
114
+ /**
115
+ * Create a mutable damage interception chain that state transitions install into
116
+ * and remove from — e.g. add an invulnerability interceptor on phase enter and
117
+ * drop it on phase exit. Evaluation order is install order.
118
+ *
119
+ * @capability damage-pipeline install and remove ordered damage interceptors that transitions toggle at runtime
120
+ */
121
+ export declare function createDamagePipeline(initial?: readonly DamageInterceptor[]): DamagePipeline;
122
+ /** Caller data for a flat per-hit damage cap. */
123
+ export interface DamageClampConfig {
124
+ /** Interceptor id; defaults to `"damage-clamp"`. */
125
+ id?: string;
126
+ /** Maximum damage a single application may carry. */
127
+ maxPerHit: number;
128
+ }
129
+ /**
130
+ * A stateless interceptor that caps any single application at `maxPerHit`.
131
+ *
132
+ * @capability damage-clamp cap incoming damage per hit at a configured maximum
133
+ */
134
+ export declare function createDamageClamp(config: DamageClampConfig): DamageInterceptor;
135
+ /** A per-target timed immunity policy: an interceptor plus grant/query/serialize controls, toggled by transitions. */
136
+ export interface ImmunityWindow {
137
+ /** The interceptor to install; rejects damage to any target whose immunity has not expired. */
138
+ interceptor: DamageInterceptor;
139
+ /** Make `target` immune until `untilMs` (extends, never shortens, an existing window). */
140
+ grant(target: string, untilMs: number): void;
141
+ /** Make `target` immune for `durationMs` starting at `nowMs`. */
142
+ grantFor(target: string, nowMs: number, durationMs: number): void;
143
+ /** Whether `target` is immune at `nowMs`. */
144
+ active(target: string, nowMs: number): boolean;
145
+ /** Drop `target`'s immunity immediately. */
146
+ clear(target: string): void;
147
+ /** Drop every window that has expired at `nowMs` (bounded housekeeping for save size). */
148
+ clearExpired(nowMs: number): void;
149
+ /** Serializable snapshot: target → expiry ms. */
150
+ snapshot(): Record<string, number>;
151
+ /** Restore from a snapshot. */
152
+ restore(snap: Record<string, number>): void;
153
+ }
154
+ /**
155
+ * A per-target immunity/invulnerability window as an ordinary damage policy —
156
+ * granted and cleared by state transitions (i-frames, phase invuln), rejecting
157
+ * damage while active. Deterministic (time is passed in) and serializable.
158
+ *
159
+ * @capability immunity-window reject damage during a per-target invulnerability window installed by transitions
160
+ */
161
+ export declare function createImmunityWindow(id?: string): ImmunityWindow;
162
+ /** Caller data for the anti-one-shot composition: "cannot cross lethal while above X, leave Y, then recover for Z". */
163
+ export interface AntiOneShotConfig {
164
+ /** Interceptor id; defaults to `"anti-one-shot"`. */
165
+ id?: string;
166
+ /** Only intervene when the target's HP fraction is strictly above this (X). Below it, lethal hits pass. */
167
+ guardAboveFraction: number;
168
+ /** HP fraction to leave the target at after an intercepted near-lethal hit (Y). */
169
+ leaveFraction: number;
170
+ /** Immunity granted after an intercepted hit, in milliseconds (Z). */
171
+ recoverMs: number;
172
+ }
173
+ /** The anti-one-shot policy: an interceptor plus its serializable recovery-immunity state. */
174
+ export interface AntiOneShotPolicy {
175
+ /** The interceptor to install ahead of lethal resolution. */
176
+ interceptor: DamageInterceptor;
177
+ /** Whether `target` is in the post-hit recovery i-frame at `nowMs`. */
178
+ immune(target: string, nowMs: number): boolean;
179
+ /** Serializable snapshot: target → recovery expiry ms. */
180
+ snapshot(): Record<string, number>;
181
+ /** Restore from a snapshot. */
182
+ restore(snap: Record<string, number>): void;
183
+ }
184
+ /**
185
+ * Compose a reusable anti-one-shot / chip-guard clamp from caller data:
186
+ * while above `guardAboveFraction` a hit cannot drop the target below
187
+ * `leaveFraction`, and after such a save the target gets `recoverMs` of
188
+ * immunity. Below the guard fraction, lethal hits pass unchanged.
189
+ *
190
+ * @capability anti-one-shot clamp a near-lethal hit to leave a health floor then grant recovery immunity
191
+ */
192
+ export declare function createAntiOneShotPolicy(config: AntiOneShotConfig): AntiOneShotPolicy;
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Ordered, inspectable damage-resolution interception (#931).
3
+ *
4
+ * A pending damage application flows through an ordered list of interceptors
5
+ * BEFORE lethality is resolved. Each interceptor may pass, transform, clamp,
6
+ * redirect, split, defer, or reject the application, and every decision is
7
+ * recorded as provenance so combat resolution stays auditable — no hidden
8
+ * callbacks. Invulnerability, i-frames, and anti-one-shot clamps are ordinary
9
+ * interceptors installed and removed by state transitions, not a boss branch.
10
+ *
11
+ * All state is serializable (`Record<string, number>` maps), all randomness is
12
+ * absent (pure), and work is bounded by `MAX_INTERCEPT_STEPS` so split/redirect
13
+ * can never recurse without limit.
14
+ */
15
+ /** Upper bound on interceptor evaluations for a single resolution; guards against runaway `split`/`redirect` loops. */
16
+ export const MAX_INTERCEPT_STEPS = 256;
17
+ /**
18
+ * Run one pending damage application through an ordered interceptor list before
19
+ * lethality resolves, returning the final applications, any deferred ones, and
20
+ * full provenance. Pure and deterministic; bounded by `MAX_INTERCEPT_STEPS`.
21
+ *
22
+ * @capability damage-interception intercept a pending damage application before lethal resolution with ordered, inspectable stages
23
+ */
24
+ export function resolveDamage(interceptors, pending, ctx) {
25
+ const applications = [];
26
+ const deferred = [];
27
+ const provenance = [];
28
+ const queue = [{ pending: normalize(pending), next: 0 }];
29
+ let steps = 0;
30
+ while (queue.length > 0) {
31
+ if (++steps > MAX_INTERCEPT_STEPS)
32
+ break;
33
+ const item = queue.shift();
34
+ if (item === undefined)
35
+ break;
36
+ if (item.next >= interceptors.length) {
37
+ applications.push(item.pending);
38
+ continue;
39
+ }
40
+ const interceptor = interceptors[item.next];
41
+ if (interceptor === undefined) {
42
+ applications.push(item.pending);
43
+ continue;
44
+ }
45
+ const current = item.pending;
46
+ const interceptorId = interceptor.id;
47
+ const decision = interceptor.intercept(current, ctx);
48
+ const before = current.amount;
49
+ function record(after, note) {
50
+ const row = {
51
+ interceptor: interceptorId,
52
+ kind: decision.kind,
53
+ target: current.target,
54
+ before,
55
+ after,
56
+ };
57
+ if (note !== undefined)
58
+ row.note = note;
59
+ provenance.push(row);
60
+ }
61
+ const nextIndex = item.next + 1;
62
+ switch (decision.kind) {
63
+ case "pass":
64
+ record(before);
65
+ queue.push({ pending: current, next: nextIndex });
66
+ break;
67
+ case "transform": {
68
+ const amount = Math.max(0, decision.amount);
69
+ record(amount, decision.note);
70
+ queue.push({ pending: { ...current, amount }, next: nextIndex });
71
+ break;
72
+ }
73
+ case "clamp": {
74
+ const amount = Math.min(current.amount, Math.max(0, decision.max));
75
+ record(amount, decision.note);
76
+ queue.push({ pending: { ...current, amount }, next: nextIndex });
77
+ break;
78
+ }
79
+ case "redirect":
80
+ record(before, decision.note);
81
+ queue.push({ pending: { ...current, target: decision.target }, next: nextIndex });
82
+ break;
83
+ case "split":
84
+ record(before, decision.note);
85
+ for (const part of decision.parts)
86
+ queue.push({ pending: normalize(part), next: nextIndex });
87
+ break;
88
+ case "defer":
89
+ record(before, decision.note);
90
+ deferred.push(current);
91
+ break;
92
+ case "reject":
93
+ record(0, decision.note);
94
+ break;
95
+ }
96
+ }
97
+ return { applications, deferred, provenance };
98
+ }
99
+ function normalize(pending) {
100
+ return pending.amount >= 0 ? pending : { ...pending, amount: 0 };
101
+ }
102
+ /**
103
+ * Create a mutable damage interception chain that state transitions install into
104
+ * and remove from — e.g. add an invulnerability interceptor on phase enter and
105
+ * drop it on phase exit. Evaluation order is install order.
106
+ *
107
+ * @capability damage-pipeline install and remove ordered damage interceptors that transitions toggle at runtime
108
+ */
109
+ export function createDamagePipeline(initial) {
110
+ const interceptors = initial === undefined ? [] : [...initial];
111
+ function indexOf(id) {
112
+ return interceptors.findIndex((entry) => entry.id === id);
113
+ }
114
+ return {
115
+ install(interceptor) {
116
+ const idx = indexOf(interceptor.id);
117
+ if (idx >= 0)
118
+ interceptors[idx] = interceptor;
119
+ else
120
+ interceptors.push(interceptor);
121
+ },
122
+ remove(id) {
123
+ const idx = indexOf(id);
124
+ if (idx < 0)
125
+ return false;
126
+ interceptors.splice(idx, 1);
127
+ return true;
128
+ },
129
+ has(id) {
130
+ return indexOf(id) >= 0;
131
+ },
132
+ interceptorIds() {
133
+ return interceptors.map((entry) => entry.id);
134
+ },
135
+ resolve(pending, ctx) {
136
+ return resolveDamage(interceptors, pending, ctx);
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * A stateless interceptor that caps any single application at `maxPerHit`.
142
+ *
143
+ * @capability damage-clamp cap incoming damage per hit at a configured maximum
144
+ */
145
+ export function createDamageClamp(config) {
146
+ const id = config.id ?? "damage-clamp";
147
+ return {
148
+ id,
149
+ intercept(pending) {
150
+ if (pending.amount <= config.maxPerHit)
151
+ return { kind: "pass" };
152
+ return { kind: "clamp", max: config.maxPerHit, note: `capped at ${config.maxPerHit}` };
153
+ },
154
+ };
155
+ }
156
+ /**
157
+ * A per-target immunity/invulnerability window as an ordinary damage policy —
158
+ * granted and cleared by state transitions (i-frames, phase invuln), rejecting
159
+ * damage while active. Deterministic (time is passed in) and serializable.
160
+ *
161
+ * @capability immunity-window reject damage during a per-target invulnerability window installed by transitions
162
+ */
163
+ export function createImmunityWindow(id = "immunity") {
164
+ const until = new Map();
165
+ const window = {
166
+ interceptor: {
167
+ id,
168
+ intercept(pending, ctx) {
169
+ const expiry = until.get(pending.target);
170
+ if (expiry !== undefined && ctx.nowMs < expiry)
171
+ return { kind: "reject", note: `immune until ${expiry}` };
172
+ return { kind: "pass" };
173
+ },
174
+ },
175
+ grant(target, untilMs) {
176
+ const prev = until.get(target);
177
+ until.set(target, prev === undefined ? untilMs : Math.max(prev, untilMs));
178
+ },
179
+ grantFor(target, nowMs, durationMs) {
180
+ window.grant(target, nowMs + durationMs);
181
+ },
182
+ active(target, nowMs) {
183
+ const expiry = until.get(target);
184
+ return expiry !== undefined && nowMs < expiry;
185
+ },
186
+ clear(target) {
187
+ until.delete(target);
188
+ },
189
+ clearExpired(nowMs) {
190
+ for (const [target, expiry] of [...until])
191
+ if (nowMs >= expiry)
192
+ until.delete(target);
193
+ },
194
+ snapshot() {
195
+ return Object.fromEntries(until);
196
+ },
197
+ restore(snap) {
198
+ until.clear();
199
+ for (const [target, expiry] of Object.entries(snap))
200
+ until.set(target, expiry);
201
+ },
202
+ };
203
+ return window;
204
+ }
205
+ /**
206
+ * Compose a reusable anti-one-shot / chip-guard clamp from caller data:
207
+ * while above `guardAboveFraction` a hit cannot drop the target below
208
+ * `leaveFraction`, and after such a save the target gets `recoverMs` of
209
+ * immunity. Below the guard fraction, lethal hits pass unchanged.
210
+ *
211
+ * @capability anti-one-shot clamp a near-lethal hit to leave a health floor then grant recovery immunity
212
+ */
213
+ export function createAntiOneShotPolicy(config) {
214
+ const id = config.id ?? "anti-one-shot";
215
+ const immuneUntil = new Map();
216
+ const policy = {
217
+ interceptor: {
218
+ id,
219
+ intercept(pending, ctx) {
220
+ const expiry = immuneUntil.get(pending.target);
221
+ if (expiry !== undefined && ctx.nowMs < expiry)
222
+ return { kind: "reject", note: "anti-one-shot i-frame" };
223
+ const hp = ctx.healthOf?.(pending.target);
224
+ if (hp === undefined || hp.max <= 0)
225
+ return { kind: "pass" };
226
+ const fraction = hp.current / hp.max;
227
+ if (fraction <= config.guardAboveFraction)
228
+ return { kind: "pass" };
229
+ const floor = config.leaveFraction * hp.max;
230
+ if (hp.current - pending.amount >= floor)
231
+ return { kind: "pass" };
232
+ const clamped = Math.max(0, hp.current - floor);
233
+ immuneUntil.set(pending.target, ctx.nowMs + config.recoverMs);
234
+ return { kind: "clamp", max: clamped, note: `anti-one-shot: leave ${floor}, recover ${config.recoverMs}ms` };
235
+ },
236
+ },
237
+ immune(target, nowMs) {
238
+ const expiry = immuneUntil.get(target);
239
+ return expiry !== undefined && nowMs < expiry;
240
+ },
241
+ snapshot() {
242
+ return Object.fromEntries(immuneUntil);
243
+ },
244
+ restore(snap) {
245
+ immuneUntil.clear();
246
+ for (const [target, expiry] of Object.entries(snap))
247
+ immuneUntil.set(target, expiry);
248
+ },
249
+ };
250
+ return policy;
251
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Caller-owned id for a damage channel — `"fire"`, `"ballistic"`, `"physical"`, `"corrosive"`.
3
+ * The engine never branches on the value; a channel is whatever a game's data declares.
4
+ */
5
+ export type DamageChannelId = string;
6
+ /**
7
+ * Caller-owned id for a target trait — `"armored"`, `"fleshy"`, `"wet"`, `"boss"`.
8
+ * Traits are the receiver-side facets a matchup scores a channel against.
9
+ */
10
+ export type TargetTraitId = string;
11
+ /**
12
+ * The independent, typed outputs a channel-vs-trait matchup can scale. Every field is an
13
+ * optional multiplier that defaults to `1` (identity), so a matchup entry names only the axes
14
+ * it bends. `impact` scales the direct hit, `applyChance` the odds a status lands, `magnitude`
15
+ * and `duration` the applied status itself, and `extra` carries any further caller-defined
16
+ * scalar (knockback, stagger, heat) the engine forwards without interpreting.
17
+ */
18
+ export interface MatchupOutputs {
19
+ /** Multiplier on direct impact magnitude. */
20
+ impact?: number;
21
+ /** Multiplier on status application probability. */
22
+ applyChance?: number;
23
+ /** Multiplier on applied status magnitude (e.g. damage per tick). */
24
+ magnitude?: number;
25
+ /** Multiplier on applied status duration/ticks. */
26
+ duration?: number;
27
+ /** Caller-defined extra scalar outputs, multiplied per axis like the named ones. */
28
+ extra?: Record<string, number>;
29
+ }
30
+ /**
31
+ * A serializable, data-defined matchup table: `channel → trait → outputs`. When a hit's channel
32
+ * meets a target carrying several traits, every matching entry's outputs multiply together, so
33
+ * axes compose independently (a trait can halve impact yet double status duration). `default`
34
+ * applies for a channel/trait pair the table does not mention.
35
+ */
36
+ export interface DamageMatchup<TChannel extends string = DamageChannelId, TTrait extends string = TargetTraitId> {
37
+ /** Channel keyed to a per-trait outputs table. */
38
+ entries: Partial<Record<TChannel, Partial<Record<TTrait, MatchupOutputs>>>>;
39
+ /** Outputs used when no listed trait matches the channel; identity when omitted. */
40
+ default?: MatchupOutputs;
41
+ }
42
+ /** One `(trait → outputs)` pair that contributed to a resolved matchup — provenance for UI/debug. */
43
+ export interface MatchupContribution {
44
+ trait: TargetTraitId;
45
+ outputs: MatchupOutputs;
46
+ }
47
+ /** Fully-resolved matchup outputs (every axis populated) plus the contributions that produced them. */
48
+ export interface ResolvedMatchup {
49
+ channel: DamageChannelId;
50
+ impact: number;
51
+ applyChance: number;
52
+ magnitude: number;
53
+ duration: number;
54
+ /** Extra scalar outputs, each defaulting to 1 unless a contribution set it. */
55
+ extra: Record<string, number>;
56
+ /** Whether at least one listed trait matched (false means `default`/identity was used). */
57
+ matched: boolean;
58
+ contributions: MatchupContribution[];
59
+ }
60
+ /**
61
+ * Resolve a channel against a target's traits into independent, multiplied outputs. Pure and
62
+ * order-independent: every trait the channel has an entry for contributes, its axes multiplying
63
+ * into the running product; unmatched traits are skipped, and when nothing matches the table's
64
+ * `default` (or identity) is used. Bounded by the trait count — no world scan.
65
+ *
66
+ * @capability damage-matchup score a data-defined damage channel against a target's traits into independent typed multipliers
67
+ */
68
+ export declare function resolveMatchup<TChannel extends string = DamageChannelId, TTrait extends string = TargetTraitId>(matchup: DamageMatchup<TChannel, TTrait>, channel: TChannel | string, targetTraits: readonly (TTrait | string)[]): ResolvedMatchup;
@@ -0,0 +1,42 @@
1
+ function multiplyInto(acc, outputs) {
2
+ if (outputs.impact !== undefined)
3
+ acc.impact *= outputs.impact;
4
+ if (outputs.applyChance !== undefined)
5
+ acc.applyChance *= outputs.applyChance;
6
+ if (outputs.magnitude !== undefined)
7
+ acc.magnitude *= outputs.magnitude;
8
+ if (outputs.duration !== undefined)
9
+ acc.duration *= outputs.duration;
10
+ if (outputs.extra !== undefined) {
11
+ for (const [key, value] of Object.entries(outputs.extra)) {
12
+ acc.extra[key] = (acc.extra[key] ?? 1) * value;
13
+ }
14
+ }
15
+ }
16
+ /**
17
+ * Resolve a channel against a target's traits into independent, multiplied outputs. Pure and
18
+ * order-independent: every trait the channel has an entry for contributes, its axes multiplying
19
+ * into the running product; unmatched traits are skipped, and when nothing matches the table's
20
+ * `default` (or identity) is used. Bounded by the trait count — no world scan.
21
+ *
22
+ * @capability damage-matchup score a data-defined damage channel against a target's traits into independent typed multipliers
23
+ */
24
+ export function resolveMatchup(matchup, channel, targetTraits) {
25
+ const acc = { impact: 1, applyChance: 1, magnitude: 1, duration: 1, extra: {} };
26
+ const contributions = [];
27
+ const byTrait = matchup.entries[channel];
28
+ if (byTrait !== undefined) {
29
+ for (const trait of targetTraits) {
30
+ const outputs = byTrait[trait];
31
+ if (outputs === undefined)
32
+ continue;
33
+ multiplyInto(acc, outputs);
34
+ contributions.push({ trait, outputs });
35
+ }
36
+ }
37
+ const matched = contributions.length > 0;
38
+ if (!matched && matchup.default !== undefined) {
39
+ multiplyInto(acc, matchup.default);
40
+ }
41
+ return { channel, ...acc, matched, contributions };
42
+ }