summaryrefslogtreecommitdiff
path: root/client/src/akkamon/render/engine/RemotePlayerEngine.ts
blob: 037b26c4d144e7b16a63d983666a30eff394431c (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
95
96
97
98
99
import Phaser from 'phaser';

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

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

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

import {
    Queue,
    baseQueue,
    queueFromArray
} from '../../DataWrappers';


type RemoteMovementQueues = {
    [key: string]: {value: Direction[]}
}

export class RemotePlayerEngine extends AkkamonEngine {

    private scene: WorldScene;

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

    constructor(scene: WorldScene) {
        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: queueFromArray(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!");
            }
        });
    }

    getData() {
        return this.trainerIDToRemotePlayerSprite;
    }
}