예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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;
        }
예제 #4
0
        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}");
                            }
                        }
                    }
                }
        }