From 13e3b93e939f70888558d611334e2a03b6327b71 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Mon, 10 Jul 2023 16:58:54 +0200 Subject: [PATCH] More tweaks on frontend --- client/demo.js | 2 +- client/public/stylesheets/markers/units.css | 44 +- .../public/stylesheets/other/contextmenus.css | 72 +- .../olympus/images/buttons/other/back.svg | 10 +- .../olympus/images/buttons/other/delete.svg | 8 +- .../olympus/images/buttons/other/edit.svg | 1 + .../olympus/images/buttons/spawn/aircraft.svg | 50 +- .../images/buttons/spawn/explosion.svg | 6 +- .../olympus/images/buttons/spawn/ground.svg | 83 - .../images/buttons/spawn/groundunit.svg | 89 + .../images/buttons/spawn/helicopter.svg | 59 + .../olympus/images/buttons/spawn/navyunit.svg | 59 + .../olympus/images/buttons/spawn/sam.svg | 40 +- .../olympus/images/buttons/spawn/smoke.svg | 43 +- .../olympus/images/units/helicopter.svg | 17 + client/public/themes/olympus/theme.css | 27 +- client/src/@types/unitdatabase.d.ts | 6 +- client/src/constants/constants.ts | 1 - client/src/controls/airbasecontextmenu.ts | 2 +- client/src/controls/mapcontextmenu.ts | 348 +- client/src/index.ts | 4 +- client/src/map/coalitionarea.ts | 14 +- client/src/map/map.ts | 63 +- client/src/missionhandler/missionhandler.ts | 2 +- client/src/other/utils.ts | 10 +- client/src/panels/unitcontrolpanel.ts | 2 +- client/src/server/server.ts | 18 +- client/src/units/aircraftdatabase.ts | 4 +- client/src/units/groundunitdatabase.ts | 1535 +++++++ client/src/units/groundunitsdatabase.ts | 3671 ----------------- client/src/units/navalunitdatabase.ts | 1711 -------- client/src/units/navyunitdatabase.ts | 946 +++++ client/src/units/unit.ts | 15 +- client/src/units/unitdatabase.ts | 59 +- client/src/units/unitsmanager.ts | 4 +- client/views/other/contextmenus.ejs | 147 +- client/views/panels/navbar.ejs | 3 - 37 files changed, 3321 insertions(+), 5854 deletions(-) create mode 100644 client/public/themes/olympus/images/buttons/other/edit.svg delete mode 100644 client/public/themes/olympus/images/buttons/spawn/ground.svg create mode 100644 client/public/themes/olympus/images/buttons/spawn/groundunit.svg create mode 100644 client/public/themes/olympus/images/buttons/spawn/helicopter.svg create mode 100644 client/public/themes/olympus/images/buttons/spawn/navyunit.svg create mode 100644 client/public/themes/olympus/images/units/helicopter.svg create mode 100644 client/src/units/groundunitdatabase.ts delete mode 100644 client/src/units/groundunitsdatabase.ts delete mode 100644 client/src/units/navalunitdatabase.ts create mode 100644 client/src/units/navyunitdatabase.ts diff --git a/client/demo.js b/client/demo.js index 8c515a85..ca78a542 100644 --- a/client/demo.js +++ b/client/demo.js @@ -48,7 +48,7 @@ const DEMO_UNIT_DATA = { ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ], contacts: [{ID: 1, detectionMethod: 16}], activePath: [ ] - }, ["4"]:{ category: "GroundUnit", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "M-60", unitName: "Cool guy 1-4", groupName: "Cool group 3", state: 1, task: "Being cool", + }, ["4"]:{ category: "Helicopter", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "AH-64D_BLK_II", unitName: "Cool guy 1-4", groupName: "Cool group 3", state: 1, task: "Being cool", hasTask: false, position: { lat: 37.1, lng: -116.1, alt: 1000 }, speed: 200, heading: 315 * Math.PI / 180, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50, desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0, formationOffset: { x: 0, y: 0, z: 0 }, diff --git a/client/public/stylesheets/markers/units.css b/client/public/stylesheets/markers/units.css index 4cbdcc90..d4f88333 100644 --- a/client/public/stylesheets/markers/units.css +++ b/client/public/stylesheets/markers/units.css @@ -14,11 +14,11 @@ background: var(--secondary-gunmetal-grey); display: flex; justify-self: center; - padding-bottom: calc((var(--unit-aircraft-width) / 2) + var(--unit-stroke-width)); + padding-bottom: calc((var(--unit-width) / 2) + var(--unit-stroke-width)); position: absolute; transform-origin: bottom; translate: 0 -50%; - width: var(--unit-aircraft-vvi-width); + width: var(--unit-vvi-width); } .unit-hotgroup { @@ -100,13 +100,13 @@ /*** Fuel indicator ***/ [data-object|="unit"] .unit-fuel { background: white; - border: var(--unit-aircraft-fuel-border-width) solid var(--secondary-dark-steel); + border: var(--unit-fuel-border-width) solid var(--secondary-dark-steel); border-radius: var(--border-radius-sm); display: none; - height: var(--unit-aircraft-fuel-height); + height: var(--unit-fuel-height); position: absolute; - translate: var(--unit-aircraft-fuel-x) var(--unit-aircraft-fuel-y); - width: var(--unit-aircraft-fuel-width); + translate: var(--unit-fuel-x) var(--unit-fuel-y); + width: var(--unit-fuel-width); } [data-object|="unit"] .unit-fuel-level { @@ -117,19 +117,19 @@ /*** Ammo indicator ***/ [data-object|="unit"] .unit-ammo { - column-gap: var(--unit-aircraft-ammo-spacing); + column-gap: var(--unit-ammo-spacing); display: none; height: fit-content; position: absolute; - translate: var(--unit-aircraft-ammo-x) var(--unit-aircraft-ammo-y); + translate: var(--unit-ammo-x) var(--unit-ammo-y); width: fit-content; } [data-object|="unit"] .unit-ammo>* { background-color: white; - border: var(--unit-aircraft-ammo-border-width) solid var(--secondary-dark-steel); + border: var(--unit-ammo-border-width) solid var(--secondary-dark-steel); border-radius: 50%; - padding: var(--unit-aircraft-ammo-radius); + padding: var(--unit-ammo-radius); } /*** Unit summary ***/ @@ -292,24 +292,24 @@ } /*** Dead unit ***/ -[data-object|="unit-aircraft"][data-is-dead] .unit-selected-spotlight, -[data-object|="unit-aircraft"][data-is-dead] .unit-short-label, -[data-object|="unit-aircraft"][data-is-dead] .unit-vvi, -[data-object|="unit-aircraft"][data-is-dead] .unit-hotgroup, -[data-object|="unit-aircraft"][data-is-dead] .unit-hotgroup-id, -[data-object|="unit-aircraft"][data-is-dead] .unit-state, -[data-object|="unit-aircraft"][data-is-dead] .unit-fuel, -[data-object|="unit-aircraft"][data-is-dead] .unit-ammo, -[data-object|="unit-aircraft"][data-is-dead]:hover .unit-fuel, -[data-object|="unit-aircraft"][data-is-dead]:hover .unit-ammo { +[data-object|="unit"][data-is-dead] .unit-selected-spotlight, +[data-object|="unit"][data-is-dead] .unit-short-label, +[data-object|="unit"][data-is-dead] .unit-vvi, +[data-object|="unit"][data-is-dead] .unit-hotgroup, +[data-object|="unit"][data-is-dead] .unit-hotgroup-id, +[data-object|="unit"][data-is-dead] .unit-state, +[data-object|="unit"][data-is-dead] .unit-fuel, +[data-object|="unit"][data-is-dead] .unit-ammo, +[data-object|="unit"][data-is-dead]:hover .unit-fuel, +[data-object|="unit"][data-is-dead]:hover .unit-ammo { display: none; } -[data-object|="unit-aircraft"][data-is-dead] .unit-summary>* { +[data-object|="unit"][data-is-dead] .unit-summary>* { display: none; } -[data-object|="unit-aircraft"][data-is-dead] .unit-summary .unit-callsign { +[data-object|="unit"][data-is-dead] .unit-summary .unit-callsign { display: block; } diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index 91a50f7f..6b691787 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -8,11 +8,10 @@ z-index: 9999; } -#aircraft-spawn-menu { - height: fit-content; -} - -#ground-unit-spawn-menu { +#aircraft-spawn-menu, +#helicopter-spawn-menu, +#groundunit-spawn-menu, +#navyunit-spawn-menu { height: fit-content; } @@ -35,35 +34,27 @@ width: 50px; } -#aircraft-spawn-menu .ol-select.is-open .ol-select-options { +#aircraft-spawn-menu .ol-select.is-open .ol-select-options, +#helicopter-spawn-menu .ol-select.is-open .ol-select-options { max-height: 300px; } -#aircraft-spawn-menu>button, -#ground-unit-spawn-menu>button, -#iads-menu>button { +.deploy-unit-button { text-align: center; width: 100%; } -#aircraft-spawn-button { - background-image: url("/resources/theme/images/buttons/spawn/aircraft.svg"); - background-size: 48px; +.upper-bar svg>* { + fill: white; } -#ground-ol-contexmenu-button { - background-image: url("/resources/theme/images/buttons/spawn/ground.svg"); - background-size: 48px; +.upper-bar svg { + width: 22px; + margin: 0px 5px; } -#smoke-spawn-button { - background-image: url("/resources/theme/images/buttons/spawn/smoke.svg"); - background-size: 48px; -} - -#explosion-spawn-button { - background-image: url("/resources/theme/images/buttons/spawn/explosion.svg"); - background-size: 48px; +.upper-bar button:nth-child(2) { + margin-left: auto; } [data-coalition="blue"]#active-coalition-label, @@ -117,7 +108,8 @@ content: "Create neutral unit"; } -#loadout-preview { +#aircraft-loadout-preview, +#helicopter-loadout-preview { align-content: space-between; align-items: center; column-gap: 20px; @@ -126,14 +118,16 @@ width: 100%; } -#loadout-list { +#aircaft-loadout-list, +#helicopter-loadout-list { align-content: center; display: flex; flex-direction: column; height: 100%; } -#unit-image { +#aircraft-unit-image, +#helicopter-unit-image { filter: invert(100%); height: 100px; margin-bottom: 10px; @@ -186,14 +180,16 @@ background-color: orange; } -#aircraft-spawn-menu .ol-slider-value { +#aircraft-spawn-menu .ol-slider-value, +#helicopter-spawn-menu .ol-slider-value { color: var(--accent-light-blue); cursor: pointer; font-size: 14px; font-weight: bold; } -#aircraft-spawn-altitude-slider { +#aircraft-spawn-altitude-slider, +#helicopter-spawn-altitude-slider { padding: 0px 10px; } @@ -371,26 +367,6 @@ width: 50px; } -#iads-button { - background-image: url("/resources/theme/images/buttons/spawn/sam.svg"); - background-size: 48px; -} - -#cap-button { - background-image: url("/resources/theme/images/buttons/spawn/aircraft.svg"); - background-size: 48px; -} - -#coalitionarea-back-button { - background-image: url("/resources/theme/images/buttons/other/back.svg"); - background-size: 48px; -} - -#coalitionarea-delete-button { - background-image: url("/resources/theme/images/buttons/other/delete.svg"); - background-size: 48px; -} - #coalition-area-contextmenu .ol-checkbox { align-self: flex-start; } diff --git a/client/public/themes/olympus/images/buttons/other/back.svg b/client/public/themes/olympus/images/buttons/other/back.svg index 52c98f94..0b86d7f1 100644 --- a/client/public/themes/olympus/images/buttons/other/back.svg +++ b/client/public/themes/olympus/images/buttons/other/back.svg @@ -23,9 +23,9 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" showgrid="false" - inkscape:zoom="26.15625" - inkscape:cx="20.587814" - inkscape:cy="20.109916" + inkscape:zoom="13.078125" + inkscape:cx="19.918757" + inkscape:cy="17.663082" inkscape:window-width="1920" inkscape:window-height="1017" inkscape:window-x="1912" @@ -34,8 +34,8 @@ inkscape:current-layer="svg4" /> diff --git a/client/public/themes/olympus/images/buttons/other/delete.svg b/client/public/themes/olympus/images/buttons/other/delete.svg index c290353d..68a91a1a 100644 --- a/client/public/themes/olympus/images/buttons/other/delete.svg +++ b/client/public/themes/olympus/images/buttons/other/delete.svg @@ -24,8 +24,8 @@ inkscape:deskcolor="#d1d1d1" showgrid="false" inkscape:zoom="13.078125" - inkscape:cx="27.794504" - inkscape:cy="19.192354" + inkscape:cx="27.870968" + inkscape:cy="20.415771" inkscape:window-width="1920" inkscape:window-height="1017" inkscape:window-x="1912" @@ -34,7 +34,7 @@ inkscape:current-layer="svg1940" /> + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0589579;stroke-opacity:1" /> diff --git a/client/public/themes/olympus/images/buttons/other/edit.svg b/client/public/themes/olympus/images/buttons/other/edit.svg new file mode 100644 index 00000000..a690992f --- /dev/null +++ b/client/public/themes/olympus/images/buttons/other/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/themes/olympus/images/buttons/spawn/aircraft.svg b/client/public/themes/olympus/images/buttons/spawn/aircraft.svg index beb45a25..50b02231 100644 --- a/client/public/themes/olympus/images/buttons/spawn/aircraft.svg +++ b/client/public/themes/olympus/images/buttons/spawn/aircraft.svg @@ -1,20 +1,19 @@ + sodipodi:docname="aircraft.svg" + inkscape:version="1.2.2 (732a01da63, 2022-12-09)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -44,33 +43,18 @@ id="namedview10" showgrid="false" inkscape:zoom="18.782524" - inkscape:cx="26.073424" - inkscape:cy="15.446316" + inkscape:cx="26.114701" + inkscape:cy="15.493125" inkscape:window-x="1912" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="svg8" /> - + inkscape:current-layer="svg8" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> - + style="fill-opacity:1;stroke-width:1.81764" /> diff --git a/client/public/themes/olympus/images/buttons/spawn/explosion.svg b/client/public/themes/olympus/images/buttons/spawn/explosion.svg index 192784b0..b3803f61 100644 --- a/client/public/themes/olympus/images/buttons/spawn/explosion.svg +++ b/client/public/themes/olympus/images/buttons/spawn/explosion.svg @@ -24,7 +24,7 @@ inkscape:deskcolor="#d1d1d1" showgrid="false" inkscape:zoom="13.078125" - inkscape:cx="19.53644" + inkscape:cx="18.389486" inkscape:cy="12.157706" inkscape:window-width="1920" inkscape:window-height="1017" @@ -34,9 +34,9 @@ inkscape:current-layer="svg4" /> + style="fill-opacity:1;stroke-width:0.0537019" /> diff --git a/client/public/themes/olympus/images/buttons/spawn/ground.svg b/client/public/themes/olympus/images/buttons/spawn/ground.svg deleted file mode 100644 index f0d8bf1c..00000000 --- a/client/public/themes/olympus/images/buttons/spawn/ground.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/client/public/themes/olympus/images/buttons/spawn/groundunit.svg b/client/public/themes/olympus/images/buttons/spawn/groundunit.svg new file mode 100644 index 00000000..28c22079 --- /dev/null +++ b/client/public/themes/olympus/images/buttons/spawn/groundunit.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/client/public/themes/olympus/images/buttons/spawn/helicopter.svg b/client/public/themes/olympus/images/buttons/spawn/helicopter.svg new file mode 100644 index 00000000..585c9678 --- /dev/null +++ b/client/public/themes/olympus/images/buttons/spawn/helicopter.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/client/public/themes/olympus/images/buttons/spawn/navyunit.svg b/client/public/themes/olympus/images/buttons/spawn/navyunit.svg new file mode 100644 index 00000000..b5d83ba2 --- /dev/null +++ b/client/public/themes/olympus/images/buttons/spawn/navyunit.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/client/public/themes/olympus/images/buttons/spawn/sam.svg b/client/public/themes/olympus/images/buttons/spawn/sam.svg index 0109de6b..bf91d6f5 100644 --- a/client/public/themes/olympus/images/buttons/spawn/sam.svg +++ b/client/public/themes/olympus/images/buttons/spawn/sam.svg @@ -1,9 +1,7 @@ - - + transform="matrix(1.6146667,0,0,1.6146667,-9.4139752,-8.9208162)" + style="stroke:none"> + style="stroke:none" /> + style="stroke:none" /> + transform="matrix(1.6146667,0,0,1.6146667,-9.4139752,-8.9208162)" + style="stroke:none"> + style="stroke:none" /> @@ -69,7 +45,6 @@ stroke-width="0" width="19" height="19" - fill="#ffffff" transform="translate(6.5,6.5)" id="rect7265" x="0" @@ -81,7 +56,6 @@ stroke-width="0" width="12.7515" height="12.7515" - fill="#ffffff" transform="rotate(-175.986,10.642671,7.6933413)" id="rect7268" x="0" diff --git a/client/public/themes/olympus/images/buttons/spawn/smoke.svg b/client/public/themes/olympus/images/buttons/spawn/smoke.svg index 468c0c95..b4ba491d 100644 --- a/client/public/themes/olympus/images/buttons/spawn/smoke.svg +++ b/client/public/themes/olympus/images/buttons/spawn/smoke.svg @@ -1,20 +1,19 @@ + sodipodi:docname="smoke.svg" + inkscape:version="1.2.2 (732a01da63, 2022-12-09)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -23,7 +22,7 @@ image/svg+xml - + @@ -42,25 +41,19 @@ id="namedview17" showgrid="false" inkscape:zoom="18.782524" - inkscape:cx="15.515904" - inkscape:cy="14.452888" + inkscape:cx="15.572987" + inkscape:cy="14.481547" inkscape:window-x="1912" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="svg15" /> + inkscape:current-layer="svg15" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> - + + + diff --git a/client/public/themes/olympus/theme.css b/client/public/themes/olympus/theme.css index 57f6bb3f..f816c274 100644 --- a/client/public/themes/olympus/theme.css +++ b/client/public/themes/olympus/theme.css @@ -65,18 +65,17 @@ --unit-width: 50px; /*** Air units ***/ - --unit-aircraft-ammo-gap: calc(2px + var(--unit-stroke-width)); - --unit-aircraft-ammo-border-radius: 50%; - --unit-aircraft-ammo-border-width: 2px; - --unit-aircraft-ammo-radius: 2px; - --unit-aircraft-ammo-spacing: 2px; - --unit-aircraft-ammo-x: 0px; - --unit-aircraft-ammo-y: 30px; - --unit-aircraft-fuel-border-width: 2px; - --unit-aircraft-fuel-height: 6px; - --unit-aircraft-fuel-width: 36px; - --unit-aircraft-fuel-x: 0px; - --unit-aircraft-fuel-y: 22px; - --unit-aircraft-height: 28px; - --unit-aircraft-vvi-width: 4px; + --unit-ammo-gap: calc(2px + var(--unit-stroke-width)); + --unit-ammo-border-radius: 50%; + --unit-ammo-border-width: 2px; + --unit-ammo-radius: 2px; + --unit-ammo-spacing: 2px; + --unit-ammo-x: 0px; + --unit-ammo-y: 30px; + --unit-fuel-border-width: 2px; + --unit-fuel-height: 6px; + --unit-fuel-width: 36px; + --unit-fuel-x: 0px; + --unit-fuel-y: 22px; + --unit-vvi-width: 4px; } \ No newline at end of file diff --git a/client/src/@types/unitdatabase.d.ts b/client/src/@types/unitdatabase.d.ts index 469a5fac..f76a38a5 100644 --- a/client/src/@types/unitdatabase.d.ts +++ b/client/src/@types/unitdatabase.d.ts @@ -15,10 +15,10 @@ interface LoadoutBlueprint { interface UnitBlueprint { name: string; era?: string[]; - type?: string; label: string; shortLabel: string; + type?: string; range?: string; - loadouts: LoadoutBlueprint[]; - filename: string; + loadouts?: LoadoutBlueprint[]; + filename?: string; } diff --git a/client/src/constants/constants.ts b/client/src/constants/constants.ts index b0c300f1..0584f11c 100644 --- a/client/src/constants/constants.ts +++ b/client/src/constants/constants.ts @@ -139,7 +139,6 @@ export const BOMBING = "Bombing"; export const CARPET_BOMBING = "Carpet bombing"; export const FIRE_AT_AREA = "Fire at area"; export const COALITIONAREA_DRAW_POLYGON = "Draw Coalition Area"; -export const COALITIONAREA_INTERACT = "Interact with Coalition Areas" export const visibilityControls: string[] = ["human", "dcs", "aircraft", "groundunit-sam", "groundunit-other", "navyunit", "airbase"]; export const visibilityControlsTootlips: string[] = ["Toggle human players visibility", "Toggle DCS controlled units visibility", "Toggle aircrafts visibility", "Toggle SAM units visibility", "Toggle ground units (not SAM) visibility", "Toggle navy units visibility", "Toggle airbases visibility"]; diff --git a/client/src/controls/airbasecontextmenu.ts b/client/src/controls/airbasecontextmenu.ts index c53bfb9a..7b9559d0 100644 --- a/client/src/controls/airbasecontextmenu.ts +++ b/client/src/controls/airbasecontextmenu.ts @@ -60,7 +60,7 @@ export class AirbaseContextMenu extends ContextMenu { showSpawnMenu() { if (this.#airbase != null) { setActiveCoalition(this.#airbase.getCoalition()); - getMap().showMapContextMenu({ originalEvent: { x: this.getX(), y: this.getY(), latlng: this.getLatLng() } }); + getMap().showMapContextMenu(this.getX(), this.getY(), this.getLatLng()); getMap().getMapContextMenu().hideUpperBar(); getMap().getMapContextMenu().hideAltitudeSlider(); getMap().getMapContextMenu().showSubMenu("aircraft"); diff --git a/client/src/controls/mapcontextmenu.ts b/client/src/controls/mapcontextmenu.ts index 0976f983..a87c66d2 100644 --- a/client/src/controls/mapcontextmenu.ts +++ b/client/src/controls/mapcontextmenu.ts @@ -1,26 +1,38 @@ import { LatLng } from "leaflet"; import { getActiveCoalition, getMap, getUnitsManager, setActiveCoalition } from ".."; -import { spawnAircrafts, spawnExplosion, spawnGroundUnits, spawnSmoke } from "../server/server"; +import { spawnAircrafts, spawnExplosion, spawnGroundUnits, spawnHelicopters, spawnNavyUnits, spawnSmoke } from "../server/server"; import { aircraftDatabase } from "../units/aircraftdatabase"; -import { groundUnitsDatabase } from "../units/groundunitsdatabase"; +import { groundUnitDatabase } from "../units/groundunitdatabase"; +import { helicopterDatabase } from "../units/helicopterdatabase"; import { ContextMenu } from "./contextmenu"; import { Dropdown } from "./dropdown"; import { Switch } from "./switch"; import { Slider } from "./slider"; import { ftToM } from "../other/utils"; import { GAME_MASTER } from "../constants/constants"; +import { navyUnitDatabase } from "../units/navyunitdatabase"; +import { CoalitionArea } from "../map/coalitionarea"; export class MapContextMenu extends ContextMenu { #coalitionSwitch: Switch; #aircraftRoleDropdown: Dropdown; - #aircraftTypeDropdown: Dropdown; + #aircraftNameDropdown: Dropdown; #aircraftCountDropdown: Dropdown; #aircraftLoadoutDropdown: Dropdown; - #aircrafSpawnAltitudeSlider: Slider; - #groundUnitRoleDropdown: Dropdown; + #aircraftSpawnAltitudeSlider: Slider; + #helicopterRoleDropdown: Dropdown; + #helicopterNameDropdown: Dropdown; + #helicopterCountDropdown: Dropdown; + #helicopterLoadoutDropdown: Dropdown; + #helicopterSpawnAltitudeSlider: Slider; #groundUnitTypeDropdown: Dropdown; - #groundCountDropdown: Dropdown; + #groundUnitNameDropdown: Dropdown; + #groundUnitCountDropdown: Dropdown; + #navyUnitTypeDropdown: Dropdown; + #navyUnitNameDropdown: Dropdown; + #navyUnitCountDropdown: Dropdown; #spawnOptions = { role: "", name: "", latlng: new LatLng(0, 0), coalition: "blue", loadout: "", airbaseName: "", altitude: ftToM(20000), count: 1 }; + #coalitionArea: CoalitionArea | null = null; constructor(id: string) { super(id); @@ -28,23 +40,47 @@ export class MapContextMenu extends ContextMenu { this.#coalitionSwitch = new Switch("coalition-switch", (value: boolean) => this.#onSwitchClick(value)); this.#coalitionSwitch.setValue(false); this.#coalitionSwitch.getContainer()?.addEventListener("contextmenu", (e) => this.#onSwitchRightClick(e)); + + /* Aircraft menu */ this.#aircraftRoleDropdown = new Dropdown("aircraft-role-options", (role: string) => this.#setAircraftRole(role)); - this.#aircraftTypeDropdown = new Dropdown("aircraft-type-options", (type: string) => this.#setAircraftType(type)); + this.#aircraftNameDropdown = new Dropdown("aircraft-type-options", (type: string) => this.#setAircraftName(type)); this.#aircraftCountDropdown = new Dropdown("aircraft-count-options", (type: string) => this.#setAircraftCount(type)); this.#aircraftCountDropdown.setOptions(["1", "2", "3", "4"]); this.#aircraftCountDropdown.setValue("1"); - this.#aircraftLoadoutDropdown = new Dropdown("loadout-options", (loadout: string) => this.#setAircraftLoadout(loadout)); - this.#aircrafSpawnAltitudeSlider = new Slider("aircraft-spawn-altitude-slider", 0, 50000, "ft", (value: number) => {this.#spawnOptions.altitude = ftToM(value);}); - this.#aircrafSpawnAltitudeSlider.setIncrement(500); - this.#aircrafSpawnAltitudeSlider.setValue(20000); - this.#aircrafSpawnAltitudeSlider.setActive(true); - this.#groundUnitRoleDropdown = new Dropdown("ground-unit-role-options", (role: string) => this.#setGroundUnitRole(role)); - this.#groundUnitTypeDropdown = new Dropdown("ground-unit-type-options", (type: string) => this.#setGroundUnitType(type)); - this.#groundCountDropdown = new Dropdown("ground-count-options", (type: string) => this.#setGroundCount(type)); - var groundCount = []; - for (let i = 1; i <= 10; i++) groundCount.push(String(i)); - this.#groundCountDropdown.setOptions(groundCount); - this.#groundCountDropdown.setValue("1"); + this.#aircraftLoadoutDropdown = new Dropdown("aircraft-loadout-options", (loadout: string) => this.#setAircraftLoadout(loadout)); + this.#aircraftSpawnAltitudeSlider = new Slider("aircraft-spawn-altitude-slider", 0, 50000, "ft", (value: number) => {this.#spawnOptions.altitude = ftToM(value);}); + this.#aircraftSpawnAltitudeSlider.setIncrement(500); + this.#aircraftSpawnAltitudeSlider.setValue(20000); + this.#aircraftSpawnAltitudeSlider.setActive(true); + + /* Helicopter menu */ + this.#helicopterRoleDropdown = new Dropdown("helicopter-role-options", (role: string) => this.#setHelicopterRole(role)); + this.#helicopterNameDropdown = new Dropdown("helicopter-type-options", (type: string) => this.#setHelicopterName(type)); + this.#helicopterCountDropdown = new Dropdown("helicopter-count-options", (type: string) => this.#setHelicopterCount(type)); + this.#helicopterCountDropdown.setOptions(["1", "2", "3", "4"]); + this.#helicopterCountDropdown.setValue("1"); + this.#helicopterLoadoutDropdown = new Dropdown("helicopter-loadout-options", (loadout: string) => this.#setHelicopterLoadout(loadout)); + this.#helicopterSpawnAltitudeSlider = new Slider("helicopter-spawn-altitude-slider", 0, 10000, "ft", (value: number) => {this.#spawnOptions.altitude = ftToM(value);}); + this.#helicopterSpawnAltitudeSlider.setIncrement(50); + this.#helicopterSpawnAltitudeSlider.setValue(5000); + this.#helicopterSpawnAltitudeSlider.setActive(true); + + var count = []; + for (let i = 1; i < 10; i++) count.push(String(i)); + + /* Ground unit menu */ + this.#groundUnitTypeDropdown = new Dropdown("groundunit-type-options", (type: string) => this.#setGroundUnitType(type)); + this.#groundUnitNameDropdown = new Dropdown("groundunit-name-options", (name: string) => this.#setGroundUnitName(name)); + this.#groundUnitCountDropdown = new Dropdown("groundunit-count-options", (count: string) => this.#setGroundUnitCount(count)); + this.#groundUnitCountDropdown.setOptions(count); + this.#groundUnitCountDropdown.setValue("1"); + + /* Navy unit menu */ + this.#navyUnitTypeDropdown = new Dropdown("navyunit-type-options", (type: string) => this.#setNavyUnitType(type)); + this.#navyUnitNameDropdown = new Dropdown("navyunit-name-options", (name: string) => this.#setNavyUnitName(name)); + this.#navyUnitCountDropdown = new Dropdown("navyunit-count-options", (count: string) => this.#setNavyUnitCount(count)); + this.#navyUnitCountDropdown.setOptions(count); + this.#navyUnitCountDropdown.setValue("1"); document.addEventListener("mapContextMenuShow", (e: any) => { if (this.getVisibleSubMenu() !== e.detail.type) @@ -67,6 +103,20 @@ export class MapContextMenu extends ContextMenu { } }); + document.addEventListener("contextMenuDeployHelicopter", () => { + this.hide(); + this.#spawnOptions.coalition = getActiveCoalition(); + if (this.#spawnOptions) { + getMap().addTemporaryMarker(this.#spawnOptions.latlng, this.#spawnOptions.name, getActiveCoalition()); + var unitTable = {unitType: this.#spawnOptions.name, location: this.#spawnOptions.latlng, altitude: this.#spawnOptions.altitude, loadout: this.#spawnOptions.loadout}; + var units = []; + for (let i = 1; i < parseInt(this.#helicopterCountDropdown.getValue()) + 1; i++) { + units.push(unitTable); + } + spawnHelicopters(units, getActiveCoalition(), this.#spawnOptions.airbaseName, false); + } + }); + document.addEventListener("contextMenuDeployGroundUnit", () => { this.hide(); this.#spawnOptions.coalition = getActiveCoalition(); @@ -74,7 +124,7 @@ export class MapContextMenu extends ContextMenu { getMap().addTemporaryMarker(this.#spawnOptions.latlng, this.#spawnOptions.name, getActiveCoalition()); var unitTable = {unitType: this.#spawnOptions.name, location: this.#spawnOptions.latlng}; var units = []; - for (let i = 1; i < parseInt(this.#groundCountDropdown.getValue()) + 1; i++) { + for (let i = 1; i < parseInt(this.#groundUnitCountDropdown.getValue()) + 1; i++) { units.push(JSON.parse(JSON.stringify(unitTable))); unitTable.location.lat += 0.0001; } @@ -82,6 +132,21 @@ export class MapContextMenu extends ContextMenu { } }); + document.addEventListener("contextMenuDeployNavyUnits", () => { + this.hide(); + this.#spawnOptions.coalition = getActiveCoalition(); + if (this.#spawnOptions) { + getMap().addTemporaryMarker(this.#spawnOptions.latlng, this.#spawnOptions.name, getActiveCoalition()); + var unitTable = {unitType: this.#spawnOptions.name, location: this.#spawnOptions.latlng}; + var units = []; + for (let i = 1; i < parseInt(this.#navyUnitCountDropdown.getValue()) + 1; i++) { + units.push(JSON.parse(JSON.stringify(unitTable))); + unitTable.location.lat += 0.0001; + } + spawnNavyUnits(units, getActiveCoalition(), false); + } + }); + document.addEventListener("contextMenuDeploySmoke", (e: any) => { this.hide(); spawnSmoke(e.detail.color, this.getLatLng()); @@ -91,6 +156,14 @@ export class MapContextMenu extends ContextMenu { this.hide(); spawnExplosion(e.detail.strength, this.getLatLng()); }); + + document.addEventListener("editCoalitionArea", (e: any) => { + this.hide(); + if (this.#coalitionArea) { + getMap().deselectAllCoalitionAreas(); + this.#coalitionArea.setSelected(true); + } + }); this.hide(); } @@ -113,24 +186,35 @@ export class MapContextMenu extends ContextMenu { if (getUnitsManager().getCommandMode() !== GAME_MASTER) this.#coalitionSwitch.hide() + + this.getContainer()?.querySelector("#coalition-area-button")?.classList.toggle("hide", true); } showSubMenu(type: string) { this.getContainer()?.querySelector("#aircraft-spawn-menu")?.classList.toggle("hide", type !== "aircraft"); this.getContainer()?.querySelector("#aircraft-spawn-button")?.classList.toggle("is-open", type === "aircraft"); - this.getContainer()?.querySelector("#ground-unit-spawn-menu")?.classList.toggle("hide", type !== "ground-unit"); - this.getContainer()?.querySelector("#ground-ol-contexmenu-button")?.classList.toggle("is-open", type === "ground-unit"); + this.getContainer()?.querySelector("#helicopter-spawn-menu")?.classList.toggle("hide", type !== "helicopter"); + this.getContainer()?.querySelector("#helicopter-spawn-button")?.classList.toggle("is-open", type === "helicopter"); + this.getContainer()?.querySelector("#groundunit-spawn-menu")?.classList.toggle("hide", type !== "groundunit"); + this.getContainer()?.querySelector("#groundunit-spawn-button")?.classList.toggle("is-open", type === "groundunit"); + this.getContainer()?.querySelector("#navyunit-spawn-menu")?.classList.toggle("hide", type !== "navyunit"); + this.getContainer()?.querySelector("#navyunit-spawn-button")?.classList.toggle("is-open", type === "navyunit"); this.getContainer()?.querySelector("#smoke-spawn-menu")?.classList.toggle("hide", type !== "smoke"); this.getContainer()?.querySelector("#smoke-spawn-button")?.classList.toggle("is-open", type === "smoke"); this.getContainer()?.querySelector("#explosion-menu")?.classList.toggle("hide", type !== "explosion"); this.getContainer()?.querySelector("#explosion-spawn-button")?.classList.toggle("is-open", type === "explosion"); this.#resetAircraftRole(); - this.#resetAircraftType(); - this.#resetGroundUnitRole(); + this.#resetAircraftName(); + this.#resetHelicopterRole(); + this.#resetHelicopterName(); this.#resetGroundUnitType(); + this.#resetGroundUnitName(); + this.#resetNavyUnitType(); + this.#resetNavyUnitName(); this.#aircraftCountDropdown.setValue("1"); - this.#groundCountDropdown.setValue("1"); + this.#helicopterCountDropdown.setValue("1"); + this.#groundUnitCountDropdown.setValue("1"); this.clip(); this.setVisibleSubMenu(type); @@ -139,28 +223,38 @@ export class MapContextMenu extends ContextMenu { hideSubMenus() { this.getContainer()?.querySelector("#aircraft-spawn-menu")?.classList.toggle("hide", true); this.getContainer()?.querySelector("#aircraft-spawn-button")?.classList.toggle("is-open", false); - this.getContainer()?.querySelector("#ground-unit-spawn-menu")?.classList.toggle("hide", true); - this.getContainer()?.querySelector("#ground-ol-contexmenu-button")?.classList.toggle("is-open", false); + this.getContainer()?.querySelector("#helicopter-spawn-menu")?.classList.toggle("hide", true); + this.getContainer()?.querySelector("#helicopter-spawn-button")?.classList.toggle("is-open", false); + this.getContainer()?.querySelector("#groundunit-spawn-menu")?.classList.toggle("hide", true); + this.getContainer()?.querySelector("#groundunit-spawn-button")?.classList.toggle("is-open", false); + this.getContainer()?.querySelector("#navyunit-spawn-menu")?.classList.toggle("hide", true); + this.getContainer()?.querySelector("#navyunit-spawn-button")?.classList.toggle("is-open", false); this.getContainer()?.querySelector("#smoke-spawn-menu")?.classList.toggle("hide", true); this.getContainer()?.querySelector("#smoke-spawn-button")?.classList.toggle("is-open", false); this.getContainer()?.querySelector("#explosion-menu")?.classList.toggle("hide", true); this.getContainer()?.querySelector("#explosion-spawn-button")?.classList.toggle("is-open", false); this.#resetAircraftRole(); - this.#resetAircraftType(); - this.#resetGroundUnitRole(); + this.#resetAircraftName(); + this.#resetHelicopterRole(); + this.#resetHelicopterName(); + this.#resetHelicopterRole(); + this.#resetHelicopterName(); this.#resetGroundUnitType(); + this.#resetGroundUnitName(); + this.#resetNavyUnitType(); + this.#resetNavyUnitName(); this.clip(); this.setVisibleSubMenu(null); } showUpperBar() { - this.getContainer()?.querySelector("#upper-bar")?.classList.toggle("hide", false); + this.getContainer()?.querySelector(".upper-bar")?.classList.toggle("hide", false); } hideUpperBar() { - this.getContainer()?.querySelector("#upper-bar")?.classList.toggle("hide", true); + this.getContainer()?.querySelector(".upper-bar")?.classList.toggle("hide", true); } showAltitudeSlider() { @@ -179,6 +273,11 @@ export class MapContextMenu extends ContextMenu { this.#spawnOptions.latlng = latlng; } + setCoalitionArea(coalitionArea: CoalitionArea) { + this.#coalitionArea = coalitionArea; + this.getContainer()?.querySelector("#coalition-area-button")?.classList.toggle("hide", false); + } + #onSwitchClick(value: boolean) { value? setActiveCoalition("red"): setActiveCoalition("blue"); this.getContainer()?.querySelectorAll('[data-coalition]').forEach((element: any) => { element.setAttribute("data-coalition", getActiveCoalition()) }); @@ -193,45 +292,45 @@ export class MapContextMenu extends ContextMenu { /********* Aircraft spawn menu *********/ #setAircraftRole(role: string) { this.#spawnOptions.role = role; - this.#resetAircraftType(); - this.#aircraftTypeDropdown.setOptions(aircraftDatabase.getByRole(role).map((blueprint) => { return blueprint.label })); - this.#aircraftTypeDropdown.selectValue(0); + this.#resetAircraftName(); + this.#aircraftNameDropdown.setOptions(aircraftDatabase.getByRole(role).map((blueprint) => { return blueprint.label })); + this.#aircraftNameDropdown.selectValue(0); this.clip(); } #resetAircraftRole() { (this.getContainer()?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; - (this.getContainer()?.querySelector("#loadout-list")).replaceChildren(); + (this.getContainer()?.querySelector("#aircraft-loadout-list")).replaceChildren(); this.#aircraftRoleDropdown.reset(); - this.#aircraftTypeDropdown.reset(); + this.#aircraftNameDropdown.reset(); this.#aircraftRoleDropdown.setOptions(aircraftDatabase.getRoles()); this.clip(); } - #setAircraftType(label: string) { - this.#resetAircraftType(); - var type = aircraftDatabase.getByLabel(label)?.name || null; - if (type != null) { - this.#spawnOptions.name = type; - this.#aircraftLoadoutDropdown.setOptions(aircraftDatabase.getLoadoutNamesByRole(type, this.#spawnOptions.role)); + #setAircraftName(label: string) { + this.#resetAircraftName(); + var name = aircraftDatabase.getByLabel(label)?.name || null; + if (name != null) { + this.#spawnOptions.name = name; + this.#aircraftLoadoutDropdown.setOptions(aircraftDatabase.getLoadoutNamesByRole(name, this.#spawnOptions.role)); this.#aircraftLoadoutDropdown.selectValue(0); - var image = (this.getContainer()?.querySelector("#unit-image")); + var image = (this.getContainer()?.querySelector("#aircraft-unit-image")); image.src = `images/units/${aircraftDatabase.getByLabel(label)?.filename}`; image.classList.toggle("hide", false); } this.clip(); } - #setAircraftCount(count: string) { - this.#spawnOptions.count = parseInt(count); + #resetAircraftName() { + (this.getContainer()?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + (this.getContainer()?.querySelector("#aircraft-loadout-list")).replaceChildren(); + this.#aircraftLoadoutDropdown.reset(); + (this.getContainer()?.querySelector("#aircraft-unit-image")).classList.toggle("hide", true); this.clip(); } - #resetAircraftType() { - (this.getContainer()?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; - (this.getContainer()?.querySelector("#loadout-list")).replaceChildren(); - this.#aircraftLoadoutDropdown.reset(); - (this.getContainer()?.querySelector("#unit-image")).classList.toggle("hide", true); + #setAircraftCount(count: string) { + this.#spawnOptions.count = parseInt(count); this.clip(); } @@ -242,7 +341,7 @@ export class MapContextMenu extends ContextMenu { (this.getContainer()?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; var items = loadout.items.map((item: any) => { return `${item.quantity}x ${item.name}`; }); items.length == 0 ? items.push("Empty loadout") : ""; - (this.getContainer()?.querySelector("#loadout-list")).replaceChildren( + (this.getContainer()?.querySelector("#aircraft-loadout-list")).replaceChildren( ...items.map((item: any) => { var div = document.createElement('div'); div.innerText = item; @@ -253,45 +352,146 @@ export class MapContextMenu extends ContextMenu { this.clip(); } - /********* Ground unit spawn menu *********/ - #setGroundUnitRole(role: string) { + /********* Helicopter spawn menu *********/ + #setHelicopterRole(role: string) { this.#spawnOptions.role = role; - this.#resetGroundUnitType(); - - const types = groundUnitsDatabase.getByRole(role).map((blueprint) => { return blueprint.label }); - this.#groundUnitTypeDropdown.setOptions(types); - this.#groundUnitTypeDropdown.selectValue(0); + this.#resetHelicopterName(); + this.#helicopterNameDropdown.setOptions(helicopterDatabase.getByRole(role).map((blueprint) => { return blueprint.label })); + this.#helicopterNameDropdown.selectValue(0); this.clip(); } - #resetGroundUnitRole() { - (this.getContainer()?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; - (this.getContainer()?.querySelector("#loadout-list")).replaceChildren(); - this.#groundUnitRoleDropdown.reset(); - this.#groundUnitTypeDropdown.reset(); - - const roles = groundUnitsDatabase.getRoles(); - this.#groundUnitRoleDropdown.setOptions(roles); + #resetHelicopterRole() { + (this.getContainer()?.querySelector("#helicopter-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + (this.getContainer()?.querySelector("#helicopter-loadout-list")).replaceChildren(); + this.#helicopterRoleDropdown.reset(); + this.#helicopterNameDropdown.reset(); + this.#helicopterRoleDropdown.setOptions(helicopterDatabase.getRoles()); this.clip(); } - #setGroundUnitType(label: string) { - this.#resetGroundUnitType(); - var type = groundUnitsDatabase.getByLabel(label)?.name || null; - if (type != null) { - this.#spawnOptions.name = type; - (this.getContainer()?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; + #setHelicopterName(label: string) { + this.#resetHelicopterName(); + var name = helicopterDatabase.getByLabel(label)?.name || null; + if (name != null) { + this.#spawnOptions.name = name; + this.#helicopterLoadoutDropdown.setOptions(helicopterDatabase.getLoadoutNamesByRole(name, this.#spawnOptions.role)); + this.#helicopterLoadoutDropdown.selectValue(0); + var image = (this.getContainer()?.querySelector("#helicopter-unit-image")); + image.src = `images/units/${helicopterDatabase.getByLabel(label)?.filename}`; + image.classList.toggle("hide", false); } this.clip(); } - #setGroundCount(count: string) { + #resetHelicopterName() { + (this.getContainer()?.querySelector("#helicopter-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + (this.getContainer()?.querySelector("#helicopter-loadout-list")).replaceChildren(); + this.#helicopterLoadoutDropdown.reset(); + (this.getContainer()?.querySelector("#helicopter-unit-image")).classList.toggle("hide", true); + this.clip(); + } + + #setHelicopterCount(count: string) { this.#spawnOptions.count = parseInt(count); this.clip(); } + #setHelicopterLoadout(loadoutName: string) { + var loadout = helicopterDatabase.getLoadoutByName(this.#spawnOptions.name, loadoutName); + if (loadout) { + this.#spawnOptions.loadout = loadout.code; + (this.getContainer()?.querySelector("#helicopter-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; + var items = loadout.items.map((item: any) => { return `${item.quantity}x ${item.name}`; }); + items.length == 0 ? items.push("Empty loadout") : ""; + (this.getContainer()?.querySelector("#helicopter-loadout-list")).replaceChildren( + ...items.map((item: any) => { + var div = document.createElement('div'); + div.innerText = item; + return div; + }) + ) + } + this.clip(); + } + + /********* Groundunit spawn menu *********/ + #setGroundUnitType(role: string) { + this.#resetGroundUnitName(); + + const types = groundUnitDatabase.getByType(role).map((blueprint) => { return blueprint.label }); + this.#groundUnitNameDropdown.setOptions(types); + this.#groundUnitNameDropdown.selectValue(0); + this.clip(); + } + #resetGroundUnitType() { - (this.getContainer()?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + (this.getContainer()?.querySelector("#groundunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + this.#groundUnitTypeDropdown.reset(); + this.#groundUnitNameDropdown.reset(); + + const roles = groundUnitDatabase.getTypes(); + this.#groundUnitTypeDropdown.setOptions(roles); + this.clip(); + } + + #setGroundUnitName(label: string) { + this.#resetGroundUnitName(); + var type = groundUnitDatabase.getByLabel(label)?.name || null; + if (type != null) { + this.#spawnOptions.name = type; + (this.getContainer()?.querySelector("#groundunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; + } + this.clip(); + } + + #resetGroundUnitName() { + (this.getContainer()?.querySelector("#groundunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + this.clip(); + } + + #setGroundUnitCount(count: string) { + this.#spawnOptions.count = parseInt(count); + this.clip(); + } + + /********* Navyunit spawn menu *********/ + #setNavyUnitType(role: string) { + this.#resetNavyUnitName(); + + const types = navyUnitDatabase.getByType(role).map((blueprint) => { return blueprint.label }); + this.#navyUnitNameDropdown.setOptions(types); + this.#navyUnitNameDropdown.selectValue(0); + this.clip(); + } + + #resetNavyUnitType() { + (this.getContainer()?.querySelector("#navyunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + this.#navyUnitTypeDropdown.reset(); + this.#navyUnitNameDropdown.reset(); + + const roles = navyUnitDatabase.getTypes(); + this.#navyUnitTypeDropdown.setOptions(roles); + this.clip(); + } + + #setNavyUnitName(label: string) { + this.#resetNavyUnitName(); + var type = navyUnitDatabase.getByLabel(label)?.name || null; + if (type != null) { + this.#spawnOptions.name = type; + (this.getContainer()?.querySelector("#navyunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; + } + this.clip(); + } + + #resetNavyUnitName() { + (this.getContainer()?.querySelector("#navyunit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + this.clip(); + } + + #setNavyUnitCount(count: string) { + this.#spawnOptions.count = parseInt(count); this.clip(); } } \ No newline at end of file diff --git a/client/src/index.ts b/client/src/index.ts index 47742664..1e07d6d7 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -17,6 +17,7 @@ import { Dropdown } from "./controls/dropdown"; import { HotgroupPanel } from "./panels/hotgrouppanel"; import { SVGInjector } from "@tanem/svg-injector"; import { BLUE_COMMANDER, GAME_MASTER, RED_COMMANDER } from "./constants/constants"; +import { NavyUnitDatabase, navyUnitDatabase } from "./units/navyunitdatabase"; var map: Map; @@ -280,4 +281,5 @@ export function getInfoPopup() { return infoPopup; } -window.onload = setup; \ No newline at end of file +window.onload = setup; + diff --git a/client/src/map/coalitionarea.ts b/client/src/map/coalitionarea.ts index 27397061..cd45557b 100644 --- a/client/src/map/coalitionarea.ts +++ b/client/src/map/coalitionarea.ts @@ -17,6 +17,8 @@ export class CoalitionArea extends Polygon { options = {}; options.bubblingMouseEvents = false; + options.interactive = false; + super(latlngs, options); this.#setColors(); this.#registerCallbacks(); @@ -40,6 +42,7 @@ export class CoalitionArea extends Polygon { this.#selected = selected; this.#setColors(); this.#setHandles(); + this.setOpacity(selected? 1: 0.5); if (!this.getSelected() && this.getEditing()) { /* Remove the vertex we were working on */ var latlngs = this.getLatLngs()[0] as LatLng[]; @@ -67,16 +70,6 @@ export class CoalitionArea extends Polygon { return this.#editing; } - setInteractive(interactive: boolean) { - this.setOpacity(interactive? 1: 0.5); - this.options.interactive = interactive; - - if (interactive) - DomUtil.addClass(this.getElement() as HTMLElement, 'leaflet-interactive'); - else - DomUtil.removeClass(this.getElement() as HTMLElement, 'leaflet-interactive'); - } - addTemporaryLatLng(latlng: LatLng) { this.#activeIndex++; var latlngs = this.getLatLngs()[0] as LatLng[]; @@ -161,7 +154,6 @@ export class CoalitionArea extends Polygon { if (!this.getEditing()) { getMap().deselectAllCoalitionAreas(); this.setSelected(true); - getMap().showCoalitionAreaContextMenu(e, this); } else this.setEditing(false); diff --git a/client/src/map/map.ts b/client/src/map/map.ts index 06cc58c2..c3ff9608 100644 --- a/client/src/map/map.ts +++ b/client/src/map/map.ts @@ -12,7 +12,7 @@ import { DestinationPreviewMarker } from "./destinationpreviewmarker"; import { TemporaryUnitMarker } from "./temporaryunitmarker"; import { ClickableMiniMap } from "./clickableminimap"; import { SVGInjector } from '@tanem/svg-injector' -import { layers as mapLayers, mapBounds, minimapBoundaries, IDLE, COALITIONAREA_DRAW_POLYGON, visibilityControls, visibilityControlsTootlips, FIRE_AT_AREA, MOVE_UNIT, CARPET_BOMBING, BOMBING, COALITIONAREA_INTERACT } from "../constants/constants"; +import { layers as mapLayers, mapBounds, minimapBoundaries, IDLE, COALITIONAREA_DRAW_POLYGON, visibilityControls, visibilityControlsTootlips, FIRE_AT_AREA, MOVE_UNIT, CARPET_BOMBING, BOMBING } from "../constants/constants"; import { TargetMarker } from "./targetmarker"; import { CoalitionArea } from "./coalitionarea"; import { CoalitionAreaContextMenu } from "../controls/coalitionareacontextmenu"; @@ -116,16 +116,7 @@ export class Map extends L.Map { getUnitsManager().setHiddenType(ev.detail.type, !el?.classList.contains("off")); Object.values(getUnitsManager().getUnits()).forEach((unit: Unit) => unit.updateVisibility()); }); - - document.addEventListener("toggleCoalitionAreaInteraction", (ev: CustomEventInit) => { - const el = ev.detail._element; - /* Add listener to set the button to off if the state changes */ - document.addEventListener("mapStateChanged", () => el?.classList.toggle("off", !(this.getState() === COALITIONAREA_INTERACT))); - if (this.getState() !== COALITIONAREA_INTERACT) - this.setState(COALITIONAREA_INTERACT); - else - this.setState(IDLE); - }); + document.addEventListener("toggleCoalitionAreaDraw", (ev: CustomEventInit) => { const el = ev.detail._element; @@ -186,22 +177,12 @@ export class Map extends L.Map { this.#updateCursor(); /* Operations to perform if you are NOT in a state */ - if (this.#state !== COALITIONAREA_INTERACT) { - this.#coalitionAreas.forEach((coalitionArea: CoalitionArea) => { - coalitionArea.setInteractive(false); - }); - } if (this.#state !== COALITIONAREA_DRAW_POLYGON) { this.#deselectCoalitionAreas(); } /* Operations to perform if you ARE in a state */ - if (this.#state === COALITIONAREA_INTERACT) { - this.#coalitionAreas.forEach((coalitionArea: CoalitionArea) => { - coalitionArea.setInteractive(true); - }); - } - else if (this.#state === COALITIONAREA_DRAW_POLYGON) { + if (this.#state === COALITIONAREA_DRAW_POLYGON) { this.#coalitionAreas.push(new CoalitionArea([])); this.#coalitionAreas[this.#coalitionAreas.length - 1].addTo(this); } @@ -231,11 +212,9 @@ export class Map extends L.Map { this.hideCoalitionAreaContextMenu(); } - showMapContextMenu(e: any) { + showMapContextMenu(x: number, y: number, latlng: L.LatLng) { this.hideAllContextMenus(); - var x = e.originalEvent.x; - var y = e.originalEvent.y; - this.#mapContextMenu.show(x, y, e.latlng); + this.#mapContextMenu.show(x, y, latlng); document.dispatchEvent(new CustomEvent("mapContextMenu")); } @@ -248,11 +227,9 @@ export class Map extends L.Map { return this.#mapContextMenu; } - showUnitContextMenu(e: any) { + showUnitContextMenu(x: number, y: number, latlng: L.LatLng) { this.hideAllContextMenus(); - var x = e.originalEvent.x; - var y = e.originalEvent.y; - this.#unitContextMenu.show(x, y, e.latlng); + this.#unitContextMenu.show(x, y, latlng); } getUnitContextMenu() { @@ -263,11 +240,9 @@ export class Map extends L.Map { this.#unitContextMenu.hide(); } - showAirbaseContextMenu(e: any, airbase: Airbase) { + showAirbaseContextMenu(x: number, y: number, latlng: L.LatLng, airbase: Airbase) { this.hideAllContextMenus(); - var x = e.originalEvent.x; - var y = e.originalEvent.y; - this.#airbaseContextMenu.show(x, y, e.latlng); + this.#airbaseContextMenu.show(x, y, latlng); this.#airbaseContextMenu.setAirbase(airbase); } @@ -279,11 +254,9 @@ export class Map extends L.Map { this.#airbaseContextMenu.hide(); } - showCoalitionAreaContextMenu(e: any, coalitionArea: CoalitionArea) { + showCoalitionAreaContextMenu(x: number, y: number, latlng: L.LatLng, coalitionArea: CoalitionArea) { this.hideAllContextMenus(); - var x = e.originalEvent.x; - var y = e.originalEvent.y; - this.#coalitionAreaContextMenu.show(x, y, e.latlng); + this.#coalitionAreaContextMenu.show(x, y, latlng); this.#coalitionAreaContextMenu.setCoalitionArea(coalitionArea); } @@ -449,7 +422,15 @@ export class Map extends L.Map { this.hideMapContextMenu(); if (this.#state === IDLE) { if (this.#state == IDLE) { - this.showMapContextMenu(e); + this.showMapContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng); + for (let coalitionArea of this.#coalitionAreas) { + if (coalitionArea.getBounds().contains(e.latlng)) { + if (coalitionArea.getSelected()) + this.showCoalitionAreaContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, coalitionArea); + else + this.getMapContextMenu().setCoalitionArea(coalitionArea); + } + } } } else if (this.#state === MOVE_UNIT) { @@ -673,13 +654,13 @@ export class Map extends L.Map { this.#showDefaultCursor(); } else { /* Hide all the unnecessary cursors depending on the active state */ - if (this.#state !== IDLE && this.#state !== COALITIONAREA_INTERACT) this.#hideDefaultCursor(); + if (this.#state !== IDLE) this.#hideDefaultCursor(); if (this.#state !== MOVE_UNIT) this.#hideDestinationCursors(); if (![BOMBING, CARPET_BOMBING, FIRE_AT_AREA].includes(this.#state)) this.#hideTargetCursor(); if (this.#state !== COALITIONAREA_DRAW_POLYGON) this.#hideDrawingCursor(); /* Show the active cursor depending on the active state */ - if (this.#state === IDLE || this.#state === COALITIONAREA_INTERACT) this.#showDefaultCursor(); + if (this.#state === IDLE) this.#showDefaultCursor(); else if (this.#state === MOVE_UNIT) this.#showDestinationCursors(); else if ([BOMBING, CARPET_BOMBING, FIRE_AT_AREA].includes(this.#state)) this.#showTargetCursor(); else if (this.#state === COALITIONAREA_DRAW_POLYGON) this.#showDrawingCursor(); diff --git a/client/src/missionhandler/missionhandler.ts b/client/src/missionhandler/missionhandler.ts index cac749f1..48fd98d5 100644 --- a/client/src/missionhandler/missionhandler.ts +++ b/client/src/missionhandler/missionhandler.ts @@ -130,6 +130,6 @@ export class MissionHandler { } #onAirbaseClick(e: any) { - getMap().showAirbaseContextMenu(e, e.sourceTarget); + getMap().showAirbaseContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, e.sourceTarget); } } \ No newline at end of file diff --git a/client/src/other/utils.ts b/client/src/other/utils.ts index b8882a7c..2a50102b 100644 --- a/client/src/other/utils.ts +++ b/client/src/other/utils.ts @@ -3,7 +3,7 @@ import * as turf from "@turf/turf"; import { UnitDatabase } from "../units/unitdatabase"; import { aircraftDatabase } from "../units/aircraftdatabase"; import { helicopterDatabase } from "../units/helicopterdatabase"; -import { groundUnitsDatabase } from "../units/groundunitsdatabase"; +import { groundUnitDatabase } from "../units/groundunitdatabase"; import { Buffer } from "buffer"; import { ROEs, emissionsCountermeasures, reactionsToThreat, states } from "../constants/constants"; @@ -241,10 +241,10 @@ export function getMarkerCategoryByName(name: string) { return "aircraft"; else if (helicopterDatabase.getByName(name) != null) return "helicopter"; - else if (groundUnitsDatabase.getByName(name) != null){ + else if (groundUnitDatabase.getByName(name) != null){ // TODO this is very messy - var role = groundUnitsDatabase.getByName(name)?.loadouts[0].roles[0]; - return (role?.includes("SAM")) ? "groundunit-sam" : "groundunit-other"; + var type = groundUnitDatabase.getByName(name)?.type; + return (type?.includes("SAM")) ? "groundunit-sam" : "groundunit-other"; } else return "groundunit-other"; // TODO add other unit types @@ -256,7 +256,7 @@ export function getUnitDatabaseByCategory(category: string) { else if (category == "helicopter") return helicopterDatabase; else if (category.includes("groundunit")) - return groundUnitsDatabase; + return groundUnitDatabase; else return null; } diff --git a/client/src/panels/unitcontrolpanel.ts b/client/src/panels/unitcontrolpanel.ts index 582f7ddd..d25d7404 100644 --- a/client/src/panels/unitcontrolpanel.ts +++ b/client/src/panels/unitcontrolpanel.ts @@ -209,7 +209,7 @@ export class UnitControlPanel extends Panel { const radioCallsignNumberInput = this.#advancedSettingsDialog.querySelector("#radio-callsign-number")?.querySelector("input") as HTMLInputElement; const unit = units[0]; - const roles = aircraftDatabase.getByName(unit.getName())?.loadouts.map((loadout) => {return loadout.roles}) + const roles = aircraftDatabase.getByName(unit.getName())?.loadouts?.map((loadout) => {return loadout.roles}) const tanker = roles != undefined && Array.prototype.concat.apply([], roles)?.includes("Tanker"); const AWACS = roles != undefined && Array.prototype.concat.apply([], roles)?.includes("AWACS"); const radioMHz = Math.floor(unit.getRadio().frequency / 1000000); diff --git a/client/src/server/server.ts b/client/src/server/server.ts index d77df67d..52f64b87 100644 --- a/client/src/server/server.ts +++ b/client/src/server/server.ts @@ -145,15 +145,27 @@ export function spawnExplosion(intensity: number, latlng: LatLng) { POST(data, () => { }); } +export function spawnAircrafts(units: any, coalition: string, airbaseName: string, immediate: boolean) { + var command = { "units": units, "coalition": coalition, "airbaseName": airbaseName, "immediate": immediate }; + var data = { "spawnAircrafts": command } + POST(data, () => { }); +} + +export function spawnHelicopters(units: any, coalition: string, airbaseName: string, immediate: boolean) { + var command = { "units": units, "coalition": coalition, "airbaseName": airbaseName, "immediate": immediate }; + var data = { "spawnHelicopter": command } + POST(data, () => { }); +} + export function spawnGroundUnits(units: any, coalition: string, immediate: boolean) { var command = { "units": units, "coalition": coalition, "immediate": immediate }; var data = { "spawnGroundUnits": command } POST(data, () => { }); } -export function spawnAircrafts(units: any, coalition: string, airbaseName: string, immediate: boolean) { - var command = { "units": units, "coalition": coalition, "airbaseName": airbaseName, "immediate": immediate }; - var data = { "spawnAircrafts": command } +export function spawnNavyUnits(units: any, coalition: string, immediate: boolean) { + var command = { "units": units, "coalition": coalition, "immediate": immediate }; + var data = { "spawnNavyUnits": command } POST(data, () => { }); } diff --git a/client/src/units/aircraftdatabase.ts b/client/src/units/aircraftdatabase.ts index 6092ed81..a798d841 100644 --- a/client/src/units/aircraftdatabase.ts +++ b/client/src/units/aircraftdatabase.ts @@ -2123,7 +2123,7 @@ export class AircraftDatabase extends UnitDatabase { "AWACS" ], "code": "", - "name": "Blue Naval AWACS" + "name": "Blue Navy AWACS" } ], "filename": "e-2.png" @@ -3484,7 +3484,7 @@ export class AircraftDatabase extends UnitDatabase { }, "Su-33": { "name": "Su-33", - "label": "Su-33 Naval Flanker", + "label": "Su-33 Navy Flanker", "era": ["Late Cold War", "Modern"], "shortLabel": "33", "loadouts": [ diff --git a/client/src/units/groundunitdatabase.ts b/client/src/units/groundunitdatabase.ts new file mode 100644 index 00000000..a52f58fc --- /dev/null +++ b/client/src/units/groundunitdatabase.ts @@ -0,0 +1,1535 @@ +import { UnitDatabase } from "./unitdatabase" + +export class GroundUnitDatabase extends UnitDatabase { + constructor() { + super(); + this.blueprints = { + "SA-2 SAM Battery": { + "name": "SA-2 SAM Battery", + "era": [ + "Early Cold War" + ], + "label": "SA-2 SAM Battery", + "shortLabel": "SA-2 SAM Battery", + "range": "Long", + "filename": "", + "type": "SAM Sites" + }, + "SA-3 SAM Battery": { + "name": "SA-3 SAM Battery", + "era": [ + "Early Cold War" + ], + "label": "SA-3 SAM Battery", + "shortLabel": "SA-3 SAM Battery", + "range": "Medium", + "filename": "", + "type": "SAM Sites" + }, + "SA-6 SAM Battery": { + "name": "SA-6 SAM Battery", + "era": [ + "Mid Cold War" + ], + "label": "SA-6 SAM Battery", + "shortLabel": "SA-6 SAM Battery", + "range": "Medium", + "filename": "", + "type": "SAM Sites" + }, + "SA-10 SAM Battery": { + "name": "SA-10 SAM Battery", + "era": [ + "Late Cold War" + ], + "label": "SA-10 SAM Battery", + "shortLabel": "SA-10 SAM Battery", + "range": "Long", + "filename": "", + "type": "SAM Sites" + }, + "SA-11 SAM Battery": { + "name": "SA-11 SAM Battery", + "era": [ + "Late Cold War" + ], + "label": "SA-11 SAM Battery", + "shortLabel": "SA-11 SAM Battery", + "range": "Medium", + "filename": "", + "type": "SAM Sites" + }, + "Patriot site": { + "name": "Patriot site", + "era": [ + "Late Cold War" + ], + "label": "Patriot site", + "shortLabel": "Patriot site", + "range": "Long", + "filename": "", + "type": "SAM Sites" + }, + "Hawk SAM Battery": { + "name": "Hawk SAM Battery", + "era": [ + "Early Cold War" + ], + "label": "Hawk SAM Battery", + "shortLabel": "Hawk SAM Battery", + "range": "Medium", + "filename": "", + "type": "SAM Sites" + }, + "2B11 mortar": { + "name": "2B11 mortar", + "era": [ + "Late Cold War" + ], + "label": "2B11 mortar", + "shortLabel": "2B11 mortar", + "filename": "", + "type": "Gun Artillery" + }, + "SAU Gvozdika": { + "name": "SAU Gvozdika", + "era": [ + "Mid Cold War" + ], + "label": "SAU Gvozdika", + "shortLabel": "SAU Gvozdika", + "filename": "", + "type": "Gun Artillery" + }, + "SAU Msta": { + "name": "SAU Msta", + "era": [ + "Late Cold War" + ], + "label": "SAU Msta", + "shortLabel": "SAU Msta", + "filename": "", + "type": "Gun Artillery" + }, + "SAU Akatsia": { + "name": "SAU Akatsia", + "era": [ + "Mid Cold War" + ], + "label": "SAU Akatsia", + "shortLabel": "SAU Akatsia", + "filename": "", + "type": "Gun Artillery" + }, + "SAU 2-C9": { + "name": "SAU 2-C9", + "era": [ + "Mid Cold War" + ], + "label": "SAU Nona", + "shortLabel": "SAU Nona", + "filename": "", + "type": "Gun Artillery" + }, + "M-109": { + "name": "M-109", + "era": [ + "Early Cold War" + ], + "label": "M-109 Paladin", + "shortLabel": "M-109", + "filename": "", + "type": "Gun Artillery" + }, + "AAV7": { + "name": "AAV7", + "era": [ + "Mid Cold War" + ], + "label": "AAV7", + "shortLabel": "AAV7", + "filename": "", + "type": "APC" + }, + "BMD-1": { + "name": "BMD-1", + "era": [ + "Mid Cold War" + ], + "label": "BMD-1", + "shortLabel": "BMD-1", + "filename": "", + "type": "IFV" + }, + "BMP-1": { + "name": "BMP-1", + "era": [ + "Mid Cold War" + ], + "label": "BMP-1", + "shortLabel": "BMP-1", + "filename": "", + "type": "IFV" + }, + "BMP-2": { + "name": "BMP-2", + "era": [ + "Mid Cold War" + ], + "label": "BMP-2", + "shortLabel": "BMP-2", + "filename": "", + "type": "IFV" + }, + "BMP-3": { + "name": "BMP-3", + "era": [ + "Late Cold War" + ], + "label": "BMP-3", + "shortLabel": "BMP-3", + "filename": "", + "type": "IFV" + }, + "Boman": { + "name": "Boman", + "era": [ + "Late Cold War" + ], + "label": "Grad Fire Direction Manager", + "shortLabel": "Boman", + "filename": "", + "type": "Reconnaissance" + }, + "BRDM-2": { + "name": "BRDM-2", + "era": [ + "Early Cold War" + ], + "label": "BRDM-2", + "shortLabel": "BRDM-2", + "filename": "", + "type": "Reconnaissance" + }, + "BTR-80": { + "name": "BTR-80", + "era": [ + "Late Cold War" + ], + "label": "BTR-80", + "shortLabel": "BTR-80", + "filename": "", + "type": "APC" + }, + "BTR_D": { + "name": "BTR_D", + "era": [ + "Mid Cold War" + ], + "label": "BTR_D", + "shortLabel": "BTR_D", + "filename": "", + "type": "APC" + }, + "Bunker": { + "name": "Bunker", + "label": "Bunker", + "shortLabel": "Bunker", + "filename": "", + "type": "Static" + }, + "Cobra": { + "name": "Cobra", + "era": [ + "Modern" + ], + "label": "Otokar Cobra", + "shortLabel": "Cobra", + "filename": "", + "type": "Reconnaissance" + }, + "LAV-25": { + "name": "LAV-25", + "era": [ + "Late Cold War" + ], + "label": "LAV-25", + "shortLabel": "LAV-25", + "filename": "", + "type": "IFV" + }, + "M1043 HMMWV Armament": { + "name": "M1043 HMMWV Armament", + "era": [ + "Late Cold War" + ], + "label": "HMMWV M2 Browning", + "shortLabel": "HMMWV M2", + "filename": "", + "type": "Reconnaissance" + }, + "M1045 HMMWV TOW": { + "name": "M1045 HMMWV TOW", + "era": [ + "Late Cold War" + ], + "label": "HMMWV TOW", + "shortLabel": "HMMWV TOW", + "filename": "", + "type": "Reconnaissance" + }, + "M1126 Stryker ICV": { + "name": "M1126 Stryker ICV", + "era": [ + "Modern" + ], + "label": "Stryker MG", + "shortLabel": "Stryker MG", + "filename": "", + "type": "APC" + }, + "M-113": { + "name": "M-113", + "era": [ + "Early Cold War" + ], + "label": "M-113", + "shortLabel": "M-113", + "filename": "", + "type": "APC" + }, + "M1134 Stryker ATGM": { + "name": "M1134 Stryker ATGM", + "era": [ + "Modern" + ], + "label": "Stryker ATGM", + "shortLabel": "Stryker ATGM", + "filename": "", + "type": "IFV" + }, + "M-2 Bradley": { + "name": "M-2 Bradley", + "era": [ + "Late Cold War" + ], + "label": "M-2A2 Bradley", + "shortLabel": "M-2 Bradley", + "filename": "", + "type": "IFV" + }, + "Marder": { + "name": "Marder", + "era": [ + "Late Cold War" + ], + "label": "Marder", + "shortLabel": "Marder", + "filename": "", + "type": "IFV" + }, + "MCV-80": { + "name": "MCV-80", + "era": [ + "Late Cold War" + ], + "label": "Warrior IFV", + "shortLabel": "Warrior", + "filename": "", + "type": "IFV" + }, + "MTLB": { + "name": "MTLB", + "era": [ + "Mid Cold War" + ], + "label": "MT-LB", + "shortLabel": "MT-LB", + "filename": "", + "type": "APC" + }, + "Paratrooper RPG-16": { + "name": "Paratrooper RPG-16", + "era": [ + "Modern" + ], + "label": "Paratrooper RPG-16", + "shortLabel": "Paratrooper RPG-16", + "filename": "", + "type": "Infantry" + }, + "Paratrooper AKS-74": { + "name": "Paratrooper AKS-74", + "era": [ + "Modern" + ], + "label": "Paratrooper AKS-74", + "shortLabel": "Paratrooper AKS-74", + "filename": "", + "type": "Infantry" + }, + "Sandbox": { + "name": "Sandbox", + "label": "Sandbox", + "shortLabel": "Sandbox", + "filename": "", + "type": "Static" + }, + "Soldier AK": { + "name": "Soldier AK", + "era": [ + "Early Cold War" + ], + "label": "Soldier AK", + "shortLabel": "Soldier AK", + "filename": "", + "type": "Infantry" + }, + "Infantry AK": { + "name": "Infantry AK", + "era": [ + "Mid Cold War" + ], + "label": "Infantry AK", + "shortLabel": "Infantry AK", + "filename": "", + "type": "Infantry" + }, + "Soldier M249": { + "name": "Soldier M249", + "era": [ + "Late Cold War" + ], + "label": "Soldier M249", + "shortLabel": "Soldier M249", + "filename": "", + "type": "Infantry" + }, + "Soldier M4": { + "name": "Soldier M4", + "era": [ + "Mid Cold War" + ], + "label": "Soldier M4", + "shortLabel": "Soldier M4", + "filename": "", + "type": "Infantry" + }, + "Soldier M4 GRG": { + "name": "Soldier M4 GRG", + "era": [ + "Mid Cold War" + ], + "label": "Soldier M4 GRG", + "shortLabel": "Soldier M4 GRG", + "filename": "", + "type": "Infantry" + }, + "Soldier RPG": { + "name": "Soldier RPG", + "era": [ + "Mid Cold War" + ], + "label": "Soldier RPG", + "shortLabel": "Soldier RPG", + "filename": "", + "type": "Infantry" + }, + "TPZ": { + "name": "TPZ", + "era": [ + "Late Cold War" + ], + "label": "TPz Fuchs", + "shortLabel": "TPz Fuchs", + "filename": "", + "type": "APC" + }, + "Grad-URAL": { + "name": "Grad-URAL", + "era": [ + "Mid Cold War" + ], + "label": "Grad", + "shortLabel": "Grad", + "filename": "", + "type": "Rocket Artillery" + }, + "Uragan_BM-27": { + "name": "Uragan_BM-27", + "era": [ + "Late Cold War" + ], + "label": "Uragan", + "shortLabel": "Uragan", + "filename": "", + "type": "Rocket Artillery" + }, + "Smerch": { + "name": "Smerch", + "era": [ + "Late Cold War" + ], + "label": "Smerch", + "shortLabel": "Smerch", + "filename": "", + "type": "Rocket Artillery" + }, + "MLRS": { + "name": "MLRS", + "era": [ + "Late Cold War" + ], + "label": "M270", + "shortLabel": "M270", + "filename": "", + "type": "Rocket Artillery" + }, + "2S6 Tunguska": { + "name": "2S6 Tunguska", + "era": [ + "Late Cold War" + ], + "label": "SA-19 Tunguska", + "shortLabel": "SA-19", + "range": "Short", + "filename": "", + "type": "AAA/SAM" + }, + "Kub 2P25 ln": { + "name": "Kub 2P25 ln", + "era": [ + "Late Cold War" + ], + "label": "SA-6 Kub 2P25 ln", + "shortLabel": "Kub 2P25 ln", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "5p73 s-125 ln": { + "name": "5p73 s-125 ln", + "era": [ + "Early Cold War" + ], + "label": "SA-3 5p73 s-125 ln", + "shortLabel": "5p73 s-125 ln", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "S-300PS 5P85C ln": { + "name": "S-300PS 5P85C ln", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 5P85C ln", + "shortLabel": "S-300PS 5P85C ln", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "S-300PS 5P85D ln": { + "name": "S-300PS 5P85D ln", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 5P85D ln", + "shortLabel": "S-300PS 5P85D ln", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "SA-11 Buk LN 9A310M1": { + "name": "SA-11 Buk LN 9A310M1", + "era": [ + "Late Cold War" + ], + "label": "SA-11 Buk LN 9A310M1", + "shortLabel": "SA-11 Buk LN 9A310M1", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "Osa 9A33 ln": { + "name": "Osa 9A33 ln", + "era": [ + "Mid Cold War" + ], + "label": "SA-8 Osa 9A33 ln", + "shortLabel": "Osa 9A33 ln", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "Tor 9A331": { + "name": "Tor 9A331", + "era": [ + "Late Cold War" + ], + "label": "SA-15 Tor 9A331", + "shortLabel": "Tor 9A331", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "Strela-10M3": { + "name": "Strela-10M3", + "era": [ + "Late Cold War" + ], + "label": "SA-13 Strela-10M3", + "shortLabel": "Strela-10M3", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "Strela-1 9P31": { + "name": "Strela-1 9P31", + "era": [ + "Late Cold War" + ], + "label": "SA-9 Strela-1 9P31", + "shortLabel": "Strela-1 9P31", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "SA-11 Buk CC 9S470M1": { + "name": "SA-11 Buk CC 9S470M1", + "era": [ + "Late Cold War" + ], + "label": "SA-11 Buk CC 9S470M1", + "shortLabel": "SA-11 Buk CC 9S470M1", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "SA-8 Osa LD 9T217": { + "name": "SA-8 Osa LD 9T217", + "era": [ + "Late Cold War" + ], + "label": "SA-8 Osa LD 9T217", + "shortLabel": "SA-8 Osa LD 9T217", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "Patriot AMG": { + "name": "Patriot AMG", + "era": [ + "Modern" + ], + "label": "Patriot AMG", + "shortLabel": "Patriot AMG", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Patriot ECS": { + "name": "Patriot ECS", + "era": [ + "Modern" + ], + "label": "Patriot ECS", + "shortLabel": "Patriot ECS", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Gepard": { + "name": "Gepard", + "era": [ + "Late Cold War", + "Modern" + ], + "label": "Gepard", + "shortLabel": "Gepard", + "filename": "", + "type": "AAA" + }, + "Hawk pcp": { + "name": "Hawk pcp", + "era": [ + "Late Cold War" + ], + "label": "Hawk pcp", + "shortLabel": "Hawk pcp", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "SA-18 Igla manpad": { + "name": "SA-18 Igla manpad", + "era": [ + "Late Cold War" + ], + "label": "SA-18 Igla manpad", + "shortLabel": "SA-18 Igla manpad", + "range": "Short", + "filename": "", + "type": "MANPADS" + }, + "Igla manpad INS": { + "name": "Igla manpad INS", + "era": [ + "Late Cold War" + ], + "label": "SA-18 Igla manpad INS", + "shortLabel": "Igla manpad INS", + "range": "Short", + "filename": "", + "type": "MANPADS" + }, + "SA-18 Igla-S manpad": { + "name": "SA-18 Igla-S manpad", + "era": [ + "Late Cold War" + ], + "label": "SA-18 Igla-S manpad", + "shortLabel": "SA-18 Igla-S manpad", + "range": "Short", + "filename": "", + "type": "MANPADS" + }, + "Vulcan": { + "name": "Vulcan", + "era": [ + "Late Cold War" + ], + "label": "Vulcan", + "shortLabel": "Vulcan", + "filename": "", + "type": "AAA" + }, + "Hawk ln": { + "name": "Hawk ln", + "era": [ + "Late Cold War" + ], + "label": "Hawk ln", + "shortLabel": "Hawk ln", + "filename": "", + "type": "SAM" + }, + "M48 Chaparral": { + "name": "M48 Chaparral", + "era": [ + "Late Cold War" + ], + "label": "M48 Chaparral", + "shortLabel": "M48 Chaparral", + "filename": "", + "type": "SAM" + }, + "M6 Linebacker": { + "name": "M6 Linebacker", + "era": [ + "Late Cold War" + ], + "label": "M6 Linebacker", + "shortLabel": "M6 Linebacker", + "filename": "", + "type": "SAM" + }, + "Patriot ln": { + "name": "Patriot ln", + "era": [ + "Late Cold War" + ], + "label": "Patriot ln", + "shortLabel": "Patriot ln", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "M1097 Avenger": { + "name": "M1097 Avenger", + "era": [ + "Modern" + ], + "label": "M1097 Avenger", + "shortLabel": "M1097 Avenger", + "filename": "", + "type": "SAM" + }, + "Patriot EPP": { + "name": "Patriot EPP", + "era": [ + "Late Cold War" + ], + "label": "Patriot EPP", + "shortLabel": "Patriot EPP", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Patriot cp": { + "name": "Patriot cp", + "era": [ + "Late Cold War" + ], + "label": "Patriot cp", + "shortLabel": "Patriot cp", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Roland ADS": { + "name": "Roland ADS", + "era": [ + "Late Cold War" + ], + "label": "Roland ADS", + "shortLabel": "Roland ADS", + "filename": "", + "type": "SAM" + }, + "S-300PS 54K6 cp": { + "name": "S-300PS 54K6 cp", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 54K6 cp", + "shortLabel": "S-300PS 54K6 cp", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Stinger manpad GRG": { + "name": "Stinger manpad GRG", + "era": [ + "Late Cold War" + ], + "label": "Stinger manpad GRG", + "shortLabel": "Stinger manpad GRG", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "Stinger manpad dsr": { + "name": "Stinger manpad dsr", + "era": [ + "Late Cold War" + ], + "label": "Stinger manpad dsr", + "shortLabel": "Stinger manpad dsr", + "range": "Short", + "filename": "", + "type": "MANPADS" + }, + "Stinger comm dsr": { + "name": "Stinger comm dsr", + "era": [ + "Late Cold War" + ], + "label": "Stinger comm dsr", + "shortLabel": "Stinger comm dsr", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "Stinger manpad": { + "name": "Stinger manpad", + "era": [ + "Late Cold War" + ], + "label": "Stinger manpad", + "shortLabel": "Stinger manpad", + "range": "Short", + "filename": "", + "type": "MANPADS" + }, + "Stinger comm": { + "name": "Stinger comm", + "era": [ + "Late Cold War" + ], + "label": "Stinger comm", + "shortLabel": "Stinger comm", + "range": "Short", + "filename": "", + "type": "SAM" + }, + "ZSU-23-4 Shilka": { + "name": "ZSU-23-4 Shilka", + "era": [ + "Late Cold War" + ], + "label": "ZSU-23-4 Shilka", + "shortLabel": "ZSU-23-4 Shilka", + "filename": "", + "type": "AAA" + }, + "ZU-23 Emplacement Closed": { + "name": "ZU-23 Emplacement Closed", + "era": [ + "Late Cold War" + ], + "label": "ZU-23 Emplacement Closed", + "shortLabel": "ZU-23 Emplacement Closed", + "filename": "", + "type": "AAA" + }, + "ZU-23 Emplacement": { + "name": "ZU-23 Emplacement", + "era": [ + "Late Cold War" + ], + "label": "ZU-23 Emplacement", + "shortLabel": "ZU-23 Emplacement", + "filename": "", + "type": "AAA" + }, + "ZU-23 Closed Insurgent": { + "name": "ZU-23 Closed Insurgent", + "era": [ + "Late Cold War" + ], + "label": "ZU-23 Closed Insurgent", + "shortLabel": "ZU-23 Closed Insurgent", + "filename": "", + "type": "AAA" + }, + "Ural-375 ZU-23 Insurgent": { + "name": "Ural-375 ZU-23 Insurgent", + "era": [ + "Late Cold War" + ], + "label": "Ural-375 ZU-23 Insurgent", + "shortLabel": "Ural-375 ZU-23 Insurgent", + "filename": "", + "type": "AAA" + }, + "ZU-23 Insurgent": { + "name": "ZU-23 Insurgent", + "era": [ + "Late Cold War" + ], + "label": "ZU-23 Insurgent", + "shortLabel": "ZU-23 Insurgent", + "filename": "", + "type": "AAA" + }, + "Ural-375 ZU-23": { + "name": "Ural-375 ZU-23", + "era": [ + "Late Cold War" + ], + "label": "Ural-375 ZU-23", + "shortLabel": "Ural-375 ZU-23", + "filename": "", + "type": "AAA" + }, + "1L13 EWR": { + "name": "1L13 EWR", + "era": [ + "Late Cold War" + ], + "label": "1L13 EWR", + "shortLabel": "1L13 EWR", + "filename": "", + "type": "Radar" + }, + "Kub 1S91 str": { + "name": "Kub 1S91 str", + "era": [ + "Mid Cold War" + ], + "label": "SA-6 Kub 1S91 str", + "shortLabel": "Kub 1S91 str", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "S-300PS 40B6M tr": { + "name": "S-300PS 40B6M tr", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 40B6M tr", + "shortLabel": "S-300PS 40B6M tr", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "S-300PS 40B6MD sr": { + "name": "S-300PS 40B6MD sr", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 40B6MD sr", + "shortLabel": "S-300PS 40B6MD sr", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "55G6 EWR": { + "name": "55G6 EWR", + "era": [ + "Early Cold War" + ], + "label": "55G6 EWR", + "shortLabel": "55G6 EWR", + "filename": "", + "type": "Radar" + }, + "S-300PS 64H6E sr": { + "name": "S-300PS 64H6E sr", + "era": [ + "Late Cold War" + ], + "label": "SA-10 S-300PS 64H6E sr", + "shortLabel": "S-300PS 64H6E sr", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "SA-11 Buk SR 9S18M1": { + "name": "SA-11 Buk SR 9S18M1", + "era": [ + "Mid Cold War" + ], + "label": "SA-11 Buk SR 9S18M1", + "shortLabel": "SA-11 Buk SR 9S18M1", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Dog Ear radar": { + "name": "Dog Ear radar", + "era": [ + "Mid Cold War" + ], + "label": "Dog Ear radar", + "shortLabel": "Dog Ear radar", + "filename": "", + "type": "SAM" + }, + "Hawk tr": { + "name": "Hawk tr", + "era": [ + "Early Cold War" + ], + "label": "Hawk tr", + "shortLabel": "Hawk tr", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "Hawk sr": { + "name": "Hawk sr", + "era": [ + "Early Cold War" + ], + "label": "Hawk sr", + "shortLabel": "Hawk sr", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "Patriot str": { + "name": "Patriot str", + "era": [ + "Late Cold War" + ], + "label": "Patriot str", + "shortLabel": "Patriot str", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "Hawk cwar": { + "name": "Hawk cwar", + "era": [ + "Early Cold War" + ], + "label": "Hawk cwar", + "shortLabel": "Hawk cwar", + "range": "Long", + "filename": "", + "type": "SAM" + }, + "p-19 s-125 sr": { + "name": "p-19 s-125 sr", + "era": [ + "Mid Cold War" + ], + "label": "SA-3 p-19 s-125 sr", + "shortLabel": "p-19 s-125 sr", + "filename": "", + "type": "SAM" + }, + "Roland Radar": { + "name": "Roland Radar", + "era": [ + "Mid Cold War" + ], + "label": "Roland Radar", + "shortLabel": "Roland Radar", + "filename": "", + "type": "SAM" + }, + "snr s-125 tr": { + "name": "snr s-125 tr", + "era": [ + "Early Cold War" + ], + "label": "SA-3 snr s-125 tr", + "shortLabel": "snr s-125 tr", + "range": "Medium", + "filename": "", + "type": "SAM" + }, + "house1arm": { + "name": "house1arm", + "label": "house1arm", + "shortLabel": "house1arm", + "filename": "", + "type": "Structure" + }, + "house2arm": { + "name": "house2arm", + "label": "house2arm", + "shortLabel": "house2arm", + "filename": "", + "type": "Structure" + }, + "outpost_road": { + "name": "outpost_road", + "label": "outpost_road", + "shortLabel": "outpost_road", + "filename": "", + "type": "Structure" + }, + "outpost": { + "name": "outpost", + "label": "outpost", + "shortLabel": "outpost", + "filename": "", + "type": "Structure" + }, + "houseA_arm": { + "name": "houseA_arm", + "label": "houseA_arm", + "shortLabel": "houseA_arm", + "filename": "", + "type": "Structure" + }, + "Challenger2": { + "name": "Challenger2", + "era": [ + "Modern" + ], + "label": "Challenger2", + "shortLabel": "Challenger2", + "filename": "", + "type": "Tank" + }, + "Leclerc": { + "name": "Leclerc", + "era": [ + "Modern" + ], + "label": "Leclerc", + "shortLabel": "Leclerc", + "filename": "", + "type": "Tank" + }, + "Leopard1A3": { + "name": "Leopard1A3", + "era": [ + "Mid Cold War" + ], + "label": "Leopard1A3", + "shortLabel": "Leopard1A3", + "filename": "", + "type": "Tank" + }, + "Leopard-2": { + "name": "Leopard-2", + "era": [ + "Late Cold War" + ], + "label": "Leopard-2", + "shortLabel": "Leopard-2", + "filename": "", + "type": "Tank" + }, + "M-60": { + "name": "M-60", + "era": [ + "Early Cold War" + ], + "label": "M-60", + "shortLabel": "M-60", + "filename": "", + "type": "Tank" + }, + "M1128 Stryker MGS": { + "name": "M1128 Stryker MGS", + "era": [ + "Modern" + ], + "label": "M1128 Stryker MGS", + "shortLabel": "M1128 Stryker MGS", + "filename": "", + "type": "SPG" + }, + "M-1 Abrams": { + "name": "M-1 Abrams", + "era": [ + "Late Cold War" + ], + "label": "M-1 Abrams", + "shortLabel": "M-1 Abrams", + "filename": "", + "type": "Tank" + }, + "T-55": { + "name": "T-55", + "era": [ + "Early Cold War" + ], + "label": "T-55", + "shortLabel": "T-55", + "filename": "", + "type": "Tank" + }, + "T-72B": { + "name": "T-72B", + "era": [ + "Mid Cold War" + ], + "label": "T-72B", + "shortLabel": "T-72B", + "filename": "", + "type": "Tank" + }, + "T-80UD": { + "name": "T-80UD", + "era": [ + "Mid Cold War" + ], + "label": "T-80UD", + "shortLabel": "T-80UD", + "filename": "", + "type": "Tank" + }, + "T-90": { + "name": "T-90", + "era": [ + "Late Cold War" + ], + "label": "T-90", + "shortLabel": "T-90", + "filename": "", + "type": "Tank" + }, + "Ural-4320 APA-5D": { + "name": "Ural-4320 APA-5D", + "era": [ + "Early Cold War" + ], + "label": "Ural-4320 APA-5D", + "shortLabel": "Ural-4320 APA-5D", + "filename": "", + "type": "Unarmed" + }, + "ATMZ-5": { + "name": "ATMZ-5", + "era": [ + "Early Cold War" + ], + "label": "ATMZ-5", + "shortLabel": "ATMZ-5", + "filename": "", + "type": "Unarmed" + }, + "ATZ-10": { + "name": "ATZ-10", + "era": [ + "Early Cold War" + ], + "label": "ATZ-10", + "shortLabel": "ATZ-10", + "filename": "", + "type": "Unarmed" + }, + "GAZ-3307": { + "name": "GAZ-3307", + "era": [ + "Early Cold War" + ], + "label": "GAZ-3307", + "shortLabel": "GAZ-3307", + "filename": "", + "type": "Unarmed" + }, + "GAZ-3308": { + "name": "GAZ-3308", + "era": [ + "Early Cold War" + ], + "label": "GAZ-3308", + "shortLabel": "GAZ-3308", + "filename": "", + "type": "Unarmed" + }, + "GAZ-66": { + "name": "GAZ-66", + "era": [ + "Early Cold War" + ], + "label": "GAZ-66", + "shortLabel": "GAZ-66", + "filename": "", + "type": "Unarmed" + }, + "M978 HEMTT Tanker": { + "name": "M978 HEMTT Tanker", + "era": [ + "Mid Cold War" + ], + "label": "M978 HEMTT Tanker", + "shortLabel": "M978 HEMTT Tanker", + "filename": "", + "type": "Unarmed" + }, + "HEMTT TFFT": { + "name": "HEMTT TFFT", + "era": [ + "Late Cold War" + ], + "label": "HEMTT TFFT", + "shortLabel": "HEMTT TFFT", + "filename": "", + "type": "Unarmed" + }, + "IKARUS Bus": { + "name": "IKARUS Bus", + "era": [ + "Mid Cold War" + ], + "label": "IKARUS Bus", + "shortLabel": "IKARUS Bus", + "filename": "", + "type": "Unarmed" + }, + "KAMAZ Truck": { + "name": "KAMAZ Truck", + "era": [ + "Mid Cold War" + ], + "label": "KAMAZ Truck", + "shortLabel": "KAMAZ Truck", + "filename": "", + "type": "Unarmed" + }, + "LAZ Bus": { + "name": "LAZ Bus", + "era": [ + "Early Cold War" + ], + "label": "LAZ Bus", + "shortLabel": "LAZ Bus", + "filename": "", + "type": "Unarmed" + }, + "Hummer": { + "name": "Hummer", + "era": [ + "Mid Cold War" + ], + "label": "Hummer", + "shortLabel": "Hummer", + "filename": "", + "type": "Unarmed" + }, + "M 818": { + "name": "M 818", + "era": [ + "Early Cold War" + ], + "label": "M 818", + "shortLabel": "M 818", + "filename": "", + "type": "Unarmed" + }, + "MAZ-6303": { + "name": "MAZ-6303", + "era": [ + "Mid Cold War" + ], + "label": "MAZ-6303", + "shortLabel": "MAZ-6303", + "filename": "", + "type": "Unarmed" + }, + "Predator GCS": { + "name": "Predator GCS", + "era": [ + "Late Cold War" + ], + "label": "Predator GCS", + "shortLabel": "Predator GCS", + "filename": "", + "type": "Unarmed" + }, + "Predator TrojanSpirit": { + "name": "Predator TrojanSpirit", + "era": [ + "Late Cold War" + ], + "label": "Predator TrojanSpirit", + "shortLabel": "Predator TrojanSpirit", + "filename": "", + "type": "Unarmed" + }, + "Suidae": { + "name": "Suidae", + "era": [ + "Late Cold War" + ], + "label": "Suidae", + "shortLabel": "Suidae", + "filename": "", + "type": "Unarmed" + }, + "Tigr_233036": { + "name": "Tigr_233036", + "era": [ + "Late Cold War" + ], + "label": "Tigr_233036", + "shortLabel": "Tigr_233036", + "filename": "", + "type": "Unarmed" + }, + "Trolley bus": { + "name": "Trolley bus", + "era": [ + "Late Cold War" + ], + "label": "Trolley bus", + "shortLabel": "Trolley bus", + "filename": "", + "type": "Unarmed" + }, + "UAZ-469": { + "name": "UAZ-469", + "era": [ + "Mid Cold War" + ], + "label": "UAZ-469", + "shortLabel": "UAZ-469", + "filename": "", + "type": "Unarmed" + }, + "Ural ATsP-6": { + "name": "Ural ATsP-6", + "era": [ + "Mid Cold War" + ], + "label": "Ural ATsP-6", + "shortLabel": "Ural ATsP-6", + "filename": "", + "type": "Unarmed" + }, + "Ural-375 PBU": { + "name": "Ural-375 PBU", + "era": [ + "Mid Cold War" + ], + "label": "Ural-375 PBU", + "shortLabel": "Ural-375 PBU", + "filename": "", + "type": "Unarmed" + }, + "Ural-375": { + "name": "Ural-375", + "era": [ + "Mid Cold War" + ], + "label": "Ural-375", + "shortLabel": "Ural-375", + "filename": "", + "type": "Unarmed" + }, + "Ural-4320-31": { + "name": "Ural-4320-31", + "era": [ + "Late Cold War" + ], + "label": "Ural-4320-31", + "shortLabel": "Ural-4320-31", + "filename": "", + "type": "Unarmed" + }, + "Ural-4320T": { + "name": "Ural-4320T", + "era": [ + "Late Cold War" + ], + "label": "Ural-4320T", + "shortLabel": "Ural-4320T", + "filename": "", + "type": "Unarmed" + }, + "VAZ Car": { + "name": "VAZ Car", + "era": [ + "Early Cold War" + ], + "label": "VAZ Car", + "shortLabel": "VAZ Car", + "filename": "", + "type": "Unarmed" + }, + "ZiL-131 APA-80": { + "name": "ZiL-131 APA-80", + "era": [ + "Early Cold War" + ], + "label": "ZiL-131 APA-80", + "shortLabel": "ZiL-131 APA-80", + "filename": "", + "type": "Unarmed" + }, + "SKP-11": { + "name": "SKP-11", + "era": [ + "Early Cold War" + ], + "label": "SKP-11", + "shortLabel": "SKP-11", + "filename": "", + "type": "Unarmed" + }, + "ZIL-131 KUNG": { + "name": "ZIL-131 KUNG", + "era": [ + "Early Cold War" + ], + "label": "ZIL-131 KUNG", + "shortLabel": "ZIL-131 KUNG", + "filename": "", + "type": "Unarmed" + }, + "ZIL-4331": { + "name": "ZIL-4331", + "era": [ + "Early Cold War" + ], + "label": "ZIL-4331", + "shortLabel": "ZIL-4331", + "filename": "", + "type": "Unarmed" + } + } + } +} + +export var groundUnitDatabase = new GroundUnitDatabase(); diff --git a/client/src/units/groundunitsdatabase.ts b/client/src/units/groundunitsdatabase.ts deleted file mode 100644 index 3aacebf9..00000000 --- a/client/src/units/groundunitsdatabase.ts +++ /dev/null @@ -1,3671 +0,0 @@ -import { UnitDatabase } from "./unitdatabase" - -export class GroundUnitsDatabase extends UnitDatabase { - constructor() { - super(); - this.blueprints = { - "SA-2 SAM Battery": { - "name": "SA-2 SAM Battery", - "era": ["Early Cold War"], - "label": "SA-2 SAM Battery", - "shortLabel": "SA-2 SAM Battery", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - ], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-3 SAM Battery": { - "name": "SA-3 SAM Battery", - "era": ["Early Cold War"], - "label": "SA-3 SAM Battery", - "shortLabel": "SA-3 SAM Battery", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-6 SAM Battery": { - "name": "SA-6 SAM Battery", - "era": ["Mid Cold War"], - "label": "SA-6 SAM Battery", - "shortLabel": "SA-6 SAM Battery", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-10 SAM Battery": { - "name": "SA-10 SAM Battery", - "era": ["Late Cold War"], - "label": "SA-10 SAM Battery", - "shortLabel": "SA-10 SAM Battery", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-11 SAM Battery": { - "name": "SA-11 SAM Battery", - "era": ["Late Cold War"], - "label": "SA-11 SAM Battery", - "shortLabel": "SA-11 SAM Battery", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot site": { - "name": "Patriot site", - "era": ["Late Cold War"], - "label": "Patriot site", - "shortLabel": "Patriot site", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk SAM Battery": { - "name": "Hawk SAM Battery", - "era": ["Early Cold War"], - "label": "Hawk SAM Battery", - "shortLabel": "Hawk SAM Battery", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "SAM Sites" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "2B11 mortar": { - "name": "2B11 mortar", - "era": ["Late Cold War"], - "label": "2B11 mortar", - "shortLabel": "2B11 mortar", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm Mortar Tube", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SAU Gvozdika": { - "name": "SAU Gvozdika", - "era": ["Mid Cold War"], - "label": "SAU Gvozdika", - "shortLabel": "SAU Gvozdika", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "122mm Howitzer", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SAU Msta": { - "name": "SAU Msta", - "era": ["Late Cold War"], - "label": "SAU Msta", - "shortLabel": "SAU Msta", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "152mm Howitzer", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SAU Akatsia": { - "name": "SAU Akatsia", - "era": ["Mid Cold War"], - "label": "SAU Akatsia", - "shortLabel": "SAU Akatsia", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "152mm Howitzer", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SAU 2-C9": { - "name": "SAU 2-C9", - "era": ["Mid Cold War"], - "label": "SAU Nona", - "shortLabel": "SAU Nona", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm Mortar", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M-109": { - "name": "M-109", - "era": ["Early Cold War"], - "label": "M-109 Paladin", - "shortLabel": "M-109", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "155mm Howitzer", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Gun Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "AAV7": { - "name": "AAV7", - "era": ["Mid Cold War"], - "label": "AAV7", - "shortLabel": "AAV7", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BMD-1": { - "name": "BMD-1", - "era": ["Mid Cold War"], - "label": "BMD-1", - "shortLabel": "BMD-1", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "73mm Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 3, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "AT-3 Sagger ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BMP-1": { - "name": "BMP-1", - "era": ["Mid Cold War"], - "label": "BMP-1", - "shortLabel": "BMP-1", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "73mm Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 3, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "AT-3 Sagger ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BMP-2": { - "name": "BMP-2", - "era": ["Mid Cold War"], - "label": "BMP-2", - "shortLabel": "BMP-2", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "30mm Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 3, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "AT-5 Konkurs ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BMP-3": { - "name": "BMP-3", - "era": ["Late Cold War"], - "label": "BMP-3", - "shortLabel": "BMP-3", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "100mm Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "30mm Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 3, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "AT-10 Stabber ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Boman": { - "name": "Boman", - "era": ["Late Cold War"], - "label": "Grad Fire Direction Manager", - "shortLabel": "Boman", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "7.62mm PKMB GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "RPG-7", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Reconnaissance" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BRDM-2": { - "name": "BRDM-2", - "era": ["Early Cold War"], - "label": "BRDM-2", - "shortLabel": "BRDM-2", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "14.5mm KPVT HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Reconnaissance" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BTR-80": { - "name": "BTR-80", - "era": ["Late Cold War"], - "label": "BTR-80", - "shortLabel": "BTR-80", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "14.5mm KPVT HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "BTR_D": { - "name": "BTR_D", - "era": ["Mid Cold War"], - "label": "BTR_D", - "shortLabel": "BTR_D", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "7.62mm PKT GPMG", - "quantity": 2, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "AT-5 Konkurs ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Bunker": { - "name": "Bunker", - "label": "Bunker", - "shortLabel": "Bunker", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Static" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Cobra": { - "name": "Cobra", - "era": ["Modern"], - "label": "Otokar Cobra", - "shortLabel": "Cobra", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Reconnaissance" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "LAV-25": { - "name": "LAV-25", - "era": ["Late Cold War"], - "label": "LAV-25", - "shortLabel": "LAV-25", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "25mm M242 Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm M240 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1043 HMMWV Armament": { - "name": "M1043 HMMWV Armament", - "era": ["Late Cold War"], - "label": "HMMWV M2 Browning", - "shortLabel": "HMMWV M2", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Reconnaissance" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1045 HMMWV TOW": { - "name": "M1045 HMMWV TOW", - "era": ["Late Cold War"], - "label": "HMMWV TOW", - "shortLabel": "HMMWV TOW", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "BGM-71 TOW ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Reconnaissance" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1126 Stryker ICV": { - "name": "M1126 Stryker ICV", - "era": ["Modern"], - "label": "Stryker MG", - "shortLabel": "Stryker MG", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M-113": { - "name": "M-113", - "era": ["Early Cold War"], - "label": "M-113", - "shortLabel": "M-113", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1134 Stryker ATGM": { - "name": "M1134 Stryker ATGM", - "era": ["Modern"], - "label": "Stryker ATGM", - "shortLabel": "Stryker ATGM", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "BGM-71 TOW", - "quantity": 2, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M-2 Bradley": { - "name": "M-2 Bradley", - "era": ["Late Cold War"], - "label": "M-2A2 Bradley", - "shortLabel": "M-2 Bradley", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "25mm M242 Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "BGM-71 TOW", - "quantity": 2, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm M240 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Marder": { - "name": "Marder", - "era": ["Late Cold War"], - "label": "Marder", - "shortLabel": "Marder", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "20mm MK 20 Rh 202 Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm MG3 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "MCV-80": { - "name": "MCV-80", - "era": ["Late Cold War"], - "label": "Warrior IFV", - "shortLabel": "Warrior", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "30mm L21A1 Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm L94A1 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "IFV" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "MTLB": { - "name": "MTLB", - "era": ["Mid Cold War"], - "label": "MT-LB", - "shortLabel": "MT-LB", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Paratrooper RPG-16": { - "name": "Paratrooper RPG-16", - "era": ["Modern"], - "label": "Paratrooper RPG-16", - "shortLabel": "Paratrooper RPG-16", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "RPG-16", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Paratrooper AKS-74": { - "name": "Paratrooper AKS-74", - "era": ["Modern"], - "label": "Paratrooper AKS-74", - "shortLabel": "Paratrooper AKS-74", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.45mm AKS-74", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Sandbox": { - "name": "Sandbox", - "label": "Sandbox", - "shortLabel": "Sandbox", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Static" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Soldier AK": { - "name": "Soldier AK", - "era": ["Early Cold War"], - "label": "Soldier AK", - "shortLabel": "Soldier AK", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.45mm AK-74", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Infantry AK": { - "name": "Infantry AK", - "era": ["Mid Cold War"], - "label": "Infantry AK", - "shortLabel": "Infantry AK", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.45mm AK-74", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Soldier M249": { - "name": "Soldier M249", - "era": ["Late Cold War"], - "label": "Soldier M249", - "shortLabel": "Soldier M249", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.56mm M249 SAW", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Soldier M4": { - "name": "Soldier M4", - "era": ["Mid Cold War"], - "label": "Soldier M4", - "shortLabel": "Soldier M4", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.56mm M4", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Soldier M4 GRG": { - "name": "Soldier M4 GRG", - "era": ["Mid Cold War"], - "label": "Soldier M4 GRG", - "shortLabel": "Soldier M4 GRG", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "5.56mm M4", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Soldier RPG": { - "name": "Soldier RPG", - "era": ["Mid Cold War"], - "label": "Soldier RPG", - "shortLabel": "Soldier RPG", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "RPG-16", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Infantry" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "TPZ": { - "name": "TPZ", - "era": ["Late Cold War"], - "label": "TPz Fuchs", - "shortLabel": "TPz Fuchs", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "7.62mm M3 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (soft)" - } - ], - "roles": [ - "APC" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Grad-URAL": { - "name": "Grad-URAL", - "era": ["Mid Cold War"], - "label": "Grad", - "shortLabel": "Grad", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "122mm Grad 9M21 Rocket", - "quantity": 40, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Rocket Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Uragan_BM-27": { - "name": "Uragan_BM-27", - "era": ["Late Cold War"], - "label": "Uragan", - "shortLabel": "Uragan", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "220mm Uragan 9M27 Rocket", - "quantity": 16, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Rocket Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Smerch": { - "name": "Smerch", - "era": ["Late Cold War"], - "label": "Smerch", - "shortLabel": "Smerch", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "300mm Smerch 9M55 Rocket", - "quantity": 12, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Rocket Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "MLRS": { - "name": "MLRS", - "era": ["Late Cold War"], - "label": "M270", - "shortLabel": "M270", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "227mm with 644 DPICM Submunitions", - "quantity": 12, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Rocket Artillery" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "2S6 Tunguska": { - "name": "2S6 Tunguska", - "era": ["Late Cold War"], - "label": "SA-19 Tunguska", - "shortLabel": "SA-19", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Twin Barrel 30mm 2A38M Autocannons", - "quantity": 2, - "effectiveAgainst": "Surface (Soft), Aircraft" - }, - { - "name": "9M311 SAM (Radio Command Guidance)", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA/SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Kub 2P25 ln": { - "name": "Kub 2P25 ln", - "era": ["Late Cold War"], - "label": "SA-6 Kub 2P25 ln", - "shortLabel": "Kub 2P25 ln", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "3M9M SAM (SARH)", - "quantity": 3, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "5p73 s-125 ln": { - "name": "5p73 s-125 ln", - "era": ["Early Cold War"], - "label": "SA-3 5p73 s-125 ln", - "shortLabel": "5p73 s-125 ln", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "SA-3 3M9M SAM (RF CLOS)", - "quantity": 3, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 5P85C ln": { - "name": "S-300PS 5P85C ln", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 5P85C ln", - "shortLabel": "S-300PS 5P85C ln", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "48N6 SAM (SARH)", - "quantity": 2, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 5P85D ln": { - "name": "S-300PS 5P85D ln", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 5P85D ln", - "shortLabel": "S-300PS 5P85D ln", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "48N6 SAM (SARH)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-11 Buk LN 9A310M1": { - "name": "SA-11 Buk LN 9A310M1", - "era": ["Late Cold War"], - "label": "SA-11 Buk LN 9A310M1", - "shortLabel": "SA-11 Buk LN 9A310M1", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9M38M1 SAM (SARH)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Osa 9A33 ln": { - "name": "Osa 9A33 ln", - "era": ["Mid Cold War"], - "label": "SA-8 Osa 9A33 ln", - "shortLabel": "Osa 9A33 ln", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9M33 SAM (SARH)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Tor 9A331": { - "name": "Tor 9A331", - "era": ["Late Cold War"], - "label": "SA-15 Tor 9A331", - "shortLabel": "Tor 9A331", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9M330 SAM (Radio Command Guidance)", - "quantity": 8, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Strela-10M3": { - "name": "Strela-10M3", - "era": ["Late Cold War"], - "label": "SA-13 Strela-10M3", - "shortLabel": "Strela-10M3", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9M333 SAM (IR)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Strela-1 9P31": { - "name": "Strela-1 9P31", - "era": ["Late Cold War"], - "label": "SA-9 Strela-1 9P31", - "shortLabel": "Strela-1 9P31", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9M31 SAM (IR)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-11 Buk CC 9S470M1": { - "name": "SA-11 Buk CC 9S470M1", - "era": ["Late Cold War"], - "label": "SA-11 Buk CC 9S470M1", - "shortLabel": "SA-11 Buk CC 9S470M1", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Command Post", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-8 Osa LD 9T217": { - "name": "SA-8 Osa LD 9T217", - "era": ["Late Cold War"], - "label": "SA-8 Osa LD 9T217", - "shortLabel": "SA-8 Osa LD 9T217", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Transloader", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot AMG": { - "name": "Patriot AMG", - "era": ["Modern"], - "label": "Patriot AMG", - "shortLabel": "Patriot AMG", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Antenna Mast Group", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot ECS": { - "name": "Patriot ECS", - "era": ["Modern"], - "label": "Patriot ECS", - "shortLabel": "Patriot ECS", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Engagement Control Station", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Gepard": { - "name": "Gepard", - "era": ["Late Cold War", "Modern"], - "label": "Gepard", - "shortLabel": "Gepard", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "35mm KDA Autocannon", - "quantity": 2, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk pcp": { - "name": "Hawk pcp", - "era": ["Late Cold War"], - "label": "Hawk pcp", - "shortLabel": "Hawk pcp", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Command Post", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-18 Igla manpad": { - "name": "SA-18 Igla manpad", - "era": ["Late Cold War"], - "label": "SA-18 Igla manpad", - "shortLabel": "SA-18 Igla manpad", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9K38 SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "MANPADS" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Igla manpad INS": { - "name": "Igla manpad INS", - "era": ["Late Cold War"], - "label": "SA-18 Igla manpad INS", - "shortLabel": "Igla manpad INS", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9K38 SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "MANPADS" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-18 Igla-S manpad": { - "name": "SA-18 Igla-S manpad", - "era": ["Late Cold War"], - "label": "SA-18 Igla-S manpad", - "shortLabel": "SA-18 Igla-S manpad", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "9K338 SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "MANPADS" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Vulcan": { - "name": "Vulcan", - "era": ["Late Cold War"], - "label": "Vulcan", - "shortLabel": "Vulcan", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "M168 20mm Vulcan", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk ln": { - "name": "Hawk ln", - "era": ["Late Cold War"], - "label": "Hawk ln", - "shortLabel": "Hawk ln", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "MIM 23B SAM (SARH)", - "quantity": 3, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M48 Chaparral": { - "name": "M48 Chaparral", - "era": ["Late Cold War"], - "label": "M48 Chaparral", - "shortLabel": "M48 Chaparral", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "MIM-72G SAM (IR)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M6 Linebacker": { - "name": "M6 Linebacker", - "era": ["Late Cold War"], - "label": "M6 Linebacker", - "shortLabel": "M6 Linebacker", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "M242 25mm Autocannon", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm M240C GPMG", - "quantity": 4, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "Stinger SAM (IR)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot ln": { - "name": "Patriot ln", - "era": ["Late Cold War"], - "label": "Patriot ln", - "shortLabel": "Patriot ln", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "MIM-104 SAM (SARH)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1097 Avenger": { - "name": "M1097 Avenger", - "era": ["Modern"], - "label": "M1097 Avenger", - "shortLabel": "M1097 Avenger", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "12.7mm M2 HMG", - "quantity": 2, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "Stinger SAM (IR)", - "quantity": 4, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot EPP": { - "name": "Patriot EPP", - "era": ["Late Cold War"], - "label": "Patriot EPP", - "shortLabel": "Patriot EPP", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Diesel-Electric Generator", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot cp": { - "name": "Patriot cp", - "era": ["Late Cold War"], - "label": "Patriot cp", - "shortLabel": "Patriot cp", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Command Post", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Roland ADS": { - "name": "Roland ADS", - "era": ["Late Cold War"], - "label": "Roland ADS", - "shortLabel": "Roland ADS", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "MIM-115 SAM (Radio Command Guidance)", - "quantity": 2, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 54K6 cp": { - "name": "S-300PS 54K6 cp", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 54K6 cp", - "shortLabel": "S-300PS 54K6 cp", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Command Post", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Stinger manpad GRG": { - "name": "Stinger manpad GRG", - "era": ["Late Cold War"], - "label": "Stinger manpad GRG", - "shortLabel": "Stinger manpad GRG", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Stinger SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Stinger manpad dsr": { - "name": "Stinger manpad dsr", - "era": ["Late Cold War"], - "label": "Stinger manpad dsr", - "shortLabel": "Stinger manpad dsr", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Stinger SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "MANPADS" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Stinger comm dsr": { - "name": "Stinger comm dsr", - "era": ["Late Cold War"], - "label": "Stinger comm dsr", - "shortLabel": "Stinger comm dsr", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Commander", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Stinger manpad": { - "name": "Stinger manpad", - "era": ["Late Cold War"], - "label": "Stinger manpad", - "shortLabel": "Stinger manpad", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Stinger SAM (IR)", - "quantity": 1, - "effectiveAgainst": "Aircraft" - } - ], - "roles": [ - "MANPADS" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Stinger comm": { - "name": "Stinger comm", - "era": ["Late Cold War"], - "label": "Stinger comm", - "shortLabel": "Stinger comm", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Commander", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZSU-23-4 Shilka": { - "name": "ZSU-23-4 Shilka", - "era": ["Late Cold War"], - "label": "ZSU-23-4 Shilka", - "shortLabel": "ZSU-23-4 Shilka", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm AZP-23M Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZU-23 Emplacement Closed": { - "name": "ZU-23 Emplacement Closed", - "era": ["Late Cold War"], - "label": "ZU-23 Emplacement Closed", - "shortLabel": "ZU-23 Emplacement Closed", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZU-23 Emplacement": { - "name": "ZU-23 Emplacement", - "era": ["Late Cold War"], - "label": "ZU-23 Emplacement", - "shortLabel": "ZU-23 Emplacement", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZU-23 Closed Insurgent": { - "name": "ZU-23 Closed Insurgent", - "era": ["Late Cold War"], - "label": "ZU-23 Closed Insurgent", - "shortLabel": "ZU-23 Closed Insurgent", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-375 ZU-23 Insurgent": { - "name": "Ural-375 ZU-23 Insurgent", - "era": ["Late Cold War"], - "label": "Ural-375 ZU-23 Insurgent", - "shortLabel": "Ural-375 ZU-23 Insurgent", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZU-23 Insurgent": { - "name": "ZU-23 Insurgent", - "era": ["Late Cold War"], - "label": "ZU-23 Insurgent", - "shortLabel": "ZU-23 Insurgent", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-375 ZU-23": { - "name": "Ural-375 ZU-23", - "era": ["Late Cold War"], - "label": "Ural-375 ZU-23", - "shortLabel": "Ural-375 ZU-23", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "23mm 2A14 Autocannon", - "quantity": 4, - "effectiveAgainst": "Surface (Soft), Aircraft" - } - ], - "roles": [ - "AAA" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "1L13 EWR": { - "name": "1L13 EWR", - "era": ["Late Cold War"], - "label": "1L13 EWR", - "shortLabel": "1L13 EWR", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Early Warning Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "Radar" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Kub 1S91 str": { - "name": "Kub 1S91 str", - "era": ["Mid Cold War"], - "label": "SA-6 Kub 1S91 str", - "shortLabel": "Kub 1S91 str", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search and Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 40B6M tr": { - "name": "S-300PS 40B6M tr", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 40B6M tr", - "shortLabel": "S-300PS 40B6M tr", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 40B6MD sr": { - "name": "S-300PS 40B6MD sr", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 40B6MD sr", - "shortLabel": "S-300PS 40B6MD sr", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "55G6 EWR": { - "name": "55G6 EWR", - "era": ["Early Cold War"], - "label": "55G6 EWR", - "shortLabel": "55G6 EWR", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Early Warning Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "Radar" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "S-300PS 64H6E sr": { - "name": "S-300PS 64H6E sr", - "era": ["Late Cold War"], - "label": "SA-10 S-300PS 64H6E sr", - "shortLabel": "S-300PS 64H6E sr", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SA-11 Buk SR 9S18M1": { - "name": "SA-11 Buk SR 9S18M1", - "era": ["Mid Cold War"], - "label": "SA-11 Buk SR 9S18M1", - "shortLabel": "SA-11 Buk SR 9S18M1", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Dog Ear radar": { - "name": "Dog Ear radar", - "era": ["Mid Cold War"], - "label": "Dog Ear radar", - "shortLabel": "Dog Ear radar", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk tr": { - "name": "Hawk tr", - "era": ["Early Cold War"], - "label": "Hawk tr", - "shortLabel": "Hawk tr", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk sr": { - "name": "Hawk sr", - "era": ["Early Cold War"], - "label": "Hawk sr", - "shortLabel": "Hawk sr", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Patriot str": { - "name": "Patriot str", - "era": ["Late Cold War"], - "label": "Patriot str", - "shortLabel": "Patriot str", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search and Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hawk cwar": { - "name": "Hawk cwar", - "era": ["Early Cold War"], - "label": "Hawk cwar", - "shortLabel": "Hawk cwar", - "range": "Long", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search and Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "p-19 s-125 sr": { - "name": "p-19 s-125 sr", - "era": ["Mid Cold War"], - "label": "SA-3 p-19 s-125 sr", - "shortLabel": "p-19 s-125 sr", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Roland Radar": { - "name": "Roland Radar", - "era": ["Mid Cold War"], - "label": "Roland Radar", - "shortLabel": "Roland Radar", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Search Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "snr s-125 tr": { - "name": "snr s-125 tr", - "era": ["Early Cold War"], - "label": "SA-3 snr s-125 tr", - "shortLabel": "snr s-125 tr", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "Track Radar", - "quantity": 1, - "effectiveAgainst": "None" - } - ], - "roles": [ - "SAM" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "house1arm": { - "name": "house1arm", - "label": "house1arm", - "shortLabel": "house1arm", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Structure" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "house2arm": { - "name": "house2arm", - "label": "house2arm", - "shortLabel": "house2arm", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Structure" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "outpost_road": { - "name": "outpost_road", - "label": "outpost_road", - "shortLabel": "outpost_road", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Structure" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "outpost": { - "name": "outpost", - "label": "outpost", - "shortLabel": "outpost", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Structure" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "houseA_arm": { - "name": "houseA_arm", - "label": "houseA_arm", - "shortLabel": "houseA_arm", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Structure" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Challenger2": { - "name": "Challenger2", - "era": ["Modern"], - "label": "Challenger2", - "shortLabel": "Challenger2", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm L30A1 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm L94A1 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "7.62mm L37A2 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Leclerc": { - "name": "Leclerc", - "era": ["Modern"], - "label": "Leclerc", - "shortLabel": "Leclerc", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm F1 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "12.7mm M2HB HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Leopard1A3": { - "name": "Leopard1A3", - "era": ["Mid Cold War"], - "label": "Leopard1A3", - "shortLabel": "Leopard1A3", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "105mm L7A3 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm MG3 GPMG", - "quantity": 2, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Leopard-2": { - "name": "Leopard-2", - "era": ["Late Cold War"], - "label": "Leopard-2", - "shortLabel": "Leopard-2", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm Rh L/44 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm MG3 GPMG", - "quantity": 2, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M-60": { - "name": "M-60", - "era": ["Early Cold War"], - "label": "M-60", - "shortLabel": "M-60", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "105mm M68 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm M73 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm M85 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M1128 Stryker MGS": { - "name": "M1128 Stryker MGS", - "era": ["Modern"], - "label": "M1128 Stryker MGS", - "shortLabel": "M1128 Stryker MGS", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "105mm M68 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm M240 GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "SPG" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M-1 Abrams": { - "name": "M-1 Abrams", - "era": ["Late Cold War"], - "label": "M-1 Abrams", - "shortLabel": "M-1 Abrams", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "120mm Rh L/44 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm M240 GPMG", - "quantity": 2, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm M2 HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "T-55": { - "name": "T-55", - "era": ["Early Cold War"], - "label": "T-55", - "shortLabel": "T-55", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "100mm D-10T Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm SGMT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm DShK HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "T-72B": { - "name": "T-72B", - "era": ["Mid Cold War"], - "label": "T-72B", - "shortLabel": "T-72B", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "125mm 2A46M Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm NSVT HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "T-80UD": { - "name": "T-80UD", - "era": ["Mid Cold War"], - "label": "T-80UD", - "shortLabel": "T-80UD", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "125mm 2A46M Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm NSVT HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "T-90": { - "name": "T-90", - "era": ["Late Cold War"], - "label": "T-90", - "shortLabel": "T-90", - "loadouts": [ - { - "fuel": 1, - "items": [ - { - "name": "125mm 2A46M-5 Gun", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - }, - { - "name": "7.62mm PKT GPMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "12.7mm NSVT HMG", - "quantity": 1, - "effectiveAgainst": "Surface (Soft)" - }, - { - "name": "9K119M ATGM", - "quantity": 1, - "effectiveAgainst": "Surface (Hard)" - } - ], - "roles": [ - "Tank" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-4320 APA-5D": { - "name": "Ural-4320 APA-5D", - "era": ["Early Cold War"], - "label": "Ural-4320 APA-5D", - "shortLabel": "Ural-4320 APA-5D", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ATMZ-5": { - "name": "ATMZ-5", - "era": ["Early Cold War"], - "label": "ATMZ-5", - "shortLabel": "ATMZ-5", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ATZ-10": { - "name": "ATZ-10", - "era": ["Early Cold War"], - "label": "ATZ-10", - "shortLabel": "ATZ-10", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "GAZ-3307": { - "name": "GAZ-3307", - "era": ["Early Cold War"], - "label": "GAZ-3307", - "shortLabel": "GAZ-3307", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "GAZ-3308": { - "name": "GAZ-3308", - "era": ["Early Cold War"], - "label": "GAZ-3308", - "shortLabel": "GAZ-3308", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "GAZ-66": { - "name": "GAZ-66", - "era": ["Early Cold War"], - "label": "GAZ-66", - "shortLabel": "GAZ-66", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M978 HEMTT Tanker": { - "name": "M978 HEMTT Tanker", - "era": ["Mid Cold War"], - "label": "M978 HEMTT Tanker", - "shortLabel": "M978 HEMTT Tanker", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HEMTT TFFT": { - "name": "HEMTT TFFT", - "era": ["Late Cold War"], - "label": "HEMTT TFFT", - "shortLabel": "HEMTT TFFT", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "IKARUS Bus": { - "name": "IKARUS Bus", - "era": ["Mid Cold War"], - "label": "IKARUS Bus", - "shortLabel": "IKARUS Bus", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "KAMAZ Truck": { - "name": "KAMAZ Truck", - "era": ["Mid Cold War"], - "label": "KAMAZ Truck", - "shortLabel": "KAMAZ Truck", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "LAZ Bus": { - "name": "LAZ Bus", - "era": ["Early Cold War"], - "label": "LAZ Bus", - "shortLabel": "LAZ Bus", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Hummer": { - "name": "Hummer", - "era": ["Mid Cold War"], - "label": "Hummer", - "shortLabel": "Hummer", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "M 818": { - "name": "M 818", - "era": ["Early Cold War"], - "label": "M 818", - "shortLabel": "M 818", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "MAZ-6303": { - "name": "MAZ-6303", - "era": ["Mid Cold War"], - "label": "MAZ-6303", - "shortLabel": "MAZ-6303", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Predator GCS": { - "name": "Predator GCS", - "era": ["Late Cold War"], - "label": "Predator GCS", - "shortLabel": "Predator GCS", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Predator TrojanSpirit": { - "name": "Predator TrojanSpirit", - "era": ["Late Cold War"], - "label": "Predator TrojanSpirit", - "shortLabel": "Predator TrojanSpirit", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Suidae": { - "name": "Suidae", - "era": ["Late Cold War"], - "label": "Suidae", - "shortLabel": "Suidae", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Tigr_233036": { - "name": "Tigr_233036", - "era": ["Late Cold War"], - "label": "Tigr_233036", - "shortLabel": "Tigr_233036", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Trolley bus": { - "name": "Trolley bus", - "era": ["Late Cold War"], - "label": "Trolley bus", - "shortLabel": "Trolley bus", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "UAZ-469": { - "name": "UAZ-469", - "era": ["Mid Cold War"], - "label": "UAZ-469", - "shortLabel": "UAZ-469", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural ATsP-6": { - "name": "Ural ATsP-6", - "era": ["Mid Cold War"], - "label": "Ural ATsP-6", - "shortLabel": "Ural ATsP-6", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-375 PBU": { - "name": "Ural-375 PBU", - "era": ["Mid Cold War"], - "label": "Ural-375 PBU", - "shortLabel": "Ural-375 PBU", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-375": { - "name": "Ural-375", - "era": ["Mid Cold War"], - "label": "Ural-375", - "shortLabel": "Ural-375", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-4320-31": { - "name": "Ural-4320-31", - "era": ["Late Cold War"], - "label": "Ural-4320-31", - "shortLabel": "Ural-4320-31", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ural-4320T": { - "name": "Ural-4320T", - "era": ["Late Cold War"], - "label": "Ural-4320T", - "shortLabel": "Ural-4320T", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "VAZ Car": { - "name": "VAZ Car", - "era": ["Early Cold War"], - "label": "VAZ Car", - "shortLabel": "VAZ Car", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZiL-131 APA-80": { - "name": "ZiL-131 APA-80", - "era": ["Early Cold War"], - "label": "ZiL-131 APA-80", - "shortLabel": "ZiL-131 APA-80", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "SKP-11": { - "name": "SKP-11", - "era": ["Early Cold War"], - "label": "SKP-11", - "shortLabel": "SKP-11", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZIL-131 KUNG": { - "name": "ZIL-131 KUNG", - "era": ["Early Cold War"], - "label": "ZIL-131 KUNG", - "shortLabel": "ZIL-131 KUNG", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZIL-4331": { - "name": "ZIL-4331", - "era": ["Early Cold War"], - "label": "ZIL-4331", - "shortLabel": "ZIL-4331", - "loadouts": [ - { - "fuel": 1, - "items": [ - - ], - "roles": [ - "Unarmed" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - } - } - } -} - -export var groundUnitsDatabase = new GroundUnitsDatabase(); diff --git a/client/src/units/navalunitdatabase.ts b/client/src/units/navalunitdatabase.ts deleted file mode 100644 index 2333c071..00000000 --- a/client/src/units/navalunitdatabase.ts +++ /dev/null @@ -1,1711 +0,0 @@ -import { UnitDatabase } from "./unitdatabase" - -export class NavalDatabase extends UnitDatabase { - constructor() { - super(); - this.blueprints = { - "052B DDG-168 Guangzhou": { - "name": "052B DDG-168 Guangzhou", - "type": "Modern", - "era": ["Mid Cold War"], - "label": "052B DDG-168 Guangzhou", - "shortLabel": "052B DDG-168 Guangzhou", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "052C DDG-171 Haikou": { - "name": "052C DDG-171 Haikou", - "type": "Destroyer", - "era": ["Modern"], - "label": "052C DDG-171 Haikou", - "shortLabel": "052C DDG-171 Haikou", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "054A FFG-538 Yantai": { - "name": "054A FFG-538 Yantai", - "type": "Frigate", - "era": ["Modern"], - "label": "054A FFG-538 Yantai", - "shortLabel": "054A FFG-538 Yantai", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Type 071": { - "name": "Type 071", - "type": "Transport", - "era": ["Modern"], - "label": "Type 071", - "shortLabel": "Type 071", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Type 093": { - "name": "Type 093", - "type": "Submarine", - "era": ["Modern"], - "label": "Type 093", - "shortLabel": "Type 093", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Akizuki": { - "name": "Akizuki", - "type": "Destroyer", - "era": ["WW2"], - "label": "Akizuki", - "shortLabel": "Akizuki", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ARA Santa Fe S-21": { - "name": "ARA Santa Fe S-21", - "type": "Submarine", - "era": ["Early Cold War"], - "label": "ARA Santa Fe S-21", - "shortLabel": "ARA Santa Fe S-21", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ARA Vienticinco de Mayo": { - "name": "ARA Vienticinco de Mayo", - "type": "Aircraft Carrier", - "era": ["Mid Cold War"], - "label": "ARA Vienticinco de Mayo", - "shortLabel": "ARA Vienticinco de Mayo", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Admiral Kuznetsov": { - "name": "Admiral Kuznetsov", - "type": "Aircraft Carrier", - "era": ["Late Cold War"], - "label": "Admiral Kuznetsov", - "shortLabel": "Admiral Kuznetsov", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Albatros (Grisha-5)": { - "name": "Albatros (Grisha-5)", - "type": "Aircraft Carrier", - "era": ["Early Cold War"], - "label": "Albatros (Grisha-5)", - "shortLabel": "Albatros (Grisha-5)", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Almirante Condell PFG-06": { - "name": "Almirante Condell PFG-06", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "Almirante Condell PFG-06", - "shortLabel": "Almirante Condell PFG-06", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Almirante lynch PFG-07": { - "name": "Almirante lynch PFG-07", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "Almirante lynch PFG-07", - "shortLabel": "Almirante lynch PFG-07", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Boat Armed Hi-Speed": { - "name": "Boat Armed Hi-Speed", - "type": "Fast Attack Craft", - "era": ["Mid Cold War"], - "label": "Boat Armed Hi-Speed", - "shortLabel": "Boat Armed Hi-Speed", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Boat LCVP Higgins": { - "name": "Boat LCVP Higgins", - "type": "Landing Craft", - "era": ["WW2"], - "label": "Boat LCVP Higgins", - "shortLabel": "Boat LCVP Higgins", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Boat Schnellboot type S130": { - "name": "Boat Schnellboot type S130", - "type": "Fast Attack Craft", - "era": ["WW2"], - "label": "Boat Schnellboot type S130", - "shortLabel": "Boat Schnellboot type S130", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Bulker Handy Wind": { - "name": "Bulker Handy Wind", - "type": "Cargoship", - "era": ["Late Cold War"], - "label": "Bulker Handy Wind", - "shortLabel": "Bulker Handy Wind", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CV Admiral Kuznetsov(2017)": { - "name": "CV 1143.5 Admiral Kuznetsov(2017)", - "type": "Aircraft Carrier", - "era": ["Modern"], - "label": "CV Admiral Kuznetsov(2017)", - "shortLabel": "Admiral Kuznetsov(2017)", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CV-59 Forrestal": { - "name": "CV-59 Forrestal", - "type": "Aircraft Carrier", - "era": ["Early Cold War"], - "label": "CV-59 Forrestal", - "shortLabel": "CV-59 Forrestal", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CV6 USS Enterprise": { - "name": "CV6 USS Enterprise -The Grey Ghost-", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "CV6 USS Enterprise Grey Ghost", - "shortLabel": "CV6 USS Enterprise", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CVN-71 Theodore Roosevelt": { - "name": "CVN-71 Theodore Roosevelt", - "type": "Super Aircraft Carrier", - "era": ["Late Cold War"], - "label": "CVN-71 Theodore Roosevelt", - "shortLabel": "CVN-71 Theodore Roosevelt", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CVN-72 Abraham Lincoln": { - "name": "CVN-72 Abraham Lincoln", - "type": "Super Aircraft Carrier", - "era": ["Late Cold War"], - "label": "CVN-72 Abraham Lincoln", - "shortLabel": "CVN-72 Abraham Lincoln", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CVN-73 George Washington": { - "name": "CVN-73 George Washington", - "type": "Super Aircraft Carrier", - "era": ["Late Cold War"], - "label": "CVN-73 George Washington", - "shortLabel": "CVN-73 George Washington", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CVN-74 John C. Stennis": { - "name": "CVN-74 John C. Stennis", - "type": "Aircraft Carrier", - "era": ["Late Cold War"], - "label": "CVN-74 John C. Stennis", - "shortLabel": "CVN-74 John C. Stennis", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "CVN-75 Harry S. Truman": { - "name": "CVN-75 Harry S. Truman", - "type": "Aircraft Carrier", - "era": ["Late Cold War"], - "label": "CVN-75 Harry S. Truman", - "shortLabel": "CVN-75 Harry S. Truman", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HMS Leeds Castle (P-258)": { - "name": "Castle Class", - "type": "Patrol", - "era": ["Mid Cold War"], - "label": "HMS Leeds Castle (P-258)", - "shortLabel": "HMS Leeds Castle (P-258)", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DDG Arleigh Burke lla": { - "name": "DDG Arleigh Burke lla", - "type": "Destroyer", - "era": ["Late Cold War"], - "label": "DDG Arleigh Burke lla", - "shortLabel": "DDG Arleigh Burke", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Admiral Hipper": { - "name": "DKM Admiral Hipper", - "type": "Cruiser", - "era": ["WW2"], - "label": "DKM Admiral Hipper", - "shortLabel": "DKM Admiral Hipper", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Admiral Scheer": { - "name": "DKM Admiral Scheer", - "type": "Cruiser", - "era": ["WW2"], - "label": "DKM Admiral Scheer", - "shortLabel": "DKM Admiral Scheer", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Blucher": { - "name": "DKM Blucher", - "type": "Battleship", - "era": ["WW2"], - "label": "DKM Blucher", - "shortLabel": "DKM Blucher", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Gneisenau": { - "name": "DKM Blucher", - "type": "Battleship", - "era": ["WW2"], - "label": "DKM Blucher", - "shortLabel": "DKM Blucher", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Prinz Eugen": { - "name": "DKM Prinz Eugen", - "type": "Cruiser", - "era": ["WW2"], - "label": "DKM Prinz Eugen", - "shortLabel": "DKM Prinz Eugen", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Scharnhorst": { - "name": "Scharnhorst", - "type": "Battleship", - "era": ["WW2"], - "label": "DKM Scharnhorst", - "shortLabel": "DKM Scharnhorst", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Tirpiz": { - "name": "DKM Tirpiz", - "type": "Battleship", - "era": ["WW2"], - "label": "DKM Tirpiz", - "shortLabel": "DKM Tirpiz", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "DKM Z39": { - "name": "DKM Z39", - "type": "Destroyer", - "era": ["WW2"], - "label": "DKM Z39", - "shortLabel": "DKM Z39", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Dry cargo ship Ivanov": { - "name": "Dry cargo ship Ivanov", - "type": "Cargoship", - "era": ["Late Cold War"], - "label": "Dry cargo ship Ivanov", - "shortLabel": "Dry cargo ship Ivanov", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Dry cargo ship Yakushev": { - "name": "Dry cargo ship Yakushev", - "type": "Cargoship", - "era": ["Late Cold War"], - "label": "Dry cargo ship Yakushev", - "shortLabel": "Dry cargo ship Yakushev", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Elnya tanker": { - "name": "Elnya tanker", - "type": "Tanker", - "era": ["Late Cold War"], - "label": "Elnya tanker", - "shortLabel": "Elnya tanker", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "FAC La Combattante lla": { - "name": "FAC La Combattante lla", - "type": "Fast Attack Craft", - "era": ["Mid Cold War"], - "label": "FAC La Combattante lla", - "shortLabel": "FAC La Combattante", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Fletcher-Class destroyer": { - "name": "Fletcher-Class destroyer", - "type": "Destroyer", - "era": ["WW2"], - "label": "Fletcher-Class destroyer", - "shortLabel": "Fletcher-Class destroyer", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HMS Achilles (F12)": { - "name": "HMS Achilles (F12)", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "HMS Achilles (F12)", - "shortLabel": "HMS Achilles", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HMS Andromeda (F57)": { - "name": "HMS Andromeda (F57)", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "HMS Andromeda (F57)", - "shortLabel": "HMS Andromeda", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HMS Ariadne (F72)": { - "name": "HMS Ariadne (F72)", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "HMS Ariadne (F72)", - "shortLabel": "HMS Ariadne", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "HMS Invincible (R05)": { - "name": "HMS Invincible (R05)", - "type": "Aircraft Carrier", - "era": ["Mid Cold War"], - "label": "HMS Invincible (R05)", - "shortLabel": "HMS Invincible", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Harbor Tug": { - "name": "Harbor Tug", - "type": "Tug", - "era": ["Mid Cold War"], - "label": "Harbor Tug", - "shortLabel": "Harbor Tug", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Improved Kilo": { - "name": "Improved Kilo", - "type": "Submarine", - "era": ["Late Cold War"], - "label": "Project 636 Varshavyanka", - "shortLabel": "Varshavyanka", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Kilo": { - "name": "Kilo", - "type": "Submarine", - "era": ["Late Cold War"], - "label": "Project 636 Varshavyanka Basic", - "shortLabel": "Varshavyanka Basic", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "LHA-1 Tarawa": { - "name": "LHA-1 Tarawa", - "type": "Aircraft Carrier", - "era": ["Mid Cold War"], - "label": "LHA-1 Tarawa", - "shortLabel": "LHA-1 Tarawa", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "LS Ropucha": { - "name": "LS Ropucha", - "type": "Landing Craft", - "era": ["Mid Cold War"], - "label": "LS Ropucha", - "shortLabel": "LS Ropucha", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "LST Mk2": { - "name": "LST Mk2", - "type": "Transport", - "era": ["WW2"], - "label": "LST Mk2", - "shortLabel": "LST Mk2", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Molniya (Tarantul-3)": { - "name": "Molniya (Tarantul-3)", - "type": "Fast Attack Craft", - "era": ["Late Cold War"], - "label": "Molniya (Tarantul-3)", - "shortLabel": "Molniya (Tarantul-3)", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Moscow": { - "name": "Moscow", - "type": "Cruiser", - "era": ["Late Cold War"], - "label": "Moscow", - "shortLabel": "Moscow", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Neustrashimy": { - "name": "Neustrashimy", - "type": "Frigate", - "era": ["Late Cold War"], - "label": "Neustrashimy", - "shortLabel": "Neustrashimy", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Oliver H. Perry": { - "name": "Oliver H. Perry", - "type": "Frigate", - "era": ["Mid Cold War"], - "label": "Oliver H. Perry", - "shortLabel": "Oliver H. Perry", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Pyotr Velikiy": { - "name": "Pyotr Velikiy", - "type": "Cruiser", - "era": ["Late Cold War"], - "label": "Pyotr Velikiy", - "shortLabel": "Pyotr Velikiy", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Rezky (Krivak-2)": { - "name": "Rezky (Krivak-2)", - "type": "Frigate", - "era": ["Early Cold War"], - "label": "Rezky (Krivak-2)", - "shortLabel": "Rezky", - "range": "Short", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Supply Ship MV Tilde": { - "name": "Supply Ship MV Tilde", - "type": "Transport", - "era": ["Late Cold War"], - "label": "Supply Ship MV Tilde", - "shortLabel": "Supply Ship MV Tilde", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Tanker Seawise Giant": { - "name": "Tanker Seawise Giant", - "type": "Tanker", - "era": ["Late Cold War"], - "label": "Tanker Seawise Giant", - "shortLabel": "Tanker Seawise Giant", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Ticonderoga": { - "name": "Ticonderoga", - "type": "Cruiser", - "era": ["Late Cold War"], - "label": "Ticonderoga", - "shortLabel": "Ticonderoga", - "range": "Medium", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "U-boat VIIC U-flak": { - "name": "U-boat VIIC U-flak", - "type": "Submarine", - "era": ["WW2"], - "label": "U-boat VIIC U-flak", - "shortLabel": "U-boat VIIC U-flak", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Bell DD-587": { - "name": "USS Bell DD-587", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Bell DD-587", - "shortLabel": "USS Bell DD-587", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Cassin Young": { - "name": "USS Cassin Young", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Cassin Young", - "shortLabel": "USS Cassin Young", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Cotten DD-669": { - "name": "USS Cotten DD-669", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Cotten DD-669", - "shortLabel": "USS Cotten", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Enterprise": { - "name": "USS Enterprise", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "CV-6 USS Enterprise", - "shortLabel": "USS Enterprise", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Fletcher": { - "name": "USS Fletcher", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Fletcher", - "shortLabel": "USS Fletcher", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Franklin -Big Ben-": { - "name": "USS Franklin -Big Ben-", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "USS Franklin -Big Ben-", - "shortLabel": "USS Franklin", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Gregory DD-802": { - "name": "USS Gregory DD-802", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Gregory DD-802", - "shortLabel": "USS Gregory", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Hopewell DD-681": { - "name": "USS Hopewell DD-681", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Hopewell DD-681", - "shortLabel": "USS Hopewell", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Hornet (CV-8)": { - "name": "USS Hornet (CV-8)", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "USS Hornet (CV-8)", - "shortLabel": "USS Hornet (CV-8)", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Illinois BB-65": { - "name": "USS Illinois BB-65", - "type": "Battleship", - "era": ["WW2"], - "label": "USS Illinois BB-65", - "shortLabel": "USS Illinois", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Iowa": { - "name": "USS Iowa", - "type": "Battleship", - "era": ["WW2"], - "label": "USS Iowa", - "shortLabel": "USS Iowa", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Johnson DD-557": { - "name": "USS Johnson DD-557", - "type": "Destoryer", - "era": ["WW2"], - "label": "USS Johnson DD-557", - "shortLabel": "USS Johnson", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Kentucky BB-66": { - "name": "USS Kentucky BB-66", - "type": "Battleship", - "era": ["WW2"], - "label": "USS Kentucky BB-66", - "shortLabel": "USS Kentucky", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS La Vallette DD-448": { - "name": "USS La Vallette DD-448", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS La Vallette DD-448", - "shortLabel": "USS La Vallette", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Missouri": { - "name": "USS Missouri", - "type": "Battleship", - "era": ["WW2"], - "label": "USS Missouri", - "shortLabel": "USS Missouri", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS New Jersey": { - "name": "USS New Jersey", - "type": "Battleship", - "era": ["WW2"], - "label": "USS New Jersey", - "shortLabel": "USS New Jersey", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Radford DD-446": { - "name": "USS Radford DD-446", - "type": "Destroyer", - "era": ["WW2"], - "label": "USS Radford DD-446", - "shortLabel": "USS Radford", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Samuel Chase": { - "name": "USS Samuel Chase", - "type": "Transport", - "era": ["WW2"], - "label": "USS Samuel Chase", - "shortLabel": "USS Samuel Chase", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "USS Winsconsin": { - "name": "Winsconsin", - "type": "Battleship", - "era": ["WW2"], - "label": "USS Winsconsin", - "shortLabel": "USS Winsconsin", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "WW II USS Intrepid CV-11": { - "name": "WW II USS Intrepid CV-11", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "WW II USS Intrepid CV-11", - "shortLabel": "USS Intrepid", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "WWII Japanese Battleship Musashi": { - "name": "WWII Japanese Battleship Musashi", - "type": "Battleship", - "era": ["WW2"], - "label": "WWII Japanese Battleship Musashi", - "shortLabel": "Battleship Musashi", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "WWII Japanese Battleship Yamato": { - "name": "WWII Japanese Battleship Yamato", - "type": "Battleship", - "era": ["WW2"], - "label": "WWII Japanese Battleship Yamato", - "shortLabel": "Battleship Yamato", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "WWII USS Yorktown CV-5": { - "name": "WWII USS Yorktown CV-5", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "WWII USS Yorktown CV-5", - "shortLabel": "USS Yorktown", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "WWII USS Hornet CV-8": { - "name": "WWII USS Hornet CV-8", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "WWII USS Hornet CV-8", - "shortLabel": "USS Hornet", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "ZUIKAKU": { - "name": "ZUIKAKU", - "type": "Aircraft Carrier", - "era": ["WW2"], - "label": "ZUIKAKU", - "shortLabel": "ZUIKAKU", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - "Zwezdny": { - "name": "Zwezdny", - "type": "Civilian Boat", - "era": ["Modern"], - "label": "Zwezdny", - "shortLabel": "Zwezdny", - "range": "", - "loadouts": [ - { - "fuel": 1, - "items": [], - "roles": [ - "Template" - ], - "code": "", - "name": "Default" - } - ], - "filename": "" - }, - } - } -} - -export var navalDatabase = new NavalDatabase(); diff --git a/client/src/units/navyunitdatabase.ts b/client/src/units/navyunitdatabase.ts new file mode 100644 index 00000000..b157f5d2 --- /dev/null +++ b/client/src/units/navyunitdatabase.ts @@ -0,0 +1,946 @@ +import { UnitDatabase } from "./unitdatabase" + +export class NavyUnitDatabase extends UnitDatabase { + constructor() { + super(); + this.blueprints = { + "052B DDG-168 Guangzhou": { + "name": "052B DDG-168 Guangzhou", + "type": "Destroyer", + "era": [ + "Modern" + ], + "label": "052B DDG-168 Guangzhou", + "shortLabel": "052B DDG-168 Guangzhou", + "range": "Short", + "filename": "" + }, + "052C DDG-171 Haikou": { + "name": "052C DDG-171 Haikou", + "type": "Destroyer", + "era": [ + "Modern" + ], + "label": "052C DDG-171 Haikou", + "shortLabel": "052C DDG-171 Haikou", + "range": "Short", + "filename": "" + }, + "054A FFG-538 Yantai": { + "name": "054A FFG-538 Yantai", + "type": "Frigate", + "era": [ + "Modern" + ], + "label": "054A FFG-538 Yantai", + "shortLabel": "054A FFG-538 Yantai", + "range": "Medium", + "filename": "" + }, + "Type 071": { + "name": "Type 071", + "type": "Transport", + "era": [ + "Modern" + ], + "label": "Type 071", + "shortLabel": "Type 071", + "range": "", + "filename": "" + }, + "Type 093": { + "name": "Type 093", + "type": "Submarine", + "era": [ + "Modern" + ], + "label": "Type 093", + "shortLabel": "Type 093", + "range": "", + "filename": "" + }, + "Akizuki": { + "name": "Akizuki", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "Akizuki", + "shortLabel": "Akizuki", + "range": "", + "filename": "" + }, + "ARA Santa Fe S-21": { + "name": "ARA Santa Fe S-21", + "type": "Submarine", + "era": [ + "Early Cold War" + ], + "label": "ARA Santa Fe S-21", + "shortLabel": "ARA Santa Fe S-21", + "range": "", + "filename": "" + }, + "ARA Vienticinco de Mayo": { + "name": "ARA Vienticinco de Mayo", + "type": "Aircraft Carrier", + "era": [ + "Mid Cold War" + ], + "label": "ARA Vienticinco de Mayo", + "shortLabel": "ARA Vienticinco de Mayo", + "range": "", + "filename": "" + }, + "Admiral Kuznetsov": { + "name": "Admiral Kuznetsov", + "type": "Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "Admiral Kuznetsov", + "shortLabel": "Admiral Kuznetsov", + "range": "Medium", + "filename": "" + }, + "Albatros (Grisha-5)": { + "name": "Albatros (Grisha-5)", + "type": "Aircraft Carrier", + "era": [ + "Early Cold War" + ], + "label": "Albatros (Grisha-5)", + "shortLabel": "Albatros (Grisha-5)", + "range": "", + "filename": "" + }, + "Almirante Condell PFG-06": { + "name": "Almirante Condell PFG-06", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "Almirante Condell PFG-06", + "shortLabel": "Almirante Condell PFG-06", + "range": "", + "filename": "" + }, + "Almirante lynch PFG-07": { + "name": "Almirante lynch PFG-07", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "Almirante lynch PFG-07", + "shortLabel": "Almirante lynch PFG-07", + "range": "", + "filename": "" + }, + "Boat Armed Hi-Speed": { + "name": "Boat Armed Hi-Speed", + "type": "Fast Attack Craft", + "era": [ + "Mid Cold War" + ], + "label": "Boat Armed Hi-Speed", + "shortLabel": "Boat Armed Hi-Speed", + "range": "", + "filename": "" + }, + "Boat LCVP Higgins": { + "name": "Boat LCVP Higgins", + "type": "Landing Craft", + "era": [ + "WW2" + ], + "label": "Boat LCVP Higgins", + "shortLabel": "Boat LCVP Higgins", + "range": "", + "filename": "" + }, + "Boat Schnellboot type S130": { + "name": "Boat Schnellboot type S130", + "type": "Fast Attack Craft", + "era": [ + "WW2" + ], + "label": "Boat Schnellboot type S130", + "shortLabel": "Boat Schnellboot type S130", + "range": "", + "filename": "" + }, + "Bulker Handy Wind": { + "name": "Bulker Handy Wind", + "type": "Cargoship", + "era": [ + "Late Cold War" + ], + "label": "Bulker Handy Wind", + "shortLabel": "Bulker Handy Wind", + "range": "", + "filename": "" + }, + "CV Admiral Kuznetsov(2017)": { + "name": "CV 1143.5 Admiral Kuznetsov(2017)", + "type": "Aircraft Carrier", + "era": [ + "Modern" + ], + "label": "CV Admiral Kuznetsov(2017)", + "shortLabel": "Admiral Kuznetsov(2017)", + "range": "Medium", + "filename": "" + }, + "CV-59 Forrestal": { + "name": "CV-59 Forrestal", + "type": "Aircraft Carrier", + "era": [ + "Early Cold War" + ], + "label": "CV-59 Forrestal", + "shortLabel": "CV-59 Forrestal", + "range": "Short", + "filename": "" + }, + "CV6 USS Enterprise": { + "name": "CV6 USS Enterprise -The Grey Ghost-", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "CV6 USS Enterprise Grey Ghost", + "shortLabel": "CV6 USS Enterprise", + "range": "", + "filename": "" + }, + "CVN-71 Theodore Roosevelt": { + "name": "CVN-71 Theodore Roosevelt", + "type": "Super Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "CVN-71 Theodore Roosevelt", + "shortLabel": "CVN-71 Theodore Roosevelt", + "range": "Short", + "filename": "" + }, + "CVN-72 Abraham Lincoln": { + "name": "CVN-72 Abraham Lincoln", + "type": "Super Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "CVN-72 Abraham Lincoln", + "shortLabel": "CVN-72 Abraham Lincoln", + "range": "Short", + "filename": "" + }, + "CVN-73 George Washington": { + "name": "CVN-73 George Washington", + "type": "Super Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "CVN-73 George Washington", + "shortLabel": "CVN-73 George Washington", + "range": "Medium", + "filename": "" + }, + "CVN-74 John C. Stennis": { + "name": "CVN-74 John C. Stennis", + "type": "Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "CVN-74 John C. Stennis", + "shortLabel": "CVN-74 John C. Stennis", + "range": "Medium", + "filename": "" + }, + "CVN-75 Harry S. Truman": { + "name": "CVN-75 Harry S. Truman", + "type": "Aircraft Carrier", + "era": [ + "Late Cold War" + ], + "label": "CVN-75 Harry S. Truman", + "shortLabel": "CVN-75 Harry S. Truman", + "range": "Medium", + "filename": "" + }, + "HMS Leeds Castle (P-258)": { + "name": "Castle Class", + "type": "Patrol", + "era": [ + "Mid Cold War" + ], + "label": "HMS Leeds Castle (P-258)", + "shortLabel": "HMS Leeds Castle (P-258)", + "range": "", + "filename": "" + }, + "DDG Arleigh Burke lla": { + "name": "DDG Arleigh Burke lla", + "type": "Destroyer", + "era": [ + "Late Cold War" + ], + "label": "DDG Arleigh Burke lla", + "shortLabel": "DDG Arleigh Burke", + "range": "Medium", + "filename": "" + }, + "DKM Admiral Hipper": { + "name": "DKM Admiral Hipper", + "type": "Cruiser", + "era": [ + "WW2" + ], + "label": "DKM Admiral Hipper", + "shortLabel": "DKM Admiral Hipper", + "range": "", + "filename": "" + }, + "DKM Admiral Scheer": { + "name": "DKM Admiral Scheer", + "type": "Cruiser", + "era": [ + "WW2" + ], + "label": "DKM Admiral Scheer", + "shortLabel": "DKM Admiral Scheer", + "range": "", + "filename": "" + }, + "DKM Blucher": { + "name": "DKM Blucher", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "DKM Blucher", + "shortLabel": "DKM Blucher", + "range": "", + "filename": "" + }, + "DKM Gneisenau": { + "name": "DKM Blucher", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "DKM Blucher", + "shortLabel": "DKM Blucher", + "range": "", + "filename": "" + }, + "DKM Prinz Eugen": { + "name": "DKM Prinz Eugen", + "type": "Cruiser", + "era": [ + "WW2" + ], + "label": "DKM Prinz Eugen", + "shortLabel": "DKM Prinz Eugen", + "range": "", + "filename": "" + }, + "DKM Scharnhorst": { + "name": "Scharnhorst", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "DKM Scharnhorst", + "shortLabel": "DKM Scharnhorst", + "range": "", + "filename": "" + }, + "DKM Tirpiz": { + "name": "DKM Tirpiz", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "DKM Tirpiz", + "shortLabel": "DKM Tirpiz", + "range": "", + "filename": "" + }, + "DKM Z39": { + "name": "DKM Z39", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "DKM Z39", + "shortLabel": "DKM Z39", + "range": "", + "filename": "" + }, + "Dry cargo ship Ivanov": { + "name": "Dry cargo ship Ivanov", + "type": "Cargoship", + "era": [ + "Late Cold War" + ], + "label": "Dry cargo ship Ivanov", + "shortLabel": "Dry cargo ship Ivanov", + "range": "", + "filename": "" + }, + "Dry cargo ship Yakushev": { + "name": "Dry cargo ship Yakushev", + "type": "Cargoship", + "era": [ + "Late Cold War" + ], + "label": "Dry cargo ship Yakushev", + "shortLabel": "Dry cargo ship Yakushev", + "range": "", + "filename": "" + }, + "Elnya tanker": { + "name": "Elnya tanker", + "type": "Tanker", + "era": [ + "Late Cold War" + ], + "label": "Elnya tanker", + "shortLabel": "Elnya tanker", + "range": "", + "filename": "" + }, + "FAC La Combattante lla": { + "name": "FAC La Combattante lla", + "type": "Fast Attack Craft", + "era": [ + "Mid Cold War" + ], + "label": "FAC La Combattante lla", + "shortLabel": "FAC La Combattante", + "range": "", + "filename": "" + }, + "Fletcher-Class destroyer": { + "name": "Fletcher-Class destroyer", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "Fletcher-Class destroyer", + "shortLabel": "Fletcher-Class destroyer", + "range": "", + "filename": "" + }, + "HMS Achilles (F12)": { + "name": "HMS Achilles (F12)", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "HMS Achilles (F12)", + "shortLabel": "HMS Achilles", + "range": "", + "filename": "" + }, + "HMS Andromeda (F57)": { + "name": "HMS Andromeda (F57)", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "HMS Andromeda (F57)", + "shortLabel": "HMS Andromeda", + "range": "", + "filename": "" + }, + "HMS Ariadne (F72)": { + "name": "HMS Ariadne (F72)", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "HMS Ariadne (F72)", + "shortLabel": "HMS Ariadne", + "range": "", + "filename": "" + }, + "HMS Invincible (R05)": { + "name": "HMS Invincible (R05)", + "type": "Aircraft Carrier", + "era": [ + "Mid Cold War" + ], + "label": "HMS Invincible (R05)", + "shortLabel": "HMS Invincible", + "range": "", + "filename": "" + }, + "Harbor Tug": { + "name": "Harbor Tug", + "type": "Tug", + "era": [ + "Mid Cold War" + ], + "label": "Harbor Tug", + "shortLabel": "Harbor Tug", + "range": "", + "filename": "" + }, + "Improved Kilo": { + "name": "Improved Kilo", + "type": "Submarine", + "era": [ + "Late Cold War" + ], + "label": "Project 636 Varshavyanka", + "shortLabel": "Varshavyanka", + "range": "Medium", + "filename": "" + }, + "Kilo": { + "name": "Kilo", + "type": "Submarine", + "era": [ + "Late Cold War" + ], + "label": "Project 636 Varshavyanka Basic", + "shortLabel": "Varshavyanka Basic", + "range": "Medium", + "filename": "" + }, + "LHA-1 Tarawa": { + "name": "LHA-1 Tarawa", + "type": "Aircraft Carrier", + "era": [ + "Mid Cold War" + ], + "label": "LHA-1 Tarawa", + "shortLabel": "LHA-1 Tarawa", + "range": "Short", + "filename": "" + }, + "LS Ropucha": { + "name": "LS Ropucha", + "type": "Landing Craft", + "era": [ + "Mid Cold War" + ], + "label": "LS Ropucha", + "shortLabel": "LS Ropucha", + "range": "", + "filename": "" + }, + "LST Mk2": { + "name": "LST Mk2", + "type": "Transport", + "era": [ + "WW2" + ], + "label": "LST Mk2", + "shortLabel": "LST Mk2", + "range": "", + "filename": "" + }, + "Molniya (Tarantul-3)": { + "name": "Molniya (Tarantul-3)", + "type": "Fast Attack Craft", + "era": [ + "Late Cold War" + ], + "label": "Molniya (Tarantul-3)", + "shortLabel": "Molniya (Tarantul-3)", + "range": "Short", + "filename": "" + }, + "Moscow": { + "name": "Moscow", + "type": "Cruiser", + "era": [ + "Late Cold War" + ], + "label": "Moscow", + "shortLabel": "Moscow", + "range": "Medium", + "filename": "" + }, + "Neustrashimy": { + "name": "Neustrashimy", + "type": "Frigate", + "era": [ + "Late Cold War" + ], + "label": "Neustrashimy", + "shortLabel": "Neustrashimy", + "range": "Short", + "filename": "" + }, + "Oliver H. Perry": { + "name": "Oliver H. Perry", + "type": "Frigate", + "era": [ + "Mid Cold War" + ], + "label": "Oliver H. Perry", + "shortLabel": "Oliver H. Perry", + "range": "Medium", + "filename": "" + }, + "Pyotr Velikiy": { + "name": "Pyotr Velikiy", + "type": "Cruiser", + "era": [ + "Late Cold War" + ], + "label": "Pyotr Velikiy", + "shortLabel": "Pyotr Velikiy", + "range": "Medium", + "filename": "" + }, + "Rezky (Krivak-2)": { + "name": "Rezky (Krivak-2)", + "type": "Frigate", + "era": [ + "Early Cold War" + ], + "label": "Rezky (Krivak-2)", + "shortLabel": "Rezky", + "range": "Short", + "filename": "" + }, + "Supply Ship MV Tilde": { + "name": "Supply Ship MV Tilde", + "type": "Transport", + "era": [ + "Late Cold War" + ], + "label": "Supply Ship MV Tilde", + "shortLabel": "Supply Ship MV Tilde", + "range": "", + "filename": "" + }, + "Tanker Seawise Giant": { + "name": "Tanker Seawise Giant", + "type": "Tanker", + "era": [ + "Late Cold War" + ], + "label": "Tanker Seawise Giant", + "shortLabel": "Tanker Seawise Giant", + "range": "", + "filename": "" + }, + "Ticonderoga": { + "name": "Ticonderoga", + "type": "Cruiser", + "era": [ + "Late Cold War" + ], + "label": "Ticonderoga", + "shortLabel": "Ticonderoga", + "range": "Medium", + "filename": "" + }, + "U-boat VIIC U-flak": { + "name": "U-boat VIIC U-flak", + "type": "Submarine", + "era": [ + "WW2" + ], + "label": "U-boat VIIC U-flak", + "shortLabel": "U-boat VIIC U-flak", + "range": "", + "filename": "" + }, + "USS Bell DD-587": { + "name": "USS Bell DD-587", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Bell DD-587", + "shortLabel": "USS Bell DD-587", + "range": "", + "filename": "" + }, + "USS Cassin Young": { + "name": "USS Cassin Young", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Cassin Young", + "shortLabel": "USS Cassin Young", + "range": "", + "filename": "" + }, + "USS Cotten DD-669": { + "name": "USS Cotten DD-669", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Cotten DD-669", + "shortLabel": "USS Cotten", + "range": "", + "filename": "" + }, + "USS Enterprise": { + "name": "USS Enterprise", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "CV-6 USS Enterprise", + "shortLabel": "USS Enterprise", + "range": "", + "filename": "" + }, + "USS Fletcher": { + "name": "USS Fletcher", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Fletcher", + "shortLabel": "USS Fletcher", + "range": "", + "filename": "" + }, + "USS Franklin -Big Ben-": { + "name": "USS Franklin -Big Ben-", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "USS Franklin -Big Ben-", + "shortLabel": "USS Franklin", + "range": "", + "filename": "" + }, + "USS Gregory DD-802": { + "name": "USS Gregory DD-802", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Gregory DD-802", + "shortLabel": "USS Gregory", + "range": "", + "filename": "" + }, + "USS Hopewell DD-681": { + "name": "USS Hopewell DD-681", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Hopewell DD-681", + "shortLabel": "USS Hopewell", + "range": "", + "filename": "" + }, + "USS Hornet (CV-8)": { + "name": "USS Hornet (CV-8)", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "USS Hornet (CV-8)", + "shortLabel": "USS Hornet (CV-8)", + "range": "", + "filename": "" + }, + "USS Illinois BB-65": { + "name": "USS Illinois BB-65", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS Illinois BB-65", + "shortLabel": "USS Illinois", + "range": "", + "filename": "" + }, + "USS Iowa": { + "name": "USS Iowa", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS Iowa", + "shortLabel": "USS Iowa", + "range": "", + "filename": "" + }, + "USS Johnson DD-557": { + "name": "USS Johnson DD-557", + "type": "Destoryer", + "era": [ + "WW2" + ], + "label": "USS Johnson DD-557", + "shortLabel": "USS Johnson", + "range": "", + "filename": "" + }, + "USS Kentucky BB-66": { + "name": "USS Kentucky BB-66", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS Kentucky BB-66", + "shortLabel": "USS Kentucky", + "range": "", + "filename": "" + }, + "USS La Vallette DD-448": { + "name": "USS La Vallette DD-448", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS La Vallette DD-448", + "shortLabel": "USS La Vallette", + "range": "", + "filename": "" + }, + "USS Missouri": { + "name": "USS Missouri", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS Missouri", + "shortLabel": "USS Missouri", + "range": "", + "filename": "" + }, + "USS New Jersey": { + "name": "USS New Jersey", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS New Jersey", + "shortLabel": "USS New Jersey", + "range": "", + "filename": "" + }, + "USS Radford DD-446": { + "name": "USS Radford DD-446", + "type": "Destroyer", + "era": [ + "WW2" + ], + "label": "USS Radford DD-446", + "shortLabel": "USS Radford", + "range": "", + "filename": "" + }, + "USS Samuel Chase": { + "name": "USS Samuel Chase", + "type": "Transport", + "era": [ + "WW2" + ], + "label": "USS Samuel Chase", + "shortLabel": "USS Samuel Chase", + "range": "", + "filename": "" + }, + "USS Winsconsin": { + "name": "Winsconsin", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "USS Winsconsin", + "shortLabel": "USS Winsconsin", + "range": "", + "filename": "" + }, + "WW II USS Intrepid CV-11": { + "name": "WW II USS Intrepid CV-11", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "WW II USS Intrepid CV-11", + "shortLabel": "USS Intrepid", + "range": "", + "filename": "" + }, + "WWII Japanese Battleship Musashi": { + "name": "WWII Japanese Battleship Musashi", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "WWII Japanese Battleship Musashi", + "shortLabel": "Battleship Musashi", + "range": "", + "filename": "" + }, + "WWII Japanese Battleship Yamato": { + "name": "WWII Japanese Battleship Yamato", + "type": "Battleship", + "era": [ + "WW2" + ], + "label": "WWII Japanese Battleship Yamato", + "shortLabel": "Battleship Yamato", + "range": "", + "filename": "" + }, + "WWII USS Yorktown CV-5": { + "name": "WWII USS Yorktown CV-5", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "WWII USS Yorktown CV-5", + "shortLabel": "USS Yorktown", + "range": "", + "filename": "" + }, + "WWII USS Hornet CV-8": { + "name": "WWII USS Hornet CV-8", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "WWII USS Hornet CV-8", + "shortLabel": "USS Hornet", + "range": "", + "filename": "" + }, + "ZUIKAKU": { + "name": "ZUIKAKU", + "type": "Aircraft Carrier", + "era": [ + "WW2" + ], + "label": "ZUIKAKU", + "shortLabel": "ZUIKAKU", + "range": "", + "filename": "" + }, + "Zwezdny": { + "name": "Zwezdny", + "type": "Civilian Boat", + "era": [ + "Modern" + ], + "label": "Zwezdny", + "shortLabel": "Zwezdny", + "range": "", + "filename": "" + } + } + } +} + +export var navyUnitDatabase = new NavyUnitDatabase(); diff --git a/client/src/units/unit.ts b/client/src/units/unit.ts index 14e6f44e..ba412afd 100644 --- a/client/src/units/unit.ts +++ b/client/src/units/unit.ts @@ -538,9 +538,13 @@ export class Unit extends CustomMarker { if (typeof (roles) === "string") roles = [roles]; - return this.getDatabase()?.getByName(this.#name)?.loadouts.some((loadout: LoadoutBlueprint) => { - return (roles as string[]).some((role: string) => { return loadout.roles.includes(role) }); - }); + var loadouts = this.getDatabase()?.getByName(this.#name)?.loadouts; + if (loadouts) { + return loadouts.some((loadout: LoadoutBlueprint) => { + return (roles as string[]).some((role: string) => { return loadout.roles.includes(role) }); + }); + } else + return false; } /********************** Unit commands *************************/ @@ -731,7 +735,7 @@ export class Unit extends CustomMarker { } if (Object.keys(options).length > 0) { - getMap().showUnitContextMenu(e); + getMap().showUnitContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng); getMap().getUnitContextMenu().setOptions(options, (option: string) => { getMap().hideUnitContextMenu(); this.#executeAction(e, option); @@ -774,7 +778,8 @@ export class Unit extends CustomMarker { getMap().hideUnitContextMenu(); this.#applyFollowOptions(option); }); - getMap().showUnitContextMenu(e); + + getMap().showUnitContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng); } #applyFollowOptions(action: string) { diff --git a/client/src/units/unitdatabase.ts b/client/src/units/unitdatabase.ts index 24f5105e..fc1bf302 100644 --- a/client/src/units/unitdatabase.ts +++ b/client/src/units/unitdatabase.ts @@ -9,16 +9,30 @@ export class UnitDatabase { getRoles() { var roles: string[] = []; for (let unit in this.blueprints) { - for (let loadout of this.blueprints[unit].loadouts) { - for (let role of loadout.roles) { - if (role !== "" && !roles.includes(role)) - roles.push(role); + var loadouts = this.blueprints[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 types: string[] = []; + for (let unit in this.blueprints) { + var type = this.blueprints[unit].type; + if (type && type !== "" && !types.includes(type)) + types.push(type); + } + return types; + } + /* Gets a specific blueprint by name */ getByName(name: string) { if (name in this.blueprints) @@ -35,7 +49,7 @@ export class UnitDatabase { return null; } - /* Gets a specific blueprint by range */ + /* Get all blueprints by range */ getByRange(range: string) { var unitswithrange = []; for (let unit in this.blueprints) { @@ -46,7 +60,7 @@ export class UnitDatabase { return unitswithrange; } - /* Gets a specific blueprint by type */ + /* Get all blueprints by type */ getByType(type: string) { var units = []; for (let unit in this.blueprints) { @@ -61,10 +75,13 @@ export class UnitDatabase { getByRole(role: string) { var units = []; for (let unit in this.blueprints) { - for (let loadout of this.blueprints[unit].loadouts) { - if (loadout.roles.includes(role) || loadout.roles.includes(role.toLowerCase())) { - units.push(this.blueprints[unit]) - break; + var loadouts = this.blueprints[unit].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if (loadout.roles.includes(role) || loadout.roles.includes(role.toLowerCase())) { + units.push(this.blueprints[unit]) + break; + } } } } @@ -73,20 +90,26 @@ export class UnitDatabase { /* Get the names of all the loadouts for a specific unit and for a specific role */ getLoadoutNamesByRole(name: string, role: string) { - var loadouts = []; - for (let loadout of this.blueprints[name].loadouts) { - if (loadout.roles.includes(role) || loadout.roles.includes("")) { - loadouts.push(loadout.name) + var loadoutsByRole = []; + var loadouts = this.blueprints[name].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if (loadout.roles.includes(role) || loadout.roles.includes("")) { + loadoutsByRole.push(loadout.name) + } } } - return loadouts; + return loadoutsByRole; } /* Get the loadout content from the unit name and loadout name */ getLoadoutByName(name: string, loadoutName: string) { - for (let loadout of this.blueprints[name].loadouts) { - if (loadout.name === loadoutName) - return loadout; + var loadouts = this.blueprints[name].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if (loadout.name === loadoutName) + return loadout; + } } return null; } diff --git a/client/src/units/unitsmanager.ts b/client/src/units/unitsmanager.ts index 355753bb..8f2fb8ad 100644 --- a/client/src/units/unitsmanager.ts +++ b/client/src/units/unitsmanager.ts @@ -5,7 +5,7 @@ import { cloneUnit, setLastUpdateTime, spawnGroundUnits } from "../server/server import { deg2rad, keyEventWasInInput, latLngToMercator, mToFt, mercatorToLatLng, msToKnots, polygonArea, randomPointInPoly, randomUnitBlueprintByRole } from "../other/utils"; import { CoalitionArea } from "../map/coalitionarea"; import { Airbase } from "../missionhandler/airbase"; -import { groundUnitsDatabase } from "./groundunitsdatabase"; +import { groundUnitDatabase } from "./groundunitdatabase"; import { DataIndexes, HIDE_ALL, IADSRoles, IDLE, MOVE_UNIT } from "../constants/constants"; import { DataExtractor } from "./dataextractor"; import { Contact } from "../@types/unit"; @@ -561,7 +561,7 @@ export class UnitsManager { const role = activeRoles[Math.floor(Math.random() * activeRoles.length)]; const probability = Math.pow(1 - minDistance / 50e3, 5) * IADSRoles[role]; if (Math.random() < probability){ - const unitBlueprint = randomUnitBlueprintByRole(groundUnitsDatabase, role); + const unitBlueprint = randomUnitBlueprintByRole(groundUnitDatabase, role); spawnGroundUnits([{unitType: unitBlueprint.name, location: latlng}], coalitionArea.getCoalition(), true); getMap().addTemporaryMarker(latlng, unitBlueprint.name, coalitionArea.getCoalition()); } diff --git a/client/views/other/contextmenus.ejs b/client/views/other/contextmenus.ejs index ee41d2e4..cc2fe2aa 100644 --- a/client/views/other/contextmenus.ejs +++ b/client/views/other/contextmenus.ejs @@ -1,15 +1,21 @@
-
+
- + data-on-click-params='{ "type": "aircraft" }' class="ol-contexmenu-button"> + + + + data-on-click-params='{ "type": "smoke" }' class="ol-contexmenu-button"> + data-on-click-params='{ "type": "explosion" }' class="ol-contexmenu-button"> +
@@ -22,7 +28,7 @@
-
Aircraft type
+
Aircraft name
Select role first
@@ -30,7 +36,7 @@
-
+
Loadout
Select type first
@@ -58,34 +64,88 @@
-
- -
+
+ +
-
+
-
-
Ground unit role
+
+
Helicopter role
- +
-
-
Ground unit type
+
+
Helicopter name
Select role first
- + +
+
+
+
+
+
Loadout
+
+
Select type first
+
Group members
-
+
+
+
+ +
+
+
+
+
+
Spawn altitude +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+
+
+
Ground unit type
+
+ +
+
+
+
+
+
Ground unit name
+
+
Select role first
+ +
+
+
+
+
Group members
+
@@ -94,6 +154,35 @@
+
@@ -102,10 +191,10 @@
- - - - + + + +
@@ -128,16 +217,16 @@
-
+
- + data-on-click-params='{ "type": "iads" }' class="ol-contexmenu-button"> + + class="ol-contexmenu-button"> + class="ol-contexmenu-button">
diff --git a/client/views/panels/navbar.ejs b/client/views/panels/navbar.ejs index fb08ee90..e6108501 100644 --- a/client/views/panels/navbar.ejs +++ b/client/views/panels/navbar.ejs @@ -69,9 +69,6 @@
-