From 2d0c195e46be960580f81a0a733135dd708c1ee0 Mon Sep 17 00:00:00 2001 From: Khopa Date: Tue, 8 Oct 2019 22:35:08 +0200 Subject: [PATCH] Added SAM HQ-7, tweaks in db --- game/db.py | 49 +++++++++++++++++++++--- gen/aircraft.py | 10 +++-- gen/sam/sam_group_generator.py | 2 + gen/sam/sam_hq7.py | 25 +++++++++++++ qt_ui/windows/QNewGameWizard.py | 17 +++++++-- theater/persiangulf.py | 66 ++++++++++++++++++++++++++++++++- 6 files changed, 155 insertions(+), 14 deletions(-) create mode 100644 gen/sam/sam_hq7.py diff --git a/game/db.py b/game/db.py index ce80dbac..c932922c 100644 --- a/game/db.py +++ b/game/db.py @@ -66,7 +66,7 @@ PRICES = { F_16C_50: 20, F_14B: 22, Tornado_IDS: 24, - # Tornado_GR4: 24, + Tornado_GR4: 24, # bomber Su_17M4: 10, @@ -83,6 +83,7 @@ PRICES = { # heli Ka_50: 13, SA342M: 8, + SA342L: 5, UH_1H: 4, Mi_8MT: 5, Mi_24V: 12, @@ -210,7 +211,8 @@ UNIT_BY_TASK = { P_51D, MiG_29G, Su_30, - J_11A + J_11A, + F_4E, ], CAS: [ F_86F_Sabre, @@ -225,8 +227,8 @@ UNIT_BY_TASK = { Su_25T, Su_34, Ka_50, - F_4E, SA342M, + SA342L, Su_24M, Su_24MR, AH_64A, @@ -235,7 +237,7 @@ UNIT_BY_TASK = { B_52H, B_1B, Tornado_IDS, - # Tornado_GR4, + Tornado_GR4, ], Transport: [ IL_76MD, @@ -704,7 +706,7 @@ FACTIONS = { AirDefence.Rapier_FSA_Launcher, # Standing as PL-9C Shorad AirDefence.SAM_SA_10_S_300PS_LN_5P85C, # Standing as HQ-9+ AirDefence.SAM_SA_6_Kub_LN_2P25, - # TODO : ADD HQ-7 (need pydcs support) + AirDefence.HQ_7_Self_Propelled_LN, Armor.MBT_T_55, Armor.ZBD_04A, @@ -869,13 +871,17 @@ FACTIONS = { E_3A, SA342M, + SA342L, Armor.MBT_Leclerc, + Armor.TPz_Fuchs, # Standing as VAB + Unarmed.Transport_M818, Infantry.Infantry_M4, AirDefence.SAM_Roland_ADS, AirDefence.SAM_Hawk_PCP, + AirDefence.HQ_7_Self_Propelled_STR, # Standing as Crotale CVN_74_John_C__Stennis, LHA_1_Tarawa, @@ -898,10 +904,12 @@ FACTIONS = { UH_1H, SA342M, + SA342L, Armor.TPz_Fuchs, Armor.MBT_Leopard_1A3, Armor.MBT_Leopard_2, + Unarmed.Transport_M818, Infantry.Infantry_M4, @@ -914,6 +922,37 @@ FACTIONS = { Armed_speedboat, ] }, + + "United Kingdown 1990": { + "country": "UK", + "side": "blue", + "units":[ + AV8BNA, # Standing as BAE Harrier 2 + Tornado_GR4, + F_4E, + + KC_135, + S_3B_Tanker, + C_130, + E_3A, + + SA342L, + AH_64A, + + Armor.MBT_Challenger_II, + Armor.IFV_M2A2_Bradley, # Standing as Warrior IFV + + Unarmed.Transport_M818, + Infantry.Infantry_M4, + + AirDefence.Rapier_FSA_Launcher, + AirDefence.SAM_Avenger_M1097, # Standing as Starstreak + + CVN_74_John_C__Stennis, + LHA_1_Tarawa, + Armed_speedboat, + ] + }, } CARRIER_TYPE_BY_PLANE = { diff --git a/gen/aircraft.py b/gen/aircraft.py index eed3eea8..b079fdbb 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -299,9 +299,9 @@ class AircraftConflictGenerator: def generate_patrol_group(self, cp: ControlPoint, country): aircraft = dict({k:v for k,v in cp.base.aircraft.items() if k in [u for u in db.UNIT_BY_TASK[CAP]]}) - delta = random.randint(10, 20) + delta = random.randint(1, 20) - for i in range(12): + for i in range(8): if(len(aircraft.keys())) > 0: print(aircraft.keys()) type = random.choice(list(aircraft.keys())) @@ -320,7 +320,7 @@ class AircraftConflictGenerator: client_count=0, airport=self.m.terrain.airport_by_id(cp.at.id), start_type=StartType.Runway) - except RunwayOccupiedError: + except Exception: group = self._generate_group( name=namegen.next_unit_name(country, type), side=country, @@ -329,11 +329,13 @@ class AircraftConflictGenerator: client_count=0, at=cp.position) - patrol_alt = random.randint(3600, 7000) + self._setup_group(group, CAP, 0) + patrol_alt = random.randint(3600, 7000) group.points[0].alt = patrol_alt group.points[0].ETA = delta*60 + i*10*60 + patrolled = [] for ground_object in cp.ground_objects: if not ground_object.group_id in patrolled: diff --git a/gen/sam/sam_group_generator.py b/gen/sam/sam_group_generator.py index df800e61..e21b1e78 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -12,6 +12,7 @@ from gen.sam.sam_avenger import AvengerGenerator from gen.sam.sam_chaparral import ChaparralGenerator from gen.sam.sam_gepard import GepardGenerator from gen.sam.sam_hawk import HawkGenerator +from gen.sam.sam_hq7 import HQ7Generator from gen.sam.sam_linebacker import LinebackerGenerator from gen.sam.sam_patriot import PatriotGenerator from gen.sam.sam_rapier import RapierGenerator @@ -68,6 +69,7 @@ def generate_anti_air_group(game, parent_cp, ground_object, faction:str): AirDefence.SAM_SA_13_Strela_10M3_9A35M3: SA13Generator, AirDefence.SAM_SA_15_Tor_9A331: SA15Generator, AirDefence.SAM_SA_19_Tunguska_2S6: SA19Generator, + AirDefence.HQ_7_Self_Propelled_LN: HQ7Generator } possible_sams = [u for u in db.FACTIONS[faction]["units"] if u in AirDefence.__dict__.values()] diff --git a/gen/sam/sam_hq7.py b/gen/sam/sam_hq7.py new file mode 100644 index 00000000..2c4a4121 --- /dev/null +++ b/gen/sam/sam_hq7.py @@ -0,0 +1,25 @@ +import random + +from dcs.vehicles import AirDefence + +from gen.sam.group_generator import AntiAirGroupGenerator + + +class HQ7Generator(AntiAirGroupGenerator): + """ + This generate an HQ7 group + """ + + def generate(self): + self.add_unit(AirDefence.HQ_7_Self_Propelled_STR, "STR", self.position.x, self.position.y, self.heading) + self.add_unit(AirDefence.HQ_7_Self_Propelled_LN, "LN", self.position.x + 20, self.position.y, self.heading) + + # Triple A for close range defense + self.add_unit(AirDefence.AAA_ZU_23_on_Ural_375, "AAA", self.position.x + 20, self.position.y+30, self.heading) + self.add_unit(AirDefence.AAA_ZU_23_on_Ural_375, "AAA", self.position.x - 20, self.position.y-30, self.heading) + + num_launchers = random.randint(0, 3) + positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=360) + + for i, position in enumerate(positions): + self.add_unit(AirDefence.HQ_7_Self_Propelled_LN, "LN#" + str(i), position[0], position[1], position[2]) \ No newline at end of file diff --git a/qt_ui/windows/QNewGameWizard.py b/qt_ui/windows/QNewGameWizard.py index 005eb36b..11f9c3fc 100644 --- a/qt_ui/windows/QNewGameWizard.py +++ b/qt_ui/windows/QNewGameWizard.py @@ -35,6 +35,7 @@ class NewGameWizard(QtWidgets.QWizard): isTerrainPg = self.field("isTerrainPg") isTerrainNttr = self.field("isTerrainNttr") isTerrainCaucasusSmall = self.field("isTerrainCaucasusSmall") + isIranianCampaignTheater = self.field("isIranianCampaignTheater") timePeriod = db.TIME_PERIODS[list(db.TIME_PERIODS.keys())[self.field("timePeriod")]] sams = self.field("sams") midGame = self.field("midGame") @@ -49,11 +50,15 @@ class NewGameWizard(QtWidgets.QWizard): conflicttheater = nevada.NevadaTheater() elif isTerrainCaucasusSmall: conflicttheater = caucasus.WesternGeorgia() + elif isIranianCampaignTheater: + conflicttheater = persiangulf.IranianCampaign() else: conflicttheater = caucasus.CaucasusTheater() + print("player_name, enemy_name, conflicttheater, sams, midGame, multiplier, timePeriod") print(player_name, enemy_name, conflicttheater, sams, midGame, multiplier, timePeriod) + print(isIranianCampaignTheater, isTerrainPg) self.generatedGame = self.start_new_game(player_name, enemy_name, conflicttheater, sams, midGame, multiplier, timePeriod) @@ -196,14 +201,16 @@ class TheaterConfiguration(QtWidgets.QWizardPage): # Terrain selection terrainGroup = QtWidgets.QGroupBox("Terrain") - terrainCaucasus = QtWidgets.QRadioButton("Caucasus") + terrainCaucasus = QtWidgets.QRadioButton("Caucasus - Full map") terrainCaucasus.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) - terrainCaucasusSmall = QtWidgets.QRadioButton("Caucasus Western Georgia") + terrainCaucasusSmall = QtWidgets.QRadioButton("Caucasus - Western Georgia") terrainCaucasusSmall.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) - terrainPg = QtWidgets.QRadioButton("Persian Gulf") + terrainPg = QtWidgets.QRadioButton("Persian Gulf - Full Map") terrainPg.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) - terrainNttr = QtWidgets.QRadioButton("Nevada") + terrainIran = QtWidgets.QRadioButton("Persian Gulf - Iranian Campaign") + terrainIran.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) + terrainNttr = QtWidgets.QRadioButton("Nevada - Full") terrainNttr.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Nevada"])) terrainCaucasus.setChecked(True) @@ -220,6 +227,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage): self.registerField('isTerrainCaucasus', terrainCaucasus) self.registerField('isTerrainCaucasusSmall', terrainCaucasusSmall) self.registerField('isTerrainPg', terrainPg) + self.registerField('isIranianCampaignTheater', terrainIran) self.registerField('isTerrainNttr', terrainNttr) self.registerField('timePeriod', timePeriodSelect) @@ -228,6 +236,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage): terrainGroupLayout.addWidget(terrainCaucasus) terrainGroupLayout.addWidget(terrainCaucasusSmall) terrainGroupLayout.addWidget(terrainPg) + terrainGroupLayout.addWidget(terrainIran) terrainGroupLayout.addWidget(terrainNttr) terrainGroup.setLayout(terrainGroupLayout) diff --git a/theater/persiangulf.py b/theater/persiangulf.py index abd5abcd..b686313c 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -73,7 +73,7 @@ class PersianGulfTheater(ConflictTheater): self.add_controlpoint(self.bandar_lengeh, connected_to=[self.tunb_island, self.lar, self.qeshm]) self.add_controlpoint(self.qeshm, connected_to=[self.bandar_lengeh, self.havadarya, self.tunb_island]) self.add_controlpoint(self.havadarya, connected_to=[self.lar, self.qeshm, self.bandar_abbas]) - self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya]) + self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya, self.kerman]) self.add_controlpoint(self.shiraz, connected_to=[self.lar, self.kerman]) self.add_controlpoint(self.kerman, connected_to=[self.lar, self.shiraz, self.bandar_abbas]) @@ -85,3 +85,67 @@ class PersianGulfTheater(ConflictTheater): self.west_carrier.captured = True self.east_carrier.captured = True self.liwa.captured = True + + +class IranianCampaign(ConflictTheater): + + terrain = dcs.terrain.PersianGulf() + overview_image = "persiangulf.gif" + reference_points = {(persiangulf.Sir_Abu_Nuayr.position.x, persiangulf.Sir_Abu_Nuayr.position.y): (321*4, 145*4), + (persiangulf.Sirri_Island.position.x, persiangulf.Sirri_Island.position.y): (347*4, 82*4), } + landmap = load_landmap("resources\\gulflandmap.p") + daytime_map = { + "dawn": (6, 8), + "day": (8, 16), + "dusk": (16, 18), + "night": (0, 5), + } + + al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_LOW) + al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_LOW) + al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, 1.1) + sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.1, has_frontline=False) + + dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, IMPORTANCE_MEDIUM) + sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.0) + fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, 1.0) + khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) + + sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_LOW, has_frontline=False) + abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM, has_frontline=False) + tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], SIZE_SMALL, IMPORTANCE_MEDIUM, has_frontline=False) + tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, 1.1, has_frontline=False) + + bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, IMPORTANCE_HIGH) + qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, 1.1, has_frontline=False) + + havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_HIGH) + bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) + lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + shiraz = ControlPoint.from_airport(persiangulf.Shiraz_International_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH) + kerman = ControlPoint.from_airport(persiangulf.Kerman_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH) + + ras_al_khaimah = ControlPoint.from_airport(persiangulf.Ras_Al_Khaimah, LAND, SIZE_REGULAR, IMPORTANCE_MEDIUM) + + east_carrier = ControlPoint.carrier("East carrier", Point(59514.324335475, 28165.517980635)) + + def __init__(self): + super(IranianCampaign, self).__init__() + + self.add_controlpoint(self.ras_al_khaimah, connected_to=[self.khasab]) + self.add_controlpoint(self.khasab, connected_to=[self.ras_al_khaimah, self.qeshm]) + + self.add_controlpoint(self.bandar_lengeh, connected_to=[self.lar, self.qeshm]) + self.add_controlpoint(self.qeshm, connected_to=[self.khasab, self.bandar_lengeh, self.havadarya]) + self.add_controlpoint(self.havadarya, connected_to=[self.lar, self.qeshm, self.bandar_abbas]) + self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya, self.kerman]) + + self.add_controlpoint(self.shiraz, connected_to=[self.lar, self.kerman]) + self.add_controlpoint(self.kerman, connected_to=[self.lar, self.shiraz, self.bandar_abbas]) + self.add_controlpoint(self.lar, connected_to=[self.bandar_lengeh, self.havadarya, self.shiraz, self.kerman]) + + self.add_controlpoint(self.east_carrier) + self.east_carrier.captured = True + self.al_dhafra.captured = True + self.ras_al_khaimah.captured = True + self.khasab.captured = True