Exemple #1
0
 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)
Exemple #2
0
 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'))
Exemple #3
0
 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'))
Exemple #4
0
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'))
Exemple #5
0
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}'
Exemple #6
0
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)
Exemple #7
0
 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'))
Exemple #8
0
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'))
Exemple #9
0
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
Exemple #10
0
 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)
Exemple #11
0
 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)
Exemple #12
0
 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))
Exemple #13
0
 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))
Exemple #14
0
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 )
Exemple #15
0
 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'))
Exemple #16
0
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'))
Exemple #17
0
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())
Exemple #18
0
 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
                 )
Exemple #19
0
 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)
Exemple #20
0
 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)
Exemple #21
0
    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)
Exemple #22
0
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
Exemple #23
0
 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)
Exemple #24
0
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' ) )
Exemple #25
0
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'))
Exemple #26
0
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
Exemple #27
0
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)
Exemple #28
0
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'))
Exemple #29
0
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)
Exemple #30
0
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"))