@jgengine/core 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -23,7 +23,9 @@ export interface AxisRange {
23
23
  max: number;
24
24
  }
25
25
  export declare const AXIS_RANGE: Record<AxisName, AxisRange>;
26
+ /** @internal */
26
27
  export declare function clampAxis(value: number, range: AxisRange): number;
28
+ /** @internal */
27
29
  export declare function rampToward(current: number, target: number, rate: number, dt: number): number;
28
30
  /**
29
31
  * Analog control channel — distinct from the digital action bindings. Throttle/brake/steer/handbrake
@@ -31,7 +33,8 @@ export declare function rampToward(current: number, target: number, rate: number
31
33
  * a gamepad axis via `setAnalog`. `sample(dt, isDown, pointer?)` folds the current held-key state into
32
34
  * the smoothed value; a binding's `pointer` source takes over from its keys while a pointer is active,
33
35
  * and a `setAnalog` override replaces both for that axis until cleared.
34
- */
36
+ * @internal
37
+ */
35
38
  export declare class AxisChannel {
36
39
  private readonly bindings;
37
40
  private readonly smoothing;
@@ -68,6 +71,8 @@ export interface GenericAxisChannel<TAxes extends string> {
68
71
  * `AxisChannel` ramps toward, exposed as a pure read for `ctx.input.axis` and headless sampling.
69
72
  * Each axis is its binding's positive-minus-negative held state (or its pointer source while a pointer
70
73
  * is active), clamped to the axis range; axes without a listed range default to bipolar `[-1, 1]`.
71
- */
74
+ * @internal
75
+ */
72
76
  export declare function sampleAxisBindings<TAxes extends string>(bindings: Record<TAxes, AxisBinding>, isDown: (code: string) => boolean, pointer?: PointerAxisState | null, ranges?: Partial<Record<TAxes, AxisRange>>): Record<TAxes, number>;
77
+ /** @internal */
73
78
  export declare function createAxisChannel<TAxes extends string>(config: GenericAxisConfig<TAxes>): GenericAxisChannel<TAxes>;
@@ -6,9 +6,11 @@ export const AXIS_RANGE = {
6
6
  steer: { min: -1, max: 1 },
7
7
  handbrake: { min: 0, max: 1 },
8
8
  };
9
+ /** @internal */
9
10
  export function clampAxis(value, range) {
10
11
  return value < range.min ? range.min : value > range.max ? range.max : value;
11
12
  }
13
+ /** @internal */
12
14
  export function rampToward(current, target, rate, dt) {
13
15
  if (!Number.isFinite(rate))
14
16
  return target;
@@ -29,7 +31,8 @@ function digitalTarget(binding, isDown) {
29
31
  * a gamepad axis via `setAnalog`. `sample(dt, isDown, pointer?)` folds the current held-key state into
30
32
  * the smoothed value; a binding's `pointer` source takes over from its keys while a pointer is active,
31
33
  * and a `setAnalog` override replaces both for that axis until cleared.
32
- */
34
+ * @internal
35
+ */
33
36
  export class AxisChannel {
34
37
  bindings;
35
38
  smoothing;
@@ -80,7 +83,8 @@ const BIPOLAR_RANGE = { min: -1, max: 1 };
80
83
  * `AxisChannel` ramps toward, exposed as a pure read for `ctx.input.axis` and headless sampling.
81
84
  * Each axis is its binding's positive-minus-negative held state (or its pointer source while a pointer
82
85
  * is active), clamped to the axis range; axes without a listed range default to bipolar `[-1, 1]`.
83
- */
86
+ * @internal
87
+ */
84
88
  export function sampleAxisBindings(bindings, isDown, pointer, ranges) {
85
89
  const out = {};
86
90
  for (const axis of Object.keys(bindings)) {
@@ -91,6 +95,7 @@ export function sampleAxisBindings(bindings, isDown, pointer, ranges) {
91
95
  }
92
96
  return out;
93
97
  }
98
+ /** @internal */
94
99
  export function createAxisChannel(config) {
95
100
  const axes = Object.keys(config.bindings);
96
101
  const smoothing = config.smoothing ?? 6;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Optional RTS binding composition over the genre-agnostic selection-bookmark
3
+ * store (`@jgengine/core/scene/selectionBookmarks`). It maps the classic control-
4
+ * group idiom — Ctrl+digit binds, digit recalls, a second digit tap within a
5
+ * window focuses — onto opaque bookmark keys, without pulling input mapping into
6
+ * the store. Games that want a different scheme (named bookmarks, gamepad, touch)
7
+ * skip this and call the store directly.
8
+ *
9
+ * The resolver is pure: it turns a decoded key event plus the last-recall memory
10
+ * into an intent, so the same logic works under any capture layer and stays
11
+ * replay-safe. The caller owns actually binding/recalling and the focus hook.
12
+ */
13
+ /** What a control-group key press means once modifiers and double-tap timing are resolved. */
14
+ export type ControlGroupIntent =
15
+ /** Ctrl+digit: save the current selection under `key`. */
16
+ {
17
+ kind: "bind";
18
+ key: string;
19
+ }
20
+ /** Digit: recall the set saved under `key` into the active selection. */
21
+ | {
22
+ kind: "recall";
23
+ key: string;
24
+ }
25
+ /** Second digit tap within the double-tap window: recall and focus the camera on `key`. */
26
+ | {
27
+ kind: "focus";
28
+ key: string;
29
+ };
30
+ /** A decoded control-group key press plus the memory needed to detect a double-tap. */
31
+ export interface ControlGroupInput {
32
+ /** The pressed group digit, 0–9. */
33
+ digit: number;
34
+ /** True when a bind modifier (Ctrl by default) was held. */
35
+ bindModifier: boolean;
36
+ /** Monotonic time of this press, same clock as `lastRecall`. */
37
+ now: number;
38
+ /** The previous recall (its key and time), or null if none — drives double-tap focus detection. */
39
+ lastRecall: {
40
+ key: string;
41
+ at: number;
42
+ } | null;
43
+ }
44
+ /** Tuning for the control-group idiom: the double-tap focus window and the bookmark-key namespace. */
45
+ export interface ControlGroupOptions {
46
+ /** Max gap (ms) between two recalls of the same group that counts as a focus double-tap. Default 300. */
47
+ doubleTapMs?: number;
48
+ /** Prefix for the generated bookmark key, so control groups can share a store with other bookmarks. Default `""` (bare digit). */
49
+ keyPrefix?: string;
50
+ }
51
+ /**
52
+ * The stable bookmark key for a control-group `digit` under `options.keyPrefix` —
53
+ * the key a caller passes to `SelectionBookmarks.bind`/`recall` to store a group
54
+ * without going through {@link resolveControlGroupIntent}.
55
+ *
56
+ * @capability rts-control-groups map Ctrl+digit / digit / double-tap presses onto selection-bookmark bind / recall / focus intents
57
+ */
58
+ export declare function controlGroupKey(digit: number, options?: ControlGroupOptions): string;
59
+ /**
60
+ * Resolve a control-group key press into a {@link ControlGroupIntent}: Ctrl+digit
61
+ * binds, a bare digit recalls, and a second recall of the same group within
62
+ * `doubleTapMs` focuses. Pure — the caller applies the intent against the store
63
+ * and its own focus hook, and records the returned recall for the next call.
64
+ *
65
+ * @capability rts-control-groups map Ctrl+digit / digit / double-tap presses onto selection-bookmark bind / recall / focus intents
66
+ */
67
+ export declare function resolveControlGroupIntent(input: ControlGroupInput, options?: ControlGroupOptions): ControlGroupIntent;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Optional RTS binding composition over the genre-agnostic selection-bookmark
3
+ * store (`@jgengine/core/scene/selectionBookmarks`). It maps the classic control-
4
+ * group idiom — Ctrl+digit binds, digit recalls, a second digit tap within a
5
+ * window focuses — onto opaque bookmark keys, without pulling input mapping into
6
+ * the store. Games that want a different scheme (named bookmarks, gamepad, touch)
7
+ * skip this and call the store directly.
8
+ *
9
+ * The resolver is pure: it turns a decoded key event plus the last-recall memory
10
+ * into an intent, so the same logic works under any capture layer and stays
11
+ * replay-safe. The caller owns actually binding/recalling and the focus hook.
12
+ */
13
+ /**
14
+ * The stable bookmark key for a control-group `digit` under `options.keyPrefix` —
15
+ * the key a caller passes to `SelectionBookmarks.bind`/`recall` to store a group
16
+ * without going through {@link resolveControlGroupIntent}.
17
+ *
18
+ * @capability rts-control-groups map Ctrl+digit / digit / double-tap presses onto selection-bookmark bind / recall / focus intents
19
+ */
20
+ export function controlGroupKey(digit, options = {}) {
21
+ if (!Number.isInteger(digit) || digit < 0 || digit > 9) {
22
+ throw new Error(`controlGroupKey: digit must be an integer in [0, 9], got ${digit}`);
23
+ }
24
+ return `${options.keyPrefix ?? ""}${digit}`;
25
+ }
26
+ /**
27
+ * Resolve a control-group key press into a {@link ControlGroupIntent}: Ctrl+digit
28
+ * binds, a bare digit recalls, and a second recall of the same group within
29
+ * `doubleTapMs` focuses. Pure — the caller applies the intent against the store
30
+ * and its own focus hook, and records the returned recall for the next call.
31
+ *
32
+ * @capability rts-control-groups map Ctrl+digit / digit / double-tap presses onto selection-bookmark bind / recall / focus intents
33
+ */
34
+ export function resolveControlGroupIntent(input, options = {}) {
35
+ const key = controlGroupKey(input.digit, options);
36
+ if (input.bindModifier)
37
+ return { kind: "bind", key };
38
+ const doubleTapMs = options.doubleTapMs ?? 300;
39
+ const isDoubleTap = input.lastRecall !== null && input.lastRecall.key === key && input.now - input.lastRecall.at <= doubleTapMs;
40
+ return { kind: isDoubleTap ? "focus" : "recall", key };
41
+ }
@@ -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 { type ActionCodesMap } from "./actionBindings.js";
11
13
  export declare const TOUCH_CODE_PREFIX = "touch:";
@@ -31,6 +33,50 @@ export interface TouchGestureBindings {
31
33
  /** Continuous drag: repeats the directional action every `stepPx` of travel. Wins over swipes on its axis, except a flick can still fire the swipe binding for a direction the drag leaves unbound. */
32
34
  drag?: TouchDragBinding;
33
35
  }
36
+ /**
37
+ * Physical silhouette a touch button wears. The capture layer draws each as its
38
+ * own shape — a `pedal` reads as a foot pedal, a `lever` as a pull handle, a
39
+ * `trigger` as a firing paddle — so a control looks like the thing it does
40
+ * instead of a labelled circle. `circle`/`square` are the neutral fallbacks.
41
+ */
42
+ export type TouchButtonShape = "circle" | "square" | "pedal" | "lever" | "trigger" | "wheel" | "tab";
43
+ /**
44
+ * Screen zone a touch cluster or button docks to. The four corners plus the
45
+ * mid `left`/`right` rails (vertical stacks, MMO-style hotbars) and the
46
+ * `bottom-center` / `top-center` strips let controls use the whole viewport
47
+ * instead of piling into one bottom bar.
48
+ */
49
+ export type TouchAnchor = "bottom-left" | "bottom-center" | "bottom-right" | "left" | "right" | "top-left" | "top-center" | "top-right";
50
+ /**
51
+ * Player-selectable skin for the whole touch layer. A style is a material +
52
+ * geometry preset (not just colours), chosen in Settings → Controls and
53
+ * persisted; `glass` is the translucent default, the rest are opt-in looks.
54
+ */
55
+ export type TouchStyle = "glass" | "arcade" | "mechanical" | "minimal";
56
+ /** Every touch skin id, in menu order. */
57
+ export declare const TOUCH_STYLES: readonly TouchStyle[];
58
+ /** Touch skins as `{ value, label }` rows for the Settings → Controls selector. */
59
+ export declare const TOUCH_STYLE_OPTIONS: readonly {
60
+ value: TouchStyle;
61
+ label: string;
62
+ }[];
63
+ /** Skin used when neither the game nor the player picks one. */
64
+ export declare const DEFAULT_TOUCH_STYLE: TouchStyle;
65
+ /** Where each touch cluster docks; unset falls back to the classic bottom layout. */
66
+ export interface TouchLayoutConfig {
67
+ /** Virtual joystick / movement zone. Default `bottom-left`. */
68
+ movement?: TouchAnchor;
69
+ /** Primary action cluster. Default `bottom-right`. */
70
+ actions?: TouchAnchor;
71
+ /** Utility chip row. Default `bottom-center`. */
72
+ utility?: TouchAnchor;
73
+ }
74
+ /** The dock zone each cluster resolved to, after applying game config over the bottom-layout defaults. */
75
+ export interface ResolvedTouchLayout {
76
+ movement: TouchAnchor;
77
+ actions: TouchAnchor;
78
+ utility: TouchAnchor;
79
+ }
34
80
  export interface TouchButtonSpec {
35
81
  action: string;
36
82
  label?: string;
@@ -38,11 +84,21 @@ export interface TouchButtonSpec {
38
84
  icon?: string | false;
39
85
  /** Overrides the derived classification: `primary` renders as a large thumb button, `utility` as a small chip away from the thumb zones. */
40
86
  kind?: TouchButtonKind;
87
+ /** Physical silhouette; unset derives one from the action name (`brake`→pedal, `handbrake`→lever, `fire`→trigger, …). */
88
+ shape?: TouchButtonShape;
89
+ /** Docks this button on its own instead of joining its cluster — e.g. a brake pedal pinned to the right rail. */
90
+ anchor?: TouchAnchor;
91
+ /** Custom art drawn as the button face instead of the built-in silhouette — any image URL or `data:image/svg+xml` URI (a slot frame, spell plate, …); the icon/label still sits on top. */
92
+ image?: string;
93
+ }
94
+ /** Restricts the virtual joystick to one axis — a `horizontal` zone reads as a steering control, freeing throttle/brake to become pedal buttons. */
95
+ export interface TouchMovementConfig {
96
+ axis?: "both" | "horizontal" | "vertical";
41
97
  }
42
98
  export interface TouchControlsConfig {
43
- /** `false` removes the virtual joystick even when movement actions are bound. */
44
- movement?: false;
45
- /** Curated on-screen buttons (order preserved); omit to derive one button per remaining action. */
99
+ /** `false` removes the virtual joystick even when movement actions are bound; an object restricts it to one axis. */
100
+ movement?: false | TouchMovementConfig;
101
+ /** Curated on-screen buttons (order preserved); omit to derive one button per remaining action. Derivation skips session-lifecycle actions (start/restart/pause/menu/…); list one here to dock it anyway. */
46
102
  buttons?: readonly (string | TouchButtonSpec)[];
47
103
  /** Play-surface gestures; actions consumed here stop appearing as derived buttons. */
48
104
  gestures?: TouchGestureBindings;
@@ -52,6 +108,10 @@ export interface TouchControlsConfig {
52
108
  lookSensitivity?: number;
53
109
  /** Actions to leave off the derived button cluster. */
54
110
  hidden?: readonly string[];
111
+ /** Dock each cluster to a screen zone; omit for the classic bottom layout. */
112
+ layout?: TouchLayoutConfig;
113
+ /** Suggested default skin; the player's Settings choice overrides it. Default `glass`. */
114
+ style?: TouchStyle;
55
115
  }
56
116
  export interface TouchJoystick {
57
117
  up: string | null;
@@ -67,6 +127,12 @@ export interface TouchButton {
67
127
  icon: string | false | null;
68
128
  /** `primary` = frequent gameplay verb, rendered as a large thumb button; `utility` = meta action (start, restart, pause, toggles), rendered as a small chip. */
69
129
  kind: TouchButtonKind;
130
+ /** Physical silhouette to draw. */
131
+ shape: TouchButtonShape;
132
+ /** Per-button dock override; null joins the cluster's anchor. */
133
+ anchor: TouchAnchor | null;
134
+ /** Custom face art (image/SVG URL); null draws the built-in silhouette. */
135
+ image: string | null;
70
136
  }
71
137
  export interface TouchScheme {
72
138
  joystick: TouchJoystick | null;
@@ -74,7 +140,17 @@ export interface TouchScheme {
74
140
  gestures: TouchGestureBindings | null;
75
141
  look: boolean;
76
142
  lookSensitivity: number;
143
+ /** Resolved dock zones for the three clusters. */
144
+ layout: ResolvedTouchLayout;
145
+ /** Game-suggested default skin; the shell swaps in the player's choice when set. */
146
+ style: TouchStyle;
77
147
  }
148
+ /**
149
+ * Default silhouette for an action; `circle` when nothing more specific fits.
150
+ *
151
+ * @capability touch-controls default on-screen button silhouette for a touch action
152
+ */
153
+ export declare function touchButtonShape(action: string): TouchButtonShape;
78
154
  export declare function touchButtonKind(action: string): TouchButtonKind;
79
155
  export declare function touchActionLabel(action: string): string;
80
156
  export interface DeriveTouchSchemeOptions {
@@ -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[];