public override void Read(EndianBinReader reader) { var pageNameOffset = reader.ReadUInt32(); var pairUnitCount = reader.ReadUInt32(); var pairUnitOffset = reader.ReadUInt32(); reader.BaseStream.Position = pageNameOffset; Name = reader.ReadNullTerminatedString(); reader.BaseStream.Position += reader.BaseStream.Position % 0x10; // Padding with 0x5E for (int i = 0; i < pairUnitCount; i++) { reader.BaseStream.Position = pairUnitOffset + (i * EntrySize); int id = reader.ReadInt32(); uint labelOffset = reader.ReadUInt32(); uint valueOffset = reader.ReadUInt32(); reader.BaseStream.Position = labelOffset; string label = reader.ReadNullTerminatedString(); reader.BaseStream.Position = valueOffset; string value = reader.ReadNullTerminatedString(); var pair = new RTextPairUnit(id, label, value); PairUnits.Add(label, pair); } }
public override void Read(EndianBinReader reader) { var pageNameOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32(); var pairUnitCount = reader.ReadUInt32(); reader.ReadUInt32(); // Unk var pairUnitOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32(); reader.BaseStream.Position = (int)pageNameOffset; Name = reader.ReadNullTerminatedString(); for (int i = 0; i < pairUnitCount; i++) { reader.BaseStream.Position = pairUnitOffset + (i * (_gt7 ? EntrySizeGT7 : EntrySize)); int id = reader.ReadInt32(); ushort labelLen = reader.ReadUInt16(); ushort valueLen = reader.ReadUInt16(); long labelOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32(); long valueOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32(); reader.BaseStream.Position = labelOffset; string label = ReadString(reader, labelLen); reader.BaseStream.Position = valueOffset; string value = ReadString(reader, valueLen); var pair = new RTextPairUnit(id, label, value); PairUnits.Add(label, pair); } }
public EntryMetaData(EndianBinReader reader) { CarID = reader.ReadUInt32(); OrderID = reader.ReadUInt32(); DataOffset = reader.ReadUInt32(); LookupTableOffsets = reader.ReadBytes(4); Lookup1 = LookupTableOffsets[0]; Lookup2 = LookupTableOffsets[1]; Lookup3 = LookupTableOffsets[2]; Lookup4 = LookupTableOffsets[3]; var saveOffset = reader.BaseStream.Position; reader.BaseStream.Position = DataOffset; Data = reader.ReadNullTerminatedString(); reader.BaseStream.Position = saveOffset; }
private void Read() { using (var ms = new MemoryStream(_data)) using (var reader = new EndianBinReader(ms)) { _header = new Header(reader); _entryTables = new List <EntryTable>(); for (int i = 0; i < _header.EntryCount; i++) { reader.BaseStream.Position = Constants.NDB0_HEADER_SIZE + (i * 0x04); reader.BaseStream.Position = reader.ReadUInt32(); _entryTables.Add(new EntryTable(reader, _logWriter)); } #if DEBUG for (int i = 0; i < _entryTables.Count; i++) { var entryTable = _entryTables[i]; _logWriter?.WriteLine($"---- Entry Table {i} ({entryTable.Entries.Count}) ----"); for (int j = 0; j < entryTable.Entries.Count; j++) { var entryTableEntry = entryTable.Entries[j]; _logWriter?.WriteLine($"{j:X8} | {entryTableEntry.CarID:X8} - {entryTableEntry.OrderID:X8} - {entryTableEntry.DataOffset:X8} - {entryTableEntry.Lookup1:X2} - {entryTableEntry.Lookup2:X2} - {entryTableEntry.Lookup3:X2} - {entryTableEntry.Lookup4:X2} - {entryTableEntry.Data}"); } } #endif _speedUpTable = new List <string>(); reader.BaseStream.Position = _header.SpeedUpTableOffset; var count = reader.ReadUInt32(); for (int i = 0; i < count; i++) { reader.BaseStream.Position = _header.SpeedUpTableOffset + 0x04 + (i * 0x04); reader.BaseStream.Position = reader.ReadUInt32(); _speedUpTable.Add(reader.ReadNullTerminatedString()); } #if DEBUG _logWriter?.WriteLine($"---- Speed Up Table ({_speedUpTable.Count}) ----"); for (int i = 0; i < _speedUpTable.Count; i++) { _logWriter?.WriteLine($"{i:X8} | {_speedUpTable[i]}"); } var usageCount = new int[0xFF]; for (int i = 0; i < _entryTables.Count; i++) { var entryTable = _entryTables[i]; foreach (var entryTableEntry in entryTable.Entries.OrderBy(x => x.OrderID)) { for (int k = 0; k < 4; k++) { if (entryTableEntry.LookupTableOffsets[k] < 0xFF) { usageCount[entryTableEntry.LookupTableOffsets[k]]++; } } } } #endif for (int i = 0; i < _entryTables.Count; i++) { using (var sw = new StreamWriter($"NDB0_Table_{i}.txt")) { var entryTable = _entryTables[i]; foreach (var entryTableEntry in entryTable.Entries.OrderBy(x => x.OrderID)) { var sb = new StringBuilder(); for (int k = 0; k < 4; k++) { if (entryTableEntry.LookupTableOffsets[k] < 0xFF) { sb.Append($"{_speedUpTable[entryTableEntry.LookupTableOffsets[k]]} "); } } sb.Append(entryTableEntry.Data); sw.WriteLine($"{entryTableEntry.CarID:X8} - {entryTableEntry.OrderID:X8} - {sb}"); } } } } }