aboutsummaryrefslogtreecommitdiff
path: root/libs/basic_games/games/game_schedule1.py
blob: 8ed98d698a26a1323c022106512763d095352818 (plain)
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]")
        ]