diff --git a/source/CT_Config.py b/source/CT_Config.py index 3609661..c077cba 100644 --- a/source/CT_Config.py +++ b/source/CT_Config.py @@ -11,8 +11,10 @@ class CT_Config: def __init__(self, version: str = None, name: str = None, nickname: str = None, game_variant: str = "01", region: int = None, cheat_region: int = None, tags_color: dict = None, prefix_list: list = None, suffix_list: list = None, - tag_retro: str = "Retro", default_track: Track = None, pack_path: str = "", - file_process: dict = None, file_structure: dict = None, default_sort: str = ""): + tag_retro: str = "Retro", default_track: dict = None, pack_path: str = "", + file_process: dict = None, file_structure: dict = None, default_sort: str = "", + cup: list = None, tracks_list: list = None, + *args, **kwargs): self.version = version self.name = name @@ -24,10 +26,6 @@ class CT_Config: self.ordered_cups = [] self.unordered_tracks = [] - self.tags_color = tags_color if tags_color else {} - self.prefix_list = prefix_list if tags_color else [] - self.suffix_list = suffix_list if tags_color else [] - self.tag_retro = tag_retro self.default_track = default_track self.pack_path = pack_path @@ -40,6 +38,41 @@ class CT_Config: self.filter_track_highlight = lambda track: False self.filter_track_random_new = lambda track: getattr(track, "new", False) + self.sort_track_attr = default_sort + + self.default_track = Track().load_from_json(default_track if default_track else {}) + Cup.default_track = self.default_track + + for id, cup_json in enumerate(cup if cup else []): + # tracks with defined order + cup = Cup(id=id) + cup.load_from_json(cup_json) + self.ordered_cups.append(cup) + + for track_json in tracks_list if tracks_list else []: + # unordered tracks + track = get_trackdata_from_json(track_json) + self.unordered_tracks.extend([track] * track.weight) + + if pack_path: + with open(f"{pack_path}/file_process.json", encoding="utf8") as fp_file: + self.file_process = json.load(fp_file) + with open(f"{pack_path}/file_structure.json", encoding="utf8") as fs_file: + self.file_structure = json.load(fs_file) + + dir = self.file_process['placement'].get('cup_icon_dir') if 'placement' in self.file_process else None + if not dir: dir = "/ct_icons/" + Cup.icon_dir = f"{self.pack_path}/file/{dir}/" + + wu8_dirname = self.file_process["track_dir"] if "track_dir" in self.file_process else "/Track-WU8/" + Track._wu8_dir = f"{self.pack_path}/file/{wu8_dirname}/" + + Track._szs_dir = "./file/Track/" + Track.tag_retro = tag_retro if tag_retro else {} + Track.prefix_list = prefix_list if prefix_list else [] + Track.suffix_list = suffix_list if suffix_list else [] + Track.tags_color = tags_color if tags_color else {} + def add_ordered_cup(self, cup: Cup) -> None: """ add a cup to the config @@ -160,54 +193,7 @@ class CT_Config: :param pack_path: path to the pack (parent dir of the ct_config.json) :param ctconfig_json: json of the ctconfig to load """ - self.ordered_cups = [] - self.unordered_tracks = [] - self.all_tracks = [] - - self.pack_path = pack_path - - with open(f"{pack_path}/file_process.json", encoding="utf8") as fp_file: - self.file_process = json.load(fp_file) - with open(f"{pack_path}/file_structure.json", encoding="utf8") as fs_file: - self.file_structure = json.load(fs_file) - - dir = self.file_process['placement'].get('cup_icon_dir') if 'placement' in self.file_process else None - if not dir: dir = "/ct_icons/" - Cup.icon_dir = f"{self.pack_path}/file/{dir}/" - - # default track - self.default_track = Track() - if "default_track" in ctconfig_json: self.default_track.load_from_json(ctconfig_json["default_track"]) - Cup.default_track = self.default_track - - for id, cup_json in enumerate(ctconfig_json["cup"] if "cup" in ctconfig_json else []): - # tracks with defined order - cup = Cup(id=id) - cup.load_from_json(cup_json) - self.ordered_cups.append(cup) - - for track_json in ctconfig_json["tracks_list"] if "tracks_list" in ctconfig_json else []: - # unordered tracks - track = get_trackdata_from_json(track_json) - self.unordered_tracks.append(track) - - self.version = ctconfig_json.get("version") - - if "name" in ctconfig_json: self.name = ctconfig_json["name"] - if "game_variant" in ctconfig_json: self.game_variant = ctconfig_json["game_variant"] - if "default_sort" in ctconfig_json: self.sort_track_attr = ctconfig_json["default_sort"] - self.nickname = ctconfig_json["nickname"] if "nickname" in ctconfig_json else self.name - - for param in ["region", "cheat_region", "tags_color", "prefix_list", "suffix_list", "tag_retro"]: - setattr(self, param, ctconfig_json.get(param)) - - wu8_dirname = self.file_process["track_dir"] if "track_dir" in self.file_process else "/Track-WU8/" - Track._wu8_dir = f"{self.pack_path}/file/{wu8_dirname}/" - Track._szs_dir = "./file/Track/" - Track.tag_retro = self.tag_retro - Track.prefix_list = self.prefix_list - Track.suffix_list = self.suffix_list - Track.tags_color = self.tags_color + self.__init__(pack_path=pack_path, **ctconfig_json) return self diff --git a/source/Game.py b/source/Game.py index f531fa4..b4c6730 100644 --- a/source/Game.py +++ b/source/Game.py @@ -6,6 +6,7 @@ import json from source.definition import * from source.wszst import * from source.Error import * +from source.Track import Track class Game: @@ -301,15 +302,15 @@ class Game: track_id = bmgtrack[start_track_id:start_track_id + 3] if track_id[1] in "1234": # if the track is a original track from the wii prefix = "Wii" - if prefix in self.common.ct_config.tags_color: - prefix = "\\\\c{" + self.common.ct_config.tags_color[prefix] + "}" + prefix + "\\\\c{off}" + if prefix in Track.tags_color: + prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" prefix += " " elif track_id[1] in "5678": # if the track is a retro track from the original game prefix, *track_name = track_name.split(" ") track_name = " ".join(track_name) - if prefix in self.common.ct_config.tags_color: - prefix = "\\\\c{" + self.common.ct_config.tags_color[prefix] + "}" + prefix + "\\\\c{off}" + if prefix in Track.tags_color: + prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" prefix += " " track_id = hex(bmgID_track_move[track_id])[2:] @@ -425,7 +426,7 @@ class Game: max_step = ( len(self.common.ct_config.file_process["img_encode"]) + - len(self.common.ct_config.all_tracks) + + self.common.ct_config.get_tracks_count() + 3 + len("EGFIS") ) @@ -454,7 +455,8 @@ class Game: self.common.gui_main.progress(show=False) def generate_cticons(self): - file = self.common.ct_config.file_process["placement"].get("ct_icons") + file = self.common.ct_config.file_process["placement"].get("ct_icons") \ + if "placement" in self.common.ct_config.file_process else None if not file: file = "ct_icons.tpl.png" file = f"{self.common.ct_config.pack_path}/file/{file}" diff --git a/source/Track.py b/source/Track.py index b193c2a..11f105c 100644 --- a/source/Track.py +++ b/source/Track.py @@ -31,7 +31,7 @@ class Track: def __init__(self, name: str = " ", author: str = "Nintendo", special: str = "T11", music: str = "T11", sha1: str = None, since_version: str = None, score: int = -1, warning: int = 0, - version: str = None, tags: list = None, is_in_group: bool = False, *args, **kwargs): + version: str = None, tags: list = None, is_in_group: bool = False, weight: int = 1, *args, **kwargs): """ Track class :param name: track name @@ -60,6 +60,7 @@ class Track: self.warning = warning # Track bug level (1 = minor, 2 = major) self.version = version self.tags = tags if tags else [] + self.weight = weight self._is_in_group = is_in_group @@ -196,8 +197,7 @@ class Track: load the track from a dictionary :param track_json: track's dictionary """ - for key, value in track_json.items(): # load all value in the json as class attribute - setattr(self, key, value) + self.__init__(**track_json) return self @@ -222,7 +222,10 @@ class TrackGroup(Track): for key, value in group_json.items(): # load all value in the json as class attribute if key == "group": for track_json in value: - self.tracks.append(Track(is_in_group=True, *args, **kwargs).load_from_json(track_json)) + track = Track(is_in_group=True, *args, **kwargs).load_from_json(track_json) + self.tracks.extend( + [track] * track.weight + ) else: setattr(self, key, value) diff --git a/source/wszst/lec.py b/source/wszst/lec.py index 0aa3b9d..87c236b 100644 --- a/source/wszst/lec.py +++ b/source/wszst/lec.py @@ -8,8 +8,8 @@ WLECT_PATH = "./tools/szs/wlect" def patch(lecode_file: str = f"./file/lecode-PAL.bin", dest_lecode_file: str = f"./files/rel/lecode-PAL.bin", game_track_path: str = "./files/Race/Course/", - copy_track_paths: list = [], - move_track_paths: list = [], + copy_track_paths: list = None, + move_track_paths: list = None, ctfile_path: str = "./file/CTFILE.txt", lpar_path: str = "./file/lpar-normal.txt") -> None: """ @@ -17,10 +17,14 @@ def patch(lecode_file: str = f"./file/lecode-PAL.bin", :param lecode_file: path to the lecode file :param dest_lecode_file: destination of the lecode file :param game_track_path: subpath to the track directory - :param copy_track_paths: where are stored the track to move + :param copy_track_paths: where are stored the track to copy + :param move_track_paths: where are stored the track to move :param ctfile_path: where is the ctfile (track and cup definition) :param lpar_path: where is the lpar_path (game modification like speed, speedometer, ...) """ + if not copy_track_paths: copy_track_paths = [] + if not move_track_paths: move_track_paths = [] + cmd = [ WLECT_PATH, "patch", lecode_file, "-od", dest_lecode_file, "--track-dir", game_track_path, "--le-define", ctfile_path, "--lpar", lpar_path, "--overwrite" @@ -29,5 +33,12 @@ def patch(lecode_file: str = f"./file/lecode-PAL.bin", cmd.extend(["--copy-tracks", path]) for path in move_track_paths: cmd.extend(["--move-tracks", path]) + print(cmd) - subprocess.run(cmd, creationflags=subprocess.CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE) + subprocess.run( + cmd, + creationflags=subprocess.CREATE_NO_WINDOW, + check=True, + stdout=subprocess.PIPE, + timeout=900 + )