mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-06 04:38:29 +02:00
global_settings can now be modified in mod_config.json (to change default value for example), but you can't add your own global_settings. Merged track_new_if with override_randm_rew to the global settings replace_random_new
This commit is contained in:
parent
453b631325
commit
47da0f0be4
4 changed files with 40 additions and 20 deletions
|
@ -7,7 +7,7 @@
|
||||||
"TRACK_TEXT_NAME": "getattr(track, 'name', '')",
|
"TRACK_TEXT_NAME": "getattr(track, 'name', '')",
|
||||||
"TRACK_TEXT_AUTHORS": "'\\\\n'.join(author) if isinstance(author := getattr(track, 'author', '/'), list) else author",
|
"TRACK_TEXT_AUTHORS": "'\\\\n'.join(author) if isinstance(author := getattr(track, 'author', '/'), list) else author",
|
||||||
"TRACK_TEXT_WARNING_IF_DISABLED": "bmg_color_text('red', '/') if getattr(track, 'warning', 0) != 0 else ''",
|
"TRACK_TEXT_WARNING_IF_DISABLED": "bmg_color_text('red', '/') if getattr(track, 'warning', 0) != 0 else ''",
|
||||||
"TRACK_TEXT_HIGHLIGHT_START": "bmg_color_raw('azure') if eval(highlight_if if (highlight_if := mod_config.specific_settings['highlight_if'].value) is not None else 'False', env={'track': track}) is True else ''",
|
"TRACK_TEXT_HIGHLIGHT_START": "bmg_color_raw('azure') if eval(highlight_if if (highlight_if := mod_config.specific_settings['highlight_if'].value) is not None else 'False', env={'track': track, 'mod_config': mod_config}) is True else ''",
|
||||||
"TRACK_TEXT_HIGHLIGHT_END": "bmg_color_raw('off')",
|
"TRACK_TEXT_HIGHLIGHT_END": "bmg_color_raw('off')",
|
||||||
|
|
||||||
"SETTINGS_MODE": "mod_config.specific_settings['mode'].value",
|
"SETTINGS_MODE": "mod_config.specific_settings['mode'].value",
|
||||||
|
|
|
@ -4,6 +4,11 @@
|
||||||
"nickname": "MKWF",
|
"nickname": "MKWF",
|
||||||
"variant": "60",
|
"variant": "60",
|
||||||
|
|
||||||
|
"global_settings": {
|
||||||
|
"replace_random_new": {
|
||||||
|
"default": "'Retro' not in getattr(track, 'tags', []) and getattr(track, 'warning', 0) == 0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"specific_settings": {
|
"specific_settings": {
|
||||||
"mode": {
|
"mode": {
|
||||||
"text": {
|
"text": {
|
||||||
|
@ -22,10 +27,10 @@
|
||||||
"fr": "Surligner si"
|
"fr": "Surligner si"
|
||||||
},
|
},
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
"default": "'v' + getattr(track, 'since_version', '') == mod_config.version",
|
||||||
"preview": "track_selecting"
|
"preview": "track_selecting"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"track_new_if": "'Retro' not in getattr(track, 'tags', []) and getattr(track, 'warning', 0) == 0",
|
|
||||||
"lpar_template": "{{ mode if (mode := ## SETTINGS_MODE ##) is not None else 'normal' }}.lpar",
|
"lpar_template": "{{ mode if (mode := ## SETTINGS_MODE ##) is not None else 'normal' }}.lpar",
|
||||||
|
|
||||||
"tags_prefix": {
|
"tags_prefix": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import shutil
|
import shutil
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Generator, Callable, Iterator
|
from typing import Generator, Callable, Iterator, Iterable
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
|
@ -20,11 +20,11 @@ CT_ICON_SIZE: int = 128
|
||||||
|
|
||||||
Thread: any
|
Thread: any
|
||||||
|
|
||||||
global_settings = {
|
default_global_settings: dict[str, dict[str, str]] = {
|
||||||
"force_random_new": {
|
"replace_random_new": {
|
||||||
"text": {
|
"text": {
|
||||||
"en": "Force random new tracks",
|
"en": "Replace random new tracks by",
|
||||||
"fr": "Forcer les courses aléatoires nouvelle"
|
"fr": "Remplacer les courses aléatoires nouvelle par"
|
||||||
},
|
},
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"preview": "track_selecting"
|
"preview": "track_selecting"
|
||||||
|
@ -37,7 +37,7 @@ global_settings = {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"preview": "track_selecting"
|
"preview": "track_selecting"
|
||||||
},
|
},
|
||||||
"sort_tracks_by": {
|
"sort_tracks": {
|
||||||
"text": {
|
"text": {
|
||||||
"en": "Sort tracks by",
|
"en": "Sort tracks by",
|
||||||
"fr": "Trier les courses par"
|
"fr": "Trier les courses par"
|
||||||
|
@ -48,6 +48,21 @@ global_settings = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def merge_dict(dict1: dict[str, dict] | None, dict2: dict[str, dict] | None,
|
||||||
|
dict_keys: Iterable[str] = None) -> dict[str, dict]:
|
||||||
|
"""
|
||||||
|
Merge 2 dict subdict together
|
||||||
|
:return: the merged dict
|
||||||
|
{ "option": {"speed": 1} }, { "option": {"mode": "hard"} } -> { "option": {"speed": 1, "mode": "hard"} }
|
||||||
|
|
||||||
|
"""
|
||||||
|
if dict1 is None: dict1 = {}
|
||||||
|
if dict2 is None: dict2 = {}
|
||||||
|
if dict_keys is None: dict_keys = dict1.keys() | dict2.keys()
|
||||||
|
|
||||||
|
return {key: dict1.get(key, {}) | dict2.get(key, {}) for key in dict_keys}
|
||||||
|
|
||||||
|
|
||||||
class ModConfig:
|
class ModConfig:
|
||||||
"""
|
"""
|
||||||
Representation of a mod
|
Representation of a mod
|
||||||
|
@ -56,7 +71,7 @@ class ModConfig:
|
||||||
__slots__ = ("name", "path", "nickname", "variant", "tags_prefix", "tags_suffix",
|
__slots__ = ("name", "path", "nickname", "variant", "tags_prefix", "tags_suffix",
|
||||||
"default_track", "_tracks", "version", "original_track_prefix", "swap_original_order",
|
"default_track", "_tracks", "version", "original_track_prefix", "swap_original_order",
|
||||||
"keep_original_track", "enable_random_cup", "tags_cups", "track_file_template",
|
"keep_original_track", "enable_random_cup", "tags_cups", "track_file_template",
|
||||||
"multiplayer_disable_if", "track_new_if", "macros", "messages", "global_settings",
|
"multiplayer_disable_if", "macros", "messages", "global_settings",
|
||||||
"specific_settings", "lpar_template")
|
"specific_settings", "lpar_template")
|
||||||
|
|
||||||
def __init__(self, path: Path | str, name: str, nickname: str = None, version: str = None, variant: str = None,
|
def __init__(self, path: Path | str, name: str, nickname: str = None, version: str = None, variant: str = None,
|
||||||
|
@ -65,14 +80,17 @@ class ModConfig:
|
||||||
tracks: list["Track | TrackGroup"] = None, original_track_prefix: bool = 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,
|
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_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,
|
messages: dict[str, dict[str, str]] = None, global_settings: dict[str, dict[str, str]] = None,
|
||||||
specific_settings: dict[str, dict[str, str]] = None, lpar_template: str = None):
|
specific_settings: dict[str, dict[str, str]] = None, lpar_template: str = None):
|
||||||
|
|
||||||
self.path = Path(path)
|
self.path = Path(path)
|
||||||
self.macros: dict = macros if macros is not None else {}
|
self.macros: dict = macros if macros is not None else {}
|
||||||
self.messages: dict = messages if messages is not None else {}
|
self.messages: dict = messages if messages is not None else {}
|
||||||
|
|
||||||
self.global_settings: dict = AbstractModSettings.get(global_settings)
|
self.global_settings: dict = AbstractModSettings.get(merge_dict(
|
||||||
|
default_global_settings, global_settings,
|
||||||
|
dict_keys=default_global_settings.keys() # Avoid modder to add their own settings to globals one
|
||||||
|
))
|
||||||
self.specific_settings: dict = AbstractModSettings.get(
|
self.specific_settings: dict = AbstractModSettings.get(
|
||||||
specific_settings if specific_settings is not None else {}
|
specific_settings if specific_settings is not None else {}
|
||||||
)
|
)
|
||||||
|
@ -91,7 +109,6 @@ class ModConfig:
|
||||||
self.track_file_template: str = track_file_template \
|
self.track_file_template: str = track_file_template \
|
||||||
if track_file_template is not None else "{{ getattr(track, 'sha1', '_') }}"
|
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.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.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.original_track_prefix: bool = original_track_prefix if original_track_prefix is not None else True
|
||||||
|
@ -118,8 +135,7 @@ class ModConfig:
|
||||||
kwargs = {
|
kwargs = {
|
||||||
attr: config_dict.get(attr)
|
attr: config_dict.get(attr)
|
||||||
for attr in cls.__slots__
|
for attr in cls.__slots__
|
||||||
if attr not in ["name", "default_track", "_tracks", "tracks", "path", "macros", "messages",
|
if attr not in ["name", "default_track", "_tracks", "tracks", "path", "macros", "messages"]
|
||||||
"global_settings"]
|
|
||||||
# these keys are treated after or are reserved
|
# these keys are treated after or are reserved
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +222,7 @@ class ModConfig:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
filter_template: str | None = self.global_settings["include_track_if"].value if not ignore_filter else None
|
filter_template: str | None = self.global_settings["include_track_if"].value if not ignore_filter else None
|
||||||
settings_sort: str | None = self.global_settings["sort_tracks_by"].value
|
settings_sort: str | None = self.global_settings["sort_tracks"].value
|
||||||
|
|
||||||
# filter_template_func is the function checking if the track should be included. If no parameter is set,
|
# filter_template_func is the function checking if the track should be included. If no parameter is set,
|
||||||
# then always return True
|
# then always return True
|
||||||
|
|
|
@ -97,11 +97,10 @@ class Track:
|
||||||
:return: is the track new
|
:return: is the track new
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# if the random new have been forced in the settings, use it instead of the default one
|
return mod_config.safe_eval(
|
||||||
template: str = mod_config.global_settings["force_random_new"].value
|
mod_config.global_settings["replace_random_new"].value,
|
||||||
if template is None: template = mod_config.track_new_if
|
env={"track": self}
|
||||||
|
) is True
|
||||||
return mod_config.safe_eval(template, env={"track": self}) is True
|
|
||||||
|
|
||||||
def get_ctfile(self, mod_config: "ModConfig", template: str, hidden: bool = False) -> str:
|
def get_ctfile(self, mod_config: "ModConfig", template: str, hidden: bool = False) -> str:
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue