@benev/tact 0.1.0-5 → 0.1.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/README.md CHANGED
@@ -1,16 +1,4 @@
1
1
 
2
- > [!CAUTION]
3
- > ### 🚨🚨 TACT IS UNDER DEVELOPMENT!! 🚨🚨
4
- > *everything is half-broken right now.. just gimmie a minute to finish coding this, will ya?*
5
-
6
- <br></br>
7
-
8
- ---
9
-
10
- ---
11
-
12
- <br></br>
13
-
14
2
  # 🎮 @benev/tact
15
3
  > *web game input library, from keypress to couch co-op*
16
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@benev/tact",
3
- "version": "0.1.0-5",
3
+ "version": "0.1.1",
4
4
  "description": "keybindings and gamepad support for web games",
5
5
  "license": "MIT",
6
6
  "author": "Chase Moskal <chasemoskal@gmail.com>",
@@ -29,21 +29,21 @@
29
29
  "count": "find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"
30
30
  },
31
31
  "peerDependencies": {
32
- "lit": "^3.3.1"
32
+ "lit": "^3.3.2"
33
33
  },
34
34
  "dependencies": {
35
- "@benev/math": "^0.2.0-4",
35
+ "@benev/math": "^0.2.0",
36
36
  "@e280/kv": "^0.1.0",
37
- "@e280/sly": "^0.2.0-24",
38
- "@e280/strata": "^0.2.0-14",
39
- "@e280/stz": "^0.2.7"
37
+ "@e280/sly": "^0.2.5",
38
+ "@e280/strata": "^0.2.8",
39
+ "@e280/stz": "^0.2.24"
40
40
  },
41
41
  "devDependencies": {
42
- "@e280/science": "^0.1.2",
43
- "@e280/scute": "^0.1.0",
42
+ "@e280/science": "^0.1.8",
43
+ "@e280/scute": "^0.1.5",
44
44
  "http-server": "^14.1.1",
45
45
  "npm-run-all": "^4.1.5",
46
- "typescript": "^5.9.2"
46
+ "typescript": "^5.9.3"
47
47
  },
48
48
  "repository": {
49
49
  "type": "git",
@@ -3,10 +3,10 @@ import {Code, CodeSettings, CodeState} from "../types.js"
3
3
 
4
4
  export const defaultHoldTime = 250
5
5
 
6
- export function defaultCodeState([,,settings]: Code): CodeState {
6
+ export function defaultCodeState([,,settings]: Code, now: number): CodeState {
7
7
  return {
8
8
  lastValue: 0,
9
- holdStart: 0,
9
+ holdStart: now,
10
10
  settings: defaultifyCodeSettings(settings),
11
11
  }
12
12
  }
@@ -54,11 +54,12 @@ export const lensAlgo = (
54
54
 
55
55
  const isFreshlyPressed = !isPressed(state.lastValue) && isPressed(value)
56
56
  const isFreshlyReleased = isPressed(state.lastValue) && !isPressed(value)
57
- const isHolding = (now - state.holdStart) >= holdTime
58
57
 
59
58
  if (isFreshlyPressed)
60
59
  state.holdStart = now
61
60
 
61
+ const isHolding = (now - state.holdStart) >= holdTime
62
+
62
63
  state.lastValue = value
63
64
 
64
65
  switch (settings.timing[0]) {
@@ -1,5 +1,5 @@
1
1
 
2
- import {MapG, pub, obMap} from "@e280/stz"
2
+ import {pub, obMap, GMap} from "@e280/stz"
3
3
  import {Action} from "./action.js"
4
4
  import {SampleMap} from "./sample-map.js"
5
5
  import {lensAlgo} from "./parts/lens-algo.js"
@@ -12,7 +12,7 @@ export class Resolver<B extends Bindings> {
12
12
  #modes = new Set<keyof B>()
13
13
  #sampleMap = new SampleMap()
14
14
  #now = 0
15
- #codeStates = new MapG<number, CodeState>()
15
+ #codeStates = new GMap<string, CodeState>()
16
16
  #update = pub()
17
17
 
18
18
  constructor(public bindings: B) {
@@ -20,7 +20,7 @@ export class Resolver<B extends Bindings> {
20
20
  const action = new Action()
21
21
  this.#update.subscribe(() => {
22
22
  action.value = this.#modes.has(mode)
23
- ? this.#resolveAtom()(atom)
23
+ ? this.#resolveAtom([])(atom, mode as string)
24
24
  : 0
25
25
  })
26
26
  return action
@@ -35,24 +35,31 @@ export class Resolver<B extends Bindings> {
35
35
  return this.actions
36
36
  }
37
37
 
38
- #resolveCode(count: number, code: string, settings?: Partial<CodeSettings>) {
38
+ #resolveCode(path: string[], code: string, settings?: Partial<CodeSettings>) {
39
39
  const state = this.#codeStates.guarantee(
40
- count,
41
- () => defaultCodeState(["code", code, settings]),
40
+ path.join("/"),
41
+ () => defaultCodeState(["code", code, settings], this.#now),
42
42
  )
43
43
  const value = this.#sampleMap.get(code) ?? 0
44
44
  return lensAlgo(this.#now, state, value)
45
45
  }
46
46
 
47
- #resolveAtom = (context: {count: number} = {count: 0}) => (atom: Atom): number => {
48
- const resolveAtom = this.#resolveAtom(context)
49
- if (typeof atom === "string") {
50
- return this.#resolveCode(context.count++, atom)
51
- }
47
+ #resolveAtom = (path: string[]) => (atom: Atom, zone: string | number): number => {
48
+ const nextPath = [
49
+ ...path,
50
+ String(zone),
51
+ typeof atom === "string" ? atom : atom[0],
52
+ ]
53
+
54
+ const resolveAtom = this.#resolveAtom(nextPath)
55
+
56
+ if (typeof atom === "string")
57
+ return this.#resolveCode(nextPath, atom)
58
+
52
59
  else switch (atom[0]) {
53
60
  case "code": {
54
61
  const [, code, settings] = atom
55
- return this.#resolveCode(context.count++, code, settings)
62
+ return this.#resolveCode(nextPath, code, settings)
56
63
  }
57
64
  case "and": {
58
65
  const [,...atoms] = atom
@@ -66,13 +73,13 @@ export class Resolver<B extends Bindings> {
66
73
  }
67
74
  case "not": {
68
75
  const [, subject] = atom
69
- const value = resolveAtom(subject)
76
+ const value = resolveAtom(subject, "subject")
70
77
  return (value > 0) ? 0 : 1
71
78
  }
72
79
  case "cond": {
73
80
  const [, subject, guard] = atom
74
- return (resolveAtom(guard) > 0)
75
- ? resolveAtom(subject)
81
+ return (resolveAtom(guard, "guard") > 0)
82
+ ? resolveAtom(subject, "subject")
76
83
  : 0
77
84
  }
78
85
  case "mods": {
@@ -85,9 +92,9 @@ export class Resolver<B extends Bindings> {
85
92
  maybe(modifiers.alt ?? false, "AltLeft", "AltRight"),
86
93
  maybe(modifiers.meta ?? false, "MetaLeft", "MetaRight"),
87
94
  maybe(modifiers.shift ?? false, "ShiftLeft", "ShiftRight"),
88
- ]])
95
+ ]], "guard")
89
96
  return (guard > 0)
90
- ? resolveAtom(subject)
97
+ ? resolveAtom(subject, "subject")
91
98
  : 0
92
99
  }
93
100
  }
@@ -6,16 +6,16 @@ import {testPlug, testSetupAlpha, testSetupBravo} from "./testing/testing.js"
6
6
 
7
7
  export default Science.suite({
8
8
  "sample to action value": test(async() => {
9
- const {time, device, resolve} = testSetupAlpha()
9
+ const {clock, device, resolve} = testSetupAlpha()
10
10
  {
11
- time.frame = 1
11
+ clock.frame = 1
12
12
  device.setSample("Space", 1)
13
13
  const actions = resolve()
14
14
  expect(actions.basic.jump.value).is(1)
15
15
  expect(actions.basic.shoot.value).is(0)
16
16
  }
17
17
  {
18
- time.frame = 2
18
+ clock.frame = 2
19
19
  device.setSample("Space", 2)
20
20
  device.setSample("pointer.button.left", 3)
21
21
  const actions = resolve()
@@ -24,75 +24,128 @@ export default Science.suite({
24
24
  }
25
25
  }),
26
26
 
27
+ "hold timing and behavior": test(async() => {
28
+ const {clock, device, resolve, actions} = testSetupAlpha()
29
+ const proceed = (options: {time: number, value: number}) => {
30
+ clock.time = options.time
31
+ device.setSample("KeyG", options.value)
32
+ resolve()
33
+ }
34
+
35
+ let count = 0
36
+ actions.basic.grenade.onDown(() => { count++ })
37
+ const getValue = () => actions.basic.grenade.value
38
+
39
+ // start doing nothing
40
+ proceed({time: 0, value: 0})
41
+ expect(getValue()).is(0)
42
+ expect(count).is(0)
43
+
44
+ // start holding
45
+ proceed({time: 10, value: 1})
46
+ expect(getValue()).is(0)
47
+ expect(count).is(0)
48
+
49
+ // keep holding
50
+ proceed({time: 20, value: 1})
51
+ expect(getValue()).is(0)
52
+ expect(count).is(0)
53
+
54
+ // held long enough to trigger down
55
+ proceed({time: 210, value: 1})
56
+ expect(getValue()).is(1)
57
+ expect(count).is(1)
58
+
59
+ // release, shouldn't trigger new down
60
+ proceed({time: 220, value: 0})
61
+ expect(getValue()).is(0)
62
+ expect(count).is(1)
63
+
64
+ // start holding again
65
+ proceed({time: 230, value: 1})
66
+ expect(getValue()).is(0)
67
+ expect(count).is(1)
68
+
69
+ // keep holding again
70
+ proceed({time: 330, value: 1})
71
+ expect(getValue()).is(0)
72
+ expect(count).is(1)
73
+
74
+ // held long enough again to trigger down
75
+ proceed({time: 430, value: 1})
76
+ expect(getValue()).is(1)
77
+ expect(count).is(2)
78
+ }),
79
+
27
80
  "hub": Science.suite({
28
81
  "device inputs work": test(async() => {
29
- const {hub, time} = testSetupBravo()
82
+ const {hub, clock} = testSetupBravo()
30
83
  const d1 = testPlug(hub, new SamplerDevice())
31
84
  d1.setSample("Space", 1)
32
- const [p1, p2] = hub.poll(time.now)
85
+ const [p1, p2] = hub.poll(clock.time)
33
86
  expect(p1.actions.basic.jump.value).is(1)
34
87
  expect(p2.actions.basic.jump.value).is(0)
35
88
  }),
36
89
 
37
90
  "reveal overlay works": test(async() => {
38
- const {hub, time} = testSetupBravo()
91
+ const {hub, clock} = testSetupBravo()
39
92
  const d1 = testPlug(hub, new SamplerDevice())
40
93
  d1.setSample("Backslash", 1)
41
- hub.poll(time.now)
94
+ hub.poll(clock.time)
42
95
  expect(hub.metaPort.actions[metaMode].revealOverlay.value)
43
96
  .is(1)
44
97
  }),
45
98
 
46
99
  "two devices playing on separate ports": test(async() => {
47
- const {hub, time} = testSetupBravo()
100
+ const {hub, clock} = testSetupBravo()
48
101
  const c1 = testPlug(hub, new SamplerDevice())
49
102
  const c2 = testPlug(hub, new SamplerDevice())
50
103
  c1.setSample("Space", 1)
51
104
  c2.setSample("Space", 2)
52
- const [p1, p2] = hub.poll(time.now)
105
+ const [p1, p2] = hub.poll(clock.time)
53
106
  expect(p1.actions.basic.jump.value).is(1)
54
107
  expect(p2.actions.basic.jump.value).is(2)
55
108
  }),
56
109
 
57
110
  "device can shimmy": test(async() => {
58
- const {hub, time} = testSetupBravo()
111
+ const {hub, clock} = testSetupBravo()
59
112
  const c1 = testPlug(hub, new SamplerDevice())
60
113
  hub.shimmy(c1, 1)
61
114
  c1.setSample("Space", 1)
62
- const [p1, p2] = hub.poll(time.now)
115
+ const [p1, p2] = hub.poll(clock.time)
63
116
  expect(p1.actions.basic.jump.value).is(0)
64
117
  expect(p2.actions.basic.jump.value).is(1)
65
118
  }),
66
119
 
67
120
  "two devices can share a port": test(async() => {
68
- const {hub, time} = testSetupBravo()
121
+ const {hub, clock} = testSetupBravo()
69
122
  const c1 = testPlug(hub, new SamplerDevice())
70
123
  const c2 = testPlug(hub, new SamplerDevice())
71
124
  hub.shimmy(c2, -1)
72
125
  expect(hub.portByDevice(c1)).is(hub.portByDevice(c2))
73
126
  {
74
127
  c1.setSample("Space", 1)
75
- const [p1, p2] = hub.poll(time.now)
128
+ const [p1, p2] = hub.poll(clock.time)
76
129
  expect(p1.actions.basic.jump.value).is(1)
77
130
  expect(p2.actions.basic.jump.value).is(0)
78
131
  }
79
132
  {
80
133
  c2.setSample("Space", 1)
81
- const [p1, p2] = hub.poll(time.now)
134
+ const [p1, p2] = hub.poll(clock.time)
82
135
  expect(p1.actions.basic.jump.value).is(1)
83
136
  expect(p2.actions.basic.jump.value).is(0)
84
137
  }
85
138
  {
86
139
  c1.setSample("Space", 1)
87
140
  c2.setSample("Space", 2)
88
- const [p1, p2] = hub.poll(time.now)
141
+ const [p1, p2] = hub.poll(clock.time)
89
142
  expect(p1.actions.basic.jump.value).is(2)
90
143
  expect(p2.actions.basic.jump.value).is(0)
91
144
  }
92
145
  {
93
146
  c1.setSample("Space", 2)
94
147
  c2.setSample("Space", 1)
95
- const [p1, p2] = hub.poll(time.now)
148
+ const [p1, p2] = hub.poll(clock.time)
96
149
  expect(p1.actions.basic.jump.value).is(2)
97
150
  expect(p2.actions.basic.jump.value).is(0)
98
151
  }
@@ -2,16 +2,16 @@
2
2
  import {Hub} from "../hub/hub.js"
3
3
  import {Port} from "../hub/port.js"
4
4
  import {Device} from "../devices/device.js"
5
- import {asBindings} from "../bindings/types.js"
6
5
  import {Resolver} from "../bindings/resolver.js"
7
6
  import {SampleMap} from "../bindings/sample-map.js"
7
+ import {asBindings, Code} from "../bindings/types.js"
8
8
  import {SamplerDevice} from "../devices/infra/sampler.js"
9
9
 
10
- export class TestTime {
11
- frame = 0
10
+ export class TestClock {
11
+ time = 0
12
12
 
13
- get now() {
14
- return (this.frame++) * (1000 / 60)
13
+ set frame(frame: number) {
14
+ this.time = frame * (1000 / 60)
15
15
  }
16
16
  }
17
17
 
@@ -20,6 +20,7 @@ export function testBindings() {
20
20
  basic: {
21
21
  jump: "Space",
22
22
  shoot: "pointer.button.left",
23
+ grenade: <Code>["code", "KeyG", {timing: ["hold", 200]}]
23
24
  },
24
25
  })
25
26
  }
@@ -30,26 +31,27 @@ export function testPlug<C extends Device>(hub: Hub<any>, device: C) {
30
31
  }
31
32
 
32
33
  export function testSetupAlpha() {
33
- const time = new TestTime()
34
+ const clock = new TestClock()
34
35
  const device = new SamplerDevice()
35
36
  const resolver = new Resolver(testBindings())
36
37
  const modes = new Set(Object.keys(resolver.bindings))
38
+ const actions = resolver.actions
37
39
  const resolve = () => resolver.resolve(
38
- time.now,
40
+ clock.time,
39
41
  modes as any,
40
42
  new SampleMap(device.samples())
41
43
  )
42
- return {device, resolver, resolve, time}
44
+ return {device, resolver, resolve, clock, actions}
43
45
  }
44
46
 
45
47
  export function testSetupBravo() {
46
- const time = new TestTime()
48
+ const clock = new TestClock()
47
49
  const port = () => {
48
50
  const port = new Port(testBindings())
49
51
  port.modes.adds("basic")
50
52
  return port
51
53
  }
52
54
  const hub = new Hub([port(), port(), port(), port()])
53
- return {hub, time}
55
+ return {hub, clock}
54
56
  }
55
57
 
@@ -1,3 +1,3 @@
1
1
  import { Code, CodeState } from "../types.js";
2
2
  export declare const defaultHoldTime = 250;
3
- export declare function defaultCodeState([, , settings]: Code): CodeState;
3
+ export declare function defaultCodeState([, , settings]: Code, now: number): CodeState;
@@ -1,8 +1,8 @@
1
1
  export const defaultHoldTime = 250;
2
- export function defaultCodeState([, , settings]) {
2
+ export function defaultCodeState([, , settings], now) {
3
3
  return {
4
4
  lastValue: 0,
5
- holdStart: 0,
5
+ holdStart: now,
6
6
  settings: defaultifyCodeSettings(settings),
7
7
  };
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../s/core/bindings/parts/defaults.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC,MAAM,UAAU,gBAAgB,CAAC,CAAC,EAAC,EAAC,QAAQ,CAAO;IAClD,OAAO;QACN,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,CAAC;KAC1C,CAAA;AACF,CAAC;AAED,SAAS,mBAAmB;IAC3B,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,CAAC,QAAQ,CAAC;KAClB,CAAA;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAiC,EAAE;IAClE,OAAO;QACN,GAAG,mBAAmB,EAAE;QACxB,GAAG,OAAO;KACV,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../s/core/bindings/parts/defaults.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC,MAAM,UAAU,gBAAgB,CAAC,CAAC,EAAC,EAAC,QAAQ,CAAO,EAAE,GAAW;IAC/D,OAAO;QACN,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,CAAC;KAC1C,CAAA;AACF,CAAC;AAED,SAAS,mBAAmB;IAC3B,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,CAAC,QAAQ,CAAC;KAClB,CAAA;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAiC,EAAE;IAClE,OAAO;QACN,GAAG,mBAAmB,EAAE;QACxB,GAAG,OAAO;KACV,CAAA;AACF,CAAC"}
@@ -32,9 +32,9 @@ export const lensAlgo = (now, state, v) => pipe(v).line(function clippings(value
32
32
  : settings.timing[1]) ?? defaultHoldTime;
33
33
  const isFreshlyPressed = !isPressed(state.lastValue) && isPressed(value);
34
34
  const isFreshlyReleased = isPressed(state.lastValue) && !isPressed(value);
35
- const isHolding = (now - state.holdStart) >= holdTime;
36
35
  if (isFreshlyPressed)
37
36
  state.holdStart = now;
37
+ const isHolding = (now - state.holdStart) >= holdTime;
38
38
  state.lastValue = value;
39
39
  switch (settings.timing[0]) {
40
40
  case "direct":
@@ -1 +1 @@
1
- {"version":3,"file":"lens-algo.js","sourceRoot":"","sources":["../../../../s/core/bindings/parts/lens-algo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lens-algo.js","sourceRoot":"","sources":["../../../../s/core/bindings/parts/lens-algo.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { MapG, pub, obMap } from "@e280/stz";
1
+ import { pub, obMap, GMap } from "@e280/stz";
2
2
  import { Action } from "./action.js";
3
3
  import { SampleMap } from "./sample-map.js";
4
4
  import { lensAlgo } from "./parts/lens-algo.js";
@@ -10,7 +10,7 @@ export class Resolver {
10
10
  #modes = new Set();
11
11
  #sampleMap = new SampleMap();
12
12
  #now = 0;
13
- #codeStates = new MapG();
13
+ #codeStates = new GMap();
14
14
  #update = pub();
15
15
  constructor(bindings) {
16
16
  this.bindings = bindings;
@@ -18,7 +18,7 @@ export class Resolver {
18
18
  const action = new Action();
19
19
  this.#update.subscribe(() => {
20
20
  action.value = this.#modes.has(mode)
21
- ? this.#resolveAtom()(atom)
21
+ ? this.#resolveAtom([])(atom, mode)
22
22
  : 0;
23
23
  });
24
24
  return action;
@@ -31,21 +31,25 @@ export class Resolver {
31
31
  this.#update();
32
32
  return this.actions;
33
33
  }
34
- #resolveCode(count, code, settings) {
35
- const state = this.#codeStates.guarantee(count, () => defaultCodeState(["code", code, settings]));
34
+ #resolveCode(path, code, settings) {
35
+ const state = this.#codeStates.guarantee(path.join("/"), () => defaultCodeState(["code", code, settings], this.#now));
36
36
  const value = this.#sampleMap.get(code) ?? 0;
37
37
  return lensAlgo(this.#now, state, value);
38
38
  }
39
- #resolveAtom = (context = { count: 0 }) => (atom) => {
40
- const resolveAtom = this.#resolveAtom(context);
41
- if (typeof atom === "string") {
42
- return this.#resolveCode(context.count++, atom);
43
- }
39
+ #resolveAtom = (path) => (atom, zone) => {
40
+ const nextPath = [
41
+ ...path,
42
+ String(zone),
43
+ typeof atom === "string" ? atom : atom[0],
44
+ ];
45
+ const resolveAtom = this.#resolveAtom(nextPath);
46
+ if (typeof atom === "string")
47
+ return this.#resolveCode(nextPath, atom);
44
48
  else
45
49
  switch (atom[0]) {
46
50
  case "code": {
47
51
  const [, code, settings] = atom;
48
- return this.#resolveCode(context.count++, code, settings);
52
+ return this.#resolveCode(nextPath, code, settings);
49
53
  }
50
54
  case "and": {
51
55
  const [, ...atoms] = atom;
@@ -59,13 +63,13 @@ export class Resolver {
59
63
  }
60
64
  case "not": {
61
65
  const [, subject] = atom;
62
- const value = resolveAtom(subject);
66
+ const value = resolveAtom(subject, "subject");
63
67
  return (value > 0) ? 0 : 1;
64
68
  }
65
69
  case "cond": {
66
70
  const [, subject, guard] = atom;
67
- return (resolveAtom(guard) > 0)
68
- ? resolveAtom(subject)
71
+ return (resolveAtom(guard, "guard") > 0)
72
+ ? resolveAtom(subject, "subject")
69
73
  : 0;
70
74
  }
71
75
  case "mods": {
@@ -78,9 +82,9 @@ export class Resolver {
78
82
  maybe(modifiers.alt ?? false, "AltLeft", "AltRight"),
79
83
  maybe(modifiers.meta ?? false, "MetaLeft", "MetaRight"),
80
84
  maybe(modifiers.shift ?? false, "ShiftLeft", "ShiftRight"),
81
- ]]);
85
+ ]], "guard");
82
86
  return (guard > 0)
83
- ? resolveAtom(subject)
87
+ ? resolveAtom(subject, "subject")
84
88
  : 0;
85
89
  }
86
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../s/core/bindings/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../s/core/bindings/resolver.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Science } from "@e280/science";
2
2
  declare const _default: {
3
3
  "sample to action value": Science.Test;
4
+ "hold timing and behavior": Science.Test;
4
5
  hub: {
5
6
  "device inputs work": Science.Test;
6
7
  "reveal overlay works": Science.Test;