Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Originally by dantarion, modifications for AH3 made by Labryz
- import os,struct,glob,zlib,subprocess
- from PIL import Image
- OUT_PATH = r"..\AH3LMSS\\" #MODIFY ME, ALWAYS END WITH \\ AND MAKE SURE IT'S A FOLDER
- MODE = "<"
- def dump_pac(f,basename,filename,filesize):
- if not os.path.isdir(OUT_PATH+basename+".extracted"):
- os.makedirs(OUT_PATH+basename+".extracted")
- else:
- pass
- outFilename = os.path.join(OUT_PATH+basename+".extracted",filename)
- if os.path.isfile(outFilename):
- return
- print filename
- out = open(outFilename,"wb")
- out.write(f.read(filesize))
- out.close()
- def dump_hip_as_bmp(f,basename,filename,filesize):
- if not os.path.isdir(OUT_PATH+basename+"_img"):
- os.makedirs(OUT_PATH+basename+"_img")
- outFilename = os.path.join(OUT_PATH+basename+"_img",filename + ".bmp")
- if os.path.isfile(outFilename):
- return
- print filename
- f.seek(0x10, 1)
- outimg = Image.new('P', struct.unpack(MODE + "2I",f.read(8)))
- f.seek(8, 1)
- pallete = []
- for i in range(256):
- b,g,r = struct.unpack('3B',f.read(3))
- pallete.append(r)
- pallete.append(g)
- pallete.append(b)
- f.seek(1,1)
- outimg.putpalette(pallete)
- imgdatasize = filesize - 0x420
- bytesread = 0
- pixeldata = []
- while bytesread < imgdatasize:
- idx, count = struct.unpack("2B", f.read(2))
- for i in range(count):
- pixeldata.append(idx)
- bytesread += 2
- outimg.putdata(pixeldata)
- outimg.save(outFilename)
- outimg.close()
- def dump_hpal_as_act(f,basename,filename,filesize):
- if filesize != 0x420:
- return
- if not os.path.isdir(OUT_PATH+basename+"_pal"):
- os.makedirs(OUT_PATH+basename+"_pal")
- outFilename = os.path.join(OUT_PATH+basename+"_pal", filename + ".act")
- if os.path.isfile(outFilename):
- return
- print filename
- f.seek(0x20, 1)
- outact = open(outFilename, 'wb')
- for i in range(256):
- b,g,r = struct.unpack("3B", f.read(3))
- outact.write(struct.pack("3B", r, g, b))
- f.seek(1,1)
- outact.close()
- def iterpac(filename,func):
- global MODE
- basename = os.path.split(filename)[1]
- f = open(filename,"rb")
- BASE = 0
- if f.read(4) != "FPAC":
- f.seek(0x48)
- #XRD PAC
- BASE = 0x48
- MODE = ">"
- if f.read(4) != "FPAC":
- print " ","Not a valid .pac file"
- return
- DATA_START,TOTAL_SIZE,FILE_COUNT = struct.unpack(MODE+ "3I",f.read(12))
- if FILE_COUNT == 0:
- return
- UNK01,STRING_SIZE,UNK03,UNK04 = struct.unpack(MODE+ "4I",f.read(16))
- ENTRY_SIZE = (DATA_START-0x20)/FILE_COUNT
- #STRING_SIZE = (STRING_SIZE + 15) & ~15
- for i in range(0,FILE_COUNT):
- f.seek(BASE+0x20+i*(ENTRY_SIZE))
- FILE_NAME,FILE_ID,FILE_OFFSET,FILE_SIZE,UNK = struct.unpack(MODE+str(STRING_SIZE)+"s4I",f.read(0x10+STRING_SIZE))
- FILE_NAME = FILE_NAME.split("\x00")[0]
- f.seek(BASE+DATA_START+FILE_OFFSET)
- yield func(f,basename,FILE_NAME,FILE_SIZE)
- #for filename in glob.glob("disc/P4AU/char/char_kk_*.pac"):
- if __name__ == "__main__":
- 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
- print thing
- print "done"
Add Comment
Please, Sign In to add comment