From d5990e60c96487a3d5a8b51c013e65c1bb459d57 Mon Sep 17 00:00:00 2001 From: Khopa Date: Fri, 21 May 2021 00:34:51 +0200 Subject: [PATCH 01/40] Helicopter flights can be planned from FOBs --- game/helipad.py | 13 ++++++ game/theater/conflicttheater.py | 3 +- game/theater/controlpoint.py | 34 +++++++++++++-- game/theater/missiontarget.py | 2 +- gen/aircraft.py | 47 ++++++++++++++++----- gen/flights/closestairfields.py | 6 ++- gen/flights/flight.py | 2 + gen/flights/flightplan.py | 1 + gen/groundobjectsgen.py | 2 + resources/campaigns/golan_heights_lite.miz | Bin 29745 -> 30217 bytes 10 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 game/helipad.py diff --git a/game/helipad.py b/game/helipad.py new file mode 100644 index 00000000..8660ad4f --- /dev/null +++ b/game/helipad.py @@ -0,0 +1,13 @@ +from typing import Optional + +from dcs.unitgroup import StaticGroup + +from game.point_with_heading import PointWithHeading + + +class Helipad(PointWithHeading): + def __init__(self): + super(Helipad, self).__init__() + self.heading = 0 + self.occupied = False + self.static_unit: Optional[StaticGroup] = None diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 7e9fa0fe..f4b52de2 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -41,6 +41,7 @@ from dcs.unitgroup import ( ) from dcs.vehicles import AirDefence, Armor, MissilesSS, Unarmed +from ..helipad import Helipad from ..scenery_group import SceneryGroup from pyproj import CRS, Transformer from shapely import geometry, ops @@ -549,7 +550,7 @@ class MizCampaignLoader: for group in self.helipads: closest, distance = self.objective_info(group) closest.helipads.append( - PointWithHeading.from_point(group.position, group.units[0].heading) + Helipad.from_point(group.position, group.units[0].heading) ) for group in self.factories: diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index f2e96a88..0da38c26 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -10,6 +10,7 @@ from enum import Enum from functools import total_ordering from typing import Any, Dict, Iterator, List, Optional, Set, TYPE_CHECKING, Type, Union +from dcs import helicopters from dcs.mapping import Point from dcs.ships import ( CVN_74_John_C__Stennis, @@ -39,6 +40,7 @@ from .theatergroundobject import ( VehicleGroupGroundObject, ) from ..db import PRICES +from ..helipad import Helipad from ..utils import nautical_miles from ..weather import Conditions @@ -296,7 +298,7 @@ class ControlPoint(MissionTarget, ABC): self.connected_objectives: List[TheaterGroundObject] = [] self.base_defenses: List[BaseDefenseGroundObject] = [] self.preset_locations = PresetLocations() - self.helipads: List[PointWithHeading] = [] + self.helipads: List[Helipad] = [] # TODO: Should be Airbase specific. self.size = size @@ -378,6 +380,29 @@ class ControlPoint(MissionTarget, ABC): return True return False + @property + def has_helipads(self) -> bool: + """ + Returns true if cp has helipads + """ + return len(self.helipads) > 0 + + @property + def has_free_helipad(self) -> bool: + """ + Returns true if cp has a free helipad + """ + return False in [h.occupied for h in self.helipads] + + def get_free_helipad(self) -> Optional[Helipad]: + """ + Returns the first free additional helipad + """ + for h in self.helipads: + if not h.occupied: + return h + return None + def can_recruit_ground_units(self, game: Game) -> bool: """Returns True if this control point is capable of recruiting ground units.""" if not self.can_deploy_ground_units: @@ -1084,10 +1109,13 @@ class Fob(ControlPoint): @property def total_aircraft_parking(self) -> int: - return 0 + return len(self.helipads) def can_operate(self, aircraft: FlyingType) -> bool: - return False + if aircraft in helicopters.helicopter_map.values(): + return True + else: + return False @property def heading(self) -> int: diff --git a/game/theater/missiontarget.py b/game/theater/missiontarget.py index 8d026625..197de586 100644 --- a/game/theater/missiontarget.py +++ b/game/theater/missiontarget.py @@ -46,4 +46,4 @@ class MissionTarget: @property def strike_targets(self) -> List[Union[MissionTarget, Unit]]: - raise NotImplementedError + return [] diff --git a/gen/aircraft.py b/gen/aircraft.py index 92cead03..19391835 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -1110,18 +1110,43 @@ class AircraftConflictGenerator: at=self.m.find_group(group_name), ) else: - if not isinstance(cp, Airfield): - raise RuntimeError( - f"Attempted to spawn at airfield for non-airfield {cp}" + + # If the flight is an helicopter flight, then prioritize dedicated helipads + group = None + if flight.unit_type in helicopters.helicopter_map.values(): + helipad = cp.get_free_helipad() + if helipad is not None: + group = self._generate_at_group( + name=name, + side=country, + unit_type=flight.unit_type, + count=flight.count, + start_type=flight.start_type, + at=helipad.static_unit, + ) + group.points[0].action = PointAction.FromGroundArea + group.points[0].type = "From Ground Area" + helipad.occupied = True + + for i in range(flight.count - 1): + helipad = cp.get_free_helipad() + if helipad is not None: + helipad.occupied = True + group.units[1 + i].position = Point(helipad.x, helipad.y) + + if group is None: + if not isinstance(cp, Airfield): + raise RuntimeError( + f"Attempted to spawn at airfield for non-airfield {cp}" + ) + group = self._generate_at_airport( + name=name, + side=country, + unit_type=flight.unit_type, + count=flight.count, + start_type=flight.start_type, + airport=cp.airport, ) - group = self._generate_at_airport( - name=name, - side=country, - unit_type=flight.unit_type, - count=flight.count, - start_type=flight.start_type, - airport=cp.airport, - ) except Exception as e: # Generated when there is no place on Runway or on Parking Slots logging.error(e) diff --git a/gen/flights/closestairfields.py b/gen/flights/closestairfields.py index 4d6bc4fb..6c5c3bfc 100644 --- a/gen/flights/closestairfields.py +++ b/gen/flights/closestairfields.py @@ -25,7 +25,11 @@ class ClosestAirfields: @property def operational_airfields(self) -> Iterator[ControlPoint]: - return (c for c in self.closest_airfields if c.runway_is_operational()) + return ( + c + for c in self.closest_airfields + if c.runway_is_operational() or c.has_helipads + ) def airfields_within(self, distance: Distance) -> Iterator[ControlPoint]: """Iterates over all airfields within the given range of the target. diff --git a/gen/flights/flight.py b/gen/flights/flight.py index 397399ed..6f843c40 100644 --- a/gen/flights/flight.py +++ b/gen/flights/flight.py @@ -142,6 +142,8 @@ class FlightWaypoint: PointAction.FromParkingArea: FlightWaypointType.TAKEOFF, PointAction.FromParkingAreaHot: FlightWaypointType.TAKEOFF, PointAction.FromRunway: FlightWaypointType.TAKEOFF, + PointAction.FromGroundArea: FlightWaypointType.TAKEOFF, + PointAction.FromGroundAreaHot: FlightWaypointType.TAKEOFF, }[point.action] if waypoint.waypoint_type == FlightWaypointType.NAV: waypoint.name = "NAV" diff --git a/gen/flights/flightplan.py b/gen/flights/flightplan.py index e648e4bb..b1b0cc70 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -1772,4 +1772,5 @@ class FlightPlanBuilder: for flight in self.package.flights: if flight.departure == airfield: return airfield + raise RuntimeError("Could not find any airfield assigned to this package") diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index d6349c8e..62f289e5 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -587,6 +587,8 @@ class HelipadGenerator: sp.position = pad.position sg.add_point(sp) country.add_static_group(sg) + helipad.static_unit = sg + helipad.occupied = False class GroundObjectsGenerator: diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 3113fd5602d3d79f98db0efeb1bbb86d9c6e9f9a..c05eb89d0711467ce0c0cc71233445549a2e5236 100644 GIT binary patch delta 25882 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 delta 25395 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 Date: Fri, 21 May 2021 01:15:54 +0200 Subject: [PATCH 02/40] pydcs update for DCS 2.7.1 --- game/data/aaa_db.py | 6 +- game/data/alic.py | 2 +- game/data/radar_db.py | 2 +- game/data/weapons.py | 50 ++++------- game/db.py | 87 ++++++++++--------- gen/ground_forces/ai_ground_planner_db.py | 25 +++--- gen/sam/aaa_bofors.py | 2 +- gen/sam/aaa_zu23_insurgent.py | 2 +- gen/sam/ewrs.py | 2 +- gen/sam/sam_group_generator.py | 8 +- gen/sam/sam_hawk.py | 2 +- gen/sam/sam_sa6.py | 2 +- pydcs | 2 +- resources/factions/NATO_Desert_Storm.json | 2 +- resources/factions/allies_1940.json | 2 +- resources/factions/allies_1944.json | 4 +- resources/factions/allies_1944_free.json | 4 +- resources/factions/bluefor_modern.json | 4 +- resources/factions/canada_2005.json | 3 +- resources/factions/canada_2005_c130.json | 3 +- resources/factions/china_2010.json | 2 +- resources/factions/dprk_1950_fictional.json | 2 +- resources/factions/france_1995.json | 4 +- resources/factions/gdr_1985.json | 2 +- resources/factions/georgia_2008.json | 2 +- resources/factions/germany_1940.json | 2 +- resources/factions/germany_1942.json | 6 +- resources/factions/germany_1944.json | 6 +- resources/factions/germany_1944_free.json | 2 +- resources/factions/germany_1990.json | 2 +- resources/factions/greece_2005.json | 6 +- resources/factions/india_2010.json | 2 +- resources/factions/insurgents.json | 4 +- resources/factions/insurgents_hard.json | 4 +- resources/factions/iraq_1991.json | 2 +- resources/factions/israel_1948.json | 4 +- resources/factions/israel_1973.json | 2 +- resources/factions/israel_2000.json | 2 +- resources/factions/japan_2005.json | 2 +- resources/factions/libya_2011.json | 2 +- resources/factions/north_korea_2000.json | 4 +- resources/factions/pakistan_2015.json | 2 +- resources/factions/pmc_russian.json | 4 +- resources/factions/pmc_us.json | 2 +- resources/factions/pmc_us_with_mb339.json | 2 +- resources/factions/poland_2010.json | 6 +- resources/factions/redfor_china_2010.json | 6 +- resources/factions/redfor_russia_2010.json | 6 +- resources/factions/russia_1955.json | 2 +- resources/factions/russia_1965.json | 2 +- .../factions/russia_1970_limited_air.json | 4 +- resources/factions/russia_1975.json | 4 +- resources/factions/russia_1990.json | 2 +- resources/factions/russia_2010.json | 4 +- resources/factions/russia_2010_hds.json | 4 +- resources/factions/russia_2020.json | 2 +- resources/factions/soviet_union_1943.json | 4 +- resources/factions/spain_1990.json | 2 +- resources/factions/sweden_1970.json | 2 +- resources/factions/sweden_1990.json | 2 +- resources/factions/syria_1948.json | 6 +- resources/factions/syria_1967.json | 4 +- .../factions/syria_1967_with_ww2_weapons.json | 4 +- resources/factions/syria_2011.json | 8 +- resources/factions/turkey_2005.json | 4 +- resources/factions/uk_1944.json | 4 +- resources/factions/uk_1990.json | 4 +- resources/factions/ukraine_2010.json | 2 +- resources/factions/unc_1950_fictional.json | 6 +- resources/factions/us_aggressors.json | 6 +- resources/factions/usa_1944.json | 2 +- resources/factions/usa_1955.json | 6 +- resources/factions/usa_1990.json | 4 +- resources/factions/usa_2005.json | 4 +- resources/factions/usa_2005_c130.json | 4 +- resources/factions/usa_2005_modded.json | 4 +- resources/factions/usn_1985.json | 4 +- tests/resources/invalid_faction_country.json | 4 +- tests/resources/valid_faction.json | 4 +- tests/test_factions.py | 2 +- 80 files changed, 211 insertions(+), 215 deletions(-) diff --git a/game/data/aaa_db.py b/game/data/aaa_db.py index fba276a3..3008011e 100644 --- a/game/data/aaa_db.py +++ b/game/data/aaa_db.py @@ -7,9 +7,9 @@ AAA_UNITS = [ AirDefence.AAA_ZU_23_Closed_Emplacement, AirDefence.AAA_ZU_23_Emplacement, AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, - AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent, + AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement, AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, - AirDefence.AAA_ZU_23_Insurgent, + AirDefence.AAA_ZU_23_Insurgent_Emplacement, AirDefence.AAA_8_8cm_Flak_18, AirDefence.AAA_Flak_38_20mm, AirDefence.AAA_8_8cm_Flak_36, @@ -17,6 +17,6 @@ AAA_UNITS = [ AirDefence.AAA_Flak_Vierling_38_Quad_20mm, AirDefence.AAA_SP_Kdo_G_40, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_Bofors_40mm, AirDefence.AAA_S_60_57mm, ] diff --git a/game/data/alic.py b/game/data/alic.py index de99075c..84436837 100644 --- a/game/data/alic.py +++ b/game/data/alic.py @@ -9,7 +9,7 @@ class AlicCodes: AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR.id: 103, AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR.id: 104, AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR.id: 107, - AirDefence.SAM_SA_6_Kub_Long_Track_STR.id: 108, + AirDefence.SAM_SA_6_Kub_Straight_Flush_STR.id: 108, AirDefence.MCC_SR_Sborka_Dog_Ear_SR.id: 109, AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR.id: 110, AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL.id: 115, diff --git a/game/data/radar_db.py b/game/data/radar_db.py index 0dcf9cc2..a8bec9b4 100644 --- a/game/data/radar_db.py +++ b/game/data/radar_db.py @@ -32,7 +32,7 @@ UNITS_WITH_RADAR = [ AirDefence.SPAAA_Vulcan_M163, AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, AirDefence.EWR_1L13, - AirDefence.SAM_SA_6_Kub_Long_Track_STR, + AirDefence.SAM_SA_6_Kub_Straight_Flush_STR, AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR, AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR, AirDefence.EWR_55G6, diff --git a/game/data/weapons.py b/game/data/weapons.py index 9b6d8e0c..b7dd530b 100644 --- a/game/data/weapons.py +++ b/game/data/weapons.py @@ -154,7 +154,7 @@ _WEAPON_FALLBACKS = [ Weapons.BRU_57_with_2_x_AGM_154A___JSOW_CEB__CBU_type_, None, ), # doesn't exist on any aircraft yet - (Weapons.AGM_154B___JSOW_Anti_Armour, Weapons.CBU_105___10_x_CEM__CBU_with_WCMD), + (Weapons.AGM_154B___JSOW_Anti_Armour, Weapons.CBU_105___10_x_SFW__CBU_with_WCMD), (Weapons.AGM_154C___JSOW_Unitary_BROACH, Weapons.GBU_12), ( Weapons.BRU_55_with_2_x_AGM_154C___JSOW_Unitary_BROACH, @@ -483,29 +483,29 @@ _WEAPON_FALLBACKS = [ # CBU-87 CEM (Weapons.CBU_87___202_x_CEM_Cluster_Bomb, Weapons.Mk_82), ( - Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_2_x_CBU_87___202_x_CEM_Cluster_Bomb, Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, ), ( - Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_, + Weapons.TER_9A_with_2_x_CBU_87___202_x_CEM_Cluster_Bomb_, Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, ), ( - Weapons.TER_9A_with_3_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_3_x_CBU_87___202_x_CEM_Cluster_Bomb, Weapons.TER_9A_with_3_x_Mk_82___500lb_GP_Bomb_LD, ), # CBU-97 - (Weapons.CBU_97___10_x_CEM_Cluster_Bomb, Weapons.Mk_82), + (Weapons.CBU_97___10_x_SFW_Cluster_Bomb, Weapons.Mk_82), ( - Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_2_x_CBU_97___10_x_SFW_Cluster_Bomb, Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, ), ( - Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_, + Weapons.TER_9A_with_2_x_CBU_97___10_x_SFW_Cluster_Bomb_, Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD_, ), ( - Weapons.TER_9A_with_3_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_3_x_CBU_97___10_x_SFW_Cluster_Bomb, Weapons.TER_9A_with_3_x_Mk_82___500lb_GP_Bomb_LD, ), # CBU-99 (It's a bomb made in 1968, I'm not bothering right now with backups) @@ -515,7 +515,7 @@ _WEAPON_FALLBACKS = [ Weapons.CBU_87___202_x_CEM_Cluster_Bomb, ), # CBU-105 - (Weapons.CBU_105___10_x_CEM__CBU_with_WCMD, Weapons.CBU_97___10_x_CEM_Cluster_Bomb), + (Weapons.CBU_105___10_x_SFW__CBU_with_WCMD, Weapons.CBU_97___10_x_SFW_Cluster_Bomb), ( Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS, Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, @@ -971,26 +971,14 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.CBU_52B___220_x_HE_Frag_bomblets): 1970, # CBU-87 CEM Weapon.from_pydcs(Weapons.CBU_87___202_x_CEM_Cluster_Bomb): 1986, - Weapon.from_pydcs( - Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb - ): 1986, - Weapon.from_pydcs( - Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_ - ): 1986, - Weapon.from_pydcs( - Weapons.TER_9A_with_3_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb - ): 1986, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_CBU_87___202_x_CEM_Cluster_Bomb): 1986, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_CBU_87___202_x_CEM_Cluster_Bomb_): 1986, + Weapon.from_pydcs(Weapons.TER_9A_with_3_x_CBU_87___202_x_CEM_Cluster_Bomb): 1986, # CBU-97 - Weapon.from_pydcs(Weapons.CBU_97___10_x_CEM_Cluster_Bomb): 1992, - Weapon.from_pydcs( - Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb - ): 1992, - Weapon.from_pydcs( - Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_ - ): 1992, - Weapon.from_pydcs( - Weapons.TER_9A_with_3_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb - ): 1992, + Weapon.from_pydcs(Weapons.CBU_97___10_x_SFW_Cluster_Bomb): 1992, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_CBU_97___10_x_SFW_Cluster_Bomb): 1992, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_CBU_97___10_x_SFW_Cluster_Bomb_): 1992, + Weapon.from_pydcs(Weapons.TER_9A_with_3_x_CBU_97___10_x_SFW_Cluster_Bomb): 1992, # CBU-99 Weapon.from_pydcs( Weapons.BRU_33_with_2_x_CBU_99___490lbs__247_x_HEAT_Bomblets @@ -1032,11 +1020,11 @@ WEAPON_INTRODUCTION_YEARS = { Weapons.MER2_with_2_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets ): 1968, # CBU-103 - Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_103): 2000, + Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_103___202_x_CEM__CBU_with_WCMD): 2000, Weapon.from_pydcs(Weapons.CBU_103___202_x_CEM__CBU_with_WCMD): 2000, # CBU-105 - Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_105): 2000, - Weapon.from_pydcs(Weapons.CBU_105___10_x_CEM__CBU_with_WCMD): 2000, + Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_105___10_x_SFW__CBU_with_WCMD): 2000, + Weapon.from_pydcs(Weapons.CBU_105___10_x_SFW__CBU_with_WCMD): 2000, # APKWS Weapon.from_pydcs( Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS diff --git a/game/db.py b/game/db.py index 980f1461..eb2b692f 100644 --- a/game/db.py +++ b/game/db.py @@ -485,10 +485,10 @@ PRICES = { # armor Armor.APC_MTLB: 4, Artillery.Grad_MRL_FDDM__FC: 4, - Armor.IFV_BRDM_2: 6, + Armor.Scout_BRDM_2: 6, Armor.APC_BTR_RD: 6, Armor.APC_BTR_80: 8, - Armor.APC_BTR_82A: 10, + Armor.IFV_BTR_82A: 10, Armor.MBT_T_55: 18, Armor.MBT_T_72B: 20, Armor.MBT_T_72B3: 25, @@ -500,9 +500,9 @@ PRICES = { Armor.IFV_BMP_3: 18, Armor.ZBD_04A: 12, Armor.ZTZ_96B: 30, - Armor.APC_Cobra__Scout: 4, + Armor.Scout_Cobra: 4, Armor.APC_M113: 6, - Armor.APC_HMMWV__Scout: 2, + Armor.Scout_HMMWV: 2, Armor.ATGM_HMMWV: 8, Armor.IFV_M2A2_Bradley: 12, Armor.IFV_M1126_Stryker_ICV: 10, @@ -511,8 +511,11 @@ PRICES = { Armor.MBT_M60A3_Patton: 16, Armor.MBT_M1A2_Abrams: 25, Armor.MBT_Leclerc: 25, - Armor.MBT_Leopard_1A3: 20, - Armor.MBT_Leopard_2: 25, + Armor.MBT_Leopard_1A3: 18, + Armor.MBT_Leopard_2A4: 20, + Armor.MBT_Leopard_2A4_Trs: 20, + Armor.MBT_Leopard_2A5: 22, + Armor.MBT_Leopard_2A6M: 25, Armor.MBT_Merkava_IV: 25, Armor.APC_TPz_Fuchs: 5, Armor.MBT_Challenger_II: 25, @@ -521,12 +524,12 @@ PRICES = { Armor.IFV_LAV_25: 7, Artillery.MLRS_M270_227mm: 55, Artillery.SPH_M109_Paladin_155mm: 25, - Artillery.SPH_2S9_Nona_120mm_M: 12, + Artillery.SPM_2S9_Nona_120mm_M: 12, Artillery.SPH_2S1_Gvozdika_122mm: 18, Artillery.SPH_2S3_Akatsia_152mm: 24, Artillery.SPH_2S19_Msta_152mm: 30, Artillery.MLRS_BM_21_Grad_122mm: 15, - Artillery.MLRS_BM_27_Uragan_220mm: 50, + Artillery.MLRS_9K57_Uragan_BM_27_220mm: 50, Artillery.MLRS_9A52_Smerch_HE_300mm: 40, Artillery.Mortar_2B11_120mm: 4, Artillery.SPH_Dana_vz77_152mm: 26, @@ -538,7 +541,7 @@ PRICES = { Unarmed.Truck_M818_6x6: 3, # WW2 Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24, - Armor.MT_PzIV_H: 16, + Armor.Tk_PzIV_H: 16, Armor.HT_Pz_Kpfw_VI_Tiger_I: 24, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II: 26, Armor.SPG_Jagdpanther_G1: 18, @@ -546,7 +549,7 @@ PRICES = { Armor.SPG_Sd_Kfz_184_Elefant: 18, Armor.APC_Sd_Kfz_251_Halftrack: 4, Armor.IFV_Sd_Kfz_234_2_Puma: 8, - Armor.MT_M4_Sherman: 12, + Armor.Tk_M4_Sherman: 12, Armor.MT_M4A4_Sherman_Firefly: 16, Armor.CT_Cromwell_IV: 12, Unarmed.Carrier_M30_Cargo: 2, @@ -558,7 +561,7 @@ PRICES = { Armor.SPG_StuG_III_Ausf__G: 12, Armor.SPG_StuG_IV: 14, Artillery.SPG_M12_GMC_155mm: 10, - Artillery.SPG_Sturmpanzer_IV_Brummbar: 10, + Armor.SPG_Sturmpanzer_IV_Brummbar: 10, Armor.Car_Daimler_Armored: 8, Armor.LT_Mk_VII_Tetrarch: 8, Unarmed.Tractor_M4_Hi_Speed: 2, @@ -585,7 +588,7 @@ PRICES = { AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137: 35, AirDefence.SAM_Patriot_ECS: 30, AirDefence.SPAAA_Gepard: 24, - AirDefence.SAM_Hawk_Generator__PCP: 14, + AirDefence.SAM_Hawk_Platoon_Command_Post__PCP: 14, AirDefence.SPAAA_Vulcan_M163: 10, AirDefence.SAM_Hawk_LN_M192: 8, AirDefence.SAM_Chaparral_M48: 16, @@ -603,15 +606,15 @@ PRICES = { AirDefence.AAA_ZU_23_Closed_Emplacement: 6, AirDefence.AAA_ZU_23_Emplacement: 6, AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 7, - AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 6, + AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement: 6, AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 7, - AirDefence.AAA_ZU_23_Insurgent: 6, + AirDefence.AAA_ZU_23_Insurgent_Emplacement: 6, AirDefence.MANPADS_SA_18_Igla_Grouse: 10, AirDefence.MANPADS_SA_18_Igla_Grouse_C2: 8, AirDefence.MANPADS_SA_18_Igla_S_Grouse: 12, AirDefence.MANPADS_SA_18_Igla_S_Grouse_C2: 8, AirDefence.EWR_1L13: 30, - AirDefence.SAM_SA_6_Kub_Long_Track_STR: 22, + AirDefence.SAM_SA_6_Kub_Straight_Flush_STR: 22, AirDefence.EWR_55G6: 30, AirDefence.MCC_SR_Sborka_Dog_Ear_SR: 10, AirDefence.SAM_Hawk_TR__AN_MPQ_46: 14, @@ -638,7 +641,7 @@ PRICES = { AirDefence.PU_Maschinensatz_33: 10, AirDefence.AAA_8_8cm_Flak_41: 10, AirDefence.EWR_FuMG_401_Freya_LZ: 25, - AirDefence.AAA_40mm_Bofors: 8, + AirDefence.AAA_Bofors_40mm: 8, AirDefence.AAA_S_60_57mm: 8, AirDefence.AAA_M1_37mm: 7, AirDefence.AAA_M45_Quadmount_HB_12_7mm: 4, @@ -860,9 +863,9 @@ UNIT_BY_TASK = { Artillery.Grad_MRL_FDDM__FC, Artillery.Grad_MRL_FDDM__FC, Artillery.Grad_MRL_FDDM__FC, - Armor.IFV_BRDM_2, - Armor.IFV_BRDM_2, - Armor.IFV_BRDM_2, + Armor.Scout_BRDM_2, + Armor.Scout_BRDM_2, + Armor.Scout_BRDM_2, Armor.APC_BTR_RD, Armor.APC_BTR_RD, Armor.APC_BTR_RD, @@ -872,8 +875,8 @@ UNIT_BY_TASK = { Armor.APC_BTR_80, Armor.APC_BTR_80, Armor.APC_BTR_80, - Armor.APC_BTR_82A, - Armor.APC_BTR_82A, + Armor.IFV_BTR_82A, + Armor.IFV_BTR_82A, Armor.IFV_BMP_1, Armor.IFV_BMP_1, Armor.IFV_BMP_1, @@ -896,10 +899,10 @@ UNIT_BY_TASK = { Armor.MBT_T_80U, Armor.MBT_T_90, Armor.ZTZ_96B, - Armor.APC_Cobra__Scout, - Armor.APC_Cobra__Scout, - Armor.APC_Cobra__Scout, - Armor.APC_Cobra__Scout, + Armor.Scout_Cobra, + Armor.Scout_Cobra, + Armor.Scout_Cobra, + Armor.Scout_Cobra, Armor.APC_M113, Armor.APC_M113, Armor.APC_M113, @@ -910,8 +913,8 @@ UNIT_BY_TASK = { Armor.APC_TPz_Fuchs, Armor.ATGM_HMMWV, Armor.ATGM_HMMWV, - Armor.APC_HMMWV__Scout, - Armor.APC_HMMWV__Scout, + Armor.Scout_HMMWV, + Armor.Scout_HMMWV, Armor.IFV_M2A2_Bradley, Armor.IFV_M2A2_Bradley, Armor.ATGM_Stryker, @@ -936,11 +939,11 @@ UNIT_BY_TASK = { Armor.MBT_Leopard_1A3, Armor.MBT_M1A2_Abrams, Armor.MBT_Leclerc, - Armor.MBT_Leopard_2, + Armor.MBT_Leopard_2A6M, Armor.MBT_Challenger_II, Armor.MBT_Merkava_IV, Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_PzIV_H, + Armor.Tk_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, Armor.APC_Sd_Kfz_251_Halftrack, @@ -949,7 +952,7 @@ UNIT_BY_TASK = { Armor.APC_Sd_Kfz_251_Halftrack, Armor.IFV_Sd_Kfz_234_2_Puma, Armor.IFV_Sd_Kfz_234_2_Puma, - Armor.MT_M4_Sherman, + Armor.Tk_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, Armor.CT_Cromwell_IV, Unarmed.Carrier_M30_Cargo, @@ -959,7 +962,7 @@ UNIT_BY_TASK = { Armor.APC_M2A1_Halftrack, Armor.APC_M2A1_Halftrack, Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_PzIV_H, + Armor.Tk_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, Armor.SPG_Jagdpanther_G1, @@ -967,7 +970,7 @@ UNIT_BY_TASK = { Armor.SPG_Sd_Kfz_184_Elefant, Armor.APC_Sd_Kfz_251_Halftrack, Armor.IFV_Sd_Kfz_234_2_Puma, - Armor.MT_M4_Sherman, + Armor.Tk_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, Armor.CT_Cromwell_IV, Unarmed.Carrier_M30_Cargo, @@ -985,23 +988,23 @@ UNIT_BY_TASK = { Armor.SPG_StuG_III_Ausf__G, Armor.SPG_StuG_IV, Artillery.SPG_M12_GMC_155mm, - Artillery.SPG_Sturmpanzer_IV_Brummbar, + Armor.SPG_Sturmpanzer_IV_Brummbar, Armor.Car_Daimler_Armored, Armor.LT_Mk_VII_Tetrarch, Artillery.MLRS_M270_227mm, Artillery.SPH_M109_Paladin_155mm, - Artillery.SPH_2S9_Nona_120mm_M, + Artillery.SPM_2S9_Nona_120mm_M, Artillery.SPH_2S1_Gvozdika_122mm, Artillery.SPH_2S3_Akatsia_152mm, Artillery.SPH_2S19_Msta_152mm, Artillery.MLRS_BM_21_Grad_122mm, Artillery.MLRS_BM_21_Grad_122mm, - Artillery.MLRS_BM_27_Uragan_220mm, + Artillery.MLRS_9K57_Uragan_BM_27_220mm, Artillery.MLRS_9A52_Smerch_HE_300mm, Artillery.SPH_Dana_vz77_152mm, Artillery.PLZ_05, Artillery.SPG_M12_GMC_155mm, - Artillery.SPG_Sturmpanzer_IV_Brummbar, + Armor.SPG_Sturmpanzer_IV_Brummbar, AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, AirDefence.SPAAA_ZSU_57_2, @@ -1022,7 +1025,7 @@ UNIT_BY_TASK = { AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_Bofors_40mm, AirDefence.AAA_S_60_57mm, AirDefence.AAA_M1_37mm, AirDefence.AAA_QF_3_7, @@ -1083,7 +1086,7 @@ SAM_BAN = [ AirDefence.SAM_SA_6_Kub_Gainful_TEL, AirDefence.SAM_SA_8_Osa_Gecko_TEL, AirDefence.SAM_SA_3_S_125_Goa_LN, - AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, AirDefence.SAM_SA_2_S_75_Guideline_LN, AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL, ] @@ -1096,15 +1099,15 @@ SAM_CONVERT = { AirDefence.SAM_SA_3_S_125_Low_Blow_TR: AirDefence.SAM_SA_3_S_125_Goa_LN, AirDefence.SAM_SA_3_S_125_Goa_LN: AirDefence.SAM_SA_3_S_125_Goa_LN, AirDefence.SAM_SA_6_Kub_Gainful_TEL: AirDefence.SAM_SA_6_Kub_Gainful_TEL, - AirDefence.SAM_SA_6_Kub_Long_Track_STR: AirDefence.SAM_SA_6_Kub_Gainful_TEL, + AirDefence.SAM_SA_6_Kub_Straight_Flush_STR: AirDefence.SAM_SA_6_Kub_Gainful_TEL, AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, AirDefence.SAM_SA_10_S_300_Grumble_C2: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR: AirDefence.SAM_SA_10_S_300_Grumble_C2, - AirDefence.SAM_Hawk_TR__AN_MPQ_46: AirDefence.SAM_Hawk_Generator__PCP, - AirDefence.SAM_Hawk_SR__AN_MPQ_50: AirDefence.SAM_Hawk_Generator__PCP, - AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_Hawk_TR__AN_MPQ_46: AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, + AirDefence.SAM_Hawk_SR__AN_MPQ_50: AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, + AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, "except": { # this radar is shared between the two S300's. if we attempt to find a SAM site at a base and can't find one # model, we can safely assume the other was deployed diff --git a/gen/ground_forces/ai_ground_planner_db.py b/gen/ground_forces/ai_ground_planner_db.py index 36c775de..3fee5901 100644 --- a/gen/ground_forces/ai_ground_planner_db.py +++ b/gen/ground_forces/ai_ground_planner_db.py @@ -8,7 +8,10 @@ TYPE_TANKS = [ Armor.MBT_T_72B3, Armor.MBT_T_80U, Armor.MBT_T_90, - Armor.MBT_Leopard_2, + Armor.MBT_Leopard_2A4, + Armor.MBT_Leopard_2A4_Trs, + Armor.MBT_Leopard_2A5, + Armor.MBT_Leopard_2A6M, Armor.MBT_Leopard_1A3, Armor.MBT_Leclerc, Armor.MBT_Challenger_II, @@ -18,16 +21,17 @@ TYPE_TANKS = [ Armor.ZTZ_96B, # WW2 Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_PzIV_H, + Armor.Tk_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, - Armor.MT_M4_Sherman, + Armor.Tk_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, Armor.SPG_StuG_IV, Armor.CT_Centaur_IV, Armor.CT_Cromwell_IV, Armor.HIT_Churchill_VII, Armor.LT_Mk_VII_Tetrarch, + Armor.SPG_Sturmpanzer_IV_Brummbar, # Mods frenchpack.DIM__TOYOTA_BLUE, frenchpack.DIM__TOYOTA_GREEN, @@ -77,18 +81,18 @@ TYPE_IFV = [ ] TYPE_APC = [ - Armor.APC_HMMWV__Scout, + Armor.Scout_HMMWV, Armor.IFV_M1126_Stryker_ICV, Armor.APC_M113, Armor.APC_BTR_80, - Armor.APC_BTR_82A, + Armor.IFV_BTR_82A, Armor.APC_MTLB, Armor.APC_M2A1_Halftrack, - Armor.APC_Cobra__Scout, + Armor.Scout_Cobra, Armor.APC_Sd_Kfz_251_Halftrack, Armor.APC_AAV_7_Amphibious, Armor.APC_TPz_Fuchs, - Armor.IFV_BRDM_2, + Armor.Scout_BRDM_2, Armor.APC_BTR_RD, Artillery.Grad_MRL_FDDM__FC, # WW2 @@ -105,16 +109,15 @@ TYPE_ARTILLERY = [ Artillery.SPH_2S1_Gvozdika_122mm, Artillery.SPH_2S3_Akatsia_152mm, Artillery.MLRS_BM_21_Grad_122mm, - Artillery.MLRS_BM_27_Uragan_220mm, + Artillery.MLRS_9K57_Uragan_BM_27_220mm, Artillery.SPH_M109_Paladin_155mm, Artillery.MLRS_M270_227mm, - Artillery.SPH_2S9_Nona_120mm_M, + Artillery.SPM_2S9_Nona_120mm_M, Artillery.SPH_Dana_vz77_152mm, Artillery.PLZ_05, Artillery.SPH_2S19_Msta_152mm, Artillery.MLRS_9A52_Smerch_CM_300mm, # WW2 - Artillery.SPG_Sturmpanzer_IV_Brummbar, Artillery.SPG_M12_GMC_155mm, ] @@ -175,7 +178,7 @@ TYPE_SHORAD = [ AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_Bofors_40mm, AirDefence.AAA_S_60_57mm, AirDefence.AAA_M1_37mm, AirDefence.AAA_QF_3_7, diff --git a/gen/sam/aaa_bofors.py b/gen/sam/aaa_bofors.py index fc6636d9..6af41922 100644 --- a/gen/sam/aaa_bofors.py +++ b/gen/sam/aaa_bofors.py @@ -27,7 +27,7 @@ class BoforsGenerator(AirDefenseGroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_Bofors_40mm, "AAA#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, diff --git a/gen/sam/aaa_zu23_insurgent.py b/gen/sam/aaa_zu23_insurgent.py index 87ef1cd9..96cd1d71 100644 --- a/gen/sam/aaa_zu23_insurgent.py +++ b/gen/sam/aaa_zu23_insurgent.py @@ -27,7 +27,7 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent, + AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement, "AAA#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, diff --git a/gen/sam/ewrs.py b/gen/sam/ewrs.py index 7164a09e..d69f2de7 100644 --- a/gen/sam/ewrs.py +++ b/gen/sam/ewrs.py @@ -87,7 +87,7 @@ class StraightFlushGenerator(EwrGenerator): This is the SA-6 search/track radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_SA_6_Kub_Long_Track_STR + unit_type = AirDefence.SAM_SA_6_Kub_Straight_Flush_STR class HawkEwrGenerator(EwrGenerator): diff --git a/gen/sam/sam_group_generator.py b/gen/sam/sam_group_generator.py index e13f0f2c..a4968830 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -105,13 +105,13 @@ SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = { SAM_PRICES = { - AirDefence.SAM_Hawk_Generator__PCP: 35, + AirDefence.SAM_Hawk_Platoon_Command_Post__PCP: 35, AirDefence.AAA_ZU_23_Emplacement: 10, AirDefence.AAA_ZU_23_Closed_Emplacement: 10, AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 10, AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 10, - AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 10, - AirDefence.AAA_ZU_23_Insurgent: 10, + AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement: 10, + AirDefence.AAA_ZU_23_Insurgent_Emplacement: 10, AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish: 10, AirDefence.SPAAA_Vulcan_M163: 15, AirDefence.SAM_Linebacker___Bradley_M6: 20, @@ -122,7 +122,7 @@ SAM_PRICES = { AirDefence.SAM_Patriot_LN: 85, AirDefence.SAM_Patriot_EPP_III: 85, AirDefence.SAM_Chaparral_M48: 25, - AirDefence.AAA_40mm_Bofors: 15, + AirDefence.AAA_Bofors_40mm: 15, AirDefence.AAA_8_8cm_Flak_36: 15, AirDefence.SAM_SA_2_S_75_Guideline_LN: 30, AirDefence.SAM_SA_3_S_125_Goa_LN: 35, diff --git a/gen/sam/sam_hawk.py b/gen/sam/sam_hawk.py index ab3332cd..f07f8872 100644 --- a/gen/sam/sam_hawk.py +++ b/gen/sam/sam_hawk.py @@ -26,7 +26,7 @@ class HawkGenerator(AirDefenseGroupGenerator): self.heading, ) self.add_unit( - AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, "PCP", self.position.x, self.position.y, diff --git a/gen/sam/sam_sa6.py b/gen/sam/sam_sa6.py index a1def06d..25746651 100644 --- a/gen/sam/sam_sa6.py +++ b/gen/sam/sam_sa6.py @@ -18,7 +18,7 @@ class SA6Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_6_Kub_Long_Track_STR, + AirDefence.SAM_SA_6_Kub_Straight_Flush_STR, "STR", self.position.x, self.position.y, diff --git a/pydcs b/pydcs index ea94bca5..dec648d2 160000 --- a/pydcs +++ b/pydcs @@ -1 +1 @@ -Subproject commit ea94bca55c83520038edc7c7fa43648376ec72a4 +Subproject commit dec648d27f74c394dd6e85e83cc09e4cd823653d diff --git a/resources/factions/NATO_Desert_Storm.json b/resources/factions/NATO_Desert_Storm.json index 7b9743b9..30a6e30b 100644 --- a/resources/factions/NATO_Desert_Storm.json +++ b/resources/factions/NATO_Desert_Storm.json @@ -40,7 +40,7 @@ "IFV_M2A2_Bradley", "IFV_M1126_Stryker_ICV", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "APC_TPz_Fuchs", "IFV_Warrior", diff --git a/resources/factions/allies_1940.json b/resources/factions/allies_1940.json index bc3ca707..1d590b00 100644 --- a/resources/factions/allies_1940.json +++ b/resources/factions/allies_1940.json @@ -14,7 +14,7 @@ "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", "AAA_QF_3_7", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ ], diff --git a/resources/factions/allies_1944.json b/resources/factions/allies_1944.json index c8cc8d30..98f2a5ec 100644 --- a/resources/factions/allies_1944.json +++ b/resources/factions/allies_1944.json @@ -16,7 +16,7 @@ ], "frontline_units": [ "MT_M4A4_Sherman_Firefly", - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", "CT_Cromwell_IV", "CT_Centaur_IV", @@ -26,7 +26,7 @@ "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", "AAA_QF_3_7", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ "SPG_M12_GMC_155mm" diff --git a/resources/factions/allies_1944_free.json b/resources/factions/allies_1944_free.json index 0fce2438..7e4e7fc9 100644 --- a/resources/factions/allies_1944_free.json +++ b/resources/factions/allies_1944_free.json @@ -14,9 +14,9 @@ "A_20G" ], "frontline_units": [ - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ ], diff --git a/resources/factions/bluefor_modern.json b/resources/factions/bluefor_modern.json index 81e93e6e..2794fe88 100644 --- a/resources/factions/bluefor_modern.json +++ b/resources/factions/bluefor_modern.json @@ -37,13 +37,13 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "MBT_Leopard_2", + "MBT_Leopard_2A6M", "MBT_Merkava_IV", "ATGM_Stryker", "IFV_M2A2_Bradley", "IFV_Marder", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Linebacker___Bradley_M6", "SAM_Avenger__Stinger" diff --git a/resources/factions/canada_2005.json b/resources/factions/canada_2005.json index 7d394842..798f01f8 100644 --- a/resources/factions/canada_2005.json +++ b/resources/factions/canada_2005.json @@ -17,7 +17,8 @@ ], "frontline_units": [ "MBT_Leopard_1A3", - "MBT_Leopard_2", + "MBT_Leopard_2A4", + "MBT_Leopard_2A6M", "IFV_LAV_25", "APC_M113", "IFV_Warrior", diff --git a/resources/factions/canada_2005_c130.json b/resources/factions/canada_2005_c130.json index 9620dc24..f44da34e 100644 --- a/resources/factions/canada_2005_c130.json +++ b/resources/factions/canada_2005_c130.json @@ -18,7 +18,8 @@ ], "frontline_units": [ "MBT_Leopard_1A3", - "MBT_Leopard_2", + "MBT_Leopard_2A4", + "MBT_Leopard_2A6M", "IFV_LAV_25", "APC_M113", "IFV_Warrior", diff --git a/resources/factions/china_2010.json b/resources/factions/china_2010.json index 1f47c779..bc1e4c0b 100644 --- a/resources/factions/china_2010.json +++ b/resources/factions/china_2010.json @@ -28,7 +28,7 @@ "artillery_units": [ "MLRS_9A52_Smerch_HE_300mm", "PLZ_05", - "SPH_2S9_Nona_120mm_M" + "SPM_2S9_Nona_120mm_M" ], "logistics_units": [ "Truck_Ural_375", diff --git a/resources/factions/dprk_1950_fictional.json b/resources/factions/dprk_1950_fictional.json index 29251c1b..428212d9 100644 --- a/resources/factions/dprk_1950_fictional.json +++ b/resources/factions/dprk_1950_fictional.json @@ -15,7 +15,7 @@ "tankers": [ ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "Grad_MRL_FDDM__FC", "APC_MTLB", "MBT_T_55", diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index 30d3e440..e81fca28 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -20,10 +20,10 @@ "frontline_units": [ "MBT_Leclerc", "APC_TPz_Fuchs", - "APC_Cobra__Scout", + "Scout_Cobra", "ATGM_Stryker", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Roland_ADS" ], diff --git a/resources/factions/gdr_1985.json b/resources/factions/gdr_1985.json index 9eee25a1..757dcf0c 100644 --- a/resources/factions/gdr_1985.json +++ b/resources/factions/gdr_1985.json @@ -17,7 +17,7 @@ "frontline_units": [ "IFV_BMP_1", "IFV_BMP_2", - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_MTLB", "MBT_T_55", "MBT_T_72B" diff --git a/resources/factions/georgia_2008.json b/resources/factions/georgia_2008.json index b1250008..08825296 100644 --- a/resources/factions/georgia_2008.json +++ b/resources/factions/georgia_2008.json @@ -13,7 +13,7 @@ "frontline_units": [ "APC_BTR_80", "APC_MTLB", - "APC_Cobra__Scout", + "Scout_Cobra", "IFV_BMP_1", "IFV_BMP_2", "MBT_T_72B", diff --git a/resources/factions/germany_1940.json b/resources/factions/germany_1940.json index b3a40cab..91d48d3f 100644 --- a/resources/factions/germany_1940.json +++ b/resources/factions/germany_1940.json @@ -10,7 +10,7 @@ "Ju_88A4" ], "frontline_units": [ - "MT_PzIV_H", + "Tk_PzIV_H", "APC_Sd_Kfz_251_Halftrack", "IFV_Sd_Kfz_234_2_Puma", "AAA_8_8cm_Flak_18" diff --git a/resources/factions/germany_1942.json b/resources/factions/germany_1942.json index 927152d5..8aaa385f 100644 --- a/resources/factions/germany_1942.json +++ b/resources/factions/germany_1942.json @@ -10,14 +10,14 @@ "Ju_88A4" ], "frontline_units": [ - "MT_PzIV_H", + "Tk_PzIV_H", "APC_Sd_Kfz_251_Halftrack", "IFV_Sd_Kfz_234_2_Puma", "SPG_Jagdpanzer_IV", - "AAA_8_8cm_Flak_18" + "AAA_8_8cm_Flak_18", + "SPG_Sturmpanzer_IV_Brummbar" ], "artillery_units": [ - "SPG_Sturmpanzer_IV_Brummbar" ], "logistics_units": [ "Truck_Opel_Blitz", diff --git a/resources/factions/germany_1944.json b/resources/factions/germany_1944.json index a607adfa..26aa55f9 100644 --- a/resources/factions/germany_1944.json +++ b/resources/factions/germany_1944.json @@ -11,7 +11,7 @@ ], "frontline_units": [ "MT_Pz_Kpfw_V_Panther_Ausf_G", - "MT_PzIV_H", + "Tk_PzIV_H", "HT_Pz_Kpfw_VI_Tiger_I", "HT_Pz_Kpfw_VI_Ausf__B_Tiger_II", "APC_Sd_Kfz_251_Halftrack", @@ -22,10 +22,10 @@ "SPG_StuG_III_Ausf__G", "SPG_StuG_IV", "AAA_8_8cm_Flak_18", - "AAA_8_8cm_Flak_41" + "AAA_8_8cm_Flak_41", + "SPG_Sturmpanzer_IV_Brummbar" ], "artillery_units": [ - "SPG_Sturmpanzer_IV_Brummbar" ], "logistics_units": [ "Truck_Opel_Blitz", diff --git a/resources/factions/germany_1944_free.json b/resources/factions/germany_1944_free.json index 6145a374..0de2b7ab 100644 --- a/resources/factions/germany_1944_free.json +++ b/resources/factions/germany_1944_free.json @@ -9,7 +9,7 @@ "Bf_109K_4" ], "frontline_units": [ - "MT_PzIV_H", + "Tk_PzIV_H", "APC_Sd_Kfz_251_Halftrack", "AAA_8_8cm_Flak_18" ], diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index 0190d101..57e5b36e 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -21,7 +21,7 @@ "frontline_units": [ "APC_TPz_Fuchs", "MBT_Leopard_1A3", - "MBT_Leopard_2", + "MBT_Leopard_2A4", "IFV_Marder", "SPAAA_Gepard" ], diff --git a/resources/factions/greece_2005.json b/resources/factions/greece_2005.json index a390525a..5e20bf24 100644 --- a/resources/factions/greece_2005.json +++ b/resources/factions/greece_2005.json @@ -15,10 +15,10 @@ "KC130" ], "frontline_units": [ - "MBT_Leopard_2", + "MBT_Leopard_2A4", "MBT_Leopard_1A3", "MBT_M60A3_Patton", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "APC_M113", "IFV_BMP_1" @@ -48,4 +48,4 @@ ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" -} \ No newline at end of file +} diff --git a/resources/factions/india_2010.json b/resources/factions/india_2010.json index 8ea8c8c9..e1099c39 100644 --- a/resources/factions/india_2010.json +++ b/resources/factions/india_2010.json @@ -26,7 +26,7 @@ "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/insurgents.json b/resources/factions/insurgents.json index 773ea181..9cbec87b 100644 --- a/resources/factions/insurgents.json +++ b/resources/factions/insurgents.json @@ -6,9 +6,9 @@ "aircrafts": [ ], "frontline_units": [ - "APC_Cobra__Scout", + "Scout_Cobra", "APC_MTLB", - "IFV_BRDM_2", + "Scout_BRDM_2", "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375" ], "artillery_units": [ diff --git a/resources/factions/insurgents_hard.json b/resources/factions/insurgents_hard.json index 086385cd..b90da386 100644 --- a/resources/factions/insurgents_hard.json +++ b/resources/factions/insurgents_hard.json @@ -7,8 +7,8 @@ ], "frontline_units": [ "ATGM_HMMWV", - "APC_HMMWV__Scout", - "IFV_BRDM_2", + "Scout_HMMWV", + "Scout_BRDM_2", "APC_BTR_80", "APC_BTR_RD", "IFV_BMP_1", diff --git a/resources/factions/iraq_1991.json b/resources/factions/iraq_1991.json index 25376a66..591b886a 100644 --- a/resources/factions/iraq_1991.json +++ b/resources/factions/iraq_1991.json @@ -30,7 +30,7 @@ "MBT_T_55", "MBT_T_72B", "APC_BTR_80", - "IFV_BRDM_2", + "Scout_BRDM_2", "SPH_2S1_Gvozdika_122mm", "SPAAA_ZSU_57_2", "SPAAA_ZSU_23_4_Shilka_Gun_Dish" diff --git a/resources/factions/israel_1948.json b/resources/factions/israel_1948.json index 4d81443e..1a9bf17c 100644 --- a/resources/factions/israel_1948.json +++ b/resources/factions/israel_1948.json @@ -14,9 +14,9 @@ "frontline_units": [ "MT_M4A4_Sherman_Firefly", "APC_M2A1_Halftrack", - "MT_M4_Sherman", + "Tk_M4_Sherman", "Car_M8_Greyhound_Armored", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ ], diff --git a/resources/factions/israel_1973.json b/resources/factions/israel_1973.json index da572305..366ff06e 100644 --- a/resources/factions/israel_1973.json +++ b/resources/factions/israel_1973.json @@ -16,7 +16,7 @@ "KC130" ], "frontline_units": [ - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", "MBT_M60A3_Patton", "APC_M113", diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 5d8d5b60..689396d1 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -21,7 +21,7 @@ ], "frontline_units": [ "APC_M113", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "MBT_Merkava_IV", "SPAAA_Vulcan_M163" diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index 892e1ed7..5fcfbd6e 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -23,7 +23,7 @@ "IFV_Marder", "APC_TPz_Fuchs", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "SPAAA_Gepard" ], "artillery_units": [ diff --git a/resources/factions/libya_2011.json b/resources/factions/libya_2011.json index 10ef96a2..0b83dc6e 100644 --- a/resources/factions/libya_2011.json +++ b/resources/factions/libya_2011.json @@ -18,7 +18,7 @@ ], "frontline_units": [ "IFV_BMP_1", - "IFV_BRDM_2", + "Scout_BRDM_2", "MBT_T_72B", "MBT_T_55", "SPAAA_ZSU_23_4_Shilka_Gun_Dish", diff --git a/resources/factions/north_korea_2000.json b/resources/factions/north_korea_2000.json index 565ab250..cbd3d040 100644 --- a/resources/factions/north_korea_2000.json +++ b/resources/factions/north_korea_2000.json @@ -19,7 +19,7 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_BTR_80", "IFV_BMP_1", "MBT_T_55", @@ -30,7 +30,7 @@ ], "artillery_units": [ "MLRS_BM_21_Grad_122mm", - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/pakistan_2015.json b/resources/factions/pakistan_2015.json index 1c8c7ef7..c8e2b4b3 100644 --- a/resources/factions/pakistan_2015.json +++ b/resources/factions/pakistan_2015.json @@ -28,7 +28,7 @@ ], "artillery_units": [ "MLRS_9A52_Smerch_HE_300mm", - "SPH_2S9_Nona_120mm_M" + "SPM_2S9_Nona_120mm_M" ], "logistics_units": [ "Truck_Ural_375", diff --git a/resources/factions/pmc_russian.json b/resources/factions/pmc_russian.json index aa273736..81ee1f38 100644 --- a/resources/factions/pmc_russian.json +++ b/resources/factions/pmc_russian.json @@ -10,9 +10,9 @@ "Ka_50" ], "frontline_units": [ - "APC_Cobra__Scout", + "Scout_Cobra", "APC_BTR_80", - "IFV_BRDM_2", + "Scout_BRDM_2", "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ diff --git a/resources/factions/pmc_us.json b/resources/factions/pmc_us.json index 293a4b9d..8957f5db 100644 --- a/resources/factions/pmc_us.json +++ b/resources/factions/pmc_us.json @@ -10,7 +10,7 @@ "SA342M" ], "frontline_units": [ - "APC_HMMWV__Scout", + "Scout_HMMWV", "IFV_Warrior", "IFV_LAV_25", "SAM_Avenger__Stinger" diff --git a/resources/factions/pmc_us_with_mb339.json b/resources/factions/pmc_us_with_mb339.json index 8ffdf832..1e9867d5 100644 --- a/resources/factions/pmc_us_with_mb339.json +++ b/resources/factions/pmc_us_with_mb339.json @@ -11,7 +11,7 @@ "SA342M" ], "frontline_units": [ - "APC_HMMWV__Scout", + "Scout_HMMWV", "IFV_Warrior", "IFV_LAV_25", "SAM_Avenger__Stinger" diff --git a/resources/factions/poland_2010.json b/resources/factions/poland_2010.json index 35256cfc..82b638a9 100644 --- a/resources/factions/poland_2010.json +++ b/resources/factions/poland_2010.json @@ -13,13 +13,13 @@ "KC130" ], "frontline_units": [ - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "IFV_M1126_Stryker_ICV", - "IFV_BRDM_2", + "Scout_BRDM_2", "IFV_BMP_1", "APC_MTLB", - "MBT_Leopard_2", + "MBT_Leopard_2A6M", "MBT_T_72B3" ], "artillery_units": [ diff --git a/resources/factions/redfor_china_2010.json b/resources/factions/redfor_china_2010.json index c7b1fe0d..9acd9203 100644 --- a/resources/factions/redfor_china_2010.json +++ b/resources/factions/redfor_china_2010.json @@ -31,7 +31,7 @@ ], "frontline_units": [ "APC_BTR_80", - "APC_BTR_82A", + "IFV_BTR_82A", "HQ_7_Self_Propelled_LN", "IFV_BMP_1", "IFV_BMP_2", @@ -46,8 +46,8 @@ ], "artillery_units": [ "MLRS_9A52_Smerch_HE_300mm", - "MLRS_BM_27_Uragan_220mm", - "SPH_2S9_Nona_120mm_M", + "MLRS_9K57_Uragan_BM_27_220mm", + "SPM_2S9_Nona_120mm_M", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/redfor_russia_2010.json b/resources/factions/redfor_russia_2010.json index be4023fa..9d23f41c 100644 --- a/resources/factions/redfor_russia_2010.json +++ b/resources/factions/redfor_russia_2010.json @@ -31,7 +31,7 @@ ], "frontline_units": [ "APC_BTR_80", - "APC_BTR_82A", + "IFV_BTR_82A", "HQ_7_Self_Propelled_LN", "IFV_BMP_1", "IFV_BMP_2", @@ -46,8 +46,8 @@ ], "artillery_units": [ "MLRS_9A52_Smerch_HE_300mm", - "MLRS_BM_27_Uragan_220mm", - "SPH_2S9_Nona_120mm_M", + "MLRS_9K57_Uragan_BM_27_220mm", + "SPM_2S9_Nona_120mm_M", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/russia_1955.json b/resources/factions/russia_1955.json index a3964056..624daaae 100644 --- a/resources/factions/russia_1955.json +++ b/resources/factions/russia_1955.json @@ -13,7 +13,7 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "Grad_MRL_FDDM__FC", "APC_MTLB", "MBT_T_55", diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index 49b21bcc..39685e7b 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -17,7 +17,7 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_BTR_80", "APC_BTR_RD", "IFV_BMD_1", diff --git a/resources/factions/russia_1970_limited_air.json b/resources/factions/russia_1970_limited_air.json index 5ab6a703..3f8cf0aa 100644 --- a/resources/factions/russia_1970_limited_air.json +++ b/resources/factions/russia_1970_limited_air.json @@ -10,7 +10,7 @@ "Mi_24V" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_BTR_80", "IFV_BMD_1", "IFV_BMP_1", @@ -19,7 +19,7 @@ ], "artillery_units": [ "MLRS_BM_21_Grad_122mm", - "SPH_2S9_Nona_120mm_M", + "SPM_2S9_Nona_120mm_M", "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index d931e313..6fe0f30c 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -23,7 +23,7 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_BTR_80", "IFV_BMD_1", "IFV_BMP_1", @@ -32,7 +32,7 @@ ], "artillery_units": [ "MLRS_BM_21_Grad_122mm", - "SPH_2S9_Nona_120mm_M", + "SPM_2S9_Nona_120mm_M", "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index ce40dc11..37d74a10 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -35,7 +35,7 @@ "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index d2df9602..29cdf41e 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -34,14 +34,14 @@ "IFV_BMP_2", "IFV_BMP_3", "APC_BTR_80", - "APC_BTR_82A", + "IFV_BTR_82A", "MBT_T_90", "MBT_T_80U", "MBT_T_72B3", "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/russia_2010_hds.json b/resources/factions/russia_2010_hds.json index 23799043..61605e2e 100644 --- a/resources/factions/russia_2010_hds.json +++ b/resources/factions/russia_2010_hds.json @@ -34,14 +34,14 @@ "IFV_BMP_2", "IFV_BMP_3", "APC_BTR_80", - "APC_BTR_82A", + "IFV_BTR_82A", "MBT_T_90", "MBT_T_80U", "MBT_T_72B3", "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 0ada877b..35a5b242 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -39,7 +39,7 @@ "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", + "MLRS_9K57_Uragan_BM_27_220mm", "SPH_2S19_Msta_152mm" ], "logistics_units": [ diff --git a/resources/factions/soviet_union_1943.json b/resources/factions/soviet_union_1943.json index 3be02dd0..4958d0c7 100644 --- a/resources/factions/soviet_union_1943.json +++ b/resources/factions/soviet_union_1943.json @@ -8,11 +8,11 @@ "I_16" ], "frontline_units": [ - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ "MLRS_BM_21_Grad_122mm" diff --git a/resources/factions/spain_1990.json b/resources/factions/spain_1990.json index 6dd974be..65b7b03c 100644 --- a/resources/factions/spain_1990.json +++ b/resources/factions/spain_1990.json @@ -19,7 +19,7 @@ ], "frontline_units": [ "MBT_M60A3_Patton", - "MBT_Leopard_2", + "MBT_Leopard_2A4", "APC_M113", "SAM_Avenger__Stinger" ], diff --git a/resources/factions/sweden_1970.json b/resources/factions/sweden_1970.json index 30bcdcb7..3de20841 100644 --- a/resources/factions/sweden_1970.json +++ b/resources/factions/sweden_1970.json @@ -17,7 +17,7 @@ ], "frontline_units": [ "IFV_Warrior", - "MBT_Leopard_2", + "MBT_Leopard_2A4", "IFV_M1126_Stryker_ICV", "SAM_Chaparral_M48" ], diff --git a/resources/factions/sweden_1990.json b/resources/factions/sweden_1990.json index 2ea024b9..42dd4c28 100644 --- a/resources/factions/sweden_1990.json +++ b/resources/factions/sweden_1990.json @@ -16,7 +16,7 @@ ], "frontline_units": [ "IFV_Warrior", - "MBT_Leopard_2", + "MBT_Leopard_2A4", "IFV_M1126_Stryker_ICV", "SAM_Avenger__Stinger" ], diff --git a/resources/factions/syria_1948.json b/resources/factions/syria_1948.json index 79cd7438..ad05776d 100644 --- a/resources/factions/syria_1948.json +++ b/resources/factions/syria_1948.json @@ -10,9 +10,9 @@ "frontline_units": [ "IFV_Sd_Kfz_234_2_Puma", "APC_Sd_Kfz_251_Halftrack", - "MT_PzIV_H", - "MT_M4_Sherman", - "AAA_40mm_Bofors" + "Tk_PzIV_H", + "Tk_M4_Sherman", + "AAA_Bofors_40mm" ], "artillery_units": [ ], diff --git a/resources/factions/syria_1967.json b/resources/factions/syria_1967.json index b2e93159..5e092ed9 100644 --- a/resources/factions/syria_1967.json +++ b/resources/factions/syria_1967.json @@ -17,8 +17,8 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", - "MT_PzIV_H", + "Scout_BRDM_2", + "Tk_PzIV_H", "MBT_T_55", "SPAAA_ZU_23_2_Mounted_Ural_375", "SPAAA_ZSU_57_2", diff --git a/resources/factions/syria_1967_with_ww2_weapons.json b/resources/factions/syria_1967_with_ww2_weapons.json index 34fbaf1d..cfab65fc 100644 --- a/resources/factions/syria_1967_with_ww2_weapons.json +++ b/resources/factions/syria_1967_with_ww2_weapons.json @@ -18,9 +18,9 @@ "IL_78M" ], "frontline_units": [ - "IFV_BRDM_2", + "Scout_BRDM_2", "MBT_T_55", - "MT_PzIV_H", + "Tk_PzIV_H", "SPG_StuG_III_Ausf__G", "SPG_Jagdpanzer_IV", "SPAAA_ZSU_57_2", diff --git a/resources/factions/syria_2011.json b/resources/factions/syria_2011.json index ae2211a5..3a5a3d21 100644 --- a/resources/factions/syria_2011.json +++ b/resources/factions/syria_2011.json @@ -26,17 +26,17 @@ "IFV_BMP_1", "IFV_BMP_2", "APC_BTR_80", - "IFV_BRDM_2", + "Scout_BRDM_2", "APC_MTLB", - "APC_Cobra__Scout", + "Scout_Cobra", "MBT_T_55", "MBT_T_72B", "MBT_T_90", "SPAAA_ZSU_57_2" ], "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", - "SPH_2S9_Nona_120mm_M", + "MLRS_9K57_Uragan_BM_27_220mm", + "SPM_2S9_Nona_120mm_M", "MLRS_BM_21_Grad_122mm", "SPH_2S1_Gvozdika_122mm" ], diff --git a/resources/factions/turkey_2005.json b/resources/factions/turkey_2005.json index f5c7847c..dfe8df1e 100644 --- a/resources/factions/turkey_2005.json +++ b/resources/factions/turkey_2005.json @@ -17,10 +17,10 @@ "KC130" ], "frontline_units": [ - "MBT_Leopard_2", + "MBT_Leopard_2A4_Trs", "MBT_Leopard_1A3", "MBT_M60A3_Patton", - "APC_Cobra__Scout", + "Scout_Cobra", "APC_BTR_80", "SAM_Avenger__Stinger" ], diff --git a/resources/factions/uk_1944.json b/resources/factions/uk_1944.json index 32f44303..e8b0a990 100644 --- a/resources/factions/uk_1944.json +++ b/resources/factions/uk_1944.json @@ -16,14 +16,14 @@ ], "frontline_units": [ "MT_M4A4_Sherman_Firefly", - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", "CT_Cromwell_IV", "CT_Centaur_IV", "HIT_Churchill_VII", "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ ], diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index 9f88bb79..492a3d99 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -20,7 +20,7 @@ "frontline_units": [ "MBT_Challenger_II", "IFV_Warrior", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Avenger__Stinger" ], @@ -71,4 +71,4 @@ ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" -} \ No newline at end of file +} diff --git a/resources/factions/ukraine_2010.json b/resources/factions/ukraine_2010.json index d8fd710b..644b9799 100644 --- a/resources/factions/ukraine_2010.json +++ b/resources/factions/ukraine_2010.json @@ -20,7 +20,7 @@ "IL_78M" ], "frontline_units": [ - "APC_HMMWV__Scout", + "Scout_HMMWV", "IFV_BMP_3", "IFV_BMP_2", "APC_BTR_80", diff --git a/resources/factions/unc_1950_fictional.json b/resources/factions/unc_1950_fictional.json index dae56d1f..7651897b 100644 --- a/resources/factions/unc_1950_fictional.json +++ b/resources/factions/unc_1950_fictional.json @@ -12,11 +12,11 @@ "P_47D_40" ], "frontline_units": [ - "MT_M4_Sherman", + "Tk_M4_Sherman", "MBT_M60A3_Patton", "APC_M2A1_Halftrack", "Car_M8_Greyhound_Armored", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ "SPG_M12_GMC_155mm" @@ -38,4 +38,4 @@ "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" } -} \ No newline at end of file +} diff --git a/resources/factions/us_aggressors.json b/resources/factions/us_aggressors.json index ef43854b..08a898a9 100644 --- a/resources/factions/us_aggressors.json +++ b/resources/factions/us_aggressors.json @@ -31,11 +31,11 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "MBT_Leopard_2", + "MBT_Leopard_2A4", "ATGM_Stryker", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "SAM_Avenger__Stinger" ], "artillery_units": [ @@ -82,4 +82,4 @@ "vf-74 adversary" ] } -} \ No newline at end of file +} diff --git a/resources/factions/usa_1944.json b/resources/factions/usa_1944.json index 7b846324..c50e37e8 100644 --- a/resources/factions/usa_1944.json +++ b/resources/factions/usa_1944.json @@ -15,7 +15,7 @@ ], "frontline_units": [ "MT_M4A4_Sherman_Firefly", - "MT_M4_Sherman", + "Tk_M4_Sherman", "APC_M2A1_Halftrack", "Car_M8_Greyhound_Armored", "SPG_M10_GMC", diff --git a/resources/factions/usa_1955.json b/resources/factions/usa_1955.json index 0dd8262b..8233e991 100644 --- a/resources/factions/usa_1955.json +++ b/resources/factions/usa_1955.json @@ -11,10 +11,10 @@ "P_51D_30_NA" ], "frontline_units": [ - "MT_M4_Sherman", + "Tk_M4_Sherman", "MBT_M60A3_Patton", "APC_M2A1_Halftrack", - "AAA_40mm_Bofors" + "AAA_Bofors_40mm" ], "artillery_units": [ "SPG_M12_GMC_155mm" @@ -34,4 +34,4 @@ "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" } -} \ No newline at end of file +} diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index 18d18849..40e0030f 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -39,7 +39,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Avenger__Stinger" ], @@ -119,4 +119,4 @@ "VMFA-323" ] } -} \ No newline at end of file +} diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 57869deb..90870d7f 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -39,7 +39,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Avenger__Stinger", "SAM_Linebacker___Bradley_M6", @@ -119,4 +119,4 @@ "VMFA-323" ] } -} \ No newline at end of file +} diff --git a/resources/factions/usa_2005_c130.json b/resources/factions/usa_2005_c130.json index 54e4823e..a372546f 100644 --- a/resources/factions/usa_2005_c130.json +++ b/resources/factions/usa_2005_c130.json @@ -40,7 +40,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Avenger__Stinger", "SAM_Linebacker___Bradley_M6" @@ -121,4 +121,4 @@ "VMFA-323" ] } -} \ No newline at end of file +} diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index cc8ca114..7b35e379 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -35,7 +35,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV", "SAM_Avenger__Stinger", "SAM_Linebacker___Bradley_M6" @@ -116,4 +116,4 @@ "VMFA-323" ] } -} \ No newline at end of file +} diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index 0f65fcb6..fc82a2eb 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -21,7 +21,7 @@ "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", - "APC_HMMWV__Scout", + "Scout_HMMWV", "SPAAA_Vulcan_M163" ], "artillery_units": [ @@ -87,4 +87,4 @@ "VFA-97" ] } -} \ No newline at end of file +} diff --git a/tests/resources/invalid_faction_country.json b/tests/resources/invalid_faction_country.json index 245c66f1..50f3fe11 100644 --- a/tests/resources/invalid_faction_country.json +++ b/tests/resources/invalid_faction_country.json @@ -30,7 +30,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV" ], "artillery_units": [ @@ -83,4 +83,4 @@ ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" -} \ No newline at end of file +} diff --git a/tests/resources/valid_faction.json b/tests/resources/valid_faction.json index c31b2c8a..1ee00e13 100644 --- a/tests/resources/valid_faction.json +++ b/tests/resources/valid_faction.json @@ -32,7 +32,7 @@ "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_HMMWV__Scout", + "Scout_HMMWV", "ATGM_HMMWV" ], "artillery_units": [ @@ -85,4 +85,4 @@ ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" -} \ No newline at end of file +} diff --git a/tests/test_factions.py b/tests/test_factions.py index 5b65abb5..232786d4 100644 --- a/tests/test_factions.py +++ b/tests/test_factions.py @@ -82,7 +82,7 @@ class TestFactionLoader(unittest.TestCase): self.assertIn(Armor.IFV_M1126_Stryker_ICV, faction.frontline_units) self.assertIn(Armor.IFV_M2A2_Bradley, faction.frontline_units) self.assertIn(Armor.IFV_LAV_25, faction.frontline_units) - self.assertIn(Armor.APC_HMMWV__Scout, faction.frontline_units) + self.assertIn(Armor.Scout_HMMWV, faction.frontline_units) self.assertIn(Armor.ATGM_HMMWV, faction.frontline_units) self.assertIn(Artillery.MLRS_M270_227mm, faction.artillery_units) From 29c0a8d054ae3d4d5e062487a04dac0b4d0f3b75 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 6 Jun 2021 17:28:23 +0200 Subject: [PATCH 03/40] Fixed ground start for helos in FOB --- game/theater/conflicttheater.py | 1 + gen/aircraft.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 0f941009..4883396b 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -55,6 +55,7 @@ from .frontline import FrontLine from .landmap import Landmap, load_landmap, poly_contains from .latlon import LatLon from .projections import TransverseMercator +from ..helipad import Helipad from ..point_with_heading import PointWithHeading from ..profiling import logged_duration from ..scenery_group import SceneryGroup diff --git a/gen/aircraft.py b/gen/aircraft.py index 3d275dd3..38093832 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -1173,8 +1173,9 @@ class AircraftConflictGenerator: start_type=flight.start_type, at=helipad.static_unit, ) + # Note : A bit dirty, need better support required in pydcs group.points[0].action = PointAction.FromGroundArea - group.points[0].type = "From Ground Area" + group.points[0].type = "TakeOffGround" helipad.occupied = True for i in range(flight.count - 1): From 07b93167f06eb07e74c7bbccdd16011e3757c603 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 6 Jun 2021 17:49:56 +0200 Subject: [PATCH 04/40] Improved implementation. --- game/theater/controlpoint.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index d1ab1827..1b46e300 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -23,7 +23,6 @@ from typing import ( Tuple, ) -from dcs import helicopters from dcs.mapping import Point from dcs.ships import ( CVN_74_John_C__Stennis, @@ -1139,7 +1138,7 @@ class Fob(ControlPoint): return len(self.helipads) def can_operate(self, aircraft: FlyingType) -> bool: - if aircraft in helicopters.helicopter_map.values(): + if aircraft.helicopter: return True else: return False From f4c54bb9e6ac166b35aca8be2debbed8a403f4ee Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 8 Jun 2021 13:17:34 +0200 Subject: [PATCH 05/40] Autogenerate ammo & fuel for helipads so player controlled helicopter can use ground crew menu to refuel and rearm at FARPs. --- gen/groundobjectsgen.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index 111fd1b9..f0407c02 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -600,6 +600,24 @@ class HelipadGenerator: helipad.static_unit = sg helipad.occupied = False + # Generate a FARP Ammo and Fuel stack for each pad + self.m.static_group( + country=country, + name=(name + "_fuel"), + _type=Fortification.FARP_Fuel_Depot, + position=pad.position.point_from_heading(helipad.heading, 35), + heading=pad.heading, + ) + self.m.static_group( + country=country, + name=(name + "_ammo"), + _type=Fortification.FARP_Ammo_Storage, + position=pad.position.point_from_heading( + helipad.heading, 35 + ).point_from_heading(helipad.heading + 90, 10), + heading=pad.heading, + ) + class GroundObjectsGenerator: """Creates DCS groups and statics for the theater during mission generation. From 51fa0a08915a5176c8193046fa761cfd8e4023b2 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 8 Jun 2021 13:18:27 +0200 Subject: [PATCH 06/40] Added function to get cp number of fuel depots --- game/theater/controlpoint.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index a94c7bd3..1f31e9bd 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -780,6 +780,22 @@ class ControlPoint(MissionTarget, ABC): """Return the number of ammo depots, including dead ones""" return len([obj for obj in self.connected_objectives if obj.category == "ammo"]) + @property + def active_fuel_depots_count(self) -> int: + """Return the number of available fuel depots""" + return len( + [ + obj + for obj in self.connected_objectives + if obj.category == "fuel" and not obj.is_dead + ] + ) + + @property + def total_fuel_depots_count(self) -> int: + """Return the number of fuel depots, including dead ones""" + return len([obj for obj in self.connected_objectives if obj.category == "fuel"]) + @property def strike_targets(self) -> List[Union[MissionTarget, Unit]]: return [] From b7a0feba5b30be9b70ad0a405918ec822b47b73c Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 8 Jun 2021 13:45:21 +0200 Subject: [PATCH 07/40] Added more helipads on Golan Heights --- resources/campaigns/golan_heights_lite.miz | Bin 31249 -> 31135 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 4381073038f6bad2e8c875c955cc4dcccc11b596..29da46eee21b97d97c23966658c19024ce9447df 100644 GIT binary patch delta 27147 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 aJ1bvryZdUGpkK8>$d@&;DqG+$>Hh##5@_fE delta 27252 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 From 1b9ac088e4215721385805eae4770d978d772e71 Mon Sep 17 00:00:00 2001 From: Khopa Date: Thu, 10 Jun 2021 13:19:22 +0200 Subject: [PATCH 08/40] Refactor & fix code after comments --- game/theater/controlpoint.py | 2 +- gen/aircraft.py | 2 +- gen/flights/closestairfields.py | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 8be9813f..57ed2957 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -1133,7 +1133,7 @@ class Fob(ControlPoint): self.name = name def runway_is_operational(self) -> bool: - return False + return self.has_helipads def active_runway( self, conditions: Conditions, dynamic_runways: Dict[str, RunwayData] diff --git a/gen/aircraft.py b/gen/aircraft.py index 88799384..7e55ae20 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -1197,7 +1197,7 @@ class AircraftConflictGenerator: # If the flight is an helicopter flight, then prioritize dedicated helipads group = None - if flight.unit_type in helicopters.helicopter_map.values(): + if flight.unit_type.helicopter: helipad = cp.get_free_helipad() if helipad is not None: group = self._generate_at_group( diff --git a/gen/flights/closestairfields.py b/gen/flights/closestairfields.py index d4c4de25..4dd0032e 100644 --- a/gen/flights/closestairfields.py +++ b/gen/flights/closestairfields.py @@ -25,11 +25,7 @@ class ClosestAirfields: @property def operational_airfields(self) -> Iterator[ControlPoint]: - return ( - c - for c in self.closest_airfields - if c.runway_is_operational() or c.has_helipads - ) + return (c for c in self.closest_airfields if c.runway_is_operational()) def _airfields_within( self, distance: Distance, operational: bool From adad88681eb5161dba5edd75e64860f740ddd8b4 Mon Sep 17 00:00:00 2001 From: Khopa Date: Thu, 10 Jun 2021 23:18:41 +0200 Subject: [PATCH 09/40] Generate helipads as neutral objects, so they do not interfer with base capture trigger --- game/game.py | 17 ++++++++++++++--- game/operation/operation.py | 16 +++++++++++++++- gen/groundobjectsgen.py | 9 ++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/game/game.py b/game/game.py index a6d3c97b..266fd073 100644 --- a/game/game.py +++ b/game/game.py @@ -4,9 +4,10 @@ import random import sys from datetime import date, datetime, timedelta from enum import Enum -from typing import Any, Dict, List, Iterator +from typing import Any, Dict, List from dcs.action import Coalition +from dcs.countries import Switzerland, UnitedNationsPeacekeepers, USAFAggressors from dcs.mapping import Point from dcs.task import CAP, CAS, PinpointStrike from dcs.vehicles import AirDefence @@ -16,7 +17,6 @@ from game import db from game.inventory import GlobalAircraftInventory from game.models.game_stats import GameStats from game.plugins import LuaPluginManager -from game.theater.theatergroundobject import MissileSiteGroundObject from gen.ato import AirTaskingOrder from gen.conflictgen import Conflict from gen.flights.ai_flight_planner import CoalitionMissionPlanner @@ -34,7 +34,7 @@ from .navmesh import NavMesh from .procurement import AircraftProcurementRequest, ProcurementAi from .profiling import logged_duration from .settings import Settings, AutoAtoBehavior -from .squadrons import Pilot, AirWing +from .squadrons import AirWing from .theater import ConflictTheater from .theater.bullseye import Bullseye from .theater.transitnetwork import TransitNetwork, TransitNetworkBuilder @@ -208,6 +208,17 @@ class Game: def enemy_faction(self) -> Faction: return db.FACTIONS[self.enemy_name] + @property + def neutral_country(self): + """Return the best fitting country that can be used as neutral faction in the generated mission""" + countries_in_use = [self.player_country, self.enemy_country] + if UnitedNationsPeacekeepers not in countries_in_use: + return UnitedNationsPeacekeepers + elif Switzerland.name not in countries_in_use: + return Switzerland + else: + return USAFAggressors + def faction_for(self, player: bool) -> Faction: if player: return self.player_faction diff --git a/game/operation/operation.py b/game/operation/operation.py index 2f683f78..20d54c3e 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -16,7 +16,7 @@ from dcs.triggers import TriggerStart from game.plugins import LuaPluginManager from game.theater.theatergroundobject import TheaterGroundObject -from gen import Conflict, FlightType, VisualGenerator +from gen import Conflict, FlightType, VisualGenerator, Bullseye from gen.aircraft import AIRCRAFT_DATA, AircraftConflictGenerator, FlightData from gen.airfields import AIRFIELD_DATA from gen.airsupportgen import AirSupport, AirSupportConflictGenerator @@ -114,9 +114,13 @@ class Operation: cls.current_mission.coalition["red"] = Coalition( "red", bullseye=cls.game.red_bullseye.to_pydcs() ) + cls.current_mission.coalition["neutrals"] = Coalition( + "neutrals", bullseye=Bullseye(Point(0, 0)).to_pydcs() + ) p_country = cls.game.player_country e_country = cls.game.enemy_country + cls.current_mission.coalition["blue"].add_country( country_dict[db.country_id_from_name(p_country)]() ) @@ -124,6 +128,16 @@ class Operation: country_dict[db.country_id_from_name(e_country)]() ) + belligerents = [ + db.country_id_from_name(p_country), + db.country_id_from_name(e_country), + ] + for country in country_dict.keys(): + if country not in belligerents: + cls.current_mission.coalition["neutrals"].add_country( + country_dict[country]() + ) + @classmethod def inject_lua_trigger(cls, contents: str, comment: str) -> None: trigger = TriggerStart(comment=comment) diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index f0407c02..319a368a 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -584,19 +584,22 @@ class HelipadGenerator: country_name = self.game.enemy_country country = self.m.country(country_name) + # Note : Helipad are generated as neutral object in order not to interfer with capture triggers + neutral_country = self.m.country(self.game.neutral_country.name) + for i, helipad in enumerate(self.cp.helipads): name = self.cp.name + "_helipad_" + str(i) logging.info("Generating helipad : " + name) - pad = SingleHeliPad(name=(name + "_unit")) + pad = SingleHeliPad(name=name) pad.position = Point(helipad.x, helipad.y) pad.heading = helipad.heading - # pad.heliport_frequency = self.radio_registry.alloc_uhf() TODO : alloc radio & callsign sg = unitgroup.StaticGroup(self.m.next_group_id(), name) sg.add_unit(pad) sp = StaticPoint() sp.position = pad.position sg.add_point(sp) - country.add_static_group(sg) + neutral_country.add_static_group(sg) + helipad.static_unit = sg helipad.occupied = False From e56e765450cab1505cd48593e3252a8a4d0a224c Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 20 Jun 2021 18:20:40 +0200 Subject: [PATCH 10/40] Helipad : fixed errors after merge of develop features. --- game/dcs/aircrafttype.py | 4 ++++ game/theater/controlpoint.py | 8 +++++--- gen/groundobjectsgen.py | 2 +- .../windows/basemenu/airfield/QAircraftRecruitmentMenu.py | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/game/dcs/aircrafttype.py b/game/dcs/aircrafttype.py index 1ed162b0..7c884220 100644 --- a/game/dcs/aircrafttype.py +++ b/game/dcs/aircrafttype.py @@ -116,6 +116,10 @@ class AircraftType(UnitType[FlyingType]): def flyable(self) -> bool: return self.dcs_unit_type.flyable + @property + def helicopter(self) -> bool: + return self.dcs_unit_type.helicopter + @cached_property def max_speed(self) -> Speed: return kph(self.dcs_unit_type.max_speed) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 40496133..d4ceb7d1 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -31,6 +31,7 @@ from dcs.ships import ( ) from dcs.terrain.terrain import Airport, ParkingSlot from dcs.unit import Unit +from dcs.unittype import FlyingType from game import db from game.point_with_heading import PointWithHeading @@ -44,10 +45,9 @@ from .theatergroundobject import ( GenericCarrierGroundObject, TheaterGroundObject, ) -from ..db import PRICES -from ..helipad import Helipad from ..dcs.aircrafttype import AircraftType from ..dcs.groundunittype import GroundUnitType +from ..helipad import Helipad from ..utils import nautical_miles from ..weather import Conditions @@ -1149,7 +1149,9 @@ class Fob(ControlPoint): def total_aircraft_parking(self) -> int: return len(self.helipads) - def can_operate(self, aircraft: FlyingType) -> bool: + def can_operate(self, aircraft: AircraftType) -> bool: + print(aircraft) + print(aircraft.helicopter) if aircraft.helicopter: return True else: diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index 319a368a..86c41ea0 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -614,7 +614,7 @@ class HelipadGenerator: self.m.static_group( country=country, name=(name + "_ammo"), - _type=Fortification.FARP_Ammo_Storage, + _type=Fortification.FARP_Ammo_Dump_Coating, position=pad.position.point_from_heading( helipad.heading, 35 ).point_from_heading(helipad.heading + 90, 10), diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index c5edcdbc..2df51537 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -52,7 +52,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): continue if ( self.cp.cptype in [ControlPointType.FOB, ControlPointType.FARP] - and unit_type not in helicopter_map.values() + and not unit_type.helicopter ): continue unit_types.add(unit_type) From 82bb2fcf6a181eafc7883609aad4977895ef2b9d Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 20 Jun 2021 18:25:19 +0200 Subject: [PATCH 11/40] Helipad : fixed typing errors after merge --- gen/aircraft.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index c3121c8d..62246a88 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -748,7 +748,7 @@ class AircraftConflictGenerator: group = self._generate_at_group( name=name, side=country, - unit_type=flight.unit_type, + unit_type=flight.unit_type.dcs_unit_type, count=flight.count, start_type=flight.start_type, at=helipad.static_unit, @@ -772,7 +772,7 @@ class AircraftConflictGenerator: group = self._generate_at_airport( name=name, side=country, - unit_type=flight.unit_type, + unit_type=flight.unit_type.dcs_unit_type, count=flight.count, start_type=flight.start_type, airport=cp.airport, From 4460b526cb13f463579c9e8ea1090e7bde74a41c Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 26 Jun 2021 19:27:33 +0200 Subject: [PATCH 12/40] Golan heights : re-add helipads for testing in helipad branch after merge of develop feature. --- resources/campaigns/golan_heights_lite.miz | Bin 30834 -> 31489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 7b9e408a7cde0c54b7d1bd01d4f5f8457ef730aa..3aeaa695ca6f637f9d50cdb336d43b4e58a0b59b 100644 GIT binary patch delta 27705 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 From 1b9da9cdd895b046c56831e67d1d430c63c22f5c Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 26 Jun 2021 20:00:10 +0200 Subject: [PATCH 13/40] Fixed mypy error after merge --- game/game.py | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/game/game.py b/game/game.py index e3d08939..0f9eacbb 100644 --- a/game/game.py +++ b/game/game.py @@ -259,50 +259,6 @@ class Game: else: return USAFAggressors - def faction_for(self, player: bool) -> Faction: - if player: - return self.player_faction - return self.enemy_faction - - def faker_for(self, player: bool) -> Faker: - if player: - return self.blue_faker - return self.red_faker - - def air_wing_for(self, player: bool) -> AirWing: - if player: - return self.blue_air_wing - return self.red_air_wing - - def country_for(self, player: bool) -> str: - if player: - return self.player_country - return self.enemy_country - - def bullseye_for(self, player: bool) -> Bullseye: - if player: - return self.blue_bullseye - return self.red_bullseye - - def _roll(self, prob, mult): - if self.settings.version == "dev": - # always generate all events for dev - return 100 - else: - return random.randint(1, 100) <= prob * mult - - def _generate_player_event(self, event_class, player_cp, enemy_cp): - self.events.append( - event_class( - self, - player_cp, - enemy_cp, - enemy_cp.position, - self.player_faction.name, - self.enemy_faction.name, - ) - ) - def _generate_events(self): for front_line in self.theater.conflicts(): self._generate_player_event( From 97e59db5e695ffc544c8c52cb9a54add1b89492e Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 27 Jun 2021 19:57:04 +0200 Subject: [PATCH 14/40] Helipads : Support for warm takeoff, use InvisibleFarp rather than Single Helipad. --- gen/aircraft.py | 7 ++++++- gen/groundobjectsgen.py | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index a5eaeb4b..93befe97 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -751,9 +751,14 @@ class AircraftConflictGenerator: start_type=flight.start_type, at=helipad.static_unit, ) - # Note : A bit dirty, need better support required in pydcs + + # Note : A bit dirty, need better support in pydcs group.points[0].action = PointAction.FromGroundArea group.points[0].type = "TakeOffGround" + if flight.start_type != "Cold": + group.points[0].action = PointAction.FromGroundAreaHot + group.points[0].type = "TakeOffGroundHot" + helipad.occupied = True for i in range(flight.count - 1): diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index 86c41ea0..9d307e9c 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -24,7 +24,7 @@ from dcs.task import ( FireAtPoint, ) from dcs.triggers import TriggerStart, TriggerZone -from dcs.unit import Ship, Unit, Vehicle, SingleHeliPad +from dcs.unit import Ship, Unit, Vehicle, InvisibleFARP from dcs.unitgroup import Group, ShipGroup, StaticGroup, VehicleGroup from dcs.unittype import StaticType, UnitType from dcs.vehicles import vehicle_map @@ -590,7 +590,7 @@ class HelipadGenerator: for i, helipad in enumerate(self.cp.helipads): name = self.cp.name + "_helipad_" + str(i) logging.info("Generating helipad : " + name) - pad = SingleHeliPad(name=name) + pad = InvisibleFARP(name=name) pad.position = Point(helipad.x, helipad.y) pad.heading = helipad.heading sg = unitgroup.StaticGroup(self.m.next_group_id(), name) From eb1b7176a6f3fc43ed42db4408f4b9a81e2b2653 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 2 Aug 2021 19:46:07 +0200 Subject: [PATCH 15/40] Fixed issue with livery in custom M2000-C squadron --- .../squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml b/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml index 27440586..af066e4b 100644 --- a/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml +++ b/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml @@ -4,7 +4,7 @@ nickname: ÃŽle De France country: France role: Fighter aircraft: Mirage 2000C -livery: AdA_Chasse_2_5 +livery: AdA Chasse 2-5 mission_types: - BARCAP - Escort From d5cedee6c56052e5b908be54faed0385f7a280a7 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 2 Aug 2021 19:59:13 +0200 Subject: [PATCH 16/40] Added A-20G squadron for RAF --- resources/squadrons/A20/no_107_squadron_raf.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 resources/squadrons/A20/no_107_squadron_raf.yaml diff --git a/resources/squadrons/A20/no_107_squadron_raf.yaml b/resources/squadrons/A20/no_107_squadron_raf.yaml new file mode 100644 index 00000000..5fa6d47c --- /dev/null +++ b/resources/squadrons/A20/no_107_squadron_raf.yaml @@ -0,0 +1,14 @@ +--- +name: RAF, No. 107 Squadron +nickname: Lowestoft's 'own' Squadron +country: UK +role: Medium Bomber +aircraft: Boston Mk.III +livery: 107 Sqn +mission_types: + - BAI + - CAS + - DEAD + - OCA/Aircraft + - OCA/Runway + - Strike From 1c76bf93a2cb1853408de3438307bcd8124761ff Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 2 Aug 2021 20:00:14 +0200 Subject: [PATCH 17/40] Added Spitfire LF Mk IX's squadrons for RAF --- .../SpitfireLFMkIX/no_145_squadron_raf.yaml | 16 ++++++++++++++++ .../SpitfireLFMkIX/no_16_squadron_raf.yaml | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 resources/squadrons/SpitfireLFMkIX/no_145_squadron_raf.yaml create mode 100644 resources/squadrons/SpitfireLFMkIX/no_16_squadron_raf.yaml diff --git a/resources/squadrons/SpitfireLFMkIX/no_145_squadron_raf.yaml b/resources/squadrons/SpitfireLFMkIX/no_145_squadron_raf.yaml new file mode 100644 index 00000000..c34b3a6e --- /dev/null +++ b/resources/squadrons/SpitfireLFMkIX/no_145_squadron_raf.yaml @@ -0,0 +1,16 @@ +--- +name: RAF, No. 145 Squadron +nickname: No. 145 +country: UK +role: Fighter +aircraft: Spitfire LF Mk IX +livery: RAF, No. 145 Squadron +mission_types: + - CAS + - Escort + - Intercept + - OCA/Aircraft + - Strike + - Fighter sweep + - BARCAP + - TARCAP diff --git a/resources/squadrons/SpitfireLFMkIX/no_16_squadron_raf.yaml b/resources/squadrons/SpitfireLFMkIX/no_16_squadron_raf.yaml new file mode 100644 index 00000000..b4335177 --- /dev/null +++ b/resources/squadrons/SpitfireLFMkIX/no_16_squadron_raf.yaml @@ -0,0 +1,16 @@ +--- +name: RAF, No. 16 Squadron +nickname: No. 16 +country: UK +role: Fighter +aircraft: Spitfire LF Mk IX +livery: RAF, No. 16 Squadron +mission_types: + - CAS + - Escort + - Intercept + - OCA/Aircraft + - Strike + - Fighter sweep + - BARCAP + - TARCAP From 1e96aad484a331985b310281f525656ea3e805b6 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 2 Aug 2021 23:51:56 +0200 Subject: [PATCH 18/40] Fixed icons not appearing in UI for Mi-24V, Tu-95 and Tu-142 --- .../aircrafts/icons/{Mi-24_24.jpg => Mi-24V_24.jpg} | Bin .../icons/{Tu-142M_24.jpg => Tu-142_24.jpg} | Bin .../icons/{Tu-95_24.jpg => Tu-95MS_24.jpg} | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename resources/ui/units/aircrafts/icons/{Mi-24_24.jpg => Mi-24V_24.jpg} (100%) rename resources/ui/units/aircrafts/icons/{Tu-142M_24.jpg => Tu-142_24.jpg} (100%) rename resources/ui/units/aircrafts/icons/{Tu-95_24.jpg => Tu-95MS_24.jpg} (100%) diff --git a/resources/ui/units/aircrafts/icons/Mi-24_24.jpg b/resources/ui/units/aircrafts/icons/Mi-24V_24.jpg similarity index 100% rename from resources/ui/units/aircrafts/icons/Mi-24_24.jpg rename to resources/ui/units/aircrafts/icons/Mi-24V_24.jpg diff --git a/resources/ui/units/aircrafts/icons/Tu-142M_24.jpg b/resources/ui/units/aircrafts/icons/Tu-142_24.jpg similarity index 100% rename from resources/ui/units/aircrafts/icons/Tu-142M_24.jpg rename to resources/ui/units/aircrafts/icons/Tu-142_24.jpg diff --git a/resources/ui/units/aircrafts/icons/Tu-95_24.jpg b/resources/ui/units/aircrafts/icons/Tu-95MS_24.jpg similarity index 100% rename from resources/ui/units/aircrafts/icons/Tu-95_24.jpg rename to resources/ui/units/aircrafts/icons/Tu-95MS_24.jpg From 483640b0c6865b15e52f0112a98677714b023c99 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:15:14 +0200 Subject: [PATCH 19/40] Fixed errors after merge on helipad feature. --- game/game.py | 3 +-- game/helipad.py | 12 +++++++++++- game/theater/conflicttheater.py | 7 ++++--- gen/groundobjectsgen.py | 6 +++--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/game/game.py b/game/game.py index dab02f8a..2305523a 100644 --- a/game/game.py +++ b/game/game.py @@ -30,7 +30,6 @@ from .event.frontlineattack import FrontlineAttackEvent from .factions.faction import Faction from .infos.information import Information from .navmesh import NavMesh -from .procurement import AircraftProcurementRequest from .profiling import logged_duration from .settings import Settings from .squadrons import AirWing @@ -192,7 +191,7 @@ class Game: @property def neutral_country(self): """Return the best fitting country that can be used as neutral faction in the generated mission""" - countries_in_use = [self.player_country, self.enemy_country] + countries_in_use = [self.red.country_name, self.blue.country_name] if UnitedNationsPeacekeepers not in countries_in_use: return UnitedNationsPeacekeepers elif Switzerland.name not in countries_in_use: diff --git a/game/helipad.py b/game/helipad.py index 8660ad4f..0f113d00 100644 --- a/game/helipad.py +++ b/game/helipad.py @@ -1,13 +1,23 @@ from typing import Optional +from dcs import Point from dcs.unitgroup import StaticGroup from game.point_with_heading import PointWithHeading +from game.utils import Heading class Helipad(PointWithHeading): def __init__(self): super(Helipad, self).__init__() - self.heading = 0 + self.heading = Heading.from_degrees(0) self.occupied = False self.static_unit: Optional[StaticGroup] = None + + @staticmethod + def from_point(point: Point, heading: Heading) -> "Helipad": + h = Helipad() + h.x = point.x + h.y = point.y + h.heading = heading + return h diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 6651e918..01a98742 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -51,11 +51,11 @@ from .controlpoint import ( MissionTarget, OffMapSpawn, ) -from .seasonalconditions import SeasonalConditions from .frontline import FrontLine from .landmap import Landmap, load_landmap, poly_contains from .latlon import LatLon from .projections import TransverseMercator +from .seasonalconditions import SeasonalConditions from ..helipad import Helipad from ..point_with_heading import PointWithHeading from ..positioned import Positioned @@ -89,7 +89,7 @@ class MizCampaignLoader: SHIPPING_LANE_UNIT_TYPE = HandyWind.id FOB_UNIT_TYPE = Unarmed.SKP_11.id - FARP_HELIPAD = "SINGLE_HELIPAD" + FARP_HELIPAD = "Invisible FARP" OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.id SHIP_UNIT_TYPE = USS_Arleigh_Burke_IIa.id @@ -271,6 +271,7 @@ class MizCampaignLoader: def helipads(self) -> Iterator[StaticGroup]: for group in self.blue.static_group: if group.units[0].type == self.FARP_HELIPAD: + print("helooooo") yield group @property @@ -482,7 +483,7 @@ class MizCampaignLoader: for static in self.helipads: closest, distance = self.objective_info(static) closest.helipads.append( - PointWithHeading.from_point( + Helipad.from_point( static.position, Heading.from_degrees(static.units[0].heading) ) ) diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index 19907b7e..ffbd579c 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -614,7 +614,7 @@ class HelipadGenerator: country=country, name=(name + "_fuel"), _type=Fortification.FARP_Fuel_Depot, - position=pad.position.point_from_heading(helipad.heading, 35), + position=pad.position.point_from_heading(helipad.heading.degrees, 35), heading=pad.heading, ) self.m.static_group( @@ -622,8 +622,8 @@ class HelipadGenerator: name=(name + "_ammo"), _type=Fortification.FARP_Ammo_Dump_Coating, position=pad.position.point_from_heading( - helipad.heading, 35 - ).point_from_heading(helipad.heading + 90, 10), + helipad.heading.degrees, 35 + ).point_from_heading(helipad.heading.degrees + 90, 10), heading=pad.heading, ) From 5b37698d360712199455272b7ca599a616978045 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:28:22 +0200 Subject: [PATCH 20/40] Fixed mypy errors --- game/game.py | 3 ++- game/helipad.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/game/game.py b/game/game.py index 2305523a..e931335a 100644 --- a/game/game.py +++ b/game/game.py @@ -8,6 +8,7 @@ from typing import Any, List, Type, Union, cast from dcs.action import Coalition from dcs.countries import Switzerland, UnitedNationsPeacekeepers, USAFAggressors +from dcs.country import Country from dcs.mapping import Point from dcs.task import CAP, CAS, PinpointStrike from dcs.vehicles import AirDefence @@ -189,7 +190,7 @@ class Game: ) @property - def neutral_country(self): + def neutral_country(self) -> Type[Country]: """Return the best fitting country that can be used as neutral faction in the generated mission""" countries_in_use = [self.red.country_name, self.blue.country_name] if UnitedNationsPeacekeepers not in countries_in_use: diff --git a/game/helipad.py b/game/helipad.py index 0f113d00..4146556b 100644 --- a/game/helipad.py +++ b/game/helipad.py @@ -8,7 +8,7 @@ from game.utils import Heading class Helipad(PointWithHeading): - def __init__(self): + def __init__(self) -> None: super(Helipad, self).__init__() self.heading = Heading.from_degrees(0) self.occupied = False From 00e85280fd0b1d41146c9d6f5f6047f0ff95072d Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:29:06 +0200 Subject: [PATCH 21/40] Golan heights campaign updated with helipads. --- resources/campaigns/golan_heights_lite.miz | Bin 30917 -> 32449 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index ee6e371e4b86f225a893915507c608c9c09dc22b..4c92ede00d803e667b227686f75dd37d7ca1684f 100644 GIT binary patch delta 28877 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 delta 27308 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 MDOc$!1OxMb0G94H#{d8T From fbd01987710d8b4ea00e807c1597ad82b9307de7 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:37:26 +0200 Subject: [PATCH 22/40] Fixed mypy errors --- game/game.py | 1 - 1 file changed, 1 deletion(-) diff --git a/game/game.py b/game/game.py index e931335a..95f79dd1 100644 --- a/game/game.py +++ b/game/game.py @@ -6,7 +6,6 @@ from datetime import date, datetime, timedelta from enum import Enum from typing import Any, List, Type, Union, cast -from dcs.action import Coalition from dcs.countries import Switzerland, UnitedNationsPeacekeepers, USAFAggressors from dcs.country import Country from dcs.mapping import Point From 63f687a20e3113743a8b904ddb4ec019a77245bc Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:42:49 +0200 Subject: [PATCH 23/40] Fixed mypy errors in gen --- gen/aircraft.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index 2a64dbd2..d609aa2e 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -703,6 +703,7 @@ class AircraftConflictGenerator: self, cp: ControlPoint, country: Country, flight: Flight ) -> FlyingGroup[Any]: name = namegen.next_aircraft_name(country, cp.id, flight) + group: Optional[FlyingGroup[Any]] = None try: if flight.start_type == "In Flight": group = self._generate_inflight( @@ -727,7 +728,6 @@ class AircraftConflictGenerator: else: # If the flight is an helicopter flight, then prioritize dedicated helipads - group = None if flight.unit_type.helicopter: helipad = cp.get_free_helipad() if helipad is not None: From 399c739fd7d739eadff893fda27a908c75c373a4 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 00:51:47 +0200 Subject: [PATCH 24/40] Fixed mypy errors --- gen/aircraft.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index d609aa2e..0cfe1deb 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -703,7 +703,7 @@ class AircraftConflictGenerator: self, cp: ControlPoint, country: Country, flight: Flight ) -> FlyingGroup[Any]: name = namegen.next_aircraft_name(country, cp.id, flight) - group: Optional[FlyingGroup[Any]] = None + group: FlyingGroup[Any] try: if flight.start_type == "In Flight": group = self._generate_inflight( @@ -730,7 +730,7 @@ class AircraftConflictGenerator: # If the flight is an helicopter flight, then prioritize dedicated helipads if flight.unit_type.helicopter: helipad = cp.get_free_helipad() - if helipad is not None: + if helipad is not None and helipad.static_unit is not None: group = self._generate_at_group( name=name, side=country, From a831800a0578ba06b5c063e226eef99cf3ce991d Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 01:00:56 +0200 Subject: [PATCH 25/40] Fixed mypy errors :unamused: --- gen/aircraft.py | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index 0cfe1deb..f19efc61 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -709,6 +709,7 @@ class AircraftConflictGenerator: group = self._generate_inflight( name=name, side=country, flight=flight, origin=cp ) + return group elif isinstance(cp, NavalControlPoint): group_name = cp.get_carrier_group_name() carrier_group = self.m.find_group(group_name) @@ -725,8 +726,8 @@ class AircraftConflictGenerator: start_type=flight.start_type, at=carrier_group, ) + return group else: - # If the flight is an helicopter flight, then prioritize dedicated helipads if flight.unit_type.helicopter: helipad = cp.get_free_helipad() @@ -748,26 +749,30 @@ class AircraftConflictGenerator: group.points[0].type = "TakeOffGroundHot" helipad.occupied = True + group_generated = True - for i in range(flight.count - 1): - helipad = cp.get_free_helipad() - if helipad is not None: - helipad.occupied = True - group.units[1 + i].position = Point(helipad.x, helipad.y) + for i in range(flight.count - 1): + helipad = cp.get_free_helipad() + if helipad is not None: + helipad.occupied = True + group.units[1 + i].position = Point( + helipad.x, helipad.y + ) + return group - if group is None: - if not isinstance(cp, Airfield): - raise RuntimeError( - f"Attempted to spawn at airfield for non-airfield {cp}" - ) - group = self._generate_at_airport( - name=name, - side=country, - unit_type=flight.unit_type.dcs_unit_type, - count=flight.count, - start_type=flight.start_type, - airport=cp.airport, + if not isinstance(cp, Airfield): + raise RuntimeError( + f"Attempted to spawn at airfield for non-airfield {cp}" ) + group = self._generate_at_airport( + name=name, + side=country, + unit_type=flight.unit_type.dcs_unit_type, + count=flight.count, + start_type=flight.start_type, + airport=cp.airport, + ) + return group except Exception as e: # Generated when there is no place on Runway or on Parking Slots logging.error(e) @@ -779,8 +784,7 @@ class AircraftConflictGenerator: name=name, side=country, flight=flight, origin=cp ) group.points[0].alt = 1500 - - return group + return group @staticmethod def set_reduced_fuel( From 14615f9976f418a9300820553cd2abfc043f54d4 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 01:10:00 +0200 Subject: [PATCH 26/40] Bump campaign miz file version for helipad support --- game/version.py | 6 +++++- resources/campaigns/Battle_for_the_UAE.json | 2 +- resources/campaigns/Caucasus_Multi_Full.json | 4 ++-- resources/campaigns/Caucasus_Multi_Georgia.json | 4 ++-- resources/campaigns/Caucasus_Multi_Russia.json | 4 ++-- resources/campaigns/First_Lebanon_War.json | 2 +- resources/campaigns/Operation_Mole_Cricket_2010.json | 2 +- resources/campaigns/Road_to_Dubai.json | 4 ++-- resources/campaigns/around_the_mountain.json | 4 ++-- resources/campaigns/battle_of_abu_dhabi.json | 4 ++-- resources/campaigns/black_sea.json | 4 ++-- resources/campaigns/caen_to_evreux.json | 2 +- resources/campaigns/exercise_vegas_nerve.json | 4 ++-- resources/campaigns/golan_heights_lite.json | 2 +- resources/campaigns/mozdok_to_maykop.json | 2 +- resources/campaigns/nevada_Limited_Air.json | 4 ++-- resources/campaigns/northern_russia.json | 4 ++-- resources/campaigns/operation_allied_sword.json | 2 +- resources/campaigns/operation_blackball.json | 2 +- resources/campaigns/operation_peace_spring.json | 4 ++-- resources/campaigns/operation_vectrons_claw.json | 4 ++-- resources/campaigns/scenic_route.json | 2 +- 22 files changed, 38 insertions(+), 34 deletions(-) diff --git a/game/version.py b/game/version.py index 87d8a841..8ba1748a 100644 --- a/game/version.py +++ b/game/version.py @@ -110,4 +110,8 @@ VERSION = _build_version_string() #: Version 8.0 #: * DCS 2.7.4.9632 changed scenery target IDs. Any mission using map buildings as #: strike targets must check and potentially recreate all those objectives. -CAMPAIGN_FORMAT_VERSION = (8, 0) +#: +#: Version 8.1 +#: * You can now add "Invisible FARP" static to FOB to add helicopter slots +#: +CAMPAIGN_FORMAT_VERSION = (8, 1) diff --git a/resources/campaigns/Battle_for_the_UAE.json b/resources/campaigns/Battle_for_the_UAE.json index 2eabc899..131bc66e 100644 --- a/resources/campaigns/Battle_for_the_UAE.json +++ b/resources/campaigns/Battle_for_the_UAE.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Iran 2015", "description": "

Following the Battle of Abu Dhabi, Iran's invasion of the UAE has been halted approximately 20 miles Northeast of Liwa Airbase by coalition forces.

After weeks of stalemate, coalition forces have consolidated their position and are ready to launch their counterattack to push Iranian forces off the peninsula.

", - "version": "8.0", + "version": "8.1", "miz": "Battle_for_the_UAE_v3.0.2.miz", "performance": 2 } diff --git a/resources/campaigns/Caucasus_Multi_Full.json b/resources/campaigns/Caucasus_Multi_Full.json index 04a42a69..6c4fde80 100644 --- a/resources/campaigns/Caucasus_Multi_Full.json +++ b/resources/campaigns/Caucasus_Multi_Full.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Russia 2010", "description": "

This is a complete map of every airbase in the Caucasus Region, all bases are fully defended by Air, Land and/or Sea. The player starts by invading southern Georgia and works their way through Russia. The Strike and SAM targets are limited for performance reasons. If this Scenario is too taxing for your computer you may use the Multi-Part Scenarios. They are copied from this Campaign and are catered toward less powerful machines.

", - "version": "8.0", + "version": "8.1", "miz": "Caucasus_Multi_Full.miz", "performance": 3 -} \ No newline at end of file +} diff --git a/resources/campaigns/Caucasus_Multi_Georgia.json b/resources/campaigns/Caucasus_Multi_Georgia.json index c0e55f2d..b1af4ff2 100644 --- a/resources/campaigns/Caucasus_Multi_Georgia.json +++ b/resources/campaigns/Caucasus_Multi_Georgia.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Georgia 2008", "description": "

This is Part 1 of the Caucasus Multi-Part Campaign. This is the invasion of Georgia starting from the southwest (Batumi) and ending in both Gudauta and Tiblisi. This is a straightforward campaign that is smaller and simpler than most. However, it acts great as either a stand alone campaign for beginners, or as a lead into the Caucasus Multi-Part Russia campaign.

", - "version": "8.0", + "version": "8.1", "miz": "Caucasus_Multi_Georgia.miz", "performance": 1 -} \ No newline at end of file +} diff --git a/resources/campaigns/Caucasus_Multi_Russia.json b/resources/campaigns/Caucasus_Multi_Russia.json index a35edea4..64085295 100644 --- a/resources/campaigns/Caucasus_Multi_Russia.json +++ b/resources/campaigns/Caucasus_Multi_Russia.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Russia 2010", "description": "

This is part 2 of the Caucasus Multi-part campaign. After completing Multi-Part Georgia, play this campaign to invade Russia and finish the theater. As this is now Russia the recommended enemy faction has changed. To simulate still owning Georgia the player income has been supplemented through an increased number of blue strike targets at the starting bases. This is a more difficult scenario with a higher concentration of Redfor SAMs and Strike targets than usual.

", - "version": "8.0", + "version": "8.1", "miz": "Caucasus_Multi_Russia.miz", "performance": 2 -} \ No newline at end of file +} diff --git a/resources/campaigns/First_Lebanon_War.json b/resources/campaigns/First_Lebanon_War.json index 6534643a..45427502 100644 --- a/resources/campaigns/First_Lebanon_War.json +++ b/resources/campaigns/First_Lebanon_War.json @@ -6,6 +6,6 @@ "recommended_enemy_faction": "Syria 1982", "description": "

1100HRS, 06 June 1982: H-hour for Operation Peace for Galilee.

Objective: Push North towards Beirut and into the Bekaa Valley, eliminating or displacing any PLO and Syrian resistance. Airbases and their surrounding infrastructure in Syria are not the main objective but are still viable strategic targets.

Background: Years of PLO encroachment into the UN neutral zone and their resulting terror attacks against Israelis have pushed tension along the border to a breaking point. On June 3, the attempted assassination of Israeli Ambassador, Shlomo Argov by gunmen with ties to the PLO have finally pushed the Israelis to action.

Recommended Starting Budget:

$1500m for recommended factions, $$2000m for modern scenarios

Income Multiplier:

Blue: 1.0x

Red: 0.7x-1.0x

", "miz": "First_Lebanon_War_v3.0.2.miz", - "version": "8.0", + "version": "8.1", "performance": 2 } diff --git a/resources/campaigns/Operation_Mole_Cricket_2010.json b/resources/campaigns/Operation_Mole_Cricket_2010.json index 36c753ff..d835548c 100644 --- a/resources/campaigns/Operation_Mole_Cricket_2010.json +++ b/resources/campaigns/Operation_Mole_Cricket_2010.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Syria 2011", "description": "

In a scenario reminescent of the First Lebanon War, hostile Syrian-backed forces have flooded into the Bekaa Valley.

The objective of this operation is twofold: drive the enemy out of the Bekaa Valley and push past the Golan Heights into Syrian territory to capture Tiyas Airbase.

", - "version": "8.0", + "version": "8.1", "miz": "Operation_Mole_Cricket_2010_v3.0.2.miz", "performance": 2 } diff --git a/resources/campaigns/Road_to_Dubai.json b/resources/campaigns/Road_to_Dubai.json index ab524690..911deb80 100644 --- a/resources/campaigns/Road_to_Dubai.json +++ b/resources/campaigns/Road_to_Dubai.json @@ -3,9 +3,9 @@ "theater": "Persian Gulf", "authors": "Doc_of_Mur", "description": "

Small beginner friendly map

Note: This scenario is based around Iran invading the UAE and you are trying to take it back. It is small and beginner friendly.

", - "version": "8.0", + "version": "8.1", "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Iran 2015", "miz": "Road_to_Dubai.miz", "performance": 1 -} \ No newline at end of file +} diff --git a/resources/campaigns/around_the_mountain.json b/resources/campaigns/around_the_mountain.json index 4cc81e8d..d09456c7 100644 --- a/resources/campaigns/around_the_mountain.json +++ b/resources/campaigns/around_the_mountain.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Russia 2010", "recommended_enemy_faction": "USA 1990", "description": "

Scenario from Russia to Georgia in two Frontlines.

", - "version": "8.0", + "version": "8.1", "miz": "around_the_mountain.miz", "performance": 2 -} \ No newline at end of file +} diff --git a/resources/campaigns/battle_of_abu_dhabi.json b/resources/campaigns/battle_of_abu_dhabi.json index 5d6c25ca..026d4048 100644 --- a/resources/campaigns/battle_of_abu_dhabi.json +++ b/resources/campaigns/battle_of_abu_dhabi.json @@ -7,5 +7,5 @@ "description": "

You have managed to establish a foothold near Ras Al Khaima. Continue pushing south.

", "miz": "battle_of_abu_dhabi.miz", "performance": 2, - "version": "8.0" -} \ No newline at end of file + "version": "8.1" +} diff --git a/resources/campaigns/black_sea.json b/resources/campaigns/black_sea.json index 94cc5e02..503019e8 100644 --- a/resources/campaigns/black_sea.json +++ b/resources/campaigns/black_sea.json @@ -5,5 +5,5 @@ "description": "

A medium sized theater with bases along the coast of the Black Sea.

", "miz": "black_sea.miz", "performance": 2, - "version": "8.0" -} \ No newline at end of file + "version": "8.1" +} diff --git a/resources/campaigns/caen_to_evreux.json b/resources/campaigns/caen_to_evreux.json index c6e3fea3..7f2aa77d 100644 --- a/resources/campaigns/caen_to_evreux.json +++ b/resources/campaigns/caen_to_evreux.json @@ -7,5 +7,5 @@ "description": "

This is a light scenario on the Normandy map.

August 1944, allied forces are pushing from Caen/Carpiquet to the cities of Lisieux and Evreux.

Lisieux is an important logistic hub for the Werhmacht, and Evreux airbase is hosting most of the Luftwaffe forces in the region.

", "miz": "caen_to_evreux.miz", "performance": 1, - "version": "8.0" + "version": "8.1" } diff --git a/resources/campaigns/exercise_vegas_nerve.json b/resources/campaigns/exercise_vegas_nerve.json index ac08327d..ca6eb34e 100644 --- a/resources/campaigns/exercise_vegas_nerve.json +++ b/resources/campaigns/exercise_vegas_nerve.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Redfor (China) 2010", "description": "

This is an asymmetrical Red Flag Exercise scenario for the NTTR comprising 4 control points. You start off in control of the two Tonopah airports, and will push south to capture Groom Lake and Nellis AFBs. Taking down Nellis AFB's IADS and striking their resource sites ASAP once Groom Lake has been captured is recommended to offset their resource advantage.

", - "version": "8.0", + "version": "8.1", "miz": "exercise_vegas_nerve.miz", "performance": 0 -} \ No newline at end of file +} diff --git a/resources/campaigns/golan_heights_lite.json b/resources/campaigns/golan_heights_lite.json index ba618c9b..59d8d92f 100644 --- a/resources/campaigns/golan_heights_lite.json +++ b/resources/campaigns/golan_heights_lite.json @@ -7,5 +7,5 @@ "description": "

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.

", "miz": "golan_heights_lite.miz", "performance": 1, - "version": "8.0" + "version": "8.1" } diff --git a/resources/campaigns/mozdok_to_maykop.json b/resources/campaigns/mozdok_to_maykop.json index 490f1510..a3c99135 100644 --- a/resources/campaigns/mozdok_to_maykop.json +++ b/resources/campaigns/mozdok_to_maykop.json @@ -7,5 +7,5 @@ "description": "

A small theater in Russia, progress from Mozdok to Maykop.

This scenario is pretty simple, and is ideal if you want to run a short campaign to try liberation. If your PC is not powerful, this is also the less performance heavy scenario.

", "miz": "mozdok_to_maykop.miz", "performance": 0, - "version": "8.0" + "version": "8.1" } diff --git a/resources/campaigns/nevada_Limited_Air.json b/resources/campaigns/nevada_Limited_Air.json index 09e9aad7..3be8e8f3 100644 --- a/resources/campaigns/nevada_Limited_Air.json +++ b/resources/campaigns/nevada_Limited_Air.json @@ -5,7 +5,7 @@ "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Russia 1975", "description": "

This campaign is designed to be beginner friendly in that the number of aircraft slot have been limited. Other than the starting point and the 'boss' base the max slots in each of the airbases have a mere 3-5 slots.

This should prevent the airpower rush escperienced in most of the other larger campaign.

", - "version": "8.0", + "version": "8.1", "miz": "nevada_limited_air.miz", "performance": 1 -} \ No newline at end of file +} diff --git a/resources/campaigns/northern_russia.json b/resources/campaigns/northern_russia.json index a2c66c50..fe5a5025 100644 --- a/resources/campaigns/northern_russia.json +++ b/resources/campaigns/northern_russia.json @@ -7,5 +7,5 @@ "description": "

A medium campaign through the north eastern part of the Caucasus map. Play vs 1975 Russia for an low-medium difficulty campaign, play vs russia 1990 for a hard difficulty campaign.

Russia has invaded Georgia through the eastern mountains. Mount a counter offense and push them back!", "miz": "northern_russia.miz", "performance": 2, - "version": "8.0" -} \ No newline at end of file + "version": "8.1" +} diff --git a/resources/campaigns/operation_allied_sword.json b/resources/campaigns/operation_allied_sword.json index 027864e7..123bf65b 100644 --- a/resources/campaigns/operation_allied_sword.json +++ b/resources/campaigns/operation_allied_sword.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Israel-USN 2005 (Allied Sword)", "recommended_enemy_faction": "Syria-Lebanon 2005 (Allied Sword)", "description": "

In this fictional scenario, a US/Israeli coalition must push north from the Israeli border, through Syria and Lebanon to Aleppo.

Backstory: A Syrian-Lebanese joint force (with Russian materiel support) has attacked Israel, attmepting to cross the northern border. With the arrival of a US carrier group, Israel prepares its counterattack. The US Navy will handle the Beirut region's coastal arena, while the IAF will push through Damascus and the inland mountain ranges.

", - "version": "8.0", + "version": "8.1", "miz": "operation_allied_sword.miz", "performance": 2 } diff --git a/resources/campaigns/operation_blackball.json b/resources/campaigns/operation_blackball.json index 9b0483f3..283dce99 100644 --- a/resources/campaigns/operation_blackball.json +++ b/resources/campaigns/operation_blackball.json @@ -5,7 +5,7 @@ "recommended_player_faction": "US Navy 2005", "recommended_enemy_faction": "Russia 2010", "description": "

Warning: This campaign will not work if the attacking faction does not have a carrier.

A lightweight, fictional showcase of Cyprus for the Syria terrain. A US Navy force must deploy from a FOB and carrier group to push from the north-east down through the island.

Backstory: The world is at war. With the help of her eastern allies, Russia has taken the Suez Canal and deployed a large naval force to the Mediterranean, trapping a US carrier group near the Turkish-Syrian border. Now, they must break out by taking Cyprus back.

", - "version": "8.0", + "version": "8.1", "miz": "operation_blackball.miz", "performance": 1 } diff --git a/resources/campaigns/operation_peace_spring.json b/resources/campaigns/operation_peace_spring.json index 91dce6bd..5573b7f4 100644 --- a/resources/campaigns/operation_peace_spring.json +++ b/resources/campaigns/operation_peace_spring.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Turkey 2005", "description": "

This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive. Campaign inversion is available if you wish to play as Turkey.

", - "version": "8.0", + "version": "8.1", "miz": "operation_peace_spring.miz", "performance": 1 -} \ No newline at end of file +} diff --git a/resources/campaigns/operation_vectrons_claw.json b/resources/campaigns/operation_vectrons_claw.json index 51d5cb60..f25e871b 100644 --- a/resources/campaigns/operation_vectrons_claw.json +++ b/resources/campaigns/operation_vectrons_claw.json @@ -5,7 +5,7 @@ "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Russia 1990", "description": "

United Nations Observer Mission in Georgia (UNOMIG) observers stationed in Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut off from friendly forces by Russian troops backing the separatist state. The UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and troops at the Zugdidi Sector HQ will have to make a run for the coast, supported by offshore US naval aircraft. The contingent is aware that their best shot at survival is to swiftly retake Sukhumi before Russian forces have a chance to dig in, so that friendly ground forces can land and reinforce them.

Note: Ground unit purchase will not be available past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi with at least one surviving ground unit to capture it. The player can either play the first leg of the scenario as an evacuation with a couple of light vehicles (e.g. Humvees) set on breakthrough (modifying waypoints in the mission editor so they are not charging head-on into enemy ground forces is suggested), or purchase heavier ground units if they wish to experience a more traditional ground war.

", - "version": "8.0", + "version": "8.1", "miz": "operation_vectrons_claw.miz", "performance": 1 -} \ No newline at end of file +} diff --git a/resources/campaigns/scenic_route.json b/resources/campaigns/scenic_route.json index b6dc194c..e58bef22 100644 --- a/resources/campaigns/scenic_route.json +++ b/resources/campaigns/scenic_route.json @@ -5,7 +5,7 @@ "recommended_player_faction": "US Navy 2005", "recommended_enemy_faction": "Iran 2015", "description": "

A lightweight naval campaign involving a US Navy carrier group pushing across the coast of Iran. Note that the ground units purchased on turn zero must sustain you until you've taken the first hostile FOB. The starting point does not have a factory to simulate a Marine Expeditionary Force deploying from the carrier group.

Backstory: Iran has declared war on all US forces in the Gulf, resulting in all local allies withdrawing their support for American troops. A lone carrier group must pacify the southern coast of Iran and hold out until backup can arrive, lest the US and her interests be ejected from the region permanently.

", - "version": "8.0", + "version": "8.1", "miz": "scenic_route.miz", "performance": 1 } From 912311ad55d7011438392a4f71856b07715097a3 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 3 Aug 2021 01:32:10 +0200 Subject: [PATCH 27/40] changelog update --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index f1486a61..593e2cbd 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,7 @@ Saves from 4.x are not compatible with 5.0. * **[Campaign]** Weapon data such as fallbacks and introduction years is now moddable. Due to the new architecture to support this, the old data was not automatically migrated. * **[Campaign]** Era-restricted loadouts will now skip LGBs when no TGP is available in the loadout. This only applies to default loadouts; buddy-lasing can be coordinated with custom loadouts. +* **[Campaign]** FOBs control point can have FARP/helipad slot and host helicopters. To enable this feature on a FOB, add "Invisible FARP" statics objects near the FOB location in the campaign definition file. * **[Campaign AI]** Overhauled campaign AI target prioritization. This currently only affects the ordering of DEAD missions. * **[Campaign AI]** Player front line stances can now be automated. Improved stance selection for AI. * **[Campaign AI]** Reworked layout of hold, join, split, and ingress points. Should result in much shorter flight plans in general while still maintaining safe join/split/hold points. From ce1c416b2000126455be86b15e6115d97f496b23 Mon Sep 17 00:00:00 2001 From: Khopa Date: Fri, 6 Aug 2021 23:28:36 +0200 Subject: [PATCH 28/40] Revert version bump for campaign that do not use helipads --- resources/campaigns/Battle_for_the_UAE.json | 2 +- resources/campaigns/Caucasus_Multi_Full.json | 4 ++-- resources/campaigns/Caucasus_Multi_Georgia.json | 4 ++-- resources/campaigns/Caucasus_Multi_Russia.json | 4 ++-- resources/campaigns/First_Lebanon_War.json | 2 +- resources/campaigns/Operation_Mole_Cricket_2010.json | 2 +- resources/campaigns/Road_to_Dubai.json | 4 ++-- resources/campaigns/around_the_mountain.json | 4 ++-- resources/campaigns/battle_of_abu_dhabi.json | 4 ++-- resources/campaigns/black_sea.json | 4 ++-- resources/campaigns/caen_to_evreux.json | 2 +- resources/campaigns/exercise_vegas_nerve.json | 4 ++-- resources/campaigns/mozdok_to_maykop.json | 2 +- resources/campaigns/nevada_Limited_Air.json | 4 ++-- resources/campaigns/northern_russia.json | 4 ++-- resources/campaigns/operation_allied_sword.json | 2 +- resources/campaigns/operation_blackball.json | 2 +- resources/campaigns/operation_peace_spring.json | 4 ++-- resources/campaigns/operation_vectrons_claw.json | 4 ++-- resources/campaigns/scenic_route.json | 2 +- 20 files changed, 32 insertions(+), 32 deletions(-) diff --git a/resources/campaigns/Battle_for_the_UAE.json b/resources/campaigns/Battle_for_the_UAE.json index 131bc66e..2eabc899 100644 --- a/resources/campaigns/Battle_for_the_UAE.json +++ b/resources/campaigns/Battle_for_the_UAE.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Iran 2015", "description": "

Following the Battle of Abu Dhabi, Iran's invasion of the UAE has been halted approximately 20 miles Northeast of Liwa Airbase by coalition forces.

After weeks of stalemate, coalition forces have consolidated their position and are ready to launch their counterattack to push Iranian forces off the peninsula.

", - "version": "8.1", + "version": "8.0", "miz": "Battle_for_the_UAE_v3.0.2.miz", "performance": 2 } diff --git a/resources/campaigns/Caucasus_Multi_Full.json b/resources/campaigns/Caucasus_Multi_Full.json index 6c4fde80..04a42a69 100644 --- a/resources/campaigns/Caucasus_Multi_Full.json +++ b/resources/campaigns/Caucasus_Multi_Full.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Russia 2010", "description": "

This is a complete map of every airbase in the Caucasus Region, all bases are fully defended by Air, Land and/or Sea. The player starts by invading southern Georgia and works their way through Russia. The Strike and SAM targets are limited for performance reasons. If this Scenario is too taxing for your computer you may use the Multi-Part Scenarios. They are copied from this Campaign and are catered toward less powerful machines.

", - "version": "8.1", + "version": "8.0", "miz": "Caucasus_Multi_Full.miz", "performance": 3 -} +} \ No newline at end of file diff --git a/resources/campaigns/Caucasus_Multi_Georgia.json b/resources/campaigns/Caucasus_Multi_Georgia.json index b1af4ff2..c0e55f2d 100644 --- a/resources/campaigns/Caucasus_Multi_Georgia.json +++ b/resources/campaigns/Caucasus_Multi_Georgia.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Georgia 2008", "description": "

This is Part 1 of the Caucasus Multi-Part Campaign. This is the invasion of Georgia starting from the southwest (Batumi) and ending in both Gudauta and Tiblisi. This is a straightforward campaign that is smaller and simpler than most. However, it acts great as either a stand alone campaign for beginners, or as a lead into the Caucasus Multi-Part Russia campaign.

", - "version": "8.1", + "version": "8.0", "miz": "Caucasus_Multi_Georgia.miz", "performance": 1 -} +} \ No newline at end of file diff --git a/resources/campaigns/Caucasus_Multi_Russia.json b/resources/campaigns/Caucasus_Multi_Russia.json index 64085295..a35edea4 100644 --- a/resources/campaigns/Caucasus_Multi_Russia.json +++ b/resources/campaigns/Caucasus_Multi_Russia.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Russia 2010", "description": "

This is part 2 of the Caucasus Multi-part campaign. After completing Multi-Part Georgia, play this campaign to invade Russia and finish the theater. As this is now Russia the recommended enemy faction has changed. To simulate still owning Georgia the player income has been supplemented through an increased number of blue strike targets at the starting bases. This is a more difficult scenario with a higher concentration of Redfor SAMs and Strike targets than usual.

", - "version": "8.1", + "version": "8.0", "miz": "Caucasus_Multi_Russia.miz", "performance": 2 -} +} \ No newline at end of file diff --git a/resources/campaigns/First_Lebanon_War.json b/resources/campaigns/First_Lebanon_War.json index 45427502..6534643a 100644 --- a/resources/campaigns/First_Lebanon_War.json +++ b/resources/campaigns/First_Lebanon_War.json @@ -6,6 +6,6 @@ "recommended_enemy_faction": "Syria 1982", "description": "

1100HRS, 06 June 1982: H-hour for Operation Peace for Galilee.

Objective: Push North towards Beirut and into the Bekaa Valley, eliminating or displacing any PLO and Syrian resistance. Airbases and their surrounding infrastructure in Syria are not the main objective but are still viable strategic targets.

Background: Years of PLO encroachment into the UN neutral zone and their resulting terror attacks against Israelis have pushed tension along the border to a breaking point. On June 3, the attempted assassination of Israeli Ambassador, Shlomo Argov by gunmen with ties to the PLO have finally pushed the Israelis to action.

Recommended Starting Budget:

$1500m for recommended factions, $$2000m for modern scenarios

Income Multiplier:

Blue: 1.0x

Red: 0.7x-1.0x

", "miz": "First_Lebanon_War_v3.0.2.miz", - "version": "8.1", + "version": "8.0", "performance": 2 } diff --git a/resources/campaigns/Operation_Mole_Cricket_2010.json b/resources/campaigns/Operation_Mole_Cricket_2010.json index d835548c..36c753ff 100644 --- a/resources/campaigns/Operation_Mole_Cricket_2010.json +++ b/resources/campaigns/Operation_Mole_Cricket_2010.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Syria 2011", "description": "

In a scenario reminescent of the First Lebanon War, hostile Syrian-backed forces have flooded into the Bekaa Valley.

The objective of this operation is twofold: drive the enemy out of the Bekaa Valley and push past the Golan Heights into Syrian territory to capture Tiyas Airbase.

", - "version": "8.1", + "version": "8.0", "miz": "Operation_Mole_Cricket_2010_v3.0.2.miz", "performance": 2 } diff --git a/resources/campaigns/Road_to_Dubai.json b/resources/campaigns/Road_to_Dubai.json index 911deb80..ab524690 100644 --- a/resources/campaigns/Road_to_Dubai.json +++ b/resources/campaigns/Road_to_Dubai.json @@ -3,9 +3,9 @@ "theater": "Persian Gulf", "authors": "Doc_of_Mur", "description": "

Small beginner friendly map

Note: This scenario is based around Iran invading the UAE and you are trying to take it back. It is small and beginner friendly.

", - "version": "8.1", + "version": "8.0", "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Iran 2015", "miz": "Road_to_Dubai.miz", "performance": 1 -} +} \ No newline at end of file diff --git a/resources/campaigns/around_the_mountain.json b/resources/campaigns/around_the_mountain.json index d09456c7..4cc81e8d 100644 --- a/resources/campaigns/around_the_mountain.json +++ b/resources/campaigns/around_the_mountain.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Russia 2010", "recommended_enemy_faction": "USA 1990", "description": "

Scenario from Russia to Georgia in two Frontlines.

", - "version": "8.1", + "version": "8.0", "miz": "around_the_mountain.miz", "performance": 2 -} +} \ No newline at end of file diff --git a/resources/campaigns/battle_of_abu_dhabi.json b/resources/campaigns/battle_of_abu_dhabi.json index 026d4048..5d6c25ca 100644 --- a/resources/campaigns/battle_of_abu_dhabi.json +++ b/resources/campaigns/battle_of_abu_dhabi.json @@ -7,5 +7,5 @@ "description": "

You have managed to establish a foothold near Ras Al Khaima. Continue pushing south.

", "miz": "battle_of_abu_dhabi.miz", "performance": 2, - "version": "8.1" -} + "version": "8.0" +} \ No newline at end of file diff --git a/resources/campaigns/black_sea.json b/resources/campaigns/black_sea.json index 503019e8..94cc5e02 100644 --- a/resources/campaigns/black_sea.json +++ b/resources/campaigns/black_sea.json @@ -5,5 +5,5 @@ "description": "

A medium sized theater with bases along the coast of the Black Sea.

", "miz": "black_sea.miz", "performance": 2, - "version": "8.1" -} + "version": "8.0" +} \ No newline at end of file diff --git a/resources/campaigns/caen_to_evreux.json b/resources/campaigns/caen_to_evreux.json index 7f2aa77d..c6e3fea3 100644 --- a/resources/campaigns/caen_to_evreux.json +++ b/resources/campaigns/caen_to_evreux.json @@ -7,5 +7,5 @@ "description": "

This is a light scenario on the Normandy map.

August 1944, allied forces are pushing from Caen/Carpiquet to the cities of Lisieux and Evreux.

Lisieux is an important logistic hub for the Werhmacht, and Evreux airbase is hosting most of the Luftwaffe forces in the region.

", "miz": "caen_to_evreux.miz", "performance": 1, - "version": "8.1" + "version": "8.0" } diff --git a/resources/campaigns/exercise_vegas_nerve.json b/resources/campaigns/exercise_vegas_nerve.json index ca6eb34e..ac08327d 100644 --- a/resources/campaigns/exercise_vegas_nerve.json +++ b/resources/campaigns/exercise_vegas_nerve.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Redfor (China) 2010", "description": "

This is an asymmetrical Red Flag Exercise scenario for the NTTR comprising 4 control points. You start off in control of the two Tonopah airports, and will push south to capture Groom Lake and Nellis AFBs. Taking down Nellis AFB's IADS and striking their resource sites ASAP once Groom Lake has been captured is recommended to offset their resource advantage.

", - "version": "8.1", + "version": "8.0", "miz": "exercise_vegas_nerve.miz", "performance": 0 -} +} \ No newline at end of file diff --git a/resources/campaigns/mozdok_to_maykop.json b/resources/campaigns/mozdok_to_maykop.json index a3c99135..490f1510 100644 --- a/resources/campaigns/mozdok_to_maykop.json +++ b/resources/campaigns/mozdok_to_maykop.json @@ -7,5 +7,5 @@ "description": "

A small theater in Russia, progress from Mozdok to Maykop.

This scenario is pretty simple, and is ideal if you want to run a short campaign to try liberation. If your PC is not powerful, this is also the less performance heavy scenario.

", "miz": "mozdok_to_maykop.miz", "performance": 0, - "version": "8.1" + "version": "8.0" } diff --git a/resources/campaigns/nevada_Limited_Air.json b/resources/campaigns/nevada_Limited_Air.json index 3be8e8f3..09e9aad7 100644 --- a/resources/campaigns/nevada_Limited_Air.json +++ b/resources/campaigns/nevada_Limited_Air.json @@ -5,7 +5,7 @@ "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Russia 1975", "description": "

This campaign is designed to be beginner friendly in that the number of aircraft slot have been limited. Other than the starting point and the 'boss' base the max slots in each of the airbases have a mere 3-5 slots.

This should prevent the airpower rush escperienced in most of the other larger campaign.

", - "version": "8.1", + "version": "8.0", "miz": "nevada_limited_air.miz", "performance": 1 -} +} \ No newline at end of file diff --git a/resources/campaigns/northern_russia.json b/resources/campaigns/northern_russia.json index fe5a5025..a2c66c50 100644 --- a/resources/campaigns/northern_russia.json +++ b/resources/campaigns/northern_russia.json @@ -7,5 +7,5 @@ "description": "

A medium campaign through the north eastern part of the Caucasus map. Play vs 1975 Russia for an low-medium difficulty campaign, play vs russia 1990 for a hard difficulty campaign.

Russia has invaded Georgia through the eastern mountains. Mount a counter offense and push them back!", "miz": "northern_russia.miz", "performance": 2, - "version": "8.1" -} + "version": "8.0" +} \ No newline at end of file diff --git a/resources/campaigns/operation_allied_sword.json b/resources/campaigns/operation_allied_sword.json index 123bf65b..027864e7 100644 --- a/resources/campaigns/operation_allied_sword.json +++ b/resources/campaigns/operation_allied_sword.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Israel-USN 2005 (Allied Sword)", "recommended_enemy_faction": "Syria-Lebanon 2005 (Allied Sword)", "description": "

In this fictional scenario, a US/Israeli coalition must push north from the Israeli border, through Syria and Lebanon to Aleppo.

Backstory: A Syrian-Lebanese joint force (with Russian materiel support) has attacked Israel, attmepting to cross the northern border. With the arrival of a US carrier group, Israel prepares its counterattack. The US Navy will handle the Beirut region's coastal arena, while the IAF will push through Damascus and the inland mountain ranges.

", - "version": "8.1", + "version": "8.0", "miz": "operation_allied_sword.miz", "performance": 2 } diff --git a/resources/campaigns/operation_blackball.json b/resources/campaigns/operation_blackball.json index 283dce99..9b0483f3 100644 --- a/resources/campaigns/operation_blackball.json +++ b/resources/campaigns/operation_blackball.json @@ -5,7 +5,7 @@ "recommended_player_faction": "US Navy 2005", "recommended_enemy_faction": "Russia 2010", "description": "

Warning: This campaign will not work if the attacking faction does not have a carrier.

A lightweight, fictional showcase of Cyprus for the Syria terrain. A US Navy force must deploy from a FOB and carrier group to push from the north-east down through the island.

Backstory: The world is at war. With the help of her eastern allies, Russia has taken the Suez Canal and deployed a large naval force to the Mediterranean, trapping a US carrier group near the Turkish-Syrian border. Now, they must break out by taking Cyprus back.

", - "version": "8.1", + "version": "8.0", "miz": "operation_blackball.miz", "performance": 1 } diff --git a/resources/campaigns/operation_peace_spring.json b/resources/campaigns/operation_peace_spring.json index 5573b7f4..91dce6bd 100644 --- a/resources/campaigns/operation_peace_spring.json +++ b/resources/campaigns/operation_peace_spring.json @@ -5,7 +5,7 @@ "recommended_player_faction": "Bluefor Modern", "recommended_enemy_faction": "Turkey 2005", "description": "

This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive. Campaign inversion is available if you wish to play as Turkey.

", - "version": "8.1", + "version": "8.0", "miz": "operation_peace_spring.miz", "performance": 1 -} +} \ No newline at end of file diff --git a/resources/campaigns/operation_vectrons_claw.json b/resources/campaigns/operation_vectrons_claw.json index f25e871b..51d5cb60 100644 --- a/resources/campaigns/operation_vectrons_claw.json +++ b/resources/campaigns/operation_vectrons_claw.json @@ -5,7 +5,7 @@ "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Russia 1990", "description": "

United Nations Observer Mission in Georgia (UNOMIG) observers stationed in Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut off from friendly forces by Russian troops backing the separatist state. The UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and troops at the Zugdidi Sector HQ will have to make a run for the coast, supported by offshore US naval aircraft. The contingent is aware that their best shot at survival is to swiftly retake Sukhumi before Russian forces have a chance to dig in, so that friendly ground forces can land and reinforce them.

Note: Ground unit purchase will not be available past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi with at least one surviving ground unit to capture it. The player can either play the first leg of the scenario as an evacuation with a couple of light vehicles (e.g. Humvees) set on breakthrough (modifying waypoints in the mission editor so they are not charging head-on into enemy ground forces is suggested), or purchase heavier ground units if they wish to experience a more traditional ground war.

", - "version": "8.1", + "version": "8.0", "miz": "operation_vectrons_claw.miz", "performance": 1 -} +} \ No newline at end of file diff --git a/resources/campaigns/scenic_route.json b/resources/campaigns/scenic_route.json index e58bef22..b6dc194c 100644 --- a/resources/campaigns/scenic_route.json +++ b/resources/campaigns/scenic_route.json @@ -5,7 +5,7 @@ "recommended_player_faction": "US Navy 2005", "recommended_enemy_faction": "Iran 2015", "description": "

A lightweight naval campaign involving a US Navy carrier group pushing across the coast of Iran. Note that the ground units purchased on turn zero must sustain you until you've taken the first hostile FOB. The starting point does not have a factory to simulate a Marine Expeditionary Force deploying from the carrier group.

Backstory: Iran has declared war on all US forces in the Gulf, resulting in all local allies withdrawing their support for American troops. A lone carrier group must pacify the southern coast of Iran and hold out until backup can arrive, lest the US and her interests be ejected from the region permanently.

", - "version": "8.1", + "version": "8.0", "miz": "scenic_route.miz", "performance": 1 } From 9ea1edf9dbc8b21c7204ca6a71eab847ddc63522 Mon Sep 17 00:00:00 2001 From: Khopa Date: Fri, 6 Aug 2021 23:55:58 +0200 Subject: [PATCH 29/40] Applied minor requested changes --- game/helipad.py | 4 +++- game/theater/conflicttheater.py | 1 - game/theater/controlpoint.py | 4 +--- gen/aircraft.py | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/game/helipad.py b/game/helipad.py index 4146556b..c6d489d0 100644 --- a/game/helipad.py +++ b/game/helipad.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from dcs import Point @@ -15,7 +17,7 @@ class Helipad(PointWithHeading): self.static_unit: Optional[StaticGroup] = None @staticmethod - def from_point(point: Point, heading: Heading) -> "Helipad": + def from_point(point: Point, heading: Heading) -> Helipad: h = Helipad() h.x = point.x h.y = point.y diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 01a98742..4d8bf750 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -271,7 +271,6 @@ class MizCampaignLoader: def helipads(self) -> Iterator[StaticGroup]: for group in self.blue.static_group: if group.units[0].type == self.FARP_HELIPAD: - print("helooooo") yield group @property diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 68df933b..4b843b1a 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -405,7 +405,7 @@ class ControlPoint(MissionTarget, ABC): """ Returns true if cp has a free helipad """ - return False in [h.occupied for h in self.helipads] + return not all(h.occupied for h in self.helipads) def get_free_helipad(self) -> Optional[Helipad]: """ @@ -1187,8 +1187,6 @@ class Fob(ControlPoint): return len(self.helipads) def can_operate(self, aircraft: AircraftType) -> bool: - print(aircraft) - print(aircraft.helicopter) if aircraft.helicopter: return True else: diff --git a/gen/aircraft.py b/gen/aircraft.py index f19efc61..28f5dac0 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -749,7 +749,6 @@ class AircraftConflictGenerator: group.points[0].type = "TakeOffGroundHot" helipad.occupied = True - group_generated = True for i in range(flight.count - 1): helipad = cp.get_free_helipad() From 4f53e2beea936f6b66831fd8473e5a9a0b984f1c Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 7 Aug 2021 00:12:55 +0200 Subject: [PATCH 30/40] Fixed another minor issue with the PR --- game/theater/controlpoint.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 4b843b1a..d968b9a3 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -1187,10 +1187,7 @@ class Fob(ControlPoint): return len(self.helipads) def can_operate(self, aircraft: AircraftType) -> bool: - if aircraft.helicopter: - return True - else: - return False + return aircraft.helicopter @property def heading(self) -> Heading: From c4937e95e9e10f94904e742f125ae6c26478ae16 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 7 Aug 2021 00:16:07 +0200 Subject: [PATCH 31/40] Refactored the helipad generation code in a dedicated method "_generate_at_cp_helipad" + better error handling + removed useless temp variables --- gen/aircraft.py | 90 +++++++++++++++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index 28f5dac0..c46b3212 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -68,6 +68,7 @@ from game import db from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum from game.dcs.aircrafttype import AircraftType from game.factions.faction import Faction +from game.helipad import Helipad from game.settings import Settings from game.squadrons import Pilot from game.theater.controlpoint import ( @@ -533,6 +534,53 @@ class AircraftConflictGenerator: group_size=count, ) + def _generate_at_cp_helipad( + self, + name: str, + side: Country, + unit_type: Type[FlyingType], + count: int, + start_type: str, + cp: ControlPoint, + ) -> FlyingGroup[Any]: + assert count > 0 + + logging.info( + "airgen at cp's helipads : {} for {} at {}".format( + unit_type, side.id, cp.name + ) + ) + helipad = cp.get_free_helipad() + if helipad is not None and helipad.static_unit is not None: + group = self._generate_at_group( + name=name, + side=side, + unit_type=unit_type, + count=count, + start_type=start_type, + at=helipad.static_unit, + ) + + # Note : A bit dirty, need better support in pydcs + group.points[0].action = PointAction.FromGroundArea + group.points[0].type = "TakeOffGround" + if start_type != "Cold": + group.points[0].action = PointAction.FromGroundAreaHot + group.points[0].type = "TakeOffGroundHot" + + helipad.occupied = True + + for i in range(count - 1): + helipad = cp.get_free_helipad() + if helipad is not None: + helipad.occupied = True + group.units[1 + i].position = Point(helipad.x, helipad.y) + else: + raise RuntimeError( + f"Control Point {cp.name} does not have enough helipads" + ) + return group + def _add_radio_waypoint( self, group: FlyingGroup[Any], @@ -718,7 +766,7 @@ class AircraftConflictGenerator: f"Carrier group {carrier_group} is a " "{carrier_group.__class__.__name__}, expected a ShipGroup" ) - group = self._generate_at_group( + return self._generate_at_group( name=name, side=country, unit_type=flight.unit_type.dcs_unit_type, @@ -726,44 +774,23 @@ class AircraftConflictGenerator: start_type=flight.start_type, at=carrier_group, ) - return group else: # If the flight is an helicopter flight, then prioritize dedicated helipads if flight.unit_type.helicopter: - helipad = cp.get_free_helipad() - if helipad is not None and helipad.static_unit is not None: - group = self._generate_at_group( - name=name, - side=country, - unit_type=flight.unit_type.dcs_unit_type, - count=flight.count, - start_type=flight.start_type, - at=helipad.static_unit, - ) - - # Note : A bit dirty, need better support in pydcs - group.points[0].action = PointAction.FromGroundArea - group.points[0].type = "TakeOffGround" - if flight.start_type != "Cold": - group.points[0].action = PointAction.FromGroundAreaHot - group.points[0].type = "TakeOffGroundHot" - - helipad.occupied = True - - for i in range(flight.count - 1): - helipad = cp.get_free_helipad() - if helipad is not None: - helipad.occupied = True - group.units[1 + i].position = Point( - helipad.x, helipad.y - ) - return group + return self._generate_at_cp_helipad( + name=name, + side=country, + unit_type=flight.unit_type.dcs_unit_type, + count=flight.count, + start_type=flight.start_type, + cp=cp, + ) if not isinstance(cp, Airfield): raise RuntimeError( f"Attempted to spawn at airfield for non-airfield {cp}" ) - group = self._generate_at_airport( + return self._generate_at_airport( name=name, side=country, unit_type=flight.unit_type.dcs_unit_type, @@ -771,7 +798,6 @@ class AircraftConflictGenerator: start_type=flight.start_type, airport=cp.airport, ) - return group except Exception as e: # Generated when there is no place on Runway or on Parking Slots logging.error(e) From 54124871789535f4c6468abb53c277dd8fd60462 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 7 Aug 2021 00:38:12 +0200 Subject: [PATCH 32/40] Handle another error case in generate_at_cp_helipad + align helos heading with their slot --- gen/aircraft.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gen/aircraft.py b/gen/aircraft.py index c46b3212..6b112fd7 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -564,6 +564,7 @@ class AircraftConflictGenerator: # Note : A bit dirty, need better support in pydcs group.points[0].action = PointAction.FromGroundArea group.points[0].type = "TakeOffGround" + group.units[0].heading = helipad.heading if start_type != "Cold": group.points[0].action = PointAction.FromGroundAreaHot group.points[0].type = "TakeOffGroundHot" @@ -575,11 +576,14 @@ class AircraftConflictGenerator: if helipad is not None: helipad.occupied = True group.units[1 + i].position = Point(helipad.x, helipad.y) + group.units[1 + i].heading = helipad.heading else: raise RuntimeError( f"Control Point {cp.name} does not have enough helipads" ) return group + else: + raise RuntimeError(f"Control Point {cp.name} does not have enough helipads") def _add_radio_waypoint( self, From 5e715dadede293646c76942c603f47ae9a6ca633 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 7 Aug 2021 01:05:57 +0200 Subject: [PATCH 33/40] Changed helipad generation structure as to not impact "Game" object, as suggested by Dan. --- game/helipad.py | 25 ------------- game/operation/operation.py | 1 + game/theater/conflicttheater.py | 3 +- game/theater/controlpoint.py | 19 +--------- gen/aircraft.py | 62 ++++++++++++++++----------------- gen/groundobjectsgen.py | 16 ++++++--- 6 files changed, 44 insertions(+), 82 deletions(-) delete mode 100644 game/helipad.py diff --git a/game/helipad.py b/game/helipad.py deleted file mode 100644 index c6d489d0..00000000 --- a/game/helipad.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from typing import Optional - -from dcs import Point -from dcs.unitgroup import StaticGroup - -from game.point_with_heading import PointWithHeading -from game.utils import Heading - - -class Helipad(PointWithHeading): - def __init__(self) -> None: - super(Helipad, self).__init__() - self.heading = Heading.from_degrees(0) - self.occupied = False - self.static_unit: Optional[StaticGroup] = None - - @staticmethod - def from_point(point: Point, heading: Heading) -> Helipad: - h = Helipad() - h.x = point.x - h.y = point.y - h.heading = heading - return h diff --git a/game/operation/operation.py b/game/operation/operation.py index 299aaf15..1f632fc3 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -375,6 +375,7 @@ class Operation: cls.laser_code_registry, cls.unit_map, air_support=cls.airsupportgen.air_support, + helipads=cls.groundobjectgen.helipads, ) cls.airgen.clear_parking_slots() diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 4d8bf750..b0a79271 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -56,7 +56,6 @@ from .landmap import Landmap, load_landmap, poly_contains from .latlon import LatLon from .projections import TransverseMercator from .seasonalconditions import SeasonalConditions -from ..helipad import Helipad from ..point_with_heading import PointWithHeading from ..positioned import Positioned from ..profiling import logged_duration @@ -482,7 +481,7 @@ class MizCampaignLoader: for static in self.helipads: closest, distance = self.objective_info(static) closest.helipads.append( - Helipad.from_point( + PointWithHeading.from_point( static.position, Heading.from_degrees(static.units[0].heading) ) ) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index d968b9a3..472c2449 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -49,7 +49,6 @@ from .theatergroundobject import ( ) from ..dcs.aircrafttype import AircraftType from ..dcs.groundunittype import GroundUnitType -from ..helipad import Helipad from ..utils import nautical_miles from ..weather import Conditions @@ -307,7 +306,7 @@ class ControlPoint(MissionTarget, ABC): self.at = at self.connected_objectives: List[TheaterGroundObject[Any]] = [] self.preset_locations = PresetLocations() - self.helipads: List[Helipad] = [] + self.helipads: List[PointWithHeading] = [] # TODO: Should be Airbase specific. self.size = size @@ -400,22 +399,6 @@ class ControlPoint(MissionTarget, ABC): """ return len(self.helipads) > 0 - @property - def has_free_helipad(self) -> bool: - """ - Returns true if cp has a free helipad - """ - return not all(h.occupied for h in self.helipads) - - def get_free_helipad(self) -> Optional[Helipad]: - """ - Returns the first free additional helipad - """ - for h in self.helipads: - if not h.occupied: - return h - return None - def can_recruit_ground_units(self, game: Game) -> bool: """Returns True if this control point is capable of recruiting ground units.""" if not self.can_deploy_ground_units: diff --git a/gen/aircraft.py b/gen/aircraft.py index 6b112fd7..bccc8097 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -68,7 +68,6 @@ from game import db from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum from game.dcs.aircrafttype import AircraftType from game.factions.faction import Faction -from game.helipad import Helipad from game.settings import Settings from game.squadrons import Pilot from game.theater.controlpoint import ( @@ -229,6 +228,7 @@ class AircraftConflictGenerator: laser_code_registry: LaserCodeRegistry, unit_map: UnitMap, air_support: AirSupport, + helipads: dict[ControlPoint, list[StaticGroup]], ) -> None: self.m = mission self.game = game @@ -239,6 +239,7 @@ class AircraftConflictGenerator: self.unit_map = unit_map self.flights: List[FlightData] = [] self.air_support = air_support + self.helipads = helipads @cached_property def use_client(self) -> bool: @@ -550,40 +551,37 @@ class AircraftConflictGenerator: unit_type, side.id, cp.name ) ) - helipad = cp.get_free_helipad() - if helipad is not None and helipad.static_unit is not None: - group = self._generate_at_group( - name=name, - side=side, - unit_type=unit_type, - count=count, - start_type=start_type, - at=helipad.static_unit, - ) - # Note : A bit dirty, need better support in pydcs - group.points[0].action = PointAction.FromGroundArea - group.points[0].type = "TakeOffGround" - group.units[0].heading = helipad.heading - if start_type != "Cold": - group.points[0].action = PointAction.FromGroundAreaHot - group.points[0].type = "TakeOffGroundHot" + try: + helipad = self.helipads[cp].pop() + except IndexError as ex: + raise RuntimeError(f"Not enough helipads available at {cp}") from ex - helipad.occupied = True + group = self._generate_at_group( + name=name, + side=side, + unit_type=unit_type, + count=count, + start_type=start_type, + at=helipad, + ) - for i in range(count - 1): - helipad = cp.get_free_helipad() - if helipad is not None: - helipad.occupied = True - group.units[1 + i].position = Point(helipad.x, helipad.y) - group.units[1 + i].heading = helipad.heading - else: - raise RuntimeError( - f"Control Point {cp.name} does not have enough helipads" - ) - return group - else: - raise RuntimeError(f"Control Point {cp.name} does not have enough helipads") + # Note : A bit dirty, need better support in pydcs + group.points[0].action = PointAction.FromGroundArea + group.points[0].type = "TakeOffGround" + group.units[0].heading = helipad.units[0].heading + if start_type != "Cold": + group.points[0].action = PointAction.FromGroundAreaHot + group.points[0].type = "TakeOffGroundHot" + + for i in range(count - 1): + try: + helipad = self.helipads[cp].pop() + group.units[1 + i].position = Point(helipad.x, helipad.y) + group.units[1 + i].heading = helipad.units[0].heading + except IndexError as ex: + raise RuntimeError(f"Not enough helipads available at {cp}") from ex + return group def _add_radio_waypoint( self, diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index ffbd579c..b379e764 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -9,6 +9,7 @@ from __future__ import annotations import logging import random +from collections import defaultdict from typing import ( Dict, Iterator, @@ -587,6 +588,7 @@ class HelipadGenerator: self.game = game self.radio_registry = radio_registry self.tacan_registry = tacan_registry + self.helipads: list[StaticGroup] = [] def generate(self) -> None: @@ -595,7 +597,7 @@ class HelipadGenerator: country = self.m.country(self.game.coalition_for(self.cp.captured).country_name) for i, helipad in enumerate(self.cp.helipads): name = self.cp.name + "_helipad_" + str(i) - logging.info("Generating helipad : " + name) + logging.info("Generating helipad static : " + name) pad = InvisibleFARP(name=name) pad.position = Point(helipad.x, helipad.y) pad.heading = helipad.heading.degrees @@ -606,8 +608,7 @@ class HelipadGenerator: sg.add_point(sp) neutral_country.add_static_group(sg) - helipad.static_unit = sg - helipad.occupied = False + self.helipads.append(sg) # Generate a FARP Ammo and Fuel stack for each pad self.m.static_group( @@ -652,13 +653,18 @@ class GroundObjectsGenerator: self.unit_map = unit_map self.icls_alloc = iter(range(1, 21)) self.runways: Dict[str, RunwayData] = {} + self.helipads: dict[ControlPoint, list[StaticGroup]] = defaultdict(list) def generate(self) -> None: for cp in self.game.theater.controlpoints: country = self.m.country(self.game.coalition_for(cp.captured).country_name) - HelipadGenerator( + + # Generate helipads + helipad_gen = HelipadGenerator( self.m, cp, self.game, self.radio_registry, self.tacan_registry - ).generate() + ) + helipad_gen.generate() + self.helipads[cp] = helipad_gen.helipads for ground_object in cp.ground_objects: generator: GenericGroundObjectGenerator[Any] From b856a84adce80c0ea857ba4ba3c0369c6f22d6d1 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 12:23:51 +0200 Subject: [PATCH 34/40] Ran black to fix lint issue. --- game/theater/conflicttheater.py | 1 + 1 file changed, 1 insertion(+) diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 30d16ec4..7cf3fcd2 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -32,6 +32,7 @@ from .seasonalconditions import SeasonalConditions if TYPE_CHECKING: from . import TheaterGroundObject + @dataclass class ReferencePoint: world_coordinates: Point From d3b2a751e2daa02c8c5ab0d10a1f0b4446603c29 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 12:58:26 +0200 Subject: [PATCH 35/40] Golan heights campaign migrated to v 9.0 --- resources/campaigns/golan_heights_lite.json | 11 --- resources/campaigns/golan_heights_lite.miz | Bin 32449 -> 32493 bytes resources/campaigns/golan_heights_lite.yaml | 104 ++++++++++++++++++++ 3 files changed, 104 insertions(+), 11 deletions(-) delete mode 100644 resources/campaigns/golan_heights_lite.json create mode 100644 resources/campaigns/golan_heights_lite.yaml diff --git a/resources/campaigns/golan_heights_lite.json b/resources/campaigns/golan_heights_lite.json deleted file mode 100644 index 59d8d92f..00000000 --- a/resources/campaigns/golan_heights_lite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "Syria - Battle for Golan Heights", - "theater": "Syria", - "authors": "Khopa", - "recommended_player_faction": "Israel 2000", - "recommended_enemy_faction": "Syria 2011", - "description": "

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.

", - "miz": "golan_heights_lite.miz", - "performance": 1, - "version": "8.1" -} diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 4c92ede00d803e667b227686f75dd37d7ca1684f..94b3caa986836cf7158b2b5dca52e0b297909013 100644 GIT binary patch delta 24642 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 VP$oMB2qJ-!^8+Z+-2I>K{|B2YdQt!Y delta 24551 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 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 and helicopter friendly.

+miz: golan_heights_lite.miz +performance: 1 +version: "9.0" +squadrons: + # Ramat-David + 30: + - primary: AEW&C + aircraft: + - E-3A + - primary: Refueling + aircraft: + - KC-135 Stratotanker + - primary: Transport + aircraft: + - C-130 + - primary: BARCAP + secondary: any + aircraft: + - F-15C Eagle + - primary: BARCAP + secondary: any + aircraft: + - F-4E Phantom II + - primary: Strike + secondary: air-to-ground + aircraft: + - F-15E Strike Eagle + - primary: SEAD + secondary: any + aircraft: + - F-16CM Fighting Falcon (Block 50) + # Golan South + Golan South: + - primary: CAS + secondary: air-to-ground + aircraft: + - AH-1W SuperCobra + - primary: CAS + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow + - primary: Transport + aircraft: + - UH-1H Iroquois + # Golan North + Golan North: + - primary: CAS + secondary: air-to-ground + aircraft: + - Mi-24P Hind-F + - primary: CAS + aircraft: + - SA 342M Gazelle + - primary: Transport + secondary: air-to-ground + aircraft: + - Mi-8MTV2 Hip + # Marj Ruhayyil + 23: + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + - primary: BARCAP + secondary: any + aircraft: + - MiG-23MLD Flogger-K + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-17M4 Fitter-K + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-17M4 Fitter-K + # Damascus + 7: + - primary: BARCAP + secondary: any + aircraft: + - MiG-29S Fulcrum-C + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + - primary: BARCAP + secondary: any + aircraft: + - MiG-25PD Foxbat-E + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-24M Fencer-D + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-17M4 Fitter-K From fe118d81dbc985d8e7506cd31115db04b9c2ef4c Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 13:04:58 +0200 Subject: [PATCH 36/40] Fixed error introduced during last merge. (Missing import) --- game/operation/operation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/game/operation/operation.py b/game/operation/operation.py index 939192f0..08d25029 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -39,6 +39,7 @@ from gen.triggergen import TRIGGER_RADIUS_MEDIUM, TriggersGenerator from gen.visualgen import VisualGenerator from .. import db from ..theater import Airfield, FrontLine +from ..theater.bullseye import Bullseye from ..unitmap import UnitMap if TYPE_CHECKING: From 2e3b43b28bc97f93b081066a985c344eadc073eb Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 13:27:41 +0200 Subject: [PATCH 37/40] Allow both FARP SINGLE_HELIPAD, and Invisible FARP in campaigns files. --- game/campaignloader/mizcampaignloader.py | 4 ++-- resources/campaigns/golan_heights_lite.miz | Bin 32493 -> 32498 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/game/campaignloader/mizcampaignloader.py b/game/campaignloader/mizcampaignloader.py index d217250f..e7af5c91 100644 --- a/game/campaignloader/mizcampaignloader.py +++ b/game/campaignloader/mizcampaignloader.py @@ -45,7 +45,7 @@ class MizCampaignLoader: SHIPPING_LANE_UNIT_TYPE = HandyWind.id FOB_UNIT_TYPE = Unarmed.SKP_11.id - FARP_HELIPAD = "SINGLE_HELIPAD" + FARP_HELIPADS_TYPE = ["Invisible FARP", "SINGLE_HELIPAD"] OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.id SHIP_UNIT_TYPE = USS_Arleigh_Burke_IIa.id @@ -213,7 +213,7 @@ class MizCampaignLoader: @property def helipads(self) -> Iterator[StaticGroup]: for group in self.blue.static_group: - if group.units[0].type == self.FARP_HELIPAD: + if group.units[0].type in self.FARP_HELIPADS_TYPE: yield group @property diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 94b3caa986836cf7158b2b5dca52e0b297909013..16d3098e1a42b26894623cfc1185f43512382241 100644 GIT binary patch delta 21232 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 K4InR3Q2Ynvna;!j From e1e1e471a1fef9a0e606d9d3299e62981d396c3f Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 19:37:21 +0200 Subject: [PATCH 38/40] Added comment on total_aircraft_parking --- game/theater/controlpoint.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index a7c71a52..de0c02fe 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -836,6 +836,11 @@ class Airfield(ControlPoint): @property def total_aircraft_parking(self) -> int: + """ + Return total aircraft parking slots available + Note : additional helipads shouldn't contribute to this score as it could allow airfield + to buy more planes than what they are able to host + """ return len(self.airport.parking_slots) @property From 5445c41f81ec35dac65c41a996471890dee7f737 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 19:45:43 +0200 Subject: [PATCH 39/40] Fixed : Missing icons for E-2C Hawkeye --- resources/ui/units/aircrafts/icons/E-2C_24.jpg | Bin 0 -> 1219 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/ui/units/aircrafts/icons/E-2C_24.jpg diff --git a/resources/ui/units/aircrafts/icons/E-2C_24.jpg b/resources/ui/units/aircrafts/icons/E-2C_24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cf5dd6574b9fa2fdcf8187529939f96ea21efe9 GIT binary patch literal 1219 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!<}8*yUtyUp1Db>v)qtbU9_Xdbus^5l~cwI zKJJsF?x|l9{9{?web}m%{nep8hr(Q3g)O&s`@U7lp|hT+*}`QrgUmnL{eCZ9Y!Gt%O`Os>h_HJv5FX7-!+uK0KE z+q%j>rL0@e7{zSy7MbL6U;EvG8)kj;c0RwiZT>MUFOB4aRu6XNd-Jy@edE~pckWy7 zzw_S)9bOxCZuX;+(yw7>J^wBjU$FeFQKjOY$LpSWpDt?(Dl;=~Za$jMYjpf{Nogi? z@-&;CszBFL3)go&S7wFzthmM6soS1<@-g#*717QfCk(yL{`>r>ODk5wu2pMutVdg0 zdGZ+s4F(y;-TNwD)xH#Vo?vV_)9>Sn#1sD+m|aEf4zX5e3fQ;LF>`LS+Y|EfrSJmD ziu0G(iUhtW0R_45`v3p{ literal 0 HcmV?d00001 From a7c3a0f7fd560f58486f6f5c392a86b4894478a0 Mon Sep 17 00:00:00 2001 From: Khopa Date: Mon, 16 Aug 2021 19:47:00 +0200 Subject: [PATCH 40/40] Added squadrons for Syria & Israel --- resources/squadrons/AH-1X/IAF 160th Sqn.yaml | 11 +++++++++++ resources/squadrons/AH-64D/IAF 113th Sqn.yaml | 10 ++++++++++ resources/squadrons/F-4E/IAF 201th Sqn.yaml | 13 +++++++++++++ resources/squadrons/Mi-24/SAAF 765th Sqn.yaml | 11 +++++++++++ resources/squadrons/Mi-24/SAAF 766th Sqn.yaml | 11 +++++++++++ resources/squadrons/Mi-8/SAAF 253th Sqn.yaml | 11 +++++++++++ resources/squadrons/Mi-8/SAAF 255th Sqn.yaml | 11 +++++++++++ resources/squadrons/Mig-21/SAAF 679th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-21/SAAF 680th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-21/SAAF 825th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-21/SAAF 8th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-23/SAAF 678th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-25/SAAF 1st Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-29/SAAF 697th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Mig-29/SAAF 699th Sqn.yaml | 14 ++++++++++++++ resources/squadrons/Su-17/SAAF 677th Sqn.yaml | 15 +++++++++++++++ resources/squadrons/Su-17/SAAF 685th Sqn.yaml | 15 +++++++++++++++ resources/squadrons/Su-17/SAAF 827th Sqn.yaml | 15 +++++++++++++++ resources/squadrons/Su-24/SAAF 819th Sqn.yaml | 15 +++++++++++++++ resources/squadrons/sa342/SAAF 976th Sqn.yaml | 10 ++++++++++ resources/squadrons/sa342/SAAF 977th Sqn.yaml | 10 ++++++++++ resources/squadrons/sa342/SAAF 988th Sqn.yaml | 10 ++++++++++ resources/squadrons/sa342/SAAF 989th Sqn.yaml | 10 ++++++++++ 23 files changed, 290 insertions(+) create mode 100644 resources/squadrons/AH-1X/IAF 160th Sqn.yaml create mode 100644 resources/squadrons/AH-64D/IAF 113th Sqn.yaml create mode 100644 resources/squadrons/F-4E/IAF 201th Sqn.yaml create mode 100644 resources/squadrons/Mi-24/SAAF 765th Sqn.yaml create mode 100644 resources/squadrons/Mi-24/SAAF 766th Sqn.yaml create mode 100644 resources/squadrons/Mi-8/SAAF 253th Sqn.yaml create mode 100644 resources/squadrons/Mi-8/SAAF 255th Sqn.yaml create mode 100644 resources/squadrons/Mig-21/SAAF 679th Sqn.yaml create mode 100644 resources/squadrons/Mig-21/SAAF 680th Sqn.yaml create mode 100644 resources/squadrons/Mig-21/SAAF 825th Sqn.yaml create mode 100644 resources/squadrons/Mig-21/SAAF 8th Sqn.yaml create mode 100644 resources/squadrons/Mig-23/SAAF 678th Sqn.yaml create mode 100644 resources/squadrons/Mig-25/SAAF 1st Sqn.yaml create mode 100644 resources/squadrons/Mig-29/SAAF 697th Sqn.yaml create mode 100644 resources/squadrons/Mig-29/SAAF 699th Sqn.yaml create mode 100644 resources/squadrons/Su-17/SAAF 677th Sqn.yaml create mode 100644 resources/squadrons/Su-17/SAAF 685th Sqn.yaml create mode 100644 resources/squadrons/Su-17/SAAF 827th Sqn.yaml create mode 100644 resources/squadrons/Su-24/SAAF 819th Sqn.yaml create mode 100644 resources/squadrons/sa342/SAAF 976th Sqn.yaml create mode 100644 resources/squadrons/sa342/SAAF 977th Sqn.yaml create mode 100644 resources/squadrons/sa342/SAAF 988th Sqn.yaml create mode 100644 resources/squadrons/sa342/SAAF 989th Sqn.yaml diff --git a/resources/squadrons/AH-1X/IAF 160th Sqn.yaml b/resources/squadrons/AH-1X/IAF 160th Sqn.yaml new file mode 100644 index 00000000..736902a5 --- /dev/null +++ b/resources/squadrons/AH-1X/IAF 160th Sqn.yaml @@ -0,0 +1,11 @@ +--- +name: 160th Squadron +nickname: Northern Cobra Squadron +country: Israel +role: Attack Helicopter +aircraft: AH-1W SuperCobra +livery: ah-64_d_isr +mission_types: + - CAS + - BAI + diff --git a/resources/squadrons/AH-64D/IAF 113th Sqn.yaml b/resources/squadrons/AH-64D/IAF 113th Sqn.yaml new file mode 100644 index 00000000..28fcbe94 --- /dev/null +++ b/resources/squadrons/AH-64D/IAF 113th Sqn.yaml @@ -0,0 +1,10 @@ +--- +name: 113th Squadron +nickname: The Hornet Squadron +country: Israel +role: Attack Helicopter +aircraft: AH-64D Apache Longbow +livery: standard +mission_types: + - CAS + - BAI diff --git a/resources/squadrons/F-4E/IAF 201th Sqn.yaml b/resources/squadrons/F-4E/IAF 201th Sqn.yaml new file mode 100644 index 00000000..9354b912 --- /dev/null +++ b/resources/squadrons/F-4E/IAF 201th Sqn.yaml @@ -0,0 +1,13 @@ +--- +name: 201th Squadron +nickname: The One +country: Israel +role: Air Superiority Fighter +aircraft: F-4E Phantom II +livery: "af standard" +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mi-24/SAAF 765th Sqn.yaml b/resources/squadrons/Mi-24/SAAF 765th Sqn.yaml new file mode 100644 index 00000000..84e5df0e --- /dev/null +++ b/resources/squadrons/Mi-24/SAAF 765th Sqn.yaml @@ -0,0 +1,11 @@ +--- +name: 765th Squadron +nickname: 765th +country: Syria +role: Attack Helicopter +aircraft: Mi-24P Hind-F +livery: "SyAAF" +mission_types: + - CAS + - BAI + - Transport diff --git a/resources/squadrons/Mi-24/SAAF 766th Sqn.yaml b/resources/squadrons/Mi-24/SAAF 766th Sqn.yaml new file mode 100644 index 00000000..65649243 --- /dev/null +++ b/resources/squadrons/Mi-24/SAAF 766th Sqn.yaml @@ -0,0 +1,11 @@ +--- +name: 766th Squadron +nickname: 766th +country: Syria +role: Attack Helicopter +aircraft: Mi-24V Hind-E +livery: "standard" +mission_types: + - CAS + - BAI + - Transport diff --git a/resources/squadrons/Mi-8/SAAF 253th Sqn.yaml b/resources/squadrons/Mi-8/SAAF 253th Sqn.yaml new file mode 100644 index 00000000..afa2ae50 --- /dev/null +++ b/resources/squadrons/Mi-8/SAAF 253th Sqn.yaml @@ -0,0 +1,11 @@ +--- +name: 253th Squadron +nickname: 253th +country: Syria +role: Transport Helicopter +aircraft: Mi-8MTV2 Hip +livery: "BP_RS01" +mission_types: + - Transport + - CAS + - BAI diff --git a/resources/squadrons/Mi-8/SAAF 255th Sqn.yaml b/resources/squadrons/Mi-8/SAAF 255th Sqn.yaml new file mode 100644 index 00000000..f1fbca2b --- /dev/null +++ b/resources/squadrons/Mi-8/SAAF 255th Sqn.yaml @@ -0,0 +1,11 @@ +--- +name: 255th Squadron +nickname: 255th +country: Syria +role: Transport Helicopter +aircraft: Mi-8MTV2 Hip +livery: "BP_RS01" +mission_types: + - Transport + - CAS + - BAI diff --git a/resources/squadrons/Mig-21/SAAF 679th Sqn.yaml b/resources/squadrons/Mig-21/SAAF 679th Sqn.yaml new file mode 100644 index 00000000..2e519123 --- /dev/null +++ b/resources/squadrons/Mig-21/SAAF 679th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 679th Squadron +nickname: 679th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-21bis Fishbed-N +livery: "Syria (2)" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-21/SAAF 680th Sqn.yaml b/resources/squadrons/Mig-21/SAAF 680th Sqn.yaml new file mode 100644 index 00000000..56b8987b --- /dev/null +++ b/resources/squadrons/Mig-21/SAAF 680th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 680th Squadron +nickname: 680th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-21bis Fishbed-N +livery: "Syria (2)" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-21/SAAF 825th Sqn.yaml b/resources/squadrons/Mig-21/SAAF 825th Sqn.yaml new file mode 100644 index 00000000..794e24c3 --- /dev/null +++ b/resources/squadrons/Mig-21/SAAF 825th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 825th Squadron +nickname: 825th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-21bis Fishbed-N +livery: "Syria (1)" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-21/SAAF 8th Sqn.yaml b/resources/squadrons/Mig-21/SAAF 8th Sqn.yaml new file mode 100644 index 00000000..1d29d2fa --- /dev/null +++ b/resources/squadrons/Mig-21/SAAF 8th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 8th Squadron +nickname: 8th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-21bis Fishbed-N +livery: "Syria (1)" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-23/SAAF 678th Sqn.yaml b/resources/squadrons/Mig-23/SAAF 678th Sqn.yaml new file mode 100644 index 00000000..39fde573 --- /dev/null +++ b/resources/squadrons/Mig-23/SAAF 678th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 678th Squadron +nickname: 678th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-23MLD Flogger-K +livery: "af standard-3 (worn-out)" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-25/SAAF 1st Sqn.yaml b/resources/squadrons/Mig-25/SAAF 1st Sqn.yaml new file mode 100644 index 00000000..0eb4e6e7 --- /dev/null +++ b/resources/squadrons/Mig-25/SAAF 1st Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 1st Squadron +nickname: 1st +country: Syria +role: Air Superiority Fighter +aircraft: MiG-25PD Foxbat-E +livery: "af standard" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-29/SAAF 697th Sqn.yaml b/resources/squadrons/Mig-29/SAAF 697th Sqn.yaml new file mode 100644 index 00000000..e0208144 --- /dev/null +++ b/resources/squadrons/Mig-29/SAAF 697th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 697th Squadron +nickname: 697th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-29S Fulcrum-C +livery: "ERAF" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Mig-29/SAAF 699th Sqn.yaml b/resources/squadrons/Mig-29/SAAF 699th Sqn.yaml new file mode 100644 index 00000000..5229f239 --- /dev/null +++ b/resources/squadrons/Mig-29/SAAF 699th Sqn.yaml @@ -0,0 +1,14 @@ +--- +name: 699th Squadron +nickname: 699th +country: Syria +role: Air Superiority Fighter +aircraft: MiG-29S Fulcrum-C +livery: "ERAF" +mission_types: + - BARCAP + - TARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/Su-17/SAAF 677th Sqn.yaml b/resources/squadrons/Su-17/SAAF 677th Sqn.yaml new file mode 100644 index 00000000..81ee48e7 --- /dev/null +++ b/resources/squadrons/Su-17/SAAF 677th Sqn.yaml @@ -0,0 +1,15 @@ +--- +name: 677th Squadron +nickname: 677th +country: Syria +role: Bomber +aircraft: Su-17M4 Fitter-K +livery: "af standard (worn-out)" +mission_types: + - BAI + - CAS + - DEAD + - SEAD + - OCA/Aircraft + - OCA/Runway + - Strike diff --git a/resources/squadrons/Su-17/SAAF 685th Sqn.yaml b/resources/squadrons/Su-17/SAAF 685th Sqn.yaml new file mode 100644 index 00000000..e26abc6e --- /dev/null +++ b/resources/squadrons/Su-17/SAAF 685th Sqn.yaml @@ -0,0 +1,15 @@ +--- +name: 685th Squadron +nickname: 685th +country: Syria +role: Bomber +aircraft: Su-17M4 Fitter-K +livery: "af standard (worn-out)" +mission_types: + - BAI + - CAS + - DEAD + - SEAD + - OCA/Aircraft + - OCA/Runway + - Strike diff --git a/resources/squadrons/Su-17/SAAF 827th Sqn.yaml b/resources/squadrons/Su-17/SAAF 827th Sqn.yaml new file mode 100644 index 00000000..413b813f --- /dev/null +++ b/resources/squadrons/Su-17/SAAF 827th Sqn.yaml @@ -0,0 +1,15 @@ +--- +name: 827th Squadron +nickname: 827th +country: Syria +role: Bomber +aircraft: Su-17M4 Fitter-K +livery: "af standard (worn-out)" +mission_types: + - BAI + - CAS + - DEAD + - SEAD + - OCA/Aircraft + - OCA/Runway + - Strike diff --git a/resources/squadrons/Su-24/SAAF 819th Sqn.yaml b/resources/squadrons/Su-24/SAAF 819th Sqn.yaml new file mode 100644 index 00000000..3e539d1d --- /dev/null +++ b/resources/squadrons/Su-24/SAAF 819th Sqn.yaml @@ -0,0 +1,15 @@ +--- +name: 819th Squadron +nickname: 819th +country: Syria +role: Bomber +aircraft: Su-24M Fencer-D +livery: "Syrian Air Force" +mission_types: + - BAI + - CAS + - DEAD + - SEAD + - OCA/Aircraft + - OCA/Runway + - Strike diff --git a/resources/squadrons/sa342/SAAF 976th Sqn.yaml b/resources/squadrons/sa342/SAAF 976th Sqn.yaml new file mode 100644 index 00000000..310a6c78 --- /dev/null +++ b/resources/squadrons/sa342/SAAF 976th Sqn.yaml @@ -0,0 +1,10 @@ +--- +name: 976th Squadron +nickname: 976th +country: Syria +role: Anti-Tank Helicopter +aircraft: SA 342L Gazelle +livery: "Syria Fictional" +mission_types: + - CAS + - BAI diff --git a/resources/squadrons/sa342/SAAF 977th Sqn.yaml b/resources/squadrons/sa342/SAAF 977th Sqn.yaml new file mode 100644 index 00000000..3089b764 --- /dev/null +++ b/resources/squadrons/sa342/SAAF 977th Sqn.yaml @@ -0,0 +1,10 @@ +--- +name: 977th Squadron +nickname: 977th +country: Syria +role: Anti-Tank Helicopter +aircraft: SA 342L Gazelle +livery: "Syria Fictional" +mission_types: + - CAS + - BAI diff --git a/resources/squadrons/sa342/SAAF 988th Sqn.yaml b/resources/squadrons/sa342/SAAF 988th Sqn.yaml new file mode 100644 index 00000000..9b19d7ee --- /dev/null +++ b/resources/squadrons/sa342/SAAF 988th Sqn.yaml @@ -0,0 +1,10 @@ +--- +name: 988th Squadron +nickname: 988th +country: Syria +role: Anti-Tank Helicopter +aircraft: SA 342M Gazelle +livery: "Syria Fictional" +mission_types: + - CAS + - BAI diff --git a/resources/squadrons/sa342/SAAF 989th Sqn.yaml b/resources/squadrons/sa342/SAAF 989th Sqn.yaml new file mode 100644 index 00000000..08f08958 --- /dev/null +++ b/resources/squadrons/sa342/SAAF 989th Sqn.yaml @@ -0,0 +1,10 @@ +--- +name: 989th Squadron +nickname: 989th +country: Syria +role: Anti-Tank Helicopter +aircraft: SA 342M Gazelle +livery: "Syria Fictional" +mission_types: + - CAS + - BAI