diff --git a/bemani/format/afp.py b/bemani/format/afp.py index d290b62..931814d 100644 --- a/bemani/format/afp.py +++ b/bemani/format/afp.py @@ -311,7 +311,7 @@ class SWF: return resources.get(tagid, "UNKNOWN") - def __parse_tag(self, ap2data: bytes, tagid: int, size: int, dataoffset: int, verbose: bool = False) -> None: + def __parse_tag(self, ap2_version: int, afp_version: int, ap2data: bytes, tagid: int, size: int, dataoffset: int, prefix: str = "", verbose: bool = False) -> None: # Suppress debug text unless asked if verbose: def vprint(*args: Any, **kwargs: Any) -> None: # type: ignore @@ -333,18 +333,29 @@ class SWF: add_coverage(dataoffset, size) shape_reference = f"{self.exported_name}_shape{shape_id}" - vprint(f" Tag ID: {shape_id}, Reference: {shape_reference}") + vprint(f"{prefix} Tag ID: {shape_id}, Reference: {shape_reference}") elif tagid == self.AP2_DEFINE_SPRITE: - wat, sprite_id = struct.unpack(" None: + def __parse_tags(self, ap2_version: int, afp_version: int, ap2data: bytes, tags_base_offset: int, prefix: str = "", verbose: bool = False) -> None: # Suppress debug text unless asked if verbose: def vprint(*args: Any, **kwargs: Any) -> None: # type: ignore @@ -358,28 +369,39 @@ class SWF: def add_coverage(*args: Any, **kwargs: Any) -> None: # type: ignore pass - tags_unknown1, tags_unknown2, tags_count, tags_unknown3, tags_unknown4, tags_offset, tags_unknown5 = struct.unpack( - "> 22) & 0x3FF + size = tag & 0x3FFFFF - tagid = (tag >> 22) & 0x3FF - size = ((tag & 0x3FFFFF) + 3) & 0xFFFFFFFC # Round to multiple of 4. + if size > 0x200000: + raise Exception(f"Invalid tag size {size}") - vprint(f" Tag: {hex(tagid)} ({self.tag_to_name(tagid)}), Size: {size}, Offset: {hex(tags_offset + 4)}") - self.__parse_tag(ap2data, tagid, size, tags_offset + 4, verbose=verbose) - - tags_offset += size + 4 # Skip past tag header and data. + vprint(f"{prefix} Tag: {hex(tagid)} ({self.tag_to_name(tagid)}), Size: {hex(size)}, Offset: {hex(offset + 4)}") + self.__parse_tag(ap2_version, afp_version, ap2data, tagid, size, offset + 4, prefix=prefix, verbose=verbose) + offset += size + 4 # Skip past tag header and data. def __descramble(self, scrambled_data: bytes, descramble_info: bytes) -> bytes: swap_len = {