diff --git a/brlyt.py b/brlyt.py new file mode 100755 index 0000000..2d25362 --- /dev/null +++ b/brlyt.py @@ -0,0 +1,1399 @@ +#!/usr/bin/python + +import sys, struct, re, hashlib, os + +''' STOLEN FROM COMEX ''' +def nullterm(str_plus): + z = str_plus.find('\0') + if z != -1: + return str_plus[:z] + else: + return str_plus + +def unnullterm(var, size): + if len(var) > size: + raise Exception('unnullterm: "%s" too long' % var) + return var.ljust(size, '\0') + +def bit_extract(num, start, end=None): + if end is None: + end = start + mask = (2**(31 - start + 1) - 1) - (2**(31 - end) - 1) + ret = (num & mask) >> (31 - end) + + return ret + +def bit_place(num, start, end=None): + # Just for sanity + if end is None: + end = start + assert num <= 2**(end - start) + return num << (31 - end) +''' END THEFT FROM COMEX ''' + +class BRLYT_Numoffs: + def __init__(self): + self.number = 0x00 + self.offset = 0x00 + def eat_numoffs(self, file, offset): + self.number, self.offset = struct.unpack('>HH', file[offset:offset+4]) + return + def show_numoffs(self): + print "Number: %04x" % self.number + print "Offset: %04x" % self.offset + return + def add(self): + self.number = self.number + 1 + return + def get_length(self): + templength = 2 + 2 + return templength + def write_to_file(self, file): + file.write(struct.pack('>H', self.number)) + file.write(struct.pack('>H', self.offset)) + +class BRLYT_SignedColor: + def __init__(self): + self.color1 = 255 + self.color2 = 255 + self.color3 = 255 + self.color4 = 255 + def eat_signedcolor(self, file, offset): + self.color1, self.color2, self.color3, self.color4 = struct.unpack('>hhhh', file[offset:offset+8]) + return + def show_signedcolor(self): + print "\tColor: %d" % self.color1 + print "\tColor: %d" % self.color2 + print "\tColor: %d" % self.color3 + print "\tColor: %d" % self.color4 + return + def get_length(self): + templength = 2 + 2 + 2 + 2 + return templength + def write_to_file(self, file): + file.write(struct.pack('>h', self.color1)) + file.write(struct.pack('>h', self.color2)) + file.write(struct.pack('>h', self.color3)) + file.write(struct.pack('>h', self.color4)) + return + +class BRLYT_Color: + def __init__(self): + self.color1 = 0xFFFFFFFF + self.color2 = 0xFFFFFFFF + self.color3 = 0xFFFFFFFF + self.color4 = 0xFFFFFFFF + def eat_color(self, file, offset): + self.color1, self.color2, self.color3, self.color4 = struct.unpack('>IIII', file[offset:offset+16]) + return + def show_color(self): + print "\tColor: %08x" % self.color1 + print "\tColor: %08x" % self.color2 + print "\tColor: %08x" % self.color3 + print "\tColor: %08x" % self.color4 + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>I', self.color1)) + file.write(struct.pack('>I', self.color2)) + file.write(struct.pack('>I', self.color3)) + file.write(struct.pack('>I', self.color4)) + return + +class BRLYT_Coordinates: + def __init__(self): + self.coord1 = 0.0 + self.coord2 = 0.0 + self.coord3 = 1.0 + self.coord4 = 0.0 + self.coord5 = 0.0 + self.coord6 = 1.0 + self.coord7 = 1.0 + self.coord8 = 1.0 + def eat_coordinates(self, file, offset): + self.coord1, self.coord2, self.coord3, self.coord4, self.coord5, self.coord6, self.coord7, self.coord8 = struct.unpack('>8f', file[offset:offset+32]) + return + def show_coordinates(self): + print "Coordinate: %f , %f" % ( self.coord1 , self.coord2 ) + print "Coordinate: %f , %f" % ( self.coord3 , self.coord4 ) + print "Coordinate: %f , %f" % ( self.coord5 , self.coord6 ) + print "Coordinate: %f , %f" % ( self.coord7 , self.coord8 ) + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>f', self.coord1)) + file.write(struct.pack('>f', self.coord2)) + file.write(struct.pack('>f', self.coord3)) + file.write(struct.pack('>f', self.coord4)) + file.write(struct.pack('>f', self.coord5)) + file.write(struct.pack('>f', self.coord6)) + file.write(struct.pack('>f', self.coord7)) + file.write(struct.pack('>f', self.coord8)) + return + +class BRLYT_Uab: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x05 + self.byte4 = 0x00 + def eat_uab(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_uab(self): + print "UAb: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Uaa: + def __init__(self): + self.byte1 = 0x77 + self.byte2 = 0x00 + self.byte3 = 0x00 + self.byte4 = 0x00 + def eat_uaa(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_uaa(self): + print "UAa: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Ua9: + def __init__(self): + self.byte01 = 0x00 + self.byte02 = 0x00 + self.byte03 = 0x00 + self.byte04 = 0x00 + self.byte05 = 0x00 + self.byte06 = 0x00 + self.byte07 = 0x00 + self.byte08 = 0x00 + self.byte09 = 0x00 + self.byte10 = 0x00 + def eat_ua9(self, file, offset): + self.byte01, self.byte02, self.byte03, self.byte04, self.byte05, self.byte06, self.byte07, self.byte08, self.byte09, self.byte10 = struct.unpack('>10B', file[offset:offset+10]) + return + def show_ua9(self): + print "UA9: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x" % ( self.byte01, self.byte02, self.byte03, self.byte04, self.byte05, self.byte06, self.byte07, self.byte08, self.byte09, self.byte10 ) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte01)) + file.write(struct.pack('>B', self.byte02)) + file.write(struct.pack('>B', self.byte03)) + file.write(struct.pack('>B', self.byte04)) + file.write(struct.pack('>B', self.byte05)) + file.write(struct.pack('>B', self.byte06)) + file.write(struct.pack('>B', self.byte07)) + file.write(struct.pack('>B', self.byte08)) + file.write(struct.pack('>B', self.byte09)) + file.write(struct.pack('>B', self.byte10)) + return + +class BRLYT_Ua8: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x05 + self.byte4 = 0x00 + def eat_ua8(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_ua8(self): + print "UA8: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Ua7: + def __init__(self): + self.a = 0x00000000 + self.b = 0x00000000 + self.c = 0.0 + self.d = 0.0 + self.e = 0.0 + def eat_ua7(self, file, offset): + self.a, self.b, self.c, self.d, self.e = struct.unpack('>IIfff', file[offset:offset+20]) + return + def show_ua7(self): + print "UA7: %08x %08x %f %f %f" % ( self.a , self.b , self.c , self.d , self.e ) + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>I', self.a)) + file.write(struct.pack('>I', self.b)) + file.write(struct.pack('>f', self.c)) + file.write(struct.pack('>f', self.d)) + file.write(struct.pack('>f', self.e)) + return + +class BRLYT_Ua6: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x05 + self.byte4 = 0x00 + def eat_ua6(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_ua6(self): + print "UA6: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Ua5: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x05 + self.byte4 = 0x00 + def eat_ua5(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_ua5(self): + print "UA5: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Ua4: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x05 + self.byte4 = 0x00 + def eat_ua4(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_ua4(self): + print "UA4: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + return + +class BRLYT_Ua3: + def __init__(self): + self.byte1 = 0x01 + self.byte2 = 0x04 + self.byte3 = 0x1e + self.byte4 = 0x00 + def eat_ua3(self, file, offset): + self.byte1, self.byte2, self.byte3, self.byte4 = struct.unpack('BBBB', file[offset:offset+4]) + return + def show_ua3(self): + print "UA3: %02x %02x %02x %02x" % ( self.byte1, self.byte2, self.byte3, self.byte4) + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.byte1)) + file.write(struct.pack('>B', self.byte2)) + file.write(struct.pack('>B', self.byte3)) + file.write(struct.pack('>B', self.byte4)) + +class BRLYT_TextureMap: + def __init__(self): + self.x1 = 0.0 + self.y1 = 0.0 + self.angle = 0.0 + self.x2 = 1.0 + self.y2 = 1.0 + def eat_texturemap(self, file, offset): + self.x1, self.y1, self.angle, self.x2, self.y2 = struct.unpack('>fffff', file[offset:offset+20]) + return + def show_texturemap(self): + print "Coordinate 1: %f %f" % ( self.x1 , self.y1 ) + print "Angle: %f" % self.angle + print "Coordinate 2: %f %f" % ( self.x2 , self.y2 ) + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>f', self.x1)) + file.write(struct.pack('>f', self.y1)) + file.write(struct.pack('>f', self.angle)) + file.write(struct.pack('>f', self.x2)) + file.write(struct.pack('>f', self.y2)) + return + +class BRLYT_TexRef: + def __init__(self): + self.texture_offset = 0x0000 + self.wrap_s = 0x00 + self.wrap_t = 0x00 + def eat_texref(self, file, offset): + self.texture_offset, self.wrap_s, self.wrap_t = struct.unpack('>HBB', file[offset:offset+4]) + return + def show_texref(self): + print "Texture Offset: %04x" % self.texture_offset + print "Wrap_S: %02x" % self.wrap_s + print "Wrap_T: %02x" % self.wrap_t + return + def get_length(self): + templength = 2 + 1 + 1 + return templength + def write_to_file(self, file): + file.write(struct.pack('>H', self.texture_offset)) + file.write(struct.pack('>B', self.wrap_s)) + file.write(struct.pack('>B', self.wrap_t)) + return + +class BRLYT_Material: + def __init__(self): + self.name = "material00" + self.forecolor = BRLYT_SignedColor() + self.backcolor = BRLYT_SignedColor() + self.unknowncolor = BRLYT_SignedColor() + self.tevcolor = BRLYT_Color() + self.flags = 0x00000000 + self.texrefs = { } + self.texturemaps = { } + self.ua3s = { } + self.ua4s = { } + self.ua5s = { } + self.ua6s = { } + self.ua7s = { } + self.ua8s = { } + self.ua9s = { } + self.uaas = { } + self.uabs = { } + def eat_material(self, file, offset): + dummy, self.name = struct.unpack('>I20s', file[offset-4:offset+20]) + self.forecolor.eat_signedcolor(file, offset+20) + self.backcolor.eat_signedcolor(file, offset+28) + self.unknowncolor.eat_signedcolor(file, offset+36) + self.tevcolor.eat_color(file, offset+44) + dummy, self.flags = struct.unpack('>II', file[offset+60-4:offset+60+4]) + file_offset = offset + 64 + for x in range(bit_extract(self.flags, 28, 31)): + self.texrefs[x] = BRLYT_TexRef() + self.texrefs[x].eat_texref(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 24, 27)): + self.texturemaps[x] = BRLYT_TextureMap() + self.texturemaps[x].eat_texturemap(file, file_offset) + file_offset = file_offset + 20 + for x in range(bit_extract(self.flags, 20, 23)): + self.ua3s[x] = BRLYT_Ua3() + self.ua3s[x].eat_ua3(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 6)): + self.ua4s[x] = BRLYT_Ua4() + self.ua4s[x].eat_ua4(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 4)): + self.ua5s[x] = BRLYT_Ua5() + self.ua5s[x].eat_ua5(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 19)): + self.ua6s[x] = BRLYT_Ua6() + self.ua6s[x].eat_ua6(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 17, 18)): + self.ua7s[x] = BRLYT_Ua7() + self.ua7s[x].eat_ua7(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 14, 16)): + self.ua8s[x] = BRLYT_Ua8() + self.ua8s[x].eat_ua8(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 9, 13)): + self.ua9s[x] = BRLYT_Ua9() + self.ua9s[x].eat_ua9(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 8)): + self.uaas[x] = BRLYT_Uaa() + self.uaas[x].eat_uaa(file, file_offset) + file_offset = file_offset + 4 + for x in range(bit_extract(self.flags, 7)): + self.uabs[x] = BRLYT_Uab() + self.uabs[x].eat_uab(file, file_offset) + file_offset = file_offset + 4 + return + def show_material(self): + print "Name: %s" % self.name.rstrip('\x00') + print "Forecolor: " + self.forecolor.show_signedcolor() + print "Backcolor: " + self.backcolor.show_signedcolor() + print "Unknown Color: " + self.unknowncolor.show_signedcolor() + print "Tev Color: " + self.tevcolor.show_color() + print "Flags: %08x" % self.flags + for x in range(bit_extract(self.flags, 28, 31)): + self.texrefs[x].show_texref() + for x in range(bit_extract(self.flags, 24, 27)): + self.texturemaps[x].show_texturemap() + for x in range(bit_extract(self.flags, 20, 23)): + self.ua3s[x].show_ua3() + for x in range(bit_extract(self.flags, 6)): + self.ua4s[x].show_ua4() + for x in range(bit_extract(self.flags, 4)): + self.ua5s[x].show_ua5() + for x in range(bit_extract(self.flags, 19)): + self.ua6s[x].show_ua6() + for x in range(bit_extract(self.flags, 17, 18)): + self.ua7s[x].show_ua7() + for x in range(bit_extract(self.flags, 14, 16)): + self.ua8s[x].show_ua8() + for x in range(bit_extract(self.flags, 9, 13)): + self.ua9s[x].show_ua9() + for x in range(bit_extract(self.flags, 8)): + self.uaas[x].show_uaa() + for x in range(bit_extract(self.flags, 7)): + self.uabs[x].show_uab() + return + def get_length(self): + templength = 20 + self.forecolor.get_length() + self.backcolor.get_length() + templength = templength + self.unknowncolor.get_length() + self.tevcolor.get_length() + 4 + for x in self.texrefs: + templength = templength + x.get_length() + for x in self.texturemaps: + templength = templength + x.get_length() + for x in self.ua3s: + templength = templength + x.get_length() + for x in self.ua4s: + templength = templength + x.get_length() + for x in self.ua5s: + templength = templength + x.get_length() + for x in self.ua6s: + templength = templength + x.get_length() + for x in self.ua7s: + templength = templength + x.get_length() + for x in self.ua8s: + templength = templength + x.get_length() + for x in self.ua9s: + templength = templength + x.get_length() + for x in self.uaas: + templength = templength + x.get_length() + for x in self.uabs: + templength = templength + x.get_length() + return templength + def write_to_file(self, file): + file.write(struct.pack('>20s', self.name)) + self.forecolor.write_to_file(file) + self.backcolor.write_to_file(file) + self.unknowncolor.write_to_file(file) + self.tevcolor.write_to_file(file) + file.write(struct.pack('>I', self.flags)) + for x in range(bit_extract(self.flags, 28, 31)): + self.texrefs[x].write_to_file(file) + for x in range(bit_extract(self.flags, 24, 27)): + self.texturemaps[x].write_to_file(file) + for x in range(bit_extract(self.flags, 20, 23)): + self.ua3s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 6)): + self.ua4s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 4)): + self.ua5s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 19)): + self.ua6s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 17, 18)): + self.ua7s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 14, 16)): + self.ua8s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 9, 13)): + self.ua9s[x].write_to_file(file) + for x in range(bit_extract(self.flags, 8)): + self.uaas[x].write_to_file(file) + for x in range(bit_extract(self.flags, 7)): + self.uabs[x].write_to_file(file) + return + +class BRLYT_Pane: + def __init__(self): + self.orientation1 = 0x01 + self.orientation2 = 0x04 + self.alpha1 = 0xff + self.alpha2 = 0x00 + self.name = "RootPane" + self.x = 0.0 + self.y = 0.0 + self.z = 0.0 + self.flipx = 0.0 + self.flipy = 0.0 + self.angle = 0.0 + self.xmag = 1.0 + self.ymag = 1.0 + self.width = 608.0 + self.height = 456.0 + def eat_pane(self, file, offset): + self.orientation1, self.orientation2, self.alpha1, self.alpha2 = struct.unpack('BBBB', file[offset:offset+4]) + self.name, self.x, self.y, self.z = struct.unpack('>24sfff', file[offset+0x04:offset+0x04+36]) + self.flipx, self.flipy, self.angle = struct.unpack('>fff', file[offset+0x28:offset+0x28+12]) + self.xmag, self.ymag = struct.unpack('>ff', file[offset+0x34:offset+0x34+8]) + self.width, self.height = struct.unpack('>ff', file[offset+0x3C:offset+0x3C+8]) + return + def show_pane(self): + print "Orientation: %02x %02x" % (self.orientation1 , self.orientation2) + print "Alpha: %02x %02x" % (self.alpha1 , self.alpha2) + print "Name: %s" % self.name.rstrip('\x00') + print "X: %f" % self.x + print "y: %f" % self.y + print "z: %f" % self.z + print "flip x: %f" % self.flipx + print "flip y: %f" % self.flipy + print "angle: %f" % self.angle + print "x zoom: %f" % self.xmag + print "y zoom: %f" % self.ymag + print "width: %f" % self.width + print "height: %f" % self.height + return + def get_length(self): + templength = 1 + 1 + 1 + 1 + 24 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.orientation1)) + file.write(struct.pack('>B', self.orientation2)) + file.write(struct.pack('>B', self.alpha1)) + file.write(struct.pack('>B', self.alpha2)) + file.write(struct.pack('>24s', self.name)) + file.write(struct.pack('>f', self.x)) + file.write(struct.pack('>f', self.y)) + file.write(struct.pack('>f', self.z)) + file.write(struct.pack('>f', self.flipx)) + file.write(struct.pack('>f', self.flipy)) + file.write(struct.pack('>f', self.angle)) + file.write(struct.pack('>f', self.xmag)) + file.write(struct.pack('>f', self.ymag)) + file.write(struct.pack('>f', self.width)) + file.write(struct.pack('>f', self.height)) + return + +class BRLYT_gre1: + def __init__(self): + self.magic = "gre1" + self.length = 0x08 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + return + def get_length(self): + self.length = 4 + 4 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + return + +class BRLYT_grs1: + def __init__(self): + self.magic = "grs1" + self.length = 0x08 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + return + def get_length(self): + self.length = 4 + 4 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + return + +class BRLYT_grp1: + def __init__(self): + self.magic = "grp1" + self.length = 0x00000000 + self.name = "RootGroup" + self.numsubs = 0x0000 + self.unknown = 0x0000 + self.subs = [] + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.name, self.numsubs, self.unknown = struct.unpack('>16sHH', file[offset+0x08:offset+0x08+20]) + for x in range(self.numsubs): + dummy, subname = struct.unpack('>I16s', file[offset+0x1C+16*x-4:offset+0x1C+16*x+16]) + self.subs.append(subname) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + print "Name: %s" % self.name.rstrip('\x00') + print "Number of Subs: %04x" % self.numsubs + print "Unknown: %04x" % self.unknown + for x in self.subs: + print "Sub: %s" % x.rstrip('\x00') + return + def get_length(self): + self.length = 4 + 4 + 16 + 2 + 2 + self.numsubs * 16 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + file.write(struct.pack('>16s', self.name)) + file.write(struct.pack('>H', self.numsubs)) + file.write(struct.pack('>H', self.unknown)) + for x in self.subs: + file.write(struct.pack('>16s', x)) + return + +class BRLYT_txt1: + def __init__(self): + self.magic = "txt1" + self.pane = BRLYT_Pane() + len1 = 0x0000 + len2 = 0x0000 + mat_off = 0x0000 + font = 0x0000 + unknown = 0x00 + padding1 = 0 + padding2 = 0 + padding3 = 0 + name_offs = 0x00000000 + color1 = 0xFFFFFFFF + color2 = 0x00000000 + font_size_x = 32.0 + font_size_y = 32.0 + char_space = 32.0 + line_space = 32.0 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.pane.eat_pane(file, offset+8) + self.len1, self.len2, self.mat_off, self.font = struct.unpack('>HHHH', file[offset+0x08:offset+0x08+8]) + self.unknown, self.padding1, self.padding2, self.padding3 = struct.unpack('>BBBB', file[offset+0x10:offset+0x10+4]) + self.name_offs, self.color1, self.color2 = struct.unpack('>III', file[offset+0x14:offset+0x14+12]) + self.font_size_x, self.font_size_y = struct.unpack('>ff', file[offset+0x20:offset+0x20+8]) + self.char_space, self.line_space = struct.unpack('>ff', file[offset+0x28:offset+0x28+8]) + text = file[offset+0x30:offset+0x30+self.len2] + self.text = unicode(text, 'utf_16_be').rstrip('\x00') + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.pane.show_pane() + print "Length: %04x %04x" % ( self.len1 , self.len2 ) + print "Material: %04x" % self.mat_off + print "Font: %04x" % self.font + print "Unknown: %02x" % self.unknown + print "Padding: %02x %02x %02x" % ( self.padding1 , self.padding2 , self.padding3 ) + print "Name offset: %08x" % self.name_offs + print "Color1: %08x" % self.color1 + print "Color2: %08x" % self.color2 + print "Font Size X: %f" % self.font_size_x + print "Font Size Y: %f" % self.font_size_y + print "Character Spacing: %f" % self.char_space + print "Line Spacing: %f" % self.line_space + #print "Text: ", self.text # N E E D S S O M E W O R K + return + def get_text_length(self): + return len(self.text) + def get_length(self): + templength = 4 + 4 + self.pane.get_length() + templength = templength + 2 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + templength = templength + 4 + 4 + 4 + 4 + 4 + 4 + 4 + templength = templength + self.get_text_length() + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.pane.write_to_file(file) + file.write(struct.pack('>H', self.len1)) + file.write(struct.pack('>H', self.len2)) + file.write(struct.pack('>H', self.mat_off)) + file.write(struct.pack('>H', self.font)) + file.write(struct.pack('>B', self.unknown)) + file.write(struct.pack('>B', self.padding1)) + file.write(struct.pack('>B', self.padding2)) + file.write(struct.pack('>B', self.padding3)) + file.write(struct.pack('>I', self.name_offs)) + file.write(struct.pack('>I', self.color1)) + file.write(struct.pack('>I', self.color2)) + file.write(struct.pack('>f', self.font_size_x)) + file.write(struct.pack('>f', self.font_size_y)) + file.write(struct.pack('>f', self.char_space)) + file.write(struct.pack('>f', self.line_space)) + file.write(self.text) + return + +class BRLYT_pic1: + def __init__(self): + self.magic = "pic1" + self.length = 0x0000000 + self.pane = BRLYT_Pane() + self.vtx_color1 = 0xFFFFFFFF + self.vtx_color2 = 0xFFFFFFFF + self.vtx_color3 = 0xFFFFFFFF + self.vtx_color4 = 0xFFFFFFFF + self.mat_off = 0x0000 + self.num_coordinates = 0x01 + self.padding = 0x00 + self.coordinates = { } + self.coordinates[0] = BRLYT_Coordinates() + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.pane.eat_pane(file, offset+8) + self.vtx_color1, self.vtx_color2, self.vtx_color3, self.vtx_color4 = struct.unpack('>IIII', file[offset+0x4C:offset+0x4C+16]) + self.mat_off, self.num_coordinates, self.padding = struct.unpack('>HBB', file[offset+0x5C:offset+0x5C+4]) + for x in range(self.num_coordinates): + self.coordinates[x] = BRLYT_Coordinates() + self.coordinates[x].eat_coordinates(file, offset+0x60+x*32) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.pane.show_pane() + print "Vertex Colors: %08x %08x %08x %08x" % (self.vtx_color1, self.vtx_color2, self.vtx_color3, self.vtx_color4) + print "Material Offset: %04x" % self.mat_off + print "Number of Coordinates: %02x" % self.num_coordinates + print "Padding: %02x" % self.padding + for x in range(len(self.coordinates)): + self.coordinates[x].show_coordinates() + return + def get_length(self): + templength = 4 + 4 + self.pane.get_length() + templength = templength + 4 + 4 + 4 + 2 + 1 + 1 + for x in range(len(self.coordinates)): + templength = templength + self.coordinates[x].get_length() + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.pane.write_to_file(file) + file.write(struct.pack('>I', self.vtx_color1)) + file.write(struct.pack('>I', self.vtx_color2)) + file.write(struct.pack('>I', self.vtx_color3)) + file.write(struct.pack('>I', self.vtx_color4)) + file.write(struct.pack('>H', self.mat_off)) + file.write(struct.pack('>B', self.num_coordinates)) + file.write(struct.pack('>B', self.padding)) + for x in range(len(self.coordinates)): + self.coordinates[x].write_to_file(file) + return + +class BRLYT_WindowAddon3: + def __init__(self): + self.unknown1 = 0x0000 + self.unknown2 = 0x0000 + def eat_windowaddon3(self, file, offset): + self.unknown1, self.unknown2 = struct.unpack('>HH', file[offset:offset+4]) + return + def show_windowaddon3(self): + print "Unknown: %04x %04x" % ( self.unknown1 , self.unknown2 ) + return + def get_length(self): + templength = 2 + 2 + return templength + def write_to_file(self, file): + file.write(struct.pack('>H', self.unknown1)) + file.write(struct.pack('>H', self.unknown2)) + return + +class BRLYT_WindowAddon2: + def __init__(self): + self.unknown1 = 0x00000000 + self.unknown2 = 0x00000000 + self.unknown3 = 0x00000000 + self.unknown4 = 0x00000000 + def eat_windowaddon2(self, file, offset): + self.unknown1, self.unknown2, self.unknown3, self.unknown4 = struct.unpack('>IIII', file[offset:offset+16]) + return + def show_windowaddon2(self): + print "Unknown: %08x %08x %08x %08x" % ( self.unknown1, self.unknown2, self.unknown3, self.unknown4 ) + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>I', self.unknown1)) + file.write(struct.pack('>I', self.unknown2)) + file.write(struct.pack('>I', self.unknown3)) + file.write(struct.pack('>I', self.unknown4)) + return + +class BRLYT_WindowAddon1: + def __init__(self): + self.unknown1 = 0.0 + self.unknown2 = 0.0 + self.unknown3 = 0.0 + self.unknown4 = 0.0 + self.count = 0x01 + self.padding1 = 0x00 + self.padding2 = 0x00 + self.padding3 = 0x00 + self.offset1 = 0x00000068 + self.offset2 = 0x0000007C + def eat_windowaddon1(self, file, offset): + self.unknown1, self.unknown2, self.unknown3, self.unknown4 = struct.unpack('>ffff', file[offset:offset+16]) + self.count, self.padding1, self.padding2, self.padding3 = struct.unpack('>BBBB', file[offset+0x10:offset+0x10+4]) + self.offset1, self.offset2 = struct.unpack('>II', file[offset+0x14:offset+0x14+8]) + return + def show_windowaddon1(self): + print "Unknown: %f %f %f %f" % ( self.unknown1, self.unknown2, self.unknown3, self.unknown4 ) + print "Count: %02x" % self.count + print "Padding %02x %02x %02x" % ( self.padding1, self.padding2, self.padding3 ) + print "Offset 1: %08x" % self.offset1 + print "Offset 2: %08x" % self.offset2 + return + def get_length(self): + templength = 4 + 4 + 4 + 4 + 1 + 1 + 1 + 1 + 4 + 4 + return templength + def write_to_file(self, file): + file.write(struct.pack('>B', self.count)) + file.write(struct.pack('>B', self.padding1)) + file.write(struct.pack('>B', self.padding2)) + file.write(struct.pack('>B', self.padding3)) + file.write(struct.pack('>I', self.offset1)) + file.write(struct.pack('>I', self.offset2)) + return + +class BRLYT_wnd1: + def __init__(self): + self.magic = "wnd1" + self.pane = BRLYT_Pane() + self.addon1 = BRLYT_WindowAddon1() + self.addon2 = BRLYT_WindowAddon2() + self.addon3 = BRLYT_WindowAddon3() + self.offsets = [] + self.materials = [] + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.pane.eat_pane(file, offset+8) + self.addon1.eat_windowaddon1(file, offset+0x4c) + self.addon2.eat_windowaddon2(file, offset+0x4c+28) + self.addon3.eat_windowaddon3(file, offset+0x4c+44) + if self.addon1.offset1 == 0x9c: + self.addon4 = BRLYT_Coordinates() + self.addon4.eat_coordinates(file, offset+0x4c+48) + for x in range(self.addon1.count): + dummy, offs = struct.unpack('>II', file[offset+0x4c+48+32-4:offset+0x4c+48+32+4]) + self.offsets.append(offs) + for x in range(self.addon1.count): + dummy, mat = struct.unpack('>II', file[offset+0x4c+48+32+self.addon1.count*4-4:offset+0x4c+48+32+self.addon1.count*4+4]) + self.materials.append(mat) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.pane.show_pane() + self.addon1.show_windowaddon1() + self.addon2.show_windowaddon2() + self.addon3.show_windowaddon3() + if self.addon1.offset1 == 0x9c: + self.addon4.show_coordinates() + for x in range(self.addon1.count): + print "Offset: %08x" % self.offsets[x] + print "Material: %08x" % self.materials[x] + return + def get_length(self): + templength = 4 + 4 + self.addon1.get_length() + self.addon2.get_length() + self.addon3.get_length() + if self.addon1.offset1 == 0x9c: + templength = templength + self.addon4.get_length() + templength = templength + self.addon1.count * 8 + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.pane.write_to_file(file) + self.addon1.write_to_file(file) + self.addon2.write_to_file(file) + self.addon3.write_to_file(file) + if self.addon1.offset1 == 0x9c: + self.addon4.write_to_file(file) + tempOffset = self.addon1.count * 4 + for x in range(self.addon1.count): + file.write(struct.pack('>I', tempOffset)) + self.offsets[x] = tempOffset + for x in self.materials: + file.write(struct.pack('>I', x)) + return + +class BRLYT_bnd1: + def __init__(self): + self.magic = "bnd1" + self.pane = BRLYT_Pane() + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.pane.eat_pane(file, offset+8) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.pane.show_pane() + return + def get_length(self): + self.length = 4 + 4 + self.pane.get_length() + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.pane.write_to_file(file) + return + +class BRLYT_pae1: + def __init__(self): + self.magic = "pae1" + self.length = 0x08 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + return + def get_length(self): + self.length = 4 + 4 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + return + +class BRLYT_pas1: + def __init__(self): + self.magic = "pas1" + self.length = 0x08 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + return + def get_length(self): + self.length = 4 + 4 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + return + +class BRLYT_pan1: + def __init__(self): + self.magic = "pan1" + self.pane = BRLYT_Pane() + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.pane.eat_pane(file, offset+8) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.pane.show_pane() + return + def get_length(self): + self.length = 4 + 4 + self.pane.get_length() + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.pane.write_to_file(file) + return + +class BRLYT_mat1: + def __init__(self): + self.magic = "mat1" + self.numoffs = BRLYT_Numoffs() + self.offsets = [] + self.materials = { } + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.numoffs.eat_numoffs(file, offset+8) + for x in range(self.numoffs.number): + dummy, offs = struct.unpack('>II', file[offset+0x0C+4*x-4:offset+0x0C+4*x+4]) + self.offsets.append(offs) + self.materials[x] = BRLYT_Material() + self.materials[x].eat_material(file, offset+self.offsets[x]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.numoffs.show_numoffs() + for x in range(self.numoffs.number): + print "Offsets[%d]: %08x" % ( x , self.offsets[x] ) + self.materials[x].show_material() + return + def add_material(self): + self.materials[self.numoffs.number] = BRLYT_Material() + self.numoffs.add() + def get_length(self): + templength = 4 + 4 + 4 + self.numoffs.number * 4 + for x in range(self.numoffs.number): + templength = templength + self.materials[x].get_length() + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.numoffs.write_to_file(file) + tempOffset = self.numoffs.number * 4 + for x in range(self.numoffs.number): + file.write(struct.pack('>I', tempOffset)) + #self.offsets[x] = tempOffset + tempOffset = tempOffset + self.materials[x].get_length() + for x in range(len(self.materials)): + self.materials[x].write_to_file(file) + return + +class BRLYT_fnl1: + def __init__(self): + self.magic = "fnl1" + self.numoffs = BRLYT_Numoffs() + self.offsets = [] + self.fonts = [] + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.numoffs.eat_numoffs(file, offset+8) + for x in range(self.numoffs.number): + ''' Grab font name ''' + offs, unknown = struct.unpack('>II', file[offset+8+4+x*8:offset+8+4+x*8+8]) + self.offsets.append(offs) + font = nullterm(file[offset+12+self.offsets[x]:]) + self.fonts.append(font) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.numoffs.show_numoffs() + for x in range(len(self.fonts)): + print "Font: %s offset: %08x" % ( self.fonts[x] , self.offsets[x] ) + return + def add_font(self, font): + self.fonts.append(font) + self.numoffs.add() + if len(self.fonts) > 1: + self.offsets.append(self.offsets[-1] + len(self.textures[-2]) + 1) + else: + self.offsets.appen(4) + return + def get_length(self): + templength = 4 + 4 + 4 + self.numoffs.number * 8 + for x in self.fonts: + templength = templength + len(x) + 1 + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.numoffs.write_to_file(file) + tempOffset = self.numoffs.number * 4 + for x in range(len(self.offsets)): + file.write(struct.pack('>I', tempOffset)) + self.offsets[x] = tempOffset + tempOffset = tempOffset + len(self.fonts[x]) + 1 + for x in self.fonts: + file.write(x) + file.write(struct.pack('>B', '\x00')) + return + +class BRLYT_txl1: + def __init__(self): + self.magic = "txl1" + self.numoffs = BRLYT_Numoffs() + self.offsets = [] + self.textures = [] + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.numoffs.eat_numoffs(file, offset+8) + for x in range(self.numoffs.number): + ''' Grab texture name ''' + offs, unknown = struct.unpack('>II', file[offset+8+4+x*8:offset+8+4+x*8+8]) + self.offsets.append(offs) + texture = nullterm(file[offset+12+self.offsets[x]:]) + self.textures.append(texture) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + self.numoffs.show_numoffs() + for x in range(len(self.textures)): + print "Texture: %s offset: %08x" % ( self.textures[x] , self.offsets[x] ) + return + def add_texture(self, texture): + self.textures.append(texture) + self.numoffs.add() + if len(self.textures) > 1: + self.offsets.append(self.offsets[-1] + len(self.textures[-2]) + 1) + else: + self.offsets.append(4) + return + def get_length(self): + templength = 4 + 4 + 4 + self.numoffs.number * 8 + for x in self.textures: + templength = templength + len(x) + 1 + self.length = templength + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + self.numoffs.write_to_file(file) + tempOffset = self.numoffs.number * 4 + for x in range(len(self.offsets)): + file.write(struct.pack('>I', tempOffset)) + self.offsets[x] = tempOffset + tempOffset = tempOffset + len(self.textures[x]) + 1 + for x in self.textures: + file.write(x) + file.write(struct.pack('s', "\0")) + return + +class BRLYT_lyt1: + def __init__(self): + self.magic = "lyt1" + self.length = 0x14 + self.a = 1 + self.pad1 = 0 + self.pad2 = 0 + self.pad3 = 0 + self.width = 608.0 + self.height = 456.0 + def eat_tag(self, file, offset): + self.magic, self.length = struct.unpack('>4sI', file[offset:offset+8]) + self.a, self.pad1, self.pad2, self.pad3 = struct.unpack('>4B', file[offset+0x08:offset+0x08+4]) + self.width, self.height = struct.unpack('>ff', file[offset+0x0C:offset+0x0C+8]) + return + def show_tag(self): + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + print "a: %02x" % self.a + print "width: %f" % self.width + print "height: %f" % self.height + return + def get_length(self): + self.length = 4 + 4 + 1 + 1 + 1 + 1 + 4 + 4 + return self.length + def write_to_file(self, file): + file.write(self.magic) + file.write(struct.pack('>I', self.length)) + file.write(struct.pack('>B', self.a)) + file.write(struct.pack('>B', self.pad1)) + file.write(struct.pack('>B', self.pad2)) + file.write(struct.pack('>B', self.pad3)) + file.write(struct.pack('>f', self.width)) + file.write(struct.pack('>f', self.width)) + return + +class BRLYT_Header: + def __init__(self): + self.data = [] + def eat_header(self, buffer, offset): + self.magic, self.length = struct.unpack('>4sI', buffer[offset:offset+8]) + return + def show_header(self, offset): + print "Offset: %08x" % offset + print "Magic: %s" % self.magic + print "Length: %08x" % self.length + return + +class BRLYT: + def __init__(self): + self.tags_filled = 0 + self.data = [] + self.magic = "RLYT" + self.version = 0xfeff0101 + self.offset = 0x10 + self.chunks = 0x0000 + self.tags = { } + def grab_brlyt(self, file): + for x in file: + self.data.append(x) + return + def eat_brlyt(self, file): + file_offset = 0 + self.magic, self.version = struct.unpack('>4sI', file[0x00:0x08]) + self.length, self.offset, self.count = struct.unpack('>IHH', file[0x08:0x10]) + file_offset = 0x10 + tempHeader = BRLYT_Header() + for x in range(self.count): + tempHeader.eat_header(file, file_offset) + ''' DO BIG CASE IF FOR TYPE ''' + if tempHeader.magic == "lyt1": + self.tags[x] = BRLYT_lyt1() + elif tempHeader.magic == "txl1": + self.tags[x] = BRLYT_txl1() + elif tempHeader.magic == "fnl1": + self.tags[x] = BRLYT_fnl1() + elif tempHeader.magic == "mat1": + self.tags[x] = BRLYT_mat1() + elif tempHeader.magic == "pan1": + self.tags[x] = BRLYT_pan1() + elif tempHeader.magic == "pas1": + self.tags[x] = BRLYT_pas1() + elif tempHeader.magic == "pae1": + self.tags[x] = BRLYT_pae1() + elif tempHeader.magic == "wnd1": + self.tags[x] = BRLYT_wnd1() + elif tempHeader.magic == "bnd1": + self.tags[x] = BRLYT_bnd1() + elif tempHeader.magic == "pic1": + self.tags[x] = BRLYT_pic1() + elif tempHeader.magic == "txt1": + self.tags[x] = BRLYT_txt1() + elif tempHeader.magic == "grp1": + self.tags[x] = BRLYT_grp1() + elif tempHeader.magic == "grs1": + self.tags[x] = BRLYT_grs1() + elif tempHeader.magic == "gre1": + self.tags[x] = BRLYT_gre1() + else: + print "BAD TAG" + break + self.tags[x].eat_tag(file, file_offset) + file_offset = file_offset + self.tags[x].length + self.tags_filled = self.chunks + return + def add_material(self, material, texture): + for x in range(self.tags_filled): + if isinstance(self.tags[x], BRLYT_mat1): + self.tags[x].add_material() + def add_grp1(self): + self.tags[self.tags_filled] = BRLYT_grp1() + self.tags_filled = self.tags_filled + 1 + def add_txt1(self): + self.tags[self.tags_filled] = BRLYT_txt1() + self.tags_filled = self.tags_filled + 1 + def add_pic1(self): + self.tags[self.tags_filled] = BRLYT_pic1() + self.tags_filled = self.tags_filled + 1 + def add_pae1(self): + self.tags[self.tags_filled] = BRLYT_pae1() + self.tags_filled = self.tags_filled + 1 + def add_pas1(self): + self.tags[self.tags_filled] = BRLYT_pas1() + self.tags_filled = self.tags_filled + 1 + def add_pan1(self): + self.tags[self.tags_filled] = BRLYT_pan1() + self.tags_filled = self.tags_filled + 1 + def add_mat1(self): + self.tags[self.tags_filled] = BRLYT_mat1() + self.tags_filled = self.tags_filled + 1 + def add_txl1(self): + self.tags[self.tags_filled] = BRLYT_txl1() + self.tags_filled = self.tags_filled + 1 + return + def add_lyt1(self): + self.tags[self.tags_filled] = BRLYT_lyt1() + self.tags_filled = self.tags_filled + 1 + return + def add_texture(self, texture): + self.tags[1].add_texture(texture) + return + def add_font(self, font): + self.tags[2].add_font(font) + return + def write_brlyt(self, filename): + templength = 4 + 4 + 4 + 2 + 2 + for x in range(self.tags_filled): + templength = self.tags[x].get_length() + self.length = templength + file = open(filename, 'wb') + if file: + file.write(self.magic) + file.write(struct.pack('>I', self.version)) + file.write(struct.pack('>I', self.length)) + file.write(struct.pack('>H', self.offset)) + file.write(struct.pack('>H', self.chunks)) + for x in range(len(self.tags)): + self.tags[x].write_to_file(file) + file.close() + else: + print "could not open file for write" + return + def show_brlyt(self): + print "Magic: %s" % self.magic + print "Version: %08x" % self.version + print "File size: %08x" % self.length + print "Header size: %04x" % self.offset + print "Chunk count: %04x" % self.count + for x in range(len(self.tags)): + self.tags[x].show_tag() + print + return + +if len(sys.argv) != 2: + print 'Usage: python parse_brlyt.py ' + sys.exit(1) + +f = open(sys.argv[1], 'rb') +if f: + rlyt = f.read() + f.close() +else: + print "could not open file" + +brlyt = BRLYT() +brlyt.eat_brlyt(rlyt) +brlyt.show_brlyt() + +#brlyt.write_brlyt("testout.brlyt") + +brlyt2 = BRLYT() +brlyt2.add_lyt1() +brlyt2.add_txl1() +brlyt2.add_texture("texture1.tpl") +brlyt2.add_mat1() +brlyt2.add_material("material1", "texture1.tpl") +brlyt2.add_pan1() +brlyt2.add_pas1() +brlyt2.add_pic1() +brlyt2.add_pae1() +brlyt2.add_grp1() +brlyt2.write_brlyt("testout.brlyt") +