public StringEntry[] Import() { if (!Decompressed) { Decompress(); } Header = new ScriptHeader(); StructReader Reader = new StructReader(new MemoryStream(Script), false, Encoding); Reader.ReadStruct(ref Header); if (Header.ScriptLength + 0x10 != Script.Length) { throw new Exception("Corrupted Script"); } List <StringEntry> Strings = new List <StringEntry>(); for (uint i = 0; i < EntryCount; i++) { Reader.Seek(Header.OffsetTable + HeaderLen + (i * 4), SeekOrigin.Begin); uint Offset = Reader.ReadUInt32() + Header.StringTable + HeaderLen; Reader.Seek(Offset, SeekOrigin.Begin); StringEntry Entry = new StringEntry(); Reader.ReadStruct(ref Entry); Strings.Add(Entry); } Reader.Close(); return(Strings.ToArray()); }
public byte[] Export(StringEntry[] Strings) { ScriptHeader NewHeader = new ScriptHeader(); Tools.CopyStruct(Header, ref NewHeader); MemoryStream UnkData = new MemoryStream(); MemoryStream OffsetData = new MemoryStream(); MemoryStream StringData = new MemoryStream(); MemoryStream Reader = new MemoryStream(Script); Reader.Seek(0x10, SeekOrigin.Begin); Algo.CopyStream(Reader, UnkData, NewHeader.UnkCount * 8); Reader.Close(); StructWriter OffsetWriter = new StructWriter(OffsetData, false, Encoding); StructWriter StringWriter = new StructWriter(StringData, false, Encoding); for (uint i = 0; i < EntryCount; i++) { OffsetWriter.Write((uint)StringWriter.BaseStream.Length); StringWriter.WriteStruct(ref Strings[i]); } OffsetWriter.Seek(0, SeekOrigin.Begin); StringWriter.Seek(0, SeekOrigin.Begin); NewHeader.ScriptLength = (uint)(OffsetWriter.BaseStream.Length + StringWriter.BaseStream.Length + UnkData.Length); NewHeader.OffsetTable = (uint)UnkData.Length; NewHeader.StringTable = (uint)(UnkData.Length + OffsetData.Length); byte[] Output = new byte[0x10 + UnkData.Length + OffsetData.Length + StringData.Length]; Tools.BuildStruct(ref NewHeader, false, Encoding).CopyTo(Output, 0); UnkData.ToArray().CopyTo(Output, 0x10); OffsetData.ToArray().CopyTo(Output, 0x10 + UnkData.Length); StringData.ToArray().CopyTo(Output, 0x10 + UnkData.Length + OffsetData.Length); UnkData.Close(); StringWriter.Close(); OffsetWriter.Close(); return(Compress(Output)); }