mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
197 lines
6.7 KiB
TypeScript
197 lines
6.7 KiB
TypeScript
import { LatLng } from "leaflet";
|
|
import { getMissionHandler, getUnitsManager } from "..";
|
|
import { GAME_MASTER } from "../constants/constants";
|
|
|
|
export class UnitDatabase {
|
|
blueprints: { [key: string]: UnitBlueprint } = {};
|
|
|
|
constructor() {
|
|
|
|
}
|
|
|
|
getCategory() {
|
|
return "";
|
|
}
|
|
|
|
/* Gets a specific blueprint by name */
|
|
getByName(name: string) {
|
|
if (name in this.blueprints)
|
|
return this.blueprints[name];
|
|
return null;
|
|
}
|
|
|
|
/* Gets a specific blueprint by label */
|
|
getByLabel(label: string) {
|
|
for (let unit in this.blueprints) {
|
|
if (this.blueprints[unit].label === label)
|
|
return this.blueprints[unit];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
getBlueprints() {
|
|
if (getUnitsManager().getCommandMode() == GAME_MASTER || !getMissionHandler().getRTSOptions().restrictSpawns)
|
|
return this.blueprints;
|
|
else {
|
|
var filteredBlueprints: { [key: string]: UnitBlueprint } = {};
|
|
for (let unit in this.blueprints) {
|
|
const blueprint = this.blueprints[unit];
|
|
console.log(blueprint.era)
|
|
if (this.getSpawnPointsByName(blueprint.name) < getMissionHandler().getAvailableSpawnPoints() &&
|
|
getMissionHandler().getRTSOptions().eras.includes(blueprint.era) &&
|
|
(!getMissionHandler().getRTSOptions().restrictToCoalition || blueprint.coalition === getUnitsManager().getCommandedCoalition())) {
|
|
filteredBlueprints[unit] = blueprint;
|
|
}
|
|
}
|
|
return filteredBlueprints;
|
|
}
|
|
}
|
|
|
|
/* Returns a list of all possible roles in a database */
|
|
getRoles() {
|
|
var roles: string[] = [];
|
|
var filteredBlueprints = this.getBlueprints();
|
|
for (let unit in filteredBlueprints) {
|
|
var loadouts = filteredBlueprints[unit].loadouts;
|
|
if (loadouts) {
|
|
for (let loadout of loadouts) {
|
|
for (let role of loadout.roles) {
|
|
if (role !== "" && !roles.includes(role))
|
|
roles.push(role);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return roles;
|
|
}
|
|
|
|
/* Returns a list of all possible types in a database */
|
|
getTypes() {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var types: string[] = [];
|
|
for (let unit in filteredBlueprints) {
|
|
var type = filteredBlueprints[unit].type;
|
|
if (type && type !== "" && !types.includes(type))
|
|
types.push(type);
|
|
}
|
|
return types;
|
|
}
|
|
|
|
/* Returns a list of all possible periods in a database */
|
|
getEras() {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var eras: string[] = [];
|
|
for (let unit in filteredBlueprints) {
|
|
var era = filteredBlueprints[unit].era;
|
|
if (era && era !== "" && !eras.includes(era))
|
|
eras.push(era);
|
|
}
|
|
return eras;
|
|
}
|
|
|
|
/* Returns a list of all possible ranges in a database */
|
|
getRanges() {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var ranges: string[] = [];
|
|
for (let unit in filteredBlueprints) {
|
|
var range = filteredBlueprints[unit].range;
|
|
if (range && range !== "" && !ranges.includes(range))
|
|
ranges.push(range);
|
|
}
|
|
return ranges;
|
|
}
|
|
|
|
/* Get all blueprints by range */
|
|
getByRange(range: string) {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var unitswithrange = [];
|
|
for (let unit in filteredBlueprints) {
|
|
if (filteredBlueprints[unit].range === range) {
|
|
unitswithrange.push(filteredBlueprints[unit]);
|
|
}
|
|
}
|
|
return unitswithrange;
|
|
}
|
|
|
|
/* Get all blueprints by type */
|
|
getByType(type: string) {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var units = [];
|
|
for (let unit in filteredBlueprints) {
|
|
if (filteredBlueprints[unit].type === type) {
|
|
units.push(filteredBlueprints[unit]);
|
|
}
|
|
}
|
|
return units;
|
|
}
|
|
|
|
/* Get all blueprints by role */
|
|
getByRole(role: string) {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var units = [];
|
|
for (let unit in filteredBlueprints) {
|
|
var loadouts = filteredBlueprints[unit].loadouts;
|
|
if (loadouts) {
|
|
for (let loadout of loadouts) {
|
|
if (loadout.roles.includes(role) || loadout.roles.includes(role.toLowerCase())) {
|
|
units.push(filteredBlueprints[unit])
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return units;
|
|
}
|
|
|
|
/* Get the names of all the loadouts for a specific unit and for a specific role */
|
|
getLoadoutNamesByRole(name: string, role: string) {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
var loadoutsByRole = [];
|
|
var loadouts = filteredBlueprints[name].loadouts;
|
|
if (loadouts) {
|
|
for (let loadout of loadouts) {
|
|
if (loadout.roles.includes(role) || loadout.roles.includes("")) {
|
|
loadoutsByRole.push(loadout.name)
|
|
}
|
|
}
|
|
}
|
|
return loadoutsByRole;
|
|
}
|
|
|
|
/* Get the loadout content from the unit name and loadout name */
|
|
getLoadoutByName(name: string, loadoutName: string) {
|
|
var loadouts = this.blueprints[name].loadouts;
|
|
if (loadouts) {
|
|
for (let loadout of loadouts) {
|
|
if (loadout.name === loadoutName)
|
|
return loadout;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
generateTestGrid(initialPosition: LatLng) {
|
|
var filteredBlueprints = this.getBlueprints();
|
|
const step = 0.01;
|
|
var nUnits = Object.values(filteredBlueprints).length;
|
|
var gridSize = Math.ceil(Math.sqrt(nUnits));
|
|
Object.values(filteredBlueprints).forEach((unitBlueprint: UnitBlueprint, idx: number) => {
|
|
var row = Math.floor(idx / gridSize);
|
|
var col = idx - row * gridSize;
|
|
var location = new LatLng(initialPosition.lat + col * step, initialPosition.lng + row * step)
|
|
getUnitsManager().spawnUnits(this.getCategory(), [{unitType: unitBlueprint.name, location: location, altitude: 1000, loadout: ""}]);
|
|
})
|
|
}
|
|
|
|
getSpawnPointsByLabel(label: string) {
|
|
var blueprint = this.getByLabel(label);
|
|
if (blueprint)
|
|
return this.getSpawnPointsByName(blueprint.name);
|
|
else
|
|
return Infinity;
|
|
}
|
|
|
|
getSpawnPointsByName(name: string) {
|
|
return Infinity;
|
|
}
|
|
} |