from pathlib import Path from typing import Any from lmm.games.game import ProtonGame from lmm.profile import Profile from lmm.overlayfs import OverlayFSMount from lmm.const import LMM_GAMES_PATH from lmm.runners.base import runner_from_config GAME_NAME = "ProjectDivaMegaMix" class ProjectDivaMegaMixProfile(Profile): # The names of the directories the the mods directory. mods: list[str] def __init__(self, name: str, mods: list[str], **kwargs): super().__init__(GAME_NAME, name, **kwargs) self.mods = mods def get_mod_names(self) -> list[str]: return self.mods class ProjectDivaMegaMixGame(ProtonGame): def __init__(self, profiles: list[ProjectDivaMegaMixProfile], **kwargs): super().__init__(GAME_NAME, "1761390", profiles, **kwargs) @property def installation_path(self) -> Path: return ( self.steam_library / "steamapps/common/Hatsune Miku Project DIVA Mega Mix Plus" ) @property def game_executables(self) -> list[Path]: return [ self.installation_path / "DivaMegaMix.exe", ] def prepare_overlays( self, profile: ProjectDivaMegaMixProfile ) -> list[OverlayFSMount]: return [ OverlayFSMount( upper=self.installation_path, lower=profile.mods, mount=self.installation_path, cd=LMM_GAMES_PATH / self.name, ), ] def to_dict(self) -> dict[str, Any]: return { "profiles": [ { "name": profile.name, "mods": [ { "name": mod, } for mod in profile.mods ], } for profile in self.profiles ] } @classmethod def from_dict(cls, data: dict[str, Any]) -> "ProjectDivaMegaMixGame": profiles = [] for profile in data["profiles"]: mods = [mod["name"] for mod in profile["mods"]] if "runner" in profile: runner = runner_from_config(profile["runner"]) else: runner = None profiles.append( ProjectDivaMegaMixProfile( profile["name"], mods, runner=runner, ), ) if "default_runner" in data: default_runner = runner_from_config(data["default_runner"]) else: default_runner = None return ProjectDivaMegaMixGame(profiles, default_runner=default_runner)