"""Generate UZDoom configuration profiles for Steam Deck controls.""" from __future__ import annotations import logging from doomdeck.application.control_mapping import build_uzdoom_control_profiles from doomdeck.domain.control_mapping import SourcePortControlProfile from doomdeck.domain.deck import STEAM_DECK_HEIGHT, STEAM_DECK_TARGET_FPS, STEAM_DECK_WIDTH from doomdeck.domain.models import Dirs from doomdeck.infrastructure.files import atomic_write_text UZDOOM_STEAM_DECK_GLOBAL_SETTINGS = [ ("vid_fullscreen", "true"), ("vid_defwidth", str(STEAM_DECK_WIDTH)), ("vid_defheight", str(STEAM_DECK_HEIGHT)), ("vid_aspect", "0"), ("vid_cropaspect", "false"), ("vid_vsync", "true"), ("vid_maxfps", str(STEAM_DECK_TARGET_FPS)), ("vid_preferbackend", "1"), ("vid_rendermode", "4"), ("vk_exclusivefullscreen", "false"), ("autoloadwidescreen", "true"), ("gl_fxaa", "0"), ("gl_multisample", "1"), ("gl_ssao", "0"), ("gl_light_shadowmap", "false"), ("gl_texture_filter", "0"), ("gl_texture_filter_anisotropic", "4"), ("vid_scale_linear", "false"), ("vid_scalefactor", "1"), ("vid_scalemode", "0"), ("m_blockcontrollers", "false"), ("use_joystick", "true"), ] def build_uzdoom_ini() -> str: lines = ["; Generated by doomdeck", "[GlobalSettings]"] lines.extend(f"{key}={value}" for key, value in UZDOOM_STEAM_DECK_GLOBAL_SETTINGS) lines.append("") return "\n".join(lines) def build_uzdoom_deck_autoexec_settings() -> str: return "\n".join(f"{key} {value}" for key, value in UZDOOM_STEAM_DECK_GLOBAL_SETTINGS) def build_uzdoom_autoexec(profile: SourcePortControlProfile) -> str: lines = [ "// Generated by doomdeck", f"// {profile.description}", "// Steam Deck display, graphics, keyboard/mouse Steam Input, and menu defaults.", "", build_uzdoom_deck_autoexec_settings(), "", ] lines.extend(f"{key} {value}" for key, value in profile.cvars) lines.append("") lines.extend(f"alias {alias.name} {alias.command}" for alias in profile.aliases) lines.append("") lines.extend(f"bind {binding.input_name} {binding.command}" for binding in profile.bindings) lines.append("") return "\n".join(lines) def write_uzdoom_configs(dirs: Dirs, dry_run: bool, logger: logging.Logger) -> None: ini = build_uzdoom_ini() for profile in build_uzdoom_control_profiles(): profile_dir = dirs.uzdoom_config / profile.directory_name atomic_write_text(profile_dir / "autoexec.cfg", build_uzdoom_autoexec(profile), dry_run, logger) atomic_write_text(profile_dir / "uzdoom.ini", ini, dry_run, logger)