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()