@benev/tact 0.1.0-1

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 (212) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +299 -0
  3. package/package.json +60 -0
  4. package/s/demo/main.bundle.ts +14 -0
  5. package/s/demo/main.css +57 -0
  6. package/s/index.html.ts +42 -0
  7. package/s/index.ts +16 -0
  8. package/s/nubs/lookpad/styles.ts +21 -0
  9. package/s/nubs/lookpad/utils/listeners.ts +53 -0
  10. package/s/nubs/lookpad/view.ts +32 -0
  11. package/s/nubs/stick/device.ts +30 -0
  12. package/s/nubs/stick/styles.ts +22 -0
  13. package/s/nubs/stick/utils/calculate_new_vector_from_pointer_position.ts +27 -0
  14. package/s/nubs/stick/utils/find_closest_point_on_circle.ts +15 -0
  15. package/s/nubs/stick/utils/make_pointer_listeners.ts +50 -0
  16. package/s/nubs/stick/utils/within_radius.ts +6 -0
  17. package/s/nubs/stick/view.ts +50 -0
  18. package/s/nubs/stick-graphic/styles.ts +38 -0
  19. package/s/nubs/stick-graphic/types/basis.ts +5 -0
  20. package/s/nubs/stick-graphic/utils/calculate_basis.ts +19 -0
  21. package/s/nubs/stick-graphic/utils/stick_vector_to_pixels.ts +13 -0
  22. package/s/nubs/stick-graphic/utils/transform.ts +10 -0
  23. package/s/nubs/stick-graphic/view.ts +43 -0
  24. package/s/nubs/virtual-gamepad/device.ts +25 -0
  25. package/s/nubs/virtual-gamepad/styles.css.ts +133 -0
  26. package/s/nubs/virtual-gamepad/utils/gamepad-inputs.ts +42 -0
  27. package/s/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.ts +12 -0
  28. package/s/nubs/virtual-gamepad/utils/touch-tracking.ts +75 -0
  29. package/s/nubs/virtual-gamepad/view.ts +139 -0
  30. package/s/station/devices/gamepad.ts +81 -0
  31. package/s/station/devices/infra/device.ts +7 -0
  32. package/s/station/devices/infra/group.ts +17 -0
  33. package/s/station/devices/infra/sampler.ts +22 -0
  34. package/s/station/devices/keyboard.ts +53 -0
  35. package/s/station/devices/pointer.ts +95 -0
  36. package/s/station/parts/action.ts +26 -0
  37. package/s/station/parts/defaults.ts +28 -0
  38. package/s/station/parts/resolver.ts +73 -0
  39. package/s/station/parts/routines/aggregate_samples_into_map.ts +20 -0
  40. package/s/station/parts/routines/build_updatable_actions_structure.ts +29 -0
  41. package/s/station/parts/routines/lensing_algorithm.ts +74 -0
  42. package/s/station/parts/switchboard-bindings.ts +21 -0
  43. package/s/station/station.test.ts +86 -0
  44. package/s/station/station.ts +47 -0
  45. package/s/station/switchboard.ts +107 -0
  46. package/s/station/testing/testing.ts +47 -0
  47. package/s/station/types.ts +72 -0
  48. package/s/station/utils/is-pressed.ts +5 -0
  49. package/s/station/utils/modprefix.ts +16 -0
  50. package/s/station/utils/tmax.ts +7 -0
  51. package/s/station/utils/tmin.ts +7 -0
  52. package/s/tests.test.ts +8 -0
  53. package/s/utils/evergreen.ts +10 -0
  54. package/s/utils/gamepads.ts +41 -0
  55. package/s/utils/split-axis.ts +7 -0
  56. package/x/demo/main.bundle.d.ts +1 -0
  57. package/x/demo/main.bundle.js +11 -0
  58. package/x/demo/main.bundle.js.map +1 -0
  59. package/x/demo/main.bundle.min.js +139 -0
  60. package/x/demo/main.bundle.min.js.map +7 -0
  61. package/x/demo/main.css +57 -0
  62. package/x/index.d.ts +13 -0
  63. package/x/index.html +97 -0
  64. package/x/index.html.d.ts +2 -0
  65. package/x/index.html.js +37 -0
  66. package/x/index.html.js.map +1 -0
  67. package/x/index.js +14 -0
  68. package/x/index.js.map +1 -0
  69. package/x/nubs/lookpad/styles.d.ts +1 -0
  70. package/x/nubs/lookpad/styles.js +21 -0
  71. package/x/nubs/lookpad/styles.js.map +1 -0
  72. package/x/nubs/lookpad/utils/listeners.d.ts +19 -0
  73. package/x/nubs/lookpad/utils/listeners.js +37 -0
  74. package/x/nubs/lookpad/utils/listeners.js.map +1 -0
  75. package/x/nubs/lookpad/view.d.ts +1 -0
  76. package/x/nubs/lookpad/view.js +24 -0
  77. package/x/nubs/lookpad/view.js.map +1 -0
  78. package/x/nubs/stick/device.d.ts +15 -0
  79. package/x/nubs/stick/device.js +27 -0
  80. package/x/nubs/stick/device.js.map +1 -0
  81. package/x/nubs/stick/styles.d.ts +1 -0
  82. package/x/nubs/stick/styles.js +22 -0
  83. package/x/nubs/stick/styles.js.map +1 -0
  84. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.d.ts +3 -0
  85. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js +16 -0
  86. package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js.map +1 -0
  87. package/x/nubs/stick/utils/find_closest_point_on_circle.d.ts +2 -0
  88. package/x/nubs/stick/utils/find_closest_point_on_circle.js +6 -0
  89. package/x/nubs/stick/utils/find_closest_point_on_circle.js.map +1 -0
  90. package/x/nubs/stick/utils/make_pointer_listeners.d.ts +16 -0
  91. package/x/nubs/stick/utils/make_pointer_listeners.js +34 -0
  92. package/x/nubs/stick/utils/make_pointer_listeners.js.map +1 -0
  93. package/x/nubs/stick/utils/within_radius.d.ts +2 -0
  94. package/x/nubs/stick/utils/within_radius.js +4 -0
  95. package/x/nubs/stick/utils/within_radius.js.map +1 -0
  96. package/x/nubs/stick/view.d.ts +2 -0
  97. package/x/nubs/stick/view.js +38 -0
  98. package/x/nubs/stick/view.js.map +1 -0
  99. package/x/nubs/stick-graphic/styles.d.ts +1 -0
  100. package/x/nubs/stick-graphic/styles.js +38 -0
  101. package/x/nubs/stick-graphic/styles.js.map +1 -0
  102. package/x/nubs/stick-graphic/types/basis.d.ts +4 -0
  103. package/x/nubs/stick-graphic/types/basis.js +2 -0
  104. package/x/nubs/stick-graphic/types/basis.js.map +1 -0
  105. package/x/nubs/stick-graphic/utils/calculate_basis.d.ts +2 -0
  106. package/x/nubs/stick-graphic/utils/calculate_basis.js +10 -0
  107. package/x/nubs/stick-graphic/utils/calculate_basis.js.map +1 -0
  108. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.d.ts +2 -0
  109. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js +7 -0
  110. package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js.map +1 -0
  111. package/x/nubs/stick-graphic/utils/transform.d.ts +2 -0
  112. package/x/nubs/stick-graphic/utils/transform.js +7 -0
  113. package/x/nubs/stick-graphic/utils/transform.js.map +1 -0
  114. package/x/nubs/stick-graphic/view.d.ts +3 -0
  115. package/x/nubs/stick-graphic/view.js +30 -0
  116. package/x/nubs/stick-graphic/view.js.map +1 -0
  117. package/x/nubs/virtual-gamepad/device.d.ts +7 -0
  118. package/x/nubs/virtual-gamepad/device.js +20 -0
  119. package/x/nubs/virtual-gamepad/device.js.map +1 -0
  120. package/x/nubs/virtual-gamepad/styles.css.d.ts +2 -0
  121. package/x/nubs/virtual-gamepad/styles.css.js +133 -0
  122. package/x/nubs/virtual-gamepad/styles.css.js.map +1 -0
  123. package/x/nubs/virtual-gamepad/utils/gamepad-inputs.d.ts +29 -0
  124. package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js +31 -0
  125. package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js.map +1 -0
  126. package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.d.ts +1 -0
  127. package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js +9 -0
  128. package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js.map +1 -0
  129. package/x/nubs/virtual-gamepad/utils/touch-tracking.d.ts +6 -0
  130. package/x/nubs/virtual-gamepad/utils/touch-tracking.js +55 -0
  131. package/x/nubs/virtual-gamepad/utils/touch-tracking.js.map +1 -0
  132. package/x/nubs/virtual-gamepad/view.d.ts +2 -0
  133. package/x/nubs/virtual-gamepad/view.js +120 -0
  134. package/x/nubs/virtual-gamepad/view.js.map +1 -0
  135. package/x/station/devices/gamepad.d.ts +10 -0
  136. package/x/station/devices/gamepad.js +70 -0
  137. package/x/station/devices/gamepad.js.map +1 -0
  138. package/x/station/devices/infra/device.d.ts +4 -0
  139. package/x/station/devices/infra/device.js +3 -0
  140. package/x/station/devices/infra/device.js.map +1 -0
  141. package/x/station/devices/infra/group.d.ts +7 -0
  142. package/x/station/devices/infra/group.js +13 -0
  143. package/x/station/devices/infra/group.js.map +1 -0
  144. package/x/station/devices/infra/sampler.d.ts +8 -0
  145. package/x/station/devices/infra/sampler.js +17 -0
  146. package/x/station/devices/infra/sampler.js.map +1 -0
  147. package/x/station/devices/keyboard.d.ts +9 -0
  148. package/x/station/devices/keyboard.js +42 -0
  149. package/x/station/devices/keyboard.js.map +1 -0
  150. package/x/station/devices/pointer.d.ts +11 -0
  151. package/x/station/devices/pointer.js +79 -0
  152. package/x/station/devices/pointer.js.map +1 -0
  153. package/x/station/parts/action.d.ts +12 -0
  154. package/x/station/parts/action.js +23 -0
  155. package/x/station/parts/action.js.map +1 -0
  156. package/x/station/parts/defaults.d.ts +5 -0
  157. package/x/station/parts/defaults.js +22 -0
  158. package/x/station/parts/defaults.js.map +1 -0
  159. package/x/station/parts/resolver.d.ts +10 -0
  160. package/x/station/parts/resolver.js +63 -0
  161. package/x/station/parts/resolver.js.map +1 -0
  162. package/x/station/parts/routines/aggregate_samples_into_map.d.ts +3 -0
  163. package/x/station/parts/routines/aggregate_samples_into_map.js +11 -0
  164. package/x/station/parts/routines/aggregate_samples_into_map.js.map +1 -0
  165. package/x/station/parts/routines/build_updatable_actions_structure.d.ts +5 -0
  166. package/x/station/parts/routines/build_updatable_actions_structure.js +18 -0
  167. package/x/station/parts/routines/build_updatable_actions_structure.js.map +1 -0
  168. package/x/station/parts/routines/lensing_algorithm.d.ts +2 -0
  169. package/x/station/parts/routines/lensing_algorithm.js +42 -0
  170. package/x/station/parts/routines/lensing_algorithm.js.map +1 -0
  171. package/x/station/parts/switchboard-bindings.d.ts +2 -0
  172. package/x/station/parts/switchboard-bindings.js +19 -0
  173. package/x/station/parts/switchboard-bindings.js.map +1 -0
  174. package/x/station/station.d.ts +15 -0
  175. package/x/station/station.js +35 -0
  176. package/x/station/station.js.map +1 -0
  177. package/x/station/station.test.d.ts +11 -0
  178. package/x/station/station.test.js +80 -0
  179. package/x/station/station.test.js.map +1 -0
  180. package/x/station/switchboard.d.ts +30 -0
  181. package/x/station/switchboard.js +90 -0
  182. package/x/station/switchboard.js.map +1 -0
  183. package/x/station/testing/testing.d.ts +58 -0
  184. package/x/station/testing/testing.js +39 -0
  185. package/x/station/testing/testing.js.map +1 -0
  186. package/x/station/types.d.ts +56 -0
  187. package/x/station/types.js +5 -0
  188. package/x/station/types.js.map +1 -0
  189. package/x/station/utils/is-pressed.d.ts +1 -0
  190. package/x/station/utils/is-pressed.js +4 -0
  191. package/x/station/utils/is-pressed.js.map +1 -0
  192. package/x/station/utils/modprefix.d.ts +1 -0
  193. package/x/station/utils/modprefix.js +16 -0
  194. package/x/station/utils/modprefix.js.map +1 -0
  195. package/x/station/utils/tmax.d.ts +1 -0
  196. package/x/station/utils/tmax.js +6 -0
  197. package/x/station/utils/tmax.js.map +1 -0
  198. package/x/station/utils/tmin.d.ts +1 -0
  199. package/x/station/utils/tmin.js +6 -0
  200. package/x/station/utils/tmin.js.map +1 -0
  201. package/x/tests.test.d.ts +1 -0
  202. package/x/tests.test.js +6 -0
  203. package/x/tests.test.js.map +1 -0
  204. package/x/utils/evergreen.d.ts +1 -0
  205. package/x/utils/evergreen.js +10 -0
  206. package/x/utils/evergreen.js.map +1 -0
  207. package/x/utils/gamepads.d.ts +14 -0
  208. package/x/utils/gamepads.js +40 -0
  209. package/x/utils/gamepads.js.map +1 -0
  210. package/x/utils/split-axis.d.ts +1 -0
  211. package/x/utils/split-axis.js +6 -0
  212. package/x/utils/split-axis.js.map +1 -0
@@ -0,0 +1,80 @@
1
+ import { Science, test, expect } from "@e280/science";
2
+ import { SamplerDevice } from "./devices/infra/sampler.js";
3
+ import { testConnect, testSetupAlpha, testSetupBravo } from "./testing/testing.js";
4
+ export default Science.suite({
5
+ "sample to action value": test(async () => {
6
+ const { station, device, time } = testSetupAlpha();
7
+ expect(station.actions.basic.jump.value).is(0);
8
+ expect(station.actions.basic.shoot.value).is(0);
9
+ device.setSample("Space", 1);
10
+ station.poll(time.now);
11
+ expect(station.actions.basic.jump.value).is(1);
12
+ expect(station.actions.basic.shoot.value).is(0);
13
+ device.setSample("Space", 2);
14
+ device.setSample("pointer.button.left", 3);
15
+ station.poll(time.now);
16
+ expect(station.actions.basic.jump.value).is(2);
17
+ expect(station.actions.basic.shoot.value).is(3);
18
+ }),
19
+ "switchboard": Science.suite({
20
+ "player1 inputs work": test(async () => {
21
+ const { switchboard, time } = testSetupBravo();
22
+ const [s1, s2] = switchboard.stations;
23
+ const d1 = testConnect(switchboard, new SamplerDevice());
24
+ expect(s1.actions.basic.jump.value).is(0);
25
+ expect(s2.actions.basic.jump.value).is(0);
26
+ d1.setSample("Space", 1);
27
+ switchboard.poll(time.now);
28
+ expect(s1.actions.basic.jump.value).is(1);
29
+ expect(s2.actions.basic.jump.value).is(0);
30
+ }),
31
+ "two devices playing on separate stations": test(async () => {
32
+ const { switchboard, time } = testSetupBravo();
33
+ const [s1, s2] = switchboard.stations;
34
+ const d1 = testConnect(switchboard, new SamplerDevice());
35
+ const d2 = testConnect(switchboard, new SamplerDevice());
36
+ d1.setSample("Space", 1);
37
+ d2.setSample("Space", 2);
38
+ switchboard.poll(time.now);
39
+ expect(s1.actions.basic.jump.value).is(1);
40
+ expect(s2.actions.basic.jump.value).is(2);
41
+ }),
42
+ "player can shimmy": test(async () => {
43
+ const { switchboard, time } = testSetupBravo();
44
+ const [s1, s2] = switchboard.stations;
45
+ const d1 = testConnect(switchboard, new SamplerDevice());
46
+ switchboard.shimmy(d1, 1);
47
+ d1.setSample("Space", 1);
48
+ switchboard.poll(time.now);
49
+ expect(s1.actions.basic.jump.value).is(0);
50
+ expect(s2.actions.basic.jump.value).is(1);
51
+ }),
52
+ "two players can share a station": test(async () => {
53
+ const { switchboard, time } = testSetupBravo();
54
+ const [s1, s2] = switchboard.stations;
55
+ const d1 = testConnect(switchboard, new SamplerDevice());
56
+ const d2 = testConnect(switchboard, new SamplerDevice());
57
+ switchboard.shimmy(d2, -1);
58
+ expect(switchboard.stationByDevice(d1)).is(switchboard.stationByDevice(d2));
59
+ d1.setSample("Space", 1);
60
+ switchboard.poll(time.now);
61
+ expect(s1.actions.basic.jump.value).is(1);
62
+ expect(s2.actions.basic.jump.value).is(0);
63
+ d2.setSample("Space", 1);
64
+ switchboard.poll(time.now);
65
+ expect(s1.actions.basic.jump.value).is(1);
66
+ expect(s2.actions.basic.jump.value).is(0);
67
+ d1.setSample("Space", 1);
68
+ d2.setSample("Space", 2);
69
+ switchboard.poll(time.now);
70
+ expect(s1.actions.basic.jump.value).is(2);
71
+ expect(s2.actions.basic.jump.value).is(0);
72
+ d1.setSample("Space", 2);
73
+ d2.setSample("Space", 1);
74
+ switchboard.poll(time.now);
75
+ expect(s1.actions.basic.jump.value).is(2);
76
+ expect(s2.actions.basic.jump.value).is(0);
77
+ }),
78
+ }),
79
+ });
80
+ //# sourceMappingURL=station.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"station.test.js","sourceRoot":"","sources":["../../s/station/station.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Station } from "./station.js";
3
+ import { Device } from "./devices/infra/device.js";
4
+ import { SwitchboardBindings } from "./types.js";
5
+ import { switchboardBindings } from "./parts/switchboard-bindings.js";
6
+ export declare class Switchboard<B extends SwitchboardBindings> {
7
+ #private;
8
+ readonly stations: Station<B>[];
9
+ static readonly mode: "switchboard";
10
+ static readonly bindings: typeof switchboardBindings;
11
+ readonly devices: SetG<Device>;
12
+ constructor(stations: Station<B>[]);
13
+ [Symbol.iterator](): Generator<Station<B>, void, unknown>;
14
+ entries(): Generator<[number, Station<B>], void, unknown>;
15
+ /** poll all the stations */
16
+ poll(now: number): void;
17
+ /** check if a station has a known switchboard device assigned */
18
+ isActive(station: Station<B>): boolean;
19
+ stationByIndex(index: number): Station<B>;
20
+ stationByDevice(device: Device): Station<B> | undefined;
21
+ deviceByStation(station: Station<B>): Device | undefined;
22
+ /** move a player's device to the next or previous station */
23
+ shimmy(device: Device, indexDelta: 1 | -1): Station<B>;
24
+ /** connect-or-assign a device to a station */
25
+ connect<D extends Device>(device: D, station?: Station<B>): () => void;
26
+ /** unplug a player's device */
27
+ disconnect(device: Device): void;
28
+ /** returns an unassigned station (otherwise the last one) */
29
+ chooseLonelyStation(): Station<B>;
30
+ }
@@ -0,0 +1,90 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Scalar } from "@benev/math";
3
+ import { switchboardMode } from "./types.js";
4
+ import { switchboardBindings } from "./parts/switchboard-bindings.js";
5
+ export class Switchboard {
6
+ stations;
7
+ static mode = switchboardMode;
8
+ static bindings = switchboardBindings;
9
+ devices = new SetG();
10
+ constructor(stations) {
11
+ this.stations = stations;
12
+ for (const station of stations) {
13
+ const fn = (delta) => () => {
14
+ const device = this.deviceByStation(station);
15
+ if (device)
16
+ this.shimmy(device, delta);
17
+ };
18
+ station.actions.switchboard.shimmyNext.onDown(fn(1));
19
+ station.actions.switchboard.shimmyPrevious.onDown(fn(-1));
20
+ station.modes.add(Switchboard.mode);
21
+ }
22
+ }
23
+ *[Symbol.iterator]() {
24
+ yield* this.stations.values();
25
+ }
26
+ *entries() {
27
+ yield* this.stations.entries();
28
+ }
29
+ /** poll all the stations */
30
+ poll(now) {
31
+ for (const station of this.stations)
32
+ station.poll(now);
33
+ }
34
+ /** check if a station has a known switchboard device assigned */
35
+ isActive(station) {
36
+ return !!this.deviceByStation(station);
37
+ }
38
+ stationByIndex(index) {
39
+ const station = this.stations.at(index);
40
+ if (!station)
41
+ throw new Error(`station ${index} not found`);
42
+ return station;
43
+ }
44
+ stationByDevice(device) {
45
+ for (const station of this.stations) {
46
+ if (station.devices.has(device))
47
+ return station;
48
+ }
49
+ }
50
+ deviceByStation(station) {
51
+ for (const device of this.devices) {
52
+ if (station.devices.has(device))
53
+ return device;
54
+ }
55
+ }
56
+ /** move a player's device to the next or previous station */
57
+ shimmy(device, indexDelta) {
58
+ const oldIndex = this.stations.findIndex(station => station.devices.has(device));
59
+ const maxIndex = Math.max(0, this.stations.length - 1);
60
+ const newIndex = Scalar.clamp(oldIndex + indexDelta, 0, maxIndex);
61
+ const station = this.stationByIndex(newIndex);
62
+ this.connect(device, station);
63
+ return station;
64
+ }
65
+ /** connect-or-assign a device to a station */
66
+ connect(device, station = this.chooseLonelyStation()) {
67
+ this.#removeDeviceFromAllStations(device);
68
+ this.devices.add(device);
69
+ station.devices.add(device);
70
+ return () => this.disconnect(device);
71
+ }
72
+ /** unplug a player's device */
73
+ disconnect(device) {
74
+ this.#removeDeviceFromAllStations(device);
75
+ this.devices.delete(device);
76
+ }
77
+ /** returns an unassigned station (otherwise the last one) */
78
+ chooseLonelyStation() {
79
+ for (const station of this.stations) {
80
+ if (!this.deviceByStation(station))
81
+ return station;
82
+ }
83
+ const index = Math.max(0, this.stations.length - 1);
84
+ return this.stationByIndex(index);
85
+ }
86
+ #removeDeviceFromAllStations(device) {
87
+ this.stations.forEach(station => station.devices.delete(device));
88
+ }
89
+ }
90
+ //# sourceMappingURL=switchboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switchboard.js","sourceRoot":"","sources":["../../s/station/switchboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { Station } from "../station.js";
2
+ import { Switchboard } from "../switchboard.js";
3
+ import { Device } from "../devices/infra/device.js";
4
+ import { SamplerDevice } from "../devices/infra/sampler.js";
5
+ export declare class TestTime {
6
+ frame: number;
7
+ get now(): number;
8
+ }
9
+ export declare function testBindings(): {
10
+ basic: {
11
+ jump: {
12
+ lenses: {
13
+ code: string;
14
+ }[];
15
+ }[];
16
+ shoot: {
17
+ lenses: {
18
+ code: string;
19
+ }[];
20
+ }[];
21
+ };
22
+ };
23
+ export declare function testConnect<D extends Device>(switchboard: Switchboard<any>, device: D): D;
24
+ export declare function testSetupAlpha(): {
25
+ device: SamplerDevice;
26
+ station: Station<{
27
+ basic: {
28
+ jump: {
29
+ lenses: {
30
+ code: string;
31
+ }[];
32
+ }[];
33
+ shoot: {
34
+ lenses: {
35
+ code: string;
36
+ }[];
37
+ }[];
38
+ };
39
+ }>;
40
+ time: TestTime;
41
+ };
42
+ export declare function testSetupBravo(): {
43
+ switchboard: Switchboard<import("../types.js").AsSwitchboardBindings<{
44
+ basic: {
45
+ jump: {
46
+ lenses: {
47
+ code: string;
48
+ }[];
49
+ }[];
50
+ shoot: {
51
+ lenses: {
52
+ code: string;
53
+ }[];
54
+ }[];
55
+ };
56
+ }>>;
57
+ time: TestTime;
58
+ };
@@ -0,0 +1,39 @@
1
+ import { Station } from "../station.js";
2
+ import { asBindings } from "../types.js";
3
+ import { Switchboard } from "../switchboard.js";
4
+ import { SamplerDevice } from "../devices/infra/sampler.js";
5
+ import { switchboardBindings } from "../parts/switchboard-bindings.js";
6
+ export class TestTime {
7
+ frame = 0;
8
+ get now() {
9
+ return (this.frame++) * (1000 / 60);
10
+ }
11
+ }
12
+ export function testBindings() {
13
+ return asBindings({
14
+ basic: {
15
+ jump: [{ lenses: [{ code: "Space" }] }],
16
+ shoot: [{ lenses: [{ code: "pointer.button.left" }] }],
17
+ },
18
+ });
19
+ }
20
+ export function testConnect(switchboard, device) {
21
+ switchboard.connect(device);
22
+ return device;
23
+ }
24
+ export function testSetupAlpha() {
25
+ const time = new TestTime();
26
+ const device = new SamplerDevice();
27
+ const station = new Station(testBindings())
28
+ .addModes("basic")
29
+ .addDevices(device);
30
+ return { device, station, time };
31
+ }
32
+ export function testSetupBravo() {
33
+ const time = new TestTime();
34
+ const station = () => new Station(switchboardBindings(testBindings()))
35
+ .addModes(Switchboard.mode, "basic");
36
+ const switchboard = new Switchboard([station(), station(), station(), station()]);
37
+ return { switchboard, time };
38
+ }
39
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../s/station/testing/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAA;AACtC,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAE7C,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAA;AAEpE,MAAM,OAAO,QAAQ;IACpB,KAAK,GAAG,CAAC,CAAA;IAET,IAAI,GAAG;QACN,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;IACpC,CAAC;CACD;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO,UAAU,CAAC;QACjB,KAAK,EAAE;YACN,IAAI,EAAE,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC,EAAC,CAAC;YACnC,KAAK,EAAE,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,IAAI,EAAE,qBAAqB,EAAC,CAAC,EAAC,CAAC;SAClD;KACD,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAmB,WAA6B,EAAE,MAAS;IACrF,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3B,OAAO,MAAM,CAAA;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;SACzC,QAAQ,CAAC,OAAO,CAAC;SACjB,UAAU,CAAC,MAAM,CAAC,CAAA;IACpB,OAAO,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,CAAC;SACpE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACrC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IACjF,OAAO,EAAC,WAAW,EAAE,IAAI,EAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Action } from "./parts/action.js";
2
+ export type Actions<B extends Bindings> = {
3
+ [Mode in keyof B]: {
4
+ [K in keyof B[Mode]]: Action;
5
+ };
6
+ };
7
+ export type Sample = [code: string, value: number];
8
+ export type SampleMap = Map<string, number>;
9
+ export type Timing = (DirectTiming | TapTiming | HoldTiming);
10
+ export type DirectTiming = {
11
+ style: "direct";
12
+ };
13
+ export type TapTiming = {
14
+ style: "tap";
15
+ holdTime?: number;
16
+ };
17
+ export type HoldTiming = {
18
+ style: "hold";
19
+ holdTime?: number;
20
+ };
21
+ export type LensSettings = {
22
+ scale: number;
23
+ invert: boolean;
24
+ deadzone: number;
25
+ timing: Timing;
26
+ };
27
+ export type Lens = {
28
+ code: string;
29
+ settings?: Partial<LensSettings>;
30
+ };
31
+ export type LensState = {
32
+ lastValue: number;
33
+ holdStart: number;
34
+ };
35
+ export type Spoon = {
36
+ lenses: Lens[];
37
+ required?: Lens[];
38
+ forbidden?: Lens[];
39
+ };
40
+ export type Fork = Spoon[];
41
+ export type Bracket = {
42
+ [action: string]: Spoon[];
43
+ };
44
+ export type Bindings = {
45
+ [mode: string]: Bracket;
46
+ };
47
+ export type AsBindings<B extends Bindings> = B;
48
+ export declare function asBindings<B extends Bindings>(bindings: B): B;
49
+ export declare const switchboardMode: "switchboard";
50
+ export type AsSwitchboardBindings<B extends Bindings> = {
51
+ [switchboardMode]: {
52
+ shimmyNext: Spoon[];
53
+ shimmyPrevious: Spoon[];
54
+ };
55
+ } & B;
56
+ export type SwitchboardBindings = AsSwitchboardBindings<Bindings>;
@@ -0,0 +1,5 @@
1
+ export function asBindings(bindings) {
2
+ return bindings;
3
+ }
4
+ export const switchboardMode = "switchboard";
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../s/station/types.ts"],"names":[],"mappings":"AAyDA,MAAM,UAAU,UAAU,CAAqB,QAAW;IACzD,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,aAAsB,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function isPressed(value: number): boolean;
@@ -0,0 +1,4 @@
1
+ export function isPressed(value) {
2
+ return value > 0;
3
+ }
4
+ //# sourceMappingURL=is-pressed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-pressed.js","sourceRoot":"","sources":["../../../s/station/utils/is-pressed.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,OAAO,KAAK,GAAG,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function modprefix(event: KeyboardEvent | PointerEvent | WheelEvent, code: string): string;
@@ -0,0 +1,16 @@
1
+ export function modprefix(event, code) {
2
+ const modifiers = [];
3
+ if (event.ctrlKey)
4
+ modifiers.push("ctrl");
5
+ if (event.altKey)
6
+ modifiers.push("alt");
7
+ if (event.metaKey)
8
+ modifiers.push("meta");
9
+ if (event.shiftKey)
10
+ modifiers.push("shift");
11
+ const prefix = modifiers.length > 0
12
+ ? [...modifiers].join("-")
13
+ : "x";
14
+ return `${prefix}-${code}`;
15
+ }
16
+ //# sourceMappingURL=modprefix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modprefix.js","sourceRoot":"","sources":["../../../s/station/utils/modprefix.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,SAAS,CAAC,KAAgD,EAAE,IAAY;IACvF,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,IAAI,KAAK,CAAC,OAAO;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,KAAK,CAAC,MAAM;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,IAAI,KAAK,CAAC,OAAO;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,KAAK,CAAC,QAAQ;QAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAA;IAEN,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function tmax(values: number[]): number;
@@ -0,0 +1,6 @@
1
+ export function tmax(values) {
2
+ return values.length > 0
3
+ ? Math.max(...values)
4
+ : 0;
5
+ }
6
+ //# sourceMappingURL=tmax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmax.js","sourceRoot":"","sources":["../../../s/station/utils/tmax.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,IAAI,CAAC,MAAgB;IACpC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function tmin(values: number[]): number;
@@ -0,0 +1,6 @@
1
+ export function tmin(values) {
2
+ return values.length > 0
3
+ ? Math.min(...values)
4
+ : 0;
5
+ }
6
+ //# sourceMappingURL=tmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmin.js","sourceRoot":"","sources":["../../../s/station/utils/tmin.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,IAAI,CAAC,MAAgB;IACpC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import { Science } from "@e280/science";
2
+ import station from "./station/station.test.js";
3
+ await Science.run({
4
+ station,
5
+ });
6
+ //# sourceMappingURL=tests.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.test.js","sourceRoot":"","sources":["../s/tests.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,OAAO,MAAM,2BAA2B,CAAA;AAE/C,MAAM,OAAO,CAAC,GAAG,CAAC;IACjB,OAAO;CACP,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function evergreen<V>(value: V, fn: () => V | null | undefined): () => V;
@@ -0,0 +1,10 @@
1
+ export function evergreen(value, fn) {
2
+ let cached = value;
3
+ return () => {
4
+ const next = fn();
5
+ if (next !== undefined && next !== null)
6
+ cached = next;
7
+ return cached;
8
+ };
9
+ }
10
+ //# sourceMappingURL=evergreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evergreen.js","sourceRoot":"","sources":["../../s/utils/evergreen.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,SAAS,CAAI,KAAQ,EAAE,EAA8B;IACpE,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,OAAO,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,EAAE,EAAE,CAAA;QACjB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,GAAG,IAAI,CAAA;QACtD,OAAO,MAAM,CAAA;IACd,CAAC,CAAA;AACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Disposable } from "@e280/stz";
2
+ /** stable reference to a gamepad, has a getter to get the latest gamepad snapshot */
3
+ export declare class Pad {
4
+ private get;
5
+ constructor(get: () => Gamepad);
6
+ get gamepad(): Gamepad;
7
+ }
8
+ /** track gamepad lifecycles as they connect or disconnect */
9
+ export declare function gamepads(on: (pad: Pad) => () => void): () => void;
10
+ export declare class Gamepads implements Disposable {
11
+ on: (pad: Pad) => () => void;
12
+ dispose: () => void;
13
+ constructor(on: (pad: Pad) => () => void);
14
+ }
@@ -0,0 +1,40 @@
1
+ import { ev, MapG } from "@e280/stz";
2
+ import { evergreen } from "./evergreen.js";
3
+ /** stable reference to a gamepad, has a getter to get the latest gamepad snapshot */
4
+ export class Pad {
5
+ get;
6
+ constructor(get) {
7
+ this.get = get;
8
+ }
9
+ get gamepad() {
10
+ return this.get();
11
+ }
12
+ }
13
+ /** track gamepad lifecycles as they connect or disconnect */
14
+ export function gamepads(on) {
15
+ const pads = new MapG();
16
+ return ev(window, {
17
+ gamepadconnected: ({ gamepad }) => {
18
+ const get = () => navigator.getGamepads().at(gamepad.index);
19
+ const pad = new Pad(evergreen(gamepad, get));
20
+ const dispose = on(pad);
21
+ pads.set(gamepad.index, { pad, dispose });
22
+ },
23
+ gamepaddisconnected: ({ gamepad }) => {
24
+ const result = pads.get(gamepad.index);
25
+ if (result) {
26
+ pads.delete(gamepad.index);
27
+ result.dispose();
28
+ }
29
+ },
30
+ });
31
+ }
32
+ export class Gamepads {
33
+ on;
34
+ dispose;
35
+ constructor(on) {
36
+ this.on = on;
37
+ this.dispose = gamepads(on);
38
+ }
39
+ }
40
+ //# sourceMappingURL=gamepads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamepads.js","sourceRoot":"","sources":["../../s/utils/gamepads.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,EAAE,EAAE,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAA;AAExC,qFAAqF;AACrF,MAAM,OAAO,GAAG;IACK;IAApB,YAAoB,GAAkB;QAAlB,QAAG,GAAH,GAAG,CAAe;IAAG,CAAC;IAE1C,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IAClB,CAAC;CACD;AAED,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,EAA4B;IACpD,MAAM,IAAI,GAAG,IAAI,IAAI,EAA2C,CAAA;IAChE,OAAO,EAAE,CAAC,MAAM,EAAE;QACjB,gBAAgB,EAAE,CAAC,EAAC,OAAO,EAAe,EAAE,EAAE;YAC7C,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;YAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;YACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAC,GAAG,EAAE,OAAO,EAAC,CAAC,CAAA;QACxC,CAAC;QAED,mBAAmB,EAAE,CAAC,EAAC,OAAO,EAAe,EAAE,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC1B,MAAM,CAAC,OAAO,EAAE,CAAA;YACjB,CAAC;QACF,CAAC;KACD,CAAC,CAAA;AACH,CAAC;AAED,MAAM,OAAO,QAAQ;IAED;IADnB,OAAO,CAAY;IACnB,YAAmB,EAA4B;QAA5B,OAAE,GAAF,EAAE,CAA0B;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;CACD"}
@@ -0,0 +1 @@
1
+ export declare function splitAxis(n: number): number[];
@@ -0,0 +1,6 @@
1
+ export function splitAxis(n) {
2
+ return (n >= 0)
3
+ ? [0, n]
4
+ : [Math.abs(n), 0];
5
+ }
6
+ //# sourceMappingURL=split-axis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-axis.js","sourceRoot":"","sources":["../../s/utils/split-axis.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,SAAS,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACd,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACpB,CAAC"}