public void Write() { if (compressed) { // compress data byte[] uncompData = Arrays.UshortToByte(data); byte[] compData = Compress.CompLZ77(uncompData); int newLen = compData.Length; // write new data if (newLen <= origLen) { int offset = rom.ReadPtr(pointer); rom.ArrayToRom(compData, 0, offset, newLen); } else { int offset = rom.WriteToEnd(compData); rom.WritePtr(pointer, offset); } origLen = newLen; } else { byte[] bytes = Arrays.UshortToByte(data); int offset = rom.ReadPtr(pointer); rom.ArrayToRom(bytes, 0, offset, bytes.Length); } }
private void WriteVersion() { // add underscore character Patch.Apply(rom, Resources.ZM_U_underscore); // format config string string temp = "Settings: " + settings.GetString(); int lineWidth = 0; string config = ""; foreach (char c in temp) { int charWidth = Text.GetCharWidth(rom, c); if (lineWidth + charWidth < 220) { lineWidth += charWidth; } else { config += '\n'; lineWidth = charWidth; } config += c; } // MZM Randomizer v1.4.0 // Seed: <seed> // Settings: <settings> string text = $"MZM Randomizer v{Program.Version}\n" + $"Seed: {seed}\n{config}\n"; byte[] values = Text.BytesFromText(text); rom.ArrayToRom(values, 0, Rom.IntroTextOffset, values.Length); }
public void Write(byte tsNum) { if (tsNum == number) { // replace // write palette palette.Write(); // write tile table tilemap.Write(); // write animTileset byte atsNum = rom.Read8(addr + 0x10); int atsOffset = rom.AnimTilesetOffset + atsNum * 0x30; rom.ArrayToRom(animTileset, 0, atsOffset, 0x30); } else { // copy int newAddr = rom.TilesetOffset + tsNum * 0x14; // copy levelGfx pointer int levelGfxOffset = rom.ReadPtr(addr); rom.WritePtr(newAddr, levelGfxOffset); // write palette palette.WriteCopy(newAddr + 4); // copy BG3gfx pointer int BG3gfxOffset = rom.ReadPtr(addr + 8); rom.WritePtr(newAddr + 8, BG3gfxOffset); // write tile table tilemap.WriteCopy(newAddr + 0xC); // write animTileset int diff = tsNum - Rom.NumOfTilesets; byte atsNum = (byte)(Rom.NumOfAnimTilesets + diff); int atsOffset = rom.AnimTilesetOffset + atsNum * 0x30; rom.ArrayToRom(animTileset, 0, atsOffset, 0x30); rom.Write8(newAddr + 0x10, atsNum); // copy animPalette number byte apNum = rom.Read8(addr + 0x11); rom.Write8(newAddr + 0x11, apNum); } }
public void ArrayToRomTest() { byte[] test = new byte[] { 0x12, 0x34, 0xAB, 0xCD }; rom.ArrayToRom(test, 0, TestAddr, 4); byte[] data = rom.Data; Assert.AreEqual(0x12, data[TestAddr]); Assert.AreEqual(0x34, data[TestAddr + 1]); Assert.AreEqual(0xAB, data[TestAddr + 2]); Assert.AreEqual(0xCD, data[TestAddr + 3]); }
public void Write() { int newLen = data.Length * 2; byte[] toWrite = Arrays.UshortToByte(data); if (newLen <= origLen) { rom.ArrayToRom(toWrite, 0, address, toWrite.Length); } else { address = rom.WriteToEnd(toWrite); rom.WritePtr(pointer.Value, address); } origLen = newLen; }
public void Write() { // compress data byte[] compData = Compress.CompLZ77(Data); int newLen = compData.Length; // write new data if (newLen <= origLen) { int offset = rom.ReadPtr(pointer); rom.ArrayToRom(compData, 0, offset, newLen); } else { int offset = rom.WriteToEnd(compData); rom.WritePtr(pointer, offset); } origLen = newLen; }
public static void Apply(Rom rom, byte[] data) { // check sig int patchLen = data.Length; if (patchLen < 8 || data[0] != 'P' || data[1] != 'A' || data[2] != 'T' || data[3] != 'C' || data[4] != 'H') { throw new Exception("Not a valid IPS file."); } // records int offset = 5; while (offset + 2 < patchLen) { int writeOffset = (data[offset] << 16) | (data[offset + 1] << 8) | data[offset + 2]; if (writeOffset == 0x454F46) { // EOF return; } offset += 3; if (offset + 1 >= patchLen) { throw new Exception("Abrupt end to IPS file, entry cut off before size."); } int size = (data[offset] << 8) | data[offset + 1]; offset += 2; if (size == 0) { // RLE if (offset + 1 >= patchLen) { throw new Exception("Abrupt end to IPS file, entry cut off before RLE size."); } int rleSize = (data[offset] << 8) | data[offset + 1]; if (writeOffset + rleSize > rom.Size) { throw new Exception("Trying to patch data past the end of the ROM file."); } offset += 2; if (offset >= patchLen) { throw new Exception("Abrupt end to IPS file, entry cut off before RLE byte."); } byte rleByte = data[offset++]; for (int i = writeOffset; i < writeOffset + rleSize; i++) { rom.Write8(i, rleByte); } } else { if (offset + size > patchLen) { throw new Exception("Abrupt end to IPS file, entry cut off before end of data block."); } if (writeOffset + size > rom.Size) { throw new Exception("Trying to patch data past the end of the ROM file"); } rom.ArrayToRom(data, offset, writeOffset, size); offset += size; } } throw new Exception("Improperly terminated IPS file."); }