From 2aa84b8fab58b643327a35dc6635db2360f25900 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Tue, 8 Feb 2022 19:24:17 +0100 Subject: [PATCH] arenas are now supported by the installer --- source/CT_Config.py | 20 ++++++++++++- source/Game.py | 71 ++++++++++++++++++++++++++------------------- source/Track.py | 13 ++++++--- 3 files changed, 69 insertions(+), 35 deletions(-) diff --git a/source/CT_Config.py b/source/CT_Config.py index ee66568..4d94b17 100644 --- a/source/CT_Config.py +++ b/source/CT_Config.py @@ -15,7 +15,7 @@ class CT_Config: file_process: dict = None, file_structure: dict = None, default_sort: str = "", cup: list = None, tracks_list: list = None, add_original_track_prefix: bool = True, swap_original_order: bool = True, keep_original_track: bool = True, - enable_random_cup: bool = True, + enable_random_cup: bool = True, arenas: list = None, *args, **kwargs): self.version = version @@ -32,6 +32,7 @@ class CT_Config: self.ordered_cups = [] self.unordered_tracks = [] + self.arenas = [] self.default_track = default_track @@ -61,6 +62,12 @@ class CT_Config: track = get_trackdata_from_json(track_json) self.unordered_tracks.extend([track] * track.weight) + for arena_json in arenas if arenas else []: + # arena + arena_json["is_arena"] = True + arena = get_trackdata_from_json(arena_json) + self.arenas.append(arena) + if pack_path: with open(f"{pack_path}/file_process.json", encoding="utf8") as fp_file: self.file_process = json.load(fp_file) @@ -142,6 +149,13 @@ class CT_Config: ctfile.write(cup.get_ctfile(race=False, **kwargs)) rctfile.write(cup.get_ctfile(race=True, **kwargs)) + if self.arenas: + ctfile.write("\n"); rctfile.write("\n") + + for arena in self.arenas: + ctfile.write(arena.get_ctfile(race=False, **kwargs)) + rctfile.write(arena.get_ctfile(race=True, **kwargs)) + def get_tracks(self): for data in self.unordered_tracks + self.ordered_cups: for track in data.get_tracks(): yield track @@ -230,3 +244,7 @@ class CT_Config: possibilities.add(key) return sorted(possibilities) + + def get_tracks_and_arenas(self): + for track in self.get_tracks(): yield track + for arena in self.arenas: yield arena diff --git a/source/Game.py b/source/Game.py index ee16fa4..f90225a 100644 --- a/source/Game.py +++ b/source/Game.py @@ -291,42 +291,47 @@ class Game: with open(extra_common_path, "w", encoding="utf8") as f: f.write("#BMG\n") - if self.common.ct_config.keep_original_track: - for bmgtrack in bmgtracks.split("\n"): - if "=" in bmgtrack: + for bmgtrack in bmgtracks.split("\n"): + if "=" in bmgtrack: - prefix = "" - track_name = bmgtrack[bmgtrack.find("= ") + 2:] + prefix = "" + track_name = bmgtrack[bmgtrack.find("= ") + 2:] - if "T" in bmgtrack[:bmgtrack.find("=")]: - start_track_id: int = bmgtrack.find("T") # index where the bmg track definition start - 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 Track.tags_color: - prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" - prefix += " " + if "T" in bmgtrack[:bmgtrack.find("=")]: + if not self.common.ct_config.keep_original_track: continue - 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 Track.tags_color: - prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" - prefix += " " + start_track_id: int = bmgtrack.find("T") # index where the bmg track definition start + 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 Track.tags_color: + prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" + prefix += " " - track_id = hex(bmgID_track_move[track_id])[2:] + 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 Track.tags_color: + prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" + prefix += " " - else: # Arena - start_track_id = bmgtrack.find("U") + 1 # index where the bmg arena definition start - track_id = bmgtrack[start_track_id:start_track_id + 2] - track_id = hex((int(track_id[0]) - 1) * 5 + (int(track_id[1]) - 1) + 0x7020)[2:] + track_id = hex(bmgID_track_move[track_id])[2:] - if not self.common.ct_config.add_original_track_prefix: prefix = "" - f.write(f" {track_id}\t= {prefix}{track_name}\n") + else: # Arena + start_track_id: int = bmgtrack.find("U") # index where the bmg arena definition start + track_id = bmgtrack[start_track_id:start_track_id + 3] - else: + if track_id[0] == "2": # if this is the retro cup of arenas + prefix, *track_name = track_name.split(" ") + track_name = " ".join(track_name) + prefix = "\\\\c{" + Track.tags_color[prefix] + "}" + prefix + "\\\\c{off}" + + if not self.common.ct_config.add_original_track_prefix: prefix = "" + f.write(f" {track_id}\t= {prefix}{track_name}\n") + + if not self.common.ct_config.keep_original_track: for cup_index, cup in enumerate(self.common.ct_config.get_all_cups(), start=1): - if cup_index > 8: break # only keep the 8 first cup + if cup_index > 8: break # only keep the 8 first cup for track_index, track in enumerate(cup.get_tracks(), start=1): f.write( f" T{cup_index}{track_index}\t= " @@ -334,6 +339,13 @@ class Game: f"\n" ) + for arena in self.common.ct_config.arenas: + f.write( + f" U{arena.special[1:]}\t= " + f"{arena.get_track_formatted_name(filter_highlight=self.common.ct_config.filter_track_highlight)}" + f"\n" + ) + def patch_bmg(self, gamefile: str) -> None: """ Patch bmg file (text file) @@ -368,7 +380,6 @@ class Game: bmgs=[gamefile + ".d/message/Common.bmg", "./file/ExtraCommon.txt"]) shutil.rmtree(gamefile + ".d") - os.remove("./file/ExtraCommon.txt") def process_bmg_replacement(bmg_content: str, bmg_language: str) -> str: """ @@ -589,7 +600,7 @@ class Game: total_track = self.common.ct_config.get_tracks_count() self.common.gui_main.progress(max=total_track, indeter=False, show=True) - for i, track in enumerate(self.common.ct_config.get_tracks()): + for i, track in enumerate(self.common.ct_config.get_tracks_and_arenas()): while True: max_process = self.common.gui_main.intvar_process_track.get() if len(thread_list) < max_process: diff --git a/source/Track.py b/source/Track.py index 93342ef..f8da445 100644 --- a/source/Track.py +++ b/source/Track.py @@ -37,7 +37,8 @@ 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, weight: int = 1, *args, **kwargs): + version: str = None, tags: list = None, is_in_group: bool = False, weight: int = 1, + is_arena: bool = False, *args, **kwargs): """ Track class :param name: track name @@ -69,6 +70,7 @@ class Track: self.weight = weight self._is_in_group = is_in_group + self._is_arena = is_arena def __repr__(self) -> str: """ @@ -127,16 +129,19 @@ class Track: :param race: is it a text used for Race_*.szs ? :return: ctfile definition for the track """ - track_type = "T" + track_type = " T" if not filter_random_new: filter_random_new = lambda track: not (track.tags_retro in track.tags) and track.warning != WARNING_DOLPHIN track_flag = 0x01 if filter_random_new(self) else 0x00 if self._is_in_group: - track_type = "H" + track_type = " H" track_flag |= 0x04 - ctfile_track = f' {track_type} {self.music}; {self.special}; {hex(track_flag)}; ' + if self._is_arena: + track_type = "A" + + ctfile_track = f'{track_type} {self.music}; {self.special}; {hex(track_flag)}; ' if race: ctfile_track += (