@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.
- package/LICENSE +23 -0
- package/README.md +299 -0
- package/package.json +60 -0
- package/s/demo/main.bundle.ts +14 -0
- package/s/demo/main.css +57 -0
- package/s/index.html.ts +42 -0
- package/s/index.ts +16 -0
- package/s/nubs/lookpad/styles.ts +21 -0
- package/s/nubs/lookpad/utils/listeners.ts +53 -0
- package/s/nubs/lookpad/view.ts +32 -0
- package/s/nubs/stick/device.ts +30 -0
- package/s/nubs/stick/styles.ts +22 -0
- package/s/nubs/stick/utils/calculate_new_vector_from_pointer_position.ts +27 -0
- package/s/nubs/stick/utils/find_closest_point_on_circle.ts +15 -0
- package/s/nubs/stick/utils/make_pointer_listeners.ts +50 -0
- package/s/nubs/stick/utils/within_radius.ts +6 -0
- package/s/nubs/stick/view.ts +50 -0
- package/s/nubs/stick-graphic/styles.ts +38 -0
- package/s/nubs/stick-graphic/types/basis.ts +5 -0
- package/s/nubs/stick-graphic/utils/calculate_basis.ts +19 -0
- package/s/nubs/stick-graphic/utils/stick_vector_to_pixels.ts +13 -0
- package/s/nubs/stick-graphic/utils/transform.ts +10 -0
- package/s/nubs/stick-graphic/view.ts +43 -0
- package/s/nubs/virtual-gamepad/device.ts +25 -0
- package/s/nubs/virtual-gamepad/styles.css.ts +133 -0
- package/s/nubs/virtual-gamepad/utils/gamepad-inputs.ts +42 -0
- package/s/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.ts +12 -0
- package/s/nubs/virtual-gamepad/utils/touch-tracking.ts +75 -0
- package/s/nubs/virtual-gamepad/view.ts +139 -0
- package/s/station/devices/gamepad.ts +81 -0
- package/s/station/devices/infra/device.ts +7 -0
- package/s/station/devices/infra/group.ts +17 -0
- package/s/station/devices/infra/sampler.ts +22 -0
- package/s/station/devices/keyboard.ts +53 -0
- package/s/station/devices/pointer.ts +95 -0
- package/s/station/parts/action.ts +26 -0
- package/s/station/parts/defaults.ts +28 -0
- package/s/station/parts/resolver.ts +73 -0
- package/s/station/parts/routines/aggregate_samples_into_map.ts +20 -0
- package/s/station/parts/routines/build_updatable_actions_structure.ts +29 -0
- package/s/station/parts/routines/lensing_algorithm.ts +74 -0
- package/s/station/parts/switchboard-bindings.ts +21 -0
- package/s/station/station.test.ts +86 -0
- package/s/station/station.ts +47 -0
- package/s/station/switchboard.ts +107 -0
- package/s/station/testing/testing.ts +47 -0
- package/s/station/types.ts +72 -0
- package/s/station/utils/is-pressed.ts +5 -0
- package/s/station/utils/modprefix.ts +16 -0
- package/s/station/utils/tmax.ts +7 -0
- package/s/station/utils/tmin.ts +7 -0
- package/s/tests.test.ts +8 -0
- package/s/utils/evergreen.ts +10 -0
- package/s/utils/gamepads.ts +41 -0
- package/s/utils/split-axis.ts +7 -0
- package/x/demo/main.bundle.d.ts +1 -0
- package/x/demo/main.bundle.js +11 -0
- package/x/demo/main.bundle.js.map +1 -0
- package/x/demo/main.bundle.min.js +139 -0
- package/x/demo/main.bundle.min.js.map +7 -0
- package/x/demo/main.css +57 -0
- package/x/index.d.ts +13 -0
- package/x/index.html +97 -0
- package/x/index.html.d.ts +2 -0
- package/x/index.html.js +37 -0
- package/x/index.html.js.map +1 -0
- package/x/index.js +14 -0
- package/x/index.js.map +1 -0
- package/x/nubs/lookpad/styles.d.ts +1 -0
- package/x/nubs/lookpad/styles.js +21 -0
- package/x/nubs/lookpad/styles.js.map +1 -0
- package/x/nubs/lookpad/utils/listeners.d.ts +19 -0
- package/x/nubs/lookpad/utils/listeners.js +37 -0
- package/x/nubs/lookpad/utils/listeners.js.map +1 -0
- package/x/nubs/lookpad/view.d.ts +1 -0
- package/x/nubs/lookpad/view.js +24 -0
- package/x/nubs/lookpad/view.js.map +1 -0
- package/x/nubs/stick/device.d.ts +15 -0
- package/x/nubs/stick/device.js +27 -0
- package/x/nubs/stick/device.js.map +1 -0
- package/x/nubs/stick/styles.d.ts +1 -0
- package/x/nubs/stick/styles.js +22 -0
- package/x/nubs/stick/styles.js.map +1 -0
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.d.ts +3 -0
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js +16 -0
- package/x/nubs/stick/utils/calculate_new_vector_from_pointer_position.js.map +1 -0
- package/x/nubs/stick/utils/find_closest_point_on_circle.d.ts +2 -0
- package/x/nubs/stick/utils/find_closest_point_on_circle.js +6 -0
- package/x/nubs/stick/utils/find_closest_point_on_circle.js.map +1 -0
- package/x/nubs/stick/utils/make_pointer_listeners.d.ts +16 -0
- package/x/nubs/stick/utils/make_pointer_listeners.js +34 -0
- package/x/nubs/stick/utils/make_pointer_listeners.js.map +1 -0
- package/x/nubs/stick/utils/within_radius.d.ts +2 -0
- package/x/nubs/stick/utils/within_radius.js +4 -0
- package/x/nubs/stick/utils/within_radius.js.map +1 -0
- package/x/nubs/stick/view.d.ts +2 -0
- package/x/nubs/stick/view.js +38 -0
- package/x/nubs/stick/view.js.map +1 -0
- package/x/nubs/stick-graphic/styles.d.ts +1 -0
- package/x/nubs/stick-graphic/styles.js +38 -0
- package/x/nubs/stick-graphic/styles.js.map +1 -0
- package/x/nubs/stick-graphic/types/basis.d.ts +4 -0
- package/x/nubs/stick-graphic/types/basis.js +2 -0
- package/x/nubs/stick-graphic/types/basis.js.map +1 -0
- package/x/nubs/stick-graphic/utils/calculate_basis.d.ts +2 -0
- package/x/nubs/stick-graphic/utils/calculate_basis.js +10 -0
- package/x/nubs/stick-graphic/utils/calculate_basis.js.map +1 -0
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.d.ts +2 -0
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js +7 -0
- package/x/nubs/stick-graphic/utils/stick_vector_to_pixels.js.map +1 -0
- package/x/nubs/stick-graphic/utils/transform.d.ts +2 -0
- package/x/nubs/stick-graphic/utils/transform.js +7 -0
- package/x/nubs/stick-graphic/utils/transform.js.map +1 -0
- package/x/nubs/stick-graphic/view.d.ts +3 -0
- package/x/nubs/stick-graphic/view.js +30 -0
- package/x/nubs/stick-graphic/view.js.map +1 -0
- package/x/nubs/virtual-gamepad/device.d.ts +7 -0
- package/x/nubs/virtual-gamepad/device.js +20 -0
- package/x/nubs/virtual-gamepad/device.js.map +1 -0
- package/x/nubs/virtual-gamepad/styles.css.d.ts +2 -0
- package/x/nubs/virtual-gamepad/styles.css.js +133 -0
- package/x/nubs/virtual-gamepad/styles.css.js.map +1 -0
- package/x/nubs/virtual-gamepad/utils/gamepad-inputs.d.ts +29 -0
- package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js +31 -0
- package/x/nubs/virtual-gamepad/utils/gamepad-inputs.js.map +1 -0
- package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.d.ts +1 -0
- package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js +9 -0
- package/x/nubs/virtual-gamepad/utils/prevent-default-touch-shenanigans.js.map +1 -0
- package/x/nubs/virtual-gamepad/utils/touch-tracking.d.ts +6 -0
- package/x/nubs/virtual-gamepad/utils/touch-tracking.js +55 -0
- package/x/nubs/virtual-gamepad/utils/touch-tracking.js.map +1 -0
- package/x/nubs/virtual-gamepad/view.d.ts +2 -0
- package/x/nubs/virtual-gamepad/view.js +120 -0
- package/x/nubs/virtual-gamepad/view.js.map +1 -0
- package/x/station/devices/gamepad.d.ts +10 -0
- package/x/station/devices/gamepad.js +70 -0
- package/x/station/devices/gamepad.js.map +1 -0
- package/x/station/devices/infra/device.d.ts +4 -0
- package/x/station/devices/infra/device.js +3 -0
- package/x/station/devices/infra/device.js.map +1 -0
- package/x/station/devices/infra/group.d.ts +7 -0
- package/x/station/devices/infra/group.js +13 -0
- package/x/station/devices/infra/group.js.map +1 -0
- package/x/station/devices/infra/sampler.d.ts +8 -0
- package/x/station/devices/infra/sampler.js +17 -0
- package/x/station/devices/infra/sampler.js.map +1 -0
- package/x/station/devices/keyboard.d.ts +9 -0
- package/x/station/devices/keyboard.js +42 -0
- package/x/station/devices/keyboard.js.map +1 -0
- package/x/station/devices/pointer.d.ts +11 -0
- package/x/station/devices/pointer.js +79 -0
- package/x/station/devices/pointer.js.map +1 -0
- package/x/station/parts/action.d.ts +12 -0
- package/x/station/parts/action.js +23 -0
- package/x/station/parts/action.js.map +1 -0
- package/x/station/parts/defaults.d.ts +5 -0
- package/x/station/parts/defaults.js +22 -0
- package/x/station/parts/defaults.js.map +1 -0
- package/x/station/parts/resolver.d.ts +10 -0
- package/x/station/parts/resolver.js +63 -0
- package/x/station/parts/resolver.js.map +1 -0
- package/x/station/parts/routines/aggregate_samples_into_map.d.ts +3 -0
- package/x/station/parts/routines/aggregate_samples_into_map.js +11 -0
- package/x/station/parts/routines/aggregate_samples_into_map.js.map +1 -0
- package/x/station/parts/routines/build_updatable_actions_structure.d.ts +5 -0
- package/x/station/parts/routines/build_updatable_actions_structure.js +18 -0
- package/x/station/parts/routines/build_updatable_actions_structure.js.map +1 -0
- package/x/station/parts/routines/lensing_algorithm.d.ts +2 -0
- package/x/station/parts/routines/lensing_algorithm.js +42 -0
- package/x/station/parts/routines/lensing_algorithm.js.map +1 -0
- package/x/station/parts/switchboard-bindings.d.ts +2 -0
- package/x/station/parts/switchboard-bindings.js +19 -0
- package/x/station/parts/switchboard-bindings.js.map +1 -0
- package/x/station/station.d.ts +15 -0
- package/x/station/station.js +35 -0
- package/x/station/station.js.map +1 -0
- package/x/station/station.test.d.ts +11 -0
- package/x/station/station.test.js +80 -0
- package/x/station/station.test.js.map +1 -0
- package/x/station/switchboard.d.ts +30 -0
- package/x/station/switchboard.js +90 -0
- package/x/station/switchboard.js.map +1 -0
- package/x/station/testing/testing.d.ts +58 -0
- package/x/station/testing/testing.js +39 -0
- package/x/station/testing/testing.js.map +1 -0
- package/x/station/types.d.ts +56 -0
- package/x/station/types.js +5 -0
- package/x/station/types.js.map +1 -0
- package/x/station/utils/is-pressed.d.ts +1 -0
- package/x/station/utils/is-pressed.js +4 -0
- package/x/station/utils/is-pressed.js.map +1 -0
- package/x/station/utils/modprefix.d.ts +1 -0
- package/x/station/utils/modprefix.js +16 -0
- package/x/station/utils/modprefix.js.map +1 -0
- package/x/station/utils/tmax.d.ts +1 -0
- package/x/station/utils/tmax.js +6 -0
- package/x/station/utils/tmax.js.map +1 -0
- package/x/station/utils/tmin.d.ts +1 -0
- package/x/station/utils/tmin.js +6 -0
- package/x/station/utils/tmin.js.map +1 -0
- package/x/tests.test.d.ts +1 -0
- package/x/tests.test.js +6 -0
- package/x/tests.test.js.map +1 -0
- package/x/utils/evergreen.d.ts +1 -0
- package/x/utils/evergreen.js +10 -0
- package/x/utils/evergreen.js.map +1 -0
- package/x/utils/gamepads.d.ts +14 -0
- package/x/utils/gamepads.js +40 -0
- package/x/utils/gamepads.js.map +1 -0
- package/x/utils/split-axis.d.ts +1 -0
- package/x/utils/split-axis.js +6 -0
- 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":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAGlC,OAAO,EAAC,eAAe,EAAsB,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAA;AAEnE,MAAM,OAAO,WAAW;IAMK;IAL5B,MAAM,CAAU,IAAI,GAAG,eAAe,CAAA;IACtC,MAAM,CAAU,QAAQ,GAAG,mBAAmB,CAAA;IAErC,OAAO,GAAG,IAAI,IAAI,EAAU,CAAA;IAErC,YAA4B,QAAsB;QAAtB,aAAQ,GAAR,QAAQ,CAAc;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,EAAE;gBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;gBAC5C,IAAI,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACvC,CAAC,CAAA;YACD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC;IACF,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjB,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;IAC9B,CAAC;IAED,CAAC,OAAO;QACP,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC/B,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,GAAW;QACf,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;YAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,OAAmB;QAC3B,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAED,cAAc,CAAC,KAAa;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,CAAA;QAC3D,OAAO,OAAO,CAAA;IACf,CAAC;IAED,eAAe,CAAC,MAAc;QAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC9B,OAAO,OAAO,CAAA;QAChB,CAAC;IACF,CAAC;IAED,eAAe,CAAC,OAAmB;QAClC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC9B,OAAO,MAAM,CAAA;QACf,CAAC;IACF,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,MAAc,EAAE,UAAkB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7B,OAAO,OAAO,CAAA;IACf,CAAC;IAED,8CAA8C;IAC9C,OAAO,CACL,MAAS,EACT,UAAsB,IAAI,CAAC,mBAAmB,EAAE;QAEjD,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACxB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,+BAA+B;IAC/B,UAAU,CAAC,MAAc;QACxB,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,6DAA6D;IAC7D,mBAAmB;QAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBACjC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IAED,4BAA4B,CAAC,MAAc;QAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACjE,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 {};
|
package/x/tests.test.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|