Advertisement
Nicknine

Marvel's Spider-Man Wwise Parser

Aug 21st, 2022 (edited)
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.70 KB | None | 0 0
  1. import os
  2. import shutil
  3. import struct
  4.  
  5. # Parameters
  6. inputDir=r"E:\SM_dump"
  7. outputDir=r"E:\GameRips\SpiderMan\sm_ps4"
  8. writeWwnames=False
  9.  
  10.  
  11. # Script starts here
  12. wwnames=list()
  13.  
  14. def readNullTerminatedString(f):
  15.     result=b""
  16.     while 1:
  17.         byte=f.read(1)
  18.         if byte==b"\x00": break
  19.         result+=byte
  20.  
  21.     return result.decode()
  22.  
  23. def alignSizeToBlock(value, block_align):
  24.     extra_size = value % block_align
  25.     if extra_size == 0: return value
  26.     return (value + block_align - extra_size)
  27.  
  28. def copyWem(fname):
  29.     name,ext=os.path.splitext(os.path.basename(fname))
  30.     wemid=int(name,16)&0xFFFFFFFF
  31.     outname="%u.wem" % (wemid)
  32.     #print(outName)
  33.     shutil.copyfile(fname,os.path.join(outputDir,outname))
  34.  
  35. def extractBnk(fname):
  36.     name,ext=os.path.splitext(os.path.basename(fname))
  37.     bnkName=name
  38.     f=open(fname,"rb")
  39.  
  40.     baseOffset=0x24
  41.     f.seek(baseOffset)
  42.     magic,magic2,eof,numSecs=struct.unpack("<4s4sII",f.read(0x10))
  43.     if magic!=b"1TAD": raise ValueError("Bad SoundBank magic in %s" % (fname))
  44.     bnkOffset=None
  45.     bnkSize=None
  46.  
  47.     for i in range(numSecs):
  48.         magic,secOffset,secSize=struct.unpack("<4sII",f.read(0x0c))
  49.         secOffset+=baseOffset
  50.         retOffset=f.tell()
  51.  
  52.         if magic==b"\x7F\xE3\x19\x0E": # ID map
  53.             pass
  54.         elif magic==b"\xA3\x90\x84\x3E": # Strings
  55.             f.seek(secOffset)
  56.             while f.tell()!=secOffset+secSize:
  57.                 f.seek(alignSizeToBlock(f.tell(),0x04))
  58.                 string=readNullTerminatedString(f)
  59.                 if string.startswith("sound\\banks\\"):
  60.                     bnkName=string[len("sound\\banks\\"):-len(".soundbank")]
  61.                 if "\\" in string: continue
  62.                 wwnames.append(string)
  63.         elif magic==b"\x38\x52\xF2\x53": # BKHD
  64.             bnkOffset=baseOffset+secOffset
  65.             bnkSize=secSize
  66.  
  67.         f.seek(retOffset)
  68.  
  69.     if bnkOffset and bnkSize:
  70.         f.seek(bnkOffset)
  71.         data=f.read(bnkSize)
  72.         outname="%s.bnk" % (bnkName)
  73.         print(outname)
  74.         f2=open(os.path.join(outputDir,outname),"wb")
  75.         f2.write(data)
  76.         f2.close()
  77.     else:
  78.         print("No BNK data in %s!" % (fname))
  79.  
  80.     f.close()
  81.  
  82. if __name__=="__main__":
  83.     os.makedirs(outputDir,exist_ok=True)
  84.     for fname in os.listdir(inputDir):
  85.         name,ext=os.path.splitext(os.path.basename(fname))
  86.         fname=os.path.join(inputDir,fname)
  87.         if name.startswith("0xE0000000"):
  88.             copyWem(fname)
  89.         elif ext==".soundbank":
  90.             extractBnk(fname)
  91.  
  92.     if writeWwnames:
  93.         f=open("wwnames.txt","w")
  94.         for name in wwnames:
  95.             f.write(name+"\n")
  96.         f.close()
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement