Пример #1
0
def write_fonts(out, fonts):
    fp = open(out, 'wb')
    writer = ByteReader(fp)
    writer.writeInt(len(fonts))
    for font in fonts:
        font.write(writer)
    fp.close()
Пример #2
0
def convert(reader):
    newReader = ByteReader()
    for i in xrange(len(reader)):
        value = reader.readByte(True)
        value = ~(value - i % 256) % 256
        newReader.writeByte(value, True)
    newReader.seek(0)
    return newReader
Пример #3
0
 def get_shader(self, name, vert, frag):
     vert = translate_shader_data(vert, 'vertex', 'gles')
     frag = translate_shader_data(frag, 'fragment', 'gles')
     writer = ByteReader()
     writer.writeInt(len(vert))
     writer.write(vert)
     writer.writeInt(len(frag))
     writer.write(frag)
     return str(writer)
Пример #4
0
 def write_preload(self, images):
     self.fp.seek(self.use_count_offset)
     data = ByteReader()
     for handle in images:
         data.writeShort(handle, True)
     for handle in xrange(self.image_count):
         if handle in images:
             continue
         data.writeShort(handle, True)
     self.fp.write(str(data))
Пример #5
0
 def get_shader(self, name, vert, frag):
     writer = ByteReader()
     writer.writeInt(len(vert))
     writer.write(vert)
     writer.writeInt(len(frag))
     writer.write(frag)
     return str(writer)
Пример #6
0
def read_runinfo(data):
    info = {}
    reader = ByteReader(data)
    count = reader.readInt(True)
    for _ in xrange(count):
        name = reader.read(reader.readInt(True))
        alts = {}
        for i in xrange(26):
            alts[i] = reader.readByte(True)
        info[name] = alts
    return info
Пример #7
0
 def get_shader(self, name, vert, frag):
     vert = translate_shader_data(vert, 'vertex', 'gles')
     frag = translate_shader_data(frag, 'fragment', 'gles')
     writer = ByteReader()
     writer.writeInt(len(vert))
     writer.write(vert)
     writer.writeInt(len(frag))
     writer.write(frag)
     return str(writer)
Пример #8
0
def compress(data):
    reader = ByteReader()
    compressed = zlib.compress(str(data))
    reader.writeInt(len(data))
    reader.writeInt(len(compressed))
    reader.write(compressed)
    return reader
Пример #9
0
 def read(self, reader):
     self.handle = reader.readInt(True)
     self.checksum = reader.readInt()
     self.references = reader.readInt()
     decompressedLenght = reader.readInt()
     self.flags.setFlags(reader.readInt(True))
     reserved = reader.readInt()
     nameLenght = reader.readInt()
     if self.settings.get('compressed', True):
         size = reader.readInt()
         data = ByteReader(zlib.decompress(reader.read(size)))
     else:
         data = reader.readReader(decompressedLenght)
     self.name = self.readString(data, nameLenght)
     self.data = data.read()
Пример #10
0
def write_runinfo(info):
    writer = ByteReader()
    writer.writeInt(len(info), True)
    for k, v in info.iteritems():
        writer.writeInt(len(k), True)
        writer.write(k)
        for i in xrange(26):
            reader.writeByte(v[i], True)
Пример #11
0
 def read(self, reader):
     self.handle = reader.readInt(True)
     self.checksum = reader.readInt()
     self.references = reader.readInt()
     decompressedLenght = reader.readInt()
     self.flags.setFlags(reader.readInt(True))
     reserved = reader.readInt()
     nameLenght = reader.readInt()
     if self.settings.get('compressed', True):
         size = reader.readInt()
         data = ByteReader(zlib.decompress(reader.read(size)))
     else:
         data = reader.readReader(decompressedLenght)
     self.name = self.readString(data, nameLenght)
     self.data = data.read()
Пример #12
0
 def add_image(self, hot_x, hot_y, act_x, act_y, data):
     writer = ByteReader()
     writer.writeShort(hot_x)
     writer.writeShort(hot_y)
     writer.writeShort(act_x)
     writer.writeShort(act_y)
     writer.writeIntString(data)
     self.images.append(str(writer))
Пример #13
0
 def execute(self, instance):
     filename = self.evaluate_expression(self.get_parameter(0))
     try:
         data = open_file(filename, 'rb').read()
     except IOError:
         return
     instance.objectPlayer.workspace.data = ByteReader(data)
Пример #14
0
    def __init__(self, filename):
        filename = os.path.join(DATA_DIR, filename)
        self.filename = filename

        self.tiles = os.stat(filename).st_size != 0

        name = os.path.basename(filename).encode('utf-8')
        self.name = os.path.splitext(name)[0]

        self.outdir = os.path.join(DATA_DIR, 'mfas')  # + self.name
        try:
            os.makedirs(self.outdir)
        except OSError:
            pass

        self.objects = {}

        self.x_size = 16
        self.y_size = 16

        template_path = os.path.join(DATA_DIR, 'template.mfa')
        self.mfa = MFA(ByteReader(open(template_path, 'rb')))

        self.object_id = 32
        self.image_id = 0
        self.icon_id = max(self.mfa.icons.itemDict) + 1
Пример #15
0
    def get_shader(self, name, vert, frag):
        vert_path = os.path.join(SHADERS_DIR, name + '.vsb')
        frag_path = os.path.join(SHADERS_DIR, name + '.psb')

        with open(vert_path, 'rb') as fp:
            vert_data = fp.read()

        with open(frag_path, 'rb') as fp:
            frag_data = fp.read()

        writer = ByteReader()
        writer.writeInt(len(vert_data))
        writer.write(vert_data)
        writer.writeInt(len(frag_data))
        writer.write(frag_data)
        return str(writer)
Пример #16
0
    def run(self):
        image_path = os.path.join(SETS_PATH, '%s.png' % self.name)
        image = Image.open(image_path).convert('RGBA')

        col = image.getpixel((0, 0))
        if col[3] == 255:
            print 'Filtering image with transparent color', col
            buf = image.load()
            for y in xrange(image.size[1]):
                for x in xrange(image.size[0]):
                    test_col = buf[(x, y)]
                    if test_col != col:
                        continue
                    buf[(x, y)] = (0, 0, 0, 0)

        frame = self.mfa.frames[0]

        if self.tiles:
            self.run_tiles(image)
        else:
            self.run_special(image)

        frame.folders = []
        for item in frame.items:
            folder = frame.new(ItemFolder)
            folder.items = [item.handle]
            frame.folders.append(folder)

        basename = os.path.basename(self.filename)
        out_name = os.path.splitext(basename)[0] + '.mfa'
        out_path = os.path.join(self.outdir, out_name)

        self.mfa.write(ByteReader(open(out_path, 'wb')))
        print 'Created %s' % out_name
 def execute(self, instance):
     filename = self.evaluate_index(0)
     try:
         data = gzip.GzipFile(convert_path(filename), 'rb').read()
     except IOError:
         return
     instance.objectPlayer.workspace.data = ByteReader(data)
 def execute(self, instance):
     filename = self.evaluate_index(0)
     try:
         data = open_file(filename, 'rb').read()
     except IOError:
         return
     instance.objectPlayer.workspace.data = ByteReader(data)
Пример #19
0
    def __init__(self, filename):
        self.filename = filename

        self.tiles = os.stat(filename).st_size != 0

        name = os.path.basename(filename).encode('utf-8')
        if self.tiles:
            self.name, size = name.split('_')[:2]
            size = size.split(',')
            self.x_size = int(size[0])
            self.y_size = int(size[1])
        else:
            self.name = name.split('_')[0]

        self.outdir = os.path.splitext(filename)[0]
        try:
            os.makedirs(self.outdir)
        except OSError:
            pass

        self.objects = {}

        template_path = os.path.join(DATA_DIR, 'template.mfa')
        self.mfa = MFA(ByteReader(open(template_path, 'rb')))

        self.object_id = 32
        self.image_id = 0
        self.icon_id = max(self.mfa.icons.itemDict) + 1
Пример #20
0
 def execute(self, instance):
     filename = convert_path(self.get_filename(self.get_parameter(0)))
     try:
         reader = ByteReader(open(filename, 'rb'))
         instance.objectPlayer.array.read(reader)
     except IOError:
         pass
Пример #21
0
 def write(self, reader):
     reader.writeShort(self.objectType)
     reader.writeShort(self.num)
     if self.objectType == 0 and self.num == 0:
         return
     dataReader = ByteReader()
     if (self.objectType in expression_system 
     and self.num in expression_system[self.objectType]):
         self.loader.write(dataReader)
     elif self.objectType >= 2 or self.objectType == -7:
         dataReader.writeShort(self.objectInfo, True)
         dataReader.writeShort(self.objectInfoList)
         if self.num in expression_extension:
             self.loader.write(dataReader)
     reader.writeShort(len(dataReader) + 6, True)
     reader.writeReader(dataReader)
def save_data_loader(loader):
    writer = ByteReader()
    loader.write(writer)
    loader.parent = None
    data = str(writer)
    fp = tempfile.TemporaryFile()
    fp.write(data)
    return DataWrapper(fp)
Пример #23
0
    def read(self, reader):
        debug = self.settings.get('debug', False)
        old = self.settings.get('old', False)
        if debug:
            path = reader.readString()
            reader = ByteReader(open(path, 'rb'))
            reader.skipBytes(4)

        numberOfItems = reader.readInt()
        
        if old:
            klass = OldFont
        else:
            klass = FontItem
        
        self.items = [self.new(klass, reader)
            for _ in xrange(numberOfItems)]
 def execute(self, instance):
     filename = self.evaluate_index(0)
     try:
         array = WorkspaceArray(ByteReader(open_file(filename, 'rb')))
     except IOError:
         return
     instance.objectPlayer.array = array
     instance.objectPlayer.workspace = array.items[-1]
Пример #25
0
    def run(self, cmd):
        self.room = ByteReader(open(self.filename, 'rb'))
        self.file_ver = self.room.readByte(True)
        self.x_size = self.room.readByte(True)
        self.y_size = self.room.readByte(True)
        tileset_len = self.room.readByte(True)
        self.tileset = self.room.readString(tileset_len)
        self.tile_count = self.room.readInt(True)

        image_path = os.path.join(SETS_PATH, '%s.png' % self.tileset)
        image = Image.open(image_path).convert('RGBA')

        col = image.getpixel((0, 0))
        self.tileset_transparent = col[:3]
        if col[3] == 255:
            print 'Filtering image with transparent color', col
            buf = image.load()
            for y in xrange(image.size[1]):
                for x in xrange(image.size[0]):
                    test_col = buf[(x, y)]
                    if test_col != col:
                        continue
                    buf[(x, y)] = (0, 0, 0, 0)

        frame = self.mfa.frames[0]

        if cmd == 'extract_tiles':
            self.run_extract_tiles(image)
            return
        elif cmd == 'build':
            self.run_build(image)

        frame.folders = []
        for item in frame.items:
            folder = frame.new(ItemFolder)
            folder.items = [item.handle]
            frame.folders.append(folder)

        basename = os.path.basename(self.filename)
        out_name = os.path.splitext(basename)[0] + '.mfa'
        out_path = os.path.join(self.outdir, out_name)

        if os.path.isfile(out_path):
            os.remove(out_path)
        self.mfa.write(ByteReader(open(out_path, 'wb')))
        print 'Created %s' % out_name
class Workspace(DataLoader):
    name = ''
    data = None

    def initialize(self):
        size = self.settings.get('defaultSize', 0)
        self.data = ByteReader()
        self.data.write('\x00' * size)

    def read(self, reader):
        self.name = reader.readString()
        self.data = reader.readReader(reader.readInt(True))

    def write(self, reader):
        reader.writeString(self.name)
        reader.writeInt(len(self.data))
        reader.writeReader(self.data)
Пример #27
0
 def execute(self, instance):
     try:
         filename = open_file_selector()
         reader = ByteReader(open(filename, 'rb'))
         instance.objectPlayer.array.read(reader)
         file.close()
     except IOError:
         pass
Пример #28
0
class Workspace(DataLoader):
    name = ''
    data = None
    
    def initialize(self):
        size = self.settings.get('defaultSize', 0)
        self.data = ByteReader()
        self.data.write('\x00' * size)
    
    def read(self, reader):
        self.name = reader.readString()
        self.data = reader.readReader(reader.readInt(True))
    
    def write(self, reader):
        reader.writeString(self.name)
        reader.writeInt(len(self.data))
        reader.writeReader(self.data)
Пример #29
0
    def read(self, reader):
        # reader.openEditor()
        debug = self.settings.get('debug', False)
        java = self.settings.get('java', False)
        flash = self.settings.get('flash', False)
        old = self.settings.get('old', False)

        if debug:
            path = reader.readString()
            reader = ByteReader(open(path, 'rb'))
            reader.skipBytes(4)
    
        if java:
            numberOfItems = reader.readShort()
            itemsToRead = reader.readShort()
            if flash:
                itemClass = FlashSound
            elif old:
                itemClass = OldSound
            else:
                itemClass = JavaSound
        else:
            itemsToRead = reader.readInt()
            if old:
                itemClass = OldSound
            else:
                itemClass = SoundItem

        compressed = not debug
            
        self.items = [self.new(itemClass, reader, compressed = compressed)
            for _ in xrange(itemsToRead)]
        
        self.names = dict([(item.name, item) for  item in self.items])
Пример #30
0
def compress(data):
    reader = ByteReader()
    compressed = zlib.compress(str(data))
    reader.writeInt(len(data))
    reader.writeInt(len(compressed))
    reader.write(compressed)
    return reader
 def execute(self, instance):
     filename = self.evaluate_index(0)
     try:
         array = WorkspaceArray(
             ByteReader(gzip.GzipFile(convert_path(filename), 'rb').read()))
     except IOError:
         return
     instance.objectPlayer.array = array
     instance.objectPlayer.workspace = array.items[-1]
Пример #32
0
    def add_sound(self, name, ext=None, data=None):
        if ext is None:
            audio_type = NONE_TYPE
        else:
            audio_type = AUDIO_TYPES.get(ext, NATIVE_TYPE)

        index = len(self.sounds)
        sound_id = get_asset_name('SOUND', name, index)
        self.sound_ids[name.lower()] = sound_id
        self.header.putdefine(sound_id, index)

        writer = ByteReader()
        writer.writeInt(audio_type)

        if data:
            writer.writeIntString(data)

        self.sounds.append(str(writer))
Пример #33
0
def write_runinfo(info):
    writer = ByteReader()
    writer.writeInt(len(info), True)
    for k, v in info.iteritems():
        writer.writeInt(len(k), True)
        writer.write(k)
        for i in xrange(26):
            reader.writeByte(v[i], True)
Пример #34
0
 def add_image(self, hot_x, hot_y, act_x, act_y, data):
     writer = ByteReader()
     writer.writeShort(hot_x)
     writer.writeShort(hot_y)
     writer.writeShort(act_x)
     writer.writeShort(act_y)
     writer.writeIntString(data)
     self.images.append(str(writer))
Пример #35
0
    def get_shader(self, name, vert, frag):
        vert_path = os.path.join(SHADERS_DIR, name + '.vsb')
        frag_path = os.path.join(SHADERS_DIR, name + '.psb')

        with open(vert_path, 'rb') as fp:
            vert_data = fp.read()

        with open(frag_path, 'rb') as fp:
            frag_data = fp.read()

        writer = ByteReader()
        writer.writeInt(len(vert_data))
        writer.write(vert_data)
        writer.writeInt(len(frag_data))
        writer.write(frag_data)
        return str(writer)
Пример #36
0
def main():
    print('#' * 43)
    print('# ======== FN@FSource Decompiler ======== #')
    print('# '    + '-' * 39 +   ' #')
    print('# Original bimbam tool by Mathias Kaerlev #')
    print('#' * 43)
    print('\n\n')
    
    input = sys.argv[1]
    output = sys.argv[2]

    fp = ByteReader(open(input, 'rb'))
    if input.endswith('.ccn'):
        newGame = GameData(fp)
    else:
        newExe = ExecutableData(fp, loadImages=True)

        for file in newExe.packData.items:
            name = file.filename.split('\\')[-1]
            print('Writing pack file ' + name)
            open(os.path.join(output, name), 'wb').write(file.data)

        newGame = newExe.gameData

    if newGame.files is not None:
        for file in newGame.files.items:
            name = file.name.split('\\')[-1]
            print('Writing embedded file ' + name)
            open(os.path.join(output, name), 'wb').write(str(file.data))
    newGame.files = None

    def out(value):
        print(value)

    newMfa = translate(newGame, print_func = out)
    out_path = os.path.join(output, 'out.mfa')
    newMfa.write(ByteReader(open(out_path, 'wb')))

    # newMfa = MFA(ByteReader(open(out_path, 'rb')))
    print('Decompilation Completed!')
Пример #37
0
    def write(self, reader):
        newReader = ByteReader()
        for item in self.items:
            item.write(newReader)

        reader.write(PACK_HEADER)
        reader.writeInt(32)
        reader.writeInt(len(newReader) + 64)
        reader.writeInt(self.formatVersion)
        reader.writeInt(0)
        reader.writeInt(0)
        reader.writeInt(len(self.items))
        reader.writeReader(newReader)
Пример #38
0
def convert(reader):
    newReader = ByteReader()
    for i in xrange(len(reader)):
        value = reader.readByte(True)
        value = ~(value - i % 256) % 256
        newReader.writeByte(value, True)
    newReader.seek(0)
    return newReader
Пример #39
0
def main():
    print 'Bimbam tool by Mathias Kaerlev'
    print 'ONLY for use on your own applications.'
    print ''

    input = sys.argv[1]
    output = sys.argv[2]

    fp = ByteReader(open(input, 'rb'))
    if input.endswith('.ccn'):
        newGame = GameData(fp)
    else:
        newExe = ExecutableData(fp, loadImages=False)

        for file in newExe.packData.items:
            name = file.filename.split('\\')[-1]
            print 'Writing pack file %r' % name
            open(os.path.join(output, name), 'wb').write(file.data)

        newGame = newExe.gameData

    if newGame.files is not None:
        for file in newGame.files.items:
            name = file.name.split('\\')[-1]
            print 'Writing embedded file %r' % name
            open(os.path.join(output, name), 'wb').write(str(file.data))
    newGame.files = None

    def out(value):
        print value

    newMfa = translate(newGame, print_func=out)
    out_path = os.path.join(output, 'out.mfa')
    newMfa.write(ByteReader(open(out_path, 'wb')))

    # newMfa = MFA(ByteReader(open(out_path, 'rb')))
    print 'Finished!'
    def read(self, reader):
        debug = self.settings.get('debug', False)
        old = self.settings.get('old', False)
        if debug:
            path = self.readString(reader)
            reader = ByteReader(open(path, 'rb'))
            reader.skipBytes(4)

        numberOfItems = reader.readInt()

        if old:
            klass = OldFont
        else:
            klass = FontItem

        offset = 0
        if self.settings['build'] >= 284 and not debug:
            offset = -1

        self.items = []
        for _ in xrange(numberOfItems):
            item = self.new(klass, reader)
            item.handle += offset
            self.items.append(item)
Пример #41
0
    def read(self, reader):
        debug = self.settings.get('debug', False)
        old = self.settings.get('old', False)
        if debug:
            path = self.readString(reader)
            reader = ByteReader(open(path, 'rb'))
            reader.skipBytes(4)

        numberOfItems = reader.readInt()
        
        if old:
            klass = OldFont
        else:
            klass = FontItem
        
        offset = 0
        if self.settings['build'] >= 284 and not debug:
            offset = -1

        self.items = []
        for _ in xrange(numberOfItems):
            item = self.new(klass, reader)
            item.handle += offset
            self.items.append(item)
Пример #42
0
    def write(self, reader):
        java = self.settings.get('java', False)
        debug = self.settings.get('debug', False)
        compressed = not debug and self.settings.get('compressed', True)

        reader.writeInt(self.handle, True)

        compressedReader = ByteReader()
        compressedReader.writeInt(self.checksum)
        compressedReader.writeInt(self.references)
        compressedReader.writeInt(0) # size
        self.value.write(compressedReader)
        
        if not java and compressed:
            reader.writeReader(zlibdata.compress(compressedReader))
        else:
            reader.writeReader(compressedReader)
Пример #43
0
 def execute(self, instance):
     filename = self.evaluate_expression(self.get_parameter(0))
     try:
         data = open_file(filename, 'rb').read()
     except IOError:
         return
     array = MMFArray()
     array.read(ByteReader(data))
     if array.size[1] != 1 or array.size[2] != 1 or not array.flags['Text']:
         return
     value = []
     valueDict = array.items[0][0]
     for i in xrange(len(valueDict)):
         value.append(valueDict[i])
     instance.objectPlayer.value = instance.objectPlayer.join(value)
Пример #44
0
 def write_preload(self, images):
     self.fp.seek(self.use_count_offset)
     data = ByteReader()
     for handle in images:
         data.writeShort(handle, True)
     for handle in xrange(self.image_count):
         if handle in images:
             continue
         data.writeShort(handle, True)
     self.fp.write(str(data))
Пример #45
0
 def write(self, reader):
     reader.writeShort(self.version, True)
     reader.writeShort(self.frameType)
     if self.items:
         reader.write(EVENT_DATA)
         newReader = ByteReader()
         for item in self.items:
             item.write(newReader)
         reader.writeIntString(str(newReader))
     if self.comments is not None:
         reader.write(COMMENT_DATA)
         reader.writeInt(len(self.comments), True)
         for comment in self.comments:
             comment.write(reader)
     if self.objects is not None:
         reader.write(OBJECT_DATA)
         reader.writeInt(len(self.objects), True)
         for item in self.objects:
             item.write(reader)
     reader.write(EVENT_EDITOR_DATA)
     reader.write('\x00' * (4 + 2 * 2 + 4 * 3))
     if self.objectTypes is not None:
         reader.write(OBJECT_LIST_DATA)
         reader.writeShort(-1)
         reader.writeShort(len(self.objectTypes))
         for item in (self.objectTypes, self.objectHandles, self.objectFlags):
             for subitem in item:
                 reader.writeShort(subitem, True)
         reader.writeShort(len(self.folders), True)
         for item in self.folders:
             reader.writeIntString(item)
     if self.x is not None:
         reader.write(EDITOR_POSITION_DATA)
         reader.writeShort(1)
         reader.writeInt(self.x)
         reader.writeInt(self.y)
         reader.writeInt(self.caretType, True)
         reader.writeInt(self.caretX, True)
         reader.writeInt(self.caretY, True)
     if self.lineY is not None:
         reader.write(EDITOR_LINE_DATA)
         reader.writeShort(1)
         reader.writeInt(self.lineY, True)
         reader.writeInt(self.lineItemType, True)
         reader.writeInt(self.eventLine, True)
         reader.writeInt(self.eventLineY, True)
     reader.write(EVENT_END)
Пример #46
0
    def run(self, cmd):
        self.room = ByteReader(open(self.filename, 'rb'))
        self.file_ver = self.room.readByte(True)
        self.x_size = self.room.readByte(True)
        self.y_size = self.room.readByte(True)
        tileset_len = self.room.readByte(True)
        self.tileset = self.room.readString(tileset_len)
        self.tile_count = self.room.readInt(True)

        image_path = os.path.join(SETS_PATH, '%s.png' % self.tileset)
        image = Image.open(image_path).convert('RGBA')

        col = image.getpixel((0, 0))
        self.tileset_transparent = col[:3]
        if col[3] == 255:
            print 'Filtering image with transparent color', col
            buf = image.load()
            for y in xrange(image.size[1]):
                for x in xrange(image.size[0]):
                    test_col = buf[(x, y)]
                    if test_col != col:
                        continue
                    buf[(x, y)] = (0, 0, 0, 0)

        frame = self.mfa.frames[0]

        if cmd == 'extract_tiles':
            self.run_extract_tiles(image)
            return
        elif cmd == 'build':
            self.run_build(image)

        frame.folders = []
        for item in frame.items:
            folder = frame.new(ItemFolder)
            folder.items = [item.handle]
            frame.folders.append(folder)

        basename = os.path.basename(self.filename)
        out_name = os.path.splitext(basename)[0] + '.mfa'
        out_path = os.path.join(self.outdir, out_name)

        if os.path.isfile(out_path):
            os.remove(out_path)
        self.mfa.write(ByteReader(open(out_path, 'wb')))
        print 'Created %s' % out_name
Пример #47
0
 def read(self, filename):
     self.points = []
     try:
         data = ByteReader(open(filename, 'rb'))
     except IOError:
         return
     while data.tell() < len(data):
         count = (data.readInt() - 2) / 2
         x = data.readInt()
         y = data.readInt()
         point = Point(x, y)
         self.points.append(point)
         for _ in xrange(count):
             point_id = data.readInt()
             distance = data.readFloat()
             connection = Connection(point_id, distance)
             point.connections.append(connection)
Пример #48
0
    def read(self, reader):
        java = self.settings.get('java', False)
        debug = self.settings.get('debug', False)
        
        if debug:
            path = reader.readString()
            reader = ByteReader(open(path, 'rb'))
            reader.skipBytes(4)
        
        if java:
            totalReferences = reader.readShort()
            numberOfItems = reader.readShort()
            itemClass = JavaMusic
        else:
            numberOfItems = reader.readInt()
            itemClass = MusicFile

        self.items = [self.new(itemClass, reader)
            for _ in xrange(numberOfItems)]
Пример #49
0
    def write_data(self):
        header = ByteReader()
        data = ByteReader()
        header_size = (len(self.images) + len(self.sounds) + len(self.fonts) +
                       len(self.shaders)) * 4 + len(self.images) * 2

        # image preload
        self.use_count_offset = header.tell()
        for _ in xrange(len(self.images)):
            header.writeShort(0, True)

        for image in self.images:
            header.writeInt(data.tell() + header_size, True)
            data.write(image)

        for sound in self.sounds:
            header.writeInt(data.tell() + header_size, True)
            data.write(sound)

        for shader in self.shaders:
            header.writeInt(data.tell() + header_size, True)
            data.write(shader)

        self.fp.write(str(header))
        self.fp.write(str(data))

        self.image_count = len(self.images)
        self.sound_count = len(self.sounds)
        self.font_count = len(self.fonts)
        self.shader_count = len(self.shaders)

        self.sounds = self.images = self.fonts = self.shaders = None
Пример #50
0
    def write(self, reader):
        newReader = ByteReader()
        newReader.writeShort(self.handle)
        newReader.writeInt(self.magicNumber)
        newReader.writeInt(self.versionLS)
        newReader.writeInt(self.versionMS)
        newReader.writeString('.'.join([self.name, self.extension]))
        newReader.writeString(self.subType)

        reader.writeShort(len(newReader) + 2, True)
        reader.writeReader(newReader)
Пример #51
0
    def write_data(self):
        header = ByteReader()
        data = ByteReader()
        header_size = ((len(self.images) + len(self.sounds) + len(self.fonts) +
                       len(self.shaders) + len(self.files)) * 4
                      + len(self.images) * 2 + 5 * 4)

        # image preload
        self.use_count_offset = header.tell()
        for _ in xrange(len(self.images)):
            header.writeShort(0, True)

        start = data.tell()
        for image in self.images:
            header.writeInt(data.tell() + header_size, True)
            data.write(image)
        image_size = data.tell() - start

        start = data.tell()
        for sound in self.sounds:
            header.writeInt(data.tell() + header_size, True)
            data.write(sound)
        sound_size = data.tell() - start

        start = data.tell()
        for font in self.fonts:
            header.writeInt(data.tell() + header_size, True)
            data.write(font)
        font_size = data.tell() - start

        start = data.tell()
        for shader in self.shaders:
            header.writeInt(data.tell() + header_size, True)
            data.write(shader)
        shader_size = data.tell() - start

        start = data.tell()
        for packfile in self.files:
            header.writeInt(data.tell() + header_size, True)
            data.write(packfile)
        packfile_size = data.tell() - start

        for size in (image_size, sound_size, font_size, shader_size,
                     packfile_size):
            header.writeInt(size, True)

        self.fp.write(str(header))
        self.fp.write(str(data))

        self.image_count = len(self.images)
        self.sound_count = len(self.sounds)
        self.font_count = len(self.fonts)
        self.shader_count = len(self.shaders)
        self.file_count = len(self.files)

        self.sounds = self.images = self.fonts = self.shaders = None
        self.files = None
Пример #52
0
 def write(self, reader):
     reader.writeIntString(self.name)
     reader.writeIntString(self.extension)
     reader.writeInt(self.identifier)
     newReader = ByteReader()
     if not self.extension:
         newReader.writeShort(self.player)
         newReader.writeShort(self.type)
         newReader.writeByte(self.movingAtStart)
         newReader.write('\x00' * 3)
         newReader.writeInt(self.directionAtStart)
     self.loader.write(newReader)
     reader.writeIntString(str(newReader))
Пример #53
0
class Tiler(object):
    def __init__(self, filename):
        filename = os.path.join(DATA_DIR, filename)
        self.filename = filename

        self.tiles = os.stat(filename).st_size != 0

        name = os.path.basename(filename).encode('utf-8')
        self.name = os.path.splitext(name)[0]

        self.outdir = os.path.join(DATA_DIR, 'mfas')# + self.name
        try:
            os.makedirs(self.outdir)
        except OSError:
            pass

        self.objects = {}

        self.x_size = 16
        self.y_size = 16

        template_path = os.path.join(DATA_DIR, 'template.mfa')
        self.mfa = MFA(ByteReader(open(template_path, 'rb')))

        self.object_id = 32
        self.image_id = 0
        self.icon_id = max(self.mfa.icons.itemDict) + 1

    def run(self, cmd):
        self.room = ByteReader(open(self.filename, 'rb'))
        self.file_ver = self.room.readByte(True)
        self.x_size = self.room.readByte(True)
        self.y_size = self.room.readByte(True)
        tileset_len = self.room.readByte(True)
        self.tileset = self.room.readString(tileset_len)
        self.tile_count = self.room.readInt(True)

        image_path = os.path.join(SETS_PATH, '%s.png' % self.tileset)
        image = Image.open(image_path).convert('RGBA')

        col = image.getpixel((0, 0))
        self.tileset_transparent = col[:3]
        if col[3] == 255:
            print 'Filtering image with transparent color', col
            buf = image.load()
            for y in xrange(image.size[1]):
                for x in xrange(image.size[0]):
                    test_col = buf[(x, y)]
                    if test_col != col:
                        continue
                    buf[(x, y)] = (0, 0, 0, 0)

        frame = self.mfa.frames[0]

        if cmd == 'extract_tiles':
            self.run_extract_tiles(image)
            return
        elif cmd == 'build':
            self.run_build(image)

        frame.folders = []
        for item in frame.items:
            folder = frame.new(ItemFolder)
            folder.items = [item.handle]
            frame.folders.append(folder)

        basename = os.path.basename(self.filename)
        out_name = os.path.splitext(basename)[0] + '.mfa'
        out_path = os.path.join(self.outdir, out_name)

        if os.path.isfile(out_path):
            os.remove(out_path)
        self.mfa.write(ByteReader(open(out_path, 'wb')))
        print 'Created %s' % out_name

    def run_build(self, image):
        mask_path = os.path.join(SETS_PATH, '%s_mask.png' % self.tileset)
        mask = Image.open(mask_path)

        if mask.mode != 'P':
            raise ValueError('The mask has to be palette image')

        #mask = mask.convert('P')
        colors = mask.getcolors()
        transparent = mask.getpixel((0, 0))

        if transparent != 0:
            raise ValueError('The transparent color should be the first color '
                             'in the palette')

        buf = image.load()

        for (_, color) in colors:
            if color == transparent or color == 255:
                continue
            color_image = mask.point(lambda x: 1 if x == color else 0)
            box = color_image.getbbox()
            tile_x = box[0] / self.x_size
            tile_y = box[1] / self.y_size
            height = box[3] - box[1]
            width = box[2] - box[0]
            new_image = Image.new('RGBA', (width, height),
                                  self.tileset_transparent)

            buf2 = color_image.load()
            buf3 = new_image.load()


            for y in xrange(height):
                for x in xrange(width):
                    xx = x + box[0]
                    yy = y + box[1]
                    if buf2[(xx, yy)] == 0 or buf[(xx, yy)][3] == 0:
                        continue
                    buf3[(x, y)] = buf[(xx, yy)]

            obstacle = mask.getpixel((tile_x, tile_y)) == 255
            self.create_object("%s%s" % (self.tileset, color), color,
                               new_image, obstacle)

        room_width = 0
        room_height = 0
        instances = []
        map = dict()
        for _ in xrange(self.tile_count):
            try:
                x = self.room.readShort() * self.x_size
                y = self.room.readShort() * self.y_size
                room_width = max(room_width, x + 200)
                room_height = max(room_height, y + 200)
                key = self.room.readByte(True)
                frameitem = self.objects[key]
                instances.append((frameitem, x, y))
                map[(x,y)] = 1
            except:
                break

        for i in instances:
            self.create_instance(*i)
            #statt self.create_instance(i[0], i[1], i[2])

        frame = self.mfa.frames[0]
        frame.size = room_width, room_height

    def run_extract_tiles(self, image):
        tile_folder = sys.argv[3]

        image_path = os.path.join(SETS_PATH, '%s.png' % self.tileset)
        image = Image.open(image_path).convert('RGBA')
        mask_path = os.path.join(SETS_PATH, '%s_mask.png' % self.tileset)
        mask = Image.open(mask_path)
        transparent_color = image.getpixel((0, 0))

        if mask.mode != 'P':
            raise ValueError('The mask has to be palette image')

        #mask = mask.convert('P')
        colors = mask.getcolors()
        transparent = mask.getpixel((0, 0))

        if transparent != 0:
            raise ValueError('The transparent color should be the first color '
                             'in the palette')

        ini = open(os.path.join(DATA_DIR, tile_folder, 'tiles.ini'), 'w')
        for (_, color) in colors:
            if color == transparent:
                continue
            # Extract the current tile's shape from the mask image
            tile_mask = mask.point(lambda x: 1 if x == color else 0, '1')
            box = tile_mask.getbbox()
            tile_mask = tile_mask.crop(box)
            # Create an image and render the tile to it
            tile = Image.new('RGBA', tile_mask.size)
            tile.paste(image.crop(box), tile_mask)
            col = image.getpixel((0, 0))
            buf = tile.load()
            # Clear transparent pixels
            for y in xrange(tile.size[1]):
                for x in xrange(tile.size[0]):
                    if buf[(x, y)] == transparent_color:
                        buf[(x, y)] = (0, 0, 0, 0)
            tile.save(os.path.join(DATA_DIR, tile_folder, "%s.png" % color),
                      "PNG")

            x = box[0]
            y = box[1]
            height = box[3] - y
            width = box[2] - x
            tile_x = x / self.x_size
            tile_y = y / self.y_size

            if color == 25:
                print tile_x * self.x_size, x

            ini.write("[t%s]\n" % color)
            ini.write("x=%s\n" % x)
            ini.write("y=%s\n" % y)
            ini.write("x_off=%s\n" % (x - tile_x * self.x_size))
            ini.write("y_off=%s\n" % (y - tile_y * self.y_size))
            ini.write("width=%s\n" % width)
            ini.write("height=%s\n" % height)

        ini.write("[image]\n")
        ini.write("width=%s\n" % image.size[0])
        ini.write("height=%s\n" % image.size[1])
        ini.close()

    def create_instance(self, frameitem, x, y):
        frame = self.mfa.frames[0]
        instance = frame.new(FrameInstance)
        instance.x = x
        instance.y = y
        instance.handle = len(frame.instances) + 1
        instance.flags = 0
        instance.parentType = NONE_PARENT
        instance.itemHandle = frameitem.handle
        instance.parentHandle = 0
        instance.layer = 0
        frame.instances.append(instance)

    def create_image(self, image, icon):
        if icon:
            bank = self.mfa.icons
            handle = self.icon_id
            self.icon_id += 1
            image = image.resize((32, 32), Image.LANCZOS)
        else:
            bank = self.mfa.images
            handle = self.image_id
            self.image_id += 1

        item = bank.new(ImageItem, debug=True)
        item.handle = handle

        item.checksum = 123
        item.references = 0
        item.width = image.size[0]
        item.height = image.size[1]
        item.xHotspot = item.yHotspot = item.actionX = item.actionY = 0
        item.flags['Alpha'] = False#True
        item.transparent = self.tileset_transparent
        item.graphicMode = 4

        item.image = image.tobytes('raw', 'RGBA')
        item.alpha = image.tobytes('raw', 'A')

        bank.items.append(item)
        bank.itemDict[item.handle] = item
        return item

    def create_object(self, name, key, image, obstacle=False, size=None):
        item = self.create_image(image, False)
        icon = self.create_image(image, True)

        frame = self.mfa.frames[0]
        frameitem = frame.new(FrameItem)
        frame.items.append(frameitem)

        frameitem.name = name
        if size is not None:
            frameitem.objectType = QUICKBACKDROP
        else:
            frameitem.objectType = BACKDROP
        frameitem.handle = self.object_id
        self.object_id += 1
        frameitem.transparent = True
        frameitem.inkEffect = frameitem.inkEffectParameter = 0
        frameitem.antiAliasing = False
        frameitem.iconHandle = icon.handle
        frameitem.chunks = frameitem.new(ChunkList)

        if size is not None:
            obj = frameitem.new(QuickBackdrop)
            obj.width = size[0]
            obj.height = size[1]
            obj.shape = objects.RECTANGLE_SHAPE
            obj.borderSize = 0
            obj.borderColor = (0, 0, 0)
            obj.fillType = objects.MOTIF_FILL
            obj.color1 = (0, 0, 0)
            obj.color2 = (0, 0, 0)
            obj.image = item.handle
        else:
            obj = frameitem.new(Backdrop)
            obj.handle = item.handle
        obj.obstacleType = 1 if obstacle else 0
        obj.collisionType = 0

        frameitem.loader = obj

        if key is not None:
            self.objects[key] = frameitem

        return frameitem
Пример #54
0
def to_png(data):
    reader = ByteReader(data)
    width = reader.readInt(True)
    height = reader.readInt(True)
    data = reader.read(width*height)
    return Image.frombytes('L', (width, height), data)
Пример #55
0
def get_sized_data(data):
    writer = ByteReader()
    writer.writeIntString(data)
    return str(writer)
Пример #56
0
 def get_wav(self):
     reader = ByteReader()
     reader.write('RIFF')
     reader.writeInt(len(self.data) - 44)
     reader.write('WAVEfmt ')
     reader.writeInt(16, True)
     reader.writeShort(self.format, True)
     reader.writeShort(self.channel_count, True)
     reader.writeInt(self.sample_rate, True)
     reader.writeInt(self.byte_rate, True)
     reader.writeShort(self.block_align, True)
     reader.writeShort(self.bits_per_sample, True)
     reader.write('data')
     reader.writeInt(self.chunk_size, True)
     reader.write(self.data)
     return reader
Пример #57
0
 def write(self, reader):
     reader.write(MFA_MAGIC)
     reader.writeInt(self.mfaBuild)
     reader.writeInt(self.product)
     reader.writeInt(self.buildVersion)
     if self.languageId is not None:
         reader.writeInt(self.languageId)
     reader.writeInt(len(self.name))
     reader.write(self.name)
     reader.writeInt(len(self.description))
     reader.write(self.description)
     reader.writeInt(len(self.path))
     reader.write(self.path)
     reader.writeInt(len(self.stamp), True)
     reader.write(self.stamp)
     reader.write(FONT_BANK)
     self.fonts.write(reader)
     reader.write(SOUND_BANK)
     self.sounds.write(reader)
     reader.write(MUSIC_BANK)
     self.music.write(reader)
     for item in (self.icons, self.images):
         reader.write(IMAGE_BANK)
         item.write(reader)
     reader.writeInt(len(self.name))
     reader.write(self.name)
     reader.writeInt(len(self.author))
     reader.write(self.author)
     reader.writeInt(len(self.description))
     reader.write(self.description)
     reader.writeInt(len(self.copyright))
     reader.write(self.copyright)
     reader.writeInt(len(self.company))
     reader.write(self.company)
     reader.writeInt(len(self.version))
     reader.write(self.version)
     reader.writeInt(self.windowSize[0])
     reader.writeInt(self.windowSize[1])
     reader.writeColor(self.borderColor)
     reader.writeInt(self.displaySettings.getFlags())
     reader.writeInt(self.graphicSettings.getFlags())
     reader.writeInt(len(self.helpFile)); reader.write(self.helpFile)
     reader.writeInt(len(self.vitalizePreview))
     reader.write(self.vitalizePreview)
     reader.writeInt(self.initialScore, True)
     reader.writeInt(self.initialLifes, True)
     reader.writeInt(self.frameRate)
     reader.writeInt(self.buildType)
     reader.writeInt(len(self.buildPath))
     reader.write(self.buildPath)
     reader.writeInt(0)
     reader.writeInt(len(self.commandLine))
     reader.write(self.commandLine)
     reader.writeInt(len(self.aboutBox))
     reader.write(self.aboutBox)
     reader.writeInt(0)
     reader.writeInt(len(self.binaryFiles))
     for item in self.binaryFiles:
         reader.writeInt(len(item))
         reader.write(item)
     self.controls.write(reader)
     if self.menu:
         menuData = self.menu.generate()
         reader.writeInt(len(menuData))
         reader.writeReader(menuData)
     else:
         reader.writeInt(0)
     reader.writeInt(self.windowMenuIndex)
     reader.writeInt(len(self.menuImages))
     for k, v in self.menuImages.iteritems():
         reader.writeInt(k)
         reader.writeInt(v)
     self.globalValues.write(reader)
     self.globalStrings.write(reader)
     reader.writeInt(len(self.globalEvents))
     reader.write(self.globalEvents)
     reader.writeInt(self.graphicMode)
     reader.writeInt(len(self.iconImages))
     for item in self.iconImages:
         reader.writeInt(item)
     reader.writeInt(len(self.customQualifiers))
     for item in self.customQualifiers:
         name, handle = item
         reader.writeInt(len(name)); reader.write(name)
         reader.writeInt(handle)
     reader.writeInt(len(self.extensions))
     for item in self.extensions:
         handle, filename, name, magic, subType = item
         reader.writeInt(handle)
         reader.writeIntString(filename)
         reader.writeIntString(name)
         reader.writeInt(magic)
         reader.writeIntString(subType)
     reader.writeInt(len(self.frames))
     startPosition = reader.tell() + 4 * len(self.frames) + 4
     newReader = ByteReader()
     for frame in self.frames:
         reader.writeInt(startPosition + newReader.tell(), True)
         frame.write(newReader)
     reader.writeInt(startPosition + newReader.tell(), True)
     reader.writeReader(newReader)
     self.chunks.write(reader)