public EVE(string file) { Console.WriteLine(file); using (var br = new BinaryReader(File.OpenRead(file))) { // Header ------------------------------------------------------------------------------------ var header = new Header(br); FileId = header.FileId; HeaderUnknown = header.Unknown; //Console.WriteLine("GroupItemCounts:"); int[] groupItemCounts = new int[header.NumGroups]; for (int i = 0; i < header.NumGroups; i++) { groupItemCounts[i] = br.ReadInt32(); //Console.WriteLine($" 0x{groupItemCounts[i]:X}"); } // Offset Tables ------------------------------------------------------------------------------- //Console.WriteLine("OffsetTableA:"); br.BaseStream.Position = OffsetTableStart; int[][] groupsA = new int[header.NumGroups][]; for (int groupId = 0; groupId < header.NumGroups; groupId++) { //Console.WriteLine($" Group {groupId} (numItems:{groupItemCounts[groupId]}):"); groupsA[groupId] = new int[groupItemCounts[groupId]]; for (int idWithinGroup = 0; idWithinGroup < groupItemCounts[groupId]; idWithinGroup++) { groupsA[groupId][idWithinGroup] = br.ReadInt32(); //Console.WriteLine($" 0x{groupsA[groupId][idWithinGroup]:X} (id: {idWithinGroup})"); } } Debug.Assert(groupsA.Sum(i => i.Length) == header.NumOffsets); var shift = br.ReadUInt32(); if (shift != header.TableBDataOffset) { throw new InvalidDataException("Listed offset doesnt match earlier value"); } //Console.WriteLine("OffsetTableB:"); int[][] groupsB = new int[header.NumGroups][]; for (int groupId = 0; groupId < header.NumGroups; groupId++) { //Console.WriteLine($" Group {groupId}:"); groupsB[groupId] = new int[groupItemCounts[groupId]]; for (int idWithinGroup = 0; idWithinGroup < groupItemCounts[groupId]; idWithinGroup++) { groupsB[groupId][idWithinGroup] = br.ReadInt32(); //Console.WriteLine($" 0x{groupsB[groupId][idWithinGroup]:X} (id: {idWithinGroup})"); } } Debug.Assert(groupsB.Sum(i => i.Length) == header.NumOffsets); var end = br.ReadInt32(); //Console.WriteLine($"END OF OFFSETS VALUE = 0x{end:X}"); // Data --------------------------------------------------------------------------------------- var startOffsetA = br.BaseStream.Position; for (int a = 0; a < groupsA.Length; a++) { int[] group = groupsA[a]; var eveGroup = new List <(byte[], Event)>(); EventGroupsA.Add(eveGroup); for (int i = 0; i < group.Length; i++) { var eventOffset = group[i]; br.BaseStream.Position = startOffsetA + eventOffset; byte[] unknown = br.ReadBytes(0x40); eveGroup.Add((unknown, new Event(br))); } } var startOffsetB = br.BaseStream.Position; //Console.WriteLine("START OFFSET B: 0x{0:X}", startOffsetB); var expectedStartOffsetB = startOffsetA + header.TableBDataOffset; Debug.Assert(startOffsetB == expectedStartOffsetB, $"Start offset of B is unexpected: 0x{startOffsetB:X} (expected: 0x{expectedStartOffsetB:X})"); for (int b = 0; b < groupsB.Length; b++) { int[] group = groupsB[b]; var eveGroup = new List <Event>(); EventGroupsB.Add(eveGroup); for (int i = 0; i < group.Length; i++) { var eventOffset = group[i]; br.BaseStream.Position = startOffsetB + eventOffset; eveGroup.Add(new Event(br)); } } // ---------------------------------------------------------------------------- } }