the lpar file is now customizable with the mod settings function

This commit is contained in:
Faraphel 2022-08-01 23:06:21 +02:00
parent 56b03f22c6
commit d1b17e0a77
7 changed files with 32 additions and 11 deletions

View file

@ -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 ''"
}

View file

@ -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) }}",

View file

@ -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/"]
)

View file

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

View file

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

View file

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

View file

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