summaryrefslogtreecommitdiff
path: root/src/systems/keyboardInput.js
blob: 1b399ca68b8138dff7287311c26db19edd8a3333 (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
game.system.KeyboardInput = () => {
  "use strict";
  const keys = {};
  const keyPress = (event) => {
    if (!event.repeat) {
      keys[event.key] = true;
    }
  };
  const removeKey = (event) => {
    delete keys[event.key];
  };
  const update = (elapsedTime, entities, changedIds) => {
    for (let id in entities) {
      const entity = entities[id];
      if (entity.hasComponent('controllable') && entity.hasComponent('alive')) {
        const controls = entity.components.controllable.controls;
        if (!changedIds.has(entity.id)) {
          if (controls.includes('left') && keys[game.controls.left]) {
            entity.addComponent(game.components.Momentum({ dx: -1, dy: 0 }));
          } else if (controls.includes('right') && keys[game.controls.right]) {
            entity.addComponent(game.components.Momentum({ dx: 1, dy: 0 }));
          } else if (controls.includes('up') && keys[game.controls.up]) {
            entity.addComponent(game.components.Momentum({ dx: 0, dy: -1 }));
          } else if (controls.includes('down') && keys[game.controls.down]) {
            entity.addComponent(game.components.Momentum({ dx: 0, dy: 1 }));
          }
        }
      }
    }
    if (keys[game.controls.undo]) {
      game.systems.undo.undo(entities);
    }
    if (keys[game.controls.reset]) {
      game.loadLevelIndex(game.level);
    }
    if (keys["Escape"]) {
      game.systems.menu.bringUpMenu();
    }
    Object.keys(keys).map((key) => delete keys[key]);

    return new Set();
  };
  window.addEventListener("keydown", keyPress);
  window.addEventListener("keyup", removeKey);
  return { keys, update };
}