Merge remote-tracking branch 'upstream/main' into instruction_patch_clean

This commit is contained in:
Silvris
2024-03-14 16:37:57 -05:00
6 changed files with 37 additions and 21 deletions

View File

@@ -8,7 +8,7 @@ if __name__ == "__main__":
import ModuleUpdate
ModuleUpdate.update()
from worlds.Files import AutoPatchRegister, APPatch
from worlds.Files import AutoPatchRegister, APAutoPatchInterface
class RomMeta(TypedDict):
@@ -20,7 +20,7 @@ class RomMeta(TypedDict):
def create_rom_file(patch_file: str) -> Tuple[RomMeta, str]:
auto_handler = AutoPatchRegister.get_handler(patch_file)
if auto_handler:
handler: APPatch = auto_handler(patch_file)
handler: APAutoPatchInterface = auto_handler(patch_file)
target = os.path.splitext(patch_file)[0]+handler.result_file_ending
handler.patch(target)
return {"server": handler.server,

View File

@@ -8,7 +8,7 @@ from enum import IntEnum
import os
import threading
from typing import ClassVar, Dict, Tuple, Any, Optional, Union, BinaryIO, List
from typing import ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO
import bsdiff4
@@ -40,8 +40,6 @@ class AutoPatchRegister(abc.ABCMeta):
return None
current_patch_version: int = 6
class AutoPatchExtensionRegister(type):
extension_types: ClassVar[Dict[str, AutoPatchExtensionRegister]] = {}
@@ -68,6 +66,8 @@ class AutoPatchExtensionRegister(type):
else:
return handler
container_version: int = 6
class InvalidDataError(Exception):
"""
@@ -78,7 +78,7 @@ class InvalidDataError(Exception):
class APContainer:
"""A zipfile containing at least archipelago.json"""
version: int = current_patch_version
version: int = container_version
compression_level: int = 9
compression_method: int = zipfile.ZIP_DEFLATED
game: Optional[str] = None
@@ -152,14 +152,31 @@ class APContainer:
"game": self.game,
# minimum version of patch system expected for patching to be successful
"compatible_version": 5,
"version": current_patch_version,
"version": container_version,
}
class APPatch(APContainer, abc.ABC, metaclass=AutoPatchRegister):
class APPatch(APContainer):
"""
An abstract `APContainer` that defines the requirements for an object
to be used by the `Patch.create_rom_file` function.
An `APContainer` that represents a patch file.
It includes the `procedure` key in the manifest to indicate that it is a patch.
Your implementation should inherit from this if your output file
represents a patch file, but will not be applied with AP's `Patch.py`
"""
procedure: Union[Literal["custom"], List[Tuple[str, List[Any]]]] = "custom"
def get_manifest(self) -> Dict[str, Any]:
manifest = super(APPatch, self).get_manifest()
manifest["procedure"] = self.procedure
manifest["compatible_version"] = 6
return manifest
class APAutoPatchInterface(APPatch, abc.ABC, metaclass=AutoPatchRegister):
"""
An abstract `APPatch` that defines the requirements for a patch
to be applied with AP's `Patch.py`
"""
result_file_ending: str = ".sfc"
@@ -168,11 +185,10 @@ class APPatch(APContainer, abc.ABC, metaclass=AutoPatchRegister):
""" create the output file with the file name `target` """
class APProcedurePatch(APPatch):
class APProcedurePatch(APAutoPatchInterface):
"""
An APPatch that defines a procedure to produce the desired file.
"""
procedure: List[Tuple[str, List[Any]]]
hash: Optional[str] # base checksum of source file
source_data: bytes
patch_file_ending: str = ""

View File

@@ -7,7 +7,7 @@ from typing import Optional, Any
import Utils
from .Locations import AdventureLocation, LocationData
from settings import get_settings
from worlds.Files import APDeltaPatch, AutoPatchRegister, APContainer
from worlds.Files import APPatch, AutoPatchRegister
import bsdiff4
@@ -78,7 +78,7 @@ class BatNoTouchLocation:
return ret_dict
class AdventureDeltaPatch(APContainer, metaclass=AutoPatchRegister):
class AdventureDeltaPatch(APPatch, metaclass=AutoPatchRegister):
hash = ADVENTUREHASH
game = "Adventure"
patch_file_ending = ".apadvn"

View File

@@ -4,7 +4,7 @@ import zipfile
from copy import deepcopy
from .Regions import object_id_table
from Utils import __version__
from worlds.Files import APContainer
from worlds.Files import APPatch
import pkgutil
settings_template = yaml.load(pkgutil.get_data(__name__, "data/settings.yaml"), yaml.Loader)
@@ -116,10 +116,10 @@ def generate_output(self, output_directory):
APMQ.write_contents(zf)
class APMQFile(APContainer):
class APMQFile(APPatch):
game = "Final Fantasy Mystic Quest"
def get_manifest(self):
manifest = super().get_manifest()
manifest["patch_file_ending"] = ".apmq"
return manifest
return manifest

View File

@@ -29,14 +29,14 @@ from .TextBox import character_table, NORMAL_LINE_WIDTH, rom_safe_text
from .texture_util import ci4_rgba16patch_to_ci8, rgba16_patch
from .Utils import __version__
from worlds.Files import APContainer
from worlds.Files import APPatch
from Utils import __version__ as ap_version
AP_PROGRESSION = 0xD4
AP_JUNK = 0xD5
class OoTContainer(APContainer):
class OoTContainer(APPatch):
game: str = 'Ocarina of Time'
def __init__(self, patch_data: bytes, base_path: str, output_directory: str,

View File

@@ -5,7 +5,7 @@ import zipfile
from typing_extensions import override
import Utils
from worlds.Files import APPatch
from worlds.Files import APAutoPatchInterface
from zilliandomizer.patch import Patcher
@@ -14,7 +14,7 @@ from .gen_data import GenData
USHASH = 'd4bf9e7bcf9a48da53785d2ae7bc4270'
class ZillionPatch(APPatch):
class ZillionPatch(APAutoPatchInterface):
hash = USHASH
game = "Zillion"
patch_file_ending = ".apzl"