summaryrefslogtreecommitdiff
path: root/client/src/net/input.ts
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-06-16 20:38:55 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-06-16 20:38:55 -0400
commit44334fc3852eb832280a335f72e6416c93a9f19f (patch)
tree4a97b6064a97c4ad58c07d89050ad8a11e7a4f70 /client/src/net/input.ts
parentbetter map bg renderer (diff)
downloadtuxman-44334fc3852eb832280a335f72e6416c93a9f19f.tar.gz
tuxman-44334fc3852eb832280a335f72e6416c93a9f19f.tar.bz2
tuxman-44334fc3852eb832280a335f72e6416c93a9f19f.zip
ts
Diffstat (limited to '')
-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,
+ }
+ }
+}