@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.
- package/README.md +111 -103
- package/package.json +7 -7
- package/s/core/bindings/action.ts +14 -4
- package/s/core/bindings/parts/defaults.ts +3 -1
- package/s/core/bindings/parts/lens-algo.ts +17 -13
- package/s/core/bindings/resolver.ts +12 -12
- package/s/core/bindings/sample-map.ts +25 -0
- package/s/core/bindings/types.ts +3 -1
- package/s/core/core.test.ts +46 -34
- package/s/core/devices/auto-gamepads.ts +8 -0
- package/s/core/devices/device.ts +12 -0
- package/s/core/devices/infra/group.ts +24 -0
- package/s/core/devices/infra/sampler.ts +22 -0
- package/s/core/devices/standard/gamepad.ts +83 -0
- package/s/core/{controllers → devices}/standard/index.ts +2 -1
- package/s/core/devices/standard/keyboard.ts +31 -0
- package/s/core/{controllers → devices}/standard/pointer.ts +15 -11
- package/s/core/devices/standard/primary.ts +20 -0
- package/s/core/devices/standard/stick.ts +27 -0
- package/s/core/{controllers/standard/virtual-gamepad.ts → devices/standard/vpad.ts} +9 -9
- package/s/core/{controllers → devices}/types.ts +0 -1
- package/s/core/hub/hub.ts +78 -62
- package/s/core/hub/meta-bindings.ts +23 -0
- package/s/core/hub/parts/connected.ts +15 -0
- package/s/core/hub/port.ts +26 -0
- package/s/core/hub/types.ts +5 -6
- package/s/core/index.ts +12 -14
- package/s/core/testing/testing.ts +19 -14
- package/s/deck/deck.ts +77 -0
- package/s/deck/index.ts +14 -0
- package/s/deck/parts/catalog.ts +58 -0
- package/s/deck/parts/db.ts +66 -0
- package/s/deck/parts/device-skins/device-icons.ts +38 -0
- package/s/deck/parts/device-skins/device-skin.ts +29 -0
- package/s/deck/parts/local-storage-kv.ts +8 -0
- package/s/deck/parts/merge-bindings.ts +21 -0
- package/s/deck/parts/overlay-visibility.ts +49 -0
- package/s/deck/views/deck-overlay/component.ts +48 -0
- package/s/deck/views/deck-overlay/style.css.ts +112 -0
- package/s/deck/views/framework.ts +14 -0
- package/s/demo/game/game.ts +85 -0
- package/s/demo/game/parts/agent.ts +10 -0
- package/s/demo/game/parts/game-bindings.ts +20 -0
- package/s/demo/game/parts/logic.ts +24 -0
- package/s/demo/game/parts/player.ts +32 -0
- package/s/demo/game/parts/renderer.ts +113 -0
- package/s/demo/game/parts/state.ts +24 -0
- package/s/demo/game/parts/virtual-device.ts +13 -0
- package/s/demo/main.bundle.ts +6 -12
- package/s/demo/main.css +30 -2
- package/s/demo/ui/tact-demo/component.ts +13 -0
- package/s/demo/ui/tact-demo/style.css.ts +4 -0
- package/s/demo/ui/theater/styles.css.ts +57 -0
- package/s/demo/ui/theater/view.ts +53 -0
- package/s/demo/ui/theater/virtual/style.css.ts +43 -0
- package/s/demo/ui/theater/virtual/view.ts +31 -0
- package/s/demo/ui/utils/loader.ts +5 -0
- package/s/index.html.ts +16 -6
- package/s/index.ts +3 -1
- package/s/nubs/components.ts +14 -0
- package/s/nubs/index.ts +6 -0
- package/s/nubs/lookpad/component.ts +45 -0
- package/s/nubs/stick/component.ts +115 -0
- package/s/nubs/stick/style.css.ts +70 -0
- package/s/nubs/{virtual-gamepad/view.ts → vpad/component.ts} +21 -11
- package/s/nubs/{virtual-gamepad → vpad}/styles.css.ts +1 -0
- package/s/utils/circular-clamp.ts +15 -0
- package/s/utils/dispensers.ts +20 -0
- package/s/utils/split-axis.ts +10 -2
- package/x/core/bindings/action.d.ts +3 -1
- package/x/core/bindings/action.js +12 -4
- package/x/core/bindings/action.js.map +1 -1
- package/x/core/bindings/parts/defaults.js +3 -1
- package/x/core/bindings/parts/defaults.js.map +1 -1
- package/x/core/bindings/parts/lens-algo.js +14 -7
- package/x/core/bindings/parts/lens-algo.js.map +1 -1
- package/x/core/bindings/resolver.d.ts +5 -4
- package/x/core/bindings/resolver.js +12 -10
- package/x/core/bindings/resolver.js.map +1 -1
- package/x/core/bindings/sample-map.d.ts +7 -0
- package/x/core/bindings/sample-map.js +22 -0
- package/x/core/bindings/sample-map.js.map +1 -0
- package/x/core/bindings/types.d.ts +3 -1
- package/x/core/core.test.d.ts +5 -4
- package/x/core/core.test.js +45 -34
- package/x/core/core.test.js.map +1 -1
- package/x/core/devices/auto-gamepads.d.ts +2 -0
- package/x/core/devices/auto-gamepads.js +6 -0
- package/x/core/devices/auto-gamepads.js.map +1 -0
- package/x/core/devices/device.d.ts +5 -0
- package/x/core/devices/device.js +7 -0
- package/x/core/devices/device.js.map +1 -0
- package/x/core/devices/infra/group.d.ts +8 -0
- package/x/core/devices/infra/group.js +21 -0
- package/x/core/devices/infra/group.js.map +1 -0
- package/x/core/devices/infra/sampler.d.ts +9 -0
- package/x/core/devices/infra/sampler.js +18 -0
- package/x/core/devices/infra/sampler.js.map +1 -0
- package/x/core/devices/standard/gamepad.d.ts +11 -0
- package/x/core/devices/standard/gamepad.js +65 -0
- package/x/core/devices/standard/gamepad.js.map +1 -0
- package/x/core/{controllers → devices}/standard/index.d.ts +2 -1
- package/x/core/{controllers → devices}/standard/index.js +2 -1
- package/x/core/devices/standard/index.js.map +1 -0
- package/x/core/devices/standard/keyboard.d.ts +9 -0
- package/x/core/devices/standard/keyboard.js +28 -0
- package/x/core/devices/standard/keyboard.js.map +1 -0
- package/x/core/devices/standard/pointer.d.ts +15 -0
- package/x/core/{controllers → devices}/standard/pointer.js +14 -11
- package/x/core/devices/standard/pointer.js.map +1 -0
- package/x/core/devices/standard/primary.d.ts +10 -0
- package/x/core/devices/standard/primary.js +17 -0
- package/x/core/devices/standard/primary.js.map +1 -0
- package/x/core/devices/standard/stick.d.ts +15 -0
- package/x/core/devices/standard/stick.js +24 -0
- package/x/core/devices/standard/stick.js.map +1 -0
- package/x/core/devices/standard/vpad.d.ts +7 -0
- package/x/core/{controllers/standard/virtual-gamepad.js → devices/standard/vpad.js} +10 -10
- package/x/core/devices/standard/vpad.js.map +1 -0
- package/x/core/{controllers → devices}/types.d.ts +0 -1
- package/x/core/{controllers → devices}/types.js.map +1 -1
- package/x/core/hub/hub.d.ts +27 -23
- package/x/core/hub/hub.js +71 -61
- package/x/core/hub/hub.js.map +1 -1
- package/x/core/hub/meta-bindings.d.ts +2 -0
- package/x/core/hub/meta-bindings.js +21 -0
- package/x/core/hub/meta-bindings.js.map +1 -0
- package/x/core/hub/parts/connected.d.ts +14 -0
- package/x/core/hub/parts/connected.js +12 -0
- package/x/core/hub/parts/connected.js.map +1 -0
- package/x/core/hub/port.d.ts +10 -0
- package/x/core/hub/port.js +19 -0
- package/x/core/hub/port.js.map +1 -0
- package/x/core/hub/types.d.ts +5 -5
- package/x/core/hub/types.js +1 -1
- package/x/core/hub/types.js.map +1 -1
- package/x/core/index.d.ts +12 -12
- package/x/core/index.js +12 -12
- package/x/core/index.js.map +1 -1
- package/x/core/testing/testing.d.ts +13 -11
- package/x/core/testing/testing.js +14 -13
- package/x/core/testing/testing.js.map +1 -1
- package/x/deck/deck.d.ts +35 -0
- package/x/deck/deck.js +50 -0
- package/x/deck/deck.js.map +1 -0
- package/x/deck/index.d.ts +10 -0
- package/x/deck/index.js +11 -0
- package/x/deck/index.js.map +1 -0
- package/x/deck/parts/catalog.d.ts +23 -0
- package/x/deck/parts/catalog.js +35 -0
- package/x/deck/parts/catalog.js.map +1 -0
- package/x/deck/parts/db.d.ts +20 -0
- package/x/deck/parts/db.js +52 -0
- package/x/deck/parts/db.js.map +1 -0
- package/x/deck/parts/device-skins/device-icons.d.ts +12 -0
- package/x/deck/parts/device-skins/device-icons.js +27 -0
- package/x/deck/parts/device-skins/device-icons.js.map +1 -0
- package/x/deck/parts/device-skins/device-skin.d.ts +14 -0
- package/x/deck/parts/device-skins/device-skin.js +22 -0
- package/x/deck/parts/device-skins/device-skin.js.map +1 -0
- package/x/deck/parts/local-storage-kv.js +6 -0
- package/x/deck/parts/local-storage-kv.js.map +1 -0
- package/x/deck/parts/merge-bindings.d.ts +2 -0
- package/x/deck/parts/merge-bindings.js +15 -0
- package/x/deck/parts/merge-bindings.js.map +1 -0
- package/x/deck/parts/overlay-visibility.d.ts +21 -0
- package/x/deck/parts/overlay-visibility.js +35 -0
- package/x/deck/parts/overlay-visibility.js.map +1 -0
- package/x/deck/views/deck-overlay/component.d.ts +2 -0
- package/x/deck/views/deck-overlay/component.js +40 -0
- package/x/deck/views/deck-overlay/component.js.map +1 -0
- package/x/deck/views/deck-overlay/style.css.js +109 -0
- package/x/deck/views/deck-overlay/style.css.js.map +1 -0
- package/x/deck/views/framework.d.ts +3 -0
- package/x/deck/views/framework.js +8 -0
- package/x/deck/views/framework.js.map +1 -0
- package/x/demo/game/game.d.ts +20 -0
- package/x/demo/game/game.js +63 -0
- package/x/demo/game/game.js.map +1 -0
- package/x/demo/game/parts/agent.d.ts +7 -0
- package/x/demo/game/parts/agent.js +8 -0
- package/x/demo/game/parts/agent.js.map +1 -0
- package/x/demo/game/parts/game-bindings.d.ts +15 -0
- package/x/demo/game/parts/game-bindings.js +10 -0
- package/x/demo/game/parts/game-bindings.js.map +1 -0
- package/x/demo/game/parts/logic.d.ts +8 -0
- package/x/demo/game/parts/logic.js +21 -0
- package/x/demo/game/parts/logic.js.map +1 -0
- package/x/demo/game/parts/player.d.ts +14 -0
- package/x/demo/game/parts/player.js +26 -0
- package/x/demo/game/parts/player.js.map +1 -0
- package/x/demo/game/parts/renderer.d.ts +13 -0
- package/x/demo/game/parts/renderer.js +91 -0
- package/x/demo/game/parts/renderer.js.map +1 -0
- package/x/demo/game/parts/state.d.ts +8 -0
- package/x/demo/game/parts/state.js +20 -0
- package/x/demo/game/parts/state.js.map +1 -0
- package/x/demo/game/parts/virtual-device.d.ts +8 -0
- package/x/demo/game/parts/virtual-device.js +11 -0
- package/x/demo/game/parts/virtual-device.js.map +1 -0
- package/x/demo/main.bundle.js +4 -10
- package/x/demo/main.bundle.js.map +1 -1
- package/x/demo/main.bundle.min.js +315 -54
- package/x/demo/main.bundle.min.js.map +4 -4
- package/x/demo/main.css +30 -2
- package/x/demo/ui/tact-demo/component.d.ts +4 -0
- package/x/demo/ui/tact-demo/component.js +12 -0
- package/x/demo/ui/tact-demo/component.js.map +1 -0
- package/x/demo/ui/tact-demo/style.css.d.ts +2 -0
- package/x/demo/ui/tact-demo/style.css.js +3 -0
- package/x/demo/ui/tact-demo/style.css.js.map +1 -0
- package/x/demo/ui/theater/styles.css.js +56 -0
- package/x/demo/ui/theater/styles.css.js.map +1 -0
- package/x/demo/ui/theater/view.d.ts +2 -0
- package/x/demo/ui/theater/view.js +42 -0
- package/x/demo/ui/theater/view.js.map +1 -0
- package/x/demo/ui/theater/virtual/style.css.d.ts +2 -0
- package/x/demo/ui/theater/virtual/style.css.js +42 -0
- package/x/demo/ui/theater/virtual/style.css.js.map +1 -0
- package/x/demo/ui/theater/virtual/view.d.ts +4 -0
- package/x/demo/ui/theater/virtual/view.js +19 -0
- package/x/demo/ui/theater/virtual/view.js.map +1 -0
- package/x/demo/ui/utils/loader.d.ts +1 -0
- package/x/demo/ui/utils/loader.js +3 -0
- package/x/demo/ui/utils/loader.js.map +1 -0
- package/x/index.d.ts +3 -1
- package/x/index.html +47 -8
- package/x/index.html.js +16 -6
- package/x/index.html.js.map +1 -1
- package/x/index.js +3 -1
- package/x/index.js.map +1 -1
- package/x/nubs/components.d.ts +9 -0
- package/x/nubs/components.js +11 -0
- package/x/nubs/components.js.map +1 -0
- package/x/nubs/index.d.ts +4 -0
- package/x/nubs/index.js +5 -0
- package/x/nubs/index.js.map +1 -0
- package/x/nubs/lookpad/component.d.ts +4 -0
- package/x/nubs/lookpad/component.js +36 -0
- package/x/nubs/lookpad/component.js.map +1 -0
- package/x/nubs/stick/component.d.ts +368 -0
- package/x/nubs/stick/component.js +101 -0
- package/x/nubs/stick/component.js.map +1 -0
- package/x/nubs/stick/style.css.d.ts +2 -0
- package/x/nubs/stick/style.css.js +69 -0
- package/x/nubs/stick/style.css.js.map +1 -0
- package/x/nubs/vpad/component.d.ts +368 -0
- package/x/nubs/{virtual-gamepad/view.js → vpad/component.js} +20 -11
- package/x/nubs/vpad/component.js.map +1 -0
- package/x/nubs/vpad/styles.css.d.ts +2 -0
- package/x/nubs/vpad/styles.css.js.map +1 -0
- package/x/nubs/vpad/utils/gamepad-inputs.js.map +1 -0
- package/x/nubs/vpad/utils/prevent-default-touch-shenanigans.js.map +1 -0
- package/x/nubs/vpad/utils/touch-tracking.js.map +1 -0
- package/x/utils/circular-clamp.d.ts +2 -0
- package/x/utils/circular-clamp.js +8 -0
- package/x/utils/circular-clamp.js.map +1 -0
- package/x/utils/dispensers.d.ts +7 -0
- package/x/utils/dispensers.js +16 -0
- package/x/utils/dispensers.js.map +1 -0
- package/x/utils/split-axis.d.ts +7 -0
- package/x/utils/split-axis.js +7 -2
- package/x/utils/split-axis.js.map +1 -1
- package/s/core/controllers/controller.ts +0 -7
- package/s/core/controllers/infra/group.ts +0 -17
- package/s/core/controllers/infra/sampler.ts +0 -22
- package/s/core/controllers/standard/gamepad.ts +0 -77
- package/s/core/controllers/standard/keyboard.ts +0 -50
- package/s/core/controllers/standard/stick.ts +0 -30
- package/s/core/deck/deck.ts +0 -40
- package/s/core/deck/parts/bindings-depot.ts +0 -24
- package/s/core/deck/parts/local-storage-kv.ts +0 -7
- package/s/core/hub/auto-gamepads.ts +0 -8
- package/s/core/hub/bindings.ts +0 -18
- package/s/core/port/port.ts +0 -34
- package/s/core/port/utils/aggregate_samples_into_map.ts +0 -20
- package/s/core/port/utils/wipe_samples_map.ts +0 -8
- package/s/nubs/lookpad/utils/listeners.ts +0 -53
- package/s/nubs/lookpad/view.ts +0 -32
- package/s/nubs/stick/styles.ts +0 -22
- package/s/nubs/stick/utils/calculate_new_vector_from_pointer_position.ts +0 -27
- package/s/nubs/stick/utils/find_closest_point_on_circle.ts +0 -15
- package/s/nubs/stick/utils/make_pointer_listeners.ts +0 -50
- package/s/nubs/stick/utils/within_radius.ts +0 -6
- package/s/nubs/stick/view.ts +0 -50
- package/s/nubs/stick-graphic/styles.ts +0 -38
- package/s/nubs/stick-graphic/types/basis.ts +0 -5
- package/s/nubs/stick-graphic/utils/calculate_basis.ts +0 -19
- package/s/nubs/stick-graphic/utils/stick_vector_to_pixels.ts +0 -13
- package/s/nubs/stick-graphic/utils/transform.ts +0 -10
- package/s/nubs/stick-graphic/view.ts +0 -43
- package/x/core/controllers/controller.d.ts +0 -4
- package/x/core/controllers/controller.js +0 -3
- package/x/core/controllers/controller.js.map +0 -1
- package/x/core/controllers/infra/group.d.ts +0 -7
- package/x/core/controllers/infra/group.js +0 -13
- package/x/core/controllers/infra/group.js.map +0 -1
- package/x/core/controllers/infra/sampler.d.ts +0 -8
- package/x/core/controllers/infra/sampler.js +0 -17
- package/x/core/controllers/infra/sampler.js.map +0 -1
- package/x/core/controllers/standard/gamepad.d.ts +0 -9
- package/x/core/controllers/standard/gamepad.js +0 -66
- package/x/core/controllers/standard/gamepad.js.map +0 -1
- package/x/core/controllers/standard/index.js.map +0 -1
- package/x/core/controllers/standard/keyboard.d.ts +0 -9
- package/x/core/controllers/standard/keyboard.js +0 -39
- package/x/core/controllers/standard/keyboard.js.map +0 -1
- package/x/core/controllers/standard/pointer.d.ts +0 -11
- package/x/core/controllers/standard/pointer.js.map +0 -1
- package/x/core/controllers/standard/stick.d.ts +0 -15
- package/x/core/controllers/standard/stick.js +0 -27
- package/x/core/controllers/standard/stick.js.map +0 -1
- package/x/core/controllers/standard/virtual-gamepad.d.ts +0 -7
- package/x/core/controllers/standard/virtual-gamepad.js.map +0 -1
- package/x/core/deck/deck.d.ts +0 -16
- package/x/core/deck/deck.js +0 -31
- package/x/core/deck/deck.js.map +0 -1
- package/x/core/deck/parts/bindings-depot.d.ts +0 -9
- package/x/core/deck/parts/bindings-depot.js +0 -19
- package/x/core/deck/parts/bindings-depot.js.map +0 -1
- package/x/core/deck/parts/local-storage-kv.js +0 -5
- package/x/core/deck/parts/local-storage-kv.js.map +0 -1
- package/x/core/hub/auto-gamepads.d.ts +0 -2
- package/x/core/hub/auto-gamepads.js +0 -6
- package/x/core/hub/auto-gamepads.js.map +0 -1
- package/x/core/hub/bindings.d.ts +0 -2
- package/x/core/hub/bindings.js +0 -16
- package/x/core/hub/bindings.js.map +0 -1
- package/x/core/port/port.d.ts +0 -12
- package/x/core/port/port.js +0 -25
- package/x/core/port/port.js.map +0 -1
- package/x/core/port/utils/aggregate_samples_into_map.d.ts +0 -3
- package/x/core/port/utils/aggregate_samples_into_map.js +0 -11
- package/x/core/port/utils/aggregate_samples_into_map.js.map +0 -1
- package/x/core/port/utils/wipe_samples_map.d.ts +0 -2
- package/x/core/port/utils/wipe_samples_map.js +0 -5
- package/x/core/port/utils/wipe_samples_map.js.map +0 -1
- package/x/nubs/lookpad/utils/listeners.d.ts +0 -19
- package/x/nubs/lookpad/utils/listeners.js +0 -37
- package/x/nubs/lookpad/utils/listeners.js.map +0 -1
- package/x/nubs/lookpad/view.d.ts +0 -1
- package/x/nubs/lookpad/view.js +0 -24
- package/x/nubs/lookpad/view.js.map +0 -1
- package/x/nubs/stick/styles.d.ts +0 -1
- package/x/nubs/stick/styles.js +0 -22
- package/x/nubs/stick/styles.js.map +0 -1
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.d.ts +0 -3
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js +0 -16
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js.map +0 -1
- package/x/nubs/stick/utils/find_closest_point_on_circle.d.ts +0 -2
- package/x/nubs/stick/utils/find_closest_point_on_circle.js +0 -6
- package/x/nubs/stick/utils/find_closest_point_on_circle.js.map +0 -1
- package/x/nubs/stick/utils/make_pointer_listeners.d.ts +0 -16
- package/x/nubs/stick/utils/make_pointer_listeners.js +0 -34
- package/x/nubs/stick/utils/make_pointer_listeners.js.map +0 -1
- package/x/nubs/stick/utils/within_radius.d.ts +0 -2
- package/x/nubs/stick/utils/within_radius.js +0 -4
- package/x/nubs/stick/utils/within_radius.js.map +0 -1
- package/x/nubs/stick/view.d.ts +0 -2
- package/x/nubs/stick/view.js +0 -38
- package/x/nubs/stick/view.js.map +0 -1
- package/x/nubs/stick-graphic/styles.js +0 -38
- package/x/nubs/stick-graphic/styles.js.map +0 -1
- package/x/nubs/stick-graphic/types/basis.d.ts +0 -4
- package/x/nubs/stick-graphic/types/basis.js +0 -2
- package/x/nubs/stick-graphic/types/basis.js.map +0 -1
- package/x/nubs/stick-graphic/utils/calculate_basis.d.ts +0 -2
- package/x/nubs/stick-graphic/utils/calculate_basis.js +0 -10
- package/x/nubs/stick-graphic/utils/calculate_basis.js.map +0 -1
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.d.ts +0 -2
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js +0 -7
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js.map +0 -1
- package/x/nubs/stick-graphic/utils/transform.d.ts +0 -2
- package/x/nubs/stick-graphic/utils/transform.js +0 -7
- package/x/nubs/stick-graphic/utils/transform.js.map +0 -1
- package/x/nubs/stick-graphic/view.d.ts +0 -3
- package/x/nubs/stick-graphic/view.js +0 -30
- package/x/nubs/stick-graphic/view.js.map +0 -1
- package/x/nubs/virtual-gamepad/styles.css.js.map +0 -1
- package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js.map +0 -1
- package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js.map +0 -1
- package/x/nubs/virtual-gamepad/utils/touch-tracking.js.map +0 -1
- package/x/nubs/virtual-gamepad/view.d.ts +0 -2
- package/x/nubs/virtual-gamepad/view.js.map +0 -1
- /package/s/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.ts +0 -0
- /package/s/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.ts +0 -0
- /package/s/nubs/{virtual-gamepad → vpad}/utils/touch-tracking.ts +0 -0
- /package/x/core/{controllers → devices}/types.js +0 -0
- /package/x/{core/deck → deck}/parts/local-storage-kv.d.ts +0 -0
- /package/x/{nubs/virtual-gamepad/styles.css.d.ts → deck/views/deck-overlay/style.css.d.ts} +0 -0
- /package/x/{nubs/stick-graphic/styles.d.ts → demo/ui/theater/styles.css.d.ts} +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/styles.css.js +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.d.ts +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/utils/gamepad-inputs.js +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.d.ts +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/utils/prevent-default-touch-shenanigans.js +0 -0
- /package/x/nubs/{virtual-gamepad → vpad}/utils/touch-tracking.d.ts +0 -0
- /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
|
-
|
|
10
|
-
-
|
|
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
|
-
> *
|
|
37
|
+
> *full setup with ui, batteries included*
|
|
22
38
|
|
|
23
|
-
the deck
|
|
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
|
|
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
|
-
|
|
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
|
|
66
|
+
### 🛹 plug devices into the hub
|
|
55
67
|
- **plug a keyboard/mouse player into the hub**
|
|
56
68
|
```ts
|
|
57
|
-
deck.hub.plug(
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
- **
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
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
|
|
106
|
-
- make a
|
|
116
|
+
### 🎮 basically how a device works
|
|
117
|
+
- make a device
|
|
107
118
|
```ts
|
|
108
|
-
const keyboard = new tact.
|
|
119
|
+
const keyboard = new tact.KeyboardDevice()
|
|
109
120
|
```
|
|
110
|
-
-
|
|
121
|
+
- reading samples looks like this
|
|
111
122
|
```ts
|
|
112
|
-
const
|
|
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
|
|
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
|
-
- **
|
|
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
|
-
- **
|
|
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
|
-
- **
|
|
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", {
|
|
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
|
|
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
|
|
301
|
+
### 🔌 port setup
|
|
295
302
|
- **make a port**
|
|
296
303
|
```ts
|
|
297
304
|
const port = new tact.Port(bindings)
|
|
298
305
|
```
|
|
299
|
-
- **attach some
|
|
306
|
+
- **attach some devices to the port**
|
|
300
307
|
```ts
|
|
301
|
-
port.
|
|
302
|
-
.add(new tact.
|
|
303
|
-
.add(new tact.
|
|
304
|
-
.add(new tact.
|
|
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
|
|
307
|
-
- **
|
|
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(
|
|
321
|
-
port.
|
|
322
|
-
return () => port.
|
|
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
|
-
|
|
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
|
|
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(
|
|
372
|
-
new tact.Port(
|
|
373
|
-
new tact.Port(
|
|
374
|
-
new tact.Port(
|
|
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
|
|
375
|
+
### 🛞 plug in some devices
|
|
380
376
|
- **let's plug in the keyboard/mouse player**
|
|
381
377
|
```ts
|
|
382
|
-
hub.plug(
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
### 🛞
|
|
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
|
-
|
|
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
|
-
|
|
416
|
-
|
|
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
|
+
"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-
|
|
35
|
+
"@benev/math": "^0.2.0-4",
|
|
36
36
|
"@e280/kv": "^0.1.0",
|
|
37
|
-
"@e280/sly": "^0.
|
|
38
|
-
"@e280/strata": "^0.
|
|
39
|
-
"@e280/stz": "^0.2.
|
|
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.
|
|
43
|
-
"@e280/scute": "^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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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) }
|
|
@@ -11,23 +11,27 @@ export const lensAlgo = (
|
|
|
11
11
|
v: number,
|
|
12
12
|
) => pipe(v).line(
|
|
13
13
|
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
?
|
|
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
|
-
|
|
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
|
|
19
|
-
this
|
|
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
|
-
|
|
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
|
-
|
|
30
|
+
resolve(now: number, modes: Set<keyof B>, sampleMap: SampleMap) {
|
|
32
31
|
this.#now = now
|
|
33
|
-
this.#
|
|
32
|
+
this.#modes = modes
|
|
33
|
+
this.#sampleMap = sampleMap
|
|
34
34
|
this.#update()
|
|
35
|
-
return this
|
|
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.#
|
|
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
|
+
|
package/s/core/bindings/types.ts
CHANGED
|
@@ -34,7 +34,9 @@ export type Atom = string | (
|
|
|
34
34
|
export type CodeSettings = {
|
|
35
35
|
scale: number
|
|
36
36
|
invert: boolean
|
|
37
|
-
|
|
37
|
+
range: null | [number, number]
|
|
38
|
+
bottom: null | number
|
|
39
|
+
top: null | number
|
|
38
40
|
timing: (
|
|
39
41
|
| ["direct"]
|
|
40
42
|
| ["tap", holdTime?: number]
|