BizHawkClient: Add better launcher component suffix handling (#2367)
This commit is contained in:
parent
6061bffbb6
commit
0f7ebe389e
|
@ -89,9 +89,6 @@ components: List[Component] = [
|
||||||
Component('SNI Client', 'SNIClient',
|
Component('SNI Client', 'SNIClient',
|
||||||
file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3',
|
file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3',
|
||||||
'.apsmw', '.apl2ac')),
|
'.apsmw', '.apl2ac')),
|
||||||
# BizHawk
|
|
||||||
Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT,
|
|
||||||
file_identifier=SuffixIdentifier()),
|
|
||||||
Component('Links Awakening DX Client', 'LinksAwakeningClient',
|
Component('Links Awakening DX Client', 'LinksAwakeningClient',
|
||||||
file_identifier=SuffixIdentifier('.apladx')),
|
file_identifier=SuffixIdentifier('.apladx')),
|
||||||
Component('LttP Adjuster', 'LttPAdjuster'),
|
Component('LttP Adjuster', 'LttPAdjuster'),
|
||||||
|
|
|
@ -16,12 +16,22 @@ else:
|
||||||
BizHawkClientContext = object
|
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):
|
class AutoBizHawkClientRegister(abc.ABCMeta):
|
||||||
game_handlers: ClassVar[Dict[Tuple[str, ...], Dict[str, BizHawkClient]]] = {}
|
game_handlers: ClassVar[Dict[Tuple[str, ...], Dict[str, BizHawkClient]]] = {}
|
||||||
|
|
||||||
def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> AutoBizHawkClientRegister:
|
def __new__(cls, name: str, bases: Tuple[type, ...], namespace: Dict[str, Any]) -> AutoBizHawkClientRegister:
|
||||||
new_class = super().__new__(cls, name, bases, namespace)
|
new_class = super().__new__(cls, name, bases, namespace)
|
||||||
|
|
||||||
|
# Register handler
|
||||||
if "system" in namespace:
|
if "system" in namespace:
|
||||||
systems = (namespace["system"],) if type(namespace["system"]) is str else tuple(sorted(namespace["system"]))
|
systems = (namespace["system"],) if type(namespace["system"]) is str else tuple(sorted(namespace["system"]))
|
||||||
if systems not in AutoBizHawkClientRegister.game_handlers:
|
if systems not in AutoBizHawkClientRegister.game_handlers:
|
||||||
|
@ -30,6 +40,19 @@ class AutoBizHawkClientRegister(abc.ABCMeta):
|
||||||
if "game" in namespace:
|
if "game" in namespace:
|
||||||
AutoBizHawkClientRegister.game_handlers[systems][namespace["game"]] = new_class()
|
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
|
return new_class
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -45,11 +68,14 @@ class AutoBizHawkClientRegister(abc.ABCMeta):
|
||||||
|
|
||||||
class BizHawkClient(abc.ABC, metaclass=AutoBizHawkClientRegister):
|
class BizHawkClient(abc.ABC, metaclass=AutoBizHawkClientRegister):
|
||||||
system: ClassVar[Union[str, Tuple[str, ...]]]
|
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]
|
game: ClassVar[str]
|
||||||
"""The game this client is for"""
|
"""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
|
@abc.abstractmethod
|
||||||
async def validate_rom(self, ctx: BizHawkClientContext) -> bool:
|
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
|
"""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:
|
def on_package(self, ctx: BizHawkClientContext, cmd: str, args: dict) -> None:
|
||||||
"""For handling packages from the server. Called from `BizHawkClientContext.on_package`."""
|
"""For handling packages from the server. Called from `BizHawkClientContext.on_package`."""
|
||||||
pass
|
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()))
|
|
||||||
|
|
Loading…
Reference in New Issue