mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Add automation options to the new game wizard.
To have an effect on turn zero these need to be enabled in the wizard. Since the last page was getting quite full I've split it into two pages: one for the objective generation options and a second for the difficulty and player assist options. I also added an option to set the inital budget for opfor.
This commit is contained in:
parent
ddd06b3162
commit
f2d2fd7014
10
game/game.py
10
game/game.py
@ -61,9 +61,6 @@ ENEMY_BASE_STRENGTH_RECOVERY = 0.05
|
||||
# cost of AWACS for single operation
|
||||
AWACS_BUDGET_COST = 4
|
||||
|
||||
# Initial budget value
|
||||
PLAYER_BUDGET_INITIAL = 650
|
||||
|
||||
# Bonus multiplier logarithm base
|
||||
PLAYER_BUDGET_IMPORTANCE_LOG = 2
|
||||
|
||||
@ -71,7 +68,8 @@ PLAYER_BUDGET_IMPORTANCE_LOG = 2
|
||||
class Game:
|
||||
def __init__(self, player_name: str, enemy_name: str,
|
||||
theater: ConflictTheater, start_date: datetime,
|
||||
settings: Settings):
|
||||
settings: Settings, player_budget: int,
|
||||
enemy_budget: int) -> None:
|
||||
self.settings = settings
|
||||
self.events: List[Event] = []
|
||||
self.theater = theater
|
||||
@ -90,8 +88,8 @@ class Game:
|
||||
self.compute_conflicts_position()
|
||||
self.__destroyed_units: List[str] = []
|
||||
self.savepath = ""
|
||||
self.budget = PLAYER_BUDGET_INITIAL
|
||||
self.enemy_budget = PLAYER_BUDGET_INITIAL
|
||||
self.budget = player_budget
|
||||
self.enemy_budget = enemy_budget
|
||||
self.current_unit_id = 0
|
||||
self.current_group_id = 0
|
||||
|
||||
|
||||
@ -67,7 +67,8 @@ COUNT_BY_TASK = {
|
||||
@dataclass(frozen=True)
|
||||
class GeneratorSettings:
|
||||
start_date: datetime
|
||||
starting_budget: int
|
||||
player_budget: int
|
||||
enemy_budget: int
|
||||
multiplier: float
|
||||
midgame: bool
|
||||
inverted: bool
|
||||
@ -91,14 +92,17 @@ class GameGenerator:
|
||||
# Reset name generator
|
||||
namegen.reset()
|
||||
self.prepare_theater()
|
||||
game = Game(player_name=self.player,
|
||||
enemy_name=self.enemy,
|
||||
theater=self.theater,
|
||||
start_date=self.generator_settings.start_date,
|
||||
settings=self.settings)
|
||||
game = Game(
|
||||
player_name=self.player,
|
||||
enemy_name=self.enemy,
|
||||
theater=self.theater,
|
||||
start_date=self.generator_settings.start_date,
|
||||
settings=self.settings,
|
||||
player_budget=self.generator_settings.player_budget,
|
||||
enemy_budget=self.generator_settings.enemy_budget
|
||||
)
|
||||
|
||||
GroundObjectGenerator(game, self.generator_settings).generate()
|
||||
game.budget = self.generator_settings.starting_budget
|
||||
game.settings.version = VERSION
|
||||
return game
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ from qt_ui import (
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||
from qt_ui.windows.QLiberationWindow import QLiberationWindow
|
||||
from qt_ui.windows.newgame.QCampaignList import Campaign
|
||||
from qt_ui.windows.newgame.QNewGameWizard import DEFAULT_BUDGET
|
||||
from qt_ui.windows.preferences.QLiberationFirstStartWindow import \
|
||||
QLiberationFirstStartWindow
|
||||
|
||||
@ -133,7 +134,8 @@ def create_game(campaign_path: Path, blue: str, red: str,
|
||||
Settings(supercarrier=supercarrier),
|
||||
GeneratorSettings(
|
||||
start_date=datetime.today(),
|
||||
starting_budget=650,
|
||||
player_budget=DEFAULT_BUDGET,
|
||||
enemy_budget=DEFAULT_BUDGET,
|
||||
multiplier=1.0,
|
||||
midgame=False,
|
||||
inverted=False,
|
||||
|
||||
@ -29,6 +29,10 @@ jinja_env = Environment(
|
||||
lstrip_blocks=True,
|
||||
)
|
||||
|
||||
|
||||
DEFAULT_BUDGET = 650
|
||||
|
||||
|
||||
class NewGameWizard(QtWidgets.QWizard):
|
||||
def __init__(self, parent=None):
|
||||
super(NewGameWizard, self).__init__(parent)
|
||||
@ -38,7 +42,8 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
self.addPage(IntroPage())
|
||||
self.addPage(FactionSelection())
|
||||
self.addPage(TheaterConfiguration(self.campaigns))
|
||||
self.addPage(MiscOptions())
|
||||
self.addPage(GeneratorOptions())
|
||||
self.addPage(DifficultyAndAutomationOptions())
|
||||
self.addPage(ConclusionPage())
|
||||
|
||||
self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
|
||||
@ -60,12 +65,20 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
player_income_multiplier=self.field(
|
||||
"player_income_multiplier") / 10,
|
||||
enemy_income_multiplier=self.field("enemy_income_multiplier") / 10,
|
||||
automate_runway_repair=self.field("automate_runway_repairs"),
|
||||
automate_front_line_reinforcements=self.field(
|
||||
"automate_front_line_purchases"
|
||||
),
|
||||
automate_aircraft_reinforcements=self.field(
|
||||
"automate_aircraft_purchases"
|
||||
),
|
||||
supercarrier=self.field("supercarrier")
|
||||
)
|
||||
generator_settings = GeneratorSettings(
|
||||
start_date=db.TIME_PERIODS[
|
||||
list(db.TIME_PERIODS.keys())[self.field("timePeriod")]],
|
||||
starting_budget=int(self.field("starting_money")),
|
||||
player_budget=int(self.field("starting_money")),
|
||||
enemy_budget=int(self.field("enemy_starting_money")),
|
||||
# QSlider forces integers, so we use 1 to 50 and divide by 10 to
|
||||
# give 0.1 to 5.0.
|
||||
multiplier=self.field("multiplier") / 10,
|
||||
@ -310,13 +323,13 @@ class CurrencySpinner(QtWidgets.QSpinBox):
|
||||
|
||||
|
||||
class BudgetInputs(QtWidgets.QGridLayout):
|
||||
def __init__(self) -> None:
|
||||
def __init__(self, label: str) -> None:
|
||||
super().__init__()
|
||||
self.addWidget(QtWidgets.QLabel("Starting money"), 0, 0)
|
||||
self.addWidget(QtWidgets.QLabel(label), 0, 0)
|
||||
|
||||
minimum = 0
|
||||
maximum = 5000
|
||||
initial = 650
|
||||
initial = DEFAULT_BUDGET
|
||||
|
||||
slider = QtWidgets.QSlider(Qt.Horizontal)
|
||||
slider.setMinimum(minimum)
|
||||
@ -330,25 +343,76 @@ class BudgetInputs(QtWidgets.QGridLayout):
|
||||
self.addWidget(self.starting_money, 1, 1)
|
||||
|
||||
|
||||
class MiscOptions(QtWidgets.QWizardPage):
|
||||
def __init__(self, parent=None):
|
||||
super(MiscOptions, self).__init__(parent)
|
||||
class DifficultyAndAutomationOptions(QtWidgets.QWizardPage):
|
||||
def __init__(self, parent=None) -> None:
|
||||
super().__init__(parent)
|
||||
|
||||
self.setTitle("Miscellaneous settings")
|
||||
self.setSubTitle("\nOthers settings for the game.")
|
||||
self.setTitle("Difficulty and automation options")
|
||||
self.setSubTitle("\nOptions controlling game difficulty and level of "
|
||||
"player involvement.")
|
||||
self.setPixmap(QtWidgets.QWizard.LogoPixmap,
|
||||
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||
|
||||
layout = QtWidgets.QVBoxLayout()
|
||||
|
||||
economy_group = QtWidgets.QGroupBox("Economy options")
|
||||
layout.addWidget(economy_group)
|
||||
economy_layout = QtWidgets.QVBoxLayout()
|
||||
economy_group.setLayout(economy_layout)
|
||||
|
||||
multiplier = TenthsSpinSlider("Enemy forces multiplier", 1, 50, 10)
|
||||
self.registerField('multiplier', multiplier.spinner)
|
||||
economy_layout.addLayout(multiplier)
|
||||
|
||||
player_income = TenthsSpinSlider("Player income multiplier", 1, 50, 10)
|
||||
self.registerField("player_income_multiplier", player_income.spinner)
|
||||
economy_layout.addLayout(player_income)
|
||||
|
||||
enemy_income = TenthsSpinSlider("Enemy income multiplier", 1, 50, 10)
|
||||
self.registerField("enemy_income_multiplier", enemy_income.spinner)
|
||||
economy_layout.addLayout(enemy_income)
|
||||
|
||||
miscSettingsGroup = QtWidgets.QGroupBox("Misc Settings")
|
||||
player_budget = BudgetInputs("Player starting budget")
|
||||
self.registerField('starting_money', player_budget.starting_money)
|
||||
economy_layout.addLayout(player_budget)
|
||||
|
||||
enemy_budget = BudgetInputs("Enemy starting budget")
|
||||
self.registerField("enemy_starting_money", enemy_budget.starting_money)
|
||||
economy_layout.addLayout(enemy_budget)
|
||||
|
||||
assist_group = QtWidgets.QGroupBox("Player assists")
|
||||
layout.addWidget(assist_group)
|
||||
assist_layout = QtWidgets.QGridLayout()
|
||||
assist_group.setLayout(assist_layout)
|
||||
|
||||
assist_layout.addWidget(
|
||||
QtWidgets.QLabel("Automate runway repairs"), 0, 0)
|
||||
runway_repairs = QtWidgets.QCheckBox()
|
||||
self.registerField("automate_runway_repairs", runway_repairs)
|
||||
assist_layout.addWidget(runway_repairs, 0, 1, Qt.AlignRight)
|
||||
|
||||
assist_layout.addWidget(
|
||||
QtWidgets.QLabel("Automate front-line purchases"), 1, 0)
|
||||
front_line = QtWidgets.QCheckBox()
|
||||
self.registerField("automate_front_line_purchases", front_line)
|
||||
assist_layout.addWidget(front_line, 1, 1, Qt.AlignRight)
|
||||
|
||||
assist_layout.addWidget(
|
||||
QtWidgets.QLabel("Automate aircraft purchases"), 2, 0)
|
||||
aircraft = QtWidgets.QCheckBox()
|
||||
self.registerField("automate_aircraft_purchases", aircraft)
|
||||
assist_layout.addWidget(aircraft, 2, 1, Qt.AlignRight)
|
||||
|
||||
self.setLayout(layout)
|
||||
|
||||
|
||||
class GeneratorOptions(QtWidgets.QWizardPage):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setTitle("Generator settings")
|
||||
self.setSubTitle("\nOptions affecting the generation of the game.")
|
||||
self.setPixmap(QtWidgets.QWizard.LogoPixmap,
|
||||
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||
|
||||
# Campaign settings
|
||||
generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings")
|
||||
@ -363,12 +427,6 @@ class MiscOptions(QtWidgets.QWizardPage):
|
||||
no_enemy_navy = QtWidgets.QCheckBox()
|
||||
self.registerField('no_enemy_navy', no_enemy_navy)
|
||||
|
||||
layout = QtWidgets.QGridLayout()
|
||||
layout.addLayout(multiplier, 0, 0)
|
||||
layout.addLayout(player_income, 1, 0)
|
||||
layout.addLayout(enemy_income, 2, 0)
|
||||
miscSettingsGroup.setLayout(layout)
|
||||
|
||||
generatorLayout = QtWidgets.QGridLayout()
|
||||
generatorLayout.addWidget(QtWidgets.QLabel("No Aircraft Carriers"), 1, 0)
|
||||
generatorLayout.addWidget(no_carrier, 1, 1)
|
||||
@ -382,15 +440,8 @@ class MiscOptions(QtWidgets.QWizardPage):
|
||||
generatorLayout.addWidget(no_enemy_navy, 5, 1)
|
||||
generatorSettingsGroup.setLayout(generatorLayout)
|
||||
|
||||
budget_inputs = BudgetInputs()
|
||||
economySettingsGroup = QtWidgets.QGroupBox("Economy")
|
||||
economySettingsGroup.setLayout(budget_inputs)
|
||||
self.registerField('starting_money', budget_inputs.starting_money)
|
||||
|
||||
mlayout = QVBoxLayout()
|
||||
mlayout.addWidget(miscSettingsGroup)
|
||||
mlayout.addWidget(generatorSettingsGroup)
|
||||
mlayout.addWidget(economySettingsGroup)
|
||||
self.setLayout(mlayout)
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user