summaryrefslogtreecommitdiff
path: root/engine/systems/Input.ts
blob: 8a68905a61db773cde5f502791e53ab5de154b29 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {
  Jump,
  Forces,
  ComponentNames,
  Velocity,
  Mass,
  Control
} from '../components';
import { Game } from '../Game';
import { KeyConstants, PhysicsConstants } from '../config';
import { Action } from '../interfaces';
import { System, SystemNames } from '.';

export class Input extends System {
  public clientId: string;
  private keys: Set<string>;
  private actionTimeStamps: Map<Action, number>;

  constructor(clientId: string) {
    super(SystemNames.Input);

    this.clientId = clientId;
    this.keys = new Set<string>();
    this.actionTimeStamps = new Map<Action, number>();
  }

  public keyPressed(key: string) {
    this.keys.add(key);
  }

  public keyReleased(key: string) {
    this.keys.delete(key);
  }

  private hasSomeKey(keys?: string[]): boolean {
    if (keys) {
      return keys.some((key) => this.keys.has(key));
    }
    return false;
  }

  public update(_dt: number, game: Game) {
    game.forEachEntityWithComponent(ComponentNames.Control, (entity) => {
      const controlComponent = entity.getComponent<Control>(
        ComponentNames.Control
      );
      if (controlComponent.controllableBy != this.clientId) return;

      if (this.hasSomeKey(KeyConstants.ActionKeys.get(Action.MOVE_RIGHT))) {
        controlComponent.controlVelocityComponent.velocity.dCartesian.dx +=
          PhysicsConstants.PLAYER_MOVE_VEL;
      }

      if (this.hasSomeKey(KeyConstants.ActionKeys.get(Action.MOVE_LEFT))) {
        controlComponent.controlVelocityComponent.velocity.dCartesian.dx +=
          -PhysicsConstants.PLAYER_MOVE_VEL;
      }

      if (entity.hasComponent(ComponentNames.Jump)) {
        const velocity = entity.getComponent<Velocity>(
          ComponentNames.Velocity
        ).velocity;
        const jump = entity.getComponent<Jump>(ComponentNames.Jump);

        if (this.hasSomeKey(KeyConstants.ActionKeys.get(Action.JUMP))) {
          if (jump.canJump) {
            this.actionTimeStamps.set(Action.JUMP, performance.now());

            velocity.dCartesian.dy += PhysicsConstants.PLAYER_JUMP_INITIAL_VEL;
            jump.canJump = false;
          }

          if (
            performance.now() - (this.actionTimeStamps.get(Action.JUMP) || 0) <
            PhysicsConstants.MAX_JUMP_TIME_MS
          ) {
            const mass = entity.getComponent<Mass>(ComponentNames.Mass).mass;

            const jumpForce = {
              fCartesian: {
                fy: mass * PhysicsConstants.PLAYER_JUMP_ACC,
                fx: 0
              },
              torque: 0
            };
            entity
              .getComponent<Forces>(ComponentNames.Forces)
              ?.forces.push(jumpForce);
          }
        }
      }
    });
  }
}