mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Default settings support (#428)
This commit is contained in:
parent
8f384b35dc
commit
266e69a6ce
@ -39,6 +39,7 @@
|
|||||||
* **[Mission Generation]** Automatic datalink network setup for applicable aircraft (_should_ in theory avoid the need to re-save the mission)
|
* **[Mission Generation]** Automatic datalink network setup for applicable aircraft (_should_ in theory avoid the need to re-save the mission)
|
||||||
* **[Options]** New option to force-enable deck-crew for super-carriers on dedicated server.
|
* **[Options]** New option to force-enable deck-crew for super-carriers on dedicated server.
|
||||||
* **[Mission Generation]** Enable Supercarrier's LSO & Airboss stations
|
* **[Mission Generation]** Enable Supercarrier's LSO & Airboss stations
|
||||||
|
* **[UX]** Default settings are now loaded from Default.zip
|
||||||
* **[Autoplanner]** Plan Air-to-Air Escorts for AWACS & Tankers
|
* **[Autoplanner]** Plan Air-to-Air Escorts for AWACS & Tankers
|
||||||
|
|
||||||
## Fixes
|
## Fixes
|
||||||
|
|||||||
@ -1339,27 +1339,31 @@ class Settings:
|
|||||||
self.plugins[self.plugin_settings_key(identifier)] = value
|
self.plugins[self.plugin_settings_key(identifier)] = value
|
||||||
|
|
||||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||||
# restore Enum & timedelta types
|
|
||||||
for key, value in state.items():
|
|
||||||
if isinstance(self.__dict__.get(key), timedelta) and isinstance(value, int):
|
|
||||||
state[key] = timedelta(minutes=value)
|
|
||||||
elif isinstance(self.__dict__.get(key), Enum) and isinstance(value, str):
|
|
||||||
state[key] = eval(value)
|
|
||||||
elif isinstance(value, dict):
|
|
||||||
state[key] = self.obj_hook(value)
|
|
||||||
|
|
||||||
# __setstate__ is called with the dict of the object being unpickled. We
|
# __setstate__ is called with the dict of the object being unpickled. We
|
||||||
# can provide save compatibility for new settings options (which
|
# can provide save compatibility for new settings options (which
|
||||||
# normally would not be present in the unpickled object) by creating a
|
# normally would not be present in the unpickled object) by creating a
|
||||||
# new settings object, updating it with the unpickled state, and
|
# new settings object, updating it with the unpickled state, and
|
||||||
# updating our dict with that.
|
# updating our dict with that.
|
||||||
new_state = Settings().__dict__
|
new_state = Settings().__dict__
|
||||||
new_state.update(state)
|
new_state.update(self.deserialize_state_dict(state))
|
||||||
self.__dict__.update(new_state)
|
self.__dict__.update(new_state)
|
||||||
from game.plugins import LuaPluginManager
|
from game.plugins import LuaPluginManager
|
||||||
|
|
||||||
LuaPluginManager().load_settings(self)
|
LuaPluginManager().load_settings(self)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def deserialize_state_dict(state: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
# restore Enum & timedelta types
|
||||||
|
s = Settings()
|
||||||
|
for key, value in state.items():
|
||||||
|
if isinstance(s.__dict__.get(key), timedelta) and isinstance(value, int):
|
||||||
|
state[key] = timedelta(minutes=value)
|
||||||
|
elif isinstance(s.__dict__.get(key), Enum) and isinstance(value, str):
|
||||||
|
state[key] = eval(value)
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
state[key] = s.obj_hook(value)
|
||||||
|
return state
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _field_description(cls, settings_field: Field[Any]) -> OptionDescription:
|
def _field_description(cls, settings_field: Field[Any]) -> OptionDescription:
|
||||||
return settings_field.metadata[SETTING_DESCRIPTION_KEY]
|
return settings_field.metadata[SETTING_DESCRIPTION_KEY]
|
||||||
|
|||||||
@ -12,26 +12,29 @@ class NewGameSettings(QtWidgets.QWizardPage):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
||||||
self.setTitle("Campaign options")
|
self.setTitle("Campaign options")
|
||||||
self.setSubTitle("\nAll other options unrelated to campaign generation.")
|
self.setSubTitle(
|
||||||
|
"\nAll other options unrelated to campaign generation. Defaults can be changed by overwriting Default.zip"
|
||||||
|
)
|
||||||
self.setPixmap(
|
self.setPixmap(
|
||||||
QtWidgets.QWizard.WizardPixmap.LogoPixmap,
|
QtWidgets.QWizard.WizardPixmap.LogoPixmap,
|
||||||
QtGui.QPixmap("./resources/ui/wizard/logo1.png"),
|
QtGui.QPixmap("./resources/ui/wizard/logo1.png"),
|
||||||
)
|
)
|
||||||
|
|
||||||
settings = Settings()
|
settings = Settings()
|
||||||
settings.__setstate__(campaign.settings)
|
self.settings_widget = QSettingsWidget(settings)
|
||||||
|
self.settings_widget.load_default_settings()
|
||||||
|
settings.__dict__.update(Settings.deserialize_state_dict(campaign.settings))
|
||||||
settings.player_income_multiplier = (
|
settings.player_income_multiplier = (
|
||||||
campaign.recommended_player_income_multiplier
|
campaign.recommended_player_income_multiplier
|
||||||
)
|
)
|
||||||
settings.enemy_income_multiplier = campaign.recommended_enemy_income_multiplier
|
settings.enemy_income_multiplier = campaign.recommended_enemy_income_multiplier
|
||||||
settings.__dict__.update(campaign.settings)
|
self.settings_widget.update_from_settings()
|
||||||
self.settings_widget = QSettingsWidget(settings)
|
|
||||||
self.setLayout(self.settings_widget.layout)
|
self.setLayout(self.settings_widget.layout)
|
||||||
|
|
||||||
def set_campaign_values(self, c: Campaign):
|
def set_campaign_values(self, c: Campaign):
|
||||||
sw = self.settings_widget
|
sw = self.settings_widget
|
||||||
sw.settings.__setstate__(c.settings)
|
sw.load_default_settings()
|
||||||
|
sw.settings.__dict__.update(Settings.deserialize_state_dict(c.settings))
|
||||||
sw.settings.player_income_multiplier = c.recommended_player_income_multiplier
|
sw.settings.player_income_multiplier = c.recommended_player_income_multiplier
|
||||||
sw.settings.enemy_income_multiplier = c.recommended_enemy_income_multiplier
|
sw.settings.enemy_income_multiplier = c.recommended_enemy_income_multiplier
|
||||||
sw.settings.__dict__.update(c.settings)
|
|
||||||
sw.update_from_settings()
|
sw.update_from_settings()
|
||||||
|
|||||||
@ -572,3 +572,33 @@ class QSettingsWidget(QtWidgets.QWizardPage, SettingsContainer):
|
|||||||
),
|
),
|
||||||
zipfile.ZIP_DEFLATED,
|
zipfile.ZIP_DEFLATED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def load_default_settings(self):
|
||||||
|
sd = settings_dir()
|
||||||
|
default_zip_path = sd / "Default.zip"
|
||||||
|
if default_zip_path.exists():
|
||||||
|
with zipfile.ZipFile(default_zip_path, "r") as zf:
|
||||||
|
filename = "Default.json"
|
||||||
|
if filename in zf.namelist():
|
||||||
|
settings_data = json.loads(
|
||||||
|
zf.read(filename).decode("utf-8"),
|
||||||
|
object_hook=self.settings.obj_hook,
|
||||||
|
)
|
||||||
|
self.settings.__setstate__(settings_data)
|
||||||
|
else:
|
||||||
|
if self.settings is None:
|
||||||
|
default_settings = Settings()
|
||||||
|
else:
|
||||||
|
default_settings = self.settings
|
||||||
|
with zipfile.ZipFile(default_zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
||||||
|
filename = "Default.json"
|
||||||
|
zf.writestr(
|
||||||
|
filename,
|
||||||
|
json.dumps(
|
||||||
|
default_settings.__dict__,
|
||||||
|
indent=2,
|
||||||
|
default=default_settings.default_json,
|
||||||
|
),
|
||||||
|
zipfile.ZIP_DEFLATED,
|
||||||
|
)
|
||||||
|
self.settings.__setstate__(default_settings.__dict__)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user