Files
2026-04-19 01:16:27 +02:00

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