class WindowGraphicsModule(EbModule.EbModule): _name = "Window Graphics" _ASMPTR_1 = 0x47c47 _ASMPTR_2 = 0x47caa _ASMPTRS_NAMES = [0x1F70F, 0x1F72A, 0x1F745, 0x1F760, 0x1F77B] _PREVIEW_SUBPALS = [0, 0, 0, 0, 1, 1, 1, 4, 4, 4, 4, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 1, 0, 0 ] def __init__(self): self._gfx1 = EbTileGraphics(416, 8, 2) self._gfx2 = EbTileGraphics(7, 8, 2) self._flavPals = [EbPalettes(8,4) for i in range(7)] self._flavNames = [(i,TextTableEntry(None, 25)) for i in self._ASMPTRS_NAMES] def freeRanges(self): return [(0x200000, 0x20079f)] # Graphics def readFromRom(self, rom): with EbCompressedData() as tgb1: tgb1.readFromRom(rom, EbModule.toRegAddr( EbModule.readAsmPointer(rom, self._ASMPTR_1))) self._gfx1.readFromBlock(tgb1) updateProgress(20) with EbCompressedData() as tgb2: tgb2.readFromRom(rom, EbModule.toRegAddr( EbModule.readAsmPointer(rom, self._ASMPTR_2))) self._gfx2.readFromBlock(tgb2) updateProgress(20) # Read palettes loc = 0x201fc8 for pal in self._flavPals: pal.readFromBlock(rom, loc=loc) loc += 64 updateProgress(5) # Read names for ptr, field in self._flavNames: field.readFromRom(rom, EbModule.toRegAddr( EbModule.readAsmPointer(rom, ptr))) updateProgress(5) def writeToRom(self, rom): with EbCompressedData(self._gfx1.sizeBlock()) as gb: self._gfx1.writeToBlock(gb) EbModule.writeAsmPointer(rom, self._ASMPTR_1, EbModule.toSnesAddr(gb.writeToFree(rom))) updateProgress(20) with EbCompressedData(self._gfx2.sizeBlock()) as gb: self._gfx2.writeToBlock(gb) EbModule.writeAsmPointer(rom, self._ASMPTR_2, EbModule.toSnesAddr(gb.writeToFree(rom))) updateProgress(20) # Write pals loc = 0x201fc8 for pal in self._flavPals: pal.writeToBlock(rom, loc=loc) loc += 64 updateProgress(5) # Write names for ptr, field in self._flavNames: loc = EbModule.toSnesAddr(field.writeToFree(rom)) EbModule.writeAsmPointer(rom, ptr, loc) updateProgress(5) def writeToProject(self, resourceOpener): arr1 = EbArrangement(16, 26) for i in range(416): arr1[i%16,i/16] = (False, False, False, self._PREVIEW_SUBPALS[i], i) i = 0 for pal in self._flavPals: with resourceOpener("WindowGraphics/Windows1_" + str(i), "png") as imgFile: img1 = arr1.toImage(self._gfx1, pal) img1.save(imgFile, "png") with resourceOpener("WindowGraphics/Windows2_" + str(i), "png") as imgFile: img2 = self._gfx2.dumpToImage(pal.getSubpal(7), width=7) img2.save(imgFile, "png") i += 1 updateProgress(40) # Write names with resourceOpener("WindowGraphics/flavor_names", "txt") as f: for ptr, field in self._flavNames: print >>f, field.dump() updateProgress(10) def readFromProject(self, resourceOpener): # Read graphics. Just use the first of each image. with resourceOpener("WindowGraphics/Windows1_0", "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("WindowGraphics/Windows1_0 is not an indexed PNG.") self._gfx1.loadFromImage(img) updateProgress(20) with resourceOpener("WindowGraphics/Windows2_0", "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("WindowGraphics/Windows2_0 is not an indexed PNG.") self._gfx2.loadFromImage(img) updateProgress(20) # Read pals from Windows1 of each flavor. # Read subpal 7 from Windows2 of each flavor. i = 0 for pal in self._flavPals: # Read all the palette data from Windows1 with resourceOpener("WindowGraphics/Windows1_" + str(i), "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("WindowGraphics/Windows1_" + str(i) + " is not an indexed PNG.") palData = img.getpalette() m=0 for j in range(8): for k in range(4): pal[j,k] = (palData[m], palData[m+1], palData[m+2]) m += 3 # Overwrite subpalette 7 from the palette of Windows2 with resourceOpener("WindowGraphics/Windows2_" + str(i), "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("WindowGraphics/Windows2_" + str(i) + " is not an indexed PNG.") palData = img.getpalette() m=0 for k in range(4): pal[7,k] = (palData[m], palData[m+1], palData[m+2]) m += 3 i += 1 updateProgress(5) # Read names with resourceOpener("WindowGraphics/flavor_names", "txt") as f: for ptr, field in self._flavNames: field.load(f.readline()[:-1]) updateProgress(5)