def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.image = img.IndexedImage(self, mrc.Ref('data'), mrc.Ref('width'), mrc.Ref('height'), palette=KLIK_PALETTE)
def __init__(self, *args, **kwargs): mrc.Block.__init__(self, *args, **kwargs) self.image = img.IndexedImage(self, width=320, height=200, palette=mrc.Ref('palette'), source=mrc.Ref('image_data'))
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.image = img.IndexedImage(self, width=mrc.Ref('width'), height=mrc.Ref('height'), source=mrc.Ref('raw_data'), palette=mrc.Ref('_parent.palette'))
class MacBinary(mrc.Block): version_old = mrc.Const(mrc.UInt8(0x00), 0) name_size = mrc.UInt8(0x01, range=range(1, 64)) name = mrc.Bytes(0x02, length=mrc.Ref('name_size')) type = mrc.Bytes(0x41, length=4) creator = mrc.Bytes(0x45, length=4) locked = mrc.Bits(0x49, 0b10000000) invisible = mrc.Bits(0x49, 0b01000000) bundle = mrc.Bits(0x49, 0b00100000) system = mrc.Bits(0x49, 0b00010000) bozo = mrc.Bits(0x49, 0b00001000) busy = mrc.Bits(0x49, 0b00000100) changed = mrc.Bits(0x49, 0b00000010) inited = mrc.Bits(0x49, 0b00000001) const1 = mrc.Const(mrc.UInt8(0x4a), 0) pos_y = mrc.UInt16_BE(0x4b) pos_x = mrc.UInt16_BE(0x4d) folder_id = mrc.UInt16_BE(0x4f) protected = mrc.Bits(0x51, 0b00000001) const2 = mrc.Const(mrc.UInt8(0x52), 0) data_size = mrc.UInt32_BE(0x53) resource_size = mrc.UInt32_BE(0x57) created = mrc.UInt32_BE(0x5a) modified = mrc.UInt32_BE(0x5e) data = mrc.Bytes(0x80, length=mrc.Ref('data_size')) resource = mrc.Bytes(mrc.EndOffset('data', align=0x80), length=mrc.Ref('resource_size'))
class ChannelV4(mrc.Block): CHANNEL_MAP = { None: EmptyChannelV4, # ChannelType.SPRITE: SpriteChannelV4, ChannelType.FRAME_SCRIPT: ScriptChannelV4, # ChannelType.PALETTE: mrc.Unknown, } channel_size = mrc.UInt16_BE(0x00) channel_offset = mrc.UInt16_BE(0x02) @property def channel_row(self): return self.channel_offset // 0x14 @property def channel_type(self): return self.channel_offset % 0x14 @property def channel_type_wrap(self): return (ChannelType.PALETTE if self.channel_offset == 0x14 else self.channel_type) if self.channel_size else None data = mrc.BlockField(CHANNEL_MAP, 0x04, block_type=mrc.Ref('channel_type_wrap'), default_klass=mrc.Unknown, length=mrc.Ref('channel_size')) @property def repr(self): return f'channel_size=0x{self.channel_size:02x}, channel_offset=0x{self.channel_offset:04x}, channel_row={self.channel_row}, channel_type={self.channel_type}'
class EXE(mrc.Block): dos_magic = mrc.Const(mrc.Bytes(0x00, length=2), b'MZ') dos_header = mrc.Bytes(0x02, length=0x3a) ne_offset = mrc.UInt16_LE(0x3c) dos_stub = mrc.Bytes(0x3e, length=mrc.Ref('dos_stub_length')) ne_header = mrc.BlockField(NEHeader, mrc.Ref('ne_offset')) segdata = mrc.Bytes( mrc.EndOffset('ne_header', align=mrc.Ref('sector_align'))) @property def sector_align(self): if self.ne_header: return 1 << self.ne_header.sector_shift return 32 @property def dos_stub_length(self): return self.ne_offset - 0x3e def __init__(self, *args, **kwargs): self.segdatastore = mrc.Store(self, mrc.Ref('segdata'), base_offset=mrc.EndOffset( 'ne_header', neg=True, align=mrc.Ref('sector_align')), align=mrc.Ref('sector_align')) super().__init__(*args, **kwargs)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.image = img.IndexedImage(self, width=960, height=160, source=mrc.Ref('image_data'), palette=mrc.Ref('palette_vga'))
class Segment(mrc.Block): RELOCATION_TYPES = {1: RelocationTable, 0: NullRelocationTable} data = mrc.Bytes(0x00, length=mrc.Ref('_parent.size')) relocations = mrc.BlockField(RELOCATION_TYPES, mrc.EndOffset('data'), block_type=mrc.Ref('_parent.relocations'))
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
def __init__(self, *argc, **argv): self.image = img.IndexedImage(self, mrc.Ref('_data.data'), mrc.Ref('pitch'), mrc.Ref('initial_rect.height'), palette=DIRECTOR_PALETTE) super().__init__(*argc, **argv)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.sounds = mrc.LinearStore(self, mrc.Ref('raw_data'), Sound, offsets=mrc.Ref('sound_offsets'), sizes=mrc.Ref('sound_sizes'), base_offset=-0x280)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.data = mrc.LinearStore(parent=self, source=mrc.Ref('data_raw'), block_klass=mrc.Unknown, offsets=mrc.Ref('offsets'), base_offset=mrc.EndOffset('offsets', neg=True))
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.songs = mrc.LinearStore(parent=self, source=mrc.Ref('songs_raw'), block_klass=Song, offsets=mrc.Ref('song_offsets'), base_offset=mrc.EndOffset('song_offsets', neg=True))
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 )
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.image = img.IndexedImage(self, width=mrc.Ref('width'), height=mrc.Ref('height'), source=mrc.Ref('image_data'), frame_count=mrc.Ref('count'), palette=ibm_pc.EGA_DEFAULT_PALETTE, mask=mrc.Ref('mask_data'))
class RIFX(mrc.Block): _endian = 'big' CHUNK_MAP_CLASS = RIFXMap magic = mrc.Const(mrc.UInt32_P(0x00), Tag(b'RIFX')) size = mrc.UInt32_P(0x04) map = mrc.BlockField(mrc.Ref('CHUNK_MAP_CLASS'), 0x08, length=mrc.Ref('size'))
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())
def __init__( self, *args, **kwargs ): super().__init__( *args, **kwargs ) self.tiles = img.IndexedImage( self, width=32, height=32, source=mrc.Ref( 'image_data' ), frame_count=mrc.Ref( '_parent._parent._egahead.tile32_count' ), palette=ibm_pc.EGA_DEFAULT_PALETTE )
def __init__(self, *args, **kwargs): self.segdatastore = mrc.Store(self, mrc.Ref('segdata'), base_offset=mrc.EndOffset( 'ne_header', neg=True, align=mrc.Ref('sector_align')), align=mrc.Ref('sector_align')) super().__init__(*args, **kwargs)
def __init__(self, *args, **kwargs): self.audio = aud.Wave(self, mrc.Ref('audio_chunk.data'), channels=1, sample_rate=mrc.Ref('audio_chunk.sample_rate'), format_type=int, field_size=mrc.Ref('audio_chunk.sample_width'), signedness=mrc.Ref('audio_chunk.signedness'), endian='little') super().__init__(*args, **kwargs)
def __init__(self, *args, **kwargs): self.consts_store = mrc.Store( self, mrc.Ref('consts_raw'), base_offset=mrc.Ref('consts_store_offset')) self.code_store = mrc.Store(self, mrc.Ref('code_store_raw'), base_offset=mrc.Ref('code_store_base')) 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
def __init__(self, *argc, **argv): self.audio = aud.Wave(self, mrc.Ref('data'), channels=mrc.Ref('channels'), sample_rate=mrc.Ref('sample_rate'), format_type=int, field_size=mrc.Ref('sample_width'), signedness=mrc.Ref('sample_signedness'), endian='big') super().__init__(*argc, **argv)
class SpeakAndSpellROM( mrc.Block ): count_a = mrc.UInt8( 0x00 ) count_b = mrc.UInt8( 0x01 ) count_c = mrc.UInt8( 0x02 ) count_d = mrc.UInt8( 0x03 ) offset_a = mrc.Pointer( mrc.UInt16_LE( 0x04 ), mrc.EndOffset( 'common' ) ) offset_b = mrc.Pointer( mrc.UInt16_LE( 0x06 ), mrc.EndOffset( 'list_a' ) ) offset_c = mrc.Pointer( mrc.UInt16_LE( 0x08 ), mrc.EndOffset( 'list_b' ) ) offset_d = mrc.Pointer( mrc.UInt16_LE( 0x0a ), mrc.EndOffset( 'list_c' ) ) @property def common_len( self ): return (self.offset_a - 0x0c) // 2 @common_len.setter def common_len( self, value ): self.offset_a = value * 2 + 0x0c common = mrc.UInt16_LE( 0x0c, count=mrc.Ref( 'common_len' ) ) list_a = mrc.UInt16_LE( mrc.Ref( 'offset_a' ), count=mrc.Ref( 'count_a' ) ) list_b = mrc.UInt16_LE( mrc.Ref( 'offset_b' ), count=mrc.Ref( 'count_b' ) ) list_c = mrc.UInt16_LE( mrc.Ref( 'offset_c' ), count=mrc.Ref( 'count_c' ) ) list_d = mrc.UInt16_LE( mrc.Ref( 'offset_d' ), count=mrc.Ref( 'count_d' ) ) raw_data = mrc.Bytes( mrc.EndOffset( 'list_d' ) )
class InteractiveImage(mrc.Block): """Represents the sprite data for an interactive object.""" image_data = mrc.Bytes( 0x0000, transform=img.Planarizer( bpp=4, width=mrc.Ref('_parent.width'), height=mrc.Ref('_parent.height'), frame_count=mrc.Ref('_parent.end_frame'), frame_stride=mrc.Ref('_parent.frame_data_size'))) mask_data = mrc.Bytes(mrc.Ref('_parent.mask_rel_offset'), transform=img.Planarizer( bpp=1, width=mrc.Ref('_parent.width'), height=mrc.Ref('_parent.height'), frame_count=mrc.Ref('_parent.end_frame'), frame_stride=mrc.Ref('_parent.frame_data_size'))) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.image = img.IndexedImage( self, width=mrc.Ref('_parent.width'), height=mrc.Ref('_parent.height'), source=mrc.Ref('image_data'), frame_count=mrc.Ref('_parent.end_frame'), palette=mrc.Ref('_parent._parent.palette'), mask=mrc.Ref('mask_data'))
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 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 ScriptContextV4(mrc.Block): #test = mrc.Bytes() unk1 = mrc.Bytes(0x00, length=0x8) list_count = mrc.UInt32_BE(0x08) list_count_2 = mrc.UInt32_BE(0x0c) list_offset = mrc.UInt16_BE(0x10) unk2 = mrc.UInt16_BE(0x12) unk3 = mrc.Bytes(0x14, length=22) entries = mrc.BlockField(ScriptContextEntry, mrc.Ref('list_offset'), count=mrc.Ref('list_count'))
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 ResourceFork(mrc.Block): """ """ resourceDataOffset = mrc.UInt32_BE(0x00) resourceMapOffset = mrc.UInt32_BE(0x04) resourceDataSize = mrc.UInt32_BE(0x08) resourceMapSize = mrc.UInt32_BE(0x0c) resourceData = mrc.BlockField(ResourceData, offset=mrc.Ref("resourceDataOffset"), length=mrc.Ref("resourceDataSize")) resourceMap = mrc.BlockField(MapData, offset=mrc.Ref("resourceMapOffset"), length=mrc.Ref("resourceMapSize"))