136 lines
3.8 KiB
JavaScript
136 lines
3.8 KiB
JavaScript
import { EEnemySize, EProjectileEffectType } from "../../GameData/index.js";
|
|
export class SimEnemy {
|
|
_index;
|
|
_routeIdx;
|
|
_startHex;
|
|
_endHex;
|
|
_path;
|
|
_position;
|
|
_direction;
|
|
_currentPathIndex;
|
|
_currentPathStep;
|
|
_currentPathPosition;
|
|
_dead = false;
|
|
_simLevel;
|
|
_gdEnemy;
|
|
_hitPonts;
|
|
_size;
|
|
_speed;
|
|
_gain;
|
|
_gdRoot;
|
|
constructor(gdRoot, wave, routeIdx, level) {
|
|
const gdLevel = level.gdLevel;
|
|
const route = gdLevel.enemyRoutes[routeIdx];
|
|
this._gdRoot = gdRoot;
|
|
this._index = wave.enemy;
|
|
this._simLevel = level;
|
|
this._hitPonts = wave.hitpoints;
|
|
this._size = wave.size;
|
|
this._gain = wave.gain;
|
|
this._startHex = gdLevel.enemySpawns[route[0]];
|
|
this._endHex = gdLevel.enemyTargets[route[1]];
|
|
this._gdEnemy = this._gdRoot.enemies[this._index];
|
|
this._currentPathIndex = 0;
|
|
this._currentPathStep = level.currentStep;
|
|
this._dead = false;
|
|
this._routeIdx = routeIdx;
|
|
this._path = level.simCells[level.getCellIndex(this._startHex)].pathsToTarget[routeIdx];
|
|
this._position = level.simCells[this._path[0]].hex.toWorld();
|
|
this._direction = level.simCells[this._path[1]].hex.toWorld().subtract(this._position).normalized();
|
|
this._currentPathPosition = this._position;
|
|
this._speed = this._gdEnemy.speed;
|
|
switch (wave.size) {
|
|
case EEnemySize.Tiny:
|
|
this._speed *= 2;
|
|
break;
|
|
case EEnemySize.Huge:
|
|
this._speed *= 0.5;
|
|
break;
|
|
}
|
|
}
|
|
get path() {
|
|
return this._path;
|
|
}
|
|
set path(value) {
|
|
this._path = value;
|
|
}
|
|
get position() {
|
|
return this._position;
|
|
}
|
|
set position(value) {
|
|
this._position = value;
|
|
}
|
|
get direction() {
|
|
return this._direction;
|
|
}
|
|
get endHex() {
|
|
return this._endHex;
|
|
}
|
|
get currentPathIndex() {
|
|
return this._currentPathIndex;
|
|
}
|
|
set currentPathIndex(value) {
|
|
this._currentPathIndex = value;
|
|
}
|
|
get currentPathStep() {
|
|
return this._currentPathStep;
|
|
}
|
|
set currentPathStep(value) {
|
|
this._currentPathStep = value;
|
|
}
|
|
get currentPathPosition() {
|
|
return this._currentPathPosition;
|
|
}
|
|
get dead() {
|
|
return this._dead;
|
|
}
|
|
set dead(value) {
|
|
this._dead = value;
|
|
}
|
|
get speed() {
|
|
return this._speed;
|
|
}
|
|
get size() {
|
|
return this._size;
|
|
}
|
|
get index() {
|
|
return this._index;
|
|
}
|
|
suffer = (effect) => {
|
|
switch (effect.type) {
|
|
case EProjectileEffectType.Damage:
|
|
{
|
|
this._hitPonts -= effect.amount;
|
|
if (this._hitPonts <= 0) {
|
|
this._simLevel.currency += this._gain;
|
|
this._dead = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
onPathUpdated = () => {
|
|
const myPos = this._position;
|
|
this._currentPathPosition = myPos;
|
|
if (this._path == null) {
|
|
return;
|
|
}
|
|
const current = this._path[this._currentPathIndex];
|
|
const next = this._path[this._currentPathIndex + 1];
|
|
if (!next) {
|
|
return;
|
|
}
|
|
const cells = this._simLevel.simCells;
|
|
const pos1 = cells[current].hex.toWorld();
|
|
const pos2 = cells[next].hex.toWorld();
|
|
const myDir = pos2.subtract(myPos);
|
|
const myLen = myDir.magnitude();
|
|
const hexDir = pos2.subtract(pos1);
|
|
const hexLen = hexDir.magnitude();
|
|
if (myLen > hexLen) {
|
|
this._path.unshift(this._path[0]);
|
|
}
|
|
this._direction = myDir.multiplyScalar(1 / myLen);
|
|
};
|
|
}
|
|
//# sourceMappingURL=SimEnemy.js.map
|