Source code for yasuki_core.paths
import os
from pathlib import Path
_PACKAGE_DIR = Path(__file__).resolve().parent
BUNDLED_IMAGES_DIR = _PACKAGE_DIR / "assets" / "images"
DEFAULTS_DIR = BUNDLED_IMAGES_DIR / "defaults"
OVERLAYS_DIR = BUNDLED_IMAGES_DIR / "overlays"
FONTS_DIR = _PACKAGE_DIR / "assets" / "fonts"
FATE_BACK: Path = BUNDLED_IMAGES_DIR / "fate_back_new.jpg"
DYNASTY_BACK: Path = BUNDLED_IMAGES_DIR / "dynasty_back_new.jpg"
_DEFAULT_SETS_DIR = Path.cwd() / "sets"
SETS_DIR: Path = Path(os.environ.get("YASUKI_SETS_DIR", str(_DEFAULT_SETS_DIR)))
DATABASE_DIR = _PACKAGE_DIR / "assets" / "database"
ART_LAYOUT_PATH = _PACKAGE_DIR / "assets" / "art_layout.json"
[docs]
def resolve_set_image_path(relative_path: str) -> Path | None:
"""
Resolve a DB-stored image path to an absolute filesystem path.
The database stores paths like ``"sets/celestial_edition/card.png"``.
This strips the leading ``sets/`` prefix and resolves against SETS_DIR.
Parameters
----------
relative_path : str
Relative path as stored in the database
Returns
-------
resolved : Path or None
Absolute path, or None if the input is empty
"""
if not relative_path:
return None
stripped = relative_path.removeprefix("sets/")
return SETS_DIR / stripped
DEFAULT_STRATEGY: Path = DEFAULTS_DIR / "generic_strategy.jpg"
DEFAULT_RING: Path = DEFAULTS_DIR / "generic_ring.jpg"
DEFAULT_SENSEI: Path = DEFAULTS_DIR / "generic_sensei.jpg"
DEFAULT_WIND: Path = DEFAULTS_DIR / "generic_wind.jpg"
DEFAULT_STRONGHOLD: Path = DEFAULTS_DIR / "generic_stronghold.jpg"
DEFAULT_ITEM: Path = DEFAULTS_DIR / "generic_item.jpg"
DEFAULT_FOLLOWER: Path = DEFAULTS_DIR / "generic_follower.jpg"
DEFAULT_SPELL: Path = DEFAULTS_DIR / "generic_spell.jpg"
DEFAULT_PERSONALITY: Path = DEFAULTS_DIR / "generic_personality.jpg"
DEFAULT_HOLDING: Path = DEFAULTS_DIR / "generic_holding.jpg"
DEFAULT_EVENT: Path = DEFAULTS_DIR / "generic_event.jpg"
DEFAULT_REGION: Path = DEFAULTS_DIR / "generic_region.jpg"
DEFAULT_CELESTIAL: Path = DEFAULTS_DIR / "generic_celestial.jpg"
_GREAT_CLANS = frozenset(
{
"crab",
"crane",
"dragon",
"lion",
"mantis",
"naga",
"phoenix",
"scorpion",
"spider",
"unicorn",
}
)
[docs]
def default_personality_image(clans: list[str] | None) -> Path:
"""The clan-specific placeholder frame for a Personality with no scanned print. Fall back to the
unaligned frame (``generic_personality.jpg``) when no great-clan alignment is present."""
for clan in clans or []:
slug = clan.lower().replace(" clan", "").strip()
if slug in _GREAT_CLANS:
return DEFAULTS_DIR / f"generic_personality_{slug}.jpg"
return DEFAULT_PERSONALITY