diff --git a/gen/fleet/lha_group.py b/gen/fleet/lha_group.py index 65ee149a..e8d46764 100644 --- a/gen/fleet/lha_group.py +++ b/gen/fleet/lha_group.py @@ -17,8 +17,9 @@ class LHAGroupGenerator(GroupGenerator): self.add_unit(carrier_type, "LHA", self.position.x, self.position.y, self.heading) # Add destroyers escort - dd_type = random.choice(self.faction["destroyer"]) - self.add_unit(dd_type, "DD1", self.position.x + 50, self.position.y + 150, self.heading) - self.add_unit(dd_type, "DD2", self.position.x + 50, self.position.y - 150, self.heading) + if "destroyer" in self.faction.keys(): + dd_type = random.choice(self.faction["destroyer"]) + self.add_unit(dd_type, "DD1", self.position.x + 250, self.position.y + 450, self.heading) + self.add_unit(dd_type, "DD2", self.position.x + 250, self.position.y - 450, self.heading) self.get_generated_group().points[0].speed = 20 \ No newline at end of file diff --git a/gen/flights/ai_flight_planner.py b/gen/flights/ai_flight_planner.py index 6ab1666a..0f7f1cc7 100644 --- a/gen/flights/ai_flight_planner.py +++ b/gen/flights/ai_flight_planner.py @@ -50,7 +50,7 @@ class FlightPlanner: self.compute_strike_targets() # The priority is to assign air-superiority fighter or interceptor to interception roles, so they can scramble if there is an attacker - self.commision_interceptors() + #self.commision_interceptors() # Then some CAP patrol for the next 2 hours self.commision_barcap() @@ -138,9 +138,19 @@ class FlightPlanner: point = FlightWaypoint(ground_object.position.x, ground_object.position.y, patrol_alt) point.name = "Patrol point" point.description = "Patrol #" + str(len(flight.points)) + point.pretty_name = "Patrol #" + str(len(flight.points)) flight.points.append(point) patrolled.append(ground_object.group_id) + if len(flight.points) == 0: + for i in range(3): + pos = self.from_cp.position.point_from_heading(random.randint(0,360), random.randint(30000, 80000)) + point = FlightWaypoint(pos.x, pos.y, patrol_alt) + point.name = "Patrol point" + point.description = "Patrol #" + str(len(flight.points)) + point.pretty_name = "Patrol #" + str(len(flight.points)) + flight.points.append(point) + self.cap_flights.append(flight) self.flights.append(flight) @@ -182,17 +192,20 @@ class FlightPlanner: ingress_point = FlightWaypoint(ingress.x, ingress.y, 1000) ingress_point.name = "INGRESS" + ingress_point.pretty_name = "INGRESS" ingress_point.description = "Ingress into CAS area" flight.points.append(ingress_point) center_point = FlightWaypoint(center.x, center.y, 1000) center_point.description = "Provide CAS" center_point.name = "CAS" + center_point.pretty_name = "INGRESS" flight.points.append(center_point) egress_point = FlightWaypoint(egress.x, egress.y, 1000) egress_point.description = "Egress from CAS area" egress_point.name = "EGRESS" + egress_point.pretty_name = "EGRESS" flight.points.append(egress_point) self.cas_flights.append(flight) @@ -234,6 +247,7 @@ class FlightPlanner: point = FlightWaypoint(location.position.x, location.position.y, 1000) point.description = "SEAD" + point.pretty_name = "SEAD" point.targets.append(location) flight.points.append(point) @@ -324,8 +338,12 @@ class FlightPlanner: return "-"*40 + "\n" + self.from_cp.name + " planned flights :\n"\ + "-"*40 + "\n" + "\n".join([repr(f) for f in self.flights]) + "\n" + "-"*40 - - - - + def get_available_aircraft(self): + base_aircraft_inventory = dict({k: v for k, v in self.from_cp.base.aircraft.items()}) + for f in self.flights: + if f.unit_type in base_aircraft_inventory.keys(): + base_aircraft_inventory[f.unit_type] = base_aircraft_inventory[f.unit_type] - f.count + if base_aircraft_inventory[f.unit_type] <= 0: + del base_aircraft_inventory[f.unit_type] + return base_aircraft_inventory diff --git a/qt_ui/widgets/QTopPanel.py b/qt_ui/widgets/QTopPanel.py index b741f3cf..0fe623bd 100644 --- a/qt_ui/widgets/QTopPanel.py +++ b/qt_ui/widgets/QTopPanel.py @@ -81,7 +81,7 @@ class QTopPanel(QFrame): self.budgetBox.setGame(self.game) self.factionsInfos.setGame(self.game) - if not len(self.game.planners.keys()) == len(self.game.theater.controlpoints): + if self.game and self.game.turn == 0: self.proceedButton.setEnabled(False) else: self.proceedButton.setEnabled(True) diff --git a/qt_ui/widgets/base/QBaseInformation.py b/qt_ui/widgets/base/QBaseInformation.py deleted file mode 100644 index dc1e2660..00000000 --- a/qt_ui/widgets/base/QBaseInformation.py +++ /dev/null @@ -1,45 +0,0 @@ -from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QVBoxLayout - -from game import db -from qt_ui.uiconstants import AIRCRAFT_ICONS, VEHICLES_ICONS -from theater import ControlPoint, Airport - - -class QBaseInformation(QGroupBox): - - def __init__(self, cp:ControlPoint, airport:Airport): - super(QBaseInformation, self).__init__("Base defenses") - self.cp = cp - self.airport = airport - self.setMinimumWidth(500) - self.init_ui() - - def init_ui(self): - self.layout = QGridLayout() - - unit_dict = {} - for g in self.cp.ground_objects: - if g.airbase_group: - for group in g.groups: - for u in group.units: - if u.type in unit_dict.keys(): - unit_dict[u.type] = unit_dict[u.type] + 1 - else: - unit_dict[u.type] = 1 - - i = 0 - for k,v in unit_dict.items(): - icon = QLabel() - if k in VEHICLES_ICONS.keys(): - icon.setPixmap(VEHICLES_ICONS[k]) - else: - icon.setText(""+k[:6]+"") - icon.setProperty("style", "icon-plane") - self.layout.addWidget(icon, i, 0) - self.layout.addWidget(QLabel(str(v) + " x " + k), i, 1) - i = i + 1 - - stretch = QVBoxLayout() - stretch.addStretch() - self.layout.addLayout(stretch, len(unit_dict) + 1, 0) - self.setLayout(self.layout) diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 19c6505c..ac82c5c8 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -76,24 +76,13 @@ class QLiberationMap(QGraphicsView): scene.addItem(QMapControlPoint(self, pos[0] - CONST.CP_SIZE / 2, pos[1] - CONST.CP_SIZE / 2, CONST.CP_SIZE, CONST.CP_SIZE, cp, self.game)) - if cp.captured: pen = QPen(brush=CONST.COLORS["blue"]) brush = CONST.COLORS["blue_transparent"] - - flight_path_pen = QPen(brush=CONST.COLORS["blue"]) - flight_path_pen.setColor(CONST.COLORS["blue"]) - flight_path_pen.setWidth(1) - flight_path_pen.setStyle(Qt.DashDotLine) else: pen = QPen(brush=CONST.COLORS["red"]) brush = CONST.COLORS["red_transparent"] - flight_path_pen = QPen(brush=CONST.COLORS["bright_red"]) - flight_path_pen.setColor(CONST.COLORS["bright_red"]) - flight_path_pen.setWidth(1) - flight_path_pen.setStyle(Qt.DashDotLine) - for ground_object in cp.ground_objects: go_pos = self._transform_point(ground_object.position) @@ -119,6 +108,24 @@ class QLiberationMap(QGraphicsView): self.scene_create_lines_for_cp(cp) for cp in self.game.theater.controlpoints: + + if cp.captured: + pen = QPen(brush=CONST.COLORS["blue"]) + brush = CONST.COLORS["blue_transparent"] + + flight_path_pen = QPen(brush=CONST.COLORS["blue"]) + flight_path_pen.setColor(CONST.COLORS["blue"]) + flight_path_pen.setWidth(1) + flight_path_pen.setStyle(Qt.DashDotLine) + else: + pen = QPen(brush=CONST.COLORS["red"]) + brush = CONST.COLORS["red_transparent"] + + flight_path_pen = QPen(brush=CONST.COLORS["bright_red"]) + flight_path_pen.setColor(CONST.COLORS["bright_red"]) + flight_path_pen.setWidth(1) + flight_path_pen.setStyle(Qt.DashDotLine) + pos = self._transform_point(cp.position) if self.get_display_rule("flight_paths"): if cp.id in self.game.planners.keys(): diff --git a/qt_ui/windows/QNewGameWizard.py b/qt_ui/windows/QNewGameWizard.py index d467df26..f3565ef2 100644 --- a/qt_ui/windows/QNewGameWizard.py +++ b/qt_ui/windows/QNewGameWizard.py @@ -210,16 +210,16 @@ class TheaterConfiguration(QtWidgets.QWizardPage): terrainCaucasusSmall.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) terrainCaucasusSmallInverted = QtWidgets.QRadioButton("Caucasus - Western Georgia Inverted [RECOMMENDED]") terrainCaucasusSmallInverted.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) - terrainCaucasus = QtWidgets.QRadioButton("Caucasus - Full map") + terrainCaucasus = QtWidgets.QRadioButton("Caucasus - Full map [NOT TESTED]") terrainCaucasus.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) - terrainPg = QtWidgets.QRadioButton("Persian Gulf - Full Map") + terrainPg = QtWidgets.QRadioButton("Persian Gulf - Full Map [NOT TESTED]") terrainPg.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) terrainIran = QtWidgets.QRadioButton("Persian Gulf - Invasion of Iran [RECOMMENDED]") terrainIran.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) terrainEmirates = QtWidgets.QRadioButton("Persian Gulf - Emirates [RECOMMENDED]") terrainEmirates.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) - terrainNttr = QtWidgets.QRadioButton("Nevada - Full") + terrainNttr = QtWidgets.QRadioButton("Nevada - North Nevada [RECOMMENDED]") terrainNttr.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Nevada"])) terrainNormandy = QtWidgets.QRadioButton("Normandy [Alpha]") terrainNormandy.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Normandy"])) @@ -282,6 +282,7 @@ class MiscOptions(QtWidgets.QWizardPage): sams.setChecked(True) midGame = QtWidgets.QCheckBox() multiplier = QtWidgets.QSpinBox() + multiplier.setEnabled(False) multiplier.setMinimum(1) multiplier.setMaximum(5) @@ -290,11 +291,11 @@ class MiscOptions(QtWidgets.QWizardPage): self.registerField('multiplier', multiplier) layout = QtWidgets.QGridLayout() - layout.addWidget(QtWidgets.QLabel("With SAM Systems :"), 0, 0) - layout.addWidget(sams, 0, 1) + #layout.addWidget(QtWidgets.QLabel("With SAM Systems :"), 0, 0) + #layout.addWidget(sams, 0, 1) layout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0) layout.addWidget(midGame, 1, 1) - layout.addWidget(QtWidgets.QLabel("Ennemy forces multiplier"), 2, 0) + layout.addWidget(QtWidgets.QLabel("Ennemy forces multiplier [Disabled for Now]"), 2, 0) layout.addWidget(multiplier, 2, 1) self.setLayout(layout) diff --git a/qt_ui/windows/basemenu/QBaseMenu.py b/qt_ui/windows/basemenu/QBaseMenu.py index 1e106333..b033a2d0 100644 --- a/qt_ui/windows/basemenu/QBaseMenu.py +++ b/qt_ui/windows/basemenu/QBaseMenu.py @@ -9,7 +9,7 @@ from dcs.unittype import UnitType 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 +from qt_ui.windows.basemenu.base_defenses.QBaseInformation import QBaseInformation from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from theater import ControlPoint, CAP, Embarking, CAS, PinpointStrike, db diff --git a/qt_ui/windows/basemenu/QBaseMenuTabs.py b/qt_ui/windows/basemenu/QBaseMenuTabs.py index 775a4e35..dcb05ee6 100644 --- a/qt_ui/windows/basemenu/QBaseMenuTabs.py +++ b/qt_ui/windows/basemenu/QBaseMenuTabs.py @@ -18,6 +18,9 @@ class QBaseMenuTabs(QTabWidget): if not cp.captured: self.intel = QIntelInfo(cp, game) self.addTab(self.intel, "Intel") + if not cp.is_carrier: + self.base_defenses_hq = QBaseDefensesHQ(cp, game) + self.addTab(self.base_defenses_hq, "Base Defenses") else: if cp.has_runway(): self.airfield_command = QAirfieldCommand(cp, game) @@ -28,6 +31,9 @@ class QBaseMenuTabs(QTabWidget): self.addTab(self.ground_forces_hq, "Ground Forces HQ") self.base_defenses_hq = QBaseDefensesHQ(cp, game) self.addTab(self.base_defenses_hq, "Base Defenses") + else: + self.base_defenses_hq = QBaseDefensesHQ(cp, game) + self.addTab(self.base_defenses_hq, "Fleet") else: tabError = QFrame() diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index a9c52bb0..c9245e84 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -1,19 +1,8 @@ -import traceback +from PySide2.QtWidgets import QVBoxLayout, QGridLayout, QGroupBox -from PySide2.QtCore import Qt -from PySide2.QtGui import QCloseEvent -from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QDialog, QVBoxLayout, QGridLayout, QPushButton, \ - QGroupBox, QSizePolicy, QSpacerItem, QFrame -from dcs.unittype import UnitType - -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 +from game.event import UnitsDeliveryEvent from qt_ui.windows.basemenu.QRecruitBehaviour import QRecruitBehaviour -from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView -from qt_ui.windows.GameUpdateSignal import GameUpdateSignal -from theater import ControlPoint, CAP, Embarking, CAS, PinpointStrike, db +from theater import ControlPoint, CAP, CAS, db from game import Game diff --git a/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py b/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py new file mode 100644 index 00000000..a18eb5cd --- /dev/null +++ b/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py @@ -0,0 +1,36 @@ +from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox + +from qt_ui.uiconstants import VEHICLES_ICONS +from theater import ControlPoint, TheaterGroundObject + + +class QBaseDefenseGroupInfo(QGroupBox): + + def __init__(self, cp:ControlPoint, ground_object: TheaterGroundObject): + super(QBaseDefenseGroupInfo, self).__init__("Group : " + ground_object.obj_name) + self.ground_object = ground_object + self.init_ui() + + def init_ui(self): + unit_dict = {} + layout = QGridLayout() + for g in self.ground_object.groups: + for u in g.units: + if u.type in unit_dict.keys(): + unit_dict[u.type] = unit_dict[u.type] + 1 + else: + unit_dict[u.type] = 1 + i = 0 + for k, v in unit_dict.items(): + icon = QLabel() + if k in VEHICLES_ICONS.keys(): + icon.setPixmap(VEHICLES_ICONS[k]) + else: + icon.setText("" + k[:6] + "") + icon.setProperty("style", "icon-plane") + layout.addWidget(icon, i, 0) + layout.addWidget(QLabel(str(v) + " x " + k), i, 1) + i = i + 1 + self.setLayout(layout) + + diff --git a/qt_ui/windows/basemenu/base_defenses/QBaseDefensesHQ.py b/qt_ui/windows/basemenu/base_defenses/QBaseDefensesHQ.py index 7dfec6d4..77c53939 100644 --- a/qt_ui/windows/basemenu/base_defenses/QBaseDefensesHQ.py +++ b/qt_ui/windows/basemenu/base_defenses/QBaseDefensesHQ.py @@ -1,6 +1,6 @@ -from PySide2.QtWidgets import QFrame, QGridLayout, QLabel +from PySide2.QtWidgets import QFrame, QGridLayout from game import Game -from qt_ui.widgets.base.QBaseInformation import QBaseInformation +from qt_ui.windows.basemenu.base_defenses.QBaseInformation import QBaseInformation from theater import ControlPoint diff --git a/qt_ui/windows/basemenu/base_defenses/QBaseInformation.py b/qt_ui/windows/basemenu/base_defenses/QBaseInformation.py new file mode 100644 index 00000000..432d2d2d --- /dev/null +++ b/qt_ui/windows/basemenu/base_defenses/QBaseInformation.py @@ -0,0 +1,24 @@ +from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QVBoxLayout + +from game import db +from qt_ui.uiconstants import AIRCRAFT_ICONS, VEHICLES_ICONS +from qt_ui.windows.basemenu.base_defenses.QBaseDefenseGroupInfo import QBaseDefenseGroupInfo +from theater import ControlPoint, Airport + + +class QBaseInformation(QGroupBox): + + def __init__(self, cp:ControlPoint, airport:Airport): + super(QBaseInformation, self).__init__("Base defenses") + self.cp = cp + self.airport = airport + self.setMinimumWidth(500) + self.init_ui() + + def init_ui(self): + self.layout = QVBoxLayout() + for g in self.cp.ground_objects: + if g.airbase_group: + group_info = QBaseDefenseGroupInfo(self.cp, g) + self.layout.addWidget(group_info) + self.setLayout(self.layout) diff --git a/qt_ui/windows/mission/QMissionPlanning.py b/qt_ui/windows/mission/QMissionPlanning.py index 7c2d8559..0d036e45 100644 --- a/qt_ui/windows/mission/QMissionPlanning.py +++ b/qt_ui/windows/mission/QMissionPlanning.py @@ -42,9 +42,9 @@ class QMissionPlanning(QDialog): self.planned_flight_view.selectionModel().selectionChanged.connect(self.on_flight_selection_change) if len(self.planned_flight_view.flight_planner.flights) > 0: - self.flight_planner = QFlightPlanner(self.planned_flight_view.flight_planner.flights[0], self.game) + self.flight_planner = QFlightPlanner(self.planned_flight_view.flight_planner.flights[0], self.game, self.planned_flight_view.flight_planner) else: - self.flight_planner = QFlightPlanner(None, self.game) + self.flight_planner = QFlightPlanner(None, self.game, self.planned_flight_view.flight_planner) self.add_flight_button = QPushButton("Add Flight") self.add_flight_button.clicked.connect(self.on_add_flight) @@ -89,7 +89,7 @@ class QMissionPlanning(QDialog): index = self.planned_flight_view.selectionModel().currentIndex().row() flight = self.planner.flights[index] - self.flight_planner = QFlightPlanner(flight, self.game) + self.flight_planner = QFlightPlanner(flight, self.game, self.planner) self.layout.addWidget(self.flight_planner, 0, 1) def on_add_flight(self): diff --git a/qt_ui/windows/mission/flight/QFlightCreator.py b/qt_ui/windows/mission/flight/QFlightCreator.py index 533a3b3c..94bdf1bf 100644 --- a/qt_ui/windows/mission/flight/QFlightCreator.py +++ b/qt_ui/windows/mission/flight/QFlightCreator.py @@ -1,7 +1,8 @@ from typing import List from PySide2.QtCore import Qt -from PySide2.QtWidgets import QDialog, QGridLayout, QLabel, QComboBox, QHBoxLayout, QVBoxLayout, QPushButton, QSpinBox +from PySide2.QtWidgets import QDialog, QGridLayout, QLabel, QComboBox, QHBoxLayout, QVBoxLayout, QPushButton, QSpinBox, \ + QMessageBox from dcs import Point from dcs.unittype import UnitType @@ -28,6 +29,7 @@ class QFlightCreator(QDialog): self.from_cp = from_cp self.flight_view = flight_view self.planner = self.game.planners[from_cp.id] + self.available = self.planner.get_available_aircraft() self.setWindowFlags(Qt.WindowStaysOnTopHint) self.setModal(True) @@ -35,7 +37,7 @@ class QFlightCreator(QDialog): self.setWindowIcon(EVENT_ICONS["strike"]) self.select_type_aircraft = QComboBox() - for aircraft_type in possible_aircraft_type: + for aircraft_type in self.planner.get_available_aircraft().keys(): print(aircraft_type) print(aircraft_type.name) self.select_type_aircraft.addItem(aircraft_type.id, userData=aircraft_type) @@ -47,7 +49,7 @@ class QFlightCreator(QDialog): self.select_flight_type.addItem("TARCAP [Target Combat Air Patrol]", userData=FlightType.TARCAP) self.select_flight_type.addItem("INTERCEPT [Interception]", userData=FlightType.INTERCEPTION) self.select_flight_type.addItem("CAS [Close Air Support]", userData=FlightType.CAS) - self.select_flight_type.addItem("BAI [Battlefield Interdiction]", userData=FlightType.CAS) + self.select_flight_type.addItem("BAI [Battlefield Interdiction]", userData=FlightType.BAI) self.select_flight_type.addItem("SEAD [Suppression of Enemy Air Defenses]", userData=FlightType.SEAD) self.select_flight_type.addItem("DEAD [Destruction of Enemy Air Defenses]", userData=FlightType.DEAD) self.select_flight_type.addItem("STRIKE [Strike]", userData=FlightType.STRIKE) @@ -60,7 +62,7 @@ class QFlightCreator(QDialog): self.select_count_of_aircraft.setValue(2) self.add_button = QPushButton("Add") - self.add_button.clicked.connect(self.create) + self.add_button.clicked.connect(self.create_flight) self.init_ui() @@ -91,13 +93,24 @@ class QFlightCreator(QDialog): self.setLayout(layout) - def create(self): + def create_flight(self): aircraft_type = self.select_type_aircraft.currentData() count = self.select_count_of_aircraft.value() - flight = Flight(aircraft_type, count, self.from_cp, self.select_flight_type.currentData()) - self.planner.flights.append(flight) - self.planner.custom_flights.append(flight) - if self.flight_view is not None: - self.flight_view.set_flight_planner(self.planner) - self.close() + + if self.available[aircraft_type] < count: + msg = QMessageBox() + msg.setIcon(QMessageBox.Information) + msg.setText("Not enough aircraft of this type are available. Only " + str(self.available[aircraft_type]) + " available.") + msg.setWindowTitle("Not enough aircraft") + msg.setStandardButtons(QMessageBox.Ok) + msg.setWindowFlags(Qt.WindowStaysOnTopHint) + msg.exec_() + return + else: + flight = Flight(aircraft_type, count, self.from_cp, self.select_flight_type.currentData()) + self.planner.flights.append(flight) + self.planner.custom_flights.append(flight) + if self.flight_view is not None: + self.flight_view.set_flight_planner(self.planner) + self.close() diff --git a/qt_ui/windows/mission/flight/QFlightPlanner.py b/qt_ui/windows/mission/flight/QFlightPlanner.py index 59c2e406..c8f34751 100644 --- a/qt_ui/windows/mission/flight/QFlightPlanner.py +++ b/qt_ui/windows/mission/flight/QFlightPlanner.py @@ -9,10 +9,10 @@ from qt_ui.windows.mission.flight.waypoints.QFlightWaypointTab import QFlightWay class QFlightPlanner(QTabWidget): - def __init__(self, flight: Flight, game: Game): + def __init__(self, flight: Flight, game: Game, planner): super(QFlightPlanner, self).__init__() if flight: - self.general_settings_tab = QGeneralFlightSettingsTab(flight, game) + self.general_settings_tab = QGeneralFlightSettingsTab(flight, game, planner) self.payload_tab = QFlightPayloadTab(flight, game) self.waypoint_tab = QFlightWaypointTab(game, flight) self.addTab(self.general_settings_tab, "General Flight settings") diff --git a/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py b/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py index 39fea239..36a72dc4 100644 --- a/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py +++ b/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py @@ -6,23 +6,32 @@ class QFlightSlotEditor(QGroupBox): changed = Signal() - def __init__(self, flight, game): + def __init__(self, flight, game, planner): super(QFlightSlotEditor, self).__init__("Slots") self.flight = flight self.game = game + self.planner = planner + self.available = self.planner.get_available_aircraft() + if self.flight.unit_type not in self.available: + max = self.flight.count + else: + max = self.flight.count + self.available[self.flight.unit_type] + if max > 4: + max = 4 + layout = QGridLayout() self.aircraft_count = QLabel("Aircraft count :") self.aircraft_count_spinner = QSpinBox() self.aircraft_count_spinner.setMinimum(1) - self.aircraft_count_spinner.setMaximum(4) + self.aircraft_count_spinner.setMaximum(max) self.aircraft_count_spinner.setValue(flight.count) self.aircraft_count_spinner.valueChanged.connect(self._changed_aircraft_count) self.client_count = QLabel("Client slots count :") self.client_count_spinner = QSpinBox() self.client_count_spinner.setMinimum(0) - self.client_count_spinner.setMaximum(4) + self.client_count_spinner.setMaximum(max) self.client_count_spinner.setValue(flight.client_count) self.client_count_spinner.valueChanged.connect(self._changed_client_count) diff --git a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py index 5c7d7d8e..0caacc1d 100644 --- a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py +++ b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py @@ -10,17 +10,18 @@ from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import QFlightTyp class QGeneralFlightSettingsTab(QFrame): - def __init__(self, flight: Flight, game: Game): + def __init__(self, flight: Flight, game: Game, planner): super(QGeneralFlightSettingsTab, self).__init__() self.flight = flight self.game = game + self.planner = planner self.init_ui() def init_ui(self): layout = QGridLayout() self.flight_info = QFlightTypeTaskInfo(self.flight) self.flight_departure = QFlightDepartureEditor(self.flight) - self.flight_slots = QFlightSlotEditor(self.flight, self.game) + self.flight_slots = QFlightSlotEditor(self.flight, self.game, self.planner) self.flight_start_type = QFlightStartType(self.flight) layout.addWidget(self.flight_info, 0, 0) layout.addWidget(self.flight_departure, 1, 0) diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 59ef75de..e5acd2e7 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -5,6 +5,7 @@ from PySide2.QtWidgets import QLabel, QDialog, QGridLayout, QListView, QStackedL import qt_ui.uiconstants as CONST from game.game import Game +from game.infos.information import Information from qt_ui.windows.GameUpdateSignal import GameUpdateSignal @@ -163,21 +164,28 @@ class QSettingsWindow(QDialog): self.cheat50M = QPushButton("Cheat +50M") self.cheat100M = QPushButton("Cheat +100M") self.cheat200M = QPushButton("Cheat +200M") + self.cheat500M = QPushButton("Cheat +500M") + self.cheat1000M = QPushButton("Cheat +1000M") self.cheat25M.clicked.connect(lambda: self.cheatMoney(25)) self.cheat50M.clicked.connect(lambda: self.cheatMoney(50)) self.cheat100M.clicked.connect(lambda: self.cheatMoney(100)) self.cheat200M.clicked.connect(lambda: self.cheatMoney(200)) + self.cheat500M.clicked.connect(lambda: self.cheatMoney(500)) + self.cheat1000M.clicked.connect(lambda: self.cheatMoney(1000)) self.moneyCheatBoxLayout.addWidget(self.cheat25M, 0, 0) self.moneyCheatBoxLayout.addWidget(self.cheat50M, 0, 1) self.moneyCheatBoxLayout.addWidget(self.cheat100M, 1, 0) self.moneyCheatBoxLayout.addWidget(self.cheat200M, 1, 1) + self.moneyCheatBoxLayout.addWidget(self.cheat500M, 2, 0) + self.moneyCheatBoxLayout.addWidget(self.cheat1000M, 2, 1) self.cheatLayout.addWidget(self.moneyCheatBox, 0, 0) def cheatMoney(self, amount): self.game.budget += amount + self.game.informations.append(Information("CHEATER", "You are a cheater and you should feel bad", self.game.turn)) GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): diff --git a/resources/stylesheets/style.css b/resources/stylesheets/style.css index 9d8e4db6..1d387adb 100644 --- a/resources/stylesheets/style.css +++ b/resources/stylesheets/style.css @@ -77,6 +77,7 @@ QLabel[style="base-title"]{ QLabel[style="icon-plane"]{ background-color:#48719D; min-height:24px; + max-width: 84px; border: 1px solid black; text-align:center; color:white; diff --git a/theater/nevada.py b/theater/nevada.py index ee48b4f6..cfc440ad 100644 --- a/theater/nevada.py +++ b/theater/nevada.py @@ -30,23 +30,20 @@ class NevadaTheater(ConflictTheater): self.mesquite = ControlPoint.from_airport(nevada.Mesquite, LAND, SIZE_REGULAR, 1.3) self.beatty = ControlPoint.from_airport(nevada.Beatty_Airport, LAND, SIZE_REGULAR, 1.1) self.creech = ControlPoint.from_airport(nevada.Creech_AFB, LAND, SIZE_BIG, IMPORTANCE_HIGH) - self.las_vegas = ControlPoint.from_airport(nevada.North_Las_Vegas, LAND, SIZE_LARGE, IMPORTANCE_HIGH) - self.jean = ControlPoint.from_airport(nevada.Jean_Airport, LAND, SIZE_REGULAR, 1.2) - self.laughlin = ControlPoint.from_airport(nevada.Laughlin_Airport, LAND, SIZE_LARGE, IMPORTANCE_HIGH) + #self.las_vegas = ControlPoint.from_airport(nevada.North_Las_Vegas, LAND, SIZE_LARGE, IMPORTANCE_HIGH) + #self.jean = ControlPoint.from_airport(nevada.Jean_Airport, LAND, SIZE_REGULAR, 1.2) + #self.laughlin = ControlPoint.from_airport(nevada.Laughlin_Airport, LAND, SIZE_LARGE, IMPORTANCE_HIGH) + + self.add_controlpoint(self.tonopah, connected_to=[self.tonopah_test_range]) - self.add_controlpoint(self.tonopah, connected_to=[self.tonopah_test_range, self.lincoln_conty]) self.add_controlpoint(self.tonopah_test_range, connected_to=[self.tonopah, self.lincoln_conty, self.pahute_mesa]) - self.add_controlpoint(self.lincoln_conty, connected_to=[self.tonopah_test_range, self.tonopah, self.mesquite]) - - self.add_controlpoint(self.groom_lake, connected_to=[self.pahute_mesa, self.lincoln_conty, self.mesquite]) + self.add_controlpoint(self.lincoln_conty, connected_to=[self.tonopah_test_range, self.mesquite, self.groom_lake]) self.add_controlpoint(self.pahute_mesa, connected_to=[self.groom_lake, self.tonopah_test_range, self.beatty, self.creech]) - self.add_controlpoint(self.mesquite, connected_to=[self.lincoln_conty, self.groom_lake, self.creech, self.las_vegas]) - self.add_controlpoint(self.beatty, connected_to=[self.pahute_mesa, self.creech]) + self.add_controlpoint(self.groom_lake, connected_to=[self.pahute_mesa, self.lincoln_conty, self.mesquite]) - self.add_controlpoint(self.creech, connected_to=[self.beatty, self.mesquite, self.pahute_mesa, self.las_vegas]) - self.add_controlpoint(self.las_vegas, connected_to=[self.mesquite, self.creech, self.jean, self.laughlin]) - self.add_controlpoint(self.jean, connected_to=[self.laughlin, self.las_vegas]) - self.add_controlpoint(self.laughlin, connected_to=[self.jean, self.las_vegas]) + self.add_controlpoint(self.beatty, connected_to=[self.pahute_mesa]) + self.add_controlpoint(self.creech, connected_to=[self.mesquite, self.pahute_mesa]) + self.add_controlpoint(self.mesquite, connected_to=[self.lincoln_conty, self.groom_lake, self.creech]) self.tonopah.captured = True diff --git a/theater/persiangulf.py b/theater/persiangulf.py index 74eb0608..c69b3353 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -123,7 +123,9 @@ class IranianCampaign(ConflictTheater): self.jiroft = ControlPoint.from_airport(persiangulf.Jiroft_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH) self.bandar_e_jask = ControlPoint.from_airport(persiangulf.Bandar_e_Jask_airfield, LAND, SIZE_TINY,IMPORTANCE_LOW) self.ras_al_khaimah = ControlPoint.from_airport(persiangulf.Ras_Al_Khaimah, LAND, SIZE_REGULAR,IMPORTANCE_MEDIUM) - self.east_carrier = ControlPoint.carrier("East carrier", Point(59514.324335475, 28165.517980635)) + + self.east_carrier = ControlPoint.carrier("East carrier", Point(59514.324335475, 28165.517980635), 1001) + self.west_carrier = ControlPoint.lha("Tarawa", Point(-27500.813952358, -147000.65947136), 1002) self.add_controlpoint(self.ras_al_khaimah, connected_to=[self.khasab]) self.add_controlpoint(self.khasab, connected_to=[self.ras_al_khaimah]) @@ -139,7 +141,10 @@ class IranianCampaign(ConflictTheater): self.add_controlpoint(self.lar, connected_to=[self.bandar_lengeh, self.havadarya, self.shiraz, self.kerman]) self.add_controlpoint(self.east_carrier) + self.add_controlpoint(self.west_carrier) + self.east_carrier.captured = True + self.west_carrier.captured = True self.al_dhafra.captured = True self.ras_al_khaimah.captured = True self.khasab.captured = True