public GroupSettings(string lastViewGroupName) { InitializeComponent(); _streamGroup = new StreamGroup(); _lastViewGroupName = lastViewGroupName; _oldGroups = _streamGroup.GetGroups(); }
public void ReadFromFile(BinaryReader reader) { if (reader.ReadInt32() != 1299346515) { return; } if (reader.ReadInt32() != 0x6) { return; } int fileSize = reader.ReadInt32(); int unk0 = reader.ReadInt32(); int numGroups = reader.ReadInt32(); int groupOffset = reader.ReadInt32(); int numHeaders = reader.ReadInt32(); int headerOffset = reader.ReadInt32(); int numLines = reader.ReadInt32(); int lineOffset = reader.ReadInt32(); int numLoaders = reader.ReadInt32(); int loadersOffset = reader.ReadInt32(); int numBlocks = reader.ReadInt32(); int blockOffset = reader.ReadInt32(); int numHashes = reader.ReadInt32(); int hashOffset = reader.ReadInt32(); int poolSize = reader.ReadInt32(); int poolOffset = reader.ReadInt32(); Debug.Assert(reader.BaseStream.Position == groupOffset, "Failed to reach the starting offset for group declaration!"); groups = new StreamGroup[numGroups]; for (int i = 0; i < numGroups; i++) { StreamGroup map = new StreamGroup(); map.nameIDX = reader.ReadInt32(); map.Name = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Type = (GroupTypes)reader.ReadInt32(); map.Unk01 = reader.ReadInt32(); map.startOffset = reader.ReadInt32(); map.endOffset = reader.ReadInt32(); map.unk5 = reader.ReadInt32(); groups[i] = map; } Debug.Assert(reader.BaseStream.Position == headerOffset, "Did not reach the header starting offset"); groupHeaders = new string[numHeaders]; ulong[] ulongHeaders = new ulong[numHeaders]; for (int i = 0; i < numHeaders; i++) { ulongHeaders[i] = reader.ReadUInt64(); groupHeaders[i] = ReadFromBuffer((long)(ulongHeaders[i] + (ulong)poolOffset), reader.BaseStream.Position, reader); } Debug.Assert(reader.BaseStream.Position == lineOffset, "Did not reach the line data starting offset!"); lines = new StreamLine[numLines]; for (int i = 0; i < numLines; i++) { StreamLine map = new StreamLine(); map.nameIDX = reader.ReadInt32(); map.lineID = reader.ReadInt32(); map.groupID = reader.ReadInt32(); map.LoadType = reader.ReadInt32(); map.flagIDX = reader.ReadInt32(); map.Unk5 = reader.ReadInt32(); map.Unk10 = reader.ReadUInt64(); map.Unk11 = reader.ReadUInt64(); map.Unk12 = reader.ReadInt32(); map.Unk13 = reader.ReadInt32(); map.Unk14 = reader.ReadInt32(); map.Unk15 = reader.ReadInt32(); map.Group = groupHeaders[map.groupID]; map.Name = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Flags = ReadBufferSpecial((long)((ulong)map.flagIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|'); lines[i] = map; } Debug.Assert(reader.BaseStream.Position == loadersOffset, "Did not reach the loader data starting offset!"); loaders = new StreamLoader[numLoaders]; for (int i = 0; i < numLoaders; i++) { StreamLoader map = new StreamLoader(); map.start = reader.ReadInt32(); map.end = reader.ReadInt32(); map.Type = (GroupTypes)reader.ReadInt32(); map.LoaderSubID = reader.ReadInt32(); map.LoaderID = reader.ReadInt32(); map.LoadType = reader.ReadInt32(); map.pathIDX = reader.ReadInt32(); map.entityIDX = reader.ReadInt32(); map.Path = ReadFromBuffer((long)((ulong)map.pathIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Entity = ReadBufferSpecial((long)((ulong)map.entityIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|'); loaders[i] = map; } Debug.Assert(reader.BaseStream.Position == blockOffset, "Did not reach the block declaration starting offset!"); blocks = new StreamBlock[numBlocks]; for (int i = 0; i < numBlocks; i++) { StreamBlock map = new StreamBlock(); map.startOffset = reader.ReadInt32(); map.endOffset = reader.ReadInt32(); map.Hashes = new ulong[map.endOffset - map.startOffset]; blocks[i] = map; } Debug.Assert(reader.BaseStream.Position == hashOffset, "Did not reach the block hashes starting offset!"); hashes = new ulong[numHashes]; for (int i = 0; i < numHashes; i++) { hashes[i] = reader.ReadUInt64(); } for (int i = 0; i < numBlocks; i++) { var block = blocks[i]; Array.Copy(hashes, block.startOffset, block.Hashes, 0, block.Hashes.Length); } Debug.Assert(reader.BaseStream.Position == poolOffset, "Did not reach the buffer pool starting offset!"); reader.BaseStream.Seek(poolSize, SeekOrigin.Current); Debug.Assert(reader.BaseStream.Position == reader.BaseStream.Length, "Did not reach the end of the file!"); }
private void ProcessStream() { OuterGroup = null; GarbageCharacters = 0; StreamGroup currentGroup = null; var currentGroups = new Stack <StreamGroup>(); var i = -1; var inGarbage = false; var escapedChar = false; foreach (var c in Input) { i++; if (escapedChar) { escapedChar = false; continue; } if (c == '!') { escapedChar = true; continue; } if (inGarbage && c == '>') { inGarbage = false; continue; } if (inGarbage) { GarbageCharacters++; continue; } if (c == '<') { inGarbage = true; continue; } if (c == '{') { var newGroup = new StreamGroup(); if (OuterGroup == null) { OuterGroup = newGroup; } currentGroup?.SubGroups.Add(newGroup); currentGroup = newGroup; currentGroups.Push(currentGroup); continue; } if (c == '}') { currentGroups.Pop(); if (!currentGroups.TryPeek(out currentGroup)) { currentGroup = null; } continue; } if (c == ',') { continue; } throw new Exception($"Invalid character {c} found at offset {i} in input."); } }
public void ReadFromFile(BinaryReader reader) { if (reader.ReadInt32() != 1299346515) { return; } if (reader.ReadInt32() != 0x6) { return; } int fileSize = reader.ReadInt32(); int unk0 = reader.ReadInt32(); int numGroups = reader.ReadInt32(); int groupOffset = reader.ReadInt32(); int numHeaders = reader.ReadInt32(); int headerOffset = reader.ReadInt32(); int numLines = reader.ReadInt32(); int lineOffset = reader.ReadInt32(); int numLoaders = reader.ReadInt32(); int loadersOffset = reader.ReadInt32(); int numBlocks = reader.ReadInt32(); int blockOffset = reader.ReadInt32(); int numHashes = reader.ReadInt32(); int hashOffset = reader.ReadInt32(); int poolSize = reader.ReadInt32(); int poolOffset = reader.ReadInt32(); if (reader.BaseStream.Position != groupOffset) { throw new FormatException(); } groups = new StreamGroup[numGroups]; for (int i = 0; i < numGroups; i++) { StreamGroup map = new StreamGroup(); map.nameIDX = reader.ReadInt32(); map.Name = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Type = reader.ReadInt32(); map.Unk01 = reader.ReadInt32(); map.startOffset = reader.ReadInt32(); map.endOffset = reader.ReadInt32(); map.unk5 = reader.ReadInt32(); groups[i] = map; } if (reader.BaseStream.Position != headerOffset) { throw new FormatException(); } groupHeaders = new string[numHeaders]; ulong[] ulongHeaders = new ulong[numHeaders]; for (int i = 0; i < numHeaders; i++) { ulongHeaders[i] = reader.ReadUInt64(); groupHeaders[i] = ReadFromBuffer((long)(ulongHeaders[i] + (ulong)poolOffset), reader.BaseStream.Position, reader); } if (reader.BaseStream.Position != lineOffset) { throw new FormatException(); } lines = new StreamLine[numLines]; for (int i = 0; i < numLines; i++) { StreamLine map = new StreamLine(); map.nameIDX = reader.ReadInt32(); map.lineID = reader.ReadInt32(); map.groupID = reader.ReadInt32(); map.LoadType = reader.ReadInt32(); map.flagIDX = reader.ReadInt32(); map.Unk5 = reader.ReadInt32(); map.Unk10 = reader.ReadUInt64(); map.Unk11 = reader.ReadUInt64(); map.Unk12 = reader.ReadInt32(); map.Unk13 = reader.ReadInt32(); map.Unk14 = reader.ReadInt32(); map.Unk15 = reader.ReadInt32(); map.Group = groupHeaders[map.groupID]; map.Name = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Flags = ReadBufferSpecial((long)((ulong)map.flagIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|'); lines[i] = map; } if (reader.BaseStream.Position != loadersOffset) { throw new FormatException(); } loaders = new StreamLoader[numLoaders]; for (int i = 0; i < numLoaders; i++) { StreamLoader map = new StreamLoader(); map.start = reader.ReadInt32(); map.end = reader.ReadInt32(); map.type = reader.ReadInt32(); map.loaderSubID = reader.ReadInt32(); map.loaderID = reader.ReadInt32(); map.LoadType = reader.ReadInt32(); map.pathIDX = reader.ReadInt32(); map.entityIDX = reader.ReadInt32(); map.Path = ReadFromBuffer((long)((ulong)map.pathIDX + (ulong)poolOffset), reader.BaseStream.Position, reader); map.Entity = ReadBufferSpecial((long)((ulong)map.entityIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|'); loaders[i] = map; } if (reader.BaseStream.Position != blockOffset) { throw new FormatException(); } blocks = new StreamBlock[numBlocks]; for (int i = 0; i < numBlocks; i++) { StreamBlock map = new StreamBlock(); map.startOffset = reader.ReadInt32(); map.endOffset = reader.ReadInt32(); blocks[i] = map; } if (reader.BaseStream.Position != hashOffset) { throw new FormatException(); } hashes = new ulong[numHashes]; for (int i = 0; i < numHashes; i++) { hashes[i] = reader.ReadUInt64(); } if (reader.BaseStream.Position != poolOffset) { throw new FormatException(); } reader.BaseStream.Seek(poolSize, SeekOrigin.Current); if (reader.BaseStream.Position != reader.BaseStream.Length) { throw new FormatException("Borked this up"); } }