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_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,

View File

@ -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)

View File

@ -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,
)

View File

@ -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))

View File

@ -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):