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
This commit is contained in:
RndName 2022-04-07 19:51:49 +02:00
parent 1d20e6277e
commit 25d0dcd08e
5 changed files with 59 additions and 24 deletions

View File

@ -31,6 +31,7 @@ PERF_FRIENDLY = 0
PERF_MEDIUM = 1 PERF_MEDIUM = 1
PERF_HARD = 2 PERF_HARD = 2
PERF_NASA = 3 PERF_NASA = 3
DEFAULT_BUDGET = 2000
@dataclass(frozen=True) @dataclass(frozen=True)
@ -48,6 +49,12 @@ class Campaign:
recommended_player_faction: str recommended_player_faction: str
recommended_enemy_faction: str recommended_enemy_faction: str
recommended_start_date: Optional[datetime.date] 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 performance: int
data: Dict[str, Any] data: Dict[str, Any]
path: Path path: Path
@ -95,6 +102,10 @@ class Campaign:
data.get("recommended_player_faction", "USA 2005"), data.get("recommended_player_faction", "USA 2005"),
data.get("recommended_enemy_faction", "Russia 1990"), data.get("recommended_enemy_faction", "Russia 1990"),
start_date, 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.get("performance", 0),
data, data,
path, path,

View File

@ -135,4 +135,11 @@ VERSION = _build_version_string()
#: This removes the randomization of the orientation from the generation. #: This removes the randomization of the orientation from the generation.
#: Most campaigns will not need any updates and will work out of the box. #: 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)

View File

@ -14,7 +14,7 @@ from PySide2.QtWidgets import QApplication, QCheckBox, QSplashScreen
from dcs.payloads import PayloadDirectories from dcs.payloads import PayloadDirectories
from game import Game, VERSION, persistency 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.data.weapons import Pylon, Weapon, WeaponGroup
from game.dcs.aircrafttype import AircraftType from game.dcs.aircrafttype import AircraftType
from game.factions import FACTIONS from game.factions import FACTIONS
@ -32,7 +32,6 @@ from qt_ui import (
) )
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
from qt_ui.windows.QLiberationWindow import QLiberationWindow from qt_ui.windows.QLiberationWindow import QLiberationWindow
from qt_ui.windows.newgame.QNewGameWizard import DEFAULT_BUDGET
from qt_ui.windows.preferences.QLiberationFirstStartWindow import ( from qt_ui.windows.preferences.QLiberationFirstStartWindow import (
QLiberationFirstStartWindow, QLiberationFirstStartWindow,
) )

View File

@ -17,7 +17,7 @@ class FloatSpinSlider(QHBoxLayout):
slider = QSlider(Qt.Horizontal) slider = QSlider(Qt.Horizontal)
slider.setMinimum(int(minimum * divisor)) slider.setMinimum(int(minimum * divisor))
slider.setMaximum(int(maximum * divisor)) slider.setMaximum(int(maximum * divisor))
slider.setValue(initial) slider.setValue(int(initial * divisor))
self.spinner = FloatSpinner(divisor, minimum, maximum, initial) self.spinner = FloatSpinner(divisor, minimum, maximum, initial)
slider.valueChanged.connect(lambda x: self.spinner.setValue(x)) slider.valueChanged.connect(lambda x: self.spinner.setValue(x))
self.spinner.valueChanged.connect(lambda x: slider.setValue(x)) self.spinner.valueChanged.connect(lambda x: slider.setValue(x))

View File

@ -5,11 +5,11 @@ from datetime import datetime, timedelta
from typing import List from typing import List
from PySide2 import QtGui, QtWidgets 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 PySide2.QtWidgets import QCheckBox, QLabel, QTextEdit, QVBoxLayout
from jinja2 import Environment, FileSystemLoader, select_autoescape 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.factions import FACTIONS, Faction
from game.settings import Settings from game.settings import Settings
from game.theater.start_generator import GameGenerator, GeneratorSettings, ModSettings from game.theater.start_generator import GameGenerator, GeneratorSettings, ModSettings
@ -29,7 +29,6 @@ jinja_env = Environment(
lstrip_blocks=True, lstrip_blocks=True,
) )
DEFAULT_BUDGET = 2000
DEFAULT_MISSION_LENGTH: timedelta = timedelta(minutes=60) DEFAULT_MISSION_LENGTH: timedelta = timedelta(minutes=60)
@ -93,7 +92,13 @@ class NewGameWizard(QtWidgets.QWizard):
self.addPage(self.theater_page) self.addPage(self.theater_page)
self.addPage(self.faction_selection_page) self.addPage(self.faction_selection_page)
self.addPage(GeneratorOptions()) 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.addPage(ConclusionPage())
self.setPixmap( self.setPixmap(
@ -331,6 +336,8 @@ class FactionSelection(QtWidgets.QWizardPage):
class TheaterConfiguration(QtWidgets.QWizardPage): class TheaterConfiguration(QtWidgets.QWizardPage):
campaign_selected = Signal(Campaign)
def __init__( def __init__(
self, self,
campaigns: List[Campaign], campaigns: List[Campaign],
@ -445,6 +452,8 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
else: else:
timePeriodPreset.setChecked(True) timePeriodPreset.setChecked(True)
self.campaign_selected.emit(campaign)
self.campaignList.selectionModel().setCurrentIndex( self.campaignList.selectionModel().setCurrentIndex(
self.campaignList.indexAt(QPoint(1, 1)), QItemSelectionModel.Rows self.campaignList.indexAt(QPoint(1, 1)), QItemSelectionModel.Rows
) )
@ -489,19 +498,18 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
class BudgetInputs(QtWidgets.QGridLayout): class BudgetInputs(QtWidgets.QGridLayout):
def __init__(self, label: str) -> None: def __init__(self, label: str, value: int) -> None:
super().__init__() super().__init__()
self.addWidget(QtWidgets.QLabel(label), 0, 0) self.addWidget(QtWidgets.QLabel(label), 0, 0)
minimum = 0 minimum = 0
maximum = 5000 maximum = 5000
initial = DEFAULT_BUDGET
slider = QtWidgets.QSlider(Qt.Horizontal) slider = QtWidgets.QSlider(Qt.Horizontal)
slider.setMinimum(minimum) slider.setMinimum(minimum)
slider.setMaximum(maximum) slider.setMaximum(maximum)
slider.setValue(initial) slider.setValue(value)
self.starting_money = CurrencySpinner(minimum, maximum, initial) self.starting_money = CurrencySpinner(minimum, maximum, value)
slider.valueChanged.connect(lambda x: self.starting_money.setValue(x)) slider.valueChanged.connect(lambda x: self.starting_money.setValue(x))
self.starting_money.valueChanged.connect(lambda x: slider.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_group.setLayout(economy_layout)
economy_layout.addWidget(QLabel("Player income multiplier")) economy_layout.addWidget(QLabel("Player income multiplier"))
player_income = FloatSpinSlider(0, 5, 1, divisor=10) self.player_income = FloatSpinSlider(0, 5, 1, divisor=10)
self.registerField("player_income_multiplier", player_income.spinner) self.registerField("player_income_multiplier", self.player_income.spinner)
economy_layout.addLayout(player_income) economy_layout.addLayout(self.player_income)
economy_layout.addWidget(QLabel("Enemy income multiplier")) economy_layout.addWidget(QLabel("Enemy income multiplier"))
enemy_income = FloatSpinSlider(0, 5, 1, divisor=10) self.enemy_income = FloatSpinSlider(0, 5, 1, divisor=10)
self.registerField("enemy_income_multiplier", enemy_income.spinner) self.registerField("enemy_income_multiplier", self.enemy_income.spinner)
economy_layout.addLayout(enemy_income) economy_layout.addLayout(self.enemy_income)
player_budget = BudgetInputs("Player starting budget") self.player_budget = BudgetInputs("Player starting budget", DEFAULT_BUDGET)
self.registerField("starting_money", player_budget.starting_money) self.registerField("starting_money", self.player_budget.starting_money)
economy_layout.addLayout(player_budget) economy_layout.addLayout(self.player_budget)
enemy_budget = BudgetInputs("Enemy starting budget") self.enemy_budget = BudgetInputs("Enemy starting budget", DEFAULT_BUDGET)
self.registerField("enemy_starting_money", enemy_budget.starting_money) self.registerField("enemy_starting_money", self.enemy_budget.starting_money)
economy_layout.addLayout(enemy_budget) economy_layout.addLayout(self.enemy_budget)
assist_group = QtWidgets.QGroupBox("Player assists") assist_group = QtWidgets.QGroupBox("Player assists")
layout.addWidget(assist_group) layout.addWidget(assist_group)
@ -569,6 +577,16 @@ class DifficultyAndAutomationOptions(QtWidgets.QWizardPage):
self.setLayout(layout) 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): class GeneratorOptions(QtWidgets.QWizardPage):
def __init__(self, parent=None): def __init__(self, parent=None):