Add AWCD mid-game cheat

This commit is contained in:
Raffson 2023-12-28 19:37:58 +01:00
parent d6f586bbe3
commit 9ff9fa5b69
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
6 changed files with 73 additions and 32 deletions

View File

@ -29,6 +29,7 @@
* **[COMMs]** Aircraft-specific callsigns will now also be used. * **[COMMs]** Aircraft-specific callsigns will now also be used.
* **[COMMs]** Ability to set a specific callsign to a flight. * **[COMMs]** Ability to set a specific callsign to a flight.
* **[Mission Generator]** Channel terrain fix on exclusion zones, sea zones and inclusion zones * **[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 ## Fixes
* **[Mission Generation]** Anti-ship strikes should use "group attack" in their attack-task * **[Mission Generation]** Anti-ship strikes should use "group attack" in their attack-task

View File

@ -959,6 +959,7 @@ class Settings:
enable_base_capture_cheat: bool = False enable_base_capture_cheat: bool = False
enable_transfer_cheat: bool = False enable_transfer_cheat: bool = False
enable_runway_state_cheat: bool = False enable_runway_state_cheat: bool = False
enable_air_wing_adjustments: bool = False
# LUA Plugins system # LUA Plugins system
plugins: Dict[str, bool] = field(default_factory=dict) plugins: Dict[str, bool] = field(default_factory=dict)

View File

@ -12,7 +12,6 @@ from PySide6.QtGui import QIcon, QStandardItem, QStandardItemModel
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QComboBox, QComboBox,
QDialog, QDialog,
QGroupBox,
QHBoxLayout, QHBoxLayout,
QLabel, QLabel,
QLineEdit, QLineEdit,
@ -29,6 +28,7 @@ from PySide6.QtWidgets import (
QToolButton, QToolButton,
QMessageBox, QMessageBox,
QSpinBox, QSpinBox,
QGroupBox,
) )
from game import Game from game import Game
@ -39,7 +39,6 @@ from game.dcs.aircrafttype import AircraftType
from game.squadrons import AirWing, Pilot, Squadron from game.squadrons import AirWing, Pilot, Squadron
from game.squadrons.squadrondef import SquadronDef from game.squadrons.squadrondef import SquadronDef
from game.theater import ControlPoint, ParkingType from game.theater import ControlPoint, ParkingType
from game.theater.start_generator import GeneratorSettings
from qt_ui.uiconstants import AIRCRAFT_ICONS, ICONS from qt_ui.uiconstants import AIRCRAFT_ICONS, ICONS
from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector
from qt_ui.widgets.combos.primarytaskselector import PrimaryTaskSelector from qt_ui.widgets.combos.primarytaskselector import PrimaryTaskSelector
@ -196,14 +195,14 @@ class SquadronConfigurationBox(QGroupBox):
coalition: Coalition, coalition: Coalition,
squadron: Squadron, squadron: Squadron,
parking_tracker: AirWingConfigParkingTracker, parking_tracker: AirWingConfigParkingTracker,
gen_settings: GeneratorSettings, aircraft_present: bool,
) -> None: ) -> None:
super().__init__() super().__init__()
self.game = game self.game = game
self.coalition = coalition self.coalition = coalition
self.squadron = squadron self.squadron = squadron
self.parking_tracker = parking_tracker self.parking_tracker = parking_tracker
self.gen_settings = gen_settings self.aircraft_present = aircraft_present
columns = QHBoxLayout() columns = QHBoxLayout()
self.setLayout(columns) self.setLayout(columns)
@ -326,7 +325,7 @@ class SquadronConfigurationBox(QGroupBox):
required_slots = self.parking_tracker.used_parking_at(self.squadron.location) required_slots = self.parking_tracker.used_parking_at(self.squadron.location)
required_slots_string = ( required_slots_string = (
f"Parking slots required: {required_slots}<br/>" f"Parking slots required: {required_slots}<br/>"
if self.gen_settings.squadrons_start_full if self.aircraft_present
else "" else ""
) )
total_slots = self.squadron.location.total_aircraft_parking( total_slots = self.squadron.location.total_aircraft_parking(
@ -446,14 +445,14 @@ class SquadronConfigurationLayout(QVBoxLayout):
coalition: Coalition, coalition: Coalition,
squadrons: list[Squadron], squadrons: list[Squadron],
parking_tracker: AirWingConfigParkingTracker, parking_tracker: AirWingConfigParkingTracker,
gen_settings: GeneratorSettings, aircraft_present: bool,
) -> None: ) -> None:
super().__init__() super().__init__()
self.game = game self.game = game
self.coalition = coalition self.coalition = coalition
self.squadron_configs = [] self.squadron_configs = []
self.parking_tracker = parking_tracker self.parking_tracker = parking_tracker
self.gen_settings = gen_settings self.aircraft_present = aircraft_present
for squadron in squadrons: for squadron in squadrons:
self.add_squadron(squadron) self.add_squadron(squadron)
@ -476,7 +475,11 @@ class SquadronConfigurationLayout(QVBoxLayout):
def add_squadron(self, squadron: Squadron) -> None: def add_squadron(self, squadron: Squadron) -> None:
squadron_config = SquadronConfigurationBox( 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) squadron_config.remove_squadron_signal.connect(self.remove_squadron)
self.squadron_configs.append(squadron_config) self.squadron_configs.append(squadron_config)
@ -493,14 +496,14 @@ class AircraftSquadronsPage(QWidget):
coalition: Coalition, coalition: Coalition,
squadrons: list[Squadron], squadrons: list[Squadron],
parking_tracker: AirWingConfigParkingTracker, parking_tracker: AirWingConfigParkingTracker,
gen_settings: GeneratorSettings, aircraft_present: bool,
) -> None: ) -> None:
super().__init__() super().__init__()
layout = QVBoxLayout() layout = QVBoxLayout()
self.setLayout(layout) self.setLayout(layout)
self.squadrons_config = SquadronConfigurationLayout( 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) self.squadrons_config.config_changed.connect(self.on_squadron_config_changed)
@ -536,14 +539,14 @@ class AircraftSquadronsPanel(QStackedLayout):
game: Game, game: Game,
coalition: Coalition, coalition: Coalition,
parking_tracker: AirWingConfigParkingTracker, parking_tracker: AirWingConfigParkingTracker,
gen_settings: GeneratorSettings, aircraft_present: bool,
) -> None: ) -> None:
super().__init__() super().__init__()
self.game = game self.game = game
self.coalition = coalition self.coalition = coalition
self.parking_tracker = parking_tracker self.parking_tracker = parking_tracker
self.squadrons_pages: dict[AircraftType, AircraftSquadronsPage] = {} 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(): for aircraft, squadrons in self.air_wing.squadrons.items():
self.new_page_for_type(aircraft, squadrons) self.new_page_for_type(aircraft, squadrons)
@ -567,7 +570,7 @@ class AircraftSquadronsPanel(QStackedLayout):
self.coalition, self.coalition,
squadrons, squadrons,
self.parking_tracker, self.parking_tracker,
self.gen_settings, self.aircraft_present,
) )
page.remove_squadron_page.connect(self.remove_page_for_type) page.remove_squadron_page.connect(self.remove_page_for_type)
self.addWidget(page) self.addWidget(page)
@ -657,7 +660,7 @@ class AircraftTypeList(QListView):
class AirWingConfigurationTab(QWidget): class AirWingConfigurationTab(QWidget):
def __init__( def __init__(
self, coalition: Coalition, game: Game, gen_settings: GeneratorSettings self, coalition: Coalition, game: Game, aircraft_present: bool
) -> None: ) -> None:
super().__init__() super().__init__()
@ -678,7 +681,7 @@ class AirWingConfigurationTab(QWidget):
layout.addWidget(add_button, 2, 1, 1, 1) layout.addWidget(add_button, 2, 1, 1, 1)
self.squadrons_panel = AircraftSquadronsPanel( 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) self.squadrons_panel.page_removed.connect(self.type_list.remove_aircraft_type)
layout.addLayout(self.squadrons_panel, 1, 3, 2, 1) layout.addLayout(self.squadrons_panel, 1, 3, 2, 1)
@ -752,7 +755,7 @@ class AirWingConfigurationTab(QWidget):
class AirWingConfigurationDialog(QDialog): class AirWingConfigurationDialog(QDialog):
"""Dialog window for air wing configuration.""" """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) super().__init__(parent)
self.setMinimumSize(1024, 768) self.setMinimumSize(1024, 768)
self.setWindowTitle(f"Air Wing Configuration") self.setWindowTitle(f"Air Wing Configuration")
@ -763,7 +766,8 @@ class AirWingConfigurationDialog(QDialog):
doc_label = QLabel( doc_label = QLabel(
"Use this opportunity to customize the squadrons available to your " "Use this opportunity to customize the squadrons available to your "
"coalition. <strong>This is your only opportunity to make changes.</strong>" "coalition. You can make changes at a later stage if "
'the "Enable Air Wing adjustments" cheat option is enabled.'
"<br /><br />" "<br /><br />"
"To accept your changes and continue, close this window." "To accept your changes and continue, close this window."
) )
@ -775,7 +779,7 @@ class AirWingConfigurationDialog(QDialog):
self.tabs = [] self.tabs = []
for coalition in game.coalitions: 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" name = "Blue" if coalition.player else "Red"
self.tab_widget.addTab(coalition_tab, name) self.tab_widget.addTab(coalition_tab, name)
self.tabs.append(coalition_tab) self.tabs.append(coalition_tab)
@ -804,7 +808,7 @@ class AirWingConfigurationDialog(QDialog):
result = QMessageBox.information( result = QMessageBox.information(
None, None,
"Discard changes?", "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.Yes,
QMessageBox.StandardButton.No, QMessageBox.StandardButton.No,
) )

View File

@ -15,6 +15,7 @@ from PySide6.QtWidgets import (
QTableWidgetItem, QTableWidgetItem,
QVBoxLayout, QVBoxLayout,
QWidget, QWidget,
QPushButton,
) )
from game.ato.flight import Flight from game.ato.flight import Flight
@ -23,6 +24,7 @@ from game.theater import ConflictTheater
from qt_ui.delegates import TwoColumnRowDelegate from qt_ui.delegates import TwoColumnRowDelegate
from qt_ui.models import AirWingModel, AtoModel, GameModel, SquadronModel from qt_ui.models import AirWingModel, AtoModel, GameModel, SquadronModel
from qt_ui.simcontroller import SimController from qt_ui.simcontroller import SimController
from qt_ui.windows.AirWingConfigurationDialog import AirWingConfigurationDialog
from qt_ui.windows.SquadronDialog import SquadronDialog from qt_ui.windows.SquadronDialog import SquadronDialog
@ -245,6 +247,18 @@ class AirWingTabs(QTabWidget):
) )
self.addTab(AirInventoryView(game_model), "Inventory") 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): class AirWingDialog(QDialog):
"""Dialog window showing the player's air wing.""" """Dialog window showing the player's air wing."""

View File

@ -139,7 +139,7 @@ class NewGameWizard(QtWidgets.QWizard):
self.generatedGame = generator.generate() self.generatedGame = generator.generate()
AirWingConfigurationDialog( AirWingConfigurationDialog(
self.generatedGame, generator.generator_settings, self self.generatedGame, generator.generator_settings.squadrons_start_full, self
).exec_() ).exec_()
g = self.generatedGame g = self.generatedGame

View File

@ -54,34 +54,34 @@ class CheatSettingsBox(QGroupBox):
self.main_layout = QVBoxLayout() self.main_layout = QVBoxLayout()
self.setLayout(self.main_layout) self.setLayout(self.main_layout)
# ATO
self.red_ato_checkbox = QCheckBox() self.red_ato_checkbox = QCheckBox()
self.red_ato_checkbox.setChecked(sc.settings.show_red_ato) self.red_ato_checkbox.setChecked(sc.settings.show_red_ato)
self.red_ato_checkbox.toggled.connect(apply_settings) 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 = QCheckBox()
self.frontline_cheat_checkbox.setChecked(sc.settings.enable_frontline_cheats) self.frontline_cheat_checkbox.setChecked(sc.settings.enable_frontline_cheats)
self.frontline_cheat_checkbox.toggled.connect(apply_settings) 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 = QCheckBox()
self.base_capture_cheat_checkbox.setChecked( self.base_capture_cheat_checkbox.setChecked(
sc.settings.enable_base_capture_cheat sc.settings.enable_base_capture_cheat
) )
self.base_capture_cheat_checkbox.toggled.connect(apply_settings) 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( self.base_capture_cheat = QLabeledWidget(
"Enable Base Capture Cheat:", self.base_capture_cheat_checkbox "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 = QCheckBox()
self.base_runway_state_cheat_checkbox.setChecked( self.base_runway_state_cheat_checkbox.setChecked(
sc.settings.enable_runway_state_cheat 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( self.transfer_cheat = QLabeledWidget(
"Enable Instant Squadron Transfer Cheat:", self.transfer_cheat_checkbox "Enable Instant Squadron Transfer Cheat:", self.transfer_cheat_checkbox
) )
self.main_layout.addLayout(self.transfer_cheat) 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 @property
def show_red_ato(self) -> bool: def show_red_ato(self) -> bool:
return self.red_ato_checkbox.isChecked() return self.red_ato_checkbox.isChecked()
@ -119,6 +133,10 @@ class CheatSettingsBox(QGroupBox):
def enable_runway_state_cheat(self) -> bool: def enable_runway_state_cheat(self) -> bool:
return self.base_runway_state_cheat_checkbox.isChecked() 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): class AutoSettingsLayout(QGridLayout):
def __init__( def __init__(
@ -474,6 +492,9 @@ class QSettingsWidget(QtWidgets.QWizardPage, SettingsContainer):
self.settings.enable_runway_state_cheat = ( self.settings.enable_runway_state_cheat = (
self.cheat_options.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: if self.game:
events = GameUpdateEvents() events = GameUpdateEvents()