Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import shutil
- import struct
- # Parameters
- inputDir=r"E:\SM_dump"
- outputDir=r"E:\GameRips\SpiderMan\sm_ps4"
- writeWwnames=False
- # Script starts here
- wwnames=list()
- def readNullTerminatedString(f):
- result=b""
- while 1:
- byte=f.read(1)
- if byte==b"\x00": break
- result+=byte
- return result.decode()
- def alignSizeToBlock(value, block_align):
- extra_size = value % block_align
- if extra_size == 0: return value
- return (value + block_align - extra_size)
- def copyWem(fname):
- name,ext=os.path.splitext(os.path.basename(fname))
- wemid=int(name,16)&0xFFFFFFFF
- outname="%u.wem" % (wemid)
- #print(outName)
- shutil.copyfile(fname,os.path.join(outputDir,outname))
- def extractBnk(fname):
- name,ext=os.path.splitext(os.path.basename(fname))
- bnkName=name
- f=open(fname,"rb")
- baseOffset=0x24
- f.seek(baseOffset)
- magic,magic2,eof,numSecs=struct.unpack("<4s4sII",f.read(0x10))
- if magic!=b"1TAD": raise ValueError("Bad SoundBank magic in %s" % (fname))
- bnkOffset=None
- bnkSize=None
- for i in range(numSecs):
- magic,secOffset,secSize=struct.unpack("<4sII",f.read(0x0c))
- secOffset+=baseOffset
- retOffset=f.tell()
- if magic==b"\x7F\xE3\x19\x0E": # ID map
- pass
- elif magic==b"\xA3\x90\x84\x3E": # Strings
- f.seek(secOffset)
- while f.tell()!=secOffset+secSize:
- f.seek(alignSizeToBlock(f.tell(),0x04))
- string=readNullTerminatedString(f)
- if string.startswith("sound\\banks\\"):
- bnkName=string[len("sound\\banks\\"):-len(".soundbank")]
- if "\\" in string: continue
- wwnames.append(string)
- elif magic==b"\x38\x52\xF2\x53": # BKHD
- bnkOffset=baseOffset+secOffset
- bnkSize=secSize
- f.seek(retOffset)
- if bnkOffset and bnkSize:
- f.seek(bnkOffset)
- data=f.read(bnkSize)
- outname="%s.bnk" % (bnkName)
- print(outname)
- f2=open(os.path.join(outputDir,outname),"wb")
- f2.write(data)
- f2.close()
- else:
- print("No BNK data in %s!" % (fname))
- f.close()
- if __name__=="__main__":
- os.makedirs(outputDir,exist_ok=True)
- for fname in os.listdir(inputDir):
- name,ext=os.path.splitext(os.path.basename(fname))
- fname=os.path.join(inputDir,fname)
- if name.startswith("0xE0000000"):
- copyWem(fname)
- elif ext==".soundbank":
- extractBnk(fname)
- if writeWwnames:
- f=open("wwnames.txt","w")
- for name in wwnames:
- f.write(name+"\n")
- f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement