Add red ATO cheat option, show red flight plans.

This commit is contained in:
Dan Albert 2020-10-16 13:39:59 -07:00
parent e4852c74ab
commit 9db41270f3
4 changed files with 62 additions and 10 deletions

View File

@ -40,4 +40,15 @@ class Settings:
self.perf_culling = False self.perf_culling = False
self.perf_culling_distance = 100 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)

View File

@ -235,7 +235,7 @@ class AtoModel(QAbstractListModel):
"""Returns the package at the given index.""" """Returns the package at the given index."""
return self.ato.packages[index.row()] 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. """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 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.game = game
self.package_models.clear() self.package_models.clear()
if self.game is not None: 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: else:
self.ato = AirTaskingOrder() self.ato = AirTaskingOrder()
self.endResetModel() self.endResetModel()
@ -269,8 +272,8 @@ class GameModel:
""" """
def __init__(self) -> None: def __init__(self) -> None:
self.game: Optional[Game] = 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.ato_model = AtoModel(self.game, AirTaskingOrder())
self.red_ato_model = AtoModel(self.game, AirTaskingOrder())
def set(self, game: Optional[Game]) -> None: def set(self, game: Optional[Game]) -> None:
"""Updates the managed Game object. """Updates the managed Game object.
@ -281,4 +284,5 @@ class GameModel:
loaded. loaded.
""" """
self.game = game 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)

View File

@ -255,6 +255,8 @@ class QLiberationMap(QGraphicsView):
if DisplayOptions.flight_paths.hide: if DisplayOptions.flight_paths.hide:
return return
packages = list(self.game_model.ato_model.packages) 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 p_idx, package_model in enumerate(packages):
for f_idx, flight in enumerate(package_model.flights): for f_idx, flight in enumerate(package_model.flights):
selected = (p_idx, f_idx) == self.selected_flight selected = (p_idx, f_idx) == self.selected_flight

View File

@ -1,18 +1,50 @@
import logging import logging
from typing import Callable
from PySide2.QtCore import QSize, Qt, QItemSelectionModel, QPoint from PySide2.QtCore import QSize, Qt, QItemSelectionModel, QPoint
from PySide2.QtGui import QStandardItemModel, QStandardItem from PySide2.QtGui import QStandardItemModel, QStandardItem
from PySide2.QtWidgets import QLabel, QDialog, QGridLayout, QListView, QStackedLayout, QComboBox, QWidget, \ from PySide2.QtWidgets import (
QAbstractItemView, QPushButton, QGroupBox, QCheckBox, QVBoxLayout, QSpinBox QLabel,
QDialog,
QGridLayout,
QListView,
QStackedLayout,
QComboBox,
QWidget,
QAbstractItemView,
QPushButton,
QGroupBox,
QCheckBox,
QVBoxLayout,
QSpinBox,
)
from dcs.forcedoptions import ForcedOptions from dcs.forcedoptions import ForcedOptions
import qt_ui.uiconstants as CONST import qt_ui.uiconstants as CONST
from game.game import Game from game.game import Game
from game.infos.information import Information from game.infos.information import Information
from qt_ui.widgets.QLabeledWidget import QLabeledWidget
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
from qt_ui.windows.finances.QFinancesMenu import QHorizontalSeparationLine 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): class QSettingsWindow(QDialog):
def __init__(self, game: Game): def __init__(self, game: Game):
@ -263,9 +295,12 @@ class QSettingsWindow(QDialog):
def initCheatLayout(self): def initCheatLayout(self):
self.cheatPage = QWidget() self.cheatPage = QWidget()
self.cheatLayout = QGridLayout() self.cheatLayout = QVBoxLayout()
self.cheatPage.setLayout(self.cheatLayout) 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 = QGroupBox("Money Cheat")
self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBox.setAlignment(Qt.AlignTop)
self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBoxLayout = QGridLayout()
@ -281,7 +316,7 @@ class QSettingsWindow(QDialog):
btn.setProperty("style", "btn-danger") btn.setProperty("style", "btn-danger")
btn.clicked.connect(self.cheatLambda(amount)) btn.clicked.connect(self.cheatLambda(amount))
self.moneyCheatBoxLayout.addWidget(btn, i/2, i%2) 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): def cheatLambda(self, amount):
return lambda: self.cheatMoney(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.include_jtac_if_available = self.include_jtac_if_available.isChecked()
self.game.settings.jtac_smoke_on = self.jtac_smoke_on.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.supercarrier = self.supercarrier.isChecked()
self.game.settings.perf_red_alert_state = self.red_alert.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 = self.culling.isChecked()
self.game.settings.perf_culling_distance = int(self.culling_distance.value()) 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) GameUpdateSignal.get_instance().updateGame(self.game)
def onSelectionChanged(self): def onSelectionChanged(self):