console.log("loading input system"); const inputStates = Object.freeze({ DEFAULT: 0, }); const inputSystem = (engine) => { engine("registerEvent", "moveDown"); engine("registerEvent", "moveUp"); engine("registerEvent", "moveLeft"); engine("registerEvent", "moveRight"); let state = inputStates.DEFAULT; let currentPresses = new Set(); const stateEvents = {}; stateEvents[inputStates.DEFAULT] = { ArrowDown: () => engine("queueEvent", "moveDown"), ArrowUp: () => engine("queueEvent", "moveUp"), ArrowLeft: () => engine("queueEvent", "moveLeft",), ArrowRight: () => engine("queueEvent", "moveRight") }; const process = () => { currentPresses.forEach(press => { // nop function for unmapped keypresses (stateEvents[state][press] || (() => null))(); }); }; document.addEventListener('keydown', (event) => { currentPresses.add(event.key); process(); }); document.addEventListener('keyup', (event) => { currentPresses.delete(event.key); process(); }); return (message, ...messageArgs) => { switch (message) { case "inputState": { return state; } case "setInputState": { let stateKey = messageArgs[0]; state = inputStates[stateKey]; break; } }; }; };