@benev/tact 0.1.0-1 → 0.1.0-3

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 (213) hide show
  1. package/README.md +265 -140
  2. package/package.json +5 -3
  3. package/s/{station/parts → core/bindings}/action.ts +3 -9
  4. package/s/core/bindings/parts/defaults.ts +29 -0
  5. package/s/{station/parts/routines/lensing_algorithm.ts → core/bindings/parts/lens-algo.ts} +15 -14
  6. package/s/core/bindings/resolver.ts +96 -0
  7. package/s/core/bindings/types.ts +57 -0
  8. package/s/core/controllers/controller.ts +7 -0
  9. package/s/core/controllers/infra/group.ts +17 -0
  10. package/s/{station/devices → core/controllers}/infra/sampler.ts +3 -3
  11. package/s/{station/devices → core/controllers/standard}/gamepad.ts +5 -9
  12. package/s/core/controllers/standard/index.ts +7 -0
  13. package/s/{station/devices → core/controllers/standard}/keyboard.ts +3 -6
  14. package/s/{station/devices → core/controllers/standard}/pointer.ts +31 -37
  15. package/s/{nubs/stick/device.ts → core/controllers/standard/stick.ts} +3 -3
  16. package/s/{nubs/virtual-gamepad/device.ts → core/controllers/standard/virtual-gamepad.ts} +5 -5
  17. package/s/core/controllers/types.ts +4 -0
  18. package/s/core/core.test.ts +90 -0
  19. package/s/core/deck/deck.ts +40 -0
  20. package/s/core/deck/parts/bindings-depot.ts +24 -0
  21. package/s/core/deck/parts/local-storage-kv.ts +7 -0
  22. package/s/core/hub/auto-gamepads.ts +8 -0
  23. package/s/core/hub/bindings.ts +18 -0
  24. package/s/core/hub/hub.ts +102 -0
  25. package/s/core/hub/types.ts +14 -0
  26. package/s/core/index.ts +21 -0
  27. package/s/core/port/port.ts +34 -0
  28. package/s/core/port/utils/aggregate_samples_into_map.ts +20 -0
  29. package/s/core/port/utils/wipe_samples_map.ts +8 -0
  30. package/s/core/testing/testing.ts +50 -0
  31. package/s/demo/main.bundle.ts +2 -2
  32. package/s/index.ts +1 -11
  33. package/s/nubs/stick/view.ts +2 -2
  34. package/s/nubs/virtual-gamepad/view.ts +6 -6
  35. package/s/tests.test.ts +2 -4
  36. package/s/{station/utils/tmin.ts → utils/quick-math.ts} +6 -0
  37. package/x/{station/parts → core/bindings}/action.d.ts +1 -3
  38. package/x/{station/parts → core/bindings}/action.js +3 -10
  39. package/x/core/bindings/action.js.map +1 -0
  40. package/x/core/bindings/parts/defaults.d.ts +3 -0
  41. package/x/core/bindings/parts/defaults.js +23 -0
  42. package/x/core/bindings/parts/defaults.js.map +1 -0
  43. package/x/core/bindings/parts/is-pressed.js.map +1 -0
  44. package/x/core/bindings/parts/lens-algo.d.ts +2 -0
  45. package/x/{station/parts/routines/lensing_algorithm.js → core/bindings/parts/lens-algo.js} +12 -11
  46. package/x/core/bindings/parts/lens-algo.js.map +1 -0
  47. package/x/core/bindings/resolver.d.ts +8 -0
  48. package/x/core/bindings/resolver.js +87 -0
  49. package/x/core/bindings/resolver.js.map +1 -0
  50. package/x/core/bindings/types.d.ts +38 -0
  51. package/x/core/bindings/types.js +4 -0
  52. package/x/core/bindings/types.js.map +1 -0
  53. package/x/core/controllers/controller.d.ts +4 -0
  54. package/x/core/controllers/controller.js +3 -0
  55. package/x/core/controllers/controller.js.map +1 -0
  56. package/x/core/controllers/infra/group.d.ts +7 -0
  57. package/x/core/controllers/infra/group.js +13 -0
  58. package/x/core/controllers/infra/group.js.map +1 -0
  59. package/x/core/controllers/infra/sampler.d.ts +8 -0
  60. package/x/{station/devices → core/controllers}/infra/sampler.js +2 -2
  61. package/x/core/controllers/infra/sampler.js.map +1 -0
  62. package/x/core/controllers/standard/gamepad.d.ts +9 -0
  63. package/x/{station/devices → core/controllers/standard}/gamepad.js +4 -8
  64. package/x/core/controllers/standard/gamepad.js.map +1 -0
  65. package/x/core/controllers/standard/index.d.ts +5 -0
  66. package/x/core/controllers/standard/index.js +6 -0
  67. package/x/core/controllers/standard/index.js.map +1 -0
  68. package/x/{station/devices → core/controllers/standard}/keyboard.d.ts +3 -3
  69. package/x/{station/devices → core/controllers/standard}/keyboard.js +3 -6
  70. package/x/core/controllers/standard/keyboard.js.map +1 -0
  71. package/x/{station/devices → core/controllers/standard}/pointer.d.ts +3 -3
  72. package/x/{station/devices → core/controllers/standard}/pointer.js +26 -31
  73. package/x/core/controllers/standard/pointer.js.map +1 -0
  74. package/x/{nubs/stick/device.d.ts → core/controllers/standard/stick.d.ts} +2 -2
  75. package/x/{nubs/stick/device.js → core/controllers/standard/stick.js} +4 -4
  76. package/x/core/controllers/standard/stick.js.map +1 -0
  77. package/x/core/controllers/standard/virtual-gamepad.d.ts +7 -0
  78. package/x/{nubs/virtual-gamepad/device.js → core/controllers/standard/virtual-gamepad.js} +6 -6
  79. package/x/core/controllers/standard/virtual-gamepad.js.map +1 -0
  80. package/x/core/controllers/types.d.ts +2 -0
  81. package/x/core/controllers/types.js +2 -0
  82. package/x/core/controllers/types.js.map +1 -0
  83. package/x/core/core.test.d.ts +11 -0
  84. package/x/core/core.test.js +84 -0
  85. package/x/core/core.test.js.map +1 -0
  86. package/x/core/deck/deck.d.ts +16 -0
  87. package/x/core/deck/deck.js +31 -0
  88. package/x/core/deck/deck.js.map +1 -0
  89. package/x/core/deck/parts/bindings-depot.d.ts +9 -0
  90. package/x/core/deck/parts/bindings-depot.js +19 -0
  91. package/x/core/deck/parts/bindings-depot.js.map +1 -0
  92. package/x/core/deck/parts/local-storage-kv.d.ts +2 -0
  93. package/x/core/deck/parts/local-storage-kv.js +5 -0
  94. package/x/core/deck/parts/local-storage-kv.js.map +1 -0
  95. package/x/core/hub/auto-gamepads.d.ts +2 -0
  96. package/x/core/hub/auto-gamepads.js +6 -0
  97. package/x/core/hub/auto-gamepads.js.map +1 -0
  98. package/x/core/hub/bindings.d.ts +2 -0
  99. package/x/core/hub/bindings.js +16 -0
  100. package/x/core/hub/bindings.js.map +1 -0
  101. package/x/core/hub/hub.d.ts +28 -0
  102. package/x/core/hub/hub.js +91 -0
  103. package/x/core/hub/hub.js.map +1 -0
  104. package/x/core/hub/types.d.ts +9 -0
  105. package/x/core/hub/types.js +2 -0
  106. package/x/core/hub/types.js.map +1 -0
  107. package/x/core/index.d.ts +15 -0
  108. package/x/core/index.js +16 -0
  109. package/x/core/index.js.map +1 -0
  110. package/x/core/port/port.d.ts +12 -0
  111. package/x/core/port/port.js +25 -0
  112. package/x/core/port/port.js.map +1 -0
  113. package/x/core/port/utils/aggregate_samples_into_map.d.ts +3 -0
  114. package/x/core/port/utils/aggregate_samples_into_map.js +11 -0
  115. package/x/core/port/utils/aggregate_samples_into_map.js.map +1 -0
  116. package/x/core/port/utils/wipe_samples_map.d.ts +2 -0
  117. package/x/core/port/utils/wipe_samples_map.js +5 -0
  118. package/x/core/port/utils/wipe_samples_map.js.map +1 -0
  119. package/x/core/testing/testing.d.ts +38 -0
  120. package/x/core/testing/testing.js +42 -0
  121. package/x/core/testing/testing.js.map +1 -0
  122. package/x/demo/main.bundle.js +2 -2
  123. package/x/demo/main.bundle.js.map +1 -1
  124. package/x/demo/main.bundle.min.js +1 -1
  125. package/x/demo/main.bundle.min.js.map +4 -4
  126. package/x/index.d.ts +1 -11
  127. package/x/index.html +3 -3
  128. package/x/index.js +1 -11
  129. package/x/index.js.map +1 -1
  130. package/x/nubs/stick/view.d.ts +2 -2
  131. package/x/nubs/stick/view.js.map +1 -1
  132. package/x/nubs/virtual-gamepad/view.d.ts +2 -2
  133. package/x/nubs/virtual-gamepad/view.js +5 -5
  134. package/x/nubs/virtual-gamepad/view.js.map +1 -1
  135. package/x/tests.test.js +2 -4
  136. package/x/tests.test.js.map +1 -1
  137. package/x/{station/utils/tmax.d.ts → utils/quick-math.d.ts} +1 -0
  138. package/x/utils/quick-math.js +11 -0
  139. package/x/utils/quick-math.js.map +1 -0
  140. package/s/station/devices/infra/device.ts +0 -7
  141. package/s/station/devices/infra/group.ts +0 -17
  142. package/s/station/parts/defaults.ts +0 -28
  143. package/s/station/parts/resolver.ts +0 -73
  144. package/s/station/parts/routines/aggregate_samples_into_map.ts +0 -20
  145. package/s/station/parts/routines/build_updatable_actions_structure.ts +0 -29
  146. package/s/station/parts/switchboard-bindings.ts +0 -21
  147. package/s/station/station.test.ts +0 -86
  148. package/s/station/station.ts +0 -47
  149. package/s/station/switchboard.ts +0 -107
  150. package/s/station/testing/testing.ts +0 -47
  151. package/s/station/types.ts +0 -72
  152. package/s/station/utils/modprefix.ts +0 -16
  153. package/s/station/utils/tmax.ts +0 -7
  154. package/x/nubs/stick/device.js.map +0 -1
  155. package/x/nubs/virtual-gamepad/device.d.ts +0 -7
  156. package/x/nubs/virtual-gamepad/device.js.map +0 -1
  157. package/x/station/devices/gamepad.d.ts +0 -10
  158. package/x/station/devices/gamepad.js.map +0 -1
  159. package/x/station/devices/infra/device.d.ts +0 -4
  160. package/x/station/devices/infra/device.js +0 -3
  161. package/x/station/devices/infra/device.js.map +0 -1
  162. package/x/station/devices/infra/group.d.ts +0 -7
  163. package/x/station/devices/infra/group.js +0 -13
  164. package/x/station/devices/infra/group.js.map +0 -1
  165. package/x/station/devices/infra/sampler.d.ts +0 -8
  166. package/x/station/devices/infra/sampler.js.map +0 -1
  167. package/x/station/devices/keyboard.js.map +0 -1
  168. package/x/station/devices/pointer.js.map +0 -1
  169. package/x/station/parts/action.js.map +0 -1
  170. package/x/station/parts/defaults.d.ts +0 -5
  171. package/x/station/parts/defaults.js +0 -22
  172. package/x/station/parts/defaults.js.map +0 -1
  173. package/x/station/parts/resolver.d.ts +0 -10
  174. package/x/station/parts/resolver.js +0 -63
  175. package/x/station/parts/resolver.js.map +0 -1
  176. package/x/station/parts/routines/aggregate_samples_into_map.d.ts +0 -3
  177. package/x/station/parts/routines/aggregate_samples_into_map.js +0 -11
  178. package/x/station/parts/routines/aggregate_samples_into_map.js.map +0 -1
  179. package/x/station/parts/routines/build_updatable_actions_structure.d.ts +0 -5
  180. package/x/station/parts/routines/build_updatable_actions_structure.js +0 -18
  181. package/x/station/parts/routines/build_updatable_actions_structure.js.map +0 -1
  182. package/x/station/parts/routines/lensing_algorithm.d.ts +0 -2
  183. package/x/station/parts/routines/lensing_algorithm.js.map +0 -1
  184. package/x/station/parts/switchboard-bindings.d.ts +0 -2
  185. package/x/station/parts/switchboard-bindings.js +0 -19
  186. package/x/station/parts/switchboard-bindings.js.map +0 -1
  187. package/x/station/station.d.ts +0 -15
  188. package/x/station/station.js +0 -35
  189. package/x/station/station.js.map +0 -1
  190. package/x/station/station.test.d.ts +0 -11
  191. package/x/station/station.test.js +0 -80
  192. package/x/station/station.test.js.map +0 -1
  193. package/x/station/switchboard.d.ts +0 -30
  194. package/x/station/switchboard.js +0 -90
  195. package/x/station/switchboard.js.map +0 -1
  196. package/x/station/testing/testing.d.ts +0 -58
  197. package/x/station/testing/testing.js +0 -39
  198. package/x/station/testing/testing.js.map +0 -1
  199. package/x/station/types.d.ts +0 -56
  200. package/x/station/types.js +0 -5
  201. package/x/station/types.js.map +0 -1
  202. package/x/station/utils/is-pressed.js.map +0 -1
  203. package/x/station/utils/modprefix.d.ts +0 -1
  204. package/x/station/utils/modprefix.js +0 -16
  205. package/x/station/utils/modprefix.js.map +0 -1
  206. package/x/station/utils/tmax.js +0 -6
  207. package/x/station/utils/tmax.js.map +0 -1
  208. package/x/station/utils/tmin.d.ts +0 -1
  209. package/x/station/utils/tmin.js +0 -6
  210. package/x/station/utils/tmin.js.map +0 -1
  211. /package/s/{station/utils → core/bindings/parts}/is-pressed.ts +0 -0
  212. /package/x/{station/utils → core/bindings/parts}/is-pressed.d.ts +0 -0
  213. /package/x/{station/utils → core/bindings/parts}/is-pressed.js +0 -0
@@ -0,0 +1,28 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Port } from "../port/port.js";
3
+ import { Controller } from "../controllers/controller.js";
4
+ import { HubFriendlyBindings } from "./types.js";
5
+ export declare class Hub<B extends HubFriendlyBindings> {
6
+ readonly ports: Port<B>[];
7
+ static readonly mode: "hub";
8
+ static readonly bindings: () => import("./types.js").HubBindings;
9
+ readonly controllers: SetG<Controller>;
10
+ constructor(ports: Port<B>[]);
11
+ [Symbol.iterator](): Generator<Port<B>, void, unknown>;
12
+ entries(): Generator<[number, Port<B>], void, unknown>;
13
+ /** poll all the ports, and actuate hub bindings for shimmying */
14
+ poll(now?: number): import("../index.js").Actions<B>[];
15
+ /** check if a port has a known switchboard controller assigned */
16
+ isPlugged(port: Port<B>): boolean;
17
+ portByIndex(index: number): Port<B>;
18
+ portByController(controller: Controller): Port<B> | undefined;
19
+ controllerByPort(port: Port<B>): Controller | undefined;
20
+ /** move a player's controller to the next or previous port */
21
+ shimmy(controller: Controller, indexDelta: 1 | -1): Port<B>;
22
+ /** plug a controller into a port */
23
+ plug: (controller: Controller, port?: Port<B>) => () => void;
24
+ /** unplug a controller */
25
+ unplug(controller: Controller): void;
26
+ /** returns an unplugged port (otherwise the last one) */
27
+ getLonelyPort(): Port<B>;
28
+ }
@@ -0,0 +1,91 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Scalar } from "@benev/math";
3
+ import { hubBindings } from "./bindings.js";
4
+ import { hubMode } from "./types.js";
5
+ export class Hub {
6
+ ports;
7
+ static mode = hubMode;
8
+ static bindings = hubBindings;
9
+ controllers = new SetG();
10
+ constructor(ports) {
11
+ this.ports = ports;
12
+ for (const port of ports) {
13
+ port.modes.add(Hub.mode);
14
+ }
15
+ }
16
+ *[Symbol.iterator]() {
17
+ yield* this.ports.values();
18
+ }
19
+ *entries() {
20
+ yield* this.ports.entries();
21
+ }
22
+ /** poll all the ports, and actuate hub bindings for shimmying */
23
+ poll(now = Date.now()) {
24
+ return this.ports.map(port => {
25
+ const actions = port.poll(now);
26
+ const fn = (delta) => {
27
+ const controller = this.controllerByPort(port);
28
+ if (controller)
29
+ this.shimmy(controller, delta);
30
+ };
31
+ if (actions[hubMode].shimmyNext.down)
32
+ fn(1);
33
+ if (actions[hubMode].shimmyPrevious.down)
34
+ fn(-1);
35
+ return actions;
36
+ });
37
+ }
38
+ /** check if a port has a known switchboard controller assigned */
39
+ isPlugged(port) {
40
+ return !!this.controllerByPort(port);
41
+ }
42
+ portByIndex(index) {
43
+ const port = this.ports.at(index);
44
+ if (!port)
45
+ throw new Error(`port ${index} not found`);
46
+ return port;
47
+ }
48
+ portByController(controller) {
49
+ for (const port of this.ports) {
50
+ if (port.controllers.has(controller))
51
+ return port;
52
+ }
53
+ }
54
+ controllerByPort(port) {
55
+ for (const controller of this.controllers) {
56
+ if (port.controllers.has(controller))
57
+ return controller;
58
+ }
59
+ }
60
+ /** move a player's controller to the next or previous port */
61
+ shimmy(controller, indexDelta) {
62
+ const oldIndex = this.ports.findIndex(port => port.controllers.has(controller));
63
+ const maxIndex = Math.max(0, this.ports.length - 1);
64
+ const newIndex = Scalar.clamp(oldIndex + indexDelta, 0, maxIndex);
65
+ const port = this.portByIndex(newIndex);
66
+ this.plug(controller, port);
67
+ return port;
68
+ }
69
+ /** plug a controller into a port */
70
+ plug = (controller, port = this.getLonelyPort()) => {
71
+ this.unplug(controller);
72
+ this.controllers.add(controller);
73
+ port.controllers.add(controller);
74
+ return () => this.unplug(controller);
75
+ };
76
+ /** unplug a controller */
77
+ unplug(controller) {
78
+ this.ports.forEach(port => port.controllers.delete(controller));
79
+ this.controllers.delete(controller);
80
+ }
81
+ /** returns an unplugged port (otherwise the last one) */
82
+ getLonelyPort() {
83
+ for (const port of this.ports) {
84
+ if (!this.controllerByPort(port))
85
+ return port;
86
+ }
87
+ const index = Math.max(0, this.ports.length - 1);
88
+ return this.portByIndex(index);
89
+ }
90
+ }
91
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../../s/core/hub/hub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AsBindings, Atom, Bindings } from "../bindings/types.js";
2
+ export declare const hubMode: "hub";
3
+ export type HubBindings = AsBindings<{
4
+ [hubMode]: {
5
+ shimmyNext: Atom;
6
+ shimmyPrevious: Atom;
7
+ };
8
+ }>;
9
+ export type HubFriendlyBindings = Bindings & HubBindings;
@@ -0,0 +1,2 @@
1
+ export const hubMode = "hub";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../s/core/hub/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,OAAO,GAAG,KAAc,CAAA"}
@@ -0,0 +1,15 @@
1
+ export * from "./bindings/action.js";
2
+ export * from "./bindings/types.js";
3
+ export * as controllers from "./controllers/standard/index.js";
4
+ export * from "./controllers/infra/group.js";
5
+ export * from "./controllers/infra/sampler.js";
6
+ export * from "./controllers/standard/index.js";
7
+ export * from "./controllers/controller.js";
8
+ export * from "./controllers/types.js";
9
+ export * from "./deck/parts/bindings-depot.js";
10
+ export * from "./deck/parts/local-storage-kv.js";
11
+ export * from "./deck/deck.js";
12
+ export * from "./hub/auto-gamepads.js";
13
+ export * from "./hub/bindings.js";
14
+ export * from "./hub/hub.js";
15
+ export * from "./port/port.js";
@@ -0,0 +1,16 @@
1
+ export * from "./bindings/action.js";
2
+ export * from "./bindings/types.js";
3
+ export * as controllers from "./controllers/standard/index.js";
4
+ export * from "./controllers/infra/group.js";
5
+ export * from "./controllers/infra/sampler.js";
6
+ export * from "./controllers/standard/index.js";
7
+ export * from "./controllers/controller.js";
8
+ export * from "./controllers/types.js";
9
+ export * from "./deck/parts/bindings-depot.js";
10
+ export * from "./deck/parts/local-storage-kv.js";
11
+ export * from "./deck/deck.js";
12
+ export * from "./hub/auto-gamepads.js";
13
+ export * from "./hub/bindings.js";
14
+ export * from "./hub/hub.js";
15
+ export * from "./port/port.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/core/index.ts"],"names":[],"mappings":"AACA,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AAEnC,OAAO,KAAK,WAAW,MAAM,iCAAiC,CAAA;AAC9D,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AAEtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAChD,cAAc,gBAAgB,CAAA;AAE9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Bindings } from "../bindings/types.js";
3
+ import { Controller } from "../controllers/controller.js";
4
+ export declare class Port<B extends Bindings> {
5
+ #private;
6
+ readonly modes: SetG<keyof B>;
7
+ readonly controllers: SetG<Controller>;
8
+ constructor(bindings: B);
9
+ get bindings(): B;
10
+ set bindings(b: B);
11
+ poll(now?: number): import("../bindings/types.js").Actions<B>;
12
+ }
@@ -0,0 +1,25 @@
1
+ import { SetG } from "@e280/stz";
2
+ import { Resolver } from "../bindings/resolver.js";
3
+ import { wipe_samples_map } from "./utils/wipe_samples_map.js";
4
+ import { aggregate_samples_into_map } from "./utils/aggregate_samples_into_map.js";
5
+ export class Port {
6
+ modes = new SetG();
7
+ controllers = new SetG();
8
+ #resolver;
9
+ #samples = new Map();
10
+ constructor(bindings) {
11
+ this.#resolver = new Resolver(bindings, this.modes);
12
+ }
13
+ get bindings() {
14
+ return this.#resolver.bindings;
15
+ }
16
+ set bindings(b) {
17
+ this.#resolver = new Resolver(b, this.modes);
18
+ }
19
+ poll(now = Date.now()) {
20
+ wipe_samples_map(this.#samples);
21
+ aggregate_samples_into_map(this.controllers, this.#samples);
22
+ return this.#resolver.poll(now, this.#samples);
23
+ }
24
+ }
25
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../s/core/port/port.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAE9B,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAA;AAGhD,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAC,0BAA0B,EAAC,MAAM,uCAAuC,CAAA;AAEhF,MAAM,OAAO,IAAI;IACP,KAAK,GAAG,IAAI,IAAI,EAAW,CAAA;IAC3B,WAAW,GAAG,IAAI,IAAI,EAAc,CAAA;IAC7C,SAAS,CAAa;IACtB,QAAQ,GAAc,IAAI,GAAG,EAAE,CAAA;IAE/B,YAAY,QAAW;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAA;IAC/B,CAAC;IAED,IAAI,QAAQ,CAAC,CAAI;QAChB,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QAC5B,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/B,0BAA0B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ import { SampleMap } from "../../controllers/types.js";
2
+ import { Controller } from "../../controllers/controller.js";
3
+ export declare function aggregate_samples_into_map(controllers: Set<Controller>, map: SampleMap): SampleMap;
@@ -0,0 +1,11 @@
1
+ export function aggregate_samples_into_map(controllers, map) {
2
+ for (const controller of controllers) {
3
+ for (const [code, value] of controller.takeSamples()) {
4
+ const previous = map.get(code) ?? 0;
5
+ if (value > previous)
6
+ map.set(code, value);
7
+ }
8
+ }
9
+ return map;
10
+ }
11
+ //# sourceMappingURL=aggregate_samples_into_map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate_samples_into_map.js","sourceRoot":"","sources":["../../../../s/core/port/utils/aggregate_samples_into_map.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,0BAA0B,CACxC,WAA4B,EAC5B,GAAc;IAGf,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,KAAK,GAAG,QAAQ;gBACnB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACtB,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { SampleMap } from "../../controllers/types.js";
2
+ export declare function wipe_samples_map(samples: SampleMap): void;
@@ -0,0 +1,5 @@
1
+ export function wipe_samples_map(samples) {
2
+ for (const code of samples.keys())
3
+ samples.set(code, 0);
4
+ }
5
+ //# sourceMappingURL=wipe_samples_map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wipe_samples_map.js","sourceRoot":"","sources":["../../../../s/core/port/utils/wipe_samples_map.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB,CAAC,OAAkB;IAClD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AACtB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Hub } from "../hub/hub.js";
2
+ import { Port } from "../port/port.js";
3
+ import { Controller } from "../controllers/controller.js";
4
+ import { SamplerController } from "../controllers/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: string;
12
+ shoot: string;
13
+ };
14
+ };
15
+ export declare function testConnect<C extends Controller>(switchboard: Hub<any>, controller: C): C;
16
+ export declare function testSetupAlpha(): {
17
+ controller: SamplerController;
18
+ port: Port<{
19
+ basic: {
20
+ jump: string;
21
+ shoot: string;
22
+ };
23
+ }>;
24
+ time: TestTime;
25
+ };
26
+ export declare function testSetupBravo(): {
27
+ hub: Hub<{
28
+ hub: {
29
+ shimmyNext: import("../bindings/types.js").Atom;
30
+ shimmyPrevious: import("../bindings/types.js").Atom;
31
+ };
32
+ basic: {
33
+ jump: string;
34
+ shoot: string;
35
+ };
36
+ }>;
37
+ time: TestTime;
38
+ };
@@ -0,0 +1,42 @@
1
+ import { Hub } from "../hub/hub.js";
2
+ import { Port } from "../port/port.js";
3
+ import { asBindings } from "../bindings/types.js";
4
+ import { SamplerController } from "../controllers/infra/sampler.js";
5
+ import { hubBindings } from "../hub/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: "Space",
16
+ shoot: "pointer.button.left",
17
+ },
18
+ });
19
+ }
20
+ export function testConnect(switchboard, controller) {
21
+ switchboard.plug(controller);
22
+ return controller;
23
+ }
24
+ export function testSetupAlpha() {
25
+ const time = new TestTime();
26
+ const controller = new SamplerController();
27
+ const port = new Port(testBindings());
28
+ port.modes.add("basic");
29
+ port.controllers.add(controller);
30
+ return { controller, port, time };
31
+ }
32
+ export function testSetupBravo() {
33
+ const time = new TestTime();
34
+ const port = () => {
35
+ const port = new Port({ ...testBindings(), ...hubBindings() });
36
+ port.modes.adds(Hub.mode, "basic");
37
+ return port;
38
+ };
39
+ const hub = new Hub([port(), port(), port(), port()]);
40
+ return { hub, time };
41
+ }
42
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../s/core/testing/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,eAAe,CAAA;AACjC,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAC,iBAAiB,EAAC,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,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,OAAO;YACb,KAAK,EAAE,qBAAqB;SAC5B;KACD,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAuB,WAAqB,EAAE,UAAa;IACrF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC5B,OAAO,UAAU,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC3B,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;IACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAChC,OAAO,EAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,GAAG,EAAE;QACjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAC,GAAG,YAAY,EAAE,EAAE,GAAG,WAAW,EAAE,EAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClC,OAAO,IAAI,CAAA;IACZ,CAAC,CAAA;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACrD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,CAAA;AACnB,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { $, view } from "@e280/sly";
2
2
  import { NubStick } from "../nubs/stick/view.js";
3
- import { StickDevice } from "../nubs/stick/device.js";
3
+ import { StickController } from "../core/controllers/standard/stick.js";
4
4
  $.register({
5
5
  TactDemo: view.component(use => {
6
- const stick = use.once(() => new StickDevice());
6
+ const stick = use.once(() => new StickController());
7
7
  return NubStick(stick);
8
8
  }),
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"main.bundle.js","sourceRoot":"","sources":["../../s/demo/main.bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAE,IAAI,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAA;AAEnD,CAAC,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,CAAA;QAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC,CAAC;CACF,CAAC,CAAA;AAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA"}
1
+ {"version":3,"file":"main.bundle.js","sourceRoot":"","sources":["../../s/demo/main.bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAE,IAAI,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,eAAe,EAAC,MAAM,uCAAuC,CAAA;AAErE,CAAC,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,CAAA;QACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC,CAAC;CACF,CAAC,CAAA;AAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA"}
@@ -101,7 +101,7 @@ function ne(r){return r.replace(/([a-zA-Z])(?=[A-Z])/g,"$1-").toLowerCase()}var
101
101
  >
102
102
  ${Ke.attr("part","graphic").props(t.vector.get(),s)}
103
103
  </div>
104
- `});function oe(r){return r>=0?[0,r]:[Math.abs(r),0]}var Mt=class{};var Ct=class extends Mt{on=Me();#t=new Map;setSample(t,e){return this.#t.set(t,e),this.on.pub(t,e),this}takeSamples(){let t=[...this.#t];return this.#t.clear(),t}};var Pt=class extends Ct{channel;vector=$(d.zero());dispose;constructor(t="stick"){super(),this.channel=t,this.dispose=this.vector.on(()=>{let{up:e,down:s,left:o,right:n}=this.breakdown();this.setSample(`${t}.up`,e),this.setSample(`${t}.down`,s),this.setSample(`${t}.left`,o),this.setSample(`${t}.right`,n)})}breakdown(){let{x:t,y:e}=this.vector.get(),[s,o]=oe(e),[n,i]=oe(t);return{up:o,down:s,left:n,right:i}}};q.register({TactDemo:_.component(r=>{let t=r.once(()=>new Pt);return tr(t)})});console.log("tact");
104
+ `});var Mt=class{};var Ct=class extends Mt{on=Me();#t=new Map;setSample(t,e){return this.#t.set(t,e),this.on.pub(t,e),this}takeSamples(){let t=[...this.#t];return this.#t.clear(),t}};function oe(r){return r>=0?[0,r]:[Math.abs(r),0]}var Pt=class extends Ct{channel;vector=$(d.zero());dispose;constructor(t="stick"){super(),this.channel=t,this.dispose=this.vector.on(()=>{let{up:e,down:s,left:o,right:n}=this.breakdown();this.setSample(`${t}.up`,e),this.setSample(`${t}.down`,s),this.setSample(`${t}.left`,o),this.setSample(`${t}.right`,n)})}breakdown(){let{x:t,y:e}=this.vector.get(),[s,o]=oe(e),[n,i]=oe(t);return{up:o,down:s,left:n,right:i}}};q.register({TactDemo:_.component(r=>{let t=r.once(()=>new Pt);return tr(t)})});console.log("tact");
105
105
  /*! Bundled license information:
106
106
 
107
107
  @lit/reactive-element/css-tag.js: