@jgengine/core 0.10.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 (607) hide show
  1. package/CHANGELOG.md +13 -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/spawnDirector.d.ts +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  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/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -32,6 +32,7 @@ export interface DecayMeterState {
32
32
  /** 0..1 fill. */
33
33
  fraction: number;
34
34
  }
35
+ /** Set of named survival meters (hunger/thirst/…) that drain and refill over game time. */
35
36
  export interface DecayMeterSet {
36
37
  /** Drain/fill every meter by `rate * rateModifier * dt`. Call once per game tick. */
37
38
  tick(dt: number): void;
@@ -49,11 +50,65 @@ export interface DecayMeterSet {
49
50
  snapshot(): Record<string, DecayMeterState>;
50
51
  ids(): readonly string[];
51
52
  }
53
+ /**
54
+ * Plain-data meter values: `meter id → current value`. This is the whole serialized
55
+ * form — it drops straight into a `defineGame` state record and round-trips through
56
+ * save/load and multiplayer sync with no closure to rebuild.
57
+ */
58
+ export type DecayMeterValues = Record<string, number>;
59
+ /**
60
+ * Rate multiplier for {@link decayMeters}: one scalar applied to every meter (a member's
61
+ * metabolism, a game-mode harshness dial) or a per-meter record (cold biome → warmth only).
62
+ * `1` / omitted leaves the base rates unscaled.
63
+ */
64
+ export type DecayModifier = number | Record<string, number>;
65
+ /**
66
+ * Starting values for `defs` — each meter's `start ?? max`, clamped to its range. Seed a
67
+ * serialized state record with this instead of holding a {@link createDecayMeterSet} closure.
68
+ *
69
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
70
+ */
71
+ export declare function initDecayMeters(defs: readonly DecayMeterConfig[]): DecayMeterValues;
72
+ /**
73
+ * Pure per-tick decay over plain data: drain (or fill) every meter by `rate * modifier * dt`,
74
+ * clamped to its range, returning a new `id → value` record. Returns `values` unchanged when
75
+ * `dt <= 0`. The serializable counterpart to {@link DecayMeterSet.tick}.
76
+ *
77
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
78
+ */
79
+ export declare function decayMeters(values: DecayMeterValues, defs: readonly DecayMeterConfig[], dt: number, modifier?: DecayModifier): DecayMeterValues;
80
+ /**
81
+ * Refill (or drain, if negative) one meter by `amount`, clamped to its range. Returns a new
82
+ * record; throws on an unknown id. The pure counterpart to {@link DecayMeterSet.refill}.
83
+ *
84
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
85
+ */
86
+ export declare function refillMeter(values: DecayMeterValues, defs: readonly DecayMeterConfig[], id: string, amount: number): DecayMeterValues;
87
+ /**
88
+ * Numeric state (value, bounds, 0..1 fraction) for one meter. Throws on an unknown id.
89
+ *
90
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
91
+ */
92
+ export declare function decayMeterState(values: DecayMeterValues, defs: readonly DecayMeterConfig[], id: string): DecayMeterState;
93
+ /**
94
+ * Numeric state for every meter, keyed by id — the pure counterpart to {@link DecayMeterSet.snapshot}.
95
+ *
96
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
97
+ */
98
+ export declare function decayMeterSnapshot(values: DecayMeterValues, defs: readonly DecayMeterConfig[]): Record<string, DecayMeterState>;
99
+ /**
100
+ * Moodles for every crossed threshold, worst-first per meter in declared order.
101
+ *
102
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
103
+ */
104
+ export declare function decayMeterMoodles(values: DecayMeterValues, defs: readonly DecayMeterConfig[]): Moodle[];
52
105
  /**
53
106
  * Named decay meters — hunger, thirst, oxygen, sanity, warmth, stamina. Each drains
54
107
  * (or recovers) on game-time `dt` at a configurable rate, refills from consumables or
55
108
  * actions, and raises moodle statuses at thresholds. Rate modifiers let the environment
56
109
  * drive them (colder → faster warmth loss; toxic biome → oxygen drops), so a game reads
57
110
  * an environment field then calls `setRateModifier`.
111
+ *
112
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
58
113
  */
59
114
  export declare function createDecayMeterSet(configs: readonly DecayMeterConfig[]): DecayMeterSet;
@@ -1,91 +1,166 @@
1
1
  function clamp(value, min, max) {
2
2
  return value < min ? min : value > max ? max : value;
3
3
  }
4
- function toState(runtime) {
5
- const span = runtime.max - runtime.min;
4
+ function meterMin(def) {
5
+ return def.min ?? 0;
6
+ }
7
+ function initialValue(def) {
8
+ return clamp(def.start ?? def.max, meterMin(def), def.max);
9
+ }
10
+ function valueOf(values, def) {
11
+ const current = values[def.id];
12
+ return current === undefined ? initialValue(def) : current;
13
+ }
14
+ function modifierFor(modifier, id) {
15
+ if (modifier === undefined)
16
+ return 1;
17
+ if (typeof modifier === "number")
18
+ return modifier;
19
+ return modifier[id] ?? 1;
20
+ }
21
+ function findDef(defs, id) {
22
+ const def = defs.find((candidate) => candidate.id === id);
23
+ if (def === undefined)
24
+ throw new Error(`unknown decay meter "${id}"`);
25
+ return def;
26
+ }
27
+ function stateOf(def, value) {
28
+ const min = meterMin(def);
29
+ const span = def.max - min;
6
30
  return {
7
- id: runtime.config.id,
8
- value: runtime.value,
9
- max: runtime.max,
10
- min: runtime.min,
11
- fraction: span > 0 ? (runtime.value - runtime.min) / span : 0,
31
+ id: def.id,
32
+ value,
33
+ max: def.max,
34
+ min,
35
+ fraction: span > 0 ? (value - min) / span : 0,
12
36
  };
13
37
  }
14
38
  function crossed(threshold, value) {
15
39
  return threshold.when === "below" ? value < threshold.at : value > threshold.at;
16
40
  }
41
+ /**
42
+ * Starting values for `defs` — each meter's `start ?? max`, clamped to its range. Seed a
43
+ * serialized state record with this instead of holding a {@link createDecayMeterSet} closure.
44
+ *
45
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
46
+ */
47
+ export function initDecayMeters(defs) {
48
+ const out = {};
49
+ for (const def of defs)
50
+ out[def.id] = initialValue(def);
51
+ return out;
52
+ }
53
+ /**
54
+ * Pure per-tick decay over plain data: drain (or fill) every meter by `rate * modifier * dt`,
55
+ * clamped to its range, returning a new `id → value` record. Returns `values` unchanged when
56
+ * `dt <= 0`. The serializable counterpart to {@link DecayMeterSet.tick}.
57
+ *
58
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
59
+ */
60
+ export function decayMeters(values, defs, dt, modifier) {
61
+ if (dt <= 0)
62
+ return values;
63
+ const out = {};
64
+ for (const def of defs) {
65
+ out[def.id] = clamp(valueOf(values, def) - def.rate * modifierFor(modifier, def.id) * dt, meterMin(def), def.max);
66
+ }
67
+ return out;
68
+ }
69
+ /**
70
+ * Refill (or drain, if negative) one meter by `amount`, clamped to its range. Returns a new
71
+ * record; throws on an unknown id. The pure counterpart to {@link DecayMeterSet.refill}.
72
+ *
73
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
74
+ */
75
+ export function refillMeter(values, defs, id, amount) {
76
+ const def = findDef(defs, id);
77
+ return { ...values, [id]: clamp(valueOf(values, def) + amount, meterMin(def), def.max) };
78
+ }
79
+ /**
80
+ * Numeric state (value, bounds, 0..1 fraction) for one meter. Throws on an unknown id.
81
+ *
82
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
83
+ */
84
+ export function decayMeterState(values, defs, id) {
85
+ const def = findDef(defs, id);
86
+ return stateOf(def, valueOf(values, def));
87
+ }
88
+ /**
89
+ * Numeric state for every meter, keyed by id — the pure counterpart to {@link DecayMeterSet.snapshot}.
90
+ *
91
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
92
+ */
93
+ export function decayMeterSnapshot(values, defs) {
94
+ const out = {};
95
+ for (const def of defs)
96
+ out[def.id] = stateOf(def, valueOf(values, def));
97
+ return out;
98
+ }
99
+ /**
100
+ * Moodles for every crossed threshold, worst-first per meter in declared order.
101
+ *
102
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
103
+ */
104
+ export function decayMeterMoodles(values, defs) {
105
+ const out = [];
106
+ for (const def of defs) {
107
+ const value = valueOf(values, def);
108
+ for (const threshold of def.thresholds ?? []) {
109
+ if (!crossed(threshold, value))
110
+ continue;
111
+ out.push({
112
+ id: threshold.id,
113
+ label: threshold.label,
114
+ severity: threshold.severity ?? "warning",
115
+ source: "meter",
116
+ stacks: 1,
117
+ ...(threshold.icon === undefined ? {} : { icon: threshold.icon }),
118
+ fraction: stateOf(def, value).fraction,
119
+ });
120
+ }
121
+ }
122
+ return out;
123
+ }
17
124
  /**
18
125
  * Named decay meters — hunger, thirst, oxygen, sanity, warmth, stamina. Each drains
19
126
  * (or recovers) on game-time `dt` at a configurable rate, refills from consumables or
20
127
  * actions, and raises moodle statuses at thresholds. Rate modifiers let the environment
21
128
  * drive them (colder → faster warmth loss; toxic biome → oxygen drops), so a game reads
22
129
  * an environment field then calls `setRateModifier`.
130
+ *
131
+ * @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
23
132
  */
24
133
  export function createDecayMeterSet(configs) {
25
- const meters = new Map();
26
- const order = [];
27
- for (const config of configs) {
28
- const min = config.min ?? 0;
29
- const max = config.max;
30
- const value = clamp(config.start ?? max, min, max);
31
- meters.set(config.id, { config, min, max, value, rate: config.rate, modifier: 1 });
32
- order.push(config.id);
33
- }
34
- const require = (id) => {
35
- const runtime = meters.get(id);
36
- if (runtime === undefined)
37
- throw new Error(`unknown decay meter "${id}"`);
38
- return runtime;
39
- };
134
+ // Mutable copy so setRate can override a meter's base rate without mutating the caller's defs.
135
+ const defs = configs.map((config) => ({ ...config }));
136
+ const order = defs.map((def) => def.id);
137
+ const modifiers = {};
138
+ let values = initDecayMeters(defs);
40
139
  return {
41
140
  tick(dt) {
42
- if (dt <= 0)
43
- return;
44
- for (const runtime of meters.values()) {
45
- runtime.value = clamp(runtime.value - runtime.rate * runtime.modifier * dt, runtime.min, runtime.max);
46
- }
141
+ values = decayMeters(values, defs, dt, modifiers);
47
142
  },
48
143
  value(id) {
49
- return require(id).value;
144
+ return decayMeterState(values, defs, id).value;
50
145
  },
51
146
  state(id) {
52
- return toState(require(id));
147
+ return decayMeterState(values, defs, id);
53
148
  },
54
149
  refill(id, amount) {
55
- const runtime = require(id);
56
- runtime.value = clamp(runtime.value + amount, runtime.min, runtime.max);
150
+ values = refillMeter(values, defs, id, amount);
57
151
  },
58
152
  setRate(id, rate) {
59
- require(id).rate = rate;
153
+ findDef(defs, id).rate = rate;
60
154
  },
61
155
  setRateModifier(id, multiplier) {
62
- require(id).modifier = multiplier;
156
+ findDef(defs, id);
157
+ modifiers[id] = multiplier;
63
158
  },
64
159
  moodles() {
65
- const out = [];
66
- for (const id of order) {
67
- const runtime = meters.get(id);
68
- for (const threshold of runtime.config.thresholds ?? []) {
69
- if (!crossed(threshold, runtime.value))
70
- continue;
71
- out.push({
72
- id: threshold.id,
73
- label: threshold.label,
74
- severity: threshold.severity ?? "warning",
75
- source: "meter",
76
- stacks: 1,
77
- ...(threshold.icon === undefined ? {} : { icon: threshold.icon }),
78
- fraction: toState(runtime).fraction,
79
- });
80
- }
81
- }
82
- return out;
160
+ return decayMeterMoodles(values, defs);
83
161
  },
84
162
  snapshot() {
85
- const out = {};
86
- for (const id of order)
87
- out[id] = toState(meters.get(id));
88
- return out;
163
+ return decayMeterSnapshot(values, defs);
89
164
  },
90
165
  ids() {
91
166
  return order;
@@ -1,5 +1,6 @@
1
1
  export type MoodleSeverity = "good" | "neutral" | "warning" | "critical";
2
2
  export type MoodleSource = "meter" | "ailment" | "buff";
3
+ /** One survival moodle (status icon) — severity, source, and label for HUD chips. */
3
4
  export interface Moodle {
4
5
  id: string;
5
6
  label: string;
@@ -29,6 +30,7 @@ export interface TimedMoodleInput {
29
30
  /** Game-seconds until the moodle drops. Omit for a moodle that stays until removed. */
30
31
  duration?: number;
31
32
  }
33
+ /** Ordered stack of active moodles derived from meters/ailments/buffs. */
32
34
  export interface MoodleStack {
33
35
  /** Add or refresh a timed moodle (Valheim food buff, a temporary shelter status). */
34
36
  add(input: TimedMoodleInput): void;
@@ -49,6 +49,7 @@ export interface TreatResult {
49
49
  /** Ailment ids fully or partially cleared by the item. */
50
50
  treated: readonly string[];
51
51
  }
52
+ /** Per-limb / per-region health track with treat/damage/heal APIs. */
52
53
  export interface MultiRegionHealth {
53
54
  damage(regionId: string, amount: number): DamageResult;
54
55
  heal(regionId: string, amount: number): RegionHealthState;
@@ -69,4 +70,9 @@ export interface MultiRegionHealth {
69
70
  ailmentMoodles(): Moodle[];
70
71
  readonly dead: boolean;
71
72
  }
73
+ /**
74
+ * Per-region/limb health tracked separately, so each body part takes and heals damage on its own.
75
+ *
76
+ * @capability limb-health per-body-part/region health tracked separately
77
+ */
72
78
  export declare function createMultiRegionHealth(config: MultiRegionHealthConfig): MultiRegionHealth;
@@ -1,6 +1,11 @@
1
1
  function clamp(value, min, max) {
2
2
  return value < min ? min : value > max ? max : value;
3
3
  }
4
+ /**
5
+ * Per-region/limb health tracked separately, so each body part takes and heals damage on its own.
6
+ *
7
+ * @capability limb-health per-body-part/region health tracked separately
8
+ */
4
9
  export function createMultiRegionHealth(config) {
5
10
  if (config.regions.length === 0) {
6
11
  throw new Error("createMultiRegionHealth: regions must be non-empty");
@@ -51,12 +51,14 @@ export interface GravityIntervalConfig {
51
51
  * Gravity tick interval for a given level: linear speed-up with a floor, generalizing
52
52
  * a falling-block `gravityInterval` (`max(0.05, 0.8 - level * 0.07)` seconds) to milliseconds
53
53
  * with configurable base/step/floor.
54
- */
54
+ * @internal
55
+ */
55
56
  export declare function gravityIntervalMs(level: number, config?: GravityIntervalConfig): number;
56
57
  /**
57
58
  * A game-agnostic cell grid for gravity-driven falling-block mechanics: bounded occupancy,
58
59
  * footprint placement/collision, line-clear collapse, column-gravity settle (for match-3/sand
59
60
  * style cascades), and a pure lock-delay helper. Extracted from falling-block tetris
60
61
  * logic so any falling-block game can adopt it instead of reimplementing the grid.
61
- */
62
+ * @internal
63
+ */
62
64
  export declare function createFallingGrid<TCell>(config: FallingGridConfig): FallingGrid<TCell>;
@@ -2,7 +2,8 @@
2
2
  * Gravity tick interval for a given level: linear speed-up with a floor, generalizing
3
3
  * a falling-block `gravityInterval` (`max(0.05, 0.8 - level * 0.07)` seconds) to milliseconds
4
4
  * with configurable base/step/floor.
5
- */
5
+ * @internal
6
+ */
6
7
  export function gravityIntervalMs(level, config = {}) {
7
8
  const baseMs = config.baseMs ?? 800;
8
9
  const perLevel = config.perLevel ?? 70;
@@ -14,7 +15,8 @@ export function gravityIntervalMs(level, config = {}) {
14
15
  * footprint placement/collision, line-clear collapse, column-gravity settle (for match-3/sand
15
16
  * style cascades), and a pure lock-delay helper. Extracted from falling-block tetris
16
17
  * logic so any falling-block game can adopt it instead of reimplementing the grid.
17
- */
18
+ * @internal
19
+ */
18
20
  export function createFallingGrid(config) {
19
21
  const cols = config.cols;
20
22
  const rows = config.rows;
@@ -23,7 +23,9 @@ export interface ArcPredictInput {
23
23
  effect?: string;
24
24
  requireReceive?: boolean;
25
25
  }
26
+ /** @internal */
26
27
  export declare function predictAreaEffect(deps: PredictiveDeps, input: AreaPredictInput): PredictedTarget[];
28
+ /** @internal */
27
29
  export declare function predictArcEffect(deps: PredictiveDeps, input: ArcPredictInput): PredictedTarget[];
28
30
  export interface TilePredictInput {
29
31
  at: EntityPosition;
@@ -31,4 +33,5 @@ export interface TilePredictInput {
31
33
  originTile: Tile;
32
34
  tileSize: number;
33
35
  }
36
+ /** @internal */
34
37
  export declare function predictTiles(input: TilePredictInput): Tile[];
@@ -5,10 +5,12 @@ function receiveGate(deps, effect, requireReceive) {
5
5
  const gate = deps.canReceive;
6
6
  return (instanceId) => gate(instanceId, effect) === null;
7
7
  }
8
+ /** @internal */
8
9
  export function predictAreaEffect(deps, input) {
9
10
  const requireReceive = input.requireReceive ?? true;
10
11
  return resolveAreaTargets(deps.spatial, input, receiveGate(deps, input.effect, requireReceive));
11
12
  }
13
+ /** @internal */
12
14
  export function predictArcEffect(deps, input) {
13
15
  const requireReceive = input.requireReceive ?? true;
14
16
  const gate = receiveGate(deps, input.effect, requireReceive);
@@ -26,6 +28,7 @@ export function predictArcEffect(deps, input) {
26
28
  }
27
29
  return targets;
28
30
  }
31
+ /** @internal */
29
32
  export function predictTiles(input) {
30
33
  const reach = Math.ceil(input.radius / input.tileSize);
31
34
  const tiles = [];
@@ -14,5 +14,7 @@ export interface SnapshotStore {
14
14
  depth(): number;
15
15
  clear(): void;
16
16
  }
17
+ /** @internal */
17
18
  export declare function deepClone<T>(value: T): T;
19
+ /** @internal */
18
20
  export declare function createSnapshotStore(): SnapshotStore;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function deepClone(value) {
2
3
  if (value === null || typeof value !== "object")
3
4
  return value;
@@ -20,6 +21,7 @@ export function deepClone(value) {
20
21
  clone[k] = deepClone(v);
21
22
  return clone;
22
23
  }
24
+ /** @internal */
23
25
  export function createSnapshotStore() {
24
26
  const slices = new Map();
25
27
  const stack = [];
@@ -49,4 +49,5 @@ export interface SurfaceLayer {
49
49
  capture(): SurfaceLayerSnapshot;
50
50
  restore(snapshot: SurfaceLayerSnapshot): void;
51
51
  }
52
+ /** @internal */
52
53
  export declare function createSurfaceLayer(config: SurfaceLayerConfig): SurfaceLayer;
@@ -8,6 +8,7 @@ function parseKey(k) {
8
8
  function pairKey(a, b) {
9
9
  return `${a}|${b}`;
10
10
  }
11
+ /** @internal */
11
12
  export function createSurfaceLayer(config) {
12
13
  const durations = new Map();
13
14
  for (const k of config.kinds)
@@ -65,4 +65,5 @@ export interface TacticalGrid {
65
65
  /** A tile's world-space center. Requires `config.world`. */
66
66
  tileToWorld(tile: Tile): readonly [number, number];
67
67
  }
68
+ /** @internal */
68
69
  export declare function createTacticalGrid(config: TacticalGridConfig): TacticalGrid;
@@ -5,6 +5,7 @@ function parseKey(k) {
5
5
  const [c, r] = k.split(",");
6
6
  return [Number(c), Number(r)];
7
7
  }
8
+ /** @internal */
8
9
  export function createTacticalGrid(config) {
9
10
  const width = config.width;
10
11
  const height = config.height;
@@ -21,8 +21,11 @@ export interface BeatClock {
21
21
  beatDurationSec(): number;
22
22
  bpm(): number;
23
23
  }
24
+ /** @internal */
24
25
  export declare function createBeatClock(config: BeatClockConfig, onBeat?: (beatIndex: number) => void): BeatClock;
25
- /** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12). */
26
+ /** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
27
+ * @internal
28
+ */
26
29
  export declare function nearestBeatDelta(nowSec: number, beatDurationSec: number): number;
27
30
  export interface BeatAccuracyTier {
28
31
  id: string;
@@ -36,11 +39,17 @@ export interface BeatJudgement {
36
39
  deltaSec: number;
37
40
  }
38
41
  export declare const DEFAULT_BEAT_TIERS: readonly BeatAccuracyTier[];
39
- /** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first. */
42
+ /** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
43
+ * @internal
44
+ */
40
45
  export declare function classifyBeatAccuracy(nowSec: number, beatDurationSec: number, tiers?: readonly BeatAccuracyTier[]): BeatJudgement;
41
- /** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12). */
46
+ /** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
47
+ * @internal
48
+ */
42
49
  export declare function inBarWindow(snapshot: BeatSnapshot, fromBeat: number, toBeat: number): boolean;
43
- /** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one. */
50
+ /** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
51
+ * @internal
52
+ */
44
53
  export declare function nextBeatTime(nowSec: number, beatDurationSec: number, epsilon?: number): number;
45
54
  export interface BufferedAction<T> {
46
55
  action: T;
@@ -55,4 +64,5 @@ export interface BeatInputBuffer<T> {
55
64
  pendingCount(): number;
56
65
  clear(): void;
57
66
  }
67
+ /** @internal */
58
68
  export declare function createBeatInputBuffer<T>(beatDurationSec: number): BeatInputBuffer<T>;
@@ -1,4 +1,5 @@
1
1
  const MAX_BEAT_FIRES = 10_000;
2
+ /** @internal */
2
3
  export function createBeatClock(config, onBeat) {
3
4
  const beatsPerBar = config.beatsPerBar !== undefined && config.beatsPerBar > 0 ? config.beatsPerBar : 4;
4
5
  const beatDurationSec = 60 / config.bpm;
@@ -35,7 +36,9 @@ export function createBeatClock(config, onBeat) {
35
36
  bpm: () => config.bpm,
36
37
  };
37
38
  }
38
- /** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12). */
39
+ /** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
40
+ * @internal
41
+ */
39
42
  export function nearestBeatDelta(nowSec, beatDurationSec) {
40
43
  const beatIndex = Math.round(nowSec / beatDurationSec);
41
44
  return nowSec - beatIndex * beatDurationSec;
@@ -44,7 +47,9 @@ export const DEFAULT_BEAT_TIERS = [
44
47
  { id: "perfect", windowSec: 0.06 },
45
48
  { id: "good", windowSec: 0.14 },
46
49
  ];
47
- /** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first. */
50
+ /** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
51
+ * @internal
52
+ */
48
53
  export function classifyBeatAccuracy(nowSec, beatDurationSec, tiers = DEFAULT_BEAT_TIERS) {
49
54
  const deltaSec = nearestBeatDelta(nowSec, beatDurationSec);
50
55
  const magnitude = Math.abs(deltaSec);
@@ -54,13 +59,17 @@ export function classifyBeatAccuracy(nowSec, beatDurationSec, tiers = DEFAULT_BE
54
59
  }
55
60
  return { tier: "miss", deltaSec };
56
61
  }
57
- /** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12). */
62
+ /** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
63
+ * @internal
64
+ */
58
65
  export function inBarWindow(snapshot, fromBeat, toBeat) {
59
66
  const barBeat = snapshot.beatInBar + snapshot.phase;
60
67
  return barBeat >= fromBeat && barBeat < toBeat;
61
68
  }
62
69
  const QUANTIZE_EPSILON = 1e-6;
63
- /** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one. */
70
+ /** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
71
+ * @internal
72
+ */
64
73
  export function nextBeatTime(nowSec, beatDurationSec, epsilon = QUANTIZE_EPSILON) {
65
74
  const beatIndex = nowSec / beatDurationSec;
66
75
  const rounded = Math.round(beatIndex);
@@ -68,6 +77,7 @@ export function nextBeatTime(nowSec, beatDurationSec, epsilon = QUANTIZE_EPSILON
68
77
  return rounded * beatDurationSec;
69
78
  return Math.ceil(beatIndex) * beatDurationSec;
70
79
  }
80
+ /** @internal */
71
81
  export function createBeatInputBuffer(beatDurationSec) {
72
82
  const pending = [];
73
83
  return {
@@ -12,6 +12,9 @@ export interface GameTime {
12
12
  formattedTime: string;
13
13
  formatted: string;
14
14
  }
15
+ /** @internal */
15
16
  export declare function computeGameTime(gameTimestamp: number): GameTime;
17
+ /** @internal */
16
18
  export declare function computeClientServerOffset(serverNow: number, clientNow: number): number;
19
+ /** @internal */
17
20
  export declare function getGameClockTimestamp(createdAt: number, serverNow: number, clientNow: number, gameTimeScale?: number): number;
@@ -1,6 +1,7 @@
1
1
  import { getCurrentGameTimestamp, sanitizeGameTimeScale } from "@jgengine/core/time/gameClock";
2
2
  const MONTH_NAMES_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
3
3
  const MONTH_NAMES_FULL = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
4
+ /** @internal */
4
5
  export function computeGameTime(gameTimestamp) {
5
6
  const d = new Date(gameTimestamp);
6
7
  const year = d.getFullYear();
@@ -33,9 +34,11 @@ export function computeGameTime(gameTimestamp) {
33
34
  formatted,
34
35
  };
35
36
  }
37
+ /** @internal */
36
38
  export function computeClientServerOffset(serverNow, clientNow) {
37
39
  return serverNow - clientNow;
38
40
  }
41
+ /** @internal */
39
42
  export function getGameClockTimestamp(createdAt, serverNow, clientNow, gameTimeScale) {
40
43
  const clientOffsetMs = computeClientServerOffset(serverNow, clientNow);
41
44
  return getCurrentGameTimestamp(createdAt, clientNow + clientOffsetMs, sanitizeGameTimeScale(gameTimeScale));
@@ -7,6 +7,7 @@ export interface IdleWindow {
7
7
  effectiveSeconds: number;
8
8
  capped: boolean;
9
9
  }
10
+ /** @internal */
10
11
  export declare function idleWindow(lastSeenMs: number, nowMs: number, config?: IdleWindowConfig): IdleWindow;
11
12
  export interface LinearCatchUpInput {
12
13
  current: number;
@@ -14,6 +15,7 @@ export interface LinearCatchUpInput {
14
15
  min?: number;
15
16
  max?: number;
16
17
  }
18
+ /** @internal */
17
19
  export declare function linearCatchUp(seconds: number, input: LinearCatchUpInput): number;
18
20
  export interface ExponentialCatchUpInput {
19
21
  current: number;
@@ -21,9 +23,11 @@ export interface ExponentialCatchUpInput {
21
23
  min?: number;
22
24
  max?: number;
23
25
  }
26
+ /** @internal */
24
27
  export declare function exponentialCatchUp(seconds: number, input: ExponentialCatchUpInput): number;
25
28
  export interface SteppedCatchUpResult {
26
29
  steps: number;
27
30
  remainderSeconds: number;
28
31
  }
32
+ /** @internal */
29
33
  export declare function steppedCatchUp(seconds: number, stepSeconds: number, step: (index: number) => void, maxSteps?: number): SteppedCatchUpResult;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function idleWindow(lastSeenMs, nowMs, config = {}) {
2
3
  const elapsedSeconds = Math.max(0, (nowMs - lastSeenMs) / 1000);
3
4
  const capped = config.maxSeconds !== undefined && elapsedSeconds > config.maxSeconds;
@@ -9,17 +10,20 @@ export function idleWindow(lastSeenMs, nowMs, config = {}) {
9
10
  capped,
10
11
  };
11
12
  }
13
+ /** @internal */
12
14
  export function linearCatchUp(seconds, input) {
13
15
  const clampedSeconds = Math.max(0, seconds);
14
16
  const value = input.current + input.ratePerSecond * clampedSeconds;
15
17
  return Math.min(input.max ?? Number.POSITIVE_INFINITY, Math.max(input.min ?? Number.NEGATIVE_INFINITY, value));
16
18
  }
19
+ /** @internal */
17
20
  export function exponentialCatchUp(seconds, input) {
18
21
  const clampedSeconds = Math.max(0, seconds);
19
22
  const factor = Math.max(0, input.factorPerSecond);
20
23
  const value = input.current * factor ** clampedSeconds;
21
24
  return Math.min(input.max ?? Number.POSITIVE_INFINITY, Math.max(input.min ?? Number.NEGATIVE_INFINITY, value));
22
25
  }
26
+ /** @internal */
23
27
  export function steppedCatchUp(seconds, stepSeconds, step, maxSteps) {
24
28
  if (stepSeconds <= 0 || seconds <= 0) {
25
29
  return { steps: 0, remainderSeconds: Math.max(0, seconds) };