@benev/tact 0.1.0-3 → 0.1.0-4

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 (398) hide show
  1. package/README.md +111 -103
  2. package/package.json +7 -7
  3. package/s/core/bindings/action.ts +14 -4
  4. package/s/core/bindings/parts/defaults.ts +3 -1
  5. package/s/core/bindings/parts/lens-algo.ts +17 -13
  6. package/s/core/bindings/resolver.ts +12 -12
  7. package/s/core/bindings/sample-map.ts +25 -0
  8. package/s/core/bindings/types.ts +3 -1
  9. package/s/core/core.test.ts +46 -34
  10. package/s/core/devices/auto-gamepads.ts +8 -0
  11. package/s/core/devices/device.ts +12 -0
  12. package/s/core/devices/infra/group.ts +24 -0
  13. package/s/core/devices/infra/sampler.ts +22 -0
  14. package/s/core/devices/standard/gamepad.ts +83 -0
  15. package/s/core/{controllers → devices}/standard/index.ts +2 -1
  16. package/s/core/devices/standard/keyboard.ts +31 -0
  17. package/s/core/{controllers → devices}/standard/pointer.ts +15 -11
  18. package/s/core/devices/standard/primary.ts +20 -0
  19. package/s/core/devices/standard/stick.ts +27 -0
  20. package/s/core/{controllers/standard/virtual-gamepad.ts → devices/standard/vpad.ts} +9 -9
  21. package/s/core/{controllers → devices}/types.ts +0 -1
  22. package/s/core/hub/hub.ts +78 -62
  23. package/s/core/hub/meta-bindings.ts +23 -0
  24. package/s/core/hub/parts/connected.ts +15 -0
  25. package/s/core/hub/port.ts +26 -0
  26. package/s/core/hub/types.ts +5 -6
  27. package/s/core/index.ts +12 -14
  28. package/s/core/testing/testing.ts +19 -14
  29. package/s/deck/deck.ts +77 -0
  30. package/s/deck/index.ts +14 -0
  31. package/s/deck/parts/catalog.ts +58 -0
  32. package/s/deck/parts/db.ts +66 -0
  33. package/s/deck/parts/device-skins/device-icons.ts +38 -0
  34. package/s/deck/parts/device-skins/device-skin.ts +29 -0
  35. package/s/deck/parts/local-storage-kv.ts +8 -0
  36. package/s/deck/parts/merge-bindings.ts +21 -0
  37. package/s/deck/parts/overlay-visibility.ts +49 -0
  38. package/s/deck/views/deck-overlay/component.ts +48 -0
  39. package/s/deck/views/deck-overlay/style.css.ts +112 -0
  40. package/s/deck/views/framework.ts +14 -0
  41. package/s/demo/game/game.ts +85 -0
  42. package/s/demo/game/parts/agent.ts +10 -0
  43. package/s/demo/game/parts/game-bindings.ts +20 -0
  44. package/s/demo/game/parts/logic.ts +24 -0
  45. package/s/demo/game/parts/player.ts +32 -0
  46. package/s/demo/game/parts/renderer.ts +113 -0
  47. package/s/demo/game/parts/state.ts +24 -0
  48. package/s/demo/game/parts/virtual-device.ts +13 -0
  49. package/s/demo/main.bundle.ts +6 -12
  50. package/s/demo/main.css +30 -2
  51. package/s/demo/ui/tact-demo/component.ts +13 -0
  52. package/s/demo/ui/tact-demo/style.css.ts +4 -0
  53. package/s/demo/ui/theater/styles.css.ts +57 -0
  54. package/s/demo/ui/theater/view.ts +53 -0
  55. package/s/demo/ui/theater/virtual/style.css.ts +43 -0
  56. package/s/demo/ui/theater/virtual/view.ts +31 -0
  57. package/s/demo/ui/utils/loader.ts +5 -0
  58. package/s/index.html.ts +16 -6
  59. package/s/index.ts +3 -1
  60. package/s/nubs/components.ts +14 -0
  61. package/s/nubs/index.ts +6 -0
  62. package/s/nubs/lookpad/component.ts +45 -0
  63. package/s/nubs/stick/component.ts +115 -0
  64. package/s/nubs/stick/style.css.ts +70 -0
  65. package/s/nubs/{virtual-gamepad/view.ts → vpad/component.ts} +21 -11
  66. package/s/nubs/{virtual-gamepad → vpad}/styles.css.ts +1 -0
  67. package/s/utils/circular-clamp.ts +15 -0
  68. package/s/utils/dispensers.ts +20 -0
  69. package/s/utils/split-axis.ts +10 -2
  70. package/x/core/bindings/action.d.ts +3 -1
  71. package/x/core/bindings/action.js +12 -4
  72. package/x/core/bindings/action.js.map +1 -1
  73. package/x/core/bindings/parts/defaults.js +3 -1
  74. package/x/core/bindings/parts/defaults.js.map +1 -1
  75. package/x/core/bindings/parts/lens-algo.js +14 -7
  76. package/x/core/bindings/parts/lens-algo.js.map +1 -1
  77. package/x/core/bindings/resolver.d.ts +5 -4
  78. package/x/core/bindings/resolver.js +12 -10
  79. package/x/core/bindings/resolver.js.map +1 -1
  80. package/x/core/bindings/sample-map.d.ts +7 -0
  81. package/x/core/bindings/sample-map.js +22 -0
  82. package/x/core/bindings/sample-map.js.map +1 -0
  83. package/x/core/bindings/types.d.ts +3 -1
  84. package/x/core/core.test.d.ts +5 -4
  85. package/x/core/core.test.js +45 -34
  86. package/x/core/core.test.js.map +1 -1
  87. package/x/core/devices/auto-gamepads.d.ts +2 -0
  88. package/x/core/devices/auto-gamepads.js +6 -0
  89. package/x/core/devices/auto-gamepads.js.map +1 -0
  90. package/x/core/devices/device.d.ts +5 -0
  91. package/x/core/devices/device.js +7 -0
  92. package/x/core/devices/device.js.map +1 -0
  93. package/x/core/devices/infra/group.d.ts +8 -0
  94. package/x/core/devices/infra/group.js +21 -0
  95. package/x/core/devices/infra/group.js.map +1 -0
  96. package/x/core/devices/infra/sampler.d.ts +9 -0
  97. package/x/core/devices/infra/sampler.js +18 -0
  98. package/x/core/devices/infra/sampler.js.map +1 -0
  99. package/x/core/devices/standard/gamepad.d.ts +11 -0
  100. package/x/core/devices/standard/gamepad.js +65 -0
  101. package/x/core/devices/standard/gamepad.js.map +1 -0
  102. package/x/core/{controllers → devices}/standard/index.d.ts +2 -1
  103. package/x/core/{controllers → devices}/standard/index.js +2 -1
  104. package/x/core/devices/standard/index.js.map +1 -0
  105. package/x/core/devices/standard/keyboard.d.ts +9 -0
  106. package/x/core/devices/standard/keyboard.js +28 -0
  107. package/x/core/devices/standard/keyboard.js.map +1 -0
  108. package/x/core/devices/standard/pointer.d.ts +15 -0
  109. package/x/core/{controllers → devices}/standard/pointer.js +14 -11
  110. package/x/core/devices/standard/pointer.js.map +1 -0
  111. package/x/core/devices/standard/primary.d.ts +10 -0
  112. package/x/core/devices/standard/primary.js +17 -0
  113. package/x/core/devices/standard/primary.js.map +1 -0
  114. package/x/core/devices/standard/stick.d.ts +15 -0
  115. package/x/core/devices/standard/stick.js +24 -0
  116. package/x/core/devices/standard/stick.js.map +1 -0
  117. package/x/core/devices/standard/vpad.d.ts +7 -0
  118. package/x/core/{controllers/standard/virtual-gamepad.js → devices/standard/vpad.js} +10 -10
  119. package/x/core/devices/standard/vpad.js.map +1 -0
  120. package/x/core/{controllers → devices}/types.d.ts +0 -1
  121. package/x/core/{controllers → devices}/types.js.map +1 -1
  122. package/x/core/hub/hub.d.ts +27 -23
  123. package/x/core/hub/hub.js +71 -61
  124. package/x/core/hub/hub.js.map +1 -1
  125. package/x/core/hub/meta-bindings.d.ts +2 -0
  126. package/x/core/hub/meta-bindings.js +21 -0
  127. package/x/core/hub/meta-bindings.js.map +1 -0
  128. package/x/core/hub/parts/connected.d.ts +14 -0
  129. package/x/core/hub/parts/connected.js +12 -0
  130. package/x/core/hub/parts/connected.js.map +1 -0
  131. package/x/core/hub/port.d.ts +10 -0
  132. package/x/core/hub/port.js +19 -0
  133. package/x/core/hub/port.js.map +1 -0
  134. package/x/core/hub/types.d.ts +5 -5
  135. package/x/core/hub/types.js +1 -1
  136. package/x/core/hub/types.js.map +1 -1
  137. package/x/core/index.d.ts +12 -12
  138. package/x/core/index.js +12 -12
  139. package/x/core/index.js.map +1 -1
  140. package/x/core/testing/testing.d.ts +13 -11
  141. package/x/core/testing/testing.js +14 -13
  142. package/x/core/testing/testing.js.map +1 -1
  143. package/x/deck/deck.d.ts +35 -0
  144. package/x/deck/deck.js +50 -0
  145. package/x/deck/deck.js.map +1 -0
  146. package/x/deck/index.d.ts +10 -0
  147. package/x/deck/index.js +11 -0
  148. package/x/deck/index.js.map +1 -0
  149. package/x/deck/parts/catalog.d.ts +23 -0
  150. package/x/deck/parts/catalog.js +35 -0
  151. package/x/deck/parts/catalog.js.map +1 -0
  152. package/x/deck/parts/db.d.ts +20 -0
  153. package/x/deck/parts/db.js +52 -0
  154. package/x/deck/parts/db.js.map +1 -0
  155. package/x/deck/parts/device-skins/device-icons.d.ts +12 -0
  156. package/x/deck/parts/device-skins/device-icons.js +27 -0
  157. package/x/deck/parts/device-skins/device-icons.js.map +1 -0
  158. package/x/deck/parts/device-skins/device-skin.d.ts +14 -0
  159. package/x/deck/parts/device-skins/device-skin.js +22 -0
  160. package/x/deck/parts/device-skins/device-skin.js.map +1 -0
  161. package/x/deck/parts/local-storage-kv.js +6 -0
  162. package/x/deck/parts/local-storage-kv.js.map +1 -0
  163. package/x/deck/parts/merge-bindings.d.ts +2 -0
  164. package/x/deck/parts/merge-bindings.js +15 -0
  165. package/x/deck/parts/merge-bindings.js.map +1 -0
  166. package/x/deck/parts/overlay-visibility.d.ts +21 -0
  167. package/x/deck/parts/overlay-visibility.js +35 -0
  168. package/x/deck/parts/overlay-visibility.js.map +1 -0
  169. package/x/deck/views/deck-overlay/component.d.ts +2 -0
  170. package/x/deck/views/deck-overlay/component.js +40 -0
  171. package/x/deck/views/deck-overlay/component.js.map +1 -0
  172. package/x/deck/views/deck-overlay/style.css.js +109 -0
  173. package/x/deck/views/deck-overlay/style.css.js.map +1 -0
  174. package/x/deck/views/framework.d.ts +3 -0
  175. package/x/deck/views/framework.js +8 -0
  176. package/x/deck/views/framework.js.map +1 -0
  177. package/x/demo/game/game.d.ts +20 -0
  178. package/x/demo/game/game.js +63 -0
  179. package/x/demo/game/game.js.map +1 -0
  180. package/x/demo/game/parts/agent.d.ts +7 -0
  181. package/x/demo/game/parts/agent.js +8 -0
  182. package/x/demo/game/parts/agent.js.map +1 -0
  183. package/x/demo/game/parts/game-bindings.d.ts +15 -0
  184. package/x/demo/game/parts/game-bindings.js +10 -0
  185. package/x/demo/game/parts/game-bindings.js.map +1 -0
  186. package/x/demo/game/parts/logic.d.ts +8 -0
  187. package/x/demo/game/parts/logic.js +21 -0
  188. package/x/demo/game/parts/logic.js.map +1 -0
  189. package/x/demo/game/parts/player.d.ts +14 -0
  190. package/x/demo/game/parts/player.js +26 -0
  191. package/x/demo/game/parts/player.js.map +1 -0
  192. package/x/demo/game/parts/renderer.d.ts +13 -0
  193. package/x/demo/game/parts/renderer.js +91 -0
  194. package/x/demo/game/parts/renderer.js.map +1 -0
  195. package/x/demo/game/parts/state.d.ts +8 -0
  196. package/x/demo/game/parts/state.js +20 -0
  197. package/x/demo/game/parts/state.js.map +1 -0
  198. package/x/demo/game/parts/virtual-device.d.ts +8 -0
  199. package/x/demo/game/parts/virtual-device.js +11 -0
  200. package/x/demo/game/parts/virtual-device.js.map +1 -0
  201. package/x/demo/main.bundle.js +4 -10
  202. package/x/demo/main.bundle.js.map +1 -1
  203. package/x/demo/main.bundle.min.js +315 -54
  204. package/x/demo/main.bundle.min.js.map +4 -4
  205. package/x/demo/main.css +30 -2
  206. package/x/demo/ui/tact-demo/component.d.ts +4 -0
  207. package/x/demo/ui/tact-demo/component.js +12 -0
  208. package/x/demo/ui/tact-demo/component.js.map +1 -0
  209. package/x/demo/ui/tact-demo/style.css.d.ts +2 -0
  210. package/x/demo/ui/tact-demo/style.css.js +3 -0
  211. package/x/demo/ui/tact-demo/style.css.js.map +1 -0
  212. package/x/demo/ui/theater/styles.css.js +56 -0
  213. package/x/demo/ui/theater/styles.css.js.map +1 -0
  214. package/x/demo/ui/theater/view.d.ts +2 -0
  215. package/x/demo/ui/theater/view.js +42 -0
  216. package/x/demo/ui/theater/view.js.map +1 -0
  217. package/x/demo/ui/theater/virtual/style.css.d.ts +2 -0
  218. package/x/demo/ui/theater/virtual/style.css.js +42 -0
  219. package/x/demo/ui/theater/virtual/style.css.js.map +1 -0
  220. package/x/demo/ui/theater/virtual/view.d.ts +4 -0
  221. package/x/demo/ui/theater/virtual/view.js +19 -0
  222. package/x/demo/ui/theater/virtual/view.js.map +1 -0
  223. package/x/demo/ui/utils/loader.d.ts +1 -0
  224. package/x/demo/ui/utils/loader.js +3 -0
  225. package/x/demo/ui/utils/loader.js.map +1 -0
  226. package/x/index.d.ts +3 -1
  227. package/x/index.html +47 -8
  228. package/x/index.html.js +16 -6
  229. package/x/index.html.js.map +1 -1
  230. package/x/index.js +3 -1
  231. package/x/index.js.map +1 -1
  232. package/x/nubs/components.d.ts +9 -0
  233. package/x/nubs/components.js +11 -0
  234. package/x/nubs/components.js.map +1 -0
  235. package/x/nubs/index.d.ts +4 -0
  236. package/x/nubs/index.js +5 -0
  237. package/x/nubs/index.js.map +1 -0
  238. package/x/nubs/lookpad/component.d.ts +4 -0
  239. package/x/nubs/lookpad/component.js +36 -0
  240. package/x/nubs/lookpad/component.js.map +1 -0
  241. package/x/nubs/stick/component.d.ts +368 -0
  242. package/x/nubs/stick/component.js +101 -0
  243. package/x/nubs/stick/component.js.map +1 -0
  244. package/x/nubs/stick/style.css.d.ts +2 -0
  245. package/x/nubs/stick/style.css.js +69 -0
  246. package/x/nubs/stick/style.css.js.map +1 -0
  247. package/x/nubs/vpad/component.d.ts +368 -0
  248. package/x/nubs/{virtual-gamepad/view.js → vpad/component.js} +20 -11
  249. package/x/nubs/vpad/component.js.map +1 -0
  250. package/x/nubs/vpad/styles.css.d.ts +2 -0
  251. package/x/nubs/vpad/styles.css.js.map +1 -0
  252. package/x/nubs/vpad/utils/gamepad-inputs.js.map +1 -0
  253. package/x/nubs/vpad/utils/prevent-default-touch-shenanigans.js.map +1 -0
  254. package/x/nubs/vpad/utils/touch-tracking.js.map +1 -0
  255. package/x/utils/circular-clamp.d.ts +2 -0
  256. package/x/utils/circular-clamp.js +8 -0
  257. package/x/utils/circular-clamp.js.map +1 -0
  258. package/x/utils/dispensers.d.ts +7 -0
  259. package/x/utils/dispensers.js +16 -0
  260. package/x/utils/dispensers.js.map +1 -0
  261. package/x/utils/split-axis.d.ts +7 -0
  262. package/x/utils/split-axis.js +7 -2
  263. package/x/utils/split-axis.js.map +1 -1
  264. package/s/core/controllers/controller.ts +0 -7
  265. package/s/core/controllers/infra/group.ts +0 -17
  266. package/s/core/controllers/infra/sampler.ts +0 -22
  267. package/s/core/controllers/standard/gamepad.ts +0 -77
  268. package/s/core/controllers/standard/keyboard.ts +0 -50
  269. package/s/core/controllers/standard/stick.ts +0 -30
  270. package/s/core/deck/deck.ts +0 -40
  271. package/s/core/deck/parts/bindings-depot.ts +0 -24
  272. package/s/core/deck/parts/local-storage-kv.ts +0 -7
  273. package/s/core/hub/auto-gamepads.ts +0 -8
  274. package/s/core/hub/bindings.ts +0 -18
  275. package/s/core/port/port.ts +0 -34
  276. package/s/core/port/utils/aggregate_samples_into_map.ts +0 -20
  277. package/s/core/port/utils/wipe_samples_map.ts +0 -8
  278. package/s/nubs/lookpad/utils/listeners.ts +0 -53
  279. package/s/nubs/lookpad/view.ts +0 -32
  280. package/s/nubs/stick/styles.ts +0 -22
  281. package/s/nubs/stick/utils/calculate_new_vector_from_pointer_position.ts +0 -27
  282. package/s/nubs/stick/utils/find_closest_point_on_circle.ts +0 -15
  283. package/s/nubs/stick/utils/make_pointer_listeners.ts +0 -50
  284. package/s/nubs/stick/utils/within_radius.ts +0 -6
  285. package/s/nubs/stick/view.ts +0 -50
  286. package/s/nubs/stick-graphic/styles.ts +0 -38
  287. package/s/nubs/stick-graphic/types/basis.ts +0 -5
  288. package/s/nubs/stick-graphic/utils/calculate_basis.ts +0 -19
  289. package/s/nubs/stick-graphic/utils/stick_vector_to_pixels.ts +0 -13
  290. package/s/nubs/stick-graphic/utils/transform.ts +0 -10
  291. package/s/nubs/stick-graphic/view.ts +0 -43
  292. package/x/core/controllers/controller.d.ts +0 -4
  293. package/x/core/controllers/controller.js +0 -3
  294. package/x/core/controllers/controller.js.map +0 -1
  295. package/x/core/controllers/infra/group.d.ts +0 -7
  296. package/x/core/controllers/infra/group.js +0 -13
  297. package/x/core/controllers/infra/group.js.map +0 -1
  298. package/x/core/controllers/infra/sampler.d.ts +0 -8
  299. package/x/core/controllers/infra/sampler.js +0 -17
  300. package/x/core/controllers/infra/sampler.js.map +0 -1
  301. package/x/core/controllers/standard/gamepad.d.ts +0 -9
  302. package/x/core/controllers/standard/gamepad.js +0 -66
  303. package/x/core/controllers/standard/gamepad.js.map +0 -1
  304. package/x/core/controllers/standard/index.js.map +0 -1
  305. package/x/core/controllers/standard/keyboard.d.ts +0 -9
  306. package/x/core/controllers/standard/keyboard.js +0 -39
  307. package/x/core/controllers/standard/keyboard.js.map +0 -1
  308. package/x/core/controllers/standard/pointer.d.ts +0 -11
  309. package/x/core/controllers/standard/pointer.js.map +0 -1
  310. package/x/core/controllers/standard/stick.d.ts +0 -15
  311. package/x/core/controllers/standard/stick.js +0 -27
  312. package/x/core/controllers/standard/stick.js.map +0 -1
  313. package/x/core/controllers/standard/virtual-gamepad.d.ts +0 -7
  314. package/x/core/controllers/standard/virtual-gamepad.js.map +0 -1
  315. package/x/core/deck/deck.d.ts +0 -16
  316. package/x/core/deck/deck.js +0 -31
  317. package/x/core/deck/deck.js.map +0 -1
  318. package/x/core/deck/parts/bindings-depot.d.ts +0 -9
  319. package/x/core/deck/parts/bindings-depot.js +0 -19
  320. package/x/core/deck/parts/bindings-depot.js.map +0 -1
  321. package/x/core/deck/parts/local-storage-kv.js +0 -5
  322. package/x/core/deck/parts/local-storage-kv.js.map +0 -1
  323. package/x/core/hub/auto-gamepads.d.ts +0 -2
  324. package/x/core/hub/auto-gamepads.js +0 -6
  325. package/x/core/hub/auto-gamepads.js.map +0 -1
  326. package/x/core/hub/bindings.d.ts +0 -2
  327. package/x/core/hub/bindings.js +0 -16
  328. package/x/core/hub/bindings.js.map +0 -1
  329. package/x/core/port/port.d.ts +0 -12
  330. package/x/core/port/port.js +0 -25
  331. package/x/core/port/port.js.map +0 -1
  332. package/x/core/port/utils/aggregate_samples_into_map.d.ts +0 -3
  333. package/x/core/port/utils/aggregate_samples_into_map.js +0 -11
  334. package/x/core/port/utils/aggregate_samples_into_map.js.map +0 -1
  335. package/x/core/port/utils/wipe_samples_map.d.ts +0 -2
  336. package/x/core/port/utils/wipe_samples_map.js +0 -5
  337. package/x/core/port/utils/wipe_samples_map.js.map +0 -1
  338. package/x/nubs/lookpad/utils/listeners.d.ts +0 -19
  339. package/x/nubs/lookpad/utils/listeners.js +0 -37
  340. package/x/nubs/lookpad/utils/listeners.js.map +0 -1
  341. package/x/nubs/lookpad/view.d.ts +0 -1
  342. package/x/nubs/lookpad/view.js +0 -24
  343. package/x/nubs/lookpad/view.js.map +0 -1
  344. package/x/nubs/stick/styles.d.ts +0 -1
  345. package/x/nubs/stick/styles.js +0 -22
  346. package/x/nubs/stick/styles.js.map +0 -1
  347. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.d.ts +0 -3
  348. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js +0 -16
  349. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js.map +0 -1
  350. package/x/nubs/stick/utils/find_closest_point_on_circle.d.ts +0 -2
  351. package/x/nubs/stick/utils/find_closest_point_on_circle.js +0 -6
  352. package/x/nubs/stick/utils/find_closest_point_on_circle.js.map +0 -1
  353. package/x/nubs/stick/utils/make_pointer_listeners.d.ts +0 -16
  354. package/x/nubs/stick/utils/make_pointer_listeners.js +0 -34
  355. package/x/nubs/stick/utils/make_pointer_listeners.js.map +0 -1
  356. package/x/nubs/stick/utils/within_radius.d.ts +0 -2
  357. package/x/nubs/stick/utils/within_radius.js +0 -4
  358. package/x/nubs/stick/utils/within_radius.js.map +0 -1
  359. package/x/nubs/stick/view.d.ts +0 -2
  360. package/x/nubs/stick/view.js +0 -38
  361. package/x/nubs/stick/view.js.map +0 -1
  362. package/x/nubs/stick-graphic/styles.js +0 -38
  363. package/x/nubs/stick-graphic/styles.js.map +0 -1
  364. package/x/nubs/stick-graphic/types/basis.d.ts +0 -4
  365. package/x/nubs/stick-graphic/types/basis.js +0 -2
  366. package/x/nubs/stick-graphic/types/basis.js.map +0 -1
  367. package/x/nubs/stick-graphic/utils/calculate_basis.d.ts +0 -2
  368. package/x/nubs/stick-graphic/utils/calculate_basis.js +0 -10
  369. package/x/nubs/stick-graphic/utils/calculate_basis.js.map +0 -1
  370. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.d.ts +0 -2
  371. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js +0 -7
  372. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js.map +0 -1
  373. package/x/nubs/stick-graphic/utils/transform.d.ts +0 -2
  374. package/x/nubs/stick-graphic/utils/transform.js +0 -7
  375. package/x/nubs/stick-graphic/utils/transform.js.map +0 -1
  376. package/x/nubs/stick-graphic/view.d.ts +0 -3
  377. package/x/nubs/stick-graphic/view.js +0 -30
  378. package/x/nubs/stick-graphic/view.js.map +0 -1
  379. package/x/nubs/virtual-gamepad/styles.css.js.map +0 -1
  380. package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js.map +0 -1
  381. package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js.map +0 -1
  382. package/x/nubs/virtual-gamepad/utils/touch-tracking.js.map +0 -1
  383. package/x/nubs/virtual-gamepad/view.d.ts +0 -2
  384. package/x/nubs/virtual-gamepad/view.js.map +0 -1
  385. /package/s/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.ts +0 -0
  386. /package/s/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.ts +0 -0
  387. /package/s/nubs/{virtual-gamepad → vpad}/utils/touch-tracking.ts +0 -0
  388. /package/x/core/{controllers → devices}/types.js +0 -0
  389. /package/x/{core/deck → deck}/parts/local-storage-kv.d.ts +0 -0
  390. /package/x/{nubs/virtual-gamepad/styles.css.d.ts → deck/views/deck-overlay/style.css.d.ts} +0 -0
  391. /package/x/{nubs/stick-graphic/styles.d.ts → demo/ui/theater/styles.css.d.ts} +0 -0
  392. /package/x/nubs/{virtual-gamepad → vpad}/styles.css.js +0 -0
  393. /package/x/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.d.ts +0 -0
  394. /package/x/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.js +0 -0
  395. /package/x/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.d.ts +0 -0
  396. /package/x/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.js +0 -0
  397. /package/x/nubs/{virtual-gamepad → vpad}/utils/touch-tracking.d.ts +0 -0
  398. /package/x/nubs/{virtual-gamepad → vpad}/utils/touch-tracking.js +0 -0
package/README.md CHANGED
@@ -1,4 +1,17 @@
1
1
 
2
+
3
+ > [!CAUTION]
4
+ > ### 🚨🚨 TACT IS UNDER DEVELOPMENT!! 🚨🚨
5
+ > *everything is half-broken right now.. just gimmie a minute to finish coding this, will ya?*
6
+
7
+ <br></br>
8
+
9
+ ---
10
+
11
+ ---
12
+
13
+ <br></br>
14
+
2
15
  # 🎮 @benev/tact
3
16
  > *web game input library, from keypress to couch co-op*
4
17
 
@@ -6,21 +19,24 @@
6
19
  npm install @benev/tact
7
20
  ```
8
21
 
9
- - 🛹 **deck** full setup with localstorate persistence
10
- - 🎮 **controllers** produce user input samples
11
- - 🧩 **bindings** describe how actions interpret samples
12
- - 🔌 **port** updates actions by interpreting samples
13
- - 🛞 **hub** plugs controllers into ports (multi-gamepad couch co-op!)
14
- - 📱 **nubs** is mobile ui virtual gamepad stuff
22
+ tact is a toolkit for handling user inputs on the web.
23
+ it's good at user-customizable keybindings, multiple gamepad support, and mobile ui.
15
24
 
25
+ - 🛹 **[#deck](#deck)** full setup with localstorage persistence
26
+ - 🎮 **[#devices](#devices)** produce user input samples
27
+ - 🧩 **[#bindings](#bindings)** describe how actions interpret samples
28
+ - 🔌 **[#port](#port)** updates actions by interpreting samples
29
+ - 🛞 **[#hub](#hub)** plugs devices into ports (multi-gamepad couch co-op!)
30
+ - 📱 **[#nubs](#nubs)** is mobile ui virtual gamepad stuff
16
31
 
17
32
 
18
33
  <br/><br/>
34
+ <a id="deck"></a>
19
35
 
20
36
  ## 🍋 tact deck
21
- > *the full setup*
37
+ > *full setup with ui, batteries included*
22
38
 
23
- the deck is the heart of tact, tying all the pieces together and putting a bow in it for you.
39
+ the deck ties together all the important pieces of tact into a single user experience, complete with ui components.
24
40
 
25
41
  ### 🛹 deck setup
26
42
  - **import stuff from tact**
@@ -31,7 +47,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
31
47
  ```ts
32
48
  const deck = await tact.Deck.load({
33
49
 
34
- // how many players ports are possible? 1 is fine..
50
+ // how many player ports are possible? 1 is fine..
35
51
  portCount: 4,
36
52
 
37
53
  // where to store the user-customized bindings
@@ -39,11 +55,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
39
55
 
40
56
  // default archetypal bindings for your game
41
57
  bindings: {
42
- ...tact.hubBindings(),
43
- walking: {
44
- forward: "KeyW",
45
- jump: "Space",
46
- },
58
+ walking: {forward: "KeyW", jump: "Space"},
47
59
  gunning: {
48
60
  shoot: ["or", "pointer.button.left", "gamepad.trigger.right"],
49
61
  },
@@ -51,77 +63,73 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
51
63
  })
52
64
  ```
53
65
 
54
- ### 🛹 plug controllers into the hub
66
+ ### 🛹 plug devices into the hub
55
67
  - **plug a keyboard/mouse player into the hub**
56
68
  ```ts
57
- deck.hub.plug(
58
- new tact.GroupController(
59
- new tact.KeyboardController(),
60
- new tact.PointerController(),
61
- new tact.VirtualGamepadController(),
62
- )
63
- )
64
- ```
65
- - **auto connect/disconnect gamepads as they come and go**
69
+ deck.hub.plug(new tact.PrimaryDevice())
70
+ ```
71
+ - **automatically detect and plug gamepads**
66
72
  ```ts
67
73
  tact.autoGamepads(deck.hub.plug)
68
74
  ```
69
75
 
70
76
  ### 🛹 do your gameplay
71
- - **start with what modes you want enabled in your game**
72
- ```ts
73
- for (const port of deck.ports)
74
- port.modes.adds("walking", "gunning")
75
- ```
76
- - **poll the deck, interrogate actions for your gameplay**
77
+ - **poll the deck, interrogate actions**
77
78
  ```ts
78
- onEachTickInYourGame(() => {
79
+ myGameLoop(() => {
79
80
 
80
81
  // do your polling
81
82
  const [p1, p2, p3, p4] = deck.hub.poll()
82
83
 
83
84
  // check if the first player is pressing "forward" action
84
- p1.walking.forward.pressed // true
85
+ p1.actions.walking.forward.pressed // true
85
86
 
86
87
  // check how hard the second player is pulling that trigger
87
- p2.gunning.shoot.value // 0.123
88
+ p2.actions.gunning.shoot.value // 0.123
88
89
  })
89
90
  ```
90
91
 
92
+ ### 🛹 deck ui: the overlay
93
+ - **register the deck's web components to the dom**
94
+ ```ts
95
+ deck.registerComponents()
96
+ ```
97
+ - **place the ui on top of your game canvas**
98
+ ```html
99
+ <deck-overlay></deck-overlay>
100
+ ```
101
+
91
102
 
92
103
 
93
104
  <br/><br/>
105
+ <a id="devices"></a>
94
106
 
95
- ## 🍋 tact controllers
107
+ ## 🍋 tact devices
96
108
  > *sources of user input "samples"*
97
109
 
98
110
  ### 🎮 polling is good, actually
99
111
  - tact operates on the basis of *polling*
100
112
  - *"but polling is bad"* says you — but no — you're wrong — polling is unironically *based,* and you *should* do it
101
- - in a game, we want to be processing our inputs *every frame*
102
- - the gift of polling is total control over *when* inputs are processed
113
+ - the gift of polling is total control over *when* inputs are processed, this is good for games
103
114
  - i will elaborate no further 🗿
104
115
 
105
- ### 🎮 basically how a controller works
106
- - make a controller
116
+ ### 🎮 basically how a device works
117
+ - make a device
107
118
  ```ts
108
- const keyboard = new tact.KeyboardController()
119
+ const keyboard = new tact.KeyboardDevice()
109
120
  ```
110
- - take samples each frame
121
+ - reading samples looks like this
111
122
  ```ts
112
- const samples = keyboard.takeSamples()
113
- // [
114
- // ["KeyA", 1],
115
- // ["Space", 0]
116
- // ]
123
+ for (const sample of keyboard.samples())
124
+ console.log(sample) // ["KeyA", 1]
117
125
  ```
118
- - some controllers have disposers to call when you're done with them
126
+ - some devices have disposers to call when you're done with them
119
127
  ```ts
120
128
  keyboard.dispose()
121
129
  ```
122
130
 
123
131
  ### 🎮 samples explained
124
- - a sample is a raw input of type `[code: string, value: number]`
132
+ - a sample is a raw input tuple of type `[code: string, value: number]`
125
133
  - a sample has a `code` string
126
134
  - it's either a [standard keycode](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values), like `KeyA`
127
135
  - or it's something we made up, like `pointer.button.left` or `gamepad.trigger.right`
@@ -134,13 +142,13 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
134
142
  - don't worry about sensitivity, deadzones, values like `0.00001` — actions will account for all that using bindings later on
135
143
 
136
144
  ### 🎮 sample code reference
137
- - **KeyboardController**
145
+ - **KeyboardDevice**
138
146
  - any [standard keycode](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values)
139
147
  - `KeyA`
140
148
  - `Space`
141
149
  - `Digit2`
142
150
  - etc
143
- - **PointerController**
151
+ - **PointerDevice**
144
152
  - mouse buttons
145
153
  - `pointer.button.left`
146
154
  - `pointer.button.right`
@@ -157,7 +165,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
157
165
  - `pointer.move.down`
158
166
  - `pointer.move.left`
159
167
  - `pointer.move.right`
160
- - **GamepadController**
168
+ - **GamepadDevice**
161
169
  - gamepad buttons
162
170
  - `gamepad.a`
163
171
  - `gamepad.b`
@@ -189,6 +197,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
189
197
 
190
198
 
191
199
  <br/><br/>
200
+ <a id="bindings"></a>
192
201
 
193
202
  ## 🍋 tact bindings
194
203
  > *keybindings! they describe how actions interpret samples*
@@ -197,10 +206,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
197
206
  - **let's start with a small example:**
198
207
  ```ts
199
208
  const bindings = tact.asBindings({
200
- walking: {
201
- forward: "KeyW",
202
- jump: "Space",
203
- },
209
+ walking: {forward: "KeyW", jump: "Space"},
204
210
  gunning: {
205
211
  shoot: ["or", "pointer.button.left", "gamepad.trigger.right"],
206
212
  },
@@ -227,7 +233,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
227
233
  - **you can get really weird**
228
234
  ```ts
229
235
  ["cond",
230
- ["code", "gamepad.trigger.right", {deadzone: 0.5, timing: ["tap"]}],
236
+ ["code", "gamepad.trigger.right", {range: [0, 0.5], timing: ["tap"]}],
231
237
  ["and", "gamepad.bumper.left", ["not", "gamepad.trigger.left"]],
232
238
  ]
233
239
  ```
@@ -240,7 +246,7 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
240
246
  ["code", "KeyA", {
241
247
  scale: 1,
242
248
  invert: false,
243
- deadzone: 0.2,
249
+ deadzone: 0,
244
250
  timing: ["direct"],
245
251
  }]
246
252
  ```
@@ -285,30 +291,31 @@ the deck is the heart of tact, tying all the pieces together and putting a bow i
285
291
 
286
292
 
287
293
  <br/><br/>
294
+ <a id="port"></a>
288
295
 
289
296
  ## 🍋 tact port
290
297
  > *polling gives you "actions"*
291
298
 
292
299
  a port represents a single playable port, and you poll it each frame to resolve actions for you to read.
293
300
 
294
- ### 🔌 port basics
301
+ ### 🔌 port setup
295
302
  - **make a port**
296
303
  ```ts
297
304
  const port = new tact.Port(bindings)
298
305
  ```
299
- - **attach some controllers to the port**
306
+ - **attach some devices to the port**
300
307
  ```ts
301
- port.controllers
302
- .add(new tact.KeyboardController())
303
- .add(new tact.PointerController())
304
- .add(new tact.VirtualGamepadController())
308
+ port.devices
309
+ .add(new tact.KeyboardDevice())
310
+ .add(new tact.PointerDevice())
311
+ .add(new tact.VpadDevice())
305
312
  ```
306
- - you can add/delete controllers from the set any time
307
- - **don't forget to enable modes!**
313
+ - you can add/delete devices from the set any time
314
+ - **manipulate modes**
308
315
  ```ts
316
+ port.modes.clear()
309
317
  port.modes.add("walking")
310
318
  ```
311
- - if you don't enable any modes, no actions will happen
312
319
  - actions only happen for enabled modes
313
320
  - you can toggle modes on and off by adding/deleting them from the modes set
314
321
  - **you can update the bindings any time**
@@ -317,20 +324,20 @@ a port represents a single playable port, and you poll it each frame to resolve
317
324
  ```
318
325
  - **wire up gamepad auto connect/disconnect**
319
326
  ```ts
320
- tact.autoGamepads(controller => {
321
- port.controllers.add(controller)
322
- return () => port.controllers.delete(controller)
327
+ tact.autoGamepads(device => {
328
+ port.devices.add(device)
329
+ return () => port.devices.delete(device)
323
330
  })
324
331
  ```
325
332
 
326
333
  ### 🔌 interrogating actions
327
334
  - **poll the port every frame**
328
335
  ```ts
329
- const actions = port.poll()
336
+ port.poll()
330
337
  ```
331
338
  - **now you can inspect the `actions`**
332
339
  ```ts
333
- actions.walking.forward.value // 1
340
+ port.actions.walking.forward.value // 1
334
341
  ```
335
342
  - `walking` is a `mode`
336
343
  - `forward` is an `action`
@@ -344,80 +351,81 @@ a port represents a single playable port, and you poll it each frame to resolve
344
351
 
345
352
 
346
353
  <br/><br/>
354
+ <a id="hub"></a>
347
355
 
348
356
  ## 🍋 tact hub
349
357
  > *multiple gamepads! couch co-op is so back*
350
358
 
351
359
  you know the way old-timey game consoles had four controller ports on the front?
352
360
 
353
- the hub embraces that analogy, helping you coordinate the plugging and unplugging of virtual controllers into its virtual ports.
361
+ the hub embraces that analogy, helping you coordinate the plugging and unplugging of virtual controller devices into its virtual ports.
354
362
 
355
363
  ### 🛞 create a hub with ports
356
- - **adopt standard hub bindings**
357
- ```ts
358
- const hubBindings = {
359
- ...yourBindings,
360
-
361
- // mixin standard hub bindings
362
- ...tact.hubBindings(),
363
- }
364
- ```
365
- - hub bindings let players shimmy what port their controller is plugged into
366
- - gamepad: hold gamma (middle button) and press bumpers
367
- - keyboard: left bracket or right bracket
368
364
  - **make hub with multiple ports at the ready**
369
365
  ```ts
370
366
  const hub = new tact.Hub([
371
- new tact.Port(hubBindings),
372
- new tact.Port(hubBindings),
373
- new tact.Port(hubBindings),
374
- new tact.Port(hubBindings),
367
+ new tact.Port(bindings),
368
+ new tact.Port(bindings),
369
+ new tact.Port(bindings),
370
+ new tact.Port(bindings),
375
371
  ])
376
372
  ```
377
373
  - yes that's right — each player port gets its own bindings 🤯
378
374
 
379
- ### 🛞 plug in some controllers
375
+ ### 🛞 plug in some devices
380
376
  - **let's plug in the keyboard/mouse player**
381
377
  ```ts
382
- hub.plug(
383
- new tact.GroupController(
384
- new tact.KeyboardController(),
385
- new tact.PointerController(),
386
- new tact.VirtualGamepadController(),
387
- )
388
- )
389
- ```
390
- - the hub requires a single controller to represent a player, thus we can use a `GroupController` to combine multple controllers into one
378
+ hub.plug(new tact.PrimaryDevice())
379
+ ```
380
+ - the hub requires a single device to represent a player, so you can use a `GroupDevice` to combine multple devices into one
391
381
  - **wire up gamepad auto connect/disconnect**
392
382
  ```ts
393
383
  tact.autoGamepads(hub.plug)
394
384
  ```
395
385
 
396
- ### 🛞 it's gaming time
386
+ ### 🛞 now we're gaming
397
387
  - **do your polling, interrogate those actions**
398
388
  ```ts
399
389
  const [p1, p2, p3, p4] = hub.poll()
400
390
 
401
- p1.walking.jump.value // 1
402
- p2.walking.jump.value // 0
391
+ p1.actions.walking.jump.value // 1
392
+ p2.actions.walking.jump.value // 0
403
393
  ```
404
394
 
405
395
 
406
396
 
407
397
  <br/><br/>
398
+ <a id="nubs"></a>
408
399
 
409
400
  ## 🍋 tact nubs
410
401
  > *mobile ui like virtual thumbsticks and buttons*
411
402
 
403
+ ### 📱 nubs setup
404
+ - **register nub components to dom**
405
+ ```ts
406
+ tact.registerNubs()
407
+ ```
408
+ - **place nub components onto your html page**
409
+ ```html
410
+ <nub-stick></nub-stick>
411
+ ```
412
+
412
413
  ### 📱 nub stick
413
- > TODO lol need to write docs
414
+ - **place a nub-stick onto your page**
415
+ ```html
416
+ <nub-stick></nub-stick>
417
+ ```
418
+ - **get the stick device, plug it into your hub or whatever**
419
+ ```ts
420
+ const nubStick = document.queryElement<tact.NubStick>("nub-stick")!
414
421
 
415
- ### 📱 nub virtual gamepad
416
- > TODO lol need to write docs
422
+ deck.hub.plug(nubStick.device)
423
+ ```
417
424
 
418
425
 
419
426
 
420
427
  <br/><br/>
428
+ <a id="benev"></a>
421
429
 
422
430
  ## 🍋 tact is by https://benevolent.games/
423
431
  > *building the future of web games*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@benev/tact",
3
- "version": "0.1.0-3",
3
+ "version": "0.1.0-4",
4
4
  "description": "keybindings and gamepad support for web games",
5
5
  "license": "MIT",
6
6
  "author": "Chase Moskal <chasemoskal@gmail.com>",
@@ -32,15 +32,15 @@
32
32
  "lit": "^3.3.1"
33
33
  },
34
34
  "dependencies": {
35
- "@benev/math": "^0.2.0-1",
35
+ "@benev/math": "^0.2.0-4",
36
36
  "@e280/kv": "^0.1.0",
37
- "@e280/sly": "^0.1.1",
38
- "@e280/strata": "^0.1.0",
39
- "@e280/stz": "^0.2.0-5"
37
+ "@e280/sly": "^0.2.0-16",
38
+ "@e280/strata": "^0.2.0-13",
39
+ "@e280/stz": "^0.2.5"
40
40
  },
41
41
  "devDependencies": {
42
- "@e280/science": "^0.1.1",
43
- "@e280/scute": "^0.0.0",
42
+ "@e280/science": "^0.1.2",
43
+ "@e280/scute": "^0.1.0",
44
44
  "http-server": "^14.1.1",
45
45
  "npm-run-all": "^4.1.5",
46
46
  "typescript": "^5.9.2"
@@ -1,16 +1,26 @@
1
1
 
2
+ import {sub} from "@e280/stz"
2
3
  import {isPressed} from "./parts/is-pressed.js"
3
4
 
4
5
  export class Action {
6
+ on = sub<[Action]>()
7
+ onDown = sub<[Action]>()
8
+
5
9
  #value = 0
6
10
  #previous = 0
7
11
 
8
- static update(action: Action, value: number) {
9
- action.#previous = action.#value
10
- action.#value = value
12
+ get value() {
13
+ return this.#value
14
+ }
15
+
16
+ set value(v: number) {
17
+ this.#previous = this.#value
18
+ this.#value = v
19
+
20
+ this.on.publish(this)
21
+ if (this.down) this.onDown.publish(this)
11
22
  }
12
23
 
13
- get value() { return this.#value }
14
24
  get previous() { return this.#previous }
15
25
  get changed() { return this.#value !== this.#previous }
16
26
  get pressed() { return isPressed(this.#value) }
@@ -15,7 +15,9 @@ function defaultCodeSettings(): CodeSettings {
15
15
  return {
16
16
  scale: 1,
17
17
  invert: false,
18
- deadzone: 0.2,
18
+ range: null,
19
+ bottom: null,
20
+ top: null,
19
21
  timing: ["direct"],
20
22
  }
21
23
  }
@@ -11,23 +11,27 @@ export const lensAlgo = (
11
11
  v: number,
12
12
  ) => pipe(v).line(
13
13
 
14
- function deadzone(value) {
15
- if (value < state.settings.deadzone)
16
- return 0
17
-
18
- if (value > 1)
19
- return value
20
-
21
- return Scalar.remap(
22
- value,
23
- state.settings.deadzone, 1,
24
- 0, 1,
25
- )
14
+ function clippings(value) {
15
+ const {settings} = state
16
+ if (settings.range) {
17
+ const [bottom, top] = settings.range
18
+ value = Scalar.isBetween(value, bottom, top)
19
+ ? Scalar.remap(
20
+ value,
21
+ bottom, top,
22
+ 0, 1,
23
+ true,
24
+ )
25
+ : 0
26
+ }
27
+ if (settings.bottom) value = Math.max(settings.bottom, value)
28
+ if (settings.top) value = Math.min(settings.top, value)
29
+ return value
26
30
  },
27
31
 
28
32
  function inversion(value) {
29
33
  return state.settings.invert
30
- ? value * -1
34
+ ? 1 - value
31
35
  : value
32
36
  },
33
37
 
@@ -1,38 +1,38 @@
1
1
 
2
2
  import {MapG, pub, obMap} from "@e280/stz"
3
3
  import {Action} from "./action.js"
4
+ import {SampleMap} from "./sample-map.js"
4
5
  import {lensAlgo} from "./parts/lens-algo.js"
5
- import {SampleMap} from "../controllers/types.js"
6
6
  import {tmax, tmin} from "../../utils/quick-math.js"
7
7
  import {defaultCodeState} from "./parts/defaults.js"
8
8
  import {Actions, Atom, Bindings, CodeSettings, CodeState} from "./types.js"
9
9
 
10
10
  export class Resolver<B extends Bindings> {
11
- #actions: Actions<B>
12
-
11
+ readonly actions: Actions<B>
12
+ #modes = new Set<keyof B>()
13
+ #sampleMap = new SampleMap()
13
14
  #now = 0
14
- #samples: SampleMap = new Map()
15
15
  #codeStates = new MapG<number, CodeState>()
16
16
  #update = pub()
17
17
 
18
- constructor(public readonly bindings: B, modes: Set<keyof B>) {
19
- this.#actions = obMap(bindings, (bracket, mode) => obMap(bracket, atom => {
18
+ constructor(public bindings: B) {
19
+ this.actions = obMap(bindings, (bracket, mode) => obMap(bracket, atom => {
20
20
  const action = new Action()
21
21
  this.#update.subscribe(() => {
22
- const value = modes.has(mode)
22
+ action.value = this.#modes.has(mode)
23
23
  ? this.#resolveAtom()(atom)
24
24
  : 0
25
- Action.update(action, value)
26
25
  })
27
26
  return action
28
27
  })) as Actions<B>
29
28
  }
30
29
 
31
- poll(now: number, samples: SampleMap) {
30
+ resolve(now: number, modes: Set<keyof B>, sampleMap: SampleMap) {
32
31
  this.#now = now
33
- this.#samples = samples
32
+ this.#modes = modes
33
+ this.#sampleMap = sampleMap
34
34
  this.#update()
35
- return this.#actions
35
+ return this.actions
36
36
  }
37
37
 
38
38
  #resolveCode(count: number, code: string, settings?: Partial<CodeSettings>) {
@@ -40,7 +40,7 @@ export class Resolver<B extends Bindings> {
40
40
  count,
41
41
  () => defaultCodeState(["code", code, settings]),
42
42
  )
43
- const value = this.#samples.get(code) ?? 0
43
+ const value = this.#sampleMap.get(code) ?? 0
44
44
  return lensAlgo(this.#now, state, value)
45
45
  }
46
46
 
@@ -0,0 +1,25 @@
1
+
2
+ import {MapG} from "@e280/stz"
3
+ import {Sample} from "../devices/types.js"
4
+
5
+ export class SampleMap extends MapG<string, number> {
6
+ constructor(samples?: Iterable<Sample>) {
7
+ super()
8
+ if (samples) {
9
+ for (const [code, value] of samples)
10
+ this.set(code, value)
11
+ }
12
+ }
13
+
14
+ zero() {
15
+ for (const code of this.keys()) this.set(code, 0)
16
+ return this
17
+ }
18
+
19
+ mergeSample([code, value]: Sample) {
20
+ const previous = this.get(code) ?? 0
21
+ if (value > previous) this.set(code, value)
22
+ return this
23
+ }
24
+ }
25
+
@@ -34,7 +34,9 @@ export type Atom = string | (
34
34
  export type CodeSettings = {
35
35
  scale: number
36
36
  invert: boolean
37
- deadzone: number
37
+ range: null | [number, number]
38
+ bottom: null | number
39
+ top: null | number
38
40
  timing: (
39
41
  | ["direct"]
40
42
  | ["tap", holdTime?: number]