Exemplo n.º 1
0
    def mapstoFakeLZO(self, path, tabPath, outBinPath, outTabPath):
        """Convert MAPS.BIN file's contents to "fake LZO" format.

        path: input file to convert.
        tabPath: table for input file.
        outBinPath: output path for .bin file.
        outTabPath: output path for .tab file.
        """
        inFile  = BinaryFile(path,       'rb')
        tabFile = BinaryFile(tabPath,    'rb')
        outBin  = BinaryFile(outBinPath, 'wb')
        outTab  = BinaryFile(outTabPath, 'wb')
        inZlb   = Zlb(inFile)
        offs    = tabFile.readu32()
        while offs != 0xFFFFFFFF:
            nextOffs = tabFile.readu32()
            inLen    = nextOffs - offs
            inFile.seek(offs)

            tabVal = outBin.tell()
            outTab.writeu32(tabVal)

            while offs < nextOffs:
                inFile.seek(offs)
                data = inFile.read(4)
                if len(data) == 0: break
                elif data == b'\xFA\xCE\xFE\xED':
                    rawLen, zlbOffs, compLen = inFile.readStruct('3I')
                    dOut = data + struct.pack('>3I', rawLen+0x28, zlbOffs, rawLen+4)
                    printf("Write FACEFEED at %08X: %s\r\n", outBin.tell(),
                        dOut.hex())
                    outBin.write(dOut)
                    for i in range(zlbOffs):
                        outBin.writeu16(inFile.readu16())
                    offs += len(data)
                elif data == b'ZLB\0':
                    inFile.seek(offs)
                    data = inZlb.decompress()
                    dl   = len(data) + 4
                    outBin.write(b'LZO\0' + struct.pack('3I', 0, 0, dl) + b'Rena' + data)
                else:
                    outBin.write(data)
                offs = inFile.tell()
            offs = nextOffs

        tabVal = outBin.tell()
        outTab.writeu32(tabVal)
        outTab.writeu32(0xFFFFFFFF)
        for i in range(3):
            outTab.writeu32(0)
Exemplo n.º 2
0
 def dumpTexture(self, path, outPath, raw=False, offset=0):
     """Dump texture from file."""
     if type(raw) is str: raw = (raw == '1')
     if type(offset) is str: offset = int(offset, 0)
     file = BinaryFile(path, 'rb', offset=offset)
     head = file.readStruct('3b')
     file.seek(0)
     if head in (b'ZLB', b'DIR', b'\xFA\xCE\xFE'):
         data = Zlb(file).decompress()
     else:
         size = file.readu32(offset=0x44)
         file.seek(0)
         data = file.read(size+0x60)
     if raw:
         with open(outPath, 'wb') as outFile:
             outFile.write(data)
     else:
         tex = SfaTexture.fromData(data)
         printf("Texture size: %dx%d, fmt %s, %d mipmaps\n",
             tex.width, tex.height, tex.format.name,
             tex.numMipMaps)
         tex.image.save(outPath)