From f13b18aa5798047ce9b946252ba64957d37a7ac9 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Thu, 11 Aug 2022 18:55:57 +0200 Subject: [PATCH] fully implemented the AbstractTrack and DefaultTrack, removing the necessity of default_track in mod_config.json --- source/mkw/ModConfig.py | 10 +++++----- source/mkw/Track/AbstractTrack.py | 9 +++++---- source/mkw/Track/CustomTrack.py | 15 +++++++++------ source/mkw/Track/DefaultTrack.py | 7 +++++-- source/mkw/Track/__init__.py | 4 +++- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/source/mkw/ModConfig.py b/source/mkw/ModConfig.py index 7779ee8..367a0b0 100644 --- a/source/mkw/ModConfig.py +++ b/source/mkw/ModConfig.py @@ -9,7 +9,7 @@ from source.mkw import Tag from source.mkw.Cup import Cup from source.mkw.MKWColor import bmg_color_text, bmg_color_raw from source.mkw.ModSettings import AbstractModSettings -from source.mkw.Track.CustomTrack import CustomTrack +from source.mkw.Track import CustomTrack, DefaultTrack import json from source.mkw.OriginalTrack import OriginalTrack @@ -68,14 +68,14 @@ class ModConfig: Representation of a mod """ - __slots__ = ("name", "path", "nickname", "variant", "default_track", "_tracks", "version", + __slots__ = ("name", "path", "nickname", "variant", "_tracks", "version", "original_track_prefix", "swap_original_order", "keep_original_track", "enable_random_cup", "tags_cups", "track_file_template", "multiplayer_disable_if", "macros", "messages", "global_settings", "specific_settings", "lpar_template", "tags_template") def __init__(self, path: Path | str, name: str, nickname: str = None, version: str = None, variant: str = None, - tags_cups: list[Tag] = None, default_track: "Track | TrackGroup" = None, + tags_cups: list[Tag] = None, tracks: list["Track | TrackGroup"] = None, original_track_prefix: bool = None, swap_original_order: bool = None, keep_original_track: bool = None, enable_random_cup: bool = None, track_file_template: str = None, multiplayer_disable_if: str = None, macros: dict[str, str] = None, @@ -269,7 +269,7 @@ class ModConfig: # if there is still tracks in the buffer, create a cup with them and fill with default> if len(track_buffer) > 0: - track_buffer.extend([self.default_track] * (4 - len(track_buffer))) + track_buffer.extend([DefaultTrack()] * (4 - len(track_buffer))) yield Cup(tracks=track_buffer, cup_name=f"{current_tag_name}/{current_tag_count + 1}") def get_unordered_cups(self) -> Generator["Cup", None, None]: @@ -291,7 +291,7 @@ class ModConfig: # if there is still tracks in the buffer, create a cup with them and fill with default if len(track_buffer) > 0: - track_buffer.extend([self.default_track] * (4 - len(track_buffer))) + track_buffer.extend([DefaultTrack()] * (4 - len(track_buffer))) yield Cup(tracks=track_buffer) def get_cups(self) -> Generator["Cup", None, None]: diff --git a/source/mkw/Track/AbstractTrack.py b/source/mkw/Track/AbstractTrack.py index 28a5366..e7f234e 100644 --- a/source/mkw/Track/AbstractTrack.py +++ b/source/mkw/Track/AbstractTrack.py @@ -28,7 +28,7 @@ class AbstractTrack(ABC): setattr(self, key, value) def __repr__(self): - return f"<{self.__class__.__name__} {id(self)}>" + return f"<{self.__class__.__name__} {hex(id(self))}>" def get_tracks(self) -> Generator["AbstractTrack", None, None]: """ @@ -46,10 +46,11 @@ class AbstractTrack(ABC): :param default: default value if no tag template is found :return: formatted representation of the tag """ - for tag in filter(lambda tag: tag in mod_config.tags_template[template_name], self.tags): - return mod_config.multiple_safe_eval(mod_config.tags_template[template_name][tag], env={"tag": tag}) + for tag in filter(lambda tag: tag in mod_config.tags_templates[template_name], self.tags): + return mod_config.multiple_safe_eval(mod_config.tags_templates[template_name][tag], env={"tag": tag}) return default + @abstractmethod def repr_format(self, mod_config: "ModConfig", template: str) -> str: """ return the representation of the track from the format @@ -57,7 +58,7 @@ class AbstractTrack(ABC): :param mod_config: configuration of the mod :return: formatted representation of the track """ - return mod_config.multiple_safe_eval(template, env={"track": self, "get_tag_template": self.get_tag_template}) + ... @abstractmethod def get_filename(self, mod_config: "ModConfig") -> str: diff --git a/source/mkw/Track/CustomTrack.py b/source/mkw/Track/CustomTrack.py index 6784808..f2c68cc 100644 --- a/source/mkw/Track/CustomTrack.py +++ b/source/mkw/Track/CustomTrack.py @@ -7,7 +7,6 @@ class CustomTrack(AbstractTrack): """ Represent a custom track """ - def __repr__(self): return f"<{self.__class__.__name__} name={getattr(self, 'name', '/')} tags={getattr(self, 'tags', '/')}>" @@ -23,13 +22,17 @@ class CustomTrack(AbstractTrack): return TrackGroup.from_dict(track_dict) return cls(**track_dict) + def repr_format(self, mod_config: "ModConfig", template: str) -> str: + return mod_config.multiple_safe_eval( + template, + env={ + "track": self, + "get_tag_template": lambda *args, **kwargs: self.get_tag_template(mod_config, *args, **kwargs) + } + ) + def get_filename(self, mod_config: "ModConfig") -> str: return self.repr_format(mod_config=mod_config, template=mod_config.track_file_template) def is_new(self, mod_config: "ModConfig") -> bool: - """ - Return if the track should be considered as new for random selection - :param mod_config: mod configuration - :return: is the track new - """ return mod_config.safe_eval(mod_config.global_settings["replace_random_new"].value, env={"track": self}) is True diff --git a/source/mkw/Track/DefaultTrack.py b/source/mkw/Track/DefaultTrack.py index a503604..79d61b5 100644 --- a/source/mkw/Track/DefaultTrack.py +++ b/source/mkw/Track/DefaultTrack.py @@ -2,8 +2,11 @@ from source.mkw.Track.AbstractTrack import AbstractTrack class DefaultTrack(AbstractTrack): + def repr_format(self, mod_config: "ModConfig", template: str) -> str: + return " " # the name is always a blank space. Using nothing result in the filename being used instead + def get_filename(self, mod_config: "ModConfig") -> str: - return "beginner_course" + return "beginner_course" # by default, use the T11 track, beginner_course def is_new(self, mod_config: "ModConfig") -> bool: - return False + return False # default track are never selected for random cup diff --git a/source/mkw/Track/__init__.py b/source/mkw/Track/__init__.py index 3e54be3..3d36e8b 100644 --- a/source/mkw/Track/__init__.py +++ b/source/mkw/Track/__init__.py @@ -1 +1,3 @@ -from source.mkw.Track import CustomTrack, DefaultTrack, AbstractTrack +from source.mkw.Track.CustomTrack import CustomTrack +from source.mkw.Track.DefaultTrack import DefaultTrack +from source.mkw.Track.AbstractTrack import AbstractTrack