Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys, zlib, binascii, struct, os
- import psyco; psyco.full()
- def fnv(s):
- v = 0x811c9dc5
- for c in s:
- v ^= ord(c)
- v = (v * 0x1000193) & 0xffffffff
- return v
- def main():
- f = open(sys.argv[1], "rb") # path to Grimrock.dat
- magic = f.read(4)
- if magic != "GRAR":
- raise Exception("DSDSSD")
- numentries = struct.unpack("<L", f.read(4))[0]
- dir = {}
- for i in xrange(numentries):
- hash, offset, packedsize, unpackedsize = struct.unpack("<LLLL", f.read(16))
- if hash in dir:
- raise Exception("DSDSSSDDS")
- dir[hash] = (offset, packedsize, unpackedsize)
- for line in open(sys.argv[2], "rb"): # path to list of filenames
- filename = line.strip()
- hash = fnv(filename)
- if hash in dir:
- offset, packedsize, unpackedsize = dir[hash]
- print "found", filename
- f.seek(offset)
- if packedsize != 0:
- foo = struct.unpack("<L", f.read(4))[0]
- zblock = f.read(packedsize-4)
- block = zlib.decompress(zblock)
- else:
- block = f.read(unpackedsize)
- filename = "root/" + filename
- dirname = os.path.dirname(filename)
- try:
- os.makedirs(dirname)
- except:
- pass
- if not os.path.isfile(filename):
- open(filename, "wb").write(block)
- else:
- print "ERRROR", filename
- exit()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement