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()); }
/// <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()); }
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()); }
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); }
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); }
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; } } }
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()); }
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()); }
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())); }
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 = ""; } }
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(); } }
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(); } }
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()); }
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); }
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); }
public string GetStringEscape() => GameEncoding.GetStringEscape(Bytes);
public void SetValueUnescape(string val) => Bytes = GameEncoding.Unescape(GameEncoding.GetBytes(val));
public abstract void WriteText(ByteBuilder bb, object data, GameEncoding encoding);