dcs_liberation/game/persistency.py
Dan Albert 22503d4e95 Save the last turn for bug reports.
We often get save games uploaded with bug reports that are already in a
broken state with nothing we can do about it. This saves that turn to
`last_turn.liberation` so users are less likely to have clobbered the
useful data before filing the report.
2022-12-20 13:46:21 -08:00

88 lines
2.1 KiB
Python

from __future__ import annotations
import logging
import pickle
import shutil
from pathlib import Path
from typing import Optional, TYPE_CHECKING
from game.profiling import logged_duration
if TYPE_CHECKING:
from game import Game
_dcs_saved_game_folder: Optional[str] = None
def setup(user_folder: str) -> None:
global _dcs_saved_game_folder
_dcs_saved_game_folder = user_folder
if not save_dir().exists():
save_dir().mkdir(parents=True)
def base_path() -> str:
global _dcs_saved_game_folder
assert _dcs_saved_game_folder
return _dcs_saved_game_folder
def save_dir() -> Path:
return Path(base_path()) / "Liberation" / "Saves"
def _temporary_save_file() -> Path:
return save_dir() / "tmpsave.liberation"
def _autosave_path() -> str:
return str(save_dir() / "autosave.liberation")
def mission_path_for(name: str) -> Path:
return Path(base_path()) / "Missions" / name
def load_game(path: str) -> Optional[Game]:
with open(path, "rb") as f:
try:
save = pickle.load(f)
save.savepath = path
return save
except Exception:
logging.exception("Invalid Save game")
return None
def save_game(game: Game, destination: Path | None = None) -> None:
if destination is None:
destination = Path(game.savepath)
temp_save_file = _temporary_save_file()
with logged_duration("Saving game"):
try:
with temp_save_file.open("wb") as f:
pickle.dump(game, f)
shutil.copy(temp_save_file, destination)
except Exception:
logging.exception("Could not save game")
def autosave(game: Game) -> bool:
"""
Autosave to the autosave location
:param game: Game to save
:return: True if saved succesfully
"""
try:
with open(_autosave_path(), "wb") as f:
pickle.dump(game, f)
return True
except Exception:
logging.exception("Could not save game")
return False
def save_last_turn_state(game: Game) -> None:
save_game(game, save_dir() / "last_turn.liberation")