summaryrefslogtreecommitdiff
path: root/client/src/net/input.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/net/input.ts')
-rw-r--r--client/src/net/input.ts70
1 files changed, 70 insertions, 0 deletions
diff --git a/client/src/net/input.ts b/client/src/net/input.ts
new file mode 100644
index 0000000..75be3e6
--- /dev/null
+++ b/client/src/net/input.ts
@@ -0,0 +1,70 @@
+import { Key, KeyMap, PlayerInput } from "../types.js"
+
+let pressed = {}
+
+const updateRecent = (keymap: KeyMap) => {
+ let max = -1
+ let key = undefined
+ for (let code in pressed) {
+ let weight = pressed[code]
+ if (weight < max) continue
+ max = weight
+ key = keymap[code]
+ }
+
+ return key
+}
+
+export const startInputListener = (keymap: KeyMap): () => PlayerInput => {
+ let key: Key = Key.NOTHING;
+ let start = false;
+
+ document.getElementById("start").onclick = function() {
+ start = true
+ }
+
+ window.addEventListener("keydown", ev => {
+ if(ev.repeat) {
+ return;
+ }
+ if(!(ev.code in keymap)) {
+ return;
+ }
+ pressed[ev.code] = Object.keys(pressed).length
+ key = updateRecent(keymap)
+ });
+
+ window.addEventListener("keyup", ev => {
+ if (ev.repeat) {
+ return;
+ }
+ if (!(ev.code in keymap)) {
+ return
+ }
+ delete pressed[ev.code]
+ key = updateRecent(keymap)
+ })
+
+ let last = {
+ key: Key.NOTHING,
+ }
+
+ return (): PlayerInput => {
+
+ if(key === last.key && !start) {
+ return;
+ }
+
+ last = {
+ key,
+ };
+
+ let s = start;
+ start = false;
+
+ return {
+ key,
+ start: s,
+ }
+ }
+}