migrate from perforce
This commit is contained in:
9
dist/Simulation/Models/ECellType.js
vendored
Normal file
9
dist/Simulation/Models/ECellType.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
export var ECellType;
|
||||
(function (ECellType) {
|
||||
ECellType[ECellType["Free"] = 0] = "Free";
|
||||
ECellType[ECellType["Blocked"] = 1] = "Blocked";
|
||||
ECellType[ECellType["Entry"] = 2] = "Entry";
|
||||
ECellType[ECellType["Reserved"] = 3] = "Reserved";
|
||||
})(ECellType || (ECellType = {}));
|
||||
;
|
||||
//# sourceMappingURL=ECellType.js.map
|
||||
1
dist/Simulation/Models/ECellType.js.map
vendored
Normal file
1
dist/Simulation/Models/ECellType.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ECellType.js","sourceRoot":"","sources":["../../../src/Simulation/Models/ECellType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACjB,yCAAQ,CAAA;IACR,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,iDAAQ,CAAA;AACZ,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB;AAAA,CAAC"}
|
||||
50
dist/Simulation/Models/SimCell.js
vendored
Normal file
50
dist/Simulation/Models/SimCell.js
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
export class SimCell {
|
||||
_hex;
|
||||
_distance;
|
||||
_type;
|
||||
_blockedType = -1;
|
||||
_index;
|
||||
_simTower = null;
|
||||
_pathsToTarget = [];
|
||||
constructor(hex, distance, type, index) {
|
||||
this._hex = hex;
|
||||
this._distance = distance;
|
||||
this._type = type;
|
||||
this._index = index;
|
||||
}
|
||||
;
|
||||
get hex() {
|
||||
return this._hex;
|
||||
}
|
||||
get distance() {
|
||||
return this._distance;
|
||||
}
|
||||
get type() {
|
||||
return this._type;
|
||||
}
|
||||
set type(value) {
|
||||
this._type = value;
|
||||
}
|
||||
get blockedType() {
|
||||
return this._blockedType;
|
||||
}
|
||||
set blockedType(value) {
|
||||
this._blockedType = value;
|
||||
}
|
||||
get index() {
|
||||
return this._index;
|
||||
}
|
||||
get simTower() {
|
||||
return this._simTower;
|
||||
}
|
||||
set simTower(value) {
|
||||
this._simTower = value;
|
||||
}
|
||||
get pathsToTarget() {
|
||||
return this._pathsToTarget;
|
||||
}
|
||||
set pathsToTarget(value) {
|
||||
this._pathsToTarget = value;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=SimCell.js.map
|
||||
1
dist/Simulation/Models/SimCell.js.map
vendored
Normal file
1
dist/Simulation/Models/SimCell.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SimCell.js","sourceRoot":"","sources":["../../../src/Simulation/Models/SimCell.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,OAAO;IACR,IAAI,CAAM;IACV,SAAS,CAAS;IAClB,KAAK,CAAY;IACjB,YAAY,GAAW,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAS;IACf,SAAS,GAAoB,IAAI,CAAC;IAClC,cAAc,GAAe,EAAE,CAAC;IAExC,YAAY,GAAQ,EAAE,QAAgB,EAAE,IAAe,EAAE,KAAa;QAClE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAAA,CAAC;IAEF,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,IAAI,CAAC,KAAgB;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAAe;QAC/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,KAAiB;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAChC,CAAC;CACJ"}
|
||||
136
dist/Simulation/Models/SimEnemy.js
vendored
Normal file
136
dist/Simulation/Models/SimEnemy.js
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
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
|
||||
1
dist/Simulation/Models/SimEnemy.js.map
vendored
Normal file
1
dist/Simulation/Models/SimEnemy.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SimEnemy.js","sourceRoot":"","sources":["../../../src/Simulation/Models/SimEnemy.ts"],"names":[],"mappings":"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"}
|
||||
262
dist/Simulation/Models/SimLevel.js
vendored
Normal file
262
dist/Simulation/Models/SimLevel.js
vendored
Normal file
@@ -0,0 +1,262 @@
|
||||
import { Hex, PathFinding } from "../../Util/index.js";
|
||||
import { ECellType, SimCell } from "../index.js";
|
||||
export class SimLevel {
|
||||
static version = 2;
|
||||
_paused = true;
|
||||
_currentStep = -1;
|
||||
_gdLevel;
|
||||
_highlightedIndex = -1;
|
||||
_currency = -1;
|
||||
_stride = -1;
|
||||
_simCells;
|
||||
_simEnemies;
|
||||
_simProjectiles;
|
||||
_nextWaveStep = -1;
|
||||
_lastEnemySpawnStep = 0;
|
||||
_currentWave;
|
||||
_enemiesLeftToSpawn;
|
||||
_levelIdx;
|
||||
_gdRoot;
|
||||
constructor(gdRoot, levelIdx) {
|
||||
this._levelIdx = levelIdx;
|
||||
this._gdRoot = gdRoot;
|
||||
this._gdLevel = gdRoot.levels[levelIdx];
|
||||
this._simCells = [];
|
||||
this._simEnemies = [];
|
||||
this._simProjectiles = [];
|
||||
this._currentStep = 0;
|
||||
this._currency = this._gdLevel.currency;
|
||||
this._currentWave = 0;
|
||||
this._enemiesLeftToSpawn = this._gdLevel.waves[0].amount;
|
||||
const radius = this._gdLevel.radius;
|
||||
this._stride = 2 * radius + 1;
|
||||
const h0 = new Hex(0, 0);
|
||||
for (let y = -radius; y <= radius; ++y) {
|
||||
for (let x = -radius; x <= radius; ++x) {
|
||||
const hex = new Hex(x, y);
|
||||
const distance = Hex.distance(hex, h0);
|
||||
const type = distance >= radius ? ECellType.Blocked : ECellType.Free;
|
||||
const cellIndex = this.getCellIndex(hex);
|
||||
this._simCells[cellIndex] = new SimCell(hex, distance, type, cellIndex);
|
||||
}
|
||||
}
|
||||
this._gdLevel.walls.forEach((wall) => {
|
||||
const cellIndex = this.getCellIndex(wall);
|
||||
this._simCells[cellIndex].type = ECellType.Blocked;
|
||||
});
|
||||
this._gdLevel.enemySpawns.forEach((hex) => {
|
||||
const cellIndex = this.getCellIndex(hex);
|
||||
this._simCells[cellIndex].type = ECellType.Entry;
|
||||
});
|
||||
this._gdLevel.enemyTargets.forEach((hex) => {
|
||||
const cellIndex = this.getCellIndex(hex);
|
||||
this._simCells[cellIndex].type = ECellType.Entry;
|
||||
});
|
||||
this._simCells.forEach((cell) => {
|
||||
this.updateBlockedType(cell);
|
||||
});
|
||||
this.updatePaths();
|
||||
}
|
||||
;
|
||||
get gdLevel() {
|
||||
return this._gdLevel;
|
||||
}
|
||||
get simCells() {
|
||||
return this._simCells;
|
||||
}
|
||||
get simEnemies() {
|
||||
return this._simEnemies;
|
||||
}
|
||||
get simProjectiles() {
|
||||
return this._simProjectiles;
|
||||
}
|
||||
get currentStep() {
|
||||
return this._currentStep;
|
||||
}
|
||||
set currentStep(value) {
|
||||
this._currentStep = value;
|
||||
}
|
||||
get currency() {
|
||||
return this._currency;
|
||||
}
|
||||
set currency(value) {
|
||||
this._currency = value;
|
||||
}
|
||||
get highlightedIndex() {
|
||||
return this._highlightedIndex;
|
||||
}
|
||||
set highlightedIndex(value) {
|
||||
this._highlightedIndex = value;
|
||||
}
|
||||
get paused() {
|
||||
return this._paused;
|
||||
}
|
||||
set paused(value) {
|
||||
this._paused = value;
|
||||
}
|
||||
get currentWave() {
|
||||
return this._currentWave;
|
||||
}
|
||||
set currentWave(value) {
|
||||
this._currentWave = value;
|
||||
}
|
||||
get nextWaveStep() {
|
||||
return this._nextWaveStep;
|
||||
}
|
||||
set nextWaveStep(value) {
|
||||
this._nextWaveStep = value;
|
||||
}
|
||||
get lastEnemySpawnStep() {
|
||||
return this._lastEnemySpawnStep;
|
||||
}
|
||||
set lastEnemySpawnStep(value) {
|
||||
this._lastEnemySpawnStep = value;
|
||||
}
|
||||
get enemiesLeftToSpawn() {
|
||||
return this._enemiesLeftToSpawn;
|
||||
}
|
||||
set enemiesLeftToSpawn(value) {
|
||||
this._enemiesLeftToSpawn = value;
|
||||
}
|
||||
serialize() {
|
||||
const data = {
|
||||
version: SimLevel.version,
|
||||
levelIdx: this._levelIdx,
|
||||
paused: this._paused,
|
||||
gdLevel: this._gdLevel,
|
||||
currentStep: this._currentStep,
|
||||
highlightedIndex: this._highlightedIndex,
|
||||
currency: this._currency,
|
||||
stride: this._stride,
|
||||
cells: this._simCells,
|
||||
enemies: this._simEnemies,
|
||||
projectiles: this._simProjectiles,
|
||||
nextWaveStep: this._nextWaveStep,
|
||||
lastEnemySpawnStep: this._lastEnemySpawnStep,
|
||||
currentWave: this._currentWave,
|
||||
enemiesLeftToSpawn: this._enemiesLeftToSpawn
|
||||
};
|
||||
return btoa(JSON.stringify(data));
|
||||
}
|
||||
static deserialize(gdRoot, data) {
|
||||
const parsedData = JSON.parse(atob(data));
|
||||
if (parsedData.version != SimLevel.version) {
|
||||
console.warn('Unsupported version:', parsedData.version);
|
||||
return null;
|
||||
}
|
||||
let level = new SimLevel(gdRoot, parsedData.levelIdx);
|
||||
level._paused = parsedData.paused;
|
||||
level._gdLevel = parsedData.gdLevel;
|
||||
level._currentStep = parsedData.currentStep;
|
||||
level._highlightedIndex = parsedData.highlightedIndex;
|
||||
level._currency = parsedData.currency;
|
||||
level._stride = parsedData.stride;
|
||||
level._simCells = parsedData.cells;
|
||||
level._simEnemies = parsedData.enemies;
|
||||
level._simProjectiles = parsedData.projectiles;
|
||||
level._nextWaveStep = parsedData.nextWaveStep;
|
||||
level._lastEnemySpawnStep = parsedData.lastEnemySpawnStep;
|
||||
level._currentWave = parsedData.currentWave;
|
||||
level._enemiesLeftToSpawn = parsedData.enemiesLeftToSpawn;
|
||||
return level;
|
||||
}
|
||||
getCellIndex(hex) {
|
||||
const x = hex.col + this._gdLevel.radius;
|
||||
const y = hex.row + this._gdLevel.radius;
|
||||
if (x < 0 || x >= this._stride || y < 0 || y >= this._stride) {
|
||||
return -1;
|
||||
}
|
||||
return y * this._stride + x;
|
||||
}
|
||||
getNeighbourCell(cell, direction) {
|
||||
const hex = cell.hex;
|
||||
const neighbourHex = Hex.neighbour(hex, direction);
|
||||
const neighbourIndex = this.getCellIndex(neighbourHex);
|
||||
return this._simCells[neighbourIndex];
|
||||
}
|
||||
updateBlockedType(cell) {
|
||||
if (cell.type == ECellType.Free) {
|
||||
cell.blockedType = -1;
|
||||
return;
|
||||
}
|
||||
if (cell.type == ECellType.Entry && cell.blockedType != -1) {
|
||||
return;
|
||||
}
|
||||
let blockedType = 0;
|
||||
for (let direction = 0; direction < 6; ++direction) {
|
||||
const neighbourCell = this.getNeighbourCell(cell, direction);
|
||||
if (!!neighbourCell && neighbourCell.type == ECellType.Free) {
|
||||
blockedType |= 1 << direction;
|
||||
}
|
||||
}
|
||||
cell.blockedType = blockedType;
|
||||
}
|
||||
reservePaths(hexToBlock) {
|
||||
try {
|
||||
if (!!hexToBlock) {
|
||||
const reservedCell = this._simCells[this.getCellIndex(hexToBlock)];
|
||||
if (reservedCell.type != ECellType.Free || !!reservedCell.simTower)
|
||||
return false;
|
||||
reservedCell.type = ECellType.Reserved;
|
||||
}
|
||||
return this.updatePaths();
|
||||
}
|
||||
finally {
|
||||
if (!!hexToBlock) {
|
||||
const reservedCell = this._simCells[this.getCellIndex(hexToBlock)];
|
||||
if (reservedCell.type == ECellType.Reserved)
|
||||
reservedCell.type = ECellType.Free;
|
||||
}
|
||||
}
|
||||
}
|
||||
updatePaths() {
|
||||
const level = this._gdLevel;
|
||||
const newRoutePaths = [];
|
||||
const newEnemyPaths = [];
|
||||
let invalid = false;
|
||||
for (const routeIdx in level.enemyRoutes) {
|
||||
const route = level.enemyRoutes[routeIdx];
|
||||
const enemySpawnHex = level.enemySpawns[route[0]];
|
||||
const enemySpawnCell = this._simCells[this.getCellIndex(enemySpawnHex)];
|
||||
const enemyTargetHex = level.enemyTargets[route[1]];
|
||||
const enemyTargetCell = this._simCells[this.getCellIndex(enemyTargetHex)];
|
||||
const path = PathFinding.bfs(this, enemySpawnCell.index, enemyTargetCell.index);
|
||||
if (path == null) {
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
newRoutePaths[routeIdx] = path;
|
||||
}
|
||||
if (invalid) {
|
||||
return false;
|
||||
}
|
||||
for (let idx in this._simEnemies) {
|
||||
const simEnemy = this._simEnemies[idx];
|
||||
const hex = Hex.fromWorld(simEnemy.position);
|
||||
const startIndex = this.getCellIndex(hex);
|
||||
const endIndex = this.getCellIndex(simEnemy.endHex);
|
||||
const path = PathFinding.bfs(this, startIndex, endIndex);
|
||||
if (path == null) {
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
newEnemyPaths[idx] = path;
|
||||
}
|
||||
if (invalid) {
|
||||
return false;
|
||||
}
|
||||
for (const routeIdx in level.enemyRoutes) {
|
||||
const route = level.enemyRoutes[routeIdx];
|
||||
const enemySpawnHex = level.enemySpawns[route[0]];
|
||||
const enemySpawnCell = this._simCells[this.getCellIndex(enemySpawnHex)];
|
||||
enemySpawnCell.pathsToTarget[routeIdx] = newRoutePaths[routeIdx];
|
||||
}
|
||||
this._simEnemies.forEach((simEnemy, idx) => {
|
||||
simEnemy.path = newEnemyPaths[idx];
|
||||
simEnemy.currentPathIndex = 0;
|
||||
simEnemy.onPathUpdated();
|
||||
});
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=SimLevel.js.map
|
||||
1
dist/Simulation/Models/SimLevel.js.map
vendored
Normal file
1
dist/Simulation/Models/SimLevel.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
46
dist/Simulation/Models/SimProjectile.js
vendored
Normal file
46
dist/Simulation/Models/SimProjectile.js
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
export class SimProjectile {
|
||||
_gdEffect;
|
||||
_position;
|
||||
_targetEnemyIdx = -1;
|
||||
_spawnStep = -1;
|
||||
_speed = -1;
|
||||
_size = -1;
|
||||
_dead = false;
|
||||
constructor(level, effect, position, targetEnemyIdx, size) {
|
||||
this._gdEffect = effect;
|
||||
this._speed = effect.speed;
|
||||
this._position = position;
|
||||
this._size = size;
|
||||
this._targetEnemyIdx = targetEnemyIdx;
|
||||
this._spawnStep = level.currentStep;
|
||||
}
|
||||
;
|
||||
get gdEffect() {
|
||||
return this._gdEffect;
|
||||
}
|
||||
get position() {
|
||||
return this._position;
|
||||
}
|
||||
set position(value) {
|
||||
this._position = value;
|
||||
}
|
||||
get targetEnemyIdx() {
|
||||
return this._targetEnemyIdx;
|
||||
}
|
||||
get spawnStep() {
|
||||
return this._spawnStep;
|
||||
}
|
||||
get speed() {
|
||||
return this._speed;
|
||||
}
|
||||
get size() {
|
||||
return this._size;
|
||||
}
|
||||
get dead() {
|
||||
return this._dead;
|
||||
}
|
||||
set dead(value) {
|
||||
this._dead = value;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=SimProjectile.js.map
|
||||
1
dist/Simulation/Models/SimProjectile.js.map
vendored
Normal file
1
dist/Simulation/Models/SimProjectile.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SimProjectile.js","sourceRoot":"","sources":["../../../src/Simulation/Models/SimProjectile.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,aAAa;IACd,SAAS,CAAqB;IAC9B,SAAS,CAAU;IACnB,eAAe,GAAW,CAAC,CAAC,CAAC;IAC7B,UAAU,GAAW,CAAC,CAAC,CAAC;IACxB,MAAM,GAAW,CAAC,CAAC,CAAC;IACpB,KAAK,GAAW,CAAC,CAAC,CAAC;IACnB,KAAK,GAAY,KAAK,CAAC;IAE/B,YAAY,KAAe,EAAE,MAA0B,EAAE,QAAiB,EAAE,cAAsB,EAAE,IAAY;QAC5G,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC;IACxC,CAAC;IAAA,CAAC;IAEF,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAAc;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,IAAI,CAAC,KAAc;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;CACJ"}
|
||||
100
dist/Simulation/Models/SimTower.js
vendored
Normal file
100
dist/Simulation/Models/SimTower.js
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
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
|
||||
1
dist/Simulation/Models/SimTower.js.map
vendored
Normal file
1
dist/Simulation/Models/SimTower.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SimTower.js","sourceRoot":"","sources":["../../../src/Simulation/Models/SimTower.ts"],"names":[],"mappings":"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"}
|
||||
Reference in New Issue
Block a user