Beispiel #1
0
        private void compressScreen(byte[] data, int screen, out byte[] pix, out byte[] code)
        {
            int dOfs = screen * xlen;
            int eOfs = dOfs + xlen;

            int[] lens = new int[2];
            lens[0] = 1;
            code    = new byte[0];
            pix     = new byte[0];
            while (dOfs < eOfs)
            {
                getLens(data, dOfs + lens[0], eOfs, ref lens[0], out lens[1]);
                int cps = code.Length;
                Array.Resize <byte>(ref code, code.Length + (lens[0] > 255?3:1) + (lens[1] > 255?3:1));
                for (int i = 0; i < 2; i++)
                {
                    if (lens[i] > 255 || lens[i] == 0)
                    {
                        code[cps++] = 0;
                        UInt16 sz = (UInt16)lens[i];
                        BinaryHelper.write_LE(code, cps, sz);
                        cps += 2;
                    }
                    else
                    {
                        code[cps++] = (byte)(lens[i] & 0xFF);
                    }
                }
                int pps = pix.Length;
                Array.Resize <byte>(ref pix, pix.Length + lens[0]);
                Array.Copy(data, dOfs, pix, pps, lens[0]);
                dOfs   += lens [0] + lens [1];
                lens[0] = 0;
            }
        }
Beispiel #2
0
 public void save(byte[] data, int ofs)
 {
     BinaryHelper.write_LE(data, ofs, id);
     data[ofs + 2] = unused;
     data[ofs + 3] = sizeEx;
     BinaryHelper.write_LE(data, ofs + 4, size);
     BinaryHelper.write_LE(data, ofs + 6, offset);
 }
Beispiel #3
0
        public byte[] runVGA(byte[] data)
        {
            preparexbuf(data);
            byte al = data[0];

            xr.Add(al);
            int c = 1;

            while (c < data.Length)
            {
                bool rep = data[c] == al;
                if (rep)
                {
                    for (int i = 1; i < MIN_REP; i++)
                    {
                        if (c + i >= data.Length || data[c + i] != al)
                        {
                            rep = false;
                        }
                    }
                }
                if (rep)
                {
                    int cnt = 0;
                    while (c < data.Length && data[c] == al && cnt < 255)
                    {
                        c++;
                        cnt++;
                    }
                    repeat((byte)cnt);
                }
                else
                {
                    newbt(al, data[c]);
                    al = data[c];
                    c++;
                }
            }
            repeat(0);
            xr.Add(0);
            while (bitcnt != 0)
            {
                addbit(false);
            }
            byte[] res = new byte[0x400 + 4 + bitbuf.Count + xr.Count];
            Array.Copy(xbuf, 0, res, 0, 0x400);
            bitbuf.CopyTo(res, 0x404);
            int ofs = 0x404 + bitbuf.Count;

            xr.CopyTo(res, ofs);
            BinaryHelper.write_LE(res, 0x400, (uint)ofs);
            return(res);
        }
Beispiel #4
0
        public void saveDisk()
        {
            if (!File.Exists(file + ".bak"))
            {
                File.Copy(file, file + ".bak", false);
            }
            for (int i = 0; i < 191; i++)
            {
                entries[i].save(diskData, 8 + 8 * i);
            }
            byte[] data = diskData;
            if (dskid == 0)
            {
                FileStream f    = new FileStream(file, FileMode.Open);
                byte[]     oldd = new byte[f.Length];
                f.Read(oldd, 0, oldd.Length);
                f.Close();
                int[] mods    = new int[100];
                int[] ofs     = new int[100];
                int   cnt     = 0;
                int   b       = 6;
                int   cofs    = 0;
                int   nextofs = 0;
                while (oldd[b] != 0xFF)
                {
                    mods[cnt] = oldd[b];
                    ofs[cnt]  = (int)BinaryHelper.readU32_LE(oldd, b + 1);
                    if (mods[cnt] == LANG_ID)
                    {
                        cofs = ofs[cnt];
                    }
                    cnt++;
                    b += 5;
                }
                int delta = 0;
                for (int i = 0; i < cnt; i++)
                {
                    if (cofs < ofs[i] && cofs + data.Length > ofs[i])
                    {
                        nextofs = ofs[i];
                        delta   = cofs + data.Length - ofs[i];
                    }
                }
                if (delta != 0)
                {
                    while (delta % 16 != 0)
                    {
                        delta++;
                    }
                    byte[] newd = new byte[oldd.Length + delta];
                    Array.Copy(oldd, newd, cofs);
                    Array.Copy(oldd, nextofs, newd, nextofs + delta, oldd.Length - nextofs);
                    for (int i = 0; i < cnt; i++)
                    {
                        if (ofs[i] > cofs)
                        {
                            ofs[i] += delta;
                            BinaryHelper.write_LE(newd, 6 + i * 5 + 1, (uint)ofs[i]);
                        }
                    }
                    oldd = newd;
                }
                Array.Copy(data, 0, oldd, cofs, data.Length);
                data = oldd;
            }
            FileStream fs = new FileStream(file, FileMode.Create);

            fs.Write(data, 0, data.Length);
            fs.Close();
        }
Beispiel #5
0
        public void import(XmlDocument xml)
        {
            XmlNode blkhld = null;

            if (xml.DocumentElement.Name == "lure-text")
            {
                blkhld = xml.DocumentElement;
            }
            else if (xml.DocumentElement.Name == "lure-texts")
            {
                blkhld = LureCommon.findNode(xml.DocumentElement, "file", "id", resnum.ToString());
            }
            else
            {
                throw new Exception("Bad text xml");
            }
            TextDecoder.get().readDecoder(true);
            XmlDocument prev = export(true);

            TextDecoder.get().readDecoder(false);
            uint          bitbuf  = 0;
            int           bitpos  = 0;
            List <byte>   txtdata = new List <byte>();
            List <UInt16> bs      = new List <UInt16>();
            List <byte>   skp     = new List <byte>();
            int           prevblk = 0;

            foreach (XmlNode nd in prev.DocumentElement.ChildNodes)
            {
                XmlNode blk     = LureCommon.findNode(blkhld, "block", "id", nd.Attributes["id"].Value);
                int     prevtxt = prevblk;
                foreach (XmlNode tnd in nd.ChildNodes)
                {
                    //bool art = tnd.Attributes["art"].Value == "1";
                    XmlNode txt = LureCommon.findNode(blk, "text", "id", tnd.Attributes["id"].Value);
                    string  val = "";
                    if (txt.ChildNodes.Count > 0)
                    {
                        val = txt.ChildNodes[0].Value;
                    }
                    val = LureNames.get().processNames(LureConfig.get().convert(val));
                    addText(val, txtdata, ref bitbuf, ref bitpos, tnd.Attributes["art"].Value == "1");
                    if (bitpos % 2 == 1)
                    {
                        addbit(false, txtdata, ref bitbuf, ref bitpos);
                    }
                    // if (tnd != nd.LastChild)
                    {
                        int ofs = (txtdata.Count << 2) + bitpos / 2;
                        int d   = ofs - prevtxt;
                        if (d > 0x7F)
                        {
                            while ((d & 7) != 0)
                            {
                                addbit(false, txtdata, ref bitbuf, ref bitpos);
                                ofs = (txtdata.Count << 2) + bitpos / 2;
                                d   = ofs - prevtxt;
                            }
                            d = (d >> 3) | 0x80;
                        }
                        skp.Add((byte)d);
                        prevtxt = ofs;
                    }
                }
                if (nd != prev.DocumentElement.LastChild)
                {
                    int offset = (txtdata.Count << 2) + bitpos / 2;
                    bs.Add((UInt16)(offset - prevblk));
                    prevblk = offset;
                }
            }
            while (bitpos != 0)
            {
                addbit(false, txtdata, ref bitbuf, ref bitpos);
            }
            data = new byte[4 + bs.Count * 2 + skp.Count + txtdata.Count];
            int o = 4;

            for (int i = 0; i < bs.Count; i++)
            {
                BinaryHelper.write_LE(data, o, bs[i]);
                o += 2;
            }
            BinaryHelper.write_LE(data, 0, (UInt16)o);
            for (int i = 0; i < skp.Count; i++)
            {
                data[o++] = skp[i];
            }
            BinaryHelper.write_LE(data, 2, (UInt16)o);
            for (int i = 0; i < txtdata.Count; i++)
            {
                data[o++] = txtdata[i];
            }
            LureDisks.setResource(resnum, data);
        }