예제 #1
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
예제 #2
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())
예제 #3
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 )
예제 #4
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
예제 #5
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
예제 #6
0
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)
예제 #7
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)
예제 #8
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)
예제 #9
0
파일: keen.py 프로젝트: rvanlaar/mrcrowbar
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
예제 #10
0
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'))
예제 #11
0
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)
예제 #12
0
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'))
예제 #13
0
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'))
예제 #14
0
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'))
예제 #15
0
        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' ) )
예제 #16
0
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()