diff --git a/Pack/MKWFaraphel/macros.json b/Pack/MKWFaraphel/macros.json index 7987521..1aab164 100644 --- a/Pack/MKWFaraphel/macros.json +++ b/Pack/MKWFaraphel/macros.json @@ -8,5 +8,7 @@ "TRACK_TEXT_AUTHORS": "'\\n'.join(getattr(track, 'author')) if isinstance(getattr(track, 'author', ''), list) else getattr(track, 'author', '/')", "TRACK_TEXT_WARNING_IF_DISABLED": "bmg_color_text('red', '/') if getattr(track, 'warning', 0) != 0 else ''", + "SETTINGS_MODE": "getattr(getattr(mod_config, 'specific_settings')['mode'], 'value')", + "IF_NO_WARNING": "if getattr(track, 'warning', 0) == 0 else ''" } \ No newline at end of file diff --git a/Pack/MKWFaraphel/mod_config.json b/Pack/MKWFaraphel/mod_config.json index 97dfadd..aeca2d7 100644 --- a/Pack/MKWFaraphel/mod_config.json +++ b/Pack/MKWFaraphel/mod_config.json @@ -18,6 +18,7 @@ } }, "track_new_if": "'Retro' not in getattr(track, 'tags', []) and getattr(track, 'warning', 0) == 0", + "lpar_template": "{{ ## SETTINGS_MODE ## if ## SETTINGS_MODE ## is not None else 'normal' }}.lpar", "tags_prefix": { "MSRDS": "{{ bmg_color_text('green', TAG) }}", diff --git a/source/mkw/ExtractedGame.py b/source/mkw/ExtractedGame.py index 475d890..ab76cae 100644 --- a/source/mkw/ExtractedGame.py +++ b/source/mkw/ExtractedGame.py @@ -12,6 +12,11 @@ from source.wt.wstrt import StrPath Game: any +class PathOutsideMod(Exception): + def __init__(self, forbidden_path: Path, allowed_range: Path): + super().__init__(f"Error : path {forbidden_path} outside of allowed range {allowed_range}") + + class ExtractedGame: """ Class that represents an extracted game @@ -116,12 +121,15 @@ class ExtractedGame: ct_file = (cache_directory / "ctfile.lpar") ct_file.write_text(mod_config.get_ctfile(template="-")) - # TODO: the lpar file should be customizable + lpar_dir: Path = mod_config.path.parent / "_LPAR/" + lpar: Path = lpar_dir / mod_config.safe_eval(mod_config.lpar_template, multiple=True) + if not lpar.is_relative_to(lpar_dir): raise PathOutsideMod(lpar, lpar_dir) + for lecode_file in (self.path / "files/rel/").glob("lecode-*.bin"): lec.patch( lecode_file=lecode_file, ct_file=ct_file, - lpar=mod_config.path.parent / "_LPAR/normal.lpar", + lpar=lpar, game_tracks_directory=self.path / "files/Race/Course/", copy_tracks_directories=[cache_directory / "original-tracks/", cache_directory / "custom-tracks/"] ) diff --git a/source/mkw/ModConfig.py b/source/mkw/ModConfig.py index d1ac664..829b859 100644 --- a/source/mkw/ModConfig.py +++ b/source/mkw/ModConfig.py @@ -50,7 +50,8 @@ class ModConfig: __slots__ = ("name", "path", "nickname", "variant", "tags_prefix", "tags_suffix", "default_track", "_tracks", "version", "original_track_prefix", "swap_original_order", "keep_original_track", "enable_random_cup", "tags_cups", "track_file_template", - "multiplayer_disable_if", "track_new_if", "macros", "messages", "global_settings", "specific_settings") + "multiplayer_disable_if", "track_new_if", "macros", "messages", "global_settings", + "specific_settings", "lpar_template") def __init__(self, path: Path | str, name: str, nickname: str = None, version: str = None, variant: str = None, tags_prefix: dict[Tag, str] = None, tags_suffix: dict[Tag, str] = None, @@ -59,7 +60,7 @@ class ModConfig: 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, track_new_if: str = None, messages: dict[str, dict[str, str]] = None, - specific_settings: dict[str, dict[str, str]] = None): + specific_settings: dict[str, dict[str, str]] = None, lpar_template: str = None): self.path = Path(path) self.macros: dict = macros if macros is not None else {} @@ -85,6 +86,7 @@ class ModConfig: if track_file_template is not None else "{{ getattr(track, 'sha1', '_') }}" self.multiplayer_disable_if: str = multiplayer_disable_if if multiplayer_disable_if is not None else "False" self.track_new_if: str = track_new_if if track_new_if is not None else "True" + self.lpar_template: str = lpar_template if lpar_template is not None else "normal.lpar" self.original_track_prefix: bool = original_track_prefix if original_track_prefix is not None else True self.swap_original_order: bool = swap_original_order if swap_original_order is not None else True diff --git a/source/mkw/ModSettings/Choices.py b/source/mkw/ModSettings/Choices.py index 3416989..852892d 100644 --- a/source/mkw/ModSettings/Choices.py +++ b/source/mkw/ModSettings/Choices.py @@ -13,15 +13,15 @@ class Choices(AbstractModSettings): type = "choices" def __init__(self, choices: list[str], value: str = None, enabled: bool = False): - self.value = value if value is not None else choices[0] + self._value = value if value is not None else choices[0] self.enabled = enabled self.choices = choices def tkinter_show(self, master: ttk.LabelFrame, checkbox) -> None: super().tkinter_show(master, checkbox) - value_variable = tkinter.StringVar(master, value=self.value) - value_variable.trace_add("write", lambda *_: setattr(self, "value", value_variable.get())) + value_variable = tkinter.StringVar(master, value=self._value) + value_variable.trace_add("write", lambda *_: setattr(self, "_value", value_variable.get())) combobox = ttk.Combobox(master, values=self.choices, textvariable=value_variable) combobox.grid(row=1, column=1, sticky="EW") diff --git a/source/mkw/ModSettings/String.py b/source/mkw/ModSettings/String.py index bf6a4e9..6e1c8ec 100644 --- a/source/mkw/ModSettings/String.py +++ b/source/mkw/ModSettings/String.py @@ -14,15 +14,15 @@ class String(AbstractModSettings): type = "string" def __init__(self, value: str = None, preview: str = None, enabled: bool = False): - self.value: str = value if value is not None else "" + self._value: str = value if value is not None else "" self.enabled = enabled self.preview: str | None = preview def tkinter_show(self, master: ttk.LabelFrame, checkbox) -> None: super().tkinter_show(master, checkbox) - value_variable = tkinter.StringVar(master, value=self.value) - value_variable.trace_add("write", lambda *_: setattr(self, "value", value_variable.get())) + value_variable = tkinter.StringVar(master, value=self._value) + value_variable.trace_add("write", lambda *_: setattr(self, "_value", value_variable.get())) entry = ttk.Entry(master, textvariable=value_variable) entry.grid(row=1, column=1, sticky="EW") diff --git a/source/mkw/ModSettings/__init__.py b/source/mkw/ModSettings/__init__.py index fe7263a..053708f 100644 --- a/source/mkw/ModSettings/__init__.py +++ b/source/mkw/ModSettings/__init__.py @@ -14,13 +14,21 @@ class AbstractModSettings(ABC): """ type: str # type name of the settings - value: str # value for the settings enabled: bool # is the settings enabled + _value: str # value for the settings @abstractmethod def __init__(self, value: str = None, preview: str = None, enabled: bool = False): ... + @property + def value(self) -> "any | None": + """ + If the option is enabled, return the value, else return None + :return: + """ + return self._value if self.enabled else None + @abstractmethod def tkinter_show(self, master: ttk.LabelFrame, checkbox) -> None: """