100 lines
3.5 KiB
JavaScript
100 lines
3.5 KiB
JavaScript
import { Hex } from "../../Util/index.js";
|
|
import { SimProjectile } from "../index.js";
|
|
export class SimTower {
|
|
_lastProjectileStep = -1;
|
|
_lastAoeStep = -1;
|
|
_gdProjectileEffect;
|
|
_projectileRange = -1;
|
|
_projectileRate = -1;
|
|
_projectileSize = -1;
|
|
_gdAoeEffect;
|
|
_aoeRange = -1;
|
|
_aoeRate = -1;
|
|
_gdTower;
|
|
_position;
|
|
_currentProjectileTarget = -1;
|
|
_simLevel;
|
|
_index;
|
|
_gdRoot;
|
|
constructor(gdRoot, level, index, hex) {
|
|
this._gdRoot = gdRoot;
|
|
this._simLevel = level;
|
|
this._position = Hex.toWorld(hex);
|
|
this._index = index;
|
|
const data = this._gdRoot.towers[index];
|
|
this._gdProjectileEffect = data.projectileEffect;
|
|
this._projectileRange = data.projectileRange;
|
|
this._projectileRate = data.projectileRate;
|
|
this._projectileSize = data.projectileSize;
|
|
this._gdAoeEffect = data.aoeEffect;
|
|
this._aoeRange = data.aoeRange;
|
|
this._aoeRate = data.aoeRate;
|
|
this._gdTower = data;
|
|
}
|
|
get index() {
|
|
return this._index;
|
|
}
|
|
fireIfAble() {
|
|
const level = this._simLevel;
|
|
const currentStep = this._simLevel.currentStep;
|
|
if (this.canFireProjectile() && this._gdProjectileEffect != null) {
|
|
level.simProjectiles.push(new SimProjectile(level, this._gdProjectileEffect, this._position, this.pickProjectileTarget(), this._projectileSize));
|
|
this._lastProjectileStep = currentStep;
|
|
}
|
|
if (this.canFireAoe()) {
|
|
// TODO
|
|
}
|
|
}
|
|
canFireProjectile() {
|
|
if (this._gdProjectileEffect == null)
|
|
return false;
|
|
const currentStep = this._simLevel.currentStep;
|
|
if (this._lastProjectileStep == -1 || this._lastProjectileStep + this._projectileRate < currentStep) {
|
|
return this.isEnemyInRange(this._projectileRange);
|
|
}
|
|
return false;
|
|
}
|
|
canFireAoe() {
|
|
const level = this._simLevel;
|
|
const currentStep = level.currentStep;
|
|
if (this._gdAoeEffect != null) {
|
|
if (this._lastAoeStep == -1 || this._lastAoeStep + this._aoeRate < currentStep) {
|
|
return this.isEnemyInRange(this._aoeRange);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
pickProjectileTarget() {
|
|
if (this._currentProjectileTarget != -1) {
|
|
return this._currentProjectileTarget;
|
|
}
|
|
let minLength = -1;
|
|
let candidate = -1;
|
|
const level = this._simLevel;
|
|
for (let idx = 0; idx < level.simEnemies.length; idx++) {
|
|
const enemy = level.simEnemies[idx];
|
|
const delta = enemy.currentPathPosition.subtract(this._position);
|
|
const length = delta.magnitude();
|
|
if (enemy.path != null && length < this._projectileRange) {
|
|
const pathLength = enemy.path.length - enemy.currentPathIndex;
|
|
if (minLength == -1 || pathLength < minLength) {
|
|
candidate = idx;
|
|
minLength = pathLength;
|
|
}
|
|
}
|
|
}
|
|
return candidate;
|
|
}
|
|
isEnemyInRange(range) {
|
|
const level = this._simLevel;
|
|
for (const idx in level.simEnemies) {
|
|
const enemy = level.simEnemies[idx];
|
|
const delta = enemy.currentPathPosition.subtract(this._position);
|
|
const length = delta.magnitude();
|
|
if (length < range) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=SimTower.js.map
|