From f2d2fd701462fb5337bfda5739692137ad509909 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sat, 5 Dec 2020 23:16:17 -0800 Subject: [PATCH] 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. --- game/game.py | 10 +-- game/theater/start_generator.py | 18 +++-- qt_ui/main.py | 4 +- qt_ui/windows/newgame/QNewGameWizard.py | 99 +++++++++++++++++++------ 4 files changed, 93 insertions(+), 38 deletions(-) diff --git a/game/game.py b/game/game.py index 55d12d81..bc8396db 100644 --- a/game/game.py +++ b/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 diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 49f587cc..730c114a 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -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 diff --git a/qt_ui/main.py b/qt_ui/main.py index f751208e..62c5be94 100644 --- a/qt_ui/main.py +++ b/qt_ui/main.py @@ -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, diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 1c98bbcc..2ce64f99 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -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)