Save-compat changes to allow loading Liberation saves

May be incomplete, some discrepancies in naming may still exist, but at least Kerbo's campaign can be loaded.
This commit is contained in:
Raffson 2023-07-01 17:08:12 +02:00
parent aaaa9847b1
commit 3b745c43eb
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
5 changed files with 30 additions and 3 deletions

View File

@ -31,6 +31,16 @@ def weapons_migrator(name: str) -> str:
return name
def weapons_migrator_lib(name: str) -> str:
# Splitting this from our own migrations
if "KH" in name:
return "Kh" + name[2:]
migration_map = {}
while name in migration_map:
name = migration_map[name]
return name
@dataclass(frozen=True)
class Weapon:
"""Wrapper for DCS weapons."""
@ -153,7 +163,9 @@ class WeaponGroup:
def __setstate__(self, state: dict[str, Any]) -> None:
# Update any existing models with new data on load.
updated = WeaponGroup.named(weapons_migrator(state["name"]))
name = weapons_migrator(state["name"])
name = weapons_migrator_lib(name)
updated = WeaponGroup.named(name)
state.update(updated.__dict__)
self.__dict__.update(state)

View File

@ -1,5 +1,6 @@
from __future__ import annotations
from datetime import datetime
from typing import TYPE_CHECKING, Any
from dcs.countries import countries_by_name
@ -18,8 +19,9 @@ def try_set_attr(obj: Any, attr_name: str, val: Any = None) -> None:
class Migrator:
def __init__(self, game: Game):
def __init__(self, game: Game, is_liberation: bool):
self.game = game
self.is_liberation = is_liberation
self._migrate_game()
def _migrate_game(self) -> None:
@ -62,6 +64,10 @@ class Migrator:
for p in c.ato.packages:
try_set_attr(p, "custom_name")
try_set_attr(p, "frequency")
if self.is_liberation and isinstance(p.time_over_target, datetime):
p.time_over_target = (
p.time_over_target - self.game.conditions.start_time
)
def _update_control_points(self) -> None:
for cp in self.game.theater.controlpoints:

View File

@ -17,6 +17,11 @@ _dcs_saved_game_folder: Optional[str] = None
# fmt: off
class DummyObject:
def __setstate__(self, state):
self.__dict__.update(state)
class MigrationUnpickler(pickle.Unpickler):
"""Custom unpickler to migrate campaign save-files for when components have been moved"""
def find_class(self, module: Any, name: str) -> Any:
@ -52,6 +57,8 @@ class MigrationUnpickler(pickle.Unpickler):
return Thunderstorm
if name == "Hipico":
return dcs.terrain.falklands.airports.Hipico_Flying_Club
if name in ["SaveManager", "SaveGameBundle"]:
return DummyObject
return super().find_class(module, name)
# fmt: on

View File

@ -326,7 +326,8 @@ class QLiberationWindow(QMainWindow):
def migrate_game(self, game, path):
if game:
Migrator(game)
is_liberation = ".liberation" in path
Migrator(game, is_liberation)
else:
relative_path = Path(path)
QMessageBox.critical(

View File

@ -17,6 +17,7 @@ price: 20
role: Attack
variants:
Ka-50 Hokum III: {}
Ka-50 Hokum (Blackshark 3): {} # for compatibility with Liberation
radios:
intra_flight: R-800L1
inter_flight: R-800L1