diff --git a/game/settings.py b/game/settings.py index 0e6f968a..cbc6108c 100644 --- a/game/settings.py +++ b/game/settings.py @@ -33,6 +33,10 @@ class Settings: disable_legacy_aewc: bool = False generate_dark_kneeboard: bool = False + #: Feature flag for new ground unit behavior. Old campaigns are sufficiently broken + #: that we need to implement this conditionally for the time being. + enable_new_ground_unit_recruitment: bool = False + # Performance oriented perf_red_alert_state: bool = True perf_smoke_gen: bool = True diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index c3cac473..bfd34a21 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -18,6 +18,9 @@ from qt_ui.windows.newgame.QCampaignList import ( QCampaignList, load_campaigns, ) +from qt_ui.windows.settings.QSettingsWindow import ( + NEW_GROUND_UNIT_RECRUITMENT_BEHAVIOR_LABEL, +) jinja_env = Environment( loader=FileSystemLoader("resources/ui/templates"), @@ -84,6 +87,9 @@ class NewGameWizard(QtWidgets.QWizard): ), automate_aircraft_reinforcements=self.field("automate_aircraft_purchases"), supercarrier=self.field("supercarrier"), + enable_new_ground_unit_recruitment=self.field( + "new_ground_unit_recruitment" + ), ) generator_settings = GeneratorSettings( start_date=start_date, @@ -519,6 +525,20 @@ class DifficultyAndAutomationOptions(QtWidgets.QWizardPage): self.registerField("automate_aircraft_purchases", aircraft) assist_layout.addWidget(aircraft, 2, 1, Qt.AlignRight) + flags_group = QtWidgets.QGroupBox("Feature flags") + layout.addWidget(flags_group) + flags_layout = QtWidgets.QGridLayout() + flags_group.setLayout(flags_layout) + + new_ground_unit_recruitment_label = QtWidgets.QLabel( + NEW_GROUND_UNIT_RECRUITMENT_BEHAVIOR_LABEL + ) + new_ground_unit_recruitment_label.setOpenExternalLinks(True) + flags_layout.addWidget(new_ground_unit_recruitment_label, 0, 0) + new_ground_unit_recruitment = QtWidgets.QCheckBox() + self.registerField("new_ground_unit_recruitment", new_ground_unit_recruitment) + flags_layout.addWidget(new_ground_unit_recruitment, 0, 1, Qt.AlignRight) + self.setLayout(layout) diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 7432c341..d328b74c 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -1,22 +1,22 @@ import logging from typing import Callable -from PySide2.QtCore import QSize, Qt, QItemSelectionModel, QPoint -from PySide2.QtGui import QStandardItemModel, QStandardItem +from PySide2.QtCore import QItemSelectionModel, QPoint, QSize, Qt +from PySide2.QtGui import QStandardItem, QStandardItemModel from PySide2.QtWidgets import ( - QLabel, + QAbstractItemView, + QCheckBox, + QComboBox, QDialog, QGridLayout, - QListView, - QStackedLayout, - QComboBox, - QWidget, - QAbstractItemView, - QPushButton, QGroupBox, - QCheckBox, - QVBoxLayout, + QLabel, + QListView, + QPushButton, QSpinBox, + QStackedLayout, + QVBoxLayout, + QWidget, ) from dcs.forcedoptions import ForcedOptions @@ -77,6 +77,17 @@ class CheatSettingsBox(QGroupBox): START_TYPE_TOOLTIP = "Selects the start type used for AI aircraft." +NEW_GROUND_UNIT_RECRUITMENT_TOOLTIP = ( + "If checked, the new ground unit recruitment behavior will be used. Ground " + "units may only be purchased at factories or off-map spawns and must " + "travel to the front line." +) +NEW_GROUND_UNIT_RECRUITMENT_BEHAVIOR_LABEL = ( + "Enable new ground unit recruitment behavior (WIP)
" + '' + 'More information.' +) + class StartTypeComboBox(QComboBox): def __init__(self, settings: Settings) -> None: @@ -367,6 +378,27 @@ class QSettingsWindow(QDialog): general_layout.addWidget(old_awac_label, 1, 0) general_layout.addWidget(old_awac, 1, 1, Qt.AlignRight) + def set_new_ground_unit_recruitment(value: bool) -> None: + self.game.settings.enable_new_ground_unit_recruitment = value + + new_ground_unit_recruitment_behavior_label = QLabel( + NEW_GROUND_UNIT_RECRUITMENT_BEHAVIOR_LABEL + ) + new_ground_unit_recruitment_behavior_label.setToolTip( + NEW_GROUND_UNIT_RECRUITMENT_TOOLTIP + ) + new_ground_unit_recruitment_behavior_label.setOpenExternalLinks(True) + + new_ground_unit_recruitment = QCheckBox() + new_ground_unit_recruitment.setToolTip(NEW_GROUND_UNIT_RECRUITMENT_TOOLTIP) + new_ground_unit_recruitment.setChecked( + self.game.settings.enable_new_ground_unit_recruitment + ) + new_ground_unit_recruitment.toggled.connect(set_new_ground_unit_recruitment) + + general_layout.addWidget(new_ground_unit_recruitment_behavior_label, 2, 0) + general_layout.addWidget(new_ground_unit_recruitment, 2, 1, Qt.AlignRight) + automation = QGroupBox("HQ Automation") campaign_layout.addWidget(automation)