Skip to content

Instantly share code, notes, and snippets.

@dantarion
Created December 22, 2014 17:54
Show Gist options
  • Save dantarion/bfc5f072bbf2d3d6616f to your computer and use it in GitHub Desktop.
Save dantarion/bfc5f072bbf2d3d6616f to your computer and use it in GitHub Desktop.
Parser for Street Fighter BVS files circa 2011
import os, struct
def readStringAt(loc):
f.seek(loc)
s = ""
c = f.read(1)
while ord(c) != 0:
s = s+c
c = f.read(1)
return s
def parseSCDData():
base = f.tell()
print "CHUNK @%06X" % base
print struct.unpack("<4f",f.read(16))
nodeCount = struct.unpack("<I",f.read(4))[0]
nodeOffset = base+struct.unpack("<I",f.read(4))[0]
node2Count = struct.unpack("<I",f.read(4))[0]
node2Offset = base+struct.unpack("<I",f.read(4))[0]
node3Count = struct.unpack("<I",f.read(4))[0]
node3Offset = base+struct.unpack("<I",f.read(4))[0]
node4Count = struct.unpack("<I",f.read(4))[0]
node4Offset = base+struct.unpack("<I",f.read(4))[0]
print
print "NODE1"
for i in range(0,nodeCount):
f.seek(nodeOffset+12*i)
scdIndex = struct.unpack("<I",f.read(4))[0]
data = struct.unpack("<2f",f.read(8))
print SCDNAMES[scdIndex],
print data
print
print "NODE2"
for i in range(0,node2Count):
f.seek(node2Offset+12*i)
scdIndex = struct.unpack("<I",f.read(4))[0]
data = struct.unpack("<8f",f.read(32))
print SCDNAMES[scdIndex],
print data
print
print "NODE3"
for i in range(0,node3Count):
f.seek(node3Offset+0x1C*i)
print "@%06X" % f.tell(),
data = struct.unpack("<4B6f",f.read(28))
print SCDNAMES[data[2]],SCDNAMES[data[3]],data
print
print "NODE4"
for i in range(0,node4Count):
f.seek(node4Offset+0x28*i)
print "@%06X" % f.tell()
bdata = struct.unpack("<4B",f.read(4))
print bdata,
print BONES[bdata[2]]
s = ""
for b in range(0,0x24):
s = s + ("%02X"%ord(f.read(1)))
if (b+1) % 8 == 0:
s = s+"\n"
print s+"-"
print
print
def hexPrint(arr):
for obj in arr:
print "%8X" % obj,
print
def parseVFX(l):
base = f.tell()
s = readStringAt(base)
l.append(s)
print s
f.seek(base+0x20)
DATA = struct.unpack("<6HI",f.read(0x10))
print DATA,"%X"%(base+DATA[6])
for j in range(0,DATA[3]+DATA[5]):
f.seek(base+DATA[6]+j*0x10)
base2 = f.tell()
DATA2 = struct.unpack("<I2H2f",f.read(0x10))
print "\t",
print DATA2,
print readStringAt(base2+DATA2[0])
print
def parseBSR(filename):
global f,VFXNAMES,BONES
f = open(filename,"rb")
print f.read(0x4)
f.seek(0xC)
HEADER = struct.unpack("<4H4I",f.read(24))
VFXNAMES = []
VFX2NAMES = []
TEXNAMES = []
print HEADER
print "VFX NAMES?"
for i in range(0,HEADER[0]):
print "%02X" % i,
f.seek(HEADER[4]+i*0x30)
parseVFX(VFXNAMES)
print "VFX2 NAMES?"
for i in range(0,HEADER[1]):
print "%02X" % i,
f.seek(HEADER[5]+i*0x30)
parseVFX(VFX2NAMES)
print "TEX NAMES?"
for i in range(0,HEADER[2]):
print "%02X" % i,
base = HEADER[6]+i*0x30
s = readStringAt(HEADER[6]+i*0x30)
TEXNAMES.append(s)
print s
f.seek(HEADER[6]+i*0x30+0x20)
DATA = struct.unpack("<IIHHI",f.read(0x10))
hexPrint(DATA)
print "%X"%(base+DATA[4])
#TARGET = "pc/ADN/ADN.vfx.bvs"
TARGET = "pc/TRN.vfx.bvs"
parseBSR(TARGET)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment