1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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))
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]")
]
|