diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index feb6bd5f..bbade7eb 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -2,11 +2,13 @@ from __future__ import annotations import logging import random -from dataclasses import dataclass +from dataclasses import dataclass, fields from datetime import datetime, time +from pathlib import Path from typing import List import dcs.statics +import yaml from game import Game from game.factions.faction import Faction @@ -31,6 +33,7 @@ from ..armedforces.armedforces import ArmedForces from ..armedforces.forcegroup import ForceGroup from ..campaignloader.campaignairwingconfig import CampaignAirWingConfig from ..data.groups import GroupTask +from ..persistence.paths import liberation_user_dir from ..plugins import LuaPluginManager from ..profiling import logged_duration from ..settings import Settings @@ -64,6 +67,38 @@ class ModSettings: high_digit_sams: bool = False ov10a_bronco: bool = False + def save_player_settings(self) -> None: + """Saves the player's global settings to the user directory.""" + settings: dict[str, dict[str, bool]] = {} + for field in fields(self): + settings[field.name] = self.__dict__[field.name] + + with self._player_settings_file.open("w", encoding="utf-8") as settings_file: + yaml.dump(settings, settings_file, sort_keys=False, explicit_start=True) + + def merge_player_settings(self) -> None: + """Updates with the player's global settings.""" + settings_path = self._player_settings_file + if not settings_path.exists(): + return + with settings_path.open(encoding="utf-8") as settings_file: + data = yaml.safe_load(settings_file) + + for mod_name, enabled in data.items(): + if mod_name not in self.__dict__: + logging.warning( + "Unexpected mod key found in %s: %s. Ignoring.", + settings_path, + mod_name, + ) + continue + self.__dict__[mod_name] = enabled + + @property + def _player_settings_file(self) -> Path: + """Returns the path to the player's global settings file.""" + return liberation_user_dir() / "mods.yaml" + class GameGenerator: def __init__( diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index a172ad74..7e79fe5c 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -96,6 +96,9 @@ class NewGameWizard(QtWidgets.QWizard): default_settings = Settings() default_settings.merge_player_settings() + mod_settings = ModSettings() + mod_settings.merge_player_settings() + self.lua_plugin_manager = LuaPluginManager.load() self.lua_plugin_manager.merge_player_settings() @@ -110,7 +113,7 @@ class NewGameWizard(QtWidgets.QWizard): ) self.addPage(self.theater_page) self.addPage(self.faction_selection_page) - self.addPage(GeneratorOptions(default_settings)) + self.addPage(GeneratorOptions(default_settings, mod_settings)) self.difficulty_page = DifficultyAndAutomationOptions(default_settings) self.plugins_page = PluginsPage(self.lua_plugin_manager) @@ -194,6 +197,7 @@ class NewGameWizard(QtWidgets.QWizard): frenchpack=self.field("frenchpack"), high_digit_sams=self.field("high_digit_sams"), ) + mod_settings.save_player_settings() blue_faction = self.faction_selection_page.selected_blue_faction red_faction = self.faction_selection_page.selected_red_faction @@ -708,7 +712,9 @@ class PluginsPage(QtWidgets.QWizardPage): class GeneratorOptions(QtWidgets.QWizardPage): - def __init__(self, default_settings: Settings, parent=None): + def __init__( + self, default_settings: Settings, mod_settings: ModSettings, parent=None + ) -> None: super().__init__(parent) self.setTitle("Generator settings") self.setSubTitle("\nOptions affecting the generation of the game.") @@ -753,27 +759,49 @@ class GeneratorOptions(QtWidgets.QWizardPage): generatorSettingsGroup.setLayout(generatorLayout) modSettingsGroup = QtWidgets.QGroupBox("Mod Settings") + a4_skyhawk = QtWidgets.QCheckBox() + a4_skyhawk.setChecked(mod_settings.a4_skyhawk) self.registerField("a4_skyhawk", a4_skyhawk) + hercules = QtWidgets.QCheckBox() + hercules.setChecked(mod_settings.hercules) self.registerField("hercules", hercules) + uh_60l = QtWidgets.QCheckBox() + uh_60l.setChecked(mod_settings.uh_60l) self.registerField("uh_60l", uh_60l) + f22_raptor = QtWidgets.QCheckBox() + f22_raptor.setChecked(mod_settings.f22_raptor) self.registerField("f22_raptor", f22_raptor) + f104_starfighter = QtWidgets.QCheckBox() + f104_starfighter.setChecked(mod_settings.f104_starfighter) self.registerField("f104_starfighter", f104_starfighter) + f4_phantom = QtWidgets.QCheckBox() + f4_phantom.setChecked(mod_settings.f4_phantom) self.registerField("f4_phantom", f4_phantom) + jas39_gripen = QtWidgets.QCheckBox() + jas39_gripen.setChecked(mod_settings.jas39_gripen) self.registerField("jas39_gripen", jas39_gripen) + su57_felon = QtWidgets.QCheckBox() + su57_felon.setChecked(mod_settings.su57_felon) self.registerField("su57_felon", su57_felon) + ov10a_bronco = QtWidgets.QCheckBox() + ov10a_bronco.setChecked(mod_settings.ov10a_bronco) self.registerField("ov10a_bronco", ov10a_bronco) + frenchpack = QtWidgets.QCheckBox() + frenchpack.setChecked(mod_settings.frenchpack) self.registerField("frenchpack", frenchpack) + high_digit_sams = QtWidgets.QCheckBox() + high_digit_sams.setChecked(mod_settings.high_digit_sams) self.registerField("high_digit_sams", high_digit_sams) modHelpText = QtWidgets.QLabel(