From e82db1fecd22ceeaffe4edadaca84df24b1e6595 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 26 Oct 2019 23:54:33 +0200 Subject: [PATCH] Only allow recruiting carrier units in aircraft carrier groups. Generate one group on carrier when possible. --- game/db.py | 13 +++++++++ gen/aircraft.py | 27 ++++++++++++------ gen/fleet/carrier_group.py | 4 ++- qt_ui/widgets/map/QLiberationMap.py | 2 +- qt_ui/widgets/map/QMapControlPoint.py | 40 +++++++++++++++------------ qt_ui/windows/QBaseMenu.py | 8 +++++- theater/controlpoint.py | 14 ++++++++++ 7 files changed, 79 insertions(+), 29 deletions(-) diff --git a/game/db.py b/game/db.py index 6302863b..d4b136ca 100644 --- a/game/db.py +++ b/game/db.py @@ -745,7 +745,20 @@ TIME_PERIODS = { "Syrian War [2011]": datetime(2011, 8, 7), } +CARRIER_CAPABLE = [ + FA_18C_hornet, + F_14B, + AV8BNA, + UH_1H, + Mi_8MT, + Ka_50, + + SA342L, + SA342M, + SA342Minigun, + SA342Mistral +] """ ---------- END OF CONFIGURATION SECTION diff --git a/gen/aircraft.py b/gen/aircraft.py index b2790a1d..96001159 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -339,20 +339,31 @@ class AircraftConflictGenerator: client_count=0, at=cp.position) else: + st = StartType.Runway if flight.start_type == "Cold": st = StartType.Cold elif flight.start_type == "Warm": st = StartType.Warm - group = self._generate_at_airport( - name=namegen.next_unit_name(country, cp.id, flight.unit_type), - side=country, - unit_type=flight.unit_type, - count=flight.count, - client_count=0, - airport=self.m.terrain.airport_by_id(cp.at.id), - start_type=st) + if cp.cptype in [ControlPointType.AIRCRAFT_CARRIER_GROUP, ControlPointType.LHA_GROUP]: + group_name = cp.get_carrier_group_name() + group = self._generate_at_group( + name=namegen.next_unit_name(country, cp.id, flight.unit_type), + side=country, + unit_type=flight.unit_type, + count=flight.count, + client_count=0, + at=self.m.find_group(group_name),) + else: + group = self._generate_at_airport( + name=namegen.next_unit_name(country, cp.id, flight.unit_type), + side=country, + unit_type=flight.unit_type, + count=flight.count, + client_count=0, + airport=self.m.terrain.airport_by_id(cp.at.id), + start_type=st) except Exception: # Generated when there is no place on Runway or on Parking Slots group = self._generate_group( diff --git a/gen/fleet/carrier_group.py b/gen/fleet/carrier_group.py index 669e6f9b..a2d60e8b 100644 --- a/gen/fleet/carrier_group.py +++ b/gen/fleet/carrier_group.py @@ -12,9 +12,11 @@ class CarrierGroupGenerator(GroupGenerator): def generate(self): # Add carrier - if self.faction["aircraft_carrier"]: + if "aircraft_carrier" in self.faction.keys(): carrier_type = random.choice(self.faction["aircraft_carrier"]) self.add_unit(carrier_type, "Carrier", self.position.x, self.position.y, self.heading) + else: + return # Add destroyers escort dd_type = random.choice(self.faction["destroyer"]) diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 3ef903ee..504c0eef 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -69,7 +69,7 @@ class QLiberationMap(QGraphicsView): #self.add_game_events() for cp in self.game.theater.controlpoints: - + pos = self._transform_point(cp.position) scene.addItem(QMapControlPoint(self, pos[0] - CONST.CP_SIZE / 2, pos[1] - CONST.CP_SIZE / 2, CONST.CP_SIZE, diff --git a/qt_ui/widgets/map/QMapControlPoint.py b/qt_ui/widgets/map/QMapControlPoint.py index e2360c62..dfc3d0d4 100644 --- a/qt_ui/widgets/map/QMapControlPoint.py +++ b/qt_ui/widgets/map/QMapControlPoint.py @@ -30,29 +30,33 @@ class QMapControlPoint(QGraphicsRectItem): painter.setBrush(self.brush_color) painter.setPen(self.pen_color) - if self.isUnderMouse(): - painter.setBrush(CONST.COLORS["white"]) - painter.setPen(self.pen_color) + if self.model.has_runway(): + if self.isUnderMouse(): + painter.setBrush(CONST.COLORS["white"]) + painter.setPen(self.pen_color) - r = option.rect - painter.drawChord(r, -180*16, -180*16) + r = option.rect + painter.drawChord(r, -180*16, -180*16) - gauge = QRect(r.x(), - r.y()+CONST.CP_SIZE/2 + 2, - r.width(), - CONST.CP_SIZE / 4) + gauge = QRect(r.x(), + r.y()+CONST.CP_SIZE/2 + 2, + r.width(), + CONST.CP_SIZE / 4) - painter.setBrush(CONST.COLORS["bright_red"]) - painter.setPen(CONST.COLORS["black"]) - painter.drawRect(gauge) + painter.setBrush(CONST.COLORS["bright_red"]) + painter.setPen(CONST.COLORS["black"]) + painter.drawRect(gauge) - gauge2 = QRect(r.x(), - r.y() + CONST.CP_SIZE / 2 + 2, - r.width()*self.model.base.strength, - CONST.CP_SIZE / 4) + gauge2 = QRect(r.x(), + r.y() + CONST.CP_SIZE / 2 + 2, + r.width()*self.model.base.strength, + CONST.CP_SIZE / 4) - painter.setBrush(CONST.COLORS["green"]) - painter.drawRect(gauge2) + painter.setBrush(CONST.COLORS["green"]) + painter.drawRect(gauge2) + else: + # TODO : not drawing sunk carriers. Can be improved to display sunk carrier. + pass painter.restore() def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent): diff --git a/qt_ui/windows/QBaseMenu.py b/qt_ui/windows/QBaseMenu.py index a907b9cc..1e106333 100644 --- a/qt_ui/windows/QBaseMenu.py +++ b/qt_ui/windows/QBaseMenu.py @@ -6,7 +6,7 @@ from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QDialog, QVBoxLayout QGroupBox, QSizePolicy, QSpacerItem from dcs.unittype import UnitType -from game.event import UnitsDeliveryEvent +from game.event import UnitsDeliveryEvent, ControlPointType from qt_ui.widgets.QBudgetBox import QBudgetBox from qt_ui.widgets.base.QAirportInformation import QAirportInformation from qt_ui.widgets.base.QBaseInformation import QBaseInformation @@ -23,6 +23,7 @@ class QBaseMenu(QDialog): self.cp = controlPoint self.game = game + self.is_carrier = self.cp.cptype in [ControlPointType.AIRCRAFT_CARRIER_GROUP, ControlPointType.LHA_GROUP] try: self.airport = game.theater.terrain.airport_by_id(self.cp.id) @@ -98,6 +99,9 @@ class QBaseMenu(QDialog): for task_type in units.keys(): + if task_type == PinpointStrike and self.is_carrier: + continue + units_column = list(set(units[task_type])) if len(units_column) == 0: continue units_column.sort(key=lambda x: db.PRICES[x]) @@ -107,6 +111,8 @@ class QBaseMenu(QDialog): task_box.setLayout(task_box_layout) row = 0 for unit_type in units_column: + if self.is_carrier and not unit_type in db.CARRIER_CAPABLE: + continue row = self.add_purchase_row(unit_type, task_box_layout, row) stretch = QVBoxLayout() diff --git a/theater/controlpoint.py b/theater/controlpoint.py index d5f6db84..e7aa7d3d 100644 --- a/theater/controlpoint.py +++ b/theater/controlpoint.py @@ -106,6 +106,20 @@ class ControlPoint: else: return True + def get_carrier_group_name(self): + """ + Get the carrier group name if the airbase is a carrier + :return: Carrier group name + """ + if self.cptype in [ControlPointType.AIRCRAFT_CARRIER_GROUP, ControlPointType.LHA_GROUP] : + for g in self.ground_objects: + if g.dcs_identifier == "CARRIER": + for group in g.groups: + for u in group.units: + if db.unit_type_from_name(u.type) in [CVN_74_John_C__Stennis, LHA_1_Tarawa, CV_1143_5_Admiral_Kuznetsov]: + return group.name + return None + def is_connected(self, to) -> bool: return to in self.connected_points