Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
 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]);
 }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
Archivo: GFX.cs Proyecto: biosp4rk/mzmr
        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;
        }
Ejemplo n.º 7
0
        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.");
        }