diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 2d445a77..c3ae2b04 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -89,9 +89,6 @@ components: List[Component] = [ Component('SNI Client', 'SNIClient', file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3', '.apsmw', '.apl2ac')), - # BizHawk - Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, - file_identifier=SuffixIdentifier()), Component('Links Awakening DX Client', 'LinksAwakeningClient', file_identifier=SuffixIdentifier('.apladx')), Component('LttP Adjuster', 'LttPAdjuster'), diff --git a/worlds/_bizhawk/client.py b/worlds/_bizhawk/client.py index b614c083..32a6e370 100644 --- a/worlds/_bizhawk/client.py +++ b/worlds/_bizhawk/client.py @@ -16,12 +16,22 @@ else: BizHawkClientContext = object +def launch_client(*args) -> None: + from .context import launch + launch_subprocess(launch, name="BizHawkClient") + +component = Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, func=launch_client, + file_identifier=SuffixIdentifier()) +components.append(component) + + class AutoBizHawkClientRegister(abc.ABCMeta): game_handlers: ClassVar[Dict[Tuple[str, ...], Dict[str, BizHawkClient]]] = {} def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> AutoBizHawkClientRegister: new_class = super().__new__(cls, name, bases, namespace) + # Register handler if "system" in namespace: systems = (namespace["system"],) if type(namespace["system"]) is str else tuple(sorted(namespace["system"])) if systems not in AutoBizHawkClientRegister.game_handlers: @@ -30,6 +40,19 @@ class AutoBizHawkClientRegister(abc.ABCMeta): if "game" in namespace: AutoBizHawkClientRegister.game_handlers[systems][namespace["game"]] = new_class() + # Update launcher component's suffixes + if "patch_suffix" in namespace: + if namespace["patch_suffix"] is not None: + existing_identifier: SuffixIdentifier = component.file_identifier + new_suffixes = [*existing_identifier.suffixes] + + if type(namespace["patch_suffix"]) is str: + new_suffixes.append(namespace["patch_suffix"]) + else: + new_suffixes.extend(namespace["patch_suffix"]) + + component.file_identifier = SuffixIdentifier(*new_suffixes) + return new_class @staticmethod @@ -45,11 +68,14 @@ class AutoBizHawkClientRegister(abc.ABCMeta): class BizHawkClient(abc.ABC, metaclass=AutoBizHawkClientRegister): system: ClassVar[Union[str, Tuple[str, ...]]] - """The system that the game this client is for runs on""" + """The system(s) that the game this client is for runs on""" game: ClassVar[str] """The game this client is for""" + patch_suffix: ClassVar[Optional[Union[str, Tuple[str, ...]]]] + """The file extension(s) this client is meant to open and patch (e.g. ".apz3")""" + @abc.abstractmethod async def validate_rom(self, ctx: BizHawkClientContext) -> bool: """Should return whether the currently loaded ROM should be handled by this client. You might read the game name @@ -75,13 +101,3 @@ class BizHawkClient(abc.ABC, metaclass=AutoBizHawkClientRegister): def on_package(self, ctx: BizHawkClientContext, cmd: str, args: dict) -> None: """For handling packages from the server. Called from `BizHawkClientContext.on_package`.""" pass - - -def launch_client(*args) -> None: - from .context import launch - launch_subprocess(launch, name="BizHawkClient") - - -if not any(component.script_name == "BizHawkClient" for component in components): - components.append(Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, func=launch_client, - file_identifier=SuffixIdentifier()))