PythonAfBkParser
Jump to navigation
Jump to search
This python script will load .af and .bk files.
Code
import struct
class Obj(object):
def __init__(self, **kw):
for k, v in kw.items():
self.__setattr__(k, v)
def read_af_file(f):
header = struct.unpack('<HhlBHllllBB', f.read(29))
anims = {}
while True:
animNum = struct.unpack('<B', f.read(1))[0]
if animNum >= 70: break
anim = read_animation(f)
anim.animAttrs = f.read(21)
anim.moveString = f.read(21)
n = struct.unpack('<H', f.read(2))[0]
anim.footerString = f.read(n)
anims[animNum] = anim
footer = f.read(30)
return Obj(header=header, anims=anims, footer=footer)
def read_bk_file(f):
header = struct.unpack('<LBHH', f.read(9))
anims = {}
while True:
(nextOffset, animNum) = struct.unpack('<LB', f.read(5))
if animNum >= 50: break
animHeader = struct.unpack('<BBBBHBH', f.read(9))
animHeaderString = f.read(animHeader[6])
anim = read_animation(f)
anims[animNum] = Obj(header=animHeader, headerStr=animHeaderString, anim=anim)
background = f.read(header[2] * header[3])
numPalettes = struct.unpack('B', f.read(1))[0]
palettes = []
for i in range(numPalettes):
palettes.append(struct.unpack('<768B1024B3840B', f.read(768+1024+3840)))
footer = f.read(30)
return Obj(header=header, anims=anims, background=background, palettes=palettes, footer=footer)
def read_cntbs(f):
strlen = struct.unpack('<H', f.read(2))[0]
return f.read(strlen+1)[:-1]
def read_animation(f):
header = struct.unpack('<8BHB', f.read(11))
numOverlays = header[8]
numSprites = header[9]
overlays = f.read(numOverlays * 4)
animStr = read_cntbs(f)
numExtras = struct.unpack('B', f.read(1))[0]
extraAnimStrs = [read_cntbs(f) for n in range(numExtras)]
sprites = [read_sprite(f) for n in range(numSprites)]
return Obj(header=header, overlays=overlays, animStr=animStr, extraAnimStrs=extraAnimStrs, sprites=sprites)
def read_sprite(f):
header = struct.unpack('<HhhHHBB', f.read(12))
data = None
if not header[6]:
data = f.read(header[0])
return Obj(header=header, data=data)