PythonAfBkParser

From WTFwiki
Revision as of 18:38, 22 November 2009 by Chaosbm (talk | contribs) (→‎Code)
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)