@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
@@ -3,9 +3,11 @@
3
3
  * capture layer renders a virtual joystick, on-screen buttons, and a gesture
4
4
  * surface, and feeds synthetic `touch:<action>` codes into the same
5
5
  * ActionStateTracker the keyboard uses, so games gain touch play without any
6
- * per-game input code. Games refine the derived defaults through
7
- * TouchControlsConfig (gesture bindings, button curation) or opt out entirely
8
- * with `touch: false`.
6
+ * per-game input code. Session-lifecycle actions (start/restart/pause/menu/…)
7
+ * are left off the derived dock — they live in the start screen, pause menu, or
8
+ * settings sheet, never as a chip over live play. Games refine the derived
9
+ * defaults through TouchControlsConfig (gesture bindings, button curation) or
10
+ * opt out entirely with `touch: false`.
9
11
  */
10
12
  import { isHotbarSlotAction } from "./actionBindings.js";
11
13
  export const TOUCH_CODE_PREFIX = "touch:";
@@ -31,7 +33,68 @@ export function withTouchCodes(map) {
31
33
  }
32
34
  return result;
33
35
  }
36
+ /** Every touch skin id, in menu order. */
37
+ export const TOUCH_STYLES = ["glass", "arcade", "mechanical", "minimal"];
38
+ /** Touch skins as `{ value, label }` rows for the Settings → Controls selector. */
39
+ export const TOUCH_STYLE_OPTIONS = [
40
+ { value: "glass", label: "Glass" },
41
+ { value: "arcade", label: "Arcade" },
42
+ { value: "mechanical", label: "Mechanical" },
43
+ { value: "minimal", label: "Minimal" },
44
+ ];
45
+ /** Skin used when neither the game nor the player picks one. */
46
+ export const DEFAULT_TOUCH_STYLE = "glass";
34
47
  const DEFAULT_LOOK_SENSITIVITY = 0.005;
48
+ const DEFAULT_TOUCH_LAYOUT = {
49
+ movement: "bottom-left",
50
+ actions: "bottom-right",
51
+ utility: "bottom-center",
52
+ };
53
+ const SHAPE_BY_ACTION = new Map([
54
+ ["brake", "pedal"],
55
+ ["accelerate", "pedal"],
56
+ ["throttle", "pedal"],
57
+ ["throttleUp", "pedal"],
58
+ ["throttleDown", "pedal"],
59
+ ["gas", "pedal"],
60
+ ["clutch", "pedal"],
61
+ ["handbrake", "lever"],
62
+ ["gearUp", "lever"],
63
+ ["gearDown", "lever"],
64
+ ["shift", "lever"],
65
+ ["boost", "lever"],
66
+ ["fire", "trigger"],
67
+ ["shoot", "trigger"],
68
+ ["attack", "trigger"],
69
+ ["primaryFire", "trigger"],
70
+ ["secondaryFire", "trigger"],
71
+ ["steer", "wheel"],
72
+ ["inventory", "square"],
73
+ ["bag", "square"],
74
+ ["spellbook", "square"],
75
+ ]);
76
+ const WHEEL_PREFIXES = ["steer"];
77
+ /** Slot-like verbs read as square tiles (inventory, spell/item/ability slots). */
78
+ const SQUARE_PREFIXES = ["spell", "slot", "item"];
79
+ /**
80
+ * Default silhouette for an action; `circle` when nothing more specific fits.
81
+ *
82
+ * @capability touch-controls default on-screen button silhouette for a touch action
83
+ */
84
+ export function touchButtonShape(action) {
85
+ const direct = SHAPE_BY_ACTION.get(action);
86
+ if (direct !== undefined)
87
+ return direct;
88
+ for (const prefix of WHEEL_PREFIXES) {
89
+ if (action.startsWith(prefix))
90
+ return "wheel";
91
+ }
92
+ for (const prefix of SQUARE_PREFIXES) {
93
+ if (action.startsWith(prefix))
94
+ return "square";
95
+ }
96
+ return "circle";
97
+ }
35
98
  const JOYSTICK_AXES = {
36
99
  up: ["moveForward", "moveUp", "forward", "accelerate", "throttleUp", "pitchUp", "climb"],
37
100
  down: ["moveBack", "moveBackward", "moveDown", "backward", "reverse", "brake", "throttleDown", "pitchDown", "dive"],
@@ -60,6 +123,27 @@ const UTILITY_ACTIONS = new Set([
60
123
  "leaderboard",
61
124
  ]);
62
125
  const UTILITY_PREFIXES = ["toggle", "cycle", "switch", "open", "close", "show", "hide", "zoom"];
126
+ /**
127
+ * Session-lifecycle and menu-chrome actions never auto-derive an on-screen
128
+ * touch button: they belong to the start screen, pause menu, or settings sheet
129
+ * (surfaced via `settings.actions` plus a `<SettingsTrigger>`), not the live
130
+ * control dock — a `restart` chip stapled over play is the anti-pattern, and a
131
+ * mis-tap on it wrecks the match. A game that truly wants one docked lists it
132
+ * explicitly in `touch.buttons`, which bypasses derivation entirely.
133
+ */
134
+ const LIFECYCLE_ACTIONS = new Set([
135
+ "start",
136
+ "restart",
137
+ "reset",
138
+ "retry",
139
+ "pause",
140
+ "resume",
141
+ "menu",
142
+ "quit",
143
+ "exit",
144
+ "settings",
145
+ "options",
146
+ ]);
63
147
  export function touchButtonKind(action) {
64
148
  if (UTILITY_ACTIONS.has(action))
65
149
  return "utility";
@@ -103,17 +187,20 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
103
187
  const joystickMapped = new Set();
104
188
  let joystick = null;
105
189
  if (config?.movement !== false) {
106
- const resolveAxis = (candidates) => {
190
+ const axis = config?.movement?.axis ?? "both";
191
+ const resolveAxis = (candidates, enabled) => {
192
+ if (!enabled)
193
+ return null;
107
194
  const action = candidates.find((candidate) => bound.has(candidate)) ?? null;
108
195
  if (action !== null)
109
196
  joystickMapped.add(action);
110
197
  return action;
111
198
  };
112
199
  const axes = {
113
- up: resolveAxis(JOYSTICK_AXES.up),
114
- down: resolveAxis(JOYSTICK_AXES.down),
115
- left: resolveAxis(JOYSTICK_AXES.left),
116
- right: resolveAxis(JOYSTICK_AXES.right),
200
+ up: resolveAxis(JOYSTICK_AXES.up, axis !== "horizontal"),
201
+ down: resolveAxis(JOYSTICK_AXES.down, axis !== "horizontal"),
202
+ left: resolveAxis(JOYSTICK_AXES.left, axis !== "vertical"),
203
+ right: resolveAxis(JOYSTICK_AXES.right, axis !== "vertical"),
117
204
  };
118
205
  joystick = axes.up === null && axes.down === null && axes.left === null && axes.right === null ? null : axes;
119
206
  }
@@ -123,12 +210,23 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
123
210
  let buttons;
124
211
  if (config?.buttons !== undefined) {
125
212
  buttons = config.buttons.map((spec) => typeof spec === "string"
126
- ? { action: spec, label: touchActionLabel(spec), icon: null, kind: touchButtonKind(spec) }
213
+ ? {
214
+ action: spec,
215
+ label: touchActionLabel(spec),
216
+ icon: null,
217
+ kind: touchButtonKind(spec),
218
+ shape: touchButtonShape(spec),
219
+ anchor: null,
220
+ image: null,
221
+ }
127
222
  : {
128
223
  action: spec.action,
129
224
  label: spec.label ?? touchActionLabel(spec.action),
130
225
  icon: spec.icon ?? null,
131
226
  kind: spec.kind ?? touchButtonKind(spec.action),
227
+ shape: spec.shape ?? touchButtonShape(spec.action),
228
+ anchor: spec.anchor ?? null,
229
+ image: spec.image ?? null,
132
230
  });
133
231
  }
134
232
  else {
@@ -137,8 +235,17 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
137
235
  .filter((action) => !isHotbarSlotAction(action))
138
236
  .filter((action) => !consumedByGestures.has(action))
139
237
  .filter((action) => !hidden.has(action))
238
+ .filter((action) => !LIFECYCLE_ACTIONS.has(action))
140
239
  .filter((action) => !reserved.has(action) || BUTTONABLE_RESERVED.has(action))
141
- .map((action) => ({ action, label: touchActionLabel(action), icon: null, kind: touchButtonKind(action) }));
240
+ .map((action) => ({
241
+ action,
242
+ label: touchActionLabel(action),
243
+ icon: null,
244
+ kind: touchButtonKind(action),
245
+ shape: touchButtonShape(action),
246
+ anchor: null,
247
+ image: null,
248
+ }));
142
249
  }
143
250
  const look = config?.look ?? firstPerson;
144
251
  if (joystick === null && buttons.length === 0 && gestures === null && !look)
@@ -149,5 +256,11 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
149
256
  gestures,
150
257
  look,
151
258
  lookSensitivity: config?.lookSensitivity ?? DEFAULT_LOOK_SENSITIVITY,
259
+ layout: {
260
+ movement: config?.layout?.movement ?? DEFAULT_TOUCH_LAYOUT.movement,
261
+ actions: config?.layout?.actions ?? DEFAULT_TOUCH_LAYOUT.actions,
262
+ utility: config?.layout?.utility ?? DEFAULT_TOUCH_LAYOUT.utility,
263
+ },
264
+ style: config?.style ?? DEFAULT_TOUCH_STYLE,
152
265
  };
153
266
  }
@@ -0,0 +1,61 @@
1
+ /** One discrete pick move: how far the pick drives into the lock this step. */
2
+ export type LockAction = "hardSet" | "set" | "steady" | "ease" | "drop";
3
+ /** Vertical row delta applied to the pick for each action. Row 0 is the shallow/top row. */
4
+ export declare const LOCK_ACTION_DELTA: Readonly<Record<LockAction, number>>;
5
+ /** The five pick actions, in display order (shallow → deep). */
6
+ export declare const LOCK_ACTIONS: readonly LockAction[];
7
+ /** Difficulty dials for one lock: board size, forgiveness band, gates, fog window, traps. */
8
+ export interface LockTierSpec {
9
+ cols: number;
10
+ rows: number;
11
+ width: number;
12
+ gateCount: number;
13
+ visibilityWindow: number;
14
+ allowedActions: readonly LockAction[];
15
+ trapCount?: number;
16
+ }
17
+ /** A generated lock board. `open[col]` holds every enterable row in that column. */
18
+ export interface LockSpec {
19
+ seed: string | number;
20
+ tier: LockTierSpec;
21
+ open: readonly (readonly number[])[];
22
+ gates: readonly number[];
23
+ traps: readonly (readonly number[])[];
24
+ startRow: number;
25
+ seatRow: number;
26
+ }
27
+ /** Outcome of one {@link stepLock} call: `advanced`/`success` move the pick, `slip`/`bind`/`trap`
28
+ * do not and should cost a life. */
29
+ export type LockStepResult = "advanced" | "slip" | "bind" | "trap" | "success";
30
+ /** What a revealed cell renders as: a plain open notch, an exact tumbler gate, the bolt seat
31
+ * (win condition), or a ward-trap that looks open but jams on contact. */
32
+ export type LockCellKind = "open" | "gate" | "seat" | "trap";
33
+ /** One cell inside the fogged {@link visibleCells} window: its board position and kind. */
34
+ export interface LockCell {
35
+ col: number;
36
+ row: number;
37
+ kind: LockCellKind;
38
+ }
39
+ /**
40
+ * Generate a solvable depth-puzzle lock: a "Tumbler's Path" board with a guaranteed solution
41
+ * path carved first, an open-row forgiveness band wrapped around it, tumbler gate columns that
42
+ * pinch to a single exact row, and optional ward-traps that look open but jam on contact.
43
+ * Deterministic: the same (seed, tier) always yields the same board.
44
+ *
45
+ * @capability lockpick a solvable grid depth-puzzle with fog-of-war, gates, and hidden traps
46
+ */
47
+ export declare function generateLock(seed: string | number, tier: LockTierSpec): LockSpec;
48
+ /** Return a concrete row-per-column solution, or null if the board is unsolvable. */
49
+ export declare function solveLockPath(spec: LockSpec): number[] | null;
50
+ /** Whether the board has a path from the start row to the bolt seat at all. */
51
+ export declare function solveLock(spec: LockSpec): boolean;
52
+ /** Authoritative single step. The caller owns the lives economy: a slip/bind/trap does not
53
+ * advance the pick and should cost a life; advanced/success move the pick. */
54
+ export declare function stepLock(spec: LockSpec, col: number, row: number, action: LockAction): {
55
+ result: LockStepResult;
56
+ col: number;
57
+ row: number;
58
+ };
59
+ /** The render-safe slice: every open cell in columns [0, col + window]. The single source of
60
+ * truth for fog and the anti-cheat boundary — never serialize the full spec to a client. */
61
+ export declare function visibleCells(spec: LockSpec, col: number, window: number): LockCell[];
@@ -0,0 +1,168 @@
1
+ import { seededRng } from "../random/rng.js";
2
+ /** Vertical row delta applied to the pick for each action. Row 0 is the shallow/top row. */
3
+ export const LOCK_ACTION_DELTA = {
4
+ hardSet: -2,
5
+ set: -1,
6
+ steady: 0,
7
+ ease: 1,
8
+ drop: 2,
9
+ };
10
+ /** The five pick actions, in display order (shallow → deep). */
11
+ export const LOCK_ACTIONS = ["hardSet", "set", "steady", "ease", "drop"];
12
+ function randInt(rng, min, max) {
13
+ return min + Math.floor(rng() * (max - min + 1));
14
+ }
15
+ function legalDeltas(tier) {
16
+ return tier.allowedActions.map((action) => LOCK_ACTION_DELTA[action]);
17
+ }
18
+ function sampleGateColumns(rng, cols, count) {
19
+ const candidates = [];
20
+ for (let c = 1; c <= cols - 2; c += 1)
21
+ candidates.push(c);
22
+ for (let i = candidates.length - 1; i > 0; i -= 1) {
23
+ const j = randInt(rng, 0, i);
24
+ const tmp = candidates[i];
25
+ candidates[i] = candidates[j];
26
+ candidates[j] = tmp;
27
+ }
28
+ return candidates.slice(0, Math.max(0, Math.min(count, candidates.length))).sort((a, b) => a - b);
29
+ }
30
+ /**
31
+ * Generate a solvable depth-puzzle lock: a "Tumbler's Path" board with a guaranteed solution
32
+ * path carved first, an open-row forgiveness band wrapped around it, tumbler gate columns that
33
+ * pinch to a single exact row, and optional ward-traps that look open but jam on contact.
34
+ * Deterministic: the same (seed, tier) always yields the same board.
35
+ *
36
+ * @capability lockpick a solvable grid depth-puzzle with fog-of-war, gates, and hidden traps
37
+ */
38
+ export function generateLock(seed, tier) {
39
+ const rng = seededRng(seed);
40
+ const rows = tier.rows;
41
+ const cols = tier.cols;
42
+ const deltas = legalDeltas(tier);
43
+ const path = new Array(cols);
44
+ path[0] = randInt(rng, 0, rows - 1);
45
+ for (let c = 1; c < cols; c += 1) {
46
+ const legal = deltas.filter((d) => path[c - 1] + d >= 0 && path[c - 1] + d <= rows - 1);
47
+ path[c] = path[c - 1] + (legal.length > 0 ? legal[randInt(rng, 0, legal.length - 1)] : 0);
48
+ }
49
+ const gates = sampleGateColumns(rng, cols, tier.gateCount);
50
+ const gateSet = new Set(gates);
51
+ const open = new Array(cols);
52
+ for (let c = 0; c < cols; c += 1) {
53
+ if (c === cols - 1 || gateSet.has(c)) {
54
+ open[c] = [path[c]];
55
+ continue;
56
+ }
57
+ const band = [];
58
+ for (let r = path[c] - tier.width; r <= path[c] + tier.width; r += 1) {
59
+ if (r >= 0 && r <= rows - 1)
60
+ band.push(r);
61
+ }
62
+ open[c] = band;
63
+ }
64
+ for (let c = 1; c < cols; c += 1) {
65
+ const prev = open[c - 1];
66
+ open[c] = open[c].filter((r) => prev.some((pr) => deltas.includes(r - pr)));
67
+ }
68
+ for (let c = cols - 2; c >= 0; c -= 1) {
69
+ const next = open[c + 1];
70
+ open[c] = open[c].filter((r) => next.some((nr) => deltas.includes(nr - r)));
71
+ }
72
+ const traps = open.map(() => []);
73
+ const trapBudget = Math.max(0, tier.trapCount ?? 0);
74
+ if (trapBudget > 0) {
75
+ const candidates = [];
76
+ for (let c = 1; c < cols - 1; c += 1) {
77
+ if (gateSet.has(c))
78
+ continue;
79
+ for (const r of open[c])
80
+ if (r !== path[c])
81
+ candidates.push([c, r]);
82
+ }
83
+ for (let i = candidates.length - 1; i > 0; i -= 1) {
84
+ const j = randInt(rng, 0, i);
85
+ const tmp = candidates[i];
86
+ candidates[i] = candidates[j];
87
+ candidates[j] = tmp;
88
+ }
89
+ for (const [c, r] of candidates.slice(0, Math.min(trapBudget, candidates.length)))
90
+ traps[c].push(r);
91
+ for (const t of traps)
92
+ t.sort((a, b) => a - b);
93
+ }
94
+ return { seed, tier, open, gates, traps, startRow: path[0], seatRow: path[cols - 1] };
95
+ }
96
+ /** Return a concrete row-per-column solution, or null if the board is unsolvable. */
97
+ export function solveLockPath(spec) {
98
+ const deltas = legalDeltas(spec.tier);
99
+ const cols = spec.open.length;
100
+ const safe = (c, r) => spec.open[c].includes(r) && !spec.traps[c]?.includes(r);
101
+ if (!safe(0, spec.startRow))
102
+ return null;
103
+ const parents = [];
104
+ let reach = new Set([spec.startRow]);
105
+ parents[0] = new Map();
106
+ for (let c = 1; c < cols; c += 1) {
107
+ const next = new Set();
108
+ const par = new Map();
109
+ for (const r of reach) {
110
+ for (const d of deltas) {
111
+ const nr = r + d;
112
+ if (safe(c, nr) && !par.has(nr)) {
113
+ par.set(nr, r);
114
+ next.add(nr);
115
+ }
116
+ }
117
+ }
118
+ parents[c] = par;
119
+ reach = next;
120
+ if (reach.size === 0)
121
+ return null;
122
+ }
123
+ if (!reach.has(spec.seatRow))
124
+ return null;
125
+ const path = new Array(cols);
126
+ path[cols - 1] = spec.seatRow;
127
+ for (let c = cols - 1; c > 0; c -= 1)
128
+ path[c - 1] = parents[c].get(path[c]);
129
+ return path;
130
+ }
131
+ /** Whether the board has a path from the start row to the bolt seat at all. */
132
+ export function solveLock(spec) {
133
+ return solveLockPath(spec) !== null;
134
+ }
135
+ /** Authoritative single step. The caller owns the lives economy: a slip/bind/trap does not
136
+ * advance the pick and should cost a life; advanced/success move the pick. */
137
+ export function stepLock(spec, col, row, action) {
138
+ const rows = spec.tier.rows;
139
+ const newRow = Math.max(0, Math.min(rows - 1, row + LOCK_ACTION_DELTA[action]));
140
+ const newCol = col + 1;
141
+ const colOpen = spec.open[newCol];
142
+ if (colOpen === undefined || !colOpen.includes(newRow)) {
143
+ const isGate = spec.gates.includes(newCol);
144
+ return { result: isGate ? "bind" : "slip", col, row };
145
+ }
146
+ if (spec.traps[newCol]?.includes(newRow) === true) {
147
+ return { result: "trap", col, row };
148
+ }
149
+ if (newCol === spec.open.length - 1 && newRow === spec.seatRow) {
150
+ return { result: "success", col: newCol, row: newRow };
151
+ }
152
+ return { result: "advanced", col: newCol, row: newRow };
153
+ }
154
+ /** The render-safe slice: every open cell in columns [0, col + window]. The single source of
155
+ * truth for fog and the anti-cheat boundary — never serialize the full spec to a client. */
156
+ export function visibleCells(spec, col, window) {
157
+ const last = spec.open.length - 1;
158
+ const maxCol = window >= spec.tier.cols ? last : Math.min(last, col + window);
159
+ const cells = [];
160
+ for (let c = 0; c <= maxCol; c += 1) {
161
+ const trapRows = spec.traps[c];
162
+ for (const r of spec.open[c]) {
163
+ const kind = c === last ? "seat" : spec.gates.includes(c) ? "gate" : trapRows?.includes(r) === true ? "trap" : "open";
164
+ cells.push({ col: c, row: r, kind });
165
+ }
166
+ }
167
+ return cells;
168
+ }
@@ -46,6 +46,8 @@ export interface PositionedPrompt {
46
46
  * Nearest prompt strictly within its radius wins; a higher-priority prompt in
47
47
  * range beats any lower-priority one regardless of distance; equal priority
48
48
  * and distance keep the earliest prompt in the list.
49
+ *
50
+ * @capability proximity-prompt a "press E" contextual prompt shown near an interactable
49
51
  */
50
52
  export declare function resolveActivePrompt<T extends PositionedPrompt>(playerPosition: PromptPoint, prompts: readonly T[]): T | null;
51
53
  export declare function promptDisplaysEqual(a: ProximityPromptDisplay, b: ProximityPromptDisplay): boolean;
@@ -17,6 +17,8 @@ export function proximityPrompt({ radius, display, invoke = null }) {
17
17
  * Nearest prompt strictly within its radius wins; a higher-priority prompt in
18
18
  * range beats any lower-priority one regardless of distance; equal priority
19
19
  * and distance keep the earliest prompt in the list.
20
+ *
21
+ * @capability proximity-prompt a "press E" contextual prompt shown near an interactable
20
22
  */
21
23
  export function resolveActivePrompt(playerPosition, prompts) {
22
24
  let active = null;
@@ -15,6 +15,11 @@ export type QteOutcome = {
15
15
  atStep: string;
16
16
  reason: "missed-window" | "wrong-action" | "too-early";
17
17
  };
18
+ /**
19
+ * Evaluate a quick-time-event input sequence against timed hit windows.
20
+ *
21
+ * @capability qte a quick-time-event timed input sequence with hit windows
22
+ */
18
23
  export declare function evaluateQteSequence(steps: readonly QteStep[], inputs: readonly QteInputEvent[]): QteOutcome;
19
24
  export declare function pendingQteStep(steps: readonly QteStep[], elapsedSeconds: number): QteStep | null;
20
25
  export declare function qteProgress(steps: readonly QteStep[], elapsedSeconds: number): number;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Evaluate a quick-time-event input sequence against timed hit windows.
3
+ *
4
+ * @capability qte a quick-time-event timed input sequence with hit windows
5
+ */
1
6
  export function evaluateQteSequence(steps, inputs) {
2
7
  for (let index = 0; index < steps.length; index += 1) {
3
8
  const step = steps[index];
@@ -16,5 +16,10 @@ export interface SkillCheckResult {
16
16
  zone: SkillCheckZone;
17
17
  }
18
18
  export declare function skillCheckMarkerPosition(config: SkillCheckConfig, elapsedSeconds: number): number;
19
+ /**
20
+ * A timing-bar skill check that succeeds when the moving marker is released inside the target zone.
21
+ *
22
+ * @capability skill-check a timing-bar skill check where you release inside a zone
23
+ */
19
24
  export declare function skillCheckZoneAt(config: SkillCheckConfig, elapsedSeconds: number): SkillCheckZone;
20
25
  export declare function evaluateSkillCheck(config: SkillCheckConfig, elapsedSeconds: number): SkillCheckResult;
@@ -8,6 +8,11 @@ function bounce(t, period, max) {
8
8
  export function skillCheckMarkerPosition(config, elapsedSeconds) {
9
9
  return bounce(Math.max(0, elapsedSeconds), config.markerPeriod, config.trackWidth);
10
10
  }
11
+ /**
12
+ * A timing-bar skill check that succeeds when the moving marker is released inside the target zone.
13
+ *
14
+ * @capability skill-check a timing-bar skill check where you release inside a zone
15
+ */
11
16
  export function skillCheckZoneAt(config, elapsedSeconds) {
12
17
  const drift = config.zoneDriftPerSecond ?? 0;
13
18
  if (drift === 0)
@@ -35,13 +35,24 @@ export type MoveResult = {
35
35
  status: "rejected";
36
36
  reason: "invalid-slot" | "empty-slot" | "wrong-kind" | "no-space";
37
37
  };
38
+ /**
39
+ * A bag of stackable items supporting add, remove, count, and move — the base inventory model.
40
+ *
41
+ * @capability inventory-grid a bag of stackable items with add, remove, and move
42
+ * @internal
43
+ */
38
44
  export declare function createEmptyInventory(layout: InventoryLayout): InventoryState;
45
+ /** @internal */
39
46
  export declare function putItem(state: InventoryState, layout: InventoryLayout, traits: ItemTraits, itemId: string, count: number, options?: {
40
47
  slot?: number;
41
48
  }): PutResult;
49
+ /** @internal */
42
50
  export declare function takeItem(state: InventoryState, itemId: string, count: number): TakeResult;
51
+ /** @internal */
43
52
  export declare function countItem(state: InventoryState, itemId: string): number;
53
+ /** @internal */
44
54
  export declare function hasItem(state: InventoryState, itemId: string, count: number): boolean;
55
+ /** @internal */
45
56
  export declare function moveItem(from: InventoryState, fromSlot: number, to: InventoryState, toLayout: InventoryLayout, traits: ItemTraits, toSlot?: number): MoveResult;
46
57
  export interface InventorySet<TId extends string> {
47
58
  put(id: TId, itemId: string, count: number, options?: {
@@ -54,4 +65,5 @@ export interface InventorySet<TId extends string> {
54
65
  state(id: TId): InventoryState;
55
66
  replaceState(id: TId, state: InventoryState): void;
56
67
  }
68
+ /** @internal */
57
69
  export declare function createInventorySet<TId extends string>(layouts: Record<TId, InventoryLayout>, traits: ItemTraits): InventorySet<TId>;
@@ -1,3 +1,9 @@
1
+ /**
2
+ * A bag of stackable items supporting add, remove, count, and move — the base inventory model.
3
+ *
4
+ * @capability inventory-grid a bag of stackable items with add, remove, and move
5
+ * @internal
6
+ */
1
7
  export function createEmptyInventory(layout) {
2
8
  return { slots: new Array(layout.slots).fill(null) };
3
9
  }
@@ -76,11 +82,13 @@ function explicitPut(state, layout, traits, itemId, count, slot) {
76
82
  slots[slot] = { itemId, count: newCount };
77
83
  return { status: "ok", state: { slots } };
78
84
  }
85
+ /** @internal */
79
86
  export function putItem(state, layout, traits, itemId, count, options) {
80
87
  if (options?.slot !== undefined)
81
88
  return explicitPut(state, layout, traits, itemId, count, options.slot);
82
89
  return autoPut(state, layout, traits, itemId, count);
83
90
  }
91
+ /** @internal */
84
92
  export function takeItem(state, itemId, count) {
85
93
  if (count <= 0)
86
94
  return { status: "ok", state };
@@ -99,6 +107,7 @@ export function takeItem(state, itemId, count) {
99
107
  }
100
108
  return { status: "ok", state: { slots } };
101
109
  }
110
+ /** @internal */
102
111
  export function countItem(state, itemId) {
103
112
  let total = 0;
104
113
  for (const slot of state.slots)
@@ -106,9 +115,11 @@ export function countItem(state, itemId) {
106
115
  total += slot.count;
107
116
  return total;
108
117
  }
118
+ /** @internal */
109
119
  export function hasItem(state, itemId, count) {
110
120
  return countItem(state, itemId) >= count;
111
121
  }
122
+ /** @internal */
112
123
  export function moveItem(from, fromSlot, to, toLayout, traits, toSlot) {
113
124
  if (fromSlot < 0 || fromSlot >= from.slots.length)
114
125
  return { status: "rejected", reason: "invalid-slot" };
@@ -160,6 +171,7 @@ export function moveItem(from, fromSlot, to, toLayout, traits, toSlot) {
160
171
  to: sameInventory ? { slots: fromSlots } : { slots: toSlots },
161
172
  };
162
173
  }
174
+ /** @internal */
163
175
  export function createInventorySet(layouts, traits) {
164
176
  const states = new Map();
165
177
  for (const id of Object.keys(layouts)) {
@@ -29,14 +29,28 @@ export interface ShapedRejected {
29
29
  detail?: string;
30
30
  }
31
31
  export type ShapedResult<T> = ShapedPlaceResult<T> | ShapedRejected;
32
+ /** @internal */
32
33
  export declare function normalizeFootprint(footprint: Footprint): Footprint;
34
+ /** @internal */
33
35
  export declare function rotateFootprint(footprint: Footprint, rotation: Rotation): Footprint;
36
+ /** @internal */
34
37
  export declare function occupiedCells(footprint: Footprint, origin: Cell, rotation: Rotation): Cell[];
38
+ /**
39
+ * A spatial grid inventory that holds shaped multi-cell items, Resident-Evil/Tarkov style.
40
+ *
41
+ * @capability tetris-inventory a spatial grid inventory holding shaped multi-cell items
42
+ * @internal
43
+ */
35
44
  export declare function createShapedGrid<T>(width: number, height: number): ShapedGrid<T>;
45
+ /** @internal */
36
46
  export declare function canPlace<T>(grid: ShapedGrid<T>, footprint: Footprint, origin: Cell, rotation: Rotation, ignoreId?: string): ShapedRejection | null;
47
+ /** @internal */
37
48
  export declare function placeShaped<T>(grid: ShapedGrid<T>, item: ShapedItem<T>, origin: Cell, rotation?: Rotation): ShapedResult<T>;
49
+ /** @internal */
38
50
  export declare function removeShaped<T>(grid: ShapedGrid<T>, id: string): ShapedResult<T>;
51
+ /** @internal */
39
52
  export declare function moveShaped<T>(grid: ShapedGrid<T>, id: string, origin: Cell, rotation?: Rotation): ShapedResult<T>;
53
+ /** @internal */
40
54
  export declare function cellOccupant<T>(grid: ShapedGrid<T>, cell: Cell): string | null;
41
55
  export interface GridAdjacencyQuery {
42
56
  cellsOf(id: string): readonly Cell[];
@@ -44,9 +58,11 @@ export interface GridAdjacencyQuery {
44
58
  touching(idA: string, idB: string): boolean;
45
59
  adjacentCells(cells: readonly Cell[]): readonly Cell[];
46
60
  }
61
+ /** @internal */
47
62
  export declare function gridAdjacencyQuery<T>(grid: ShapedGrid<T>, options?: {
48
63
  diagonal?: boolean;
49
64
  }): GridAdjacencyQuery;
65
+ /** @internal */
50
66
  export declare function cellFromPoint(point: {
51
67
  x: number;
52
68
  y: number;