Merge branch 'develop_2_3_x' into develop

# Conflicts:
#	changelog.md
#	game/procurement.py
#	resources/factions/iraq_1991.json
This commit is contained in:
Khopa 2020-12-22 23:32:06 +01:00
commit b0ad664ece
86 changed files with 494 additions and 446 deletions

View File

@ -5,9 +5,21 @@ Saves from 2.3 are not compatible with 2.4.
## Features/Improvements ## Features/Improvements
* **[Flight Planner]** Air-to-air and SEAD escorts will no longer be automatically planned for packages that are not in range of threats. * **[Flight Planner]** Air-to-air and SEAD escorts will no longer be automatically planned for packages that are not in range of threats.
# 2.3.3
## Features/Improvements
* **[Campaigns]** Reworked Golan Heights campaign on Syria, (Added FOB and preset locations for SAMS)
* **[Campaigns]** Added a lite version of the Golan Heights campaign
* **[Campaigns]** Reworked Syrian Civil War campaign (Added FOB and preset locations for SAMS)
* **[Factions]** Updated Nato Desert Storm to include F-14A
* **[Factions]** Updated Iraq 1991 factions to include Zsu-57 and Mig-29A
* **[Plugins]** [The EWRS plugin](https://github.com/Bob7heBuilder/EWRS) is now included. * **[Plugins]** [The EWRS plugin](https://github.com/Bob7heBuilder/EWRS) is now included.
## Fixes ## Fixes:
* **[Factions]** AI would never buy artillery units for the frontline - fixed
* **[Factions]** Removed the F-111 unit from the NATO desert storm faction. (Recruiting it would cause crashes in DCS, since it is not a valid unit)
* **[Units]** Fixed SPG_Stryker_M1128_MGS not being in db
# 2.3.2 # 2.3.2

View File

@ -389,6 +389,7 @@ PRICES = {
Armor.ATGM_M1045_HMMWV_TOW: 8, Armor.ATGM_M1045_HMMWV_TOW: 8,
Armor.IFV_M2A2_Bradley: 12, Armor.IFV_M2A2_Bradley: 12,
Armor.APC_M1126_Stryker_ICV: 10, Armor.APC_M1126_Stryker_ICV: 10,
Armor.SPG_M1128_Stryker_MGS: 14,
Armor.ATGM_M1134_Stryker: 12, Armor.ATGM_M1134_Stryker: 12,
Armor.MBT_M60A3_Patton: 16, Armor.MBT_M60A3_Patton: 16,
Armor.MBT_M1A2_Abrams: 25, Armor.MBT_M1A2_Abrams: 25,
@ -765,6 +766,7 @@ UNIT_BY_TASK = {
Armor.APC_M1126_Stryker_ICV, Armor.APC_M1126_Stryker_ICV,
Armor.APC_M1126_Stryker_ICV, Armor.APC_M1126_Stryker_ICV,
Armor.APC_M1126_Stryker_ICV, Armor.APC_M1126_Stryker_ICV,
Armor.SPG_M1128_Stryker_MGS,
Armor.IFV_MCV_80, Armor.IFV_MCV_80,
Armor.IFV_MCV_80, Armor.IFV_MCV_80,
Armor.IFV_MCV_80, Armor.IFV_MCV_80,
@ -847,6 +849,23 @@ UNIT_BY_TASK = {
Artillery.M12_GMC, Artillery.M12_GMC,
Artillery.Sturmpanzer_IV_Brummbär, Artillery.Sturmpanzer_IV_Brummbär,
AirDefence.AAA_ZU_23_on_Ural_375,
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
AirDefence.AAA_ZSU_57_2,
AirDefence.SPAAA_ZSU_23_4_Shilka,
AirDefence.SAM_SA_8_Osa_9A33,
AirDefence.SAM_SA_9_Strela_1_9P31,
AirDefence.SAM_SA_13_Strela_10M3_9A35M3,
AirDefence.SAM_SA_15_Tor_9A331,
AirDefence.SAM_SA_19_Tunguska_2S6,
AirDefence.SPAAA_Gepard,
AirDefence.AAA_Vulcan_M163,
AirDefence.SAM_Linebacker_M6,
AirDefence.SAM_Chaparral_M48,
AirDefence.SAM_Avenger_M1097,
AirDefence.SAM_Roland_ADS,
AirDefence.HQ_7_Self_Propelled_LN,
frenchpack.DIM__TOYOTA_BLUE, frenchpack.DIM__TOYOTA_BLUE,
frenchpack.DIM__TOYOTA_DESERT, frenchpack.DIM__TOYOTA_DESERT,
frenchpack.DIM__TOYOTA_GREEN, frenchpack.DIM__TOYOTA_GREEN,
@ -872,23 +891,6 @@ UNIT_BY_TASK = {
], ],
AirDefence: [ AirDefence: [
# those are listed multiple times here to balance prioritization more into lower tier AAs
AirDefence.AAA_Vulcan_M163,
AirDefence.AAA_Vulcan_M163,
AirDefence.AAA_Vulcan_M163,
AirDefence.SAM_Linebacker_M6,
AirDefence.SPAAA_ZSU_23_4_Shilka,
AirDefence.AAA_ZU_23_Closed,
AirDefence.SAM_SA_9_Strela_1_9P31,
AirDefence.SAM_SA_8_Osa_9A33,
AirDefence.SAM_SA_19_Tunguska_2S6,
AirDefence.SAM_SA_6_Kub_LN_2P25,
AirDefence.SAM_SA_3_S_125_LN_5P73,
AirDefence.SAM_Hawk_PCP,
AirDefence.SAM_SA_2_LN_SM_90,
AirDefence.SAM_SA_11_Buk_LN_9A310M1,
], ],
Reconnaissance: [Unarmed.Transport_M818, Unarmed.Transport_Ural_375, Unarmed.Transport_UAZ_469], Reconnaissance: [Unarmed.Transport_M818, Unarmed.Transport_Ural_375, Unarmed.Transport_UAZ_469],
Nothing: [Infantry.Infantry_M4, Infantry.Soldier_AK, ], Nothing: [Infantry.Infantry_M4, Infantry.Soldier_AK, ],

View File

@ -1,8 +1,8 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
import math import math
import random import random
from dataclasses import dataclass
from typing import Iterator, List, Optional, TYPE_CHECKING, Type from typing import Iterator, List, Optional, TYPE_CHECKING, Type
from dcs.task import CAP, CAS from dcs.task import CAP, CAS
@ -75,15 +75,25 @@ class ProcurementAi:
return budget return budget
def random_affordable_ground_unit( def random_affordable_ground_unit(
self, budget: int) -> Optional[Type[VehicleType]]: self, budget: int, cp: ControlPoint) -> Optional[Type[VehicleType]]:
affordable_units = [u for u in self.faction.frontline_units if affordable_units = [u for u in self.faction.frontline_units + self.faction.artillery_units if
db.PRICES[u] <= budget] db.PRICES[u] <= budget]
total_number_aa = cp.base.total_frontline_aa + cp.pending_frontline_aa_deliveries_count
total_non_aa = cp.base.total_armor + cp.pending_deliveries_count - total_number_aa
max_aa = math.ceil(total_non_aa/8)
# Limit the number of AA units the AI will buy
if not total_number_aa < max_aa:
for unit in [u for u in affordable_units if u in TYPE_SHORAD]:
affordable_units.remove(unit)
if not affordable_units: if not affordable_units:
return None return None
return random.choice(affordable_units) return random.choice(affordable_units)
def reinforce_front_line(self, budget: int) -> int: def reinforce_front_line(self, budget: int) -> int:
if not self.faction.frontline_units: if not self.faction.frontline_units and not self.faction.artillery_units:
return budget return budget
while budget > 0: while budget > 0:
@ -92,7 +102,7 @@ class ProcurementAi:
break break
cp = random.choice(candidates) cp = random.choice(candidates)
unit = self.random_affordable_ground_unit(budget) unit = self.random_affordable_ground_unit(budget, cp)
if unit is None: if unit is None:
# Can't afford any more units. # Can't afford any more units.
break break

View File

@ -9,6 +9,7 @@ from dcs.unittype import FlyingType, UnitType, VehicleType
from dcs.vehicles import AirDefence, Armor from dcs.vehicles import AirDefence, Armor
from game import db from game import db
from gen.ground_forces.ai_ground_planner_db import TYPE_SHORAD
STRENGTH_AA_ASSEMBLE_MIN = 0.2 STRENGTH_AA_ASSEMBLE_MIN = 0.2
PLANES_SCRAMBLE_MIN_BASE = 2 PLANES_SCRAMBLE_MIN_BASE = 2
@ -36,6 +37,10 @@ class Base:
def total_armor(self) -> int: def total_armor(self) -> int:
return sum(self.armor.values()) return sum(self.armor.values())
@property
def total_frontline_aa(self) -> int:
return sum([v for k, v in self.armor.items() if k in TYPE_SHORAD])
@property @property
def total_aa(self) -> int: def total_aa(self) -> int:
return sum(self.aa.values()) return sum(self.aa.values())

View File

@ -20,6 +20,7 @@ from dcs.terrain.terrain import Airport, ParkingSlot
from dcs.unittype import FlyingType from dcs.unittype import FlyingType
from game import db from game import db
from gen.ground_forces.ai_ground_planner_db import TYPE_SHORAD
from gen.runways import RunwayAssigner, RunwayData from gen.runways import RunwayAssigner, RunwayData
from gen.ground_forces.combat_stance import CombatStance from gen.ground_forces.combat_stance import CombatStance
from .base import Base from .base import Base
@ -457,6 +458,26 @@ class ControlPoint(MissionTarget, ABC):
u.position.x = u.position.x + delta.x u.position.x = u.position.x + delta.x
u.position.y = u.position.y + delta.y u.position.y = u.position.y + delta.y
@property
def pending_frontline_aa_deliveries_count(self):
"""
Get number of pending frontline aa units
"""
if self.pending_unit_deliveries:
return sum([v for k,v in self.pending_unit_deliveries.units.items() if k in TYPE_SHORAD])
else:
return 0
@property
def pending_deliveries_count(self):
"""
Get number of pending units
"""
if self.pending_unit_deliveries:
return sum([v for k, v in self.pending_unit_deliveries.units.items()])
else:
return 0
class Airfield(ControlPoint): class Airfield(ControlPoint):

View File

@ -675,12 +675,14 @@ class GroundConflictGenerator:
else: else:
g.set_skill(self.game.settings.enemy_vehicle_skill) g.set_skill(self.game.settings.enemy_vehicle_skill)
positioned_groups.append((g, group)) positioned_groups.append((g, group))
self.gen_infantry_group_for_group(
g, if group.role in [CombatGroupRole.APC, CombatGroupRole.IFV]:
is_player, self.gen_infantry_group_for_group(
self.mission.country(country), g,
opposite_heading(spawn_heading) is_player,
) self.mission.country(country),
opposite_heading(spawn_heading)
)
else: else:
logging.warning(f"Unable to get valid position for {group}") logging.warning(f"Unable to get valid position for {group}")

View File

@ -3,180 +3,14 @@ from enum import Enum
from typing import Dict, List from typing import Dict, List
from dcs.unittype import VehicleType from dcs.unittype import VehicleType
from dcs.vehicles import Armor, Artillery, Infantry, Unarmed
import pydcs_extensions.frenchpack.frenchpack as frenchpack
from game.theater import ControlPoint from game.theater import ControlPoint
from gen.ground_forces.ai_ground_planner_db import *
from gen.ground_forces.combat_stance import CombatStance from gen.ground_forces.combat_stance import CombatStance
TYPE_TANKS = [
Armor.MBT_T_55,
Armor.MBT_T_72B,
Armor.MBT_T_72B3,
Armor.MBT_T_80U,
Armor.MBT_T_90,
Armor.MBT_Leopard_2,
Armor.MBT_Leopard_1A3,
Armor.MBT_Leclerc,
Armor.MBT_Challenger_II,
Armor.MBT_M1A2_Abrams,
Armor.MBT_M60A3_Patton,
Armor.MBT_Merkava_Mk__4,
Armor.ZTZ_96B,
# WW2
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
Armor.MT_Pz_Kpfw_IV_Ausf_H,
Armor.HT_Pz_Kpfw_VI_Tiger_I,
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
Armor.MT_M4_Sherman,
Armor.MT_M4A4_Sherman_Firefly,
Armor.StuG_IV,
Armor.CT_Centaur_IV,
Armor.CT_Cromwell_IV,
Armor.HIT_Churchill_VII,
Armor.LT_Mk_VII_Tetrarch,
# Mods
frenchpack.DIM__TOYOTA_BLUE,
frenchpack.DIM__TOYOTA_GREEN,
frenchpack.DIM__TOYOTA_DESERT,
frenchpack.DIM__KAMIKAZE,
frenchpack.AMX_10RCR,
frenchpack.AMX_10RCR_SEPAR,
frenchpack.AMX_30B2,
frenchpack.Leclerc_Serie_XXI,
]
TYPE_ATGM = [
Armor.ATGM_M1045_HMMWV_TOW,
Armor.ATGM_M1134_Stryker,
Armor.IFV_BMP_2,
# WW2 (Tank Destroyers)
Armor.M30_Cargo_Carrier,
Armor.TD_Jagdpanzer_IV,
Armor.TD_Jagdpanther_G1,
Armor.TD_M10_GMC,
# Mods
frenchpack.VBAE_CRAB_MMP,
frenchpack.VAB_MEPHISTO,
frenchpack.TRM_2000_PAMELA,
]
TYPE_IFV = [
Armor.IFV_BMP_3,
Armor.IFV_BMP_2,
Armor.IFV_BMP_1,
Armor.IFV_Marder,
Armor.IFV_MCV_80,
Armor.IFV_LAV_25,
Armor.AC_Sd_Kfz_234_2_Puma,
Armor.IFV_M2A2_Bradley,
Armor.IFV_BMD_1,
Armor.ZBD_04A,
# WW2
Armor.AC_Sd_Kfz_234_2_Puma,
Armor.LAC_M8_Greyhound,
Armor.Daimler_Armoured_Car,
# Mods
frenchpack.ERC_90,
frenchpack.VBAE_CRAB,
frenchpack.VAB_T20_13
]
TYPE_APC = [
Armor.APC_M1043_HMMWV_Armament,
Armor.APC_M1126_Stryker_ICV,
Armor.APC_M113,
Armor.APC_BTR_80,
Armor.APC_BTR_82A,
Armor.APC_MTLB,
Armor.APC_M2A1,
Armor.APC_Cobra,
Armor.APC_Sd_Kfz_251,
Armor.APC_AAV_7,
Armor.TPz_Fuchs,
Armor.ARV_BRDM_2,
Armor.ARV_BTR_RD,
Armor.FDDM_Grad,
# WW2
Armor.APC_M2A1,
Armor.APC_Sd_Kfz_251,
# Mods
frenchpack.VAB__50,
frenchpack.VBL__50,
frenchpack.VBL_AANF1,
]
TYPE_ARTILLERY = [
Artillery.MLRS_9A52_Smerch,
Artillery.SPH_2S1_Gvozdika,
Artillery.SPH_2S3_Akatsia,
Artillery.MLRS_BM_21_Grad,
Artillery.MLRS_9K57_Uragan_BM_27,
Artillery.SPH_M109_Paladin,
Artillery.MLRS_M270,
Artillery.SPH_2S9_Nona,
Artillery.SpGH_Dana,
Artillery.SPH_2S19_Msta,
Artillery.MLRS_FDDM,
# WW2
Artillery.Sturmpanzer_IV_Brummbär,
Artillery.M12_GMC
]
TYPE_LOGI = [
Unarmed.Transport_M818,
Unarmed.Transport_KAMAZ_43101,
Unarmed.Transport_Ural_375,
Unarmed.Transport_GAZ_66,
Unarmed.Transport_GAZ_3307,
Unarmed.Transport_GAZ_3308,
Unarmed.Transport_Ural_4320_31_Armored,
Unarmed.Transport_Ural_4320T,
Unarmed.Blitz_3_6_6700A,
Unarmed.Kübelwagen_82,
Unarmed.Sd_Kfz_7,
Unarmed.Sd_Kfz_2,
Unarmed.Willys_MB,
Unarmed.Land_Rover_109_S3,
Unarmed.Land_Rover_101_FC,
# Mods
frenchpack.VBL,
frenchpack.VAB,
]
TYPE_INFANTRY = [
Infantry.Infantry_Soldier_Insurgents,
Infantry.Soldier_AK,
Infantry.Infantry_M1_Garand,
Infantry.Infantry_Mauser_98,
Infantry.Infantry_SMLE_No_4_Mk_1,
Infantry.Georgian_soldier_with_M4,
Infantry.Infantry_Soldier_Rus,
Infantry.Paratrooper_AKS,
Infantry.Paratrooper_RPG_16,
Infantry.Soldier_M249,
Infantry.Infantry_M4,
Infantry.Soldier_RPG,
]
MAX_COMBAT_GROUP_PER_CP = 10 MAX_COMBAT_GROUP_PER_CP = 10
class CombatGroupRole(Enum): class CombatGroupRole(Enum):
TANK = 1 TANK = 1
APC = 2 APC = 2
@ -224,6 +58,7 @@ class CombatGroup:
s += "UNITS " + self.units[0].name + " * " + str(len(self.units)) s += "UNITS " + self.units[0].name + " * " + str(len(self.units))
return s return s
class GroundPlanner: class GroundPlanner:
def __init__(self, cp:ControlPoint, game): def __init__(self, cp:ControlPoint, game):
@ -243,7 +78,6 @@ class GroundPlanner:
self.units_per_cp[cp.id] = [] self.units_per_cp[cp.id] = []
self.reserve: List[CombatGroup] = [] self.reserve: List[CombatGroup] = []
def plan_groundwar(self): def plan_groundwar(self):
if hasattr(self.cp, 'stance'): if hasattr(self.cp, 'stance'):
@ -275,6 +109,9 @@ class GroundPlanner:
elif key in TYPE_ATGM: elif key in TYPE_ATGM:
collection = self.atgm_group collection = self.atgm_group
role = CombatGroupRole.ATGM role = CombatGroupRole.ATGM
elif key in TYPE_SHORAD:
collection = self.shorad_groups
role = CombatGroupRole.SHORAD
else: else:
print("Warning unit type not handled by ground generator") print("Warning unit type not handled by ground generator")
print(key) print(key)
@ -282,12 +119,16 @@ class GroundPlanner:
available = self.cp.base.armor[key] available = self.cp.base.armor[key]
while available > 0: while available > 0:
n = random.choice(group_size_choice)
if n > available: if role == CombatGroupRole.SHORAD:
if available >= 2: n = 1
n = 2 else:
else: n = random.choice(group_size_choice)
n = 1 if n > available:
if available >= 2:
n = 2
else:
n = 1
available -= n available -= n
group = CombatGroup(role) group = CombatGroup(role)

View File

@ -0,0 +1,197 @@
from dcs.vehicles import AirDefence, Infantry, Unarmed, Artillery, Armor
from pydcs_extensions.frenchpack import frenchpack
TYPE_TANKS = [
Armor.MBT_T_55,
Armor.MBT_T_72B,
Armor.MBT_T_72B3,
Armor.MBT_T_80U,
Armor.MBT_T_90,
Armor.MBT_Leopard_2,
Armor.MBT_Leopard_1A3,
Armor.MBT_Leclerc,
Armor.MBT_Challenger_II,
Armor.MBT_M1A2_Abrams,
Armor.MBT_M60A3_Patton,
Armor.MBT_Merkava_Mk__4,
Armor.ZTZ_96B,
# WW2
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
Armor.MT_Pz_Kpfw_IV_Ausf_H,
Armor.HT_Pz_Kpfw_VI_Tiger_I,
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
Armor.MT_M4_Sherman,
Armor.MT_M4A4_Sherman_Firefly,
Armor.StuG_IV,
Armor.CT_Centaur_IV,
Armor.CT_Cromwell_IV,
Armor.HIT_Churchill_VII,
Armor.LT_Mk_VII_Tetrarch,
# Mods
frenchpack.DIM__TOYOTA_BLUE,
frenchpack.DIM__TOYOTA_GREEN,
frenchpack.DIM__TOYOTA_DESERT,
frenchpack.DIM__KAMIKAZE,
frenchpack.AMX_10RCR,
frenchpack.AMX_10RCR_SEPAR,
frenchpack.AMX_30B2,
frenchpack.Leclerc_Serie_XXI,
]
TYPE_ATGM = [
Armor.ATGM_M1045_HMMWV_TOW,
Armor.ATGM_M1134_Stryker,
Armor.IFV_BMP_2,
# WW2 (Tank Destroyers)
Armor.M30_Cargo_Carrier,
Armor.TD_Jagdpanzer_IV,
Armor.TD_Jagdpanther_G1,
Armor.TD_M10_GMC,
# Mods
frenchpack.VBAE_CRAB_MMP,
frenchpack.VAB_MEPHISTO,
frenchpack.TRM_2000_PAMELA,
]
TYPE_IFV = [
Armor.IFV_BMP_3,
Armor.IFV_BMP_2,
Armor.IFV_BMP_1,
Armor.IFV_Marder,
Armor.IFV_MCV_80,
Armor.IFV_LAV_25,
Armor.SPG_M1128_Stryker_MGS,
Armor.AC_Sd_Kfz_234_2_Puma,
Armor.IFV_M2A2_Bradley,
Armor.IFV_BMD_1,
Armor.ZBD_04A,
# WW2
Armor.AC_Sd_Kfz_234_2_Puma,
Armor.LAC_M8_Greyhound,
Armor.Daimler_Armoured_Car,
# Mods
frenchpack.ERC_90,
frenchpack.VBAE_CRAB,
frenchpack.VAB_T20_13
]
TYPE_APC = [
Armor.APC_M1043_HMMWV_Armament,
Armor.APC_M1126_Stryker_ICV,
Armor.APC_M113,
Armor.APC_BTR_80,
Armor.APC_BTR_82A,
Armor.APC_MTLB,
Armor.APC_M2A1,
Armor.APC_Cobra,
Armor.APC_Sd_Kfz_251,
Armor.APC_AAV_7,
Armor.TPz_Fuchs,
Armor.ARV_BRDM_2,
Armor.ARV_BTR_RD,
Armor.FDDM_Grad,
# WW2
Armor.APC_M2A1,
Armor.APC_Sd_Kfz_251,
# Mods
frenchpack.VAB__50,
frenchpack.VBL__50,
frenchpack.VBL_AANF1,
]
TYPE_ARTILLERY = [
Artillery.MLRS_9A52_Smerch,
Artillery.SPH_2S1_Gvozdika,
Artillery.SPH_2S3_Akatsia,
Artillery.MLRS_BM_21_Grad,
Artillery.MLRS_9K57_Uragan_BM_27,
Artillery.SPH_M109_Paladin,
Artillery.MLRS_M270,
Artillery.SPH_2S9_Nona,
Artillery.SpGH_Dana,
Artillery.SPH_2S19_Msta,
Artillery.MLRS_FDDM,
# WW2
Artillery.Sturmpanzer_IV_Brummbär,
Artillery.M12_GMC
]
TYPE_LOGI = [
Unarmed.Transport_M818,
Unarmed.Transport_KAMAZ_43101,
Unarmed.Transport_Ural_375,
Unarmed.Transport_GAZ_66,
Unarmed.Transport_GAZ_3307,
Unarmed.Transport_GAZ_3308,
Unarmed.Transport_Ural_4320_31_Armored,
Unarmed.Transport_Ural_4320T,
Unarmed.Blitz_3_6_6700A,
Unarmed.Kübelwagen_82,
Unarmed.Sd_Kfz_7,
Unarmed.Sd_Kfz_2,
Unarmed.Willys_MB,
Unarmed.Land_Rover_109_S3,
Unarmed.Land_Rover_101_FC,
# Mods
frenchpack.VBL,
frenchpack.VAB,
]
TYPE_INFANTRY = [
Infantry.Infantry_Soldier_Insurgents,
Infantry.Soldier_AK,
Infantry.Infantry_M1_Garand,
Infantry.Infantry_Mauser_98,
Infantry.Infantry_SMLE_No_4_Mk_1,
Infantry.Georgian_soldier_with_M4,
Infantry.Infantry_Soldier_Rus,
Infantry.Paratrooper_AKS,
Infantry.Paratrooper_RPG_16,
Infantry.Soldier_M249,
Infantry.Infantry_M4,
Infantry.Soldier_RPG,
]
TYPE_SHORAD = [
AirDefence.AAA_ZU_23_on_Ural_375,
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
AirDefence.AAA_ZSU_57_2,
AirDefence.SPAAA_ZSU_23_4_Shilka,
AirDefence.SAM_SA_8_Osa_9A33,
AirDefence.SAM_SA_9_Strela_1_9P31,
AirDefence.SAM_SA_13_Strela_10M3_9A35M3,
AirDefence.SAM_SA_15_Tor_9A331,
AirDefence.SAM_SA_19_Tunguska_2S6,
AirDefence.SPAAA_Gepard,
AirDefence.AAA_Vulcan_M163,
AirDefence.SAM_Linebacker_M6,
AirDefence.SAM_Chaparral_M48,
AirDefence.SAM_Avenger_M1097,
AirDefence.SAM_Roland_ADS,
AirDefence.HQ_7_Self_Propelled_LN,
AirDefence.AAA_8_8cm_Flak_18,
AirDefence.AAA_8_8cm_Flak_41,
AirDefence.AAA_Bofors_40mm,
AirDefence.AAA_M1_37mm,
AirDefence.AA_gun_QF_3_7,
]

2
pydcs

@ -1 +1 @@
Subproject commit edc87fab1d65d4e4153c84006f537e6ae6b0671a Subproject commit 059c88c91b5be4b5b6406249a52527c3ccea3db9

View File

@ -47,7 +47,7 @@ class QMapObject(QGraphicsRectItem):
object_details_action.triggered.connect(self.on_click) object_details_action.triggered.connect(self.on_click)
menu.addAction(object_details_action) menu.addAction(object_details_action)
# Not all locations have valid objetives. Off-map spawns, for example, # Not all locations have valid objectives. Off-map spawns, for example,
# have no mission types. # have no mission types.
if list(self.mission_target.mission_types(for_player=True)): if list(self.mission_target.mission_types(for_player=True)):
new_package_action = QAction(f"New package") new_package_action = QAction(f"New package")

View File

@ -0,0 +1,7 @@
{
"name": "Syria - Battle for Golan Heights",
"theater": "Syria",
"authors": "Khopa",
"description": "<p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.<br/><br/>You can use the inverted configuration to start on the Syrian side.<br/><br/>If this scenario is too heavy, try the lite version.</p>",
"miz": "golan_heights.miz"
}

Binary file not shown.

View File

@ -1,83 +0,0 @@
{
"name": "Syria - Golan heights battle",
"theater": "Syria",
"authors": "Khopa",
"description": "<p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.</p>",
"player_points": [
{
"type": "airbase",
"id": "Ramat David",
"size": 1000,
"importance": 1.4
},
{
"type": "carrier",
"id": 1001,
"x": -280000,
"y": -238000,
"captured_invert": true
},
{
"type": "lha",
"id": 1002,
"x": -237000,
"y": -89800,
"captured_invert": true
}
],
"enemy_points": [
{
"type": "airbase",
"id": "Khalkhalah",
"size": 1000,
"importance": 1.2
},
{
"type": "airbase",
"id": "King Hussein Air College",
"size": 1000,
"importance": 1.4
},
{
"type": "airbase",
"id": "Marj Ruhayyil",
"size": 1000,
"importance": 1
},
{
"type": "airbase",
"id": "Mezzeh",
"size": 1000,
"importance": 1.2
},
{
"type": "airbase",
"id": "Al-Dumayr",
"size": 1000,
"importance": 1.2,
"captured_invert": true
}
],
"links": [
[
"Khalkhalah",
"Ramat David"
],
[
"Khalkhalah",
"King Hussein Air College"
],
[
"Khalkhalah",
"Marj Ruhayyil"
],
[
"Marj Ruhayyil",
"Mezzeh"
],
[
"Al-Dumayr",
"Marj Ruhayyil"
]
]
}

View File

@ -1,7 +1,7 @@
{ {
"name": "Syria - Golan heights lite", "name": "Syria - Battle for Golan Heights - Lite",
"theater": "Syria", "theater": "Syria",
"authors": "Khopa", "authors": "Khopa",
"description": "<p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory. This scenario is designed to be performance friendly.</p>", "description": "<p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.<br/><br/>This scenario is designed to be performance friendly.</p>",
"miz": "golan_heights_lite.miz" "miz": "golan_heights_lite.miz"
} }

View File

@ -2,92 +2,6 @@
"name": "Syria - Syrian Civil War", "name": "Syria - Syrian Civil War",
"theater": "Syria", "theater": "Syria",
"authors": "Khopa", "authors": "Khopa",
"description": "<p>This scenario can be used to simulate parts of the Syrian Civil War.</p>", "description": "<p>This scenario can be used to simulate parts of the Syrian Civil War.<br/><br/>You start on the coast with an airbase in Latakia, and ground forces in Tartus.<br/><br/>This scenario can also be used to simulate a western invasion of Syria.<br/><br/>In inverted configuration you start in Aleppo.</p>",
"player_points": [ "miz": "syrian_civil_war.miz"
{
"type": "airbase",
"id": "Bassel Al-Assad",
"size": 1000,
"importance": 1.4
},
{
"type": "airbase",
"id": "Marj Ruhayyil",
"size": 1000,
"importance": 1
},
{
"type": "carrier",
"id": 1001,
"x": 18537,
"y": -52000,
"captured_invert": true
},
{
"type": "lha",
"id": 1002,
"x": 116000,
"y": -30000,
"captured_invert": true
}
],
"enemy_points": [
{
"type": "airbase",
"id": "Hama",
"size": 1000,
"importance": 1
},
{
"type": "airbase",
"id": "Aleppo",
"size": 1000,
"importance": 1.2,
"captured_invert": true
},
{
"type": "airbase",
"id": "Al Qusayr",
"size": 1000,
"importance": 1
},
{
"type": "airbase",
"id": "Palmyra",
"size": 1000,
"importance": 1
},
{
"type": "airbase",
"id": "Al-Dumayr",
"size": 1000,
"importance": 1.2
}
],
"links": [
[
"Bassel Al-Assad",
"Hama"
],
[
"Al-Dumayr",
"Marj Ruhayyil"
],
[
"Aleppo",
"Hama"
],
[
"Al Qusayr",
"Hama"
],
[
"Al Qusayr",
"Al-Dumayr"
],
[
"Al Qusayr",
"Palmyra"
]
]
} }

Binary file not shown.

View File

@ -46,7 +46,8 @@
"IFV_MCV_80", "IFV_MCV_80",
"MBT_Challenger_II", "MBT_Challenger_II",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"SPG_M1128_Stryker_MGS" "SPG_M1128_Stryker_MGS",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -25,7 +25,9 @@
"LAC_M8_Greyhound", "LAC_M8_Greyhound",
"TD_M10_GMC", "TD_M10_GMC",
"Daimler_Armoured_Car", "Daimler_Armoured_Car",
"LT_Mk_VII_Tetrarch" "LT_Mk_VII_Tetrarch",
"AA_gun_QF_3_7",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
"M12_GMC" "M12_GMC"

View File

@ -15,7 +15,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MT_M4_Sherman", "MT_M4_Sherman",
"APC_M2A1" "APC_M2A1",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -25,7 +25,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"SAM_Chaparral_M48"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -26,7 +26,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"SAM_Chaparral_M48"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -27,7 +27,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"SAM_Chaparral_M48"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -43,7 +43,9 @@
"IFV_Marder", "IFV_Marder",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Linebacker_M6",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -20,7 +20,8 @@
"MBT_Leopard_2", "MBT_Leopard_2",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M113", "APC_M113",
"IFV_MCV_80" "IFV_MCV_80",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -22,7 +22,8 @@
"ZTZ_96B", "ZTZ_96B",
"MBT_T_55", "MBT_T_55",
"ZBD_04A", "ZBD_04A",
"IFV_BMP_1" "IFV_BMP_1",
"HQ_7_Self_Propelled_LN"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9A52_Smerch", "MLRS_9A52_Smerch",

View File

@ -24,7 +24,8 @@
"ATGM_M1134_Stryker", "ATGM_M1134_Stryker",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Roland_ADS"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -31,7 +31,8 @@
"VBAE_CRAB", "VBAE_CRAB",
"VBAE_CRAB_MMP", "VBAE_CRAB_MMP",
"AMX_30B2", "AMX_30B2",
"Leclerc_Serie_XXI" "Leclerc_Serie_XXI",
"SAM_Roland_ADS"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -34,7 +34,8 @@
"VBAE_CRAB", "VBAE_CRAB",
"VBAE_CRAB_MMP", "VBAE_CRAB_MMP",
"AMX_30B2", "AMX_30B2",
"Leclerc_Serie_XXI" "Leclerc_Serie_XXI",
"SAM_Roland_ADS"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -17,7 +17,8 @@
"IFV_BMP_1", "IFV_BMP_1",
"IFV_BMP_2", "IFV_BMP_2",
"MBT_T_72B", "MBT_T_72B",
"MBT_T_55" "MBT_T_55",
"SAM_SA_13_Strela_10M3_9A35M3"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad", "MLRS_BM_21_Grad",

View File

@ -13,7 +13,8 @@
"MT_Pz_Kpfw_IV_Ausf_H", "MT_Pz_Kpfw_IV_Ausf_H",
"APC_Sd_Kfz_251", "APC_Sd_Kfz_251",
"AC_Sd_Kfz_234_2_Puma", "AC_Sd_Kfz_234_2_Puma",
"TD_Jagdpanzer_IV" "TD_Jagdpanzer_IV",
"AAA_8_8cm_Flak_18"
], ],
"artillery_units": [ "artillery_units": [
"Sturmpanzer_IV_Brummbär" "Sturmpanzer_IV_Brummbär"

View File

@ -18,7 +18,9 @@
"AC_Sd_Kfz_234_2_Puma", "AC_Sd_Kfz_234_2_Puma",
"Sd_Kfz_184_Elefant", "Sd_Kfz_184_Elefant",
"TD_Jagdpanther_G1", "TD_Jagdpanther_G1",
"TD_Jagdpanzer_IV" "TD_Jagdpanzer_IV",
"AAA_8_8cm_Flak_18",
"AAA_8_8cm_Flak_41"
], ],
"artillery_units": [ "artillery_units": [
"Sturmpanzer_IV_Brummbär" "Sturmpanzer_IV_Brummbär"

View File

@ -10,7 +10,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MT_Pz_Kpfw_IV_Ausf_H", "MT_Pz_Kpfw_IV_Ausf_H",
"APC_Sd_Kfz_251" "APC_Sd_Kfz_251",
"AAA_8_8cm_Flak_18"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -22,7 +22,8 @@
"TPz_Fuchs", "TPz_Fuchs",
"MBT_Leopard_1A3", "MBT_Leopard_1A3",
"MBT_Leopard_2", "MBT_Leopard_2",
"IFV_Marder" "IFV_Marder",
"SPAAA_Gepard"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -22,7 +22,8 @@
"frontline_units": [ "frontline_units": [
"MBT_T_90", "MBT_T_90",
"MBT_T_72B", "MBT_T_72B",
"IFV_BMP_2" "IFV_BMP_2",
"SAM_SA_19_Tunguska_2S6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9K57_Uragan_BM_27", "MLRS_9K57_Uragan_BM_27",

View File

@ -0,0 +1,39 @@
{
"country": "Insurgents",
"name": "Insurgents",
"authors": "Khopa",
"description": "<p>Insurgents faction.</p>",
"aircrafts": [
],
"frontline_units": [
"ATGM_M1045_HMMWV_TOW",
"APC_M1043_HMMWV_Armament",
"ARV_BRDM_2",
"APC_BTR_80",
"ARV_BTR_RD",
"IFV_BMP_1",
"MBT_T_55",
"AAA_ZU_23_Insurgent_on_Ural_375",
"AAA_ZSU_57_2",
"AAA_ZSU_57_2"
],
"artillery_units": [
"MLRS_BM_21_Grad",
"SPH_2S19_Msta"
],
"logistics_units": [
"Transport_Ural_375",
"Transport_UAZ_469"
],
"infantry_units": [
"Infantry_Soldier_Insurgents",
"Soldier_RPG",
"SAM_SA_18_Igla_MANPADS"
],
"air_defenses": [
"SA9Generator",
"ZSU57Generator",
"ZU23Generator",
"ZU23UralInsurgentGenerator"
]
}

View File

@ -27,7 +27,9 @@
"APC_BTR_80", "APC_BTR_80",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"IFV_BMP_1", "IFV_BMP_1",
"MBT_T_72B" "MBT_T_72B",
"SPAAA_ZSU_23_4_Shilka",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad", "MLRS_BM_21_Grad",

View File

@ -33,7 +33,8 @@
"APC_BTR_80", "APC_BTR_80",
"ARV_BRDM_2", "ARV_BRDM_2",
"SPH_2S1_Gvozdika", "SPH_2S1_Gvozdika",
"AAA_ZSU_57_2" "AAA_ZSU_57_2",
"SPAAA_ZSU_23_4_Shilka"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -15,7 +15,8 @@
"MT_M4A4_Sherman_Firefly", "MT_M4A4_Sherman_Firefly",
"APC_M2A1", "APC_M2A1",
"MT_M4_Sherman", "MT_M4_Sherman",
"LAC_M8_Greyhound" "LAC_M8_Greyhound",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -19,7 +19,8 @@
"MT_M4_Sherman", "MT_M4_Sherman",
"APC_M2A1", "APC_M2A1",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"SAM_Chaparral_M48"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -22,7 +22,8 @@
"frontline_units": [ "frontline_units": [
"APC_M113", "APC_M113",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"MBT_Merkava_Mk__4" "MBT_Merkava_Mk__4",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -23,7 +23,8 @@
"APC_M113", "APC_M113",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW", "ATGM_M1045_HMMWV_TOW",
"MBT_Merkava_Mk__4" "MBT_Merkava_Mk__4",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin", "SPH_M109_Paladin",

View File

@ -18,7 +18,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_Leopard_1A3", "MBT_Leopard_1A3",
"APC_M113" "APC_M113",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -19,7 +19,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_Leopard_1A3", "MBT_Leopard_1A3",
"APC_M113" "APC_M113",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -23,7 +23,8 @@
"IFV_Marder", "IFV_Marder",
"TPz_Fuchs", "TPz_Fuchs",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament" "APC_M1043_HMMWV_Armament",
"SPAAA_Gepard"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin", "SPH_M109_Paladin",

View File

@ -20,7 +20,9 @@
"IFV_BMP_1", "IFV_BMP_1",
"ARV_BRDM_2", "ARV_BRDM_2",
"MBT_T_72B", "MBT_T_72B",
"MBT_T_55" "MBT_T_55",
"SPAAA_ZSU_23_4_Shilka",
"SAM_SA_8_Osa_9A33"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -17,7 +17,8 @@
], ],
"frontline_units": [ "frontline_units": [
"APC_M113", "APC_M113",
"MBT_Leopard_1A3" "MBT_Leopard_1A3",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -24,7 +24,9 @@
"IFV_BMP_1", "IFV_BMP_1",
"MBT_T_55", "MBT_T_55",
"MBT_T_72B", "MBT_T_72B",
"MBT_T_80U" "MBT_T_80U",
"AAA_ZSU_57_2",
"SAM_SA_9_Strela_1_9P31"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad", "MLRS_BM_21_Grad",

View File

@ -23,7 +23,8 @@
"MBT_T_55", "MBT_T_55",
"ZBD_04A", "ZBD_04A",
"APC_BTR_80", "APC_BTR_80",
"APC_M113" "APC_M113",
"HQ_7_Self_Propelled_LN"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9A52_Smerch", "MLRS_9A52_Smerch",

View File

@ -13,7 +13,8 @@
"frontline_units": [ "frontline_units": [
"APC_Cobra", "APC_Cobra",
"APC_BTR_80", "APC_BTR_80",
"ARV_BRDM_2" "ARV_BRDM_2",
"SAM_SA_13_Strela_10M3_9A35M3"
], ],
"artillery_units": [ "artillery_units": [
"SPH_2S19_Msta" "SPH_2S19_Msta"

View File

@ -11,7 +11,9 @@
], ],
"frontline_units": [ "frontline_units": [
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"IFV_MCV_80" "IFV_MCV_80",
"IFV_LAV_25",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -12,7 +12,9 @@
], ],
"frontline_units": [ "frontline_units": [
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"IFV_MCV_80" "IFV_MCV_80",
"IFV_LAV_25",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -17,7 +17,8 @@
"FDDM_Grad", "FDDM_Grad",
"APC_MTLB", "APC_MTLB",
"MBT_T_55", "MBT_T_55",
"AAA_ZU_23_on_Ural_375" "AAA_ZU_23_on_Ural_375",
"AAA_8_8cm_Flak_18"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -21,7 +21,9 @@
"ARV_BTR_RD", "ARV_BTR_RD",
"IFV_BMD_1", "IFV_BMD_1",
"IFV_BMP_1", "IFV_BMP_1",
"MBT_T_55" "MBT_T_55",
"AAA_ZU_23_on_Ural_375",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -14,7 +14,8 @@
"APC_BTR_80", "APC_BTR_80",
"IFV_BMD_1", "IFV_BMD_1",
"IFV_BMP_1", "IFV_BMP_1",
"MBT_T_55" "MBT_T_55",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad", "MLRS_BM_21_Grad",

View File

@ -25,7 +25,8 @@
"APC_BTR_80", "APC_BTR_80",
"IFV_BMD_1", "IFV_BMD_1",
"IFV_BMP_1", "IFV_BMP_1",
"MBT_T_55" "MBT_T_55",
"SAM_SA_8_Osa_9A33"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad", "MLRS_BM_21_Grad",

View File

@ -29,7 +29,8 @@
"IFV_BMP_1", "IFV_BMP_1",
"IFV_BMP_2", "IFV_BMP_2",
"MBT_T_72B", "MBT_T_72B",
"MBT_T_80U" "MBT_T_80U",
"SAM_SA_13_Strela_10M3_9A35M3"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9K57_Uragan_BM_27", "MLRS_9K57_Uragan_BM_27",

View File

@ -34,7 +34,8 @@
"APC_BTR_82A", "APC_BTR_82A",
"MBT_T_90", "MBT_T_90",
"MBT_T_80U", "MBT_T_80U",
"MBT_T_72B3" "MBT_T_72B3",
"SAM_SA_19_Tunguska_2S6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9K57_Uragan_BM_27", "MLRS_9K57_Uragan_BM_27",

View File

@ -32,7 +32,8 @@
"IFV_BMP_3", "IFV_BMP_3",
"MBT_T_90", "MBT_T_90",
"MBT_T_80U", "MBT_T_80U",
"MBT_T_72B" "MBT_T_72B",
"SAM_SA_19_Tunguska_2S6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9K57_Uragan_BM_27", "MLRS_9K57_Uragan_BM_27",

View File

@ -11,7 +11,8 @@
"MT_M4_Sherman", "MT_M4_Sherman",
"APC_M2A1", "APC_M2A1",
"Daimler_Armoured_Car", "Daimler_Armoured_Car",
"LT_Mk_VII_Tetrarch" "LT_Mk_VII_Tetrarch",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -20,7 +20,8 @@
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"MBT_Leopard_2", "MBT_Leopard_2",
"APC_M113" "APC_M113",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -18,7 +18,8 @@
"frontline_units": [ "frontline_units": [
"IFV_MCV_80", "IFV_MCV_80",
"MBT_Leopard_2", "MBT_Leopard_2",
"APC_M1126_Stryker_ICV" "APC_M1126_Stryker_ICV",
"SAM_Chaparral_M48"
], ],
"artillery_units": [ "artillery_units": [
], ],
@ -32,7 +33,6 @@
"air_defenses": [ "air_defenses": [
"ChaparralGenerator", "ChaparralGenerator",
"EarlyColdWarFlakGenerator", "EarlyColdWarFlakGenerator",
"AvengerGenerator",
"HawkGenerator", "HawkGenerator",
"VulcanGenerator" "VulcanGenerator"
], ],

View File

@ -17,7 +17,8 @@
"frontline_units": [ "frontline_units": [
"IFV_MCV_80", "IFV_MCV_80",
"MBT_Leopard_2", "MBT_Leopard_2",
"APC_M1126_Stryker_ICV" "APC_M1126_Stryker_ICV",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -11,7 +11,8 @@
"AC_Sd_Kfz_234_2_Puma", "AC_Sd_Kfz_234_2_Puma",
"APC_Sd_Kfz_251", "APC_Sd_Kfz_251",
"MT_Pz_Kpfw_IV_Ausf_H", "MT_Pz_Kpfw_IV_Ausf_H",
"MT_M4_Sherman" "MT_M4_Sherman",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -19,7 +19,9 @@
"frontline_units": [ "frontline_units": [
"ARV_BRDM_2", "ARV_BRDM_2",
"MT_Pz_Kpfw_IV_Ausf_H", "MT_Pz_Kpfw_IV_Ausf_H",
"MBT_T_55" "MBT_T_55",
"AAA_ZU_23_on_Ural_375",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -22,7 +22,8 @@
"MBT_T_55", "MBT_T_55",
"MT_Pz_Kpfw_IV_Ausf_H", "MT_Pz_Kpfw_IV_Ausf_H",
"StuG_III_Ausf__G", "StuG_III_Ausf__G",
"TD_Jagdpanzer_IV" "TD_Jagdpanzer_IV",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -19,7 +19,9 @@
"frontline_units": [ "frontline_units": [
"IFV_BMP_1", "IFV_BMP_1",
"APC_MTLB", "APC_MTLB",
"MBT_T_55" "MBT_T_55",
"AAA_ZU_23_on_Ural_375",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -21,7 +21,9 @@
"IFV_BMP_1", "IFV_BMP_1",
"APC_MTLB", "APC_MTLB",
"MBT_T_55", "MBT_T_55",
"MBT_T_72B" "MBT_T_72B",
"AAA_ZU_23_on_Ural_375",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_BM_21_Grad" "MLRS_BM_21_Grad"

View File

@ -31,7 +31,8 @@
"APC_Cobra", "APC_Cobra",
"MBT_T_55", "MBT_T_55",
"MBT_T_72B", "MBT_T_72B",
"MBT_T_90" "MBT_T_90",
"AAA_ZSU_57_2"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_9K57_Uragan_BM_27", "MLRS_9K57_Uragan_BM_27",

View File

@ -21,7 +21,8 @@
"MBT_Leopard_1A3", "MBT_Leopard_1A3",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_Cobra", "APC_Cobra",
"APC_BTR_80" "APC_BTR_80",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -22,7 +22,8 @@
"CT_Centaur_IV", "CT_Centaur_IV",
"HIT_Churchill_VII", "HIT_Churchill_VII",
"Daimler_Armoured_Car", "Daimler_Armoured_Car",
"LT_Mk_VII_Tetrarch" "LT_Mk_VII_Tetrarch",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -21,7 +21,8 @@
"MBT_Challenger_II", "MBT_Challenger_II",
"IFV_MCV_80", "IFV_MCV_80",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -25,7 +25,8 @@
"IFV_BMP_2", "IFV_BMP_2",
"APC_BTR_80", "APC_BTR_80",
"MBT_T_80U", "MBT_T_80U",
"MBT_T_72B" "MBT_T_72B",
"SAM_SA_13_Strela_10M3_9A35M3"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -33,7 +33,8 @@
"ATGM_M1134_Stryker", "ATGM_M1134_Stryker",
"IFV_M2A2_Bradley", "IFV_M2A2_Bradley",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament" "APC_M1043_HMMWV_Armament",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -19,7 +19,8 @@
"APC_M2A1", "APC_M2A1",
"M30_Cargo_Carrier", "M30_Cargo_Carrier",
"LAC_M8_Greyhound", "LAC_M8_Greyhound",
"TD_M10_GMC" "TD_M10_GMC",
"AA_gun_QF_3_7"
], ],
"artillery_units": [ "artillery_units": [
"M12_GMC" "M12_GMC"

View File

@ -12,7 +12,8 @@
"frontline_units": [ "frontline_units": [
"MT_M4_Sherman", "MT_M4_Sherman",
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M2A1" "APC_M2A1",
"AAA_Bofors_40mm"
], ],
"artillery_units": [ "artillery_units": [
"M12_GMC" "M12_GMC"

View File

@ -12,7 +12,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
], ],

View File

@ -11,7 +11,8 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -12,7 +12,9 @@
], ],
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113" "APC_M113",
"SAM_Chaparral_M48",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin" "SPH_M109_Paladin"

View File

@ -32,7 +32,8 @@
"IFV_M2A2_Bradley", "IFV_M2A2_Bradley",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Avenger_M1097"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -32,7 +32,9 @@
"IFV_M2A2_Bradley", "IFV_M2A2_Bradley",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Avenger_M1097",
"SAM_Linebacker_M6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -33,7 +33,9 @@
"IFV_M2A2_Bradley", "IFV_M2A2_Bradley",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Avenger_M1097",
"SAM_Linebacker_M6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -33,7 +33,9 @@
"IFV_M2A2_Bradley", "IFV_M2A2_Bradley",
"IFV_LAV_25", "IFV_LAV_25",
"APC_M1043_HMMWV_Armament", "APC_M1043_HMMWV_Armament",
"ATGM_M1045_HMMWV_TOW" "ATGM_M1045_HMMWV_TOW",
"SAM_Avenger_M1097",
"SAM_Linebacker_M6"
], ],
"artillery_units": [ "artillery_units": [
"MLRS_M270", "MLRS_M270",

View File

@ -20,7 +20,8 @@
"frontline_units": [ "frontline_units": [
"MBT_M60A3_Patton", "MBT_M60A3_Patton",
"APC_M113", "APC_M113",
"APC_M1025_HMMWV" "APC_M1025_HMMWV",
"AAA_Vulcan_M163"
], ],
"artillery_units": [ "artillery_units": [
"SPH_M109_Paladin", "SPH_M109_Paladin",

Binary file not shown.

Binary file not shown.