From 11a8ff7f70d4600510d8fe481909ec600f1f428f Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 27 May 2021 15:34:27 -0700 Subject: [PATCH] Add settings UI for auto-ato behavior. https://github.com/dcs-liberation/dcs_liberation/issues/276 https://github.com/dcs-liberation/dcs_liberation/issues/315 --- game/settings.py | 11 ++ qt_ui/windows/settings/QSettingsWindow.py | 142 ++++++++++++++++------ 2 files changed, 117 insertions(+), 36 deletions(-) diff --git a/game/settings.py b/game/settings.py index 2b53f8dd..247ae10b 100644 --- a/game/settings.py +++ b/game/settings.py @@ -1,10 +1,19 @@ from dataclasses import dataclass, field from datetime import timedelta +from enum import Enum, unique from typing import Dict, Optional from dcs.forcedoptions import ForcedOptions +@unique +class AutoAtoBehavior(Enum): + Disabled = "Disabled" + Never = "Never assign player pilots" + Default = "No preference" + Prefer = "Prefer player pilots" + + @dataclass class Settings: @@ -37,6 +46,8 @@ class Settings: disable_legacy_aewc: bool = False generate_dark_kneeboard: bool = False invulnerable_player_pilots: bool = True + auto_ato_behavior: AutoAtoBehavior = AutoAtoBehavior.Default + auto_ato_player_missions_asap: bool = False # Performance oriented perf_red_alert_state: bool = True diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 9701e5c2..7f406e17 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -23,7 +23,7 @@ from dcs.forcedoptions import ForcedOptions import qt_ui.uiconstants as CONST from game.game import Game from game.infos.information import Information -from game.settings import Settings +from game.settings import Settings, AutoAtoBehavior from qt_ui.widgets.QLabeledWidget import QLabeledWidget from qt_ui.widgets.spinsliders import TenthsSpinSlider, TimeInputs from qt_ui.windows.GameUpdateSignal import GameUpdateSignal @@ -75,6 +75,110 @@ class CheatSettingsBox(QGroupBox): return self.base_capture_cheat_checkbox.isChecked() +class AutoAtoBehaviorSelector(QComboBox): + def __init__(self, default: AutoAtoBehavior) -> None: + super().__init__() + + for behavior in AutoAtoBehavior: + self.addItem(behavior.value, behavior) + self.setCurrentText(default.value) + + +class HqAutomationSettingsBox(QGroupBox): + def __init__(self, game: Game) -> None: + super().__init__("HQ Automation") + self.game = game + + layout = QGridLayout() + self.setLayout(layout) + + runway_repair = QCheckBox() + runway_repair.setChecked(self.game.settings.automate_runway_repair) + runway_repair.toggled.connect(self.set_runway_automation) + + layout.addWidget(QLabel("Automate runway repairs"), 0, 0) + layout.addWidget(runway_repair, 0, 1, Qt.AlignRight) + + front_line = QCheckBox() + front_line.setChecked(self.game.settings.automate_front_line_reinforcements) + front_line.toggled.connect(self.set_front_line_automation) + + layout.addWidget(QLabel("Automate front-line purchases"), 1, 0) + layout.addWidget(front_line, 1, 1, Qt.AlignRight) + + self.automate_aircraft_reinforcements = QCheckBox() + self.automate_aircraft_reinforcements.setChecked( + self.game.settings.automate_aircraft_reinforcements + ) + self.automate_aircraft_reinforcements.toggled.connect( + self.set_aircraft_automation + ) + + layout.addWidget(QLabel("Automate aircraft purchases"), 2, 0) + layout.addWidget(self.automate_aircraft_reinforcements, 2, 1, Qt.AlignRight) + + self.auto_ato_behavior = AutoAtoBehaviorSelector( + self.game.settings.auto_ato_behavior + ) + self.auto_ato_behavior.currentIndexChanged.connect(self.set_auto_ato_behavior) + layout.addWidget( + QLabel( + "Automatic package planning behavior
" + "Aircraft auto-purchase is directed by the auto-planner,
" + "so disabling auto-planning disables auto-purchase.
" + ), + 3, + 0, + ) + layout.addWidget(self.auto_ato_behavior, 3, 1) + + self.auto_ato_player_missions_asap = QCheckBox() + self.auto_ato_player_missions_asap.setChecked( + self.game.settings.auto_ato_player_missions_asap + ) + self.auto_ato_player_missions_asap.toggled.connect( + self.set_auto_ato_player_missions_asap + ) + + layout.addWidget( + QLabel("Automatically generated packages with players are scheduled ASAP"), + 4, + 0, + ) + layout.addWidget(self.auto_ato_player_missions_asap, 4, 1, Qt.AlignRight) + + def set_runway_automation(self, value: bool) -> None: + self.game.settings.automate_runway_repair = value + + def set_front_line_automation(self, value: bool) -> None: + self.game.settings.automate_front_line_reinforcements = value + + def set_aircraft_automation(self, value: bool) -> None: + self.game.settings.automate_aircraft_reinforcements = value + + def set_auto_ato_behavior(self, index: int) -> None: + behavior = self.auto_ato_behavior.itemData(index) + self.game.settings.auto_ato_behavior = behavior + if behavior in (AutoAtoBehavior.Disabled, AutoAtoBehavior.Never): + self.auto_ato_player_missions_asap.setChecked(False) + self.auto_ato_player_missions_asap.setEnabled(False) + if behavior is AutoAtoBehavior.Disabled: + self.automate_aircraft_reinforcements.setChecked(False) + self.automate_aircraft_reinforcements.setEnabled(False) + else: + self.auto_ato_player_missions_asap.setEnabled(True) + self.auto_ato_player_missions_asap.setChecked( + self.game.settings.auto_ato_player_missions_asap + ) + self.automate_aircraft_reinforcements.setEnabled(True) + self.automate_aircraft_reinforcements.setChecked( + self.game.settings.automate_aircraft_reinforcements + ) + + def set_auto_ato_player_missions_asap(self, value: bool) -> None: + self.game.settings.auto_ato_player_missions_asap = value + + START_TYPE_TOOLTIP = "Selects the start type used for AI aircraft." @@ -388,41 +492,7 @@ class QSettingsWindow(QDialog): general_layout.addWidget(old_awac_label, 1, 0) general_layout.addWidget(old_awac, 1, 1, Qt.AlignRight) - automation = QGroupBox("HQ Automation") - campaign_layout.addWidget(automation) - - automation_layout = QGridLayout() - automation.setLayout(automation_layout) - - def set_runway_automation(value: bool) -> None: - self.game.settings.automate_runway_repair = value - - def set_front_line_automation(value: bool) -> None: - self.game.settings.automate_front_line_reinforcements = value - - def set_aircraft_automation(value: bool) -> None: - self.game.settings.automate_aircraft_reinforcements = value - - runway_repair = QCheckBox() - runway_repair.setChecked(self.game.settings.automate_runway_repair) - runway_repair.toggled.connect(set_runway_automation) - - automation_layout.addWidget(QLabel("Automate runway repairs"), 0, 0) - automation_layout.addWidget(runway_repair, 0, 1, Qt.AlignRight) - - front_line = QCheckBox() - front_line.setChecked(self.game.settings.automate_front_line_reinforcements) - front_line.toggled.connect(set_front_line_automation) - - automation_layout.addWidget(QLabel("Automate front-line purchases"), 1, 0) - automation_layout.addWidget(front_line, 1, 1, Qt.AlignRight) - - aircraft = QCheckBox() - aircraft.setChecked(self.game.settings.automate_aircraft_reinforcements) - aircraft.toggled.connect(set_aircraft_automation) - - automation_layout.addWidget(QLabel("Automate aircraft purchases"), 2, 0) - automation_layout.addWidget(aircraft, 2, 1, Qt.AlignRight) + campaign_layout.addWidget(HqAutomationSettingsBox(self.game)) def initGeneratorLayout(self): self.generatorPage = QWidget()