class TerrainInfo(mrc.Block): width = mrc.UInt8(0x0000) height = mrc.UInt8(0x0001) base_offset = mrc.UInt16_LE(0x0002) mask_rel_offset = mrc.UInt16_LE(0x0004) unknown_1 = mrc.UInt16_LE(0x0006) vgagr = mrc.StoreRef(TerrainImage, mrc.Ref('_parent._vgagr.terrain_store.store'), mrc.Ref('base_offset'), mrc.Ref('size')) @property def size(self): return self.width * self.height * 5 // 8 @property def mask_offset(self): return self.mask_rel_offset - self.base_offset #return self.width*self.height*4//8 @property def mask_stride(self): return self.width * self.height * 4 // 8 @property def mask_size(self): return self.width * self.height // 8
class FileLookup(mrc.Block): offset = mrc.UInt32_LE(0x00) size = mrc.UInt32_LE(0x04) file = mrc.StoreRef(mrc.Unknown, store=mrc.Ref('_parent.files_store'), offset=mrc.Ref('offset'), size=mrc.Ref('size'), transform=BoppinCompressor())
class SHAFile( mrc.Block ): tileset_offsets = mrc.UInt32_LE( 0x0000, count=128 ) tileset_sizes = mrc.UInt16_LE( 0x0200, count=128 ) tileset_data = mrc.Bytes( 0x0300 ) tilesets = mrc.StoreRef( Tileset, mrc.Ref( 'store' ), mrc.Ref( 'tileset_offsets' ), mrc.Ref( 'tileset_sizes' ), count=128 ) def __init__( self, *args, **kwargs ): self.store = mrc.Store( self, mrc.Ref( 'tileset_data' ) ) super().__init__( *args, **kwargs )
class ScriptConstantFloat(mrc.Block): offset = mrc.UInt32_BE(0x00) value = mrc.StoreRef(ScriptFloat, mrc.Ref('_parent._parent.consts_store'), offset=mrc.Ref('offset'), size=None) @property def repr(self): return self.value.repr
class InteractiveInfo(mrc.Block): """Contains a Ground style definition for an interactive object.""" anim_flags = mrc.UInt16_LE(0x0000) start_frame = mrc.UInt8(0x0002) end_frame = mrc.UInt8(0x0003) width = mrc.UInt8(0x0004) height = mrc.UInt8(0x0005) frame_data_size = mrc.UInt16_LE(0x0006) mask_rel_offset = mrc.UInt16_LE(0x0008) unknown_1 = mrc.UInt16_LE(0x000a) unknown_2 = mrc.UInt16_LE(0x000c) trigger_x_raw = mrc.UInt16_LE(0x000e) trigger_y_raw = mrc.UInt16_LE(0x0010) trigger_width_raw = mrc.UInt8(0x0012) trigger_height_raw = mrc.UInt8(0x0013) trigger_effect = mrc.UInt8(0x0014, enum=TriggerEffect) base_offset = mrc.UInt16_LE(0x0015) preview_frame = mrc.UInt16_LE(0x0017) unknown_3 = mrc.UInt16_LE(0x0019) #: Sound effect to play. Only used when trigger_effect is set to TRAP. sound_effect = mrc.UInt8(0x001b, enum=SoundEffect) vgagr = mrc.StoreRef(InteractiveImage, mrc.Ref('_parent._vgagr.interact_store.store'), mrc.Ref('base_offset'), mrc.Ref('size')) @property def size(self): return self.frame_data_size * self.end_frame @property def plane_padding(self): return self.width * self.height // 8 @property def trigger_x(self): return self.trigger_x_raw * 4 @property def trigger_y(self): return self.trigger_y_raw * 4 - 4 @property def trigger_width(self): return self.trigger_width_raw * 4 @property def trigger_height(self): return self.trigger_height_raw * 4
class ScriptFunction(mrc.Block): name_index = mrc.UInt16_BE(0x00) unk1 = mrc.UInt16_BE(0x02) length = mrc.UInt32_BE(0x04) offset = mrc.UInt32_BE(0x08) args_count = mrc.UInt16_BE(0x0c) args_offset = mrc.UInt32_BE(0x0e) vars_count = mrc.UInt16_BE(0x12) vars_offset = mrc.UInt32_BE(0x14) unk2 = mrc.UInt16_BE(0x18) unk8 = mrc.UInt16_BE(0x1a) unk9 = mrc.UInt16_BE(0x1c) unk10 = mrc.UInt16_BE(0x1e) unk11 = mrc.UInt16_BE(0x20) unk12 = mrc.UInt16_BE(0x22) unk13 = mrc.UInt16_BE(0x24) unk14 = mrc.UInt16_BE(0x26) unk15 = mrc.UInt16_BE(0x28) code = mrc.StoreRef(ScriptCode, mrc.Ref('_parent.code_store'), offset=mrc.Ref('offset'), size=mrc.Ref('length')) args = mrc.StoreRef(ScriptArguments, mrc.Ref('_parent.code_store'), offset=mrc.Ref('args_offset')) vars = mrc.StoreRef(ScriptVariables, mrc.Ref('_parent.code_store'), offset=mrc.Ref('vars_offset')) @property def args_size(self): return self.args_count * 2 @property def vars_size(self): return self.vars_count * 2 @property def repr(self): return '{}'.format(self.name)
class ModuleReference(mrc.Block): name_offset = mrc.UInt16_LE(0x00) name = mrc.StoreRef(ImportedName, mrc.Ref('_parent.impnamestore'), mrc.Ref('name_offset'), size=32) @property def repr(self): return 'name={}'.format(self.name)
class RelocationImportName(mrc.Block): index = mrc.UInt16_LE(0x00) name_offset = mrc.UInt16_LE(0x02) name = mrc.StoreRef( ImportedName, mrc.Ref('_parent._parent._parent._parent._parent.impnamestore'), mrc.Ref('name_offset'), size=32) @property def repr(self): return 'index=0x{:04x}, name={}'.format(self.index, self.name)
class EGATileStore(mrc.Block): data = mrc.Bytes( 0x00, transform=img.Planarizer( bpp=4, plane_size=mrc.Ref('_parent._egahead.latch_plane_size'))) tile8 = mrc.StoreRef(EGATile8, mrc.Ref('store'), mrc.Ref('tile8_offset'), mrc.Ref('tile8_size')) tile16 = mrc.StoreRef(EGATile16, mrc.Ref('store'), mrc.Ref('tile16_offset'), mrc.Ref('tile16_size')) tile32 = mrc.StoreRef(EGATile32, mrc.Ref('store'), mrc.Ref('tile32_offset'), mrc.Ref('tile32_size')) def __init__(self, *args, **kwargs): self.store = mrc.Store(self, mrc.Ref('data')) super().__init__(*args, **kwargs) @property def tile8_offset(self): return self._parent._egahead.tile8_offset * 8 @property def tile16_offset(self): return self._parent._egahead.tile16_offset * 8 @property def tile32_offset(self): return self._parent._egahead.tile32_offset * 8 @property def tile8_size(self): return self._parent._egahead.tile8_count * 8 * 8 @property def tile16_size(self): return self._parent._egahead.tile16_count * 16 * 16 @property def tile32_size(self): return self._parent._egahead.tile16_count * 32 * 32
class ScriptFunction(mrc.Block): name_index = mrc.UInt16_BE(0x00) unk1 = mrc.UInt16_BE(0x02) length = mrc.UInt32_BE(0x04) offset = mrc.UInt32_BE(0x08) arg_count = mrc.UInt16_BE(0x0c) unk2 = mrc.UInt32_BE(0x0e) var_count = mrc.UInt16_BE(0x12) unk3 = mrc.UInt32_BE(0x14) count3 = mrc.UInt16_BE(0x18) unk4 = mrc.UInt32_BE(0x1a) unk5 = mrc.UInt32_BE(0x1e) unk6 = mrc.UInt16_BE(0x22) count4 = mrc.UInt16_BE(0x24) unk7 = mrc.UInt32_BE(0x26) code = mrc.StoreRef(mrc.Unknown, mrc.Ref('_parent.code_store'), offset=mrc.Ref('offset'), size=mrc.Ref('length'))
class SegmentHeader(mrc.Block): offset_sect = mrc.UInt16_LE(0x00) size = mrc.UInt16_LE(0x02) data_seg = mrc.Bits(0x04, 0b00000001) unk1 = mrc.Bits(0x04, 0b00000010) unk2 = mrc.Bits(0x04, 0b00000100) iterated = mrc.Bits(0x04, 0b00001000) movable = mrc.Bits(0x04, 0b00010000) shared = mrc.Bits(0x04, 0b00100000) preload = mrc.Bits(0x04, 0b01000000) exec_ro = mrc.Bits(0x04, 0b10000000) relocations = mrc.Bits(0x05, 0b00000001) conforming = mrc.Bits(0x05, 0b00000010) privilege_level = mrc.Bits(0x05, 0b00001100) discardable = mrc.Bits(0x05, 0b00010000) op_size_32 = mrc.Bits(0x05, 0b00100000) granularity = mrc.Bits(0x05, 0b01000000) unk3 = mrc.Bits(0x05, 0b10000000) alloc_size = mrc.UInt16_LE(0x06) segment = mrc.StoreRef(Segment, mrc.Ref('_parent._parent.segdatastore'), offset=mrc.Ref('offset'), size=None) @property def offset(self): return self.offset_sect << self._parent.sector_shift @offset.setter def offset(self, value): assert value % (1 << self._parent.sector_shift) == 0 self.offset_sect = value >> self._parent.sector_shift @property def repr(self): return 'offset_sect={:04x}, size={:04x}, data_seg={}, relocations={}, alloc_size={:04x}'.format( self.offset_sect, self.size, self.data_seg, self.relocations, self.alloc_size)
class ImageEntry(mrc.Block): offset = mrc.UInt32_LE(0x00) size = mrc.UInt32_LE(0x04) image = mrc.StoreRef(ImageData, mrc.Ref('_parent.images'), mrc.Ref('offset'), mrc.Ref('size'))
class MusicEntry(mrc.Block): offset = mrc.UInt32_LE(0x00) size = mrc.UInt32_LE(0x04) music = mrc.StoreRef(MusicData, mrc.Ref('_parent.tracks'), mrc.Ref('offset'), mrc.Ref('size'))
class SoundEntry(mrc.Block): offset = mrc.UInt32_LE(0x00) size = mrc.UInt32_LE(0x04) sound = mrc.StoreRef(SoundData, mrc.Ref('_parent.sounds'), mrc.Ref('offset'), mrc.Ref('size'))
class ElementRef( mrc.Block ): offset = mrc.UInt8( 0x00 ) size = mrc.UInt8( 0x01 ) ref = mrc.StoreRef( Element, mrc.Ref( '_parent.store' ), mrc.Ref( 'offset' ), mrc.Ref( 'size' ) )
class TIMFileEntry(mrc.Block): _file = mrc.StoreRef(TIMFile, mrc.Ref('_parent._resource.store'), mrc.Ref('offset')) name_hash = mrc.Int32_LE() offset = mrc.UInt32_LE()