def MAT1(self, data): pos = 8 matCount = Struct.uint16(data[pos:pos+2], endian='>') pos += 4 for i in xrange(matCount): nameOff = Struct.uint32(data[pos:pos+4], endian='>') pos += 4 name = data[nameOff:].split('\0', 1)[0] wii.chexdump(data[nameOff:nameOff+0x60]) texid = Struct.uint16(data[nameOff + 0x40:nameOff + 0x42], endian='>') wrap_s = Struct.uint8(data[nameOff + 0x42:nameOff + 0x43], endian='>') wrap_t = Struct.uint8(data[nameOff + 0x43:nameOff + 0x44], endian='>') texid2 = Struct.uint16(data[nameOff + 0x44:nameOff + 0x46], endian='>') colorA = [Struct.uint16(data[nameOff + 0x1c + x:nameOff + 0x20 + x], endian='>')/255.0 for x in range(0,8,2)] colorB = [Struct.uint16(data[nameOff + 0x22 + x:nameOff + 0x24 + x], endian='>')/255.0 for x in range(0,8,2)] flags = Struct.uint32(data[nameOff + 0x3c:nameOff + 0x40], endian='>') #numtex = 1 # Hardcoded for her pleasure #(flags>>8) & 0xf #guess numtex = bit_extract(flags, 28, 31) if numtex == 1: img = self.Textures[texid] tex = img[1].create_texture(Texture) #print 'Material 0x%02x (%s) maps to texture %s' % (i, name, img[0]) elif numtex == 2: img = self.Textures[texid] alpha = self.Textures[texid2] combo = self.ApplyMask(img[1],alpha[1]) tex = combo.create_texture(Texture) #print 'Material 0x%02x (%s) maps to texture %s and mask %s' % (i, name, img[0], alpha[0]) else: print "Bad num textures: %d"%numtex self.Materials.append((name, tex, (colorA,colorB)))
def Unpack(self, data): pos = 0 header = self.BrlytHeader() header.unpack(data[:len(header)]) pos += len(header) assert header.Magic == 'RLYT' for i in xrange(header.AtomCount): atom = self.BrlytAtom() atom.unpack(data[pos:pos + len(atom)]) atomdata = data[pos:pos + atom.Size] if atom.FourCC == 'txl1': self.TXL1(atomdata) elif atom.FourCC == 'mat1': self.MAT1(atomdata) elif atom.FourCC == 'pan1': self.PAN1(atomdata) elif atom.FourCC == 'pas1': self.PAS1(atomdata) elif atom.FourCC == 'pae1': self.PAE1(atomdata) elif atom.FourCC == 'pic1': self.PIC1(atomdata) elif atom.FourCC == "grp1": self.GRP1(atomdata) else: print "Unknown FOURCC:", atom.FourCC wii.chexdump(atomdata) pos += atom.Size
def Unpack(self, data): pos = 0 header = self.BrlytHeader() header.unpack(data[:len(header)]) pos += len(header) assert header.Magic == 'RLYT' for i in xrange(header.AtomCount): atom = self.BrlytAtom() atom.unpack(data[pos:pos+len(atom)]) atomdata = data[pos:pos+atom.Size] if atom.FourCC == 'txl1': self.TXL1(atomdata) elif atom.FourCC == 'mat1': self.MAT1(atomdata) elif atom.FourCC == 'pan1': self.PAN1(atomdata) elif atom.FourCC == 'pas1': self.PAS1(atomdata) elif atom.FourCC == 'pae1': self.PAE1(atomdata) elif atom.FourCC == 'pic1': self.PIC1(atomdata) elif atom.FourCC == "grp1": self.GRP1(atomdata) else: print "Unknown FOURCC:",atom.FourCC wii.chexdump(atomdata) pos += atom.Size
def PAN1(self, data): wii.chexdump(data) name = data[0xC:].split('\0', 1)[0] x = Struct.float(data[0x24:0x28], endian='>') y = Struct.float(data[0x28:0x2C], endian='>') a = Struct.float(data[0x3C:0x40], endian='>') b = Struct.float(data[0x40:0x44], endian='>') xs = Struct.float(data[0x44:0x48], endian='>') ys = Struct.float(data[0x48:0x4C], endian='>') coords = [x, y, xs, ys] #print 'Pane %s:' % name, coords+[a,b] self.CurPane = Pane(name, coords)
def PAN1(self, data): wii.chexdump(data) name = data[0xC:].split("\0", 1)[0] x = Struct.float(data[0x24:0x28], endian=">") y = Struct.float(data[0x28:0x2C], endian=">") a = Struct.float(data[0x3C:0x40], endian=">") b = Struct.float(data[0x40:0x44], endian=">") xs = Struct.float(data[0x44:0x48], endian=">") ys = Struct.float(data[0x48:0x4C], endian=">") coords = [x, y, xs, ys] print "Pane %s:" % name, coords + [a, b] self.CurPane = Pane(name, coords)
def PAN1(self, data): wii.chexdump(data) name = data[0xC:].split('\0', 1)[0] x = Struct.float(data[0x24:0x28], endian='>') y = Struct.float(data[0x28:0x2C], endian='>') a = Struct.float(data[0x3C:0x40], endian='>') b = Struct.float(data[0x40:0x44], endian='>') xs = Struct.float(data[0x44:0x48], endian='>') ys = Struct.float(data[0x48:0x4C], endian='>') coords = [x, y, xs, ys] print 'Pane %s:' % name, coords + [a, b] self.CurPane = Pane(name, coords)
def PIC1(self, data): wii.chexdump(data) name = data[0xC:].split('\0', 1)[0] mat = Struct.uint16(data[0x5C:0x5E], endian='>') mat = self.Materials[mat] xs = Struct.float(data[0x44:0x48], endian='>') ys = Struct.float(data[0x48:0x4C], endian='>') x = Struct.float(data[0x24:0x28], endian='>') y = Struct.float(data[0x28:0x2C], endian='>') #print 'Picture %s maps to material %s' % (name, mat[0]) #print '\t%fx%f (%f, %f)' % (xs, ys, x, y) p=Picture(name, mat, [x, y, xs, ys]) self.PanePath[-1].Add(p) self.Objects[name] = p
def PIC1(self, data): wii.chexdump(data) name = data[0xC:].split('\0', 1)[0] mat = Struct.uint16(data[0x5C:0x5E], endian='>') mat = self.Materials[mat] xs = Struct.float(data[0x44:0x48], endian='>') ys = Struct.float(data[0x48:0x4C], endian='>') x = Struct.float(data[0x24:0x28], endian='>') y = Struct.float(data[0x28:0x2C], endian='>') print 'Picture %s maps to material %s' % (name, mat[0]) print '\t%fx%f (%f, %f)' % (xs, ys, x, y) p = Picture(name, mat, [x, y, xs, ys]) self.PanePath[-1].Add(p) self.Objects[name] = p
def GRP1(self, data): wii.chexdump(data) if len(data) < 0x1c: pass lang = data[0x8:0x18].split('\0', 1)[0] nitems = Struct.uint16(data[0x18:0x1a], endian='>') p = 0x1c items = [] for i in xrange(nitems): items.append(data[p:].split('\0', 1)[0]) p += 0x10 for i in items: if lang != self.Language: self.Objects[i].Enabled = False else: self.Objects[i].Enabled = True
def MAT1(self, data): pos = 8 matCount = Struct.uint16(data[pos:pos + 2], endian='>') pos += 4 for i in xrange(matCount): nameOff = Struct.uint32(data[pos:pos + 4], endian='>') pos += 4 name = data[nameOff:].split('\0', 1)[0] wii.chexdump(data[nameOff:nameOff + 0x60]) texid = Struct.uint16(data[nameOff + 0x40:nameOff + 0x42], endian='>') wrap_s = Struct.uint8(data[nameOff + 0x42:nameOff + 0x43], endian='>') wrap_t = Struct.uint8(data[nameOff + 0x43:nameOff + 0x44], endian='>') texid2 = Struct.uint16(data[nameOff + 0x44:nameOff + 0x46], endian='>') colorA = [ Struct.uint16(data[nameOff + 0x1c + x:nameOff + 0x20 + x], endian='>') / 255.0 for x in range(0, 8, 2) ] colorB = [ Struct.uint16(data[nameOff + 0x22 + x:nameOff + 0x24 + x], endian='>') / 255.0 for x in range(0, 8, 2) ] flags = Struct.uint32(data[nameOff + 0x3c:nameOff + 0x40], endian='>') #numtex = 1 # Hardcoded for her pleasure #(flags>>8) & 0xf #guess numtex = bit_extract(flags, 28, 31) if numtex == 1: img = self.Textures[texid] tex = img[1].create_texture(Texture) #print 'Material 0x%02x (%s) maps to texture %s' % (i, name, img[0]) elif numtex == 2: img = self.Textures[texid] alpha = self.Textures[texid2] combo = self.ApplyMask(img[1], alpha[1]) tex = combo.create_texture(Texture) #print 'Material 0x%02x (%s) maps to texture %s and mask %s' % (i, name, img[0], alpha[0]) else: print "Bad num textures: %d" % numtex self.Materials.append((name, tex, (colorA, colorB)))
wad = wii.WiiWad(sys.argv[1]) print("Going to import boot2 version", wad.tmd.title_version) tmd = wad.tmd.data tik = wad.tik.data wad.showinfo() tikcerts = getcerts(wad.tik, wad.certs) tmdcerts = getcerts(wad.tmd, wad.certs) content = wad.getcontent(0, encrypted=True) content += b"\x00" * 0 content2 = wad.getcontent(0) wii.chexdump(wad.tmd.get_content_records()[0].sha) wii.chexdump(hashlib.sha1(content2)) print("Waiting for IPC to start up...") ipc = SkyeyeIPC() ipc.init() print("IPC ready") fd = ipc.IOSOpen("/dev/es") print("ES fd: %d" % fd) if fd < 0: print("Error opening ES") sys.exit(1) res = ipc.IOSIoctlv(fd, 0x1f, "dddddd", tik, tikcerts, tmd, tmdcerts, None, content)
wad = wii.WiiWad(sys.argv[1]) print "Going to import boot2 version", wad.tmd.title_version tmd = wad.tmd.data tik = wad.tik.data wad.showinfo() tikcerts = getcerts(wad.tik, wad.certs) tmdcerts = getcerts(wad.tmd, wad.certs) content = wad.getcontent(0, encrypted=True) content += "\x00" * 0 content2 = wad.getcontent(0) wii.chexdump(wad.tmd.get_content_records()[0].sha) wii.chexdump(sha.new(content2).digest()) print "Waiting for IPC to start up..." ipc = SkyeyeIPC() ipc.init() print "IPC ready" fd = ipc.IOSOpen("/dev/es") print "ES fd: %d" % fd if fd < 0: print "Error opening ES" sys.exit(1) res = ipc.IOSIoctlv(fd, 0x1f, "dddddd", tik, tikcerts, tmd, tmdcerts, None, content)