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:
Dan Albert 2020-12-05 23:16:17 -08:00
parent ddd06b3162
commit f2d2fd7014
4 changed files with 93 additions and 38 deletions

View File

@ -61,9 +61,6 @@ ENEMY_BASE_STRENGTH_RECOVERY = 0.05
# cost of AWACS for single operation # cost of AWACS for single operation
AWACS_BUDGET_COST = 4 AWACS_BUDGET_COST = 4
# Initial budget value
PLAYER_BUDGET_INITIAL = 650
# Bonus multiplier logarithm base # Bonus multiplier logarithm base
PLAYER_BUDGET_IMPORTANCE_LOG = 2 PLAYER_BUDGET_IMPORTANCE_LOG = 2
@ -71,7 +68,8 @@ PLAYER_BUDGET_IMPORTANCE_LOG = 2
class Game: class Game:
def __init__(self, player_name: str, enemy_name: str, def __init__(self, player_name: str, enemy_name: str,
theater: ConflictTheater, start_date: datetime, theater: ConflictTheater, start_date: datetime,
settings: Settings): settings: Settings, player_budget: int,
enemy_budget: int) -> None:
self.settings = settings self.settings = settings
self.events: List[Event] = [] self.events: List[Event] = []
self.theater = theater self.theater = theater
@ -90,8 +88,8 @@ class Game:
self.compute_conflicts_position() self.compute_conflicts_position()
self.__destroyed_units: List[str] = [] self.__destroyed_units: List[str] = []
self.savepath = "" self.savepath = ""
self.budget = PLAYER_BUDGET_INITIAL self.budget = player_budget
self.enemy_budget = PLAYER_BUDGET_INITIAL self.enemy_budget = enemy_budget
self.current_unit_id = 0 self.current_unit_id = 0
self.current_group_id = 0 self.current_group_id = 0

View File

@ -67,7 +67,8 @@ COUNT_BY_TASK = {
@dataclass(frozen=True) @dataclass(frozen=True)
class GeneratorSettings: class GeneratorSettings:
start_date: datetime start_date: datetime
starting_budget: int player_budget: int
enemy_budget: int
multiplier: float multiplier: float
midgame: bool midgame: bool
inverted: bool inverted: bool
@ -91,14 +92,17 @@ class GameGenerator:
# Reset name generator # Reset name generator
namegen.reset() namegen.reset()
self.prepare_theater() self.prepare_theater()
game = Game(player_name=self.player, game = Game(
enemy_name=self.enemy, player_name=self.player,
theater=self.theater, enemy_name=self.enemy,
start_date=self.generator_settings.start_date, theater=self.theater,
settings=self.settings) 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() GroundObjectGenerator(game, self.generator_settings).generate()
game.budget = self.generator_settings.starting_budget
game.settings.version = VERSION game.settings.version = VERSION
return game return game

View File

@ -23,6 +23,7 @@ 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.QCampaignList import Campaign from qt_ui.windows.newgame.QCampaignList import Campaign
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
@ -133,7 +134,8 @@ def create_game(campaign_path: Path, blue: str, red: str,
Settings(supercarrier=supercarrier), Settings(supercarrier=supercarrier),
GeneratorSettings( GeneratorSettings(
start_date=datetime.today(), start_date=datetime.today(),
starting_budget=650, player_budget=DEFAULT_BUDGET,
enemy_budget=DEFAULT_BUDGET,
multiplier=1.0, multiplier=1.0,
midgame=False, midgame=False,
inverted=False, inverted=False,

View File

@ -29,6 +29,10 @@ jinja_env = Environment(
lstrip_blocks=True, lstrip_blocks=True,
) )
DEFAULT_BUDGET = 650
class NewGameWizard(QtWidgets.QWizard): class NewGameWizard(QtWidgets.QWizard):
def __init__(self, parent=None): def __init__(self, parent=None):
super(NewGameWizard, self).__init__(parent) super(NewGameWizard, self).__init__(parent)
@ -38,7 +42,8 @@ class NewGameWizard(QtWidgets.QWizard):
self.addPage(IntroPage()) self.addPage(IntroPage())
self.addPage(FactionSelection()) self.addPage(FactionSelection())
self.addPage(TheaterConfiguration(self.campaigns)) self.addPage(TheaterConfiguration(self.campaigns))
self.addPage(MiscOptions()) self.addPage(GeneratorOptions())
self.addPage(DifficultyAndAutomationOptions())
self.addPage(ConclusionPage()) self.addPage(ConclusionPage())
self.setPixmap(QtWidgets.QWizard.WatermarkPixmap, self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
@ -60,12 +65,20 @@ class NewGameWizard(QtWidgets.QWizard):
player_income_multiplier=self.field( player_income_multiplier=self.field(
"player_income_multiplier") / 10, "player_income_multiplier") / 10,
enemy_income_multiplier=self.field("enemy_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") supercarrier=self.field("supercarrier")
) )
generator_settings = GeneratorSettings( generator_settings = GeneratorSettings(
start_date=db.TIME_PERIODS[ start_date=db.TIME_PERIODS[
list(db.TIME_PERIODS.keys())[self.field("timePeriod")]], 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 # QSlider forces integers, so we use 1 to 50 and divide by 10 to
# give 0.1 to 5.0. # give 0.1 to 5.0.
multiplier=self.field("multiplier") / 10, multiplier=self.field("multiplier") / 10,
@ -310,13 +323,13 @@ class CurrencySpinner(QtWidgets.QSpinBox):
class BudgetInputs(QtWidgets.QGridLayout): class BudgetInputs(QtWidgets.QGridLayout):
def __init__(self) -> None: def __init__(self, label: str) -> None:
super().__init__() super().__init__()
self.addWidget(QtWidgets.QLabel("Starting money"), 0, 0) self.addWidget(QtWidgets.QLabel(label), 0, 0)
minimum = 0 minimum = 0
maximum = 5000 maximum = 5000
initial = 650 initial = DEFAULT_BUDGET
slider = QtWidgets.QSlider(Qt.Horizontal) slider = QtWidgets.QSlider(Qt.Horizontal)
slider.setMinimum(minimum) slider.setMinimum(minimum)
@ -330,25 +343,76 @@ class BudgetInputs(QtWidgets.QGridLayout):
self.addWidget(self.starting_money, 1, 1) self.addWidget(self.starting_money, 1, 1)
class MiscOptions(QtWidgets.QWizardPage): class DifficultyAndAutomationOptions(QtWidgets.QWizardPage):
def __init__(self, parent=None): def __init__(self, parent=None) -> None:
super(MiscOptions, self).__init__(parent) super().__init__(parent)
self.setTitle("Miscellaneous settings") self.setTitle("Difficulty and automation options")
self.setSubTitle("\nOthers settings for the game.") self.setSubTitle("\nOptions controlling game difficulty and level of "
"player involvement.")
self.setPixmap(QtWidgets.QWizard.LogoPixmap, self.setPixmap(QtWidgets.QWizard.LogoPixmap,
QtGui.QPixmap('./resources/ui/wizard/logo1.png')) 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) multiplier = TenthsSpinSlider("Enemy forces multiplier", 1, 50, 10)
self.registerField('multiplier', multiplier.spinner) self.registerField('multiplier', multiplier.spinner)
economy_layout.addLayout(multiplier)
player_income = TenthsSpinSlider("Player income multiplier", 1, 50, 10) player_income = TenthsSpinSlider("Player income multiplier", 1, 50, 10)
self.registerField("player_income_multiplier", player_income.spinner) self.registerField("player_income_multiplier", player_income.spinner)
economy_layout.addLayout(player_income)
enemy_income = TenthsSpinSlider("Enemy income multiplier", 1, 50, 10) enemy_income = TenthsSpinSlider("Enemy income multiplier", 1, 50, 10)
self.registerField("enemy_income_multiplier", enemy_income.spinner) 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 # Campaign settings
generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings") generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings")
@ -363,12 +427,6 @@ class MiscOptions(QtWidgets.QWizardPage):
no_enemy_navy = QtWidgets.QCheckBox() no_enemy_navy = QtWidgets.QCheckBox()
self.registerField('no_enemy_navy', no_enemy_navy) 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 = QtWidgets.QGridLayout()
generatorLayout.addWidget(QtWidgets.QLabel("No Aircraft Carriers"), 1, 0) generatorLayout.addWidget(QtWidgets.QLabel("No Aircraft Carriers"), 1, 0)
generatorLayout.addWidget(no_carrier, 1, 1) generatorLayout.addWidget(no_carrier, 1, 1)
@ -382,15 +440,8 @@ class MiscOptions(QtWidgets.QWizardPage):
generatorLayout.addWidget(no_enemy_navy, 5, 1) generatorLayout.addWidget(no_enemy_navy, 5, 1)
generatorSettingsGroup.setLayout(generatorLayout) 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 = QVBoxLayout()
mlayout.addWidget(miscSettingsGroup)
mlayout.addWidget(generatorSettingsGroup) mlayout.addWidget(generatorSettingsGroup)
mlayout.addWidget(economySettingsGroup)
self.setLayout(mlayout) self.setLayout(mlayout)