Files

99 lines
3.1 KiB
Python
Raw Permalink Normal View History

2023-09-15 19:34:22 -05:00
import json
from collections.abc import Mapping
from pathlib import Path
2023-09-15 19:34:22 -05:00
from PyQt6.QtCore import QDateTime, QDir
2023-09-15 19:34:22 -05:00
2025-04-25 08:23:10 +02:00
import mobase
from ..basic_features.basic_save_game_info import (
BasicGameSaveGame,
BasicGameSaveGameInfo,
format_date,
)
2021-03-02 19:25:13 +01:00
from ..basic_game import BasicGame
2023-09-15 19:34:22 -05:00
class BaSSaveGame(BasicGameSaveGame):
def __init__(self, filepath: Path):
2023-09-15 19:34:22 -05:00
super().__init__(filepath)
2023-09-19 03:16:10 -05:00
with open(self._filepath, "rb") as save:
save_data = json.load(save)
self._gameMode = save_data["mode"]["saveData"]["gameModeId"]
self._gender = (
"Male"
if save_data["customization"]["creatureId"] == "PlayerDefaultMale"
else "Female"
)
self._ethnicity = save_data["customization"]["ethnicGroupId"]
2023-09-15 19:34:22 -05:00
h, m, s = save_data["playTime"].split(":")
self._elapsed = (float(h), int(m), float(s))
2023-09-19 03:16:10 -05:00
f_stat = self._filepath.stat()
self._created = f_stat.st_birthtime
2023-09-19 03:16:10 -05:00
self._modified = f_stat.st_mtime
2023-09-15 19:34:22 -05:00
2023-09-16 02:55:38 -05:00
def getName(self) -> str:
return f"{self.getPlayerSlug()} - {self._gameMode}"
2023-09-15 19:34:22 -05:00
def getCreationTime(self) -> QDateTime:
2023-09-16 02:55:38 -05:00
return QDateTime.fromSecsSinceEpoch(int(self._created))
def getModifiedTime(self) -> QDateTime:
return QDateTime.fromSecsSinceEpoch(int(self._modified))
def getPlayerSlug(self) -> str:
return f"{self._gender} {self._ethnicity}"
2023-09-15 19:34:22 -05:00
def getElapsed(self) -> str:
return (
f"{self._elapsed[0]} hours, "
f"{self._elapsed[1]} minutes, "
f"{int(self._elapsed[2])} seconds"
)
2023-09-15 19:34:22 -05:00
def getGameMode(self) -> str:
2023-09-16 02:55:38 -05:00
return self._gameMode
2023-09-15 19:34:22 -05:00
def bas_parse_metadata(p: Path, save: mobase.ISaveGame) -> Mapping[str, str]:
assert isinstance(save, BaSSaveGame)
return {
"Character": save.getPlayerSlug(),
"Game Mode": save.getGameMode(),
"Created At": format_date(save.getCreationTime()),
"Last Saved": format_date(save.getModifiedTime()),
"Session Duration": save.getElapsed(),
}
2023-09-15 19:34:22 -05:00
2021-03-02 19:25:13 +01:00
class BaSGame(BasicGame):
Name = "Blade & Sorcery Plugin"
Author = "R3z Shark & Silarn & Jonny_Bro"
Version = "0.5.1"
2021-03-02 19:25:13 +01:00
GameName = "Blade & Sorcery"
GameShortName = "bladeandsorcery"
GameBinary = "BladeAndSorcery.exe"
2023-09-16 02:55:38 -05:00
GameDataPath = r"BladeAndSorcery_Data\\StreamingAssets\\Mods"
2023-09-15 13:22:06 -05:00
GameDocumentsDirectory = "%DOCUMENTS%/My Games/BladeAndSorcery"
GameSavesDirectory = "%GAME_DOCUMENTS%/Saves/Default"
GameSaveExtension = "chr"
2021-03-02 19:25:13 +01:00
GameSteamId = 629730
2021-12-27 00:57:18 -07:00
GameSupportURL = (
r"https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/"
"Game:-Blade-&-Sorcery"
)
2023-09-15 19:34:22 -05:00
def init(self, organizer: mobase.IOrganizer) -> bool:
BasicGame.init(self, organizer)
self._register_feature(
BasicGameSaveGameInfo(get_metadata=bas_parse_metadata, max_width=400)
)
2023-09-15 19:34:22 -05:00
return True
2023-09-16 02:55:38 -05:00
def listSaves(self, folder: QDir) -> list[mobase.ISaveGame]:
2023-09-16 02:55:38 -05:00
ext = self._mappings.savegameExtension.get()
return [
BaSSaveGame(path) for path in Path(folder.absolutePath()).glob(f"*.{ext}")
2023-09-16 02:55:38 -05:00
]