summaryrefslogtreecommitdiff
path: root/client/src/akkamon/render/engine/RemotePlayerEngine.ts
blob: 917453b66a5cd38ed2561339ce407e34c2a8814b (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
import Phaser from 'phaser';

import type { AkkamonWorldScene } from '../../scenes/AkkamonWorldScene';
import { AkkamonEngine } from '../engine/AkkamonEngine';

import type { Direction } from '../Direction';

import {
    Queue,
    RemotePlayerSprite
} from '../model/RemotePlayerSprite';

import type {
    RemoteMovementQueues
} from '../../client/Events';

export class RemotePlayerEngine extends AkkamonEngine {

    private scene: AkkamonWorldScene;

    private trainerIdToRemotePlayerSprite: Map<string, RemotePlayerSprite> = new Map();

    constructor(scene: AkkamonWorldScene) {
        super();
        this.scene = scene;
    }

    push(remoteMovementQueues: RemoteMovementQueues) {
        this.updateMembers(remoteMovementQueues);
        this.pushMovesToSprites(remoteMovementQueues);
    }

    pushMovesToSprites(remoteMovementQueues: RemoteMovementQueues) {
        this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => {
            remoteSprite.push(remoteMovementQueues[key].value);
        });
    }

    update(delta: number): void {
        this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => {
            if (remoteSprite.isMoving()) {
                console.log("remote player currently walking");
                remoteSprite.updatePixelPosition(delta);
            } else if (remoteSprite.hasMovesLeft()) {
                console.log("remote player starts moving");
                remoteSprite.startMoving();
            }
        });
    }

    updateMembers(newRemoteMovementQueues: RemoteMovementQueues) {
        const traineridToQueueValue = newRemoteMovementQueues;

        Object.keys(newRemoteMovementQueues).forEach((key: string) => {

            var moveQueue = traineridToQueueValue[key].value;
            if (moveQueue !== undefined) {

                // console.log("-> key: " + key + " has position " + newTilePos.x + ", " + newTilePos.y);

                if (!this.trainerIdToRemotePlayerSprite.has(key)) {
                    // console.log("adding remote player sprite for " + key);
                    this.trainerIdToRemotePlayerSprite.set(key,
                                                          new RemotePlayerSprite({
                                                              scene: this.scene,
                                                              tilePos: new Phaser.Math.Vector2(this.scene.spawnPointTilePos!),
                                                              texture: this.scene.textures.get("atlas"),
                                                              frame: "misa-front",
                                                              moveQueue: new Queue(moveQueue)
                                                              }
                                                          ));
                } else {
                    // console.log("key: " + key + " already had a sprite!");
                }
            }

        });

        this.trainerIdToRemotePlayerSprite.forEach((value: RemotePlayerSprite, key: string) => {
            if (!(key in newRemoteMovementQueues)) {
                // console.log("removing remote player sprite for " + key);
                this.trainerIdToRemotePlayerSprite.get(key)!.destroy();
                this.trainerIdToRemotePlayerSprite.delete(key);
            } else {
                // console.log("Player " + key + " was not removed!");
            }
        });
    }
}