mirror of
https://github.com/grp/Wii.py.git
synced 2025-06-19 07:15:49 -04:00
fixed bmg.py and added writing
This commit is contained in:
parent
88264d5c99
commit
cf033fc35a
@ -11,6 +11,13 @@ def nullterm(str_plus):
|
|||||||
else:
|
else:
|
||||||
return str_plus
|
return str_plus
|
||||||
|
|
||||||
|
def denullterm(str_plus):
|
||||||
|
z = str_plus.find('\r\n')
|
||||||
|
if z != -1:
|
||||||
|
return str_plus[:z]
|
||||||
|
else:
|
||||||
|
return str_plus
|
||||||
|
|
||||||
class BMG(object):
|
class BMG(object):
|
||||||
class BMG_DAT1(Struct):
|
class BMG_DAT1(Struct):
|
||||||
__endian__ = Struct.BE
|
__endian__ = Struct.BE
|
||||||
@ -21,6 +28,10 @@ class BMG(object):
|
|||||||
return_string = "Magic: %s\n" % self.magic
|
return_string = "Magic: %s\n" % self.magic
|
||||||
return_string += "Length: %08x\n " % self.length
|
return_string += "Length: %08x\n " % self.length
|
||||||
return return_string
|
return return_string
|
||||||
|
def write(self, file):
|
||||||
|
file.write(self.magic)
|
||||||
|
file.write(struct.pack('>I', self.length))
|
||||||
|
return
|
||||||
|
|
||||||
class BMG_INF1(Struct):
|
class BMG_INF1(Struct):
|
||||||
__endian__ = Struct.BE
|
__endian__ = Struct.BE
|
||||||
@ -35,6 +46,12 @@ class BMG(object):
|
|||||||
return_string += "Count: %04x\n" % self.count
|
return_string += "Count: %04x\n" % self.count
|
||||||
return_string += "Unknown: %04x\n" % self.unknown01
|
return_string += "Unknown: %04x\n" % self.unknown01
|
||||||
return return_string
|
return return_string
|
||||||
|
def write(self, file):
|
||||||
|
file.write(self.magic)
|
||||||
|
file.write(struct.pack('>I', self.length))
|
||||||
|
file.write(struct.pack('>H', self.count))
|
||||||
|
file.write(struct.pack('>H', self.unknown01))
|
||||||
|
return
|
||||||
|
|
||||||
class BMG_Header(Struct):
|
class BMG_Header(Struct):
|
||||||
__endian__ = Struct.BE
|
__endian__ = Struct.BE
|
||||||
@ -61,122 +78,180 @@ class BMG(object):
|
|||||||
return_string += "Unknown05: %08x\n" % self.unknown05
|
return_string += "Unknown05: %08x\n" % self.unknown05
|
||||||
return_string += "Unknown06: %08x\n" % self.unknown06
|
return_string += "Unknown06: %08x\n" % self.unknown06
|
||||||
return return_string
|
return return_string
|
||||||
|
def write(self, file):
|
||||||
|
file.write(self.magic)
|
||||||
|
file.write(self.magic2)
|
||||||
|
file.write(struct.pack('>I', self.length))
|
||||||
|
file.write(struct.pack('>I', self.chunk_cnt))
|
||||||
|
file.write(struct.pack('>B', self.unknown01))
|
||||||
|
file.write(struct.pack('>B', self.unknown02))
|
||||||
|
file.write(struct.pack('>H', self.unknown03))
|
||||||
|
file.write(struct.pack('>I', self.unknown04))
|
||||||
|
file.write(struct.pack('>I', self.unknown05))
|
||||||
|
file.write(struct.pack('>I', self.unknown06))
|
||||||
|
return
|
||||||
|
|
||||||
def __init__(self, data):
|
def __init__(self, data=None, out_file=None, debug=False):
|
||||||
self.data = []
|
self.data = []
|
||||||
if data != None:
|
if data != None:
|
||||||
self.Unpack(data)
|
self.Unpack(data, out_file, debug)
|
||||||
|
|
||||||
def Unpack(self, data):
|
def Unpack(self, data, out_file, debug):
|
||||||
pos = 0
|
file = open(out_file, 'wb')
|
||||||
header = self.BMG_Header()
|
if file:
|
||||||
header.unpack(data[pos:pos+len(header)])
|
pos = 0
|
||||||
pos += len(header)
|
header = self.BMG_Header()
|
||||||
print header
|
header.unpack(data[pos:pos+len(header)])
|
||||||
|
pos += len(header)
|
||||||
|
if debug == True:
|
||||||
|
print header
|
||||||
|
print "\n%08x\n" % pos
|
||||||
|
|
||||||
print "\n%08x\n" % pos
|
info = self.BMG_INF1()
|
||||||
|
info.unpack(data[pos:pos+len(info)])
|
||||||
|
pos += len(info)
|
||||||
|
if debug == True:
|
||||||
|
print info
|
||||||
|
|
||||||
info = self.BMG_INF1()
|
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
||||||
info.unpack(data[pos:pos+len(info)])
|
|
||||||
pos += len(info)
|
|
||||||
print info
|
|
||||||
|
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
|
||||||
pos += 4
|
|
||||||
print "Unknown: %08x" % unknown
|
|
||||||
|
|
||||||
print "\n%08x\n" % pos
|
|
||||||
|
|
||||||
offset_list = []
|
|
||||||
for x in xrange(info.count):
|
|
||||||
offset = Struct.uint32(data[pos:pos+4], endian='>')
|
|
||||||
pos += 4
|
|
||||||
print "Offset: %08x" % offset
|
|
||||||
offset_list.append(offset)
|
|
||||||
|
|
||||||
while pos % 0x10:
|
|
||||||
padding = Struct.uint32(data[pos:pos+4], endian='>')
|
|
||||||
pos += 4
|
pos += 4
|
||||||
print "Padding: %08x" % padding
|
if debug == True:
|
||||||
|
print "Unknown: %08x" % unknown
|
||||||
|
print "\n%08x\n" % pos
|
||||||
|
|
||||||
print "\n%08x\n" % pos
|
offset_list = []
|
||||||
|
for x in xrange(info.count):
|
||||||
|
offset = Struct.uint32(data[pos:pos+4], endian='>')
|
||||||
|
pos += 4
|
||||||
|
if debug == True:
|
||||||
|
print "Offset: %08x" % offset
|
||||||
|
offset_list.append(offset)
|
||||||
|
|
||||||
dat1 = self.BMG_DAT1()
|
while pos % 0x10:
|
||||||
dat1.unpack(data[pos:pos+len(dat1)])
|
padding = Struct.uint32(data[pos:pos+4], endian='>')
|
||||||
pos += len(dat1)
|
pos += 4
|
||||||
print dat1
|
if debug == True:
|
||||||
|
print "Padding: %08x" % padding
|
||||||
|
|
||||||
print "\n%08x\n" % pos
|
if debug == True:
|
||||||
temp = pos
|
print "\n%08x\n" % pos
|
||||||
|
|
||||||
unknown = Struct.uint16(data[pos:pos+2], endian='>')
|
dat1 = self.BMG_DAT1()
|
||||||
pos += 2
|
dat1.unpack(data[pos:pos+len(dat1)])
|
||||||
print "Unknown: %04x" % unknown
|
pos += len(dat1)
|
||||||
|
if debug == True:
|
||||||
|
print dat1
|
||||||
|
|
||||||
for x in xrange(info.count):
|
if debug == True:
|
||||||
pos = temp + offset_list[x]
|
print "\n%08x\n" % pos
|
||||||
string = nullterm(data[pos:])
|
temp = pos
|
||||||
string = unicode(string, 'utf_16_be')
|
|
||||||
print "String: %s" % string
|
|
||||||
|
|
||||||
#''' TEST DATA
|
unknown = Struct.uint16(data[pos:pos+2], endian='>')
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
pos += 2
|
||||||
pos += 4
|
if debug == True:
|
||||||
print "Unknown: %08x" % unknown
|
print "Unknown: %04x" % unknown
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
|
||||||
pos += 4
|
for x in xrange(info.count):
|
||||||
print "Unknown: %08x" % unknown
|
pos = temp + offset_list[x]
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
string = nullterm(data[pos:])
|
||||||
pos += 4
|
string = unicode(string, 'utf_16_be')
|
||||||
print "Unknown: %08x" % unknown
|
file.write(string.encode('utf-8'))
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
file.write('\r')
|
||||||
pos += 4
|
file.write('\n')
|
||||||
print "Unknown: %08x" % unknown
|
if debug == True:
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
print "String: %s" % string.encode('utf-8')
|
||||||
pos += 4
|
file.close()
|
||||||
print "Unknown: %08x" % unknown
|
else:
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
print "Could not open file for writing"
|
||||||
pos += 4
|
sys.exit(1)
|
||||||
print "Unknown: %08x" % unknown
|
def write(self, data, out_file):
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
file = open(out_file, 'wb')
|
||||||
pos += 4
|
if file:
|
||||||
print "Unknown: %08x" % unknown
|
pos = 0
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
count = 0
|
||||||
pos += 4
|
strings_list = []
|
||||||
print "Unknown: %08x" % unknown
|
while pos < len(data):
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
temp = denullterm(data[pos:])
|
||||||
pos += 4
|
pos += len(temp) + 2
|
||||||
print "Unknown: %08x" % unknown
|
string = unicode(temp, 'utf-8')
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
strings_list.append(string)
|
||||||
pos += 4
|
count += 1
|
||||||
print "Unknown: %08x" % unknown
|
offsets_list = []
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
offset = 2
|
||||||
pos += 4
|
for x in xrange(count):
|
||||||
print "Unknown: %08x" % unknown
|
offsets_list.append(offset)
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
offset += len(strings_list[x]) * 2 + 2
|
||||||
pos += 4
|
dat1 = self.BMG_DAT1()
|
||||||
print "Unknown: %08x" % unknown
|
dat1.length = offset + 8 + (0x10 - (offset % 0x10))
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
dat_pad_to_add = 0x10 - (offset % 0x10)
|
||||||
pos += 4
|
info = self.BMG_INF1()
|
||||||
print "Unknown: %08x" % unknown
|
info.length = 0x10 + 4 * count + (0x10 - ((4 * count) % 0x10))
|
||||||
unknown = Struct.uint32(data[pos:pos+4], endian='>')
|
info_pad_to_add = 0x10 - ((4*count) % 0x10)
|
||||||
pos += 4
|
header = self.BMG_Header()
|
||||||
print "Unknown: %08x" % unknown
|
header.magic = "MESG"
|
||||||
#END TEST DATA '''
|
header.magic2 = "bmg1"
|
||||||
|
header.length = info.length + dat1.length + 0x20
|
||||||
|
header.chunk_cnt = 2
|
||||||
|
header.unknown01 = 2
|
||||||
|
header.unknown02 = 0
|
||||||
|
header.unknown03 = 0
|
||||||
|
header.unknown04 = 0
|
||||||
|
header.unknown05 = 0
|
||||||
|
header.unknown06 = 0
|
||||||
|
header.write(file)
|
||||||
|
info.magic = "INF1"
|
||||||
|
info.count = count
|
||||||
|
info.unknown01 = 4
|
||||||
|
info.write(file)
|
||||||
|
unknown = 0
|
||||||
|
file.write(struct.pack('>I', unknown))
|
||||||
|
offset_list = []
|
||||||
|
for x in offsets_list:
|
||||||
|
file.write(struct.pack('>I', x))
|
||||||
|
padding = 0
|
||||||
|
for x in xrange(info_pad_to_add):
|
||||||
|
file.write(struct.pack('>B', padding))
|
||||||
|
dat1.magic = "DAT1"
|
||||||
|
dat1.write(file)
|
||||||
|
unknown = 0
|
||||||
|
file.write(struct.pack('>H', unknown))
|
||||||
|
for x in strings_list:
|
||||||
|
file.write(x.encode('utf_16_be'))
|
||||||
|
file.write('\x00\x00')
|
||||||
|
file.write("\n")
|
||||||
|
padding = 0
|
||||||
|
for x in xrange(dat_pad_to_add):
|
||||||
|
file.write(struct.pack('>B', padding))
|
||||||
|
file.close()
|
||||||
|
else:
|
||||||
|
print "Could not open file for writing"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) == 1:
|
if len(sys.argv) == 1:
|
||||||
print 'Usage: python bmg.py'
|
print 'Usage: python bmg.py -r <filename.bmg> <filename.hog>'
|
||||||
|
print ' == OR == '
|
||||||
|
print 'Usage: python bmg.py -w> <filename.hog> <filename.bmg'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
f = open(sys.argv[1], 'rb')
|
if sys.argv[1] == "-r":
|
||||||
if f:
|
f = open(sys.argv[2], 'rb')
|
||||||
bmg_buffer = f.read()
|
if f:
|
||||||
f.close()
|
bmg_buffer = f.read()
|
||||||
else:
|
f.close()
|
||||||
print 'Could not open file for reading'
|
else:
|
||||||
sys.exit(1)
|
print 'Could not open file for reading'
|
||||||
|
sys.exit(1)
|
||||||
bmg = BMG(bmg_buffer)
|
bmg = BMG(bmg_buffer, sys.argv[3], debug=False)
|
||||||
|
elif sys.argv[1] == "-w":
|
||||||
|
f = open(sys.argv[2], 'rb')
|
||||||
|
if f:
|
||||||
|
bmg_buffer = f.read()
|
||||||
|
f.close()
|
||||||
|
else:
|
||||||
|
print "Could not open file for reading"
|
||||||
|
sys.exit(1)
|
||||||
|
bmg = BMG()
|
||||||
|
bmg.write(bmg_buffer, sys.argv[3])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user