mirror of
https://github.com/ModOrganizer2/modorganizer-basic_games.git
synced 2026-07-27 14:07:29 -07:00
113 lines
3.6 KiB
Python
113 lines
3.6 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
from PyQt6.QtCore import QDir
|
|
|
|
import mobase
|
|
|
|
from ..basic_features import BasicLocalSavegames, BasicModDataChecker, GlobPatterns
|
|
from ..basic_features.basic_save_game_info import (
|
|
BasicGameSaveGame,
|
|
BasicGameSaveGameInfo,
|
|
)
|
|
from ..basic_game import BasicGame
|
|
|
|
|
|
def parse_schedule1_save_metadata(save_path: Path, save: mobase.ISaveGame):
|
|
metadata_file = save_path / "Game.json"
|
|
try:
|
|
with open(metadata_file) as file:
|
|
meta_data = json.load(file)
|
|
name = meta_data["OrganisationName"]
|
|
if name != (save_name := save.getName()):
|
|
name = f"{save_name} ({name})"
|
|
return {
|
|
"Name": name,
|
|
"Game version": meta_data["GameVersion"],
|
|
}
|
|
except (FileNotFoundError, json.JSONDecodeError):
|
|
return None
|
|
|
|
|
|
class Schedule1SaveGame(BasicGameSaveGame):
|
|
def getName(self) -> str:
|
|
metadata_file = self._filepath / "Game.json"
|
|
try:
|
|
with open(metadata_file) as file:
|
|
meta_data = json.load(file)
|
|
return meta_data["OrganisationName"]
|
|
except (FileNotFoundError, json.JSONDecodeError):
|
|
return (
|
|
f"[{self.getSaveGroupIdentifier().rstrip('s')}] {self._filepath.stem}"
|
|
)
|
|
|
|
def getSaveGroupIdentifier(self) -> str:
|
|
return self._filepath.parent.name
|
|
|
|
|
|
class Schedule1Game(BasicGame):
|
|
Name = "Schedule I Support Plugin"
|
|
Author = "shellbj"
|
|
Version = "1.0.0"
|
|
|
|
GameName = "Schedule I"
|
|
GameShortName = "scheduleI"
|
|
GameNexusName = "schedule1"
|
|
GameNexusId = 7381
|
|
GameSteamId = 3164500
|
|
|
|
GameBinary = "Schedule I.exe"
|
|
GameValidShortNames = ["schedule1", "scheduleI"]
|
|
GameDataPath = ""
|
|
GameSavesDirectory = r"%USERPROFILE%/AppData/LocalLow/TVGS/Schedule I/Saves"
|
|
GameSupportURL = (
|
|
r"https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/"
|
|
"Game:-Schedule-I"
|
|
)
|
|
|
|
def init(self, organizer: mobase.IOrganizer) -> bool:
|
|
super().init(organizer)
|
|
self._register_feature(
|
|
BasicModDataChecker(
|
|
GlobPatterns(
|
|
unfold=[
|
|
# Fixes bad packaging for select mods
|
|
"ModManager&PhoneApp",
|
|
"AutoClearCompletedDeals",
|
|
],
|
|
valid=[
|
|
"meta.ini", # Included in installed mod folder.
|
|
"Mods",
|
|
"Plugins",
|
|
"UserData", # might not be needed
|
|
],
|
|
delete=[
|
|
"*.md",
|
|
"icon.png",
|
|
"fomod", # not sure this is needed either
|
|
],
|
|
move={
|
|
"*.dll": "Mods/",
|
|
# If these even exisit outside of mod packs
|
|
"*.ini": "UserData/",
|
|
"*.cfg": "UserData/",
|
|
"*.json": "UserData/",
|
|
},
|
|
)
|
|
)
|
|
)
|
|
self._register_feature(BasicLocalSavegames(self))
|
|
self._register_feature(
|
|
BasicGameSaveGameInfo(
|
|
None, # no snapshot to add to the widget
|
|
parse_schedule1_save_metadata,
|
|
)
|
|
)
|
|
return True
|
|
|
|
def listSaves(self, folder: QDir) -> list[mobase.ISaveGame]:
|
|
return [
|
|
Schedule1SaveGame(path)
|
|
for path in Path(folder.absolutePath()).glob("*/SaveGame_[1-5]")
|
|
]
|