mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-02 10:48:29 +02:00
110 lines
4.4 KiB
Python
110 lines
4.4 KiB
Python
from pathlib import Path
|
|
from typing import Generator
|
|
|
|
from source.mkw.ModConfig import ModConfig
|
|
from source.wt import szs
|
|
import json
|
|
|
|
|
|
class ExtractedGame:
|
|
"""
|
|
Class that represents an extracted game
|
|
"""
|
|
|
|
def __init__(self, path: Path | str):
|
|
self.path = Path(path)
|
|
|
|
def extract_autoadd(self, destination_path: Path | str) -> Generator[dict, None, None]:
|
|
"""
|
|
Extract all the autoadd files from the game to destination_path
|
|
:param destination_path: directory where the autoadd files will be extracted
|
|
:return: directory where the autoadd files were extracted
|
|
"""
|
|
yield {"description": "Extracting autoadd files...", "determinate": False}
|
|
szs.autoadd(self.path / "files/Race/Course/", destination_path)
|
|
|
|
def install_mystuff(self) -> Generator[dict, None, None]:
|
|
"""
|
|
Install mystuff directory
|
|
:return:
|
|
"""
|
|
yield {"description": "Installing MyStuff directory...", "determinate": False}
|
|
...
|
|
|
|
def install_file(self, mod_config: ModConfig, patch_directory: Path | str, subfile: Path | str) \
|
|
-> Generator[dict, None, None]:
|
|
"""
|
|
Install a file into the game
|
|
:param patch_directory: patch_directory where the subfile is located
|
|
:param subfile: subfile to install
|
|
:param mod_config: the mod to install
|
|
"""
|
|
subfile = Path(subfile)
|
|
yield {"description": f"Patch {patch_directory.name}\nInstalling {subfile.name}...", "determinate": False}
|
|
|
|
'''
|
|
configuration = {
|
|
"base": "/files/test.json", # path a another json file to use as a base
|
|
|
|
"mode": "copy", # copy, replace, ignore, edit the subfile [default: copy]
|
|
# if edit is set, use the file in the extracted game as a source
|
|
# replace can't be used inside szs
|
|
|
|
"replace_regex": None, # regex expression to match the file on the game to replace
|
|
"if": "True", # safe eval expression to check if the file should be installed
|
|
|
|
"operation": { # other operation for the file
|
|
"img-generate": {
|
|
# width, height, default color, ... can be determined from the base file
|
|
"format": "RGB", # type of the image
|
|
"layers": [
|
|
{"type": "image", ...},
|
|
{"type": "text", ...}
|
|
]
|
|
}
|
|
|
|
"tpl-encode": {"encoding": "TPL.RGB565"}, # encode an image to a tpl with the given format
|
|
|
|
"bmg-replace": {
|
|
"mode": "regex" # regex or id
|
|
"template": {
|
|
"CWF": "{{ ONLINE_SERVICE }}", # regex type expression
|
|
"0x203F": "{{ ONLINE_SERVICE }}" # id type expression
|
|
}
|
|
}
|
|
}
|
|
}
|
|
'''
|
|
|
|
configuration = { # default configuration
|
|
"mode": "copy",
|
|
"if": "True",
|
|
}
|
|
configuration_path = subfile.with_suffix(subfile.suffix + ".json")
|
|
if configuration_path.exists(): configuration |= json.loads(configuration_path.read_text(encoding="utf8"))
|
|
|
|
def install_patch(self, mod_config: ModConfig, patch_directory: Path | str) -> Generator[dict, None, None]:
|
|
"""
|
|
Install a patch into the game
|
|
:param mod_config: the mod to install
|
|
:param patch_directory: directory containing the patch
|
|
"""
|
|
patch_directory = Path(patch_directory)
|
|
yield {"description": f"Installing Patch {patch_directory.parent.name}...", "determinate": False}
|
|
|
|
for subfile in filter(lambda sf: sf.suffix == ".json", patch_directory.glob("*")):
|
|
self.install_file(mod_config, patch_directory, subfile)
|
|
|
|
def install_all_patch(self, mod_config: ModConfig) -> Generator[dict, None, None]:
|
|
"""
|
|
Install all patchs of the mod_config into the game
|
|
:param mod_config: the mod to install
|
|
:return:
|
|
"""
|
|
yield {"description": "Installing all Patch...", "determinate": False}
|
|
|
|
# for all directory that are in the root of the mod, and don't start with an underscore,
|
|
# for all the subdirectory named "_PATCH", apply the patch
|
|
for part_directory in mod_config.get_mod_directory().glob("[!_]*"):
|
|
for patch_directory in part_directory.glob("_PATCH/"):
|
|
self.install_patch(mod_config, patch_directory)
|