public static void DumpLevel(Rom rom, int course, int warp, Bitmap tiles8x8, Bitmap tiles16x16, bool reloadAll, bool switchA, bool switchB, int paletteIndex) { rom.SetBank(0xC); int header = rom.ReadWord(0x4560 + course * 2); int tilebank = rom.ReadByte(header + 0); int tileaddressB = rom.ReadWord(header + 1); int tileaddressA = rom.ReadWord(header + 3); int tileanimated = rom.ReadWord(header + 7); int blockbank = rom.ReadByte(header + 9); int blockubbank = rom.ReadByte(header + 10); int blockindex = rom.ReadWord(header + 11); byte palette = rom.ReadByte(header + 27); //load warp if(warp != -1) { tilebank = rom.ReadByte(warp + 11); tileaddressB = rom.ReadWord(warp + 12); tileaddressA = rom.ReadWord(warp + 14); tileanimated = rom.ReadWord(warp + 18); blockindex = rom.ReadWord(warp + 20); palette = rom.ReadByte(warp + 10); } //set palette paletteColors = palettes[paletteIndex]; //dump 8x8 blocks using(Graphics g = Graphics.FromImage(tiles8x8)) { g.Clear(paletteColors[0]); rom.SetBank(0x11); Dump8x8Tiles(rom, tileaddressA, tiles8x8, 2*16, 0, palette); rom.SetBank(tilebank); Dump8x8Tiles(rom, tileaddressB, tiles8x8, 6*16, 2, palette); rom.SetBank(0x11); Dump8x8Tiles(rom, tileanimated, tiles8x8, 4, 2, palette); } //dump 16x16 blocks using(Graphics g = Graphics.FromImage(tiles16x16)) { g.Clear(paletteColors[0]); rom.SetBank(0xB); Dump16x16Tiles(rom, blockindex, tiles8x8, g, switchA, switchB); } if(reloadAll) { //dump level rom.SetBank(blockbank); int tilesdata = rom.ReadWord(0x4000 + blockubbank * 2); levelData = RLEDecompressTiles(rom, tilesdata).Take(0x3000).ToArray(); //dump scroll rom.SetBank(0xC); scrollData = rom.ReadBytes(0x4000 + course * 32, 32); //dump objects rom.SetBank(0x7); int objectsPosition = rom.ReadWord(0x4199 + course * 2); objectsData = RLEDecompressObjects(rom, objectsPosition).Take(0x2000).ToArray(); //dump warps rom.SetBank(0xC); warps = new Byte[32]; for(int i = 0 ; i < 32 ; i++) { int warpdata = rom.ReadWord(0x4F30 + course * 64 + i * 2); warps[i] = rom.ReadByte(warpdata); } warioPosition = rom.ReadWordSwap(header + 15) + rom.ReadWordSwap(header + 13) * 8192; } }
public static void DumpLevel(Rom rom, int course, int warp, bool reloadAll, int switchMode, int paletteIndex, int animatedTileIndex, bool reloadAnimatedTilesOnly) { int tilebank; int tileaddressB; int tileaddressA; int tileanimated; int blockindex; byte palette; int enemiesData; rom.SetBank(0xC); int header = rom.ReadWord(0x4560 + course * 2); if (warp != -1) { //load warp tilebank = rom.ReadByte(warp + 11); tileaddressB = rom.ReadWord(warp + 12); tileaddressA = rom.ReadWord(warp + 14); tileanimated = rom.ReadWord(warp + 18); blockindex = rom.ReadWord(warp + 20); animatedTilesMask = rom.ReadByte(warp + 9); palette = rom.ReadByte(warp + 10); enemiesData = rom.ReadWord(warp + 22); } else { //or header tilebank = rom.ReadByte(header + 0); tileaddressB = rom.ReadWord(header + 1); tileaddressA = rom.ReadWord(header + 3); tileanimated = rom.ReadWord(header + 7); blockindex = rom.ReadWord(header + 11); animatedTilesMask = rom.ReadByte(header + 26); palette = rom.ReadByte(header + 27); enemiesData = rom.ReadWord(header + 28); } Color[] paletteColors = palettes[paletteIndex]; if (!reloadAnimatedTilesOnly) { int enemiesIdsPointer, enemiesTiles; FindEnemiesData(rom, enemiesData, out enemiesIdsPointer, out enemiesTiles); DumpEnemiesSprites(rom, enemiesIdsPointer, enemiesTiles); //dump 8x8 tiles Array.Clear(tiles8x8.Bits, 0, tiles8x8.Width * tiles8x8.Height); rom.SetBank(0x11); Dump8x8Tiles(rom, tileaddressA, 2 * 16, 0 * 16, palette, paletteColors); rom.SetBank(tilebank); Dump8x8Tiles(rom, tileaddressB, 6 * 16, 2 * 16, palette, paletteColors); } if (animatedTilesMask != 0) { rom.SetBank(0x11); Dump8x8Tiles(rom, tileanimated + animatedTileIndex * 16 * 4, 4, 2 * 16, palette, paletteColors); } //dump 16x16 tiles if (reloadAnimatedTilesOnly) { DumpAnimated16x16Tiles(paletteColors[0]); } else { rom.SetBank(0xB); Dump16x16Tiles(rom, blockindex, switchMode, paletteColors[0], out animated16x16Tiles, out animated8x8Tiles); } if (reloadAll) { //dump 16x16 blocks rom.SetBank(0xC); int blockbank = rom.ReadByte(header + 9); int blockubbank = rom.ReadByte(header + 10); rom.SetBank(blockbank); int tilesdata = rom.ReadWord(0x4000 + blockubbank * 2); levelData = RLEDecompressTiles(rom, tilesdata); //dump scroll rom.SetBank(0xC); scrollData = rom.ReadBytes(0x4000 + course * 32, 32); //dump objects rom.SetBank(0x7); int objectsPosition = rom.ReadWord(0x4199 + course * 2); objectsData = RLEDecompressObjects(rom, objectsPosition); //dump warps rom.SetBank(0xC); warps = new Byte[32]; for (int i = 0; i < 32; i++) { int warpdata = rom.ReadWord(0x4F30 + course * 64 + i * 2); warps[i] = rom.ReadByte(warpdata); } warioPosition = rom.ReadWordSwap(header + 15) + rom.ReadWordSwap(header + 13) * 8192; warioRightFacing = (rom.ReadByte(header + 18) & 0x20) == 0; } }