Created
December 22, 2014 17:54
-
-
Save dantarion/bfc5f072bbf2d3d6616f to your computer and use it in GitHub Desktop.
Parser for Street Fighter BVS files circa 2011
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 "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 "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 "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 "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+"-" | |
def hexPrint(arr): | |
for obj in arr: | |
print "%8X" % obj, | |
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]) | |
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