PythonAfBkParser

From WTFwiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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)