summaryrefslogtreecommitdiff
path: root/client/src/net/input.ts
blob: 75be3e607d677bcd4dd586498437c536e43ee004 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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,
		}
	}
}