Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions games/game_schedule1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
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.savesDirectory()))
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]")
]