78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
import { CreepType, MissionRoundDefinition, PathDefinition } from '../Definitions';
|
|
import Creep from './Creep';
|
|
import { Engine } from '../Bastion';
|
|
import { WaveManagerEvents } from '../Events';
|
|
import GameObject from '../GameObject';
|
|
|
|
type CreepInstance = {
|
|
creep: Creep;
|
|
tickToSpawnAt: number;
|
|
spawned: boolean;
|
|
};
|
|
|
|
export default class WaveManager extends GameObject {
|
|
// Doesn't need to extend GameObject since it does not render
|
|
private creeps: CreepInstance[] = [];
|
|
private rounds: MissionRoundDefinition[];
|
|
private paths: PathDefinition[];
|
|
private ticks: number = 0;
|
|
private started: boolean = false;
|
|
private internalCreepId: number = 0;
|
|
private pathsIndex: number;
|
|
public finished: boolean = false;
|
|
|
|
constructor(rounds: MissionRoundDefinition[], paths: PathDefinition[]) {
|
|
super();
|
|
Engine.WaveManager = this;
|
|
this.rounds = rounds;
|
|
this.paths = paths;
|
|
this.pathsIndex = 0;
|
|
}
|
|
public start(roundIndex) {
|
|
this.started = true;
|
|
this.ticks = 0;
|
|
this.creeps = [];
|
|
this.finished = false;
|
|
if (this.pathsIndex + 1 == this.paths.length) {
|
|
this.pathsIndex = 0;
|
|
} else {
|
|
this.pathsIndex++;
|
|
}
|
|
let tickToSpawnAt = 0;
|
|
this.rounds[roundIndex].waves.forEach((wave) => {
|
|
tickToSpawnAt += wave.firstCreepSpawnTick;
|
|
wave.creeps.forEach((creep) => {
|
|
const creepObj = new Creep(creep, this.paths[this.pathsIndex], this.internalCreepId);
|
|
this.internalCreepId++;
|
|
const creepInstance = {
|
|
creep: creepObj,
|
|
tickToSpawnAt,
|
|
spawned: false,
|
|
};
|
|
tickToSpawnAt += wave.spawnIntervalTicks;
|
|
this.creeps.push(creepInstance);
|
|
});
|
|
});
|
|
console.log(this.creeps);
|
|
}
|
|
public end() {
|
|
this.started = false;
|
|
}
|
|
public update(elapsedMS: number): void {
|
|
if (this.started == false) return;
|
|
this.ticks += elapsedMS * Engine.GameScene.gameSpeedMultiplier;
|
|
this.creeps.forEach((creep) => {
|
|
if (!creep.spawned && creep.tickToSpawnAt <= this.ticks) {
|
|
creep.spawned = true;
|
|
this.events.emit(WaveManagerEvents.CreepSpawned, creep.creep);
|
|
if (!this.finished && this.creeps.every((creep) => creep.spawned)) {
|
|
this.finished = true;
|
|
this.events.emit(WaveManagerEvents.Finished);
|
|
}
|
|
} else if (creep.spawned) {
|
|
creep.creep.update(elapsedMS);
|
|
}
|
|
});
|
|
}
|
|
}
|