summaryrefslogtreecommitdiff
path: root/client/src/akkamon/render/BattleEngine.ts
blob: f7750464826616618eb12ab880ba907ce8074691 (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
import type { BattleEvent, BattleInitEvent, BattleMessage, BattleState } from '../client/IncomingEvents';
import { baseQueue, queueFromArray } from '../DataWrappers';
import type BattleScene from '../scenes/BattleScene';
import type { WorldScene } from '../scenes/WorldScene';
import { BattleDialogue, BattleOptions } from './battleUI';
import {
    AkkamonEngine
} from './engine/AkkamonEngine';

import { client } from '../../app';

export enum BattleEventType {
    INTRODUCTION = "INTRODUCTION"
}

export interface BattleUIEvent {
}

export class InstantUIEvent implements BattleUIEvent {
    constructor(
        public callback: () => void
    ) { }
}

export class DialogueUIEvent implements BattleUIEvent {
    constructor(
        public dialogue: string,
        public callback: () => void
    ) { }
}

export class BattleEngine extends AkkamonEngine {

    public scene?: BattleScene

    private eventsToPlay = baseQueue<BattleEvent>();
    private state: BattleState

    private uiEventTriggers = baseQueue<() => void>();

    constructor(
        message: BattleMessage,
    ) {
        super();
        this.state = message.state;
        this.eventsToPlay.pushArray(message.eventsToPlay);
    }

    getOpponentName(): string {
        console.log(this.state.teams);
        for (let key in this.state.teams) {
            if (key !== client.getTrainerID()!.id) {
                return key;
            }
        }
        return '';
    }

    update() {
        if (this.scene && !this.eventsToPlay.isEmpty()) {
            console.log(this.eventsToPlay.peek()!);
            console.log(BattleEventType.INTRODUCTION);
            let eventToPlay = this.eventsToPlay.pop()!;
            this[eventToPlay.id](eventToPlay)
        }

        if (!this.scene!.isBusy() && !this.uiEventTriggers.isEmpty()) {
            console.log("Scene is no longer busy! Triggering:");
            console.log(this.uiEventTriggers.peek());
            this.uiEventTriggers.pop()!();
        }
    }

    pushUIEvent(event: () => void) {
        this.uiEventTriggers.push(event);
    }

    [BattleEventType.INTRODUCTION](eventToPlay: BattleEvent) {
        let scene = this.scene!;

        let opponentName = this.getOpponentName();

        // scene.showPlayerSprites();

        scene.pushEvents(
            [
            new DialogueUIEvent(opponentName + " wants to fight!", () => {scene.busy = false;}),
            new DialogueUIEvent(opponentName + " sent out " + this.state.teams[opponentName].activeMon.name + "!", () => {scene.busy = false;})
            ],
        () => {
            scene.pushMenu(new BattleOptions(
                scene
            ));
        });


    }
}