arenas are now supported by the installer

This commit is contained in:
Faraphel 2022-02-08 19:24:17 +01:00
parent fbeb66250d
commit 2aa84b8fab
3 changed files with 69 additions and 35 deletions

View file

@ -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

View file

@ -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:

View file

@ -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 += (