anime-blk-stuff/parsers/ai.py
2026-01-05 12:33:47 +03:00

182 lines
6.4 KiB
Python

# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
import kaitaistruct
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
class AssetIndex(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.type_mapping_count = self._io.read_u4le()
self.type_mapping = []
for i in range(self.type_mapping_count):
self.type_mapping.append(AssetIndex.TypeMappingEntry(self._io, self, self._root))
self.asset_count = self._io.read_u4le()
self.assets = []
for i in range(self.asset_count):
self.assets.append(AssetIndex.AssetInfo(self._io, self, self._root))
self.dependency_count = self._io.read_u4le()
self.magic_31 = self._io.read_u4le()
self.magic_32 = self._io.read_u4le()
self.dependencies = []
for i in range(self.dependency_count):
self.dependencies.append(AssetIndex.DependencyInfo(self._io, self, self._root))
self.preload_blocks_count = self._io.read_u4le()
self.preload_blocks = []
for i in range(self.preload_blocks_count):
self.preload_blocks.append(self._io.read_u4le())
self.preload_shader_blocks_count = self._io.read_u4le()
self.preload_shader_blocks = []
for i in range(self.preload_shader_blocks_count):
self.preload_shader_blocks.append(self._io.read_u4le())
self.block_group_count = self._io.read_u4le()
self.block_groups = []
for i in range(self.block_group_count):
self.block_groups.append(AssetIndex.BlockGroup(self._io, self, self._root))
self.block_info_count = self._io.read_u4le()
self.block_infos = []
for i in range(self.block_info_count):
self.block_infos.append(AssetIndex.BlockInfo(self._io, self, self._root))
class BlockInfo(KaitaiStruct):
"""Specifies which assets this specific block contains and their offsets in the BLK file."""
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.block_id = self._io.read_u4le()
self.asset_offset_count = self._io.read_u4le()
self.asset_offsets = []
for i in range(self.asset_offset_count):
self.asset_offsets.append(AssetIndex.AssetOffsetInfo(self._io, self, self._root))
class BlockListMagic(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.block_list = self._io.read_u4le()
self.magic = self._io.read_u2le()
self.magic_2 = self._io.read_u1()
class TypeMappingEntry(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.name = AssetIndex.String(self._io, self, self._root)
self.mapped_to = AssetIndex.String(self._io, self, self._root)
class String(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.len = self._io.read_u4le()
self.data = (self._io.read_bytes(self.len)).decode(u"UTF-8")
class DependencyInfo(KaitaiStruct):
"""Describes that asset asset_id depends on assets from the specified list."""
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.asset_id = self._io.read_u4le()
self.dependency_info_count = self._io.read_u4le()
self.dependencies_list = []
for i in range(self.dependency_info_count):
self.dependencies_list.append(self._io.read_u4le())
class AssetOffsetInfo(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.path_hash_pre = self._io.read_u4le()
self.offset = self._io.read_u4le()
self.size = self._io.read_u4le()
class BlockGroup(KaitaiStruct):
"""List of BLKs in a directory specified by the group_id."""
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.group_id = self._io.read_u4le()
self.block_count = self._io.read_u4le()
self.block_list = []
for i in range(self.block_count):
self.block_list.append(AssetIndex.BlockListMagic(self._io, self, self._root))
class AssetInfo(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self._read()
def _read(self):
self.path_hash_pre = self._io.read_u1()
self.path_hash_last = self._io.read_u4le()
self.magic = []
for i in range(3):
self.magic.append(self._io.read_u1())
self.magic_real = self._io.read_u1()
self.magic_2 = self._io.read_u1()
self.sub_asset_id = self._io.read_u4le()
if self.magic_real == 2:
self.magic_conditional = []
for i in range(5):
self.magic_conditional.append(self._io.read_u1())