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)