Guest User

Untitled

a guest
Dec 16th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #Originally by dantarion, modifications for AH3 made by Labryz
  2. import os,struct,glob,zlib,subprocess
  3. from PIL import Image
  4. OUT_PATH = r"..\AH3LMSS\\" #MODIFY ME, ALWAYS END WITH \\ AND MAKE SURE IT'S A FOLDER
  5. MODE = "<"
  6. def dump_pac(f,basename,filename,filesize):
  7. if not os.path.isdir(OUT_PATH+basename+".extracted"):
  8. os.makedirs(OUT_PATH+basename+".extracted")
  9. else:
  10. pass
  11. outFilename = os.path.join(OUT_PATH+basename+".extracted",filename)
  12. if os.path.isfile(outFilename):
  13. return
  14. print filename
  15. out = open(outFilename,"wb")
  16. out.write(f.read(filesize))
  17. out.close()
  18.  
  19. def dump_hip_as_bmp(f,basename,filename,filesize):
  20. if not os.path.isdir(OUT_PATH+basename+"_img"):
  21. os.makedirs(OUT_PATH+basename+"_img")
  22. outFilename = os.path.join(OUT_PATH+basename+"_img",filename + ".bmp")
  23. if os.path.isfile(outFilename):
  24. return
  25. print filename
  26. f.seek(0x10, 1)
  27. outimg = Image.new('P', struct.unpack(MODE + "2I",f.read(8)))
  28. f.seek(8, 1)
  29. pallete = []
  30. for i in range(256):
  31. b,g,r = struct.unpack('3B',f.read(3))
  32. pallete.append(r)
  33. pallete.append(g)
  34. pallete.append(b)
  35. f.seek(1,1)
  36. outimg.putpalette(pallete)
  37. imgdatasize = filesize - 0x420
  38. bytesread = 0
  39. pixeldata = []
  40. while bytesread < imgdatasize:
  41. idx, count = struct.unpack("2B", f.read(2))
  42. for i in range(count):
  43. pixeldata.append(idx)
  44. bytesread += 2
  45. outimg.putdata(pixeldata)
  46. outimg.save(outFilename)
  47. outimg.close()
  48.  
  49. def dump_hpal_as_act(f,basename,filename,filesize):
  50. if filesize != 0x420:
  51. return
  52. if not os.path.isdir(OUT_PATH+basename+"_pal"):
  53. os.makedirs(OUT_PATH+basename+"_pal")
  54. outFilename = os.path.join(OUT_PATH+basename+"_pal", filename + ".act")
  55. if os.path.isfile(outFilename):
  56. return
  57. print filename
  58. f.seek(0x20, 1)
  59. outact = open(outFilename, 'wb')
  60. for i in range(256):
  61. b,g,r = struct.unpack("3B", f.read(3))
  62. outact.write(struct.pack("3B", r, g, b))
  63. f.seek(1,1)
  64. outact.close()
  65.  
  66. def iterpac(filename,func):
  67. global MODE
  68. basename = os.path.split(filename)[1]
  69. f = open(filename,"rb")
  70. BASE = 0
  71. if f.read(4) != "FPAC":
  72. f.seek(0x48)
  73. #XRD PAC
  74. BASE = 0x48
  75. MODE = ">"
  76. if f.read(4) != "FPAC":
  77. print " ","Not a valid .pac file"
  78. return
  79. DATA_START,TOTAL_SIZE,FILE_COUNT = struct.unpack(MODE+ "3I",f.read(12))
  80. if FILE_COUNT == 0:
  81. return
  82. UNK01,STRING_SIZE,UNK03,UNK04 = struct.unpack(MODE+ "4I",f.read(16))
  83. ENTRY_SIZE = (DATA_START-0x20)/FILE_COUNT
  84. #STRING_SIZE = (STRING_SIZE + 15) & ~15
  85.  
  86. for i in range(0,FILE_COUNT):
  87. f.seek(BASE+0x20+i*(ENTRY_SIZE))
  88. FILE_NAME,FILE_ID,FILE_OFFSET,FILE_SIZE,UNK = struct.unpack(MODE+str(STRING_SIZE)+"s4I",f.read(0x10+STRING_SIZE))
  89. FILE_NAME = FILE_NAME.split("\x00")[0]
  90. f.seek(BASE+DATA_START+FILE_OFFSET)
  91. yield func(f,basename,FILE_NAME,FILE_SIZE)
  92.  
  93.  
  94. #for filename in glob.glob("disc/P4AU/char/char_kk_*.pac"):
  95. if __name__ == "__main__":
  96. for thing in iterpac(r"X:\path\to\paldata_or_palimg.pac",dump_hpal_as_act): #use dump_hip_as_bmp for palimg.pac and dump_hpal_as_act for paldata.pac
  97. print thing
  98. print "done"
Add Comment
Please, Sign In to add comment