From 25d0dcd08e9c9b7ccc3ca975e30702a711e1f32c Mon Sep 17 00:00:00 2001 From: RndName Date: Thu, 7 Apr 2022 19:51:49 +0200 Subject: [PATCH] Allow campaign designer to set default economy values default starting money and income multiplier can be set in campaign.yaml bumps campaign Version to 10.1 --- game/campaignloader/campaign.py | 11 +++++ game/version.py | 9 +++- qt_ui/main.py | 3 +- qt_ui/widgets/spinsliders.py | 2 +- qt_ui/windows/newgame/QNewGameWizard.py | 58 ++++++++++++++++--------- 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/game/campaignloader/campaign.py b/game/campaignloader/campaign.py index 72bd187b..89d6dbb8 100644 --- a/game/campaignloader/campaign.py +++ b/game/campaignloader/campaign.py @@ -31,6 +31,7 @@ PERF_FRIENDLY = 0 PERF_MEDIUM = 1 PERF_HARD = 2 PERF_NASA = 3 +DEFAULT_BUDGET = 2000 @dataclass(frozen=True) @@ -48,6 +49,12 @@ class Campaign: recommended_player_faction: str recommended_enemy_faction: str recommended_start_date: Optional[datetime.date] + + recommended_player_money: int + recommended_enemy_money: int + recommended_player_income_multiplier: float + recommended_enemy_income_multiplier: float + performance: int data: Dict[str, Any] path: Path @@ -95,6 +102,10 @@ class Campaign: data.get("recommended_player_faction", "USA 2005"), data.get("recommended_enemy_faction", "Russia 1990"), start_date, + data.get("recommended_player_money", DEFAULT_BUDGET), + data.get("recommended_enemy_money", DEFAULT_BUDGET), + data.get("recommended_player_income_multiplier", 1.0), + data.get("recommended_enemy_income_multiplier", 1.0), data.get("performance", 0), data, path, diff --git a/game/version.py b/game/version.py index 7ff79b3f..0381bf0d 100644 --- a/game/version.py +++ b/game/version.py @@ -135,4 +135,11 @@ VERSION = _build_version_string() #: This removes the randomization of the orientation from the generation. #: Most campaigns will not need any updates and will work out of the box. #: -CAMPAIGN_FORMAT_VERSION = (10, 0) +#: Version 10.1 +#: * Campaign designers can now define the recommended economy settings: +#: `recommended_player_money: 2000`. +#: `recommended_enemy_money: 2000`. +#: `recommended_player_income_multiplier: 1.0`. +#: `recommended_enemy_income_multiplier: 1.0`. +#: +CAMPAIGN_FORMAT_VERSION = (10, 1) diff --git a/qt_ui/main.py b/qt_ui/main.py index a52b5f72..9e55e676 100644 --- a/qt_ui/main.py +++ b/qt_ui/main.py @@ -14,7 +14,7 @@ from PySide2.QtWidgets import QApplication, QCheckBox, QSplashScreen from dcs.payloads import PayloadDirectories from game import Game, VERSION, persistency -from game.campaignloader.campaign import Campaign +from game.campaignloader.campaign import Campaign, DEFAULT_BUDGET from game.data.weapons import Pylon, Weapon, WeaponGroup from game.dcs.aircrafttype import AircraftType from game.factions import FACTIONS @@ -32,7 +32,6 @@ from qt_ui import ( ) from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.QLiberationWindow import QLiberationWindow -from qt_ui.windows.newgame.QNewGameWizard import DEFAULT_BUDGET from qt_ui.windows.preferences.QLiberationFirstStartWindow import ( QLiberationFirstStartWindow, ) diff --git a/qt_ui/widgets/spinsliders.py b/qt_ui/widgets/spinsliders.py index 1f808f2a..ebec9dc6 100644 --- a/qt_ui/widgets/spinsliders.py +++ b/qt_ui/widgets/spinsliders.py @@ -17,7 +17,7 @@ class FloatSpinSlider(QHBoxLayout): slider = QSlider(Qt.Horizontal) slider.setMinimum(int(minimum * divisor)) slider.setMaximum(int(maximum * divisor)) - slider.setValue(initial) + slider.setValue(int(initial * divisor)) self.spinner = FloatSpinner(divisor, minimum, maximum, initial) slider.valueChanged.connect(lambda x: self.spinner.setValue(x)) self.spinner.valueChanged.connect(lambda x: slider.setValue(x)) diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 8b9b7eeb..8bc03e8f 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -5,11 +5,11 @@ from datetime import datetime, timedelta from typing import List from PySide2 import QtGui, QtWidgets -from PySide2.QtCore import QDate, QItemSelectionModel, QPoint, Qt +from PySide2.QtCore import QDate, QItemSelectionModel, QPoint, Qt, Signal from PySide2.QtWidgets import QCheckBox, QLabel, QTextEdit, QVBoxLayout from jinja2 import Environment, FileSystemLoader, select_autoescape -from game.campaignloader.campaign import Campaign +from game.campaignloader.campaign import Campaign, DEFAULT_BUDGET from game.factions import FACTIONS, Faction from game.settings import Settings from game.theater.start_generator import GameGenerator, GeneratorSettings, ModSettings @@ -29,7 +29,6 @@ jinja_env = Environment( lstrip_blocks=True, ) -DEFAULT_BUDGET = 2000 DEFAULT_MISSION_LENGTH: timedelta = timedelta(minutes=60) @@ -93,7 +92,13 @@ class NewGameWizard(QtWidgets.QWizard): self.addPage(self.theater_page) self.addPage(self.faction_selection_page) self.addPage(GeneratorOptions()) - self.addPage(DifficultyAndAutomationOptions()) + self.difficulty_page = DifficultyAndAutomationOptions() + + # Update difficulty page on campaign select + self.theater_page.campaign_selected.connect( + lambda c: self.difficulty_page.set_campaign_values(c) + ) + self.addPage(self.difficulty_page) self.addPage(ConclusionPage()) self.setPixmap( @@ -331,6 +336,8 @@ class FactionSelection(QtWidgets.QWizardPage): class TheaterConfiguration(QtWidgets.QWizardPage): + campaign_selected = Signal(Campaign) + def __init__( self, campaigns: List[Campaign], @@ -445,6 +452,8 @@ class TheaterConfiguration(QtWidgets.QWizardPage): else: timePeriodPreset.setChecked(True) + self.campaign_selected.emit(campaign) + self.campaignList.selectionModel().setCurrentIndex( self.campaignList.indexAt(QPoint(1, 1)), QItemSelectionModel.Rows ) @@ -489,19 +498,18 @@ class TheaterConfiguration(QtWidgets.QWizardPage): class BudgetInputs(QtWidgets.QGridLayout): - def __init__(self, label: str) -> None: + def __init__(self, label: str, value: int) -> None: super().__init__() self.addWidget(QtWidgets.QLabel(label), 0, 0) minimum = 0 maximum = 5000 - initial = DEFAULT_BUDGET slider = QtWidgets.QSlider(Qt.Horizontal) slider.setMinimum(minimum) slider.setMaximum(maximum) - slider.setValue(initial) - self.starting_money = CurrencySpinner(minimum, maximum, initial) + slider.setValue(value) + self.starting_money = CurrencySpinner(minimum, maximum, value) slider.valueChanged.connect(lambda x: self.starting_money.setValue(x)) self.starting_money.valueChanged.connect(lambda x: slider.setValue(x)) @@ -530,22 +538,22 @@ class DifficultyAndAutomationOptions(QtWidgets.QWizardPage): economy_group.setLayout(economy_layout) economy_layout.addWidget(QLabel("Player income multiplier")) - player_income = FloatSpinSlider(0, 5, 1, divisor=10) - self.registerField("player_income_multiplier", player_income.spinner) - economy_layout.addLayout(player_income) + self.player_income = FloatSpinSlider(0, 5, 1, divisor=10) + self.registerField("player_income_multiplier", self.player_income.spinner) + economy_layout.addLayout(self.player_income) economy_layout.addWidget(QLabel("Enemy income multiplier")) - enemy_income = FloatSpinSlider(0, 5, 1, divisor=10) - self.registerField("enemy_income_multiplier", enemy_income.spinner) - economy_layout.addLayout(enemy_income) + self.enemy_income = FloatSpinSlider(0, 5, 1, divisor=10) + self.registerField("enemy_income_multiplier", self.enemy_income.spinner) + economy_layout.addLayout(self.enemy_income) - player_budget = BudgetInputs("Player starting budget") - self.registerField("starting_money", player_budget.starting_money) - economy_layout.addLayout(player_budget) + self.player_budget = BudgetInputs("Player starting budget", DEFAULT_BUDGET) + self.registerField("starting_money", self.player_budget.starting_money) + economy_layout.addLayout(self.player_budget) - enemy_budget = BudgetInputs("Enemy starting budget") - self.registerField("enemy_starting_money", enemy_budget.starting_money) - economy_layout.addLayout(enemy_budget) + self.enemy_budget = BudgetInputs("Enemy starting budget", DEFAULT_BUDGET) + self.registerField("enemy_starting_money", self.enemy_budget.starting_money) + economy_layout.addLayout(self.enemy_budget) assist_group = QtWidgets.QGroupBox("Player assists") layout.addWidget(assist_group) @@ -569,6 +577,16 @@ class DifficultyAndAutomationOptions(QtWidgets.QWizardPage): self.setLayout(layout) + def set_campaign_values(self, campaign: Campaign) -> None: + self.player_budget.starting_money.setValue(campaign.recommended_player_money) + self.enemy_budget.starting_money.setValue(campaign.recommended_enemy_money) + self.player_income.spinner.setValue( + int(campaign.recommended_player_income_multiplier * 10) + ) + self.enemy_income.spinner.setValue( + int(campaign.recommended_enemy_income_multiplier * 10) + ) + class GeneratorOptions(QtWidgets.QWizardPage): def __init__(self, parent=None):