def readFromRom(self, rom): self._bbgTbl.readFromRom(rom) pct = 50.0/(6+self._bbgTbl.height()) self._bbgGfxPtrTbl.readFromRom(rom, EbModule.toRegAddr(EbModule.readAsmPointer(rom, self._ASMPTRS_GFX[0]))) updateProgress(pct) self._bbgArrPtrTbl.readFromRom(rom, EbModule.toRegAddr(EbModule.readAsmPointer(rom, self._ASMPTRS_ARR[0]))) updateProgress(pct) self._bbgPalPtrTbl.readFromRom(rom, EbModule.toRegAddr(EbModule.readAsmPointer(rom, self._ASMPTRS_PAL[0]))) updateProgress(pct) self._bbgGfxArrs = [ None for i in range(self._bbgGfxPtrTbl.height()) ] self._bbgPals = [ None for i in range(self._bbgPalPtrTbl.height()) ] updateProgress(pct) self._bbgScrollTbl.readFromRom(rom) updateProgress(pct) self._bbgDistorTbl.readFromRom(rom) updateProgress(pct) for i in range(self._bbgTbl.height()): gfxNum = self._bbgTbl[i,0].val() colorDepth = self._bbgTbl[i,2].val() if (self._bbgGfxArrs[gfxNum] == None): # Max size used in rom: 421 (2bpp) 442 (4bpp) tg = EbTileGraphics(512, 8, colorDepth) with EbCompressedData() as tgb: tgb.readFromRom(rom, EbModule.toRegAddr( self._bbgGfxPtrTbl[gfxNum,0].val())) tg.readFromBlock(tgb) a = EbArrangement(32, 32) with EbCompressedData() as ab: ab.readFromRom(rom, EbModule.toRegAddr( self._bbgArrPtrTbl[gfxNum,0].val())) a.readFromBlock(ab) self._bbgGfxArrs[gfxNum] = (tg, a) palNum = self._bbgTbl[i,1].val() if (self._bbgPals[palNum] == None): with DataBlock(32) as pb: pb.readFromRom(rom, EbModule.toRegAddr(self._bbgPalPtrTbl[palNum,0].val())) p = EbPalettes(1, 16) p.readFromBlock(pb) self._bbgPals[palNum] = p updateProgress(pct)
def __init__(self): self._fonts = [ Font(0x210cda, 0x210c7a, 16, 16), Font(0x2013b9, 0x201359, 16, 16), Font(0x2122fa, 0x21229a, 16, 16), Font(0x21193a, 0x2118da, 8, 16), Font(0x211f9a, 0x211f3a, 8, 8) ] self._cfont = EbTileGraphics(192, 8, 2) self._cpal = EbPalettes(2, 4) self._pct = 50.0/(len(self._fonts)+1)
def readFromRom(self, rom): self._bsPtrTbl.readFromRom(rom, EbModule.toRegAddr(EbModule.readAsmPointer(rom, self._ASMPTR_GFX))) self._bsPalsTable.readFromRom(rom, EbModule.toRegAddr(EbModule.readAsmPointer(rom, self._ASMPTR_PAL))) pct = 45.0/(self._bsPtrTbl.height() + self._bsPalsTable.height() + 1) self._enemyCfgTable.readFromRom(rom) updateProgress(pct) # Read the palettes for i in range(self._bsPalsTable.height()): pal = EbPalettes(1,16) pal.set(0, self._bsPalsTable[i,0].val()) self._bsPals.append(pal) updateProgress(pct) # Read the sprites for i in range(self._bsPtrTbl.height()): with EbCompressedData() as bsb: bsb.readFromRom(rom, EbModule.toRegAddr(self._bsPtrTbl[i,0].val())) bs = EbBattleSprite() bs.readFromBlock(bsb, self._bsPtrTbl[i,1].val()) self._bsprites.append(bs) updateProgress(pct) # Read the group data self._enemyGroupTbl.readFromRom(rom) self._enemyGroupBgTbl.readFromRom(rom) self._enemyGroups = [ ] pct = 5.0/self._enemyGroupTbl.height() for i in range(self._enemyGroupTbl.height()): group = [ ] ptr = EbModule.toRegAddr(self._enemyGroupTbl[i,0].val()) while(rom[ptr] != 0xff): group.append((rom.readMulti(ptr+1,2), rom[ptr])) ptr += 3 self._enemyGroups.append(group) updateProgress(pct)
class FontModule(EbModule.EbModule): _name = "Fonts" _CREDITS_PREVIEW_SUBPALS = [ 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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 ] _ASMPTR_CREDITS_GFX = 0x4f1a7 _ADDR_CREDITS_PAL = 0x21e914 def __init__(self): self._fonts = [ Font(0x210cda, 0x210c7a, 16, 16), Font(0x2013b9, 0x201359, 16, 16), Font(0x2122fa, 0x21229a, 16, 16), Font(0x21193a, 0x2118da, 8, 16), Font(0x211f9a, 0x211f3a, 8, 8) ] self._cfont = EbTileGraphics(192, 8, 2) self._cpal = EbPalettes(2, 4) self._pct = 50.0/(len(self._fonts)+1) def freeRanges(self): return [(0x21e528, 0x21e913)] # Credits font graphics def readCreditsFontFromRom(self, rom): self._cpal.readFromBlock(rom, loc=self._ADDR_CREDITS_PAL) with EbCompressedData() as cb: cb.readFromRom(rom, EbModule.toRegAddr( EbModule.readAsmPointer( rom, self._ASMPTR_CREDITS_GFX))) self._cfont.readFromBlock(cb) def readFromRom(self, rom): for f in self._fonts: f.readFromRom(rom) updateProgress(self._pct) self.readCreditsFontFromRom(rom) updateProgress(self._pct) def writeToRom(self, rom): for f in self._fonts: f.writeToRom(rom) updateProgress(self._pct) self._cpal.writeToBlock(rom, loc=self._ADDR_CREDITS_PAL) with EbCompressedData(self._cfont.sizeBlock()) as cb: self._cfont.writeToBlock(cb) EbModule.writeAsmPointer(rom, self._ASMPTR_CREDITS_GFX, EbModule.toSnesAddr(cb.writeToFree(rom))) updateProgress(self._pct) def writeCreditsFontToProject(self, resourceOpener): arr = EbArrangement(16, 12) for i in range(192): arr[i%16, i/16] = (False, False, False, self._CREDITS_PREVIEW_SUBPALS[i], i) img = arr.toImage(self._cfont, self._cpal) with resourceOpener("Fonts/credits", "png") as imgFile: img.save(imgFile, "png") imgFile.close() def writeToProject(self, resourceOpener): out = dict() i=0 for font in self._fonts: # Write the PNG img = font.toImage() with resourceOpener("Fonts/" + str(i), 'png') as imgFile: img.save(imgFile, 'png') # Write the widths out = font.dumpWidths() with resourceOpener("Fonts/" + str(i) + "_widths", "yml") as f: yaml.dump(out, f, default_flow_style=False, Dumper=yaml.CSafeDumper) i += 1 updateProgress(self._pct) self.writeCreditsFontToProject(resourceOpener) updateProgress(self._pct) def readFromProject(self, resourceOpener): i = 0 for font in self._fonts: with resourceOpener("Fonts/" + str(i), "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("Fonts/" + str(i) + " is not an indexed PNG.") font.fromImage(img) with resourceOpener("Fonts/" + str(i) + "_widths", "yml") as f: input = yaml.load(f, Loader=yaml.CSafeLoader) font.loadWidths(input) i += 1 updateProgress(self._pct) with resourceOpener("Fonts/credits", "png") as imgFile: img = Image.open(imgFile) if img.mode != 'P': raise RuntimeError("Fonts/credits is not an indexed PNG.") self._cfont.loadFromImage(img) self._cpal.loadFromImage(img) updateProgress(self._pct) def upgradeProject(self, oldVersion, newVersion, rom, resourceOpenerR, resourceOpenerW): if oldVersion == newVersion: updateProgress(100) return elif oldVersion <= 2: self.readCreditsFontFromRom(rom) self.writeCreditsFontToProject(resourceOpenerW) self.upgradeProject(3, newVersion, rom, resourceOpenerR, resourceOpenerW) else: self.upgradeProject(oldVersion+1, newVersion, rom, resourceOpenerR, resourceOpenerW)