コード例 #1
0
ファイル: ResText.cs プロジェクト: deadman2000/sci_tools
        public override string[] GetStrings()
        {
            if (_strings != null)
            {
                return(_strings);
            }

            List <string> strings = new List <string>();
            var           data    = GetContent();

            int s   = 0;
            int ind = 0;

            for (int i = 0; i < data.Length; i++)
            {
                if (data[i] == 0x00)
                {
                    strings.Add(GameEncoding.GetString(data, s, i - s));

                    ind++;
                    s = i + 1;
                }
            }

            return(_strings = strings.ToArray());
        }
コード例 #2
0
        /// <summary>
        /// \0 terminated lines
        /// </summary>
        /// <returns></returns>
        public string[] GetText()
        {
            if (_text != null)
            {
                return(_text);
            }

            List <string> lines = new List <string>();
            var           data  = GetContent(false);

            int s   = 0;
            int ind = 0;

            for (int i = 0; i < data.Length; i++)
            {
                if (data[i] == 0x00)
                {
                    string strRes = GameEncoding.GetString(data, s, i - s);
                    lines.Add(strRes);
                    ind++;
                    s = i + 1;
                }
            }

            return(_text = lines.ToArray());
        }
コード例 #3
0
ファイル: ResText.cs プロジェクト: deadman2000/sci_translator
        public override void SetTranslate(string[] strings)
        {
            var oldStrings = GetStrings(true);

            if (strings.Length != oldStrings.Length)
            {
                throw new Exception("Line count mismatch");
            }

            ByteBuilder bb = new ByteBuilder();

            for (int r = 0; r < strings.Length; r++)
            {
                var tr = strings[r];
                if (tr == null)
                {
                    tr = oldStrings[r];
                }

                var bytes = GameEncoding.GetBytes(tr);
                bb.AddBytes(bytes);
                bb.AddByte(0);
            }

            SaveTranslate(bb.GetArray());
        }
コード例 #4
0
        public SCIPackage(string directory, string translate, Encoding enc)
        {
            if (enc == null)
            {
#if NETSTANDARD
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
#endif
                enc = Encoding.GetEncoding(866);
            }
            GameEncoding = new GameEncoding(enc);

            GameDirectory      = directory;
            TranslateDirectory = translate ?? Path.Combine(GameDirectory, "TRANSLATE");

            ReadMap(Path.Combine(GameDirectory, "RESOURCE.MAP"));

            var messagesPath = Path.Combine(GameDirectory, "MESSAGE.MAP");
            if (File.Exists(messagesPath))
            {
                ExternalMessages = true;
                ReadMap(messagesPath);
            }

            Resources = Resources.OrderBy(r => r.Type).ThenBy(r => r.Number).ToList();

            SeparateHeapResources = Resources.Any(r => r.Type == ResType.Heap);
        }
コード例 #5
0
        public override void WriteText(ByteBuilder bb, object data, GameEncoding encoding)
        {
            ushort textOffset = (ushort)bb.Position;

            var bytes = encoding.GetBytes(Text);

            bb.AddBytes(bytes);
            bb.AddByte(0);

            bb.SetShortBE((int)data, textOffset);
        }
コード例 #6
0
 public void ReadText(byte[] data, GameEncoding encoding)
 {
     for (int i = TextOffset; i < data.Length; i++)
     {
         if (data[i] == 0)
         {
             Text = encoding.GetString(data, TextOffset, i - TextOffset);
             return;
         }
     }
 }
コード例 #7
0
ファイル: HexBuilder.cs プロジェクト: deadman2000/sci_tools
        public string Decompile(Script script)
        {
            gameEncoding = script.Package.GameEncoding;

            foreach (var sec in script.Sections)
            {
                sb.Append(string.Format("Type: {0} Size: {1}\r\n", sec.Type, sec.Size));
                AddHex(script.SourceData, sec.Address, sec.Size);
                sb.Append("\r\n");
            }

            return(sb.ToString().TrimEnd());
        }
コード例 #8
0
ファイル: ResText.cs プロジェクト: deadman2000/sci_tools
        public override byte[] GetPatch()
        {
            var strings = GetStrings();

            ByteBuilder bb = new ByteBuilder();

            for (int i = 0; i < strings.Length; i++)
            {
                var bytes = GameEncoding.GetBytes(strings[i]);
                bb.AddBytes(bytes);
                bb.AddByte(0);
            }

            return(bb.GetArray());
        }
コード例 #9
0
        public static string ReadString(this Stream stream, GameEncoding encoding)
        {
            List <byte> buff = new List <byte>();

            while (true)
            {
                var b = stream.ReadByte();
                if (b == 0)
                {
                    break;
                }
                buff.Add((byte)b);
            }
            return(encoding.GetString(buff.ToArray()));
        }
コード例 #10
0
        protected override void ShowResource(Resource res, bool translated)
        {
            var data = res.GetContent(translated);

            var vocab = (ResVocab)res;

            tbHex.Text = GameEncoding.ByteToHexTable(data);

            if (res.Number == 997)
            {
                var           strings = vocab.GetVocabNames();
                StringBuilder sb      = new StringBuilder();
                for (int i = 0; i < strings.Length; i++)
                {
                    sb.AppendFormat("{0:x3}: {1}", i, strings[i]).AppendLine();
                }
                tbVocab.Text = sb.ToString();
            }
            else if (res.Number == 998)
            {
                var           opcodes = vocab.GetVocabOpcodes();
                StringBuilder sb      = new StringBuilder();
                foreach (var kv in opcodes)
                {
                    sb.AppendFormat("{0:x2}: {1} {2}", kv.Key, kv.Value.Type, kv.Value.Name).AppendLine();
                }
                tbVocab.Text = sb.ToString();
            }
            else if (res.Number == 999)
            {
                var           lines = vocab.GetText();
                StringBuilder sb    = new StringBuilder();
                for (int i = 0; i < lines.Length; i++)
                {
                    sb.AppendLine($"{i,-3}: {lines[i]}");
                }
                tbVocab.Text = sb.ToString();
            }
            else
            {
                tbVocab.Text = "";
            }
        }
コード例 #11
0
        protected override void ShowResource(Resource res, bool translated)
        {
            try
            {
                byte[] data = res.GetContent(translated);

                if (data == null)
                {
                    tbHexView.Text = "Unsupported compression method";
                    return;
                }

                tbHexView.Text = GameEncoding.ByteToHexTable(data);
            }
            catch (Exception ex)
            {
                tbHexView.Text = ex.ToString();
            }
        }
コード例 #12
0
        protected override void Reload()
        {
            try
            {
                byte[] data = Current.GetContent();

                if (data == null)
                {
                    tbHexView.Text = "Unsupported compression method";
                    return;
                }

                tbHexView.Text = GameEncoding.ByteToHexTable(data);
            }
            catch (Exception ex)
            {
                tbHexView.Text = ex.ToString();
            }
        }
コード例 #13
0
ファイル: ResText.cs プロジェクト: deadman2000/sci_translator
        public string[] GetText(bool translateDir)
        {
            List <string> lines = new List <string>();
            var           data  = GetContent(translateDir);

            int s   = 0;
            int ind = 0;

            for (int i = 0; i < data.Length; i++)
            {
                if (data[i] == 0x00)
                {
                    lines.Add(GameEncoding.GetString(data, s, i - s));

                    ind++;
                    s = i + 1;
                }
            }

            return(lines.ToArray());
        }
コード例 #14
0
        public string[] GetVocabNames()
        {
            if (_vocabNames != null)
            {
                return(_vocabNames);
            }

            var data = GetContent(false);

            ushort count = Helpers.GetUShortBE(data, 0);

            string[] names = new string[count];

            for (int i = 0; i < count; i++)
            {
                ushort addr = Helpers.GetUShortBE(data, i * 2 + 2);
                ushort len  = Helpers.GetUShortBE(data, addr);
                string name = GameEncoding.GetStringEscape(data, addr + 2, len);
                names[i] = name;
            }

            return(_vocabNames = names);
        }
コード例 #15
0
        public Dictionary <byte, OpCode> GetVocabOpcodes()
        {
            if (_opcodes != null)
            {
                return(_opcodes);
            }

            var data = GetContent(false);

            ushort count = Helpers.GetUShortBE(data, 0);
            Dictionary <byte, OpCode> opcodes = new Dictionary <byte, OpCode>();

            for (byte i = 0; i < count; i++)
            {
                ushort addr = Helpers.GetUShortBE(data, i * 2 + 2);
                ushort len  = Helpers.GetUShortBE(data, addr);
                ushort type = Helpers.GetUShortBE(data, addr + 2);
                string name = GameEncoding.GetStringEscape(data, addr + 4, len - 2);
                opcodes.Add(i, new OpCode(type, name));
            }

            return(_opcodes = opcodes);
        }
コード例 #16
0
 public string GetStringEscape() => GameEncoding.GetStringEscape(Bytes);
コード例 #17
0
 public void SetValueUnescape(string val) => Bytes = GameEncoding.Unescape(GameEncoding.GetBytes(val));
コード例 #18
0
 public abstract void WriteText(ByteBuilder bb, object data, GameEncoding encoding);