Advertisement
Guest User

Untitled

a guest
Apr 12th, 2012
1,156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.70 KB | None | 0 0
  1. import sys, zlib, binascii, struct, os
  2.  
  3. import psyco; psyco.full()
  4.  
  5. def fnv(s):
  6.     v = 0x811c9dc5
  7.  
  8.     for c in s:
  9.         v ^= ord(c)
  10.         v = (v * 0x1000193) & 0xffffffff
  11.        
  12.     return v
  13.        
  14.  
  15. def main():
  16.     f = open(sys.argv[1], "rb") # path to Grimrock.dat
  17.    
  18.     magic = f.read(4)
  19.     if magic != "GRAR":
  20.         raise Exception("DSDSSD")
  21.        
  22.     numentries = struct.unpack("<L", f.read(4))[0]
  23.    
  24.     dir = {}
  25.     for i in xrange(numentries):
  26.         hash, offset, packedsize, unpackedsize = struct.unpack("<LLLL", f.read(16))
  27.        
  28.         if hash in dir:
  29.             raise Exception("DSDSSSDDS")
  30.            
  31.         dir[hash] = (offset, packedsize, unpackedsize)
  32.    
  33.    
  34.     for line in open(sys.argv[2], "rb"): # path to list of filenames
  35.         filename = line.strip()
  36.        
  37.         hash = fnv(filename)
  38.        
  39.         if hash in dir:
  40.             offset, packedsize, unpackedsize = dir[hash]
  41.             print "found", filename
  42.            
  43.             f.seek(offset)
  44.            
  45.             if packedsize != 0:
  46.                 foo = struct.unpack("<L", f.read(4))[0]
  47.  
  48.                 zblock = f.read(packedsize-4)
  49.                 block = zlib.decompress(zblock)
  50.             else:
  51.                 block = f.read(unpackedsize)
  52.  
  53.             filename = "root/" + filename
  54.            
  55.             dirname = os.path.dirname(filename)
  56.             try:
  57.                 os.makedirs(dirname)
  58.             except:
  59.                 pass
  60.                
  61.             if not os.path.isfile(filename):
  62.                 open(filename, "wb").write(block)
  63.            
  64.         else:
  65.             print "ERRROR", filename
  66.             exit()
  67. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement