From 9db41270f3442c8c7f01f5047eeca5c99271130d Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Fri, 16 Oct 2020 13:39:59 -0700 Subject: [PATCH] Add red ATO cheat option, show red flight plans. --- game/settings.py | 11 ++++++ qt_ui/models.py | 12 ++++-- qt_ui/widgets/map/QLiberationMap.py | 2 + qt_ui/windows/settings/QSettingsWindow.py | 47 ++++++++++++++++++++--- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/game/settings.py b/game/settings.py index 4566ad0f..0f93c729 100644 --- a/game/settings.py +++ b/game/settings.py @@ -40,4 +40,15 @@ class Settings: self.perf_culling = False self.perf_culling_distance = 100 + # Cheating + self.show_red_ato = False + def __setstate__(self, state) -> None: + # __setstate__ is called with the dict of the object being unpickled. We + # can provide save compatibility for new settings options (which + # normally would not be present in the unpickled object) by creating a + # new settings object, updating it with the unpickled state, and + # updating our dict with that. + new_state = Settings().__dict__ + new_state.update(state) + self.__dict__.update(new_state) diff --git a/qt_ui/models.py b/qt_ui/models.py index 27d75e7b..6480d933 100644 --- a/qt_ui/models.py +++ b/qt_ui/models.py @@ -235,7 +235,7 @@ class AtoModel(QAbstractListModel): """Returns the package at the given index.""" return self.ato.packages[index.row()] - def replace_from_game(self, game: Optional[Game]) -> None: + def replace_from_game(self, game: Optional[Game], player: bool) -> None: """Updates the ATO object to match the updated game object. If the game is None (as is the case when no game has been loaded), an @@ -245,7 +245,10 @@ class AtoModel(QAbstractListModel): self.game = game self.package_models.clear() if self.game is not None: - self.ato = game.blue_ato + if player: + self.ato = game.blue_ato + else: + self.ato = game.red_ato else: self.ato = AirTaskingOrder() self.endResetModel() @@ -269,8 +272,8 @@ class GameModel: """ def __init__(self) -> None: self.game: Optional[Game] = None - # TODO: Add red ATO model, add cheat option to show red flight plan. self.ato_model = AtoModel(self.game, AirTaskingOrder()) + self.red_ato_model = AtoModel(self.game, AirTaskingOrder()) def set(self, game: Optional[Game]) -> None: """Updates the managed Game object. @@ -281,4 +284,5 @@ class GameModel: loaded. """ self.game = game - self.ato_model.replace_from_game(self.game) + self.ato_model.replace_from_game(self.game, player=True) + self.red_ato_model.replace_from_game(self.game, player=False) diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 20f9e151..dde0893e 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -255,6 +255,8 @@ class QLiberationMap(QGraphicsView): if DisplayOptions.flight_paths.hide: return packages = list(self.game_model.ato_model.packages) + if self.game.settings.show_red_ato: + packages.extend(self.game_model.red_ato_model.packages) for p_idx, package_model in enumerate(packages): for f_idx, flight in enumerate(package_model.flights): selected = (p_idx, f_idx) == self.selected_flight diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 6ccdb226..aafa52a9 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -1,18 +1,50 @@ import logging +from typing import Callable from PySide2.QtCore import QSize, Qt, QItemSelectionModel, QPoint from PySide2.QtGui import QStandardItemModel, QStandardItem -from PySide2.QtWidgets import QLabel, QDialog, QGridLayout, QListView, QStackedLayout, QComboBox, QWidget, \ - QAbstractItemView, QPushButton, QGroupBox, QCheckBox, QVBoxLayout, QSpinBox +from PySide2.QtWidgets import ( + QLabel, + QDialog, + QGridLayout, + QListView, + QStackedLayout, + QComboBox, + QWidget, + QAbstractItemView, + QPushButton, + QGroupBox, + QCheckBox, + QVBoxLayout, + QSpinBox, +) from dcs.forcedoptions import ForcedOptions import qt_ui.uiconstants as CONST from game.game import Game from game.infos.information import Information +from qt_ui.widgets.QLabeledWidget import QLabeledWidget from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.finances.QFinancesMenu import QHorizontalSeparationLine +class CheatSettingsBox(QGroupBox): + def __init__(self, game: Game, apply_settings: Callable[[], None]) -> None: + super().__init__("Cheat Settings") + self.main_layout = QVBoxLayout() + self.setLayout(self.main_layout) + + self.red_ato_checkbox = QCheckBox() + self.red_ato_checkbox.setChecked(game.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) + + @property + def show_red_ato(self) -> bool: + return self.red_ato_checkbox.isChecked() + + class QSettingsWindow(QDialog): def __init__(self, game: Game): @@ -263,9 +295,12 @@ class QSettingsWindow(QDialog): def initCheatLayout(self): self.cheatPage = QWidget() - self.cheatLayout = QGridLayout() + self.cheatLayout = QVBoxLayout() self.cheatPage.setLayout(self.cheatLayout) + self.cheat_options = CheatSettingsBox(self.game, self.applySettings) + self.cheatLayout.addWidget(self.cheat_options) + self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() @@ -281,7 +316,7 @@ class QSettingsWindow(QDialog): btn.setProperty("style", "btn-danger") btn.clicked.connect(self.cheatLambda(amount)) self.moneyCheatBoxLayout.addWidget(btn, i/2, i%2) - self.cheatLayout.addWidget(self.moneyCheatBox, 0, 0) + self.cheatLayout.addWidget(self.moneyCheatBox, stretch=1) def cheatLambda(self, amount): return lambda: self.cheatMoney(amount) @@ -307,8 +342,6 @@ class QSettingsWindow(QDialog): self.game.settings.include_jtac_if_available = self.include_jtac_if_available.isChecked() self.game.settings.jtac_smoke_on = self.jtac_smoke_on.isChecked() - print(self.game.settings.map_coalition_visibility) - self.game.settings.supercarrier = self.supercarrier.isChecked() self.game.settings.perf_red_alert_state = self.red_alert.isChecked() @@ -322,6 +355,8 @@ class QSettingsWindow(QDialog): self.game.settings.perf_culling = self.culling.isChecked() self.game.settings.perf_culling_distance = int(self.culling_distance.value()) + self.game.settings.show_red_ato = self.cheat_options.show_red_ato + GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self):