From e8feded4c31354882eead1e5cbb14e423befb643 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sat, 7 Nov 2020 15:00:05 -0800 Subject: [PATCH] Add EWR generation. Fixes https://github.com/Khopa/dcs_liberation/issues/66 --- game/factions/faction.py | 4 + gen/sam/ewrs.py | 98 +++++++++++++++++++ gen/sam/sam_group_generator.py | 55 ++++++++++- qt_ui/widgets/map/QLiberationMap.py | 4 +- resources/factions/australia_2005.json | 3 + resources/factions/bluefor_coldwar.json | 3 + resources/factions/bluefor_coldwar_a4.json | 3 + .../factions/bluefor_coldwar_a4_mb339.json | 3 + resources/factions/bluefor_modern.json | 3 + resources/factions/canada_2005.json | 3 + resources/factions/china_2010.json | 3 + resources/factions/france_1995.json | 3 + resources/factions/france_2005_modded.json | 3 + resources/factions/germany_1990.json | 3 + resources/factions/india_2010.json | 3 + resources/factions/iran_2015.json | 3 + resources/factions/israel_1973.json | 3 + resources/factions/israel_1982.json | 3 + resources/factions/israel_2000.json | 3 + resources/factions/italy_1990.json | 3 + resources/factions/italy_1990_mb339.json | 3 + resources/factions/japan_2005.json | 3 + resources/factions/libya_2011.json | 3 + resources/factions/netherlands_1990.json | 3 + resources/factions/north_korea_2000.json | 3 + resources/factions/pakistan_2015.json | 3 + resources/factions/russia_1965.json | 3 + resources/factions/russia_1975.json | 3 + resources/factions/russia_1990.json | 3 + resources/factions/russia_2010.json | 3 + resources/factions/russia_2020.json | 3 + resources/factions/spain_1990.json | 3 + resources/factions/sweden_1990.json | 3 + resources/factions/syria_1973.json | 3 + resources/factions/syria_1982.json | 3 + resources/factions/syria_2011.json | 3 + resources/factions/turkey_2005.json | 3 + resources/factions/uae_2005.json | 3 + resources/factions/uk_1990.json | 3 + resources/factions/ukraine_2010.json | 3 + resources/factions/us_aggressors.json | 3 + resources/factions/usa_1965.json | 3 + resources/factions/usa_1975.json | 3 + resources/factions/usa_1990.json | 3 + resources/factions/usa_2005.json | 3 + resources/plugins/skynetiads/plugin.json | 10 -- .../plugins/skynetiads/skynetiads-config.lua | 31 ++---- theater/controlpoint.py | 4 +- theater/start_generator.py | 67 +++++++++---- theater/theatergroundobject.py | 22 +++++ 50 files changed, 364 insertions(+), 54 deletions(-) create mode 100644 gen/sam/ewrs.py diff --git a/game/factions/faction.py b/game/factions/faction.py index b6c9e058..5a056bf1 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -57,6 +57,9 @@ class Faction: # Possible SAMS site generators for this faction sams: List[str] = field(default_factory=list) + # Possible EWR generators for this faction. + ewrs: List[str] = field(default_factory=list) + # Possible Missile site generators for this faction missiles: List[str] = field(default_factory=list) @@ -132,6 +135,7 @@ class Faction: json.get("logistics_units", [])) faction.sams = json.get("sams", []) + faction.ewrs = json.get("ewrs", []) faction.shorads = json.get("shorads", []) faction.missiles = json.get("missiles", []) faction.requirements = json.get("requirements", {}) diff --git a/gen/sam/ewrs.py b/gen/sam/ewrs.py new file mode 100644 index 00000000..2c60af22 --- /dev/null +++ b/gen/sam/ewrs.py @@ -0,0 +1,98 @@ +from dcs.vehicles import AirDefence +from dcs.unittype import VehicleType + +from gen.sam.group_generator import GroupGenerator + + +class EwrGenerator(GroupGenerator): + @property + def unit_type(self) -> VehicleType: + raise NotImplementedError + + def generate(self) -> None: + self.add_unit(self.unit_type, "EWR", self.position.x, self.position.y, + self.heading) + + +class BoxSpringGenerator(EwrGenerator): + """1L13 "Box Spring" EWR.""" + + unit_type = AirDefence.EWR_1L13 + + +class TallRackGenerator(EwrGenerator): + """55G6 "Tall Rack" EWR.""" + + unit_type = AirDefence.EWR_55G6 + + +class DogEarGenerator(EwrGenerator): + """9S80M1 "Dog Ear" EWR. + + This is the SA-8 search radar, but used as an early warning radar. + """ + + unit_type = AirDefence.CP_9S80M1_Sborka + + +class RolandEwrGenerator(EwrGenerator): + """Roland EWR. + + This is the Roland search radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_Roland_EWR + + +class FlatFaceGenerator(EwrGenerator): + """P-19 "Flat Face" EWR. + + This is the SA-3 search radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_SR_P_19 + + +class PatriotEwrGenerator(EwrGenerator): + """Patriot EWR. + + This is the Patriot search/track radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_Patriot_STR_AN_MPQ_53 + + +class BigBirdGenerator(EwrGenerator): + """64H6E "Big Bird" EWR. + + This is the SA-10 track radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_SA_10_S_300PS_SR_64H6E + + +class SnowDriftGenerator(EwrGenerator): + """9S18M1 "Snow Drift" EWR. + + This is the SA-11 search radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_SA_11_Buk_SR_9S18M1 + + +class StraightFlushGenerator(EwrGenerator): + """1S91 "Straight Flush" EWR. + + This is the SA-6 search/track radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_SA_6_Kub_STR_9S91 + + +class HawkEwrGenerator(EwrGenerator): + """Hawk EWR. + + This is the Hawk search radar, but used as an early warning radar. + """ + + unit_type = AirDefence.SAM_Hawk_SR_AN_MPQ_50 diff --git a/gen/sam/sam_group_generator.py b/gen/sam/sam_group_generator.py index 2a991f04..1ff77cde 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -11,6 +11,20 @@ from gen.sam.aaa_flak18 import Flak18Generator from gen.sam.aaa_ww2_ally_flak import AllyWW2FlakGenerator from gen.sam.aaa_zu23_insurgent import ZU23InsurgentGenerator from gen.sam.cold_war_flak import EarlyColdWarFlakGenerator, ColdWarFlakGenerator + + +from gen.sam.ewrs import ( + BigBirdGenerator, + BoxSpringGenerator, + DogEarGenerator, + FlatFaceGenerator, + HawkEwrGenerator, + PatriotEwrGenerator, + RolandEwrGenerator, + SnowDriftGenerator, + StraightFlushGenerator, + TallRackGenerator, +) from gen.sam.group_generator import GroupGenerator from gen.sam.sam_avenger import AvengerGenerator from gen.sam.sam_chaparral import ChaparralGenerator @@ -109,13 +123,34 @@ SAM_PRICES = { AirDefence.HQ_7_Self_Propelled_LN: 35 } +EWR_MAP = { + "BoxSpringGenerator": BoxSpringGenerator, + "TallRackGenerator": TallRackGenerator, + "DogEarGenerator": DogEarGenerator, + "RolandEwrGenerator": RolandEwrGenerator, + "FlatFaceGenerator": FlatFaceGenerator, + "PatriotEwrGenerator": PatriotEwrGenerator, + "BigBirdGenerator": BigBirdGenerator, + "SnowDriftGenerator": SnowDriftGenerator, + "StraightFlushGenerator": StraightFlushGenerator, + "HawkEwrGenerator": HawkEwrGenerator, +} + def get_faction_possible_sams_generator(faction: str) -> List[Type[GroupGenerator]]: """ Return the list of possible SAM generator for the given faction :param faction: Faction name to search units for """ - return [SAM_MAP[s] for s in db.FACTIONS[faction].sams if s in SAM_MAP.keys()] + return [SAM_MAP[s] for s in db.FACTIONS[faction].sams if s in SAM_MAP] + + +def get_faction_possible_ewrs_generator(faction: str) -> List[Type[GroupGenerator]]: + """ + Return the list of possible SAM generator for the given faction + :param faction: Faction name to search units for + """ + return [EWR_MAP[s] for s in db.FACTIONS[faction].ewrs if s in EWR_MAP] def generate_anti_air_group(game: Game, ground_object: TheaterGroundObject, @@ -136,6 +171,24 @@ def generate_anti_air_group(game: Game, ground_object: TheaterGroundObject, return None +def generate_ewr_group(game: Game, ground_object: TheaterGroundObject, + faction: str) -> Optional[VehicleGroup]: + """Generates an early warning radar group. + + :param game: The Game. + :param ground_object: The ground object which will own the EWR group. + :param faction: Owner faction. + :return: The generated group, or None if one could not be generated. + """ + generators = get_faction_possible_ewrs_generator(faction) + if len(generators) > 0: + generator_class = random.choice(generators) + generator = generator_class(game, ground_object) + generator.generate() + return generator.get_generated_group() + return None + + def generate_shorad_group(game: Game, ground_object: SamGroundObject, faction_name: str) -> Optional[VehicleGroup]: faction = db.FACTIONS[faction_name] diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 0a404555..676eebc9 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -41,6 +41,7 @@ from qt_ui.widgets.map.QMapControlPoint import QMapControlPoint from qt_ui.widgets.map.QMapGroundObject import QMapGroundObject from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from theater import ControlPoint, FrontLine +from theater.theatergroundobject import EwrGroundObject class QLiberationMap(QGraphicsView): @@ -215,7 +216,8 @@ class QLiberationMap(QGraphicsView): buildings = self.game.theater.find_ground_objects_by_obj_name(ground_object.obj_name) scene.addItem(QMapGroundObject(self, go_pos[0], go_pos[1], 14, 12, cp, ground_object, self.game, buildings)) - is_aa = ground_object.category == "aa" + is_ewr = isinstance(ground_object, EwrGroundObject) + is_aa = ground_object.category == "aa" or is_ewr should_display = ((DisplayOptions.sam_ranges and cp.captured) or (DisplayOptions.enemy_sam_ranges and not cp.captured)) diff --git a/resources/factions/australia_2005.json b/resources/factions/australia_2005.json index 5c7b859c..4c8a439e 100644 --- a/resources/factions/australia_2005.json +++ b/resources/factions/australia_2005.json @@ -38,6 +38,9 @@ "HawkGenerator", "RapierGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/bluefor_coldwar.json b/resources/factions/bluefor_coldwar.json index 511df4ff..0b962bda 100644 --- a/resources/factions/bluefor_coldwar.json +++ b/resources/factions/bluefor_coldwar.json @@ -44,6 +44,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/bluefor_coldwar_a4.json b/resources/factions/bluefor_coldwar_a4.json index 89a674c6..ecb56384 100644 --- a/resources/factions/bluefor_coldwar_a4.json +++ b/resources/factions/bluefor_coldwar_a4.json @@ -45,6 +45,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/bluefor_coldwar_a4_mb339.json b/resources/factions/bluefor_coldwar_a4_mb339.json index f525c4c3..5d7da489 100644 --- a/resources/factions/bluefor_coldwar_a4_mb339.json +++ b/resources/factions/bluefor_coldwar_a4_mb339.json @@ -46,6 +46,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/bluefor_modern.json b/resources/factions/bluefor_modern.json index 775993df..d3a2917f 100644 --- a/resources/factions/bluefor_modern.json +++ b/resources/factions/bluefor_modern.json @@ -63,6 +63,9 @@ "HawkGenerator", "PatriotGenerator" ], + "ewrs": [ + "PatriotEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/canada_2005.json b/resources/factions/canada_2005.json index 9866f107..19932b80 100644 --- a/resources/factions/canada_2005.json +++ b/resources/factions/canada_2005.json @@ -38,6 +38,9 @@ "HawkGenerator", "AvengerGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/china_2010.json b/resources/factions/china_2010.json index 1b3c7a34..1347ced7 100644 --- a/resources/factions/china_2010.json +++ b/resources/factions/china_2010.json @@ -48,6 +48,9 @@ "SA10Generator", "SA6Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index 3af4d91c..df15b1c2 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -45,6 +45,9 @@ "RolandGenerator", "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/france_2005_modded.json b/resources/factions/france_2005_modded.json index 0ad6d3e1..0a54f8a3 100644 --- a/resources/factions/france_2005_modded.json +++ b/resources/factions/france_2005_modded.json @@ -54,6 +54,9 @@ "RolandGenerator", "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index 9376387c..86cb119a 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -40,6 +40,9 @@ "HawkGenerator", "RolandGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/india_2010.json b/resources/factions/india_2010.json index 9572c669..cce0892b 100644 --- a/resources/factions/india_2010.json +++ b/resources/factions/india_2010.json @@ -46,6 +46,9 @@ "SA6Generator", "SA3Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/iran_2015.json b/resources/factions/iran_2015.json index 512bd40e..5c5def77 100644 --- a/resources/factions/iran_2015.json +++ b/resources/factions/iran_2015.json @@ -53,6 +53,9 @@ "HawkGenerator", "HQ7Generator" ], + "ewrs": [ + "SnowDriftGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/israel_1973.json b/resources/factions/israel_1973.json index 7b475f35..c4447cb3 100644 --- a/resources/factions/israel_1973.json +++ b/resources/factions/israel_1973.json @@ -37,6 +37,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/israel_1982.json b/resources/factions/israel_1982.json index fe80cf27..41523373 100644 --- a/resources/factions/israel_1982.json +++ b/resources/factions/israel_1982.json @@ -40,6 +40,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 97aeed68..7a5a3755 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -43,6 +43,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/italy_1990.json b/resources/factions/italy_1990.json index a1e863da..bbe5462d 100644 --- a/resources/factions/italy_1990.json +++ b/resources/factions/italy_1990.json @@ -37,6 +37,9 @@ "HawkGenerator", "AvengerGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/italy_1990_mb339.json b/resources/factions/italy_1990_mb339.json index fb8d6eff..7b58287d 100644 --- a/resources/factions/italy_1990_mb339.json +++ b/resources/factions/italy_1990_mb339.json @@ -38,6 +38,9 @@ "HawkGenerator", "AvengerGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index a9a3e6ff..13204c7a 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -43,6 +43,9 @@ "HawkGenerator", "PatriotGenerator" ], + "ewrs": [ + "PatriotEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/libya_2011.json b/resources/factions/libya_2011.json index 0eb74587..b01d8483 100644 --- a/resources/factions/libya_2011.json +++ b/resources/factions/libya_2011.json @@ -43,6 +43,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/netherlands_1990.json b/resources/factions/netherlands_1990.json index 3b915643..db8efeb7 100644 --- a/resources/factions/netherlands_1990.json +++ b/resources/factions/netherlands_1990.json @@ -34,6 +34,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/north_korea_2000.json b/resources/factions/north_korea_2000.json index 3588d3d8..5ad2ea76 100644 --- a/resources/factions/north_korea_2000.json +++ b/resources/factions/north_korea_2000.json @@ -51,6 +51,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/pakistan_2015.json b/resources/factions/pakistan_2015.json index 7020e6be..df4f0dda 100644 --- a/resources/factions/pakistan_2015.json +++ b/resources/factions/pakistan_2015.json @@ -47,6 +47,9 @@ "SA10Generator", "SA2Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "aircraft_carrier": [ ], "carrier_names": [ diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index b747b204..494d4081 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -44,6 +44,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index 7ffb430b..a03288f6 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -49,6 +49,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "SnowDriftGenerator" + ], "aircraft_carrier": [ ], "helicopter_carrier": [ diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index 765546f1..adf76cda 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -52,6 +52,9 @@ "SA6Generator", "SA11Generator" ], + "ewrs": [ + "SnowDriftGenerator" + ], "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index c2204444..c94de0b8 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -58,6 +58,9 @@ "SA6Generator", "SA19Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 38d43686..eb262585 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -55,6 +55,9 @@ "SA10Generator", "SA19Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/spain_1990.json b/resources/factions/spain_1990.json index 7555c396..045f4353 100644 --- a/resources/factions/spain_1990.json +++ b/resources/factions/spain_1990.json @@ -37,6 +37,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/sweden_1990.json b/resources/factions/sweden_1990.json index 3d57c5fe..52082362 100644 --- a/resources/factions/sweden_1990.json +++ b/resources/factions/sweden_1990.json @@ -34,6 +34,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], diff --git a/resources/factions/syria_1973.json b/resources/factions/syria_1973.json index 993e171d..6370b614 100644 --- a/resources/factions/syria_1973.json +++ b/resources/factions/syria_1973.json @@ -42,6 +42,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "missiles": [ "ScudGenerator" ], diff --git a/resources/factions/syria_1982.json b/resources/factions/syria_1982.json index 750e3324..f9f4bffb 100644 --- a/resources/factions/syria_1982.json +++ b/resources/factions/syria_1982.json @@ -45,6 +45,9 @@ "SA3Generator", "SA6Generator" ], + "ewrs": [ + "StraightFlushGenerator" + ], "missiles": [ "ScudGenerator" ], diff --git a/resources/factions/syria_2011.json b/resources/factions/syria_2011.json index 31f2e2e8..3c0ba740 100644 --- a/resources/factions/syria_2011.json +++ b/resources/factions/syria_2011.json @@ -63,6 +63,9 @@ "SA10Generator", "SA11Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "missiles": [ "ScudGenerator" ], diff --git a/resources/factions/turkey_2005.json b/resources/factions/turkey_2005.json index 54762875..8e207791 100644 --- a/resources/factions/turkey_2005.json +++ b/resources/factions/turkey_2005.json @@ -41,6 +41,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], diff --git a/resources/factions/uae_2005.json b/resources/factions/uae_2005.json index 125bbce7..05ed73d3 100644 --- a/resources/factions/uae_2005.json +++ b/resources/factions/uae_2005.json @@ -36,6 +36,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "requirements": {}, "carrier_names": [ ], diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index 9b274eeb..32f3c50c 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -41,6 +41,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/ukraine_2010.json b/resources/factions/ukraine_2010.json index 872d3a7e..7e7e9e4d 100644 --- a/resources/factions/ukraine_2010.json +++ b/resources/factions/ukraine_2010.json @@ -48,6 +48,9 @@ "SA10Generator", "SA11Generator" ], + "ewrs": [ + "BigBirdGenerator" + ], "requirements": {}, "carrier_names": [ "Admiral Kuznetov", diff --git a/resources/factions/us_aggressors.json b/resources/factions/us_aggressors.json index 340d6b19..8181671d 100644 --- a/resources/factions/us_aggressors.json +++ b/resources/factions/us_aggressors.json @@ -53,6 +53,9 @@ "HawkGenerator", "PatriotGenerator" ], + "ewrs": [ + "PatriotEwrGenerator" + ], "requirements": {}, "navy_generators": [ "OliverHazardPerryGroupGenerator" diff --git a/resources/factions/usa_1965.json b/resources/factions/usa_1965.json index b2b5b1dd..c19cb8dd 100644 --- a/resources/factions/usa_1965.json +++ b/resources/factions/usa_1965.json @@ -32,6 +32,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "requirements": {}, "doctrine": "coldwar" } \ No newline at end of file diff --git a/resources/factions/usa_1975.json b/resources/factions/usa_1975.json index a30330a6..e767a7d1 100644 --- a/resources/factions/usa_1975.json +++ b/resources/factions/usa_1975.json @@ -33,6 +33,9 @@ "HawkGenerator", "ChaparralGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index c2ff5f98..7e4119be 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -50,6 +50,9 @@ "sams": [ "HawkGenerator" ], + "ewrs": [ + "HawkEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 8f8f4a60..1e6e78a4 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -52,6 +52,9 @@ "HawkGenerator", "PatriotGenerator" ], + "ewrs": [ + "PatriotEwrGenerator" + ], "aircraft_carrier": [ "CVN_74_John_C__Stennis" ], diff --git a/resources/plugins/skynetiads/plugin.json b/resources/plugins/skynetiads/plugin.json index 7fe1e176..c56298d9 100644 --- a/resources/plugins/skynetiads/plugin.json +++ b/resources/plugins/skynetiads/plugin.json @@ -13,16 +13,6 @@ "mnemonic": "createBlueIADS", "defaultValue": true }, - { - "nameInUI": "Long-range SAM act as EWR for RED coalition", - "mnemonic": "actAsEwrRED", - "defaultValue": true - }, - { - "nameInUI": "Long-range SAM act as EWR for BLUE coalition", - "mnemonic": "actAsEwrBLUE", - "defaultValue": true - }, { "nameInUI": "Include RED IADS in radio menu", "mnemonic": "includeRedInRadio", diff --git a/resources/plugins/skynetiads/skynetiads-config.lua b/resources/plugins/skynetiads/skynetiads-config.lua index df12d512..8a384c96 100644 --- a/resources/plugins/skynetiads/skynetiads-config.lua +++ b/resources/plugins/skynetiads/skynetiads-config.lua @@ -14,8 +14,6 @@ if dcsLiberation and SkynetIADS then -- specific options local createRedIADS = false local createBlueIADS = false - local actAsEwrRED = false - local actAsEwrBLUE = false local includeRedInRadio = false local includeBlueInRadio = false local debugRED = false @@ -26,8 +24,6 @@ if dcsLiberation and SkynetIADS then if dcsLiberation.plugins.skynetiads then createRedIADS = dcsLiberation.plugins.skynetiads.createRedIADS createBlueIADS = dcsLiberation.plugins.skynetiads.createBlueIADS - actAsEwrRED = dcsLiberation.plugins.skynetiads.actAsEwrRED - actAsEwrBLUE = dcsLiberation.plugins.skynetiads.actAsEwrBLUE includeRedInRadio = dcsLiberation.plugins.skynetiads.includeRedInRadio includeBlueInRadio = dcsLiberation.plugins.skynetiads.includeBlueInRadio debugRED = dcsLiberation.plugins.skynetiads.debugRED @@ -37,8 +33,6 @@ if dcsLiberation and SkynetIADS then env.info(string.format("DCSLiberation|Skynet-IADS plugin - createRedIADS=%s",tostring(createRedIADS))) env.info(string.format("DCSLiberation|Skynet-IADS plugin - createBlueIADS=%s",tostring(createBlueIADS))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - actAsEwrRED=%s",tostring(actAsEwrRED))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - actAsEwrBLUE=%s",tostring(actAsEwrBLUE))) env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeRedInRadio=%s",tostring(includeRedInRadio))) env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeBlueInRadio=%s",tostring(includeBlueInRadio))) env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugRED=%s",tostring(debugRED))) @@ -46,7 +40,7 @@ if dcsLiberation and SkynetIADS then -- actual configuration code - local function initializeIADS(iads, coalition, actAsEwr, inRadio, debug) + local function initializeIADS(iads, coalition, inRadio, debug) local coalitionPrefix = "BLUE" if coalition == 1 then @@ -60,12 +54,12 @@ if dcsLiberation and SkynetIADS then iadsDebug.samWentDark = true iadsDebug.contacts = true iadsDebug.radarWentLive = true - iadsDebug.noWorkingCommmandCenter = false - iadsDebug.ewRadarNoConnection = false - iadsDebug.samNoConnection = false + iadsDebug.noWorkingCommmandCenter = true + iadsDebug.ewRadarNoConnection = true + iadsDebug.samNoConnection = true iadsDebug.jammerProbability = true - iadsDebug.addedEWRadar = false - iadsDebug.hasNoPower = false + iadsDebug.addedEWRadar = true + iadsDebug.hasNoPower = true iadsDebug.harmDefence = true iadsDebug.samSiteStatusEnvOutput = true iadsDebug.earlyWarningRadarStatusEnvOutput = true @@ -77,13 +71,6 @@ if dcsLiberation and SkynetIADS then --add SAM groups to the IADS: iads:addSAMSitesByPrefix(coalitionPrefix .. "|SAM|") - -- specific configurations, for each SAM type - if actAsEwr then - iads:getSAMSitesByNatoName('SA-10'):setActAsEW(true) - iads:getSAMSitesByNatoName('SA-6'):setActAsEW(true) - iads:getSAMSitesByNatoName('Patriot'):setActAsEW(true) - end - -- add the AWACS if dcsLiberation.AWACs then for _, data in pairs(dcsLiberation.AWACs) do @@ -102,6 +89,8 @@ if dcsLiberation and SkynetIADS then end end + -- TODO: Add ships. + if inRadio then --activate the radio menu to toggle IADS Status output env.info("DCSLiberation|Skynet-IADS plugin - adding in radio menu") @@ -118,13 +107,13 @@ if dcsLiberation and SkynetIADS then if createRedIADS then env.info("DCSLiberation|Skynet-IADS plugin - creating red IADS") redIADS = SkynetIADS:create("IADS") - initializeIADS(redIADS, 1, actAsEwrRED, includeRedInRadio, debugRED) -- RED + initializeIADS(redIADS, 1, includeRedInRadio, debugRED) -- RED end if createBlueIADS then env.info("DCSLiberation|Skynet-IADS plugin - creating blue IADS") blueIADS = SkynetIADS:create("IADS") - initializeIADS(blueIADS, 2, actAsEwrBLUE, includeBlueInRadio, debugBLUE) -- BLUE + initializeIADS(blueIADS, 2, includeBlueInRadio, debugBLUE) -- BLUE end end \ No newline at end of file diff --git a/theater/controlpoint.py b/theater/controlpoint.py index d748d797..6fb0a855 100644 --- a/theater/controlpoint.py +++ b/theater/controlpoint.py @@ -221,10 +221,8 @@ class ControlPoint(MissionTarget): def capture(self, game: Game, for_player: bool) -> None: if for_player: self.captured = True - faction_name = game.player_name else: self.captured = False - faction_name = game.enemy_name self.base.set_strength_to_minimum() @@ -234,4 +232,4 @@ class ControlPoint(MissionTarget): # Handle cyclic dependency. from .start_generator import BaseDefenseGenerator self.base_defenses = [] - BaseDefenseGenerator(game, self, faction_name).generate() + BaseDefenseGenerator(game, self).generate() diff --git a/theater/start_generator.py b/theater/start_generator.py index 84a28e4d..46a04105 100644 --- a/theater/start_generator.py +++ b/theater/start_generator.py @@ -24,7 +24,7 @@ from gen.fleet.ship_group_generator import ( from gen.missiles.missiles_group_generator import generate_missile_group from gen.sam.sam_group_generator import ( generate_anti_air_group, - generate_shorad_group, + generate_ewr_group, generate_shorad_group, ) from theater import ( ConflictTheater, @@ -34,7 +34,7 @@ from theater import ( ) from theater.conflicttheater import IMPORTANCE_HIGH, IMPORTANCE_LOW from theater.theatergroundobject import ( - SamGroundObject, BuildingGroundObject, CarrierGroundObject, + EwrGroundObject, SamGroundObject, BuildingGroundObject, CarrierGroundObject, LhaGroundObject, MissileSiteGroundObject, ShipGroundObject, ) @@ -269,29 +269,47 @@ class LhaGroundObjectGenerator(ControlPointGroundObjectGenerator): class BaseDefenseGenerator: - def __init__(self, game: Game, control_point: ControlPoint, - faction_name: str) -> None: + def __init__(self, game: Game, control_point: ControlPoint) -> None: self.game = game self.control_point = control_point - self.faction_name = faction_name + + @property + def faction_name(self) -> str: + if self.control_point.captured: + return self.game.player_name + else: + return self.game.enemy_name + + @property + def faction(self) -> Faction: + return db.FACTIONS[self.faction_name] def generate(self) -> None: + self.generate_ewr() for i in range(random.randint(3, 6)): self.generate_base_defense(i) - def generate_base_defense(self, index: int) -> None: - position = find_location(True, self.control_point.position, - self.game.theater, 400, 3200, [], True) - - # Retry once, searching a bit further (On some big airbase, 3200 is too short (Ex : Incirlik)) - # But searching farther on every base would be problematic, as some base defense units - # would end up very far away from small airfields. - # (I know it's not good for performance, but this is only done on campaign generation) - # TODO : Make the whole process less stupid with preset possible positions for each airbase + def generate_ewr(self) -> None: + position = self._find_location() if position is None: - position = find_location(True, self.control_point.position, - self.game.theater, 3200, 4800, [], True) + logging.error("Could not find position for " + f"{self.control_point} EWR") + return + group_id = self.game.next_group_id() + + g = EwrGroundObject(namegen.random_objective_name(), group_id, + position, self.control_point) + + group = generate_ewr_group(self.game, g, self.faction_name) + if group is None: + return + + g.groups = [group] + self.control_point.base_defenses.append(g) + + def generate_base_defense(self, index: int) -> None: + position = self._find_location() if position is None: logging.error("Could not find position for " f"{self.control_point} base defense") @@ -306,6 +324,20 @@ class BaseDefenseGenerator: self.game) self.control_point.base_defenses.append(g) + def _find_location(self) -> Optional[Point]: + position = find_location(True, self.control_point.position, + self.game.theater, 400, 3200, [], True) + + # Retry once, searching a bit further (On some big airbase, 3200 is too short (Ex : Incirlik)) + # But searching farther on every base would be problematic, as some base defense units + # would end up very far away from small airfields. + # (I know it's not good for performance, but this is only done on campaign generation) + # TODO : Make the whole process less stupid with preset possible positions for each airbase + if position is None: + position = find_location(True, self.control_point.position, + self.game.theater, 3200, 4800, [], True) + return position + class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): def __init__(self, game: Game, control_point: ControlPoint, @@ -317,8 +349,7 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): if not super().generate(): return False - BaseDefenseGenerator(self.game, self.control_point, - self.faction_name).generate() + BaseDefenseGenerator(self.game, self.control_point).generate() self.generate_ground_points() if self.faction.missiles: diff --git a/theater/theatergroundobject.py b/theater/theatergroundobject.py index 47b022fa..47737934 100644 --- a/theater/theatergroundobject.py +++ b/theater/theatergroundobject.py @@ -218,6 +218,28 @@ class SamGroundObject(TheaterGroundObject): return super().group_name +class EwrGroundObject(TheaterGroundObject): + def __init__(self, name: str, group_id: int, position: Point, + control_point: ControlPoint) -> None: + super().__init__( + name=name, + category="EWR", + group_id=group_id, + position=position, + heading=0, + control_point=control_point, + dcs_identifier="EWR", + airbase_group=True, + sea_object=False + ) + + @property + def group_name(self) -> str: + # Prefix the group names with the side color so Skynet can find them. + color = "BLUE" if self.control_point.captured else "RED" + return f"{color}|{super().group_name}" + + class ShipGroundObject(TheaterGroundObject): def __init__(self, name: str, group_id: int, position: Point, control_point: ControlPoint) -> None: