@typeonce/ritmo-browser 0.9.0 → 0.11.0
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/CHANGELOG.md +285 -0
- package/README.md +6 -3
- package/dist/Controls.d.ts +495 -0
- package/dist/Controls.d.ts.map +1 -0
- package/dist/Controls.js +343 -0
- package/dist/Controls.js.map +1 -0
- package/dist/Gamepad.d.ts +375 -0
- package/dist/Gamepad.d.ts.map +1 -0
- package/dist/Gamepad.js +452 -0
- package/dist/Gamepad.js.map +1 -0
- package/dist/InputCapture.d.ts +47 -14
- package/dist/InputCapture.d.ts.map +1 -1
- package/dist/InputCapture.js +1 -1
- package/dist/InputCapture.js.map +1 -1
- package/dist/Keyboard.d.ts +184 -21
- package/dist/Keyboard.d.ts.map +1 -1
- package/dist/Keyboard.js +257 -91
- package/dist/Keyboard.js.map +1 -1
- package/dist/Pointer.d.ts +231 -62
- package/dist/Pointer.d.ts.map +1 -1
- package/dist/Pointer.js +205 -145
- package/dist/Pointer.js.map +1 -1
- package/dist/Touch.d.ts +73 -27
- package/dist/Touch.d.ts.map +1 -1
- package/dist/Touch.js +25 -30
- package/dist/Touch.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/buttons.d.ts +52 -0
- package/dist/internal/buttons.d.ts.map +1 -0
- package/dist/internal/buttons.js +211 -0
- package/dist/internal/buttons.js.map +1 -0
- package/dist/internal/introspect.d.ts +14 -0
- package/dist/internal/introspect.d.ts.map +1 -0
- package/dist/internal/introspect.js +19 -0
- package/dist/internal/introspect.js.map +1 -0
- package/dist/internal/used.d.ts +8 -0
- package/dist/internal/used.d.ts.map +1 -0
- package/dist/internal/used.js +14 -0
- package/dist/internal/used.js.map +1 -0
- package/dist/internal/vectors.d.ts +24 -0
- package/dist/internal/vectors.d.ts.map +1 -0
- package/dist/internal/vectors.js +22 -0
- package/dist/internal/vectors.js.map +1 -0
- package/package.json +5 -3
- package/src/Controls.ts +799 -0
- package/src/Gamepad.ts +747 -0
- package/src/InputCapture.ts +44 -22
- package/src/Keyboard.ts +395 -68
- package/src/Pointer.ts +392 -164
- package/src/Touch.ts +111 -54
- package/src/index.ts +10 -1
- package/src/internal/buttons.ts +222 -0
- package/src/internal/introspect.ts +23 -0
- package/src/internal/used.ts +14 -0
- package/src/internal/vectors.ts +36 -0
package/dist/Controls.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import * as Debug from "@typeonce/ritmo/Debug";
|
|
2
|
+
import { boundKeys, claim, ownersOf } from "./internal/introspect.js";
|
|
3
|
+
import { longer, zero } from "./internal/vectors.js";
|
|
4
|
+
const idleState = { held: false, pressed: false, released: false };
|
|
5
|
+
const isLacking = (entry) => entry._tag === "Lacking";
|
|
6
|
+
const isGroup = (unit) => unit._tag === "Group";
|
|
7
|
+
/** A merge entry's devices by name: a group's members, or the device under the entry's name. */
|
|
8
|
+
const membersOf = (name, unit) => isGroup(unit)
|
|
9
|
+
? Object.entries(unit.members).map(([member, device]) => ({ name: member, device }))
|
|
10
|
+
: [{ name, device: unit }];
|
|
11
|
+
/**
|
|
12
|
+
* Declares the game's actions: `buttons` (pressed and held: jump, pause)
|
|
13
|
+
* and `vectors` (a direction with length at most 1: move), each bound on
|
|
14
|
+
* every device. Build the merged source with the returned set's `merge`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const Actions = Controls.actions({ buttons: ["jump", "pause"], vectors: ["move"] })
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const actions = (names) => {
|
|
22
|
+
const list = [...new Set(names.buttons)];
|
|
23
|
+
const vectorList = [...new Set(names.vectors ?? [])];
|
|
24
|
+
const everyAvailable = () => Object.fromEntries([...list, ...vectorList].map((name) => [name, true]));
|
|
25
|
+
return {
|
|
26
|
+
buttons: list,
|
|
27
|
+
vectors: vectorList,
|
|
28
|
+
lacking: (device, lacking) => ({ _tag: "Lacking", device, lacking }),
|
|
29
|
+
group: (members) => ({ _tag: "Group", members }),
|
|
30
|
+
merge(devices) {
|
|
31
|
+
const entries = Object.entries(devices).map(([name, entry]) => {
|
|
32
|
+
const unit = isLacking(entry) ? entry.device : entry;
|
|
33
|
+
return { name, members: membersOf(name, unit), lacking: new Set(isLacking(entry) ? entry.lacking : []) };
|
|
34
|
+
});
|
|
35
|
+
const all = entries.flatMap((entry) => entry.members);
|
|
36
|
+
for (const { device } of all)
|
|
37
|
+
claim(device, "a Controls merge");
|
|
38
|
+
let lastUsed = null;
|
|
39
|
+
const rebind = {};
|
|
40
|
+
for (const { name, device } of all) {
|
|
41
|
+
const candidate = device.rebind;
|
|
42
|
+
if (typeof candidate === "function")
|
|
43
|
+
rebind[name] = (bindings) => candidate.call(device, bindings);
|
|
44
|
+
}
|
|
45
|
+
const controls = {
|
|
46
|
+
snapshot() {
|
|
47
|
+
const snapshots = {};
|
|
48
|
+
for (const { name, device } of all)
|
|
49
|
+
snapshots[name] = device.snapshot();
|
|
50
|
+
const used = entries.filter(({ members }) => members.some(({ name }) => snapshots[name].used));
|
|
51
|
+
if (used.length > 0 && !used.some(({ name }) => name === lastUsed))
|
|
52
|
+
lastUsed = used[0].name;
|
|
53
|
+
const current = entries.find(({ name }) => name === lastUsed);
|
|
54
|
+
const merged = {};
|
|
55
|
+
const available = {};
|
|
56
|
+
for (const action of list) {
|
|
57
|
+
let held = false;
|
|
58
|
+
let pressed = false;
|
|
59
|
+
let released = false;
|
|
60
|
+
for (const { name } of all) {
|
|
61
|
+
const state = snapshots[name].actions[action];
|
|
62
|
+
if (state === undefined)
|
|
63
|
+
continue;
|
|
64
|
+
held ||= state.held;
|
|
65
|
+
pressed ||= state.pressed;
|
|
66
|
+
released ||= state.released;
|
|
67
|
+
}
|
|
68
|
+
merged[action] = held || pressed || released ? { held, pressed, released: released && !held } : idleState;
|
|
69
|
+
available[action] = current === undefined || !current.lacking.has(action);
|
|
70
|
+
}
|
|
71
|
+
const vectors = {};
|
|
72
|
+
for (const action of vectorList) {
|
|
73
|
+
let longest = zero;
|
|
74
|
+
for (const { name } of all) {
|
|
75
|
+
const vector = snapshots[name].vectors[action];
|
|
76
|
+
if (vector !== undefined)
|
|
77
|
+
longest = longer(longest, vector);
|
|
78
|
+
}
|
|
79
|
+
vectors[action] = longest;
|
|
80
|
+
available[action] = current === undefined || !current.lacking.has(action);
|
|
81
|
+
}
|
|
82
|
+
return { actions: merged, vectors, available, devices: snapshots, lastUsed };
|
|
83
|
+
},
|
|
84
|
+
rebind,
|
|
85
|
+
dispose() {
|
|
86
|
+
for (const { device } of all)
|
|
87
|
+
device.dispose();
|
|
88
|
+
},
|
|
89
|
+
[Debug.serviceLints]: () => [
|
|
90
|
+
...entries.flatMap(({ name, lacking }) => [...lacking].map((action) => ({
|
|
91
|
+
severity: "info",
|
|
92
|
+
message: `${name} lacks ${action}, so while ${name} is the last used device the player cannot ${action}`,
|
|
93
|
+
fix: `fine if the game offers ${action} another way while ${name} is in use (read available.${action} from the input); otherwise bind ${action} on ${name}`
|
|
94
|
+
}))),
|
|
95
|
+
...all.flatMap(({ name, device }) => sharedLint(name, device))
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
// The checked signature carries the device types; the implementation is the same for every merge.
|
|
99
|
+
return controls;
|
|
100
|
+
},
|
|
101
|
+
idle: (devices) => ({
|
|
102
|
+
actions: Object.fromEntries(list.map((name) => [name, idleState])),
|
|
103
|
+
vectors: Object.fromEntries(vectorList.map((name) => [name, zero])),
|
|
104
|
+
available: everyAvailable(),
|
|
105
|
+
devices,
|
|
106
|
+
lastUsed: null
|
|
107
|
+
})
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/** A device handed to more than one source: each takes its snapshots, so each sees only some presses. */
|
|
111
|
+
const sharedLint = (name, device) => ownersOf(device).length > 1
|
|
112
|
+
? [{
|
|
113
|
+
severity: "warning",
|
|
114
|
+
message: `${name} is taken by ${ownersOf(device).join(" and ")}: each takes its snapshots, so a press reaches one of them`,
|
|
115
|
+
fix: `build ${name} once for each source (each Keyboard.actions(...) call is its own device), or merge it in one place`
|
|
116
|
+
}]
|
|
117
|
+
: [];
|
|
118
|
+
/**
|
|
119
|
+
* Declares the players of a local multiplayer game over `actions`: the
|
|
120
|
+
* `slots` (the most players at once, in join order), the button action
|
|
121
|
+
* that joins (`"any"` for any button action but `leave`, or any vector
|
|
122
|
+
* moved), and the optional one that leaves while joining is open. Build the
|
|
123
|
+
* input source with the returned set's `pool`. For one player on several
|
|
124
|
+
* devices, use the action set's `merge` instead.
|
|
125
|
+
*
|
|
126
|
+
* Pressing join on a device nobody holds gives it the first free slot; that
|
|
127
|
+
* snapshot reports `event: "joined"` with the player's input idle, so the
|
|
128
|
+
* press does nothing else. A slot keeps its name when another empties. A
|
|
129
|
+
* pad that disconnects keeps its slot (`connected: false`) and returns to
|
|
130
|
+
* it when it comes back (two pads of one model share an id, so they are
|
|
131
|
+
* told apart by their place in the pad list: each returns to the slot
|
|
132
|
+
* holding that place). Leaving by button works only while joining is
|
|
133
|
+
* open; otherwise `leave` is an ordinary action (a pause menu), and
|
|
134
|
+
* `pool.leave(slot)` frees the slot. `pool.seat(slot, device)` puts a
|
|
135
|
+
* player in without a press: one who is in from the start.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```ts
|
|
139
|
+
* const Players = Controls.players(Actions, { slots: ["p1", "p2"], join: "join", leave: "back" })
|
|
140
|
+
* const makePlayers = (devices: {
|
|
141
|
+
* readonly left: Keyboard.Actions<typeof leftKeys>
|
|
142
|
+
* readonly right: Keyboard.Actions<typeof rightKeys>
|
|
143
|
+
* readonly pads: Gamepad.Pads<typeof padBindings>
|
|
144
|
+
* }) => Players.pool(devices)
|
|
145
|
+
*
|
|
146
|
+
* // In a system:
|
|
147
|
+
* const input = resources.input.get()
|
|
148
|
+
* if (input.p2.event === "joined") spawnSecondPlayer()
|
|
149
|
+
* const move = input.p2.vectors.move
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export const players = (actions, options) => {
|
|
153
|
+
const slots = [...new Set(options.slots)];
|
|
154
|
+
const buttons = actions.buttons;
|
|
155
|
+
const vectors = actions.vectors;
|
|
156
|
+
const join = options.join;
|
|
157
|
+
const leaveAction = options.leave;
|
|
158
|
+
const idleInput = () => ({
|
|
159
|
+
actions: Object.fromEntries(buttons.map((name) => [name, idleState])),
|
|
160
|
+
vectors: Object.fromEntries(vectors.map((name) => [name, zero])),
|
|
161
|
+
available: Object.fromEntries([...buttons, ...vectors].map((name) => [name, true]))
|
|
162
|
+
});
|
|
163
|
+
const empty = (event) => ({ ...idleInput(), joined: false, device: null, connected: false, event, devices: {} });
|
|
164
|
+
return {
|
|
165
|
+
slots,
|
|
166
|
+
idle: () => ({ joining: false, ...Object.fromEntries(slots.map((slot) => [slot, empty(null)])) }),
|
|
167
|
+
pool(devices) {
|
|
168
|
+
const entries = Object.entries(devices).map(([name, entry]) => {
|
|
169
|
+
const unit = isLacking(entry) ? entry.device : entry;
|
|
170
|
+
claim(unit, "a player pool");
|
|
171
|
+
return { name, unit, lacking: new Set(isLacking(entry) ? entry.lacking : []) };
|
|
172
|
+
});
|
|
173
|
+
const isPads = (unit) => unit._tag === "Pads";
|
|
174
|
+
/** Who holds each slot: the pool entry, the pad's place in its list, and the pad's id to find it again. */
|
|
175
|
+
const held = new Map();
|
|
176
|
+
const events = new Map();
|
|
177
|
+
let joining = false;
|
|
178
|
+
let everOpened = false;
|
|
179
|
+
let everSeated = false;
|
|
180
|
+
const wantsJoin = (snapshot) => {
|
|
181
|
+
const pressed = (name) => snapshot.actions[name]?.pressed === true;
|
|
182
|
+
if (join !== "any")
|
|
183
|
+
return pressed(join);
|
|
184
|
+
return buttons.some((name) => name !== leaveAction && pressed(name)) ||
|
|
185
|
+
Object.values(snapshot.vectors).some((vector) => vector.x !== 0 || vector.y !== 0);
|
|
186
|
+
};
|
|
187
|
+
const rebind = {};
|
|
188
|
+
for (const { name, unit } of entries) {
|
|
189
|
+
const candidate = unit.rebind;
|
|
190
|
+
if (typeof candidate === "function")
|
|
191
|
+
rebind[name] = (bindings) => candidate.call(unit, bindings);
|
|
192
|
+
}
|
|
193
|
+
const pool = {
|
|
194
|
+
snapshot() {
|
|
195
|
+
const units = [];
|
|
196
|
+
for (const { name, unit } of entries) {
|
|
197
|
+
if (isPads(unit))
|
|
198
|
+
unit.snapshot().forEach((snapshot, index) => units.push({ key: `${name}#${index}`, device: name, id: snapshot.id, connected: snapshot.connected, snapshot }));
|
|
199
|
+
else
|
|
200
|
+
units.push({ key: name, device: name, id: null, connected: true, snapshot: unit.snapshot() });
|
|
201
|
+
}
|
|
202
|
+
const byKey = new Map(units.map((unit) => [unit.key, unit]));
|
|
203
|
+
// A pad seated before it was plugged in is known by its id from the first snapshot it shows up in.
|
|
204
|
+
for (const holder of held.values()) {
|
|
205
|
+
const unit = byKey.get(holder.key);
|
|
206
|
+
if (holder.id === null && unit?.connected === true)
|
|
207
|
+
holder.id = unit.id;
|
|
208
|
+
}
|
|
209
|
+
const taken = new Set([...held.values()].map((holder) => holder.key));
|
|
210
|
+
// A pad that comes back (here or at another index) returns to the slot it holds.
|
|
211
|
+
for (const holder of held.values()) {
|
|
212
|
+
if (holder.id === null || byKey.get(holder.key)?.connected === true)
|
|
213
|
+
continue;
|
|
214
|
+
const back = units.find((unit) => unit.device === holder.device && unit.id === holder.id && unit.connected && !taken.has(unit.key));
|
|
215
|
+
if (back === undefined)
|
|
216
|
+
continue;
|
|
217
|
+
taken.delete(holder.key);
|
|
218
|
+
holder.key = back.key;
|
|
219
|
+
taken.add(back.key);
|
|
220
|
+
}
|
|
221
|
+
if (joining && leaveAction !== undefined) {
|
|
222
|
+
for (const [slot, holder] of held) {
|
|
223
|
+
// A slot seated since the last snapshot reports its join first; its input is idle there.
|
|
224
|
+
if (events.get(slot) === "joined")
|
|
225
|
+
continue;
|
|
226
|
+
const unit = byKey.get(holder.key);
|
|
227
|
+
const pressed = unit?.snapshot.actions?.[leaveAction]?.pressed;
|
|
228
|
+
if (unit?.connected === true && pressed === true) {
|
|
229
|
+
held.delete(slot);
|
|
230
|
+
taken.delete(holder.key);
|
|
231
|
+
events.set(slot, "left");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (joining) {
|
|
236
|
+
for (const unit of units) {
|
|
237
|
+
if (taken.has(unit.key) || !unit.connected || !wantsJoin(unit.snapshot))
|
|
238
|
+
continue;
|
|
239
|
+
const free = slots.find((slot) => !held.has(slot));
|
|
240
|
+
if (free === undefined)
|
|
241
|
+
break;
|
|
242
|
+
held.set(free, { device: unit.device, key: unit.key, id: unit.id });
|
|
243
|
+
taken.add(unit.key);
|
|
244
|
+
events.set(free, "joined");
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const result = { joining };
|
|
248
|
+
for (const slot of slots) {
|
|
249
|
+
const holder = held.get(slot);
|
|
250
|
+
const event = events.get(slot) ?? null;
|
|
251
|
+
if (holder === undefined) {
|
|
252
|
+
result[slot] = empty(event === "left" ? "left" : null);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const unit = byKey.get(holder.key);
|
|
256
|
+
const lacking = entries.find(({ name }) => name === holder.device)?.lacking ?? new Set();
|
|
257
|
+
const input = idleInput();
|
|
258
|
+
// The snapshot that joins is idle, so the join press does nothing else.
|
|
259
|
+
if (unit !== undefined && event !== "joined") {
|
|
260
|
+
const actionsNow = unit.snapshot.actions;
|
|
261
|
+
const vectorsNow = unit.snapshot.vectors;
|
|
262
|
+
for (const name of buttons)
|
|
263
|
+
input.actions[name] = actionsNow[name] ?? idleState;
|
|
264
|
+
for (const name of vectors)
|
|
265
|
+
input.vectors[name] = vectorsNow[name] ?? zero;
|
|
266
|
+
}
|
|
267
|
+
for (const name of [...buttons, ...vectors])
|
|
268
|
+
input.available[name] = !lacking.has(name);
|
|
269
|
+
result[slot] = {
|
|
270
|
+
...input,
|
|
271
|
+
joined: true,
|
|
272
|
+
device: holder.device,
|
|
273
|
+
connected: unit?.connected ?? false,
|
|
274
|
+
event: event === "joined" ? "joined" : null,
|
|
275
|
+
devices: unit === undefined ? {} : { [holder.device]: unit.snapshot }
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
events.clear();
|
|
279
|
+
return result;
|
|
280
|
+
},
|
|
281
|
+
setJoining(open) {
|
|
282
|
+
joining = open;
|
|
283
|
+
if (open)
|
|
284
|
+
everOpened = true;
|
|
285
|
+
},
|
|
286
|
+
seat(slot, device) {
|
|
287
|
+
const [name, index] = typeof device === "string" ? [device, null] : Object.entries(device)[0] ?? ["", 0];
|
|
288
|
+
const unit = entries.find((entry) => entry.name === name)?.unit;
|
|
289
|
+
if (unit === undefined || (index !== null && !(isPads(unit) && Number.isInteger(index) && index >= 0 && index < unit.max))) {
|
|
290
|
+
return { ok: false, reason: "no-such-pad" };
|
|
291
|
+
}
|
|
292
|
+
const key = index === null ? name : `${name}#${index}`;
|
|
293
|
+
if (held.has(slot))
|
|
294
|
+
return { ok: false, reason: "slot-taken" };
|
|
295
|
+
if ([...held.values()].some((holder) => holder.key === key))
|
|
296
|
+
return { ok: false, reason: "device-taken" };
|
|
297
|
+
held.set(slot, { device: name, key, id: null });
|
|
298
|
+
events.set(slot, "joined");
|
|
299
|
+
everSeated = true;
|
|
300
|
+
return { ok: true };
|
|
301
|
+
},
|
|
302
|
+
leave(slot) {
|
|
303
|
+
if (!held.delete(slot))
|
|
304
|
+
return;
|
|
305
|
+
events.set(slot, "left");
|
|
306
|
+
},
|
|
307
|
+
rebind,
|
|
308
|
+
dispose() {
|
|
309
|
+
for (const { unit } of entries)
|
|
310
|
+
unit.dispose();
|
|
311
|
+
},
|
|
312
|
+
[Debug.serviceLints]: () => {
|
|
313
|
+
const keyed = entries.flatMap(({ name, unit }) => {
|
|
314
|
+
const keys = unit[boundKeys]?.();
|
|
315
|
+
return keys === undefined ? [] : [{ name, keys: new Set(keys) }];
|
|
316
|
+
});
|
|
317
|
+
const shared = keyed.flatMap((first, index) => keyed.slice(index + 1).flatMap((second) => [...first.keys].filter((key) => second.keys.has(key)).map((key) => ({
|
|
318
|
+
severity: "warning",
|
|
319
|
+
message: `${first.name} and ${second.name} both bind ${key}: one key press reaches two players`,
|
|
320
|
+
fix: `bind ${key} on one of them only, so each player has their own keys`
|
|
321
|
+
}))));
|
|
322
|
+
return [
|
|
323
|
+
...shared,
|
|
324
|
+
...entries.flatMap(({ name, unit }) => sharedLint(name, unit)),
|
|
325
|
+
...entries.flatMap(({ name, lacking }) => [...lacking].map((action) => ({
|
|
326
|
+
severity: "info",
|
|
327
|
+
message: `${name} lacks ${action}, so a player on ${name} cannot ${action}`,
|
|
328
|
+
fix: `fine if the game offers ${action} another way (read available.${action} from the player's input); otherwise bind ${action} on ${name}`
|
|
329
|
+
}))),
|
|
330
|
+
...(everOpened || everSeated ? [] : [{
|
|
331
|
+
severity: "info",
|
|
332
|
+
message: "joining was never opened in this session, so nobody could join",
|
|
333
|
+
fix: "call setJoining(true) from a system (on the join screen, or once at setup for drop-in play)"
|
|
334
|
+
}])
|
|
335
|
+
];
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
// The checked signature carries the device types; the implementation is the same for every pool.
|
|
339
|
+
return pool;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
};
|
|
343
|
+
//# sourceMappingURL=Controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Controls.js","sourceRoot":"","sources":["../src/Controls.ts"],"names":[],"mappings":"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"}
|