diff --git a/games/game_daggerfallunity.py b/games/game_daggerfallunity.py index 6c170f1..f36b4fa 100644 --- a/games/game_daggerfallunity.py +++ b/games/game_daggerfallunity.py @@ -1,5 +1,16 @@ +import json +from datetime import datetime, timedelta +from pathlib import Path + +from PyQt6.QtCore import QDir + import mobase +from ..basic_features import BasicLocalSavegames +from ..basic_features.basic_save_game_info import ( + BasicGameSaveGame, + BasicGameSaveGameInfo, +) from ..basic_game import BasicGame @@ -35,15 +46,58 @@ def dataLooksValid( return mobase.ModDataChecker.INVALID +class DaggerfallSaveGame(BasicGameSaveGame): + def __init__(self, filepath: Path): + super().__init__(filepath) + self.saveInfo = json.loads(open(self._filepath / "SaveInfo.txt", "r").read()) + + def getName(self) -> str: + return f"[{self.saveInfo['characterName']}] {self.saveInfo['saveName']}" + + def getFilepath(self): + return self._filepath.as_posix() + + def allFiles(self): + return list(map(str, self._filepath.glob("*"))) + + def getSaveGroupIdentifier(self): + return self.saveInfo["characterName"] + + +def parse_daggerfall_save_metadata(save_path: Path, save: mobase.ISaveGame): + saveInfo = json.loads(open(save_path / "SaveInfo.txt", "r").read()) + saveData = json.loads(open(save_path / "SaveData.txt", "r").read()) + + epoch = datetime(1, 1, 1) + save_time = epoch + timedelta(microseconds=saveInfo["dateAndTime"]["realTime"] / 10) + + return { + "Save Name": saveInfo["saveName"], + "Character Name": saveInfo["characterName"], + "Level": saveData["playerData"]["playerEntity"]["level"], + "Gender": saveData["playerData"]["playerEntity"]["gender"], + "Race": saveData["playerData"]["playerEntity"]["raceTemplate"]["Name"], + "Reflexes": saveData["playerData"]["playerEntity"]["reflexes"], + "Date": save_time.strftime("%Y-%m-%d %H:%M:%S"), + } + + class DaggerfallUnityGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) self._register_feature(DaggerfallUnityModDataChecker()) + self._register_feature(BasicLocalSavegames(self)) + self._register_feature( + BasicGameSaveGameInfo( + lambda p: Path(p or "", "Screenshot.jpg"), + parse_daggerfall_save_metadata, + ) + ) return True Name = "Daggerfall Unity Support Plugin" - Author = "HomerSimpleton" - Version = "1.0.0" + Author = "HomerSimpleton & Oknehsorod" + Version = "1.0.1" GameName = "Daggerfall Unity" GameShortName = "daggerfallunity" @@ -54,3 +108,12 @@ def init(self, organizer: mobase.IOrganizer) -> bool: r"https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/" "Game:-Daggerfall-Unity" ) + GameSavesDirectory = ( + r"%USERPROFILE%/AppData/LocalLow/Daggerfall Workshop/Daggerfall Unity/Saves" + ) + + def listSaves(self, folder: QDir) -> list[mobase.ISaveGame]: + save_games = super().listSaves(folder) + path = Path(folder.absolutePath()) + save_games.extend(DaggerfallSaveGame(f) for f in path.glob("SAVE*")) + return save_games