public void import(XmlDocument doc) { XmlNode blk = null; if (doc.DocumentElement.Name == "lure-strings") { blk = LureCommon.findNode(doc.DocumentElement, "block"); } else if (doc.DocumentElement.Name == "lure-texts") { blk = LureCommon.findNode(LureCommon.findNode(doc.DocumentElement, "file", "id", resnum.ToString()), "block"); } else { throw new Exception("bad strings xml"); } ushort count = BinaryHelper.readU16_LE(data, 0); int curofs = 2; for (int i = 0; i < count; i++) { XmlNode nd = LureCommon.findNode(blk, "text", "id", i.ToString()); string val = ""; if (nd.ChildNodes.Count > 0) { val = LureConfig.get().convert(nd.ChildNodes[0].Value); } data = LureCommon.checkArrLength(data, curofs + val.Length + 1); BinaryHelper.writeZString(data, ref curofs, val); } LureDisks.setResource(resnum, data); }
public void import(Bitmap bmp) { if (bmp.Width != 61 * 8 || bmp.Height != 16) { throw new Exception("bad font bmp"); } for (int i = 0; i < 122; i++) { for (int j = 0; j < 8; j++) { byte ln = 0; int xofs = i * 8 - (i < 61?0:61 * 8); for (int k = 0; k < 8; k++) { Color cl = bmp.GetPixel(xofs + k, j + (i < 61?0:8)); if (cl.ToArgb() == Color.Black.ToArgb()) { ln |= (byte)(1 << (8 - 1 - k)); } } data[i * 8 + j] = ln; } } LureDisks.setResource(resnum, data); }
public void import(Bitmap bmp) { if (bmp.Width != width || bmp.Height != height) { throw new Exception(String.Format("Wrong bmp size {0}x{1} (need {2}x{3})", bmp.Width, bmp.Height, width, height)); } ColorPalette pal = bmp.Palette; LureConfig.LurePalette xpal = LureConfig.get().getPalette(palette); for (int i = 0; i < 256; i++) { if (pal.Entries[i].ToArgb() != xpal.cols[i].ToArgb()) { throw new Exception("Palette differs"); } } byte[] res = new byte[width * height]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bmp.PixelFormat); for (int i = 0; i < height; i++) { System.Runtime.InteropServices.Marshal.Copy(new IntPtr(bd.Scan0.ToInt64() + i * bd.Stride), res, i * bd.Width, bd.Width); } bmp.UnlockBits(bd); byte[] nr = Compressor.compress(res); LureDisks.setResource(resnum, nr); }
public void import(Bitmap bmp) { if (bmp.Width != 320 || bmp.Height % 200 != 0) { throw new Exception(String.Format("Wrong bmp size {0}x{1} (need 320x200n)", bmp.Width, bmp.Height)); } ColorPalette pal = bmp.Palette; LureConfig.LurePalette xpal = LureConfig.get().getPalette(palette); for (int i = 0; i < 256; i++) { if (pal.Entries[i].ToArgb() != xpal.cols[i].ToArgb()) { throw new Exception("Palette differs"); } } byte[] data = new byte[320 * bmp.Height]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, 320, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); for (int i = 0; i < bmp.Height; i++) { System.Runtime.InteropServices.Marshal.Copy(new IntPtr(bd.Scan0.ToInt64() + i * bd.Stride), data, i * bd.Width, bd.Width); } bmp.UnlockBits(bd); int screens = bmp.Height / 200; byte[] dt2 = new byte[xlen]; byte[] cmd = new byte[0]; int rOfs = xlen; int cOfs = 0; Array.Copy(data, dt2, xlen); for (int i = 1; i < screens; i++) { byte[] pix; byte[] code; compressScreen(data, i, out pix, out code); Array.Resize <byte>(ref dt2, dt2.Length + pix.Length); Array.Copy(pix, 0, dt2, rOfs, pix.Length); rOfs += pix.Length; Array.Resize <byte>(ref cmd, cmd.Length + code.Length); Array.Copy(code, 0, cmd, cOfs, code.Length); cOfs += code.Length; } data = null; byte[] nr = Compressor.compress(dt2); LureDisks.setResource(resnum, nr); LureDisks.setResource(resnum + 1, cmd); }
public void import(XmlDocument doc) { if (doc.DocumentElement.Name != "lure-decoder") { throw new Exception("bad decoder xml"); } byte[] dec = new byte[1]; int pos = 0; foreach (XmlNode nd in doc.DocumentElement.ChildNodes) { impNode(nd, ref dec, ref pos); } dec = LureCommon.checkArrLength(dec, pos + 1); dec[pos] = 0xff; pos++; LureDisks.setResource(LureConfig.get().decode_tbl, dec); //readDecoder(); }
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); }