Пример #1
0
	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)))
Пример #2
0
    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
Пример #3
0
	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
Пример #4
0
	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)
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
	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
Пример #8
0
    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
Пример #9
0
	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
Пример #10
0
 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
Пример #11
0
    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)))
Пример #12
0

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)
Пример #13
0

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)