diff --git a/changelog.md b/changelog.md index 48820482..46146806 100644 --- a/changelog.md +++ b/changelog.md @@ -29,6 +29,7 @@ * **[COMMs]** Aircraft-specific callsigns will now also be used. * **[COMMs]** Ability to set a specific callsign to a flight. * **[Mission Generator]** Channel terrain fix on exclusion zones, sea zones and inclusion zones +* **[Options]** Cheat-option for accessing Air Wing Config Dialog after campaign start ## Fixes * **[Mission Generation]** Anti-ship strikes should use "group attack" in their attack-task diff --git a/game/settings/settings.py b/game/settings/settings.py index 9b8aada8..6193b188 100644 --- a/game/settings/settings.py +++ b/game/settings/settings.py @@ -959,6 +959,7 @@ class Settings: enable_base_capture_cheat: bool = False enable_transfer_cheat: bool = False enable_runway_state_cheat: bool = False + enable_air_wing_adjustments: bool = False # LUA Plugins system plugins: Dict[str, bool] = field(default_factory=dict) diff --git a/qt_ui/windows/AirWingConfigurationDialog.py b/qt_ui/windows/AirWingConfigurationDialog.py index 0f39d426..1b5b932e 100644 --- a/qt_ui/windows/AirWingConfigurationDialog.py +++ b/qt_ui/windows/AirWingConfigurationDialog.py @@ -12,7 +12,6 @@ from PySide6.QtGui import QIcon, QStandardItem, QStandardItemModel from PySide6.QtWidgets import ( QComboBox, QDialog, - QGroupBox, QHBoxLayout, QLabel, QLineEdit, @@ -29,6 +28,7 @@ from PySide6.QtWidgets import ( QToolButton, QMessageBox, QSpinBox, + QGroupBox, ) from game import Game @@ -39,7 +39,6 @@ from game.dcs.aircrafttype import AircraftType from game.squadrons import AirWing, Pilot, Squadron from game.squadrons.squadrondef import SquadronDef from game.theater import ControlPoint, ParkingType -from game.theater.start_generator import GeneratorSettings from qt_ui.uiconstants import AIRCRAFT_ICONS, ICONS from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector from qt_ui.widgets.combos.primarytaskselector import PrimaryTaskSelector @@ -196,14 +195,14 @@ class SquadronConfigurationBox(QGroupBox): coalition: Coalition, squadron: Squadron, parking_tracker: AirWingConfigParkingTracker, - gen_settings: GeneratorSettings, + aircraft_present: bool, ) -> None: super().__init__() self.game = game self.coalition = coalition self.squadron = squadron self.parking_tracker = parking_tracker - self.gen_settings = gen_settings + self.aircraft_present = aircraft_present columns = QHBoxLayout() self.setLayout(columns) @@ -326,7 +325,7 @@ class SquadronConfigurationBox(QGroupBox): required_slots = self.parking_tracker.used_parking_at(self.squadron.location) required_slots_string = ( f"Parking slots required: {required_slots}
" - if self.gen_settings.squadrons_start_full + if self.aircraft_present else "" ) total_slots = self.squadron.location.total_aircraft_parking( @@ -446,14 +445,14 @@ class SquadronConfigurationLayout(QVBoxLayout): coalition: Coalition, squadrons: list[Squadron], parking_tracker: AirWingConfigParkingTracker, - gen_settings: GeneratorSettings, + aircraft_present: bool, ) -> None: super().__init__() self.game = game self.coalition = coalition self.squadron_configs = [] self.parking_tracker = parking_tracker - self.gen_settings = gen_settings + self.aircraft_present = aircraft_present for squadron in squadrons: self.add_squadron(squadron) @@ -476,7 +475,11 @@ class SquadronConfigurationLayout(QVBoxLayout): def add_squadron(self, squadron: Squadron) -> None: squadron_config = SquadronConfigurationBox( - self.game, self.coalition, squadron, self.parking_tracker, self.gen_settings + self.game, + self.coalition, + squadron, + self.parking_tracker, + self.aircraft_present, ) squadron_config.remove_squadron_signal.connect(self.remove_squadron) self.squadron_configs.append(squadron_config) @@ -493,14 +496,14 @@ class AircraftSquadronsPage(QWidget): coalition: Coalition, squadrons: list[Squadron], parking_tracker: AirWingConfigParkingTracker, - gen_settings: GeneratorSettings, + aircraft_present: bool, ) -> None: super().__init__() layout = QVBoxLayout() self.setLayout(layout) self.squadrons_config = SquadronConfigurationLayout( - game, coalition, squadrons, parking_tracker, gen_settings + game, coalition, squadrons, parking_tracker, aircraft_present ) self.squadrons_config.config_changed.connect(self.on_squadron_config_changed) @@ -536,14 +539,14 @@ class AircraftSquadronsPanel(QStackedLayout): game: Game, coalition: Coalition, parking_tracker: AirWingConfigParkingTracker, - gen_settings: GeneratorSettings, + aircraft_present: bool, ) -> None: super().__init__() self.game = game self.coalition = coalition self.parking_tracker = parking_tracker self.squadrons_pages: dict[AircraftType, AircraftSquadronsPage] = {} - self.gen_settings = gen_settings + self.aircraft_present = aircraft_present for aircraft, squadrons in self.air_wing.squadrons.items(): self.new_page_for_type(aircraft, squadrons) @@ -567,7 +570,7 @@ class AircraftSquadronsPanel(QStackedLayout): self.coalition, squadrons, self.parking_tracker, - self.gen_settings, + self.aircraft_present, ) page.remove_squadron_page.connect(self.remove_page_for_type) self.addWidget(page) @@ -657,7 +660,7 @@ class AircraftTypeList(QListView): class AirWingConfigurationTab(QWidget): def __init__( - self, coalition: Coalition, game: Game, gen_settings: GeneratorSettings + self, coalition: Coalition, game: Game, aircraft_present: bool ) -> None: super().__init__() @@ -678,7 +681,7 @@ class AirWingConfigurationTab(QWidget): layout.addWidget(add_button, 2, 1, 1, 1) self.squadrons_panel = AircraftSquadronsPanel( - game, coalition, self.parking_tracker, gen_settings + game, coalition, self.parking_tracker, aircraft_present ) self.squadrons_panel.page_removed.connect(self.type_list.remove_aircraft_type) layout.addLayout(self.squadrons_panel, 1, 3, 2, 1) @@ -752,7 +755,7 @@ class AirWingConfigurationTab(QWidget): class AirWingConfigurationDialog(QDialog): """Dialog window for air wing configuration.""" - def __init__(self, game: Game, gen_setting: GeneratorSettings, parent) -> None: + def __init__(self, game: Game, aircraft_present: bool, parent) -> None: super().__init__(parent) self.setMinimumSize(1024, 768) self.setWindowTitle(f"Air Wing Configuration") @@ -763,7 +766,8 @@ class AirWingConfigurationDialog(QDialog): doc_label = QLabel( "Use this opportunity to customize the squadrons available to your " - "coalition. This is your only opportunity to make changes." + "coalition. You can make changes at a later stage if " + 'the "Enable Air Wing adjustments" cheat option is enabled.' "

" "To accept your changes and continue, close this window." ) @@ -775,7 +779,7 @@ class AirWingConfigurationDialog(QDialog): self.tabs = [] for coalition in game.coalitions: - coalition_tab = AirWingConfigurationTab(coalition, game, gen_setting) + coalition_tab = AirWingConfigurationTab(coalition, game, aircraft_present) name = "Blue" if coalition.player else "Red" self.tab_widget.addTab(coalition_tab, name) self.tabs.append(coalition_tab) @@ -804,7 +808,7 @@ class AirWingConfigurationDialog(QDialog): result = QMessageBox.information( None, "Discard changes?", - "Are you sure you want to discard your changes and start the campaign?", + "Are you sure you want to discard your changes?", QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No, ) diff --git a/qt_ui/windows/AirWingDialog.py b/qt_ui/windows/AirWingDialog.py index 0e897cea..3c56607f 100644 --- a/qt_ui/windows/AirWingDialog.py +++ b/qt_ui/windows/AirWingDialog.py @@ -15,6 +15,7 @@ from PySide6.QtWidgets import ( QTableWidgetItem, QVBoxLayout, QWidget, + QPushButton, ) from game.ato.flight import Flight @@ -23,6 +24,7 @@ from game.theater import ConflictTheater from qt_ui.delegates import TwoColumnRowDelegate from qt_ui.models import AirWingModel, AtoModel, GameModel, SquadronModel from qt_ui.simcontroller import SimController +from qt_ui.windows.AirWingConfigurationDialog import AirWingConfigurationDialog from qt_ui.windows.SquadronDialog import SquadronDialog @@ -245,6 +247,18 @@ class AirWingTabs(QTabWidget): ) self.addTab(AirInventoryView(game_model), "Inventory") + if game_model.game.settings.enable_air_wing_adjustments: + pb = QPushButton("Open Air Wing Config Dialog") + pb.clicked.connect(lambda _: self.open_awcd(game_model)) + pb.setMaximumWidth(300) + layout = QHBoxLayout() + layout.addWidget(pb) + w = QWidget(layout=layout) + self.addTab(w, "Cheats") + + def open_awcd(self, gm: GameModel): + AirWingConfigurationDialog(gm.game, True, self).exec_() + class AirWingDialog(QDialog): """Dialog window showing the player's air wing.""" diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 93f289d0..9cfcd033 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -139,7 +139,7 @@ class NewGameWizard(QtWidgets.QWizard): self.generatedGame = generator.generate() AirWingConfigurationDialog( - self.generatedGame, generator.generator_settings, self + self.generatedGame, generator.generator_settings.squadrons_start_full, self ).exec_() g = self.generatedGame diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 29ff6d08..72d5009d 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -54,34 +54,34 @@ class CheatSettingsBox(QGroupBox): self.main_layout = QVBoxLayout() self.setLayout(self.main_layout) + # ATO self.red_ato_checkbox = QCheckBox() self.red_ato_checkbox.setChecked(sc.settings.show_red_ato) self.red_ato_checkbox.toggled.connect(apply_settings) + self.red_ato = QLabeledWidget("Show Red ATO:", self.red_ato_checkbox) + self.main_layout.addLayout(self.red_ato) + # Frontline self.frontline_cheat_checkbox = QCheckBox() self.frontline_cheat_checkbox.setChecked(sc.settings.enable_frontline_cheats) self.frontline_cheat_checkbox.toggled.connect(apply_settings) + self.frontline_cheat = QLabeledWidget( + "Enable Frontline Cheats:", self.frontline_cheat_checkbox + ) + self.main_layout.addLayout(self.frontline_cheat) + # Base capture self.base_capture_cheat_checkbox = QCheckBox() self.base_capture_cheat_checkbox.setChecked( sc.settings.enable_base_capture_cheat ) self.base_capture_cheat_checkbox.toggled.connect(apply_settings) - - self.transfer_cheat_checkbox = QCheckBox() - self.transfer_cheat_checkbox.setChecked(sc.settings.enable_transfer_cheat) - self.transfer_cheat_checkbox.toggled.connect(apply_settings) - - self.red_ato = QLabeledWidget("Show Red ATO:", self.red_ato_checkbox) - self.main_layout.addLayout(self.red_ato) - self.frontline_cheat = QLabeledWidget( - "Enable Frontline Cheats:", self.frontline_cheat_checkbox - ) - self.main_layout.addLayout(self.frontline_cheat) self.base_capture_cheat = QLabeledWidget( "Enable Base Capture Cheat:", self.base_capture_cheat_checkbox ) + self.main_layout.addLayout(self.base_capture_cheat) + # Runway state self.base_runway_state_cheat_checkbox = QCheckBox() self.base_runway_state_cheat_checkbox.setChecked( sc.settings.enable_runway_state_cheat @@ -93,12 +93,26 @@ class CheatSettingsBox(QGroupBox): ) ) - self.main_layout.addLayout(self.base_capture_cheat) + # Instant transfer + self.transfer_cheat_checkbox = QCheckBox() + self.transfer_cheat_checkbox.setChecked(sc.settings.enable_transfer_cheat) + self.transfer_cheat_checkbox.toggled.connect(apply_settings) self.transfer_cheat = QLabeledWidget( "Enable Instant Squadron Transfer Cheat:", self.transfer_cheat_checkbox ) self.main_layout.addLayout(self.transfer_cheat) + # Air wing adjustments + self.air_wing_adjustments_checkbox = QCheckBox() + self.air_wing_adjustments_checkbox.setChecked( + sc.settings.enable_air_wing_adjustments + ) + self.air_wing_adjustments_checkbox.toggled.connect(apply_settings) + self.air_wing_cheat = QLabeledWidget( + "Enable Air Wing adjustments:", self.air_wing_adjustments_checkbox + ) + self.main_layout.addLayout(self.air_wing_cheat) + @property def show_red_ato(self) -> bool: return self.red_ato_checkbox.isChecked() @@ -119,6 +133,10 @@ class CheatSettingsBox(QGroupBox): def enable_runway_state_cheat(self) -> bool: return self.base_runway_state_cheat_checkbox.isChecked() + @property + def enable_air_wing_cheats(self) -> bool: + return self.air_wing_adjustments_checkbox.isChecked() + class AutoSettingsLayout(QGridLayout): def __init__( @@ -474,6 +492,9 @@ class QSettingsWidget(QtWidgets.QWizardPage, SettingsContainer): self.settings.enable_runway_state_cheat = ( self.cheat_options.enable_runway_state_cheat ) + self.settings.enable_air_wing_adjustments = ( + self.cheat_options.enable_air_wing_cheats + ) if self.game: events = GameUpdateEvents()