Ejemplo n.º 1
0
        private void SaveStringDatabase(StringDatabase strDb, string outputPath)
        {
            using (var fs = new FileStream(outputPath, FileMode.Create))
                using (var bs = new BinaryStream(fs, strDb.Endian == Endian.Big ? ByteConverter.Big : ByteConverter.Little))
                {
                    bs.WriteString("GTST", StringCoding.Raw);
                    bs.WriteInt32(strDb.Strings.Count);
                    bs.WriteInt32(strDb.Version);

                    long lastDataPos = SDB.HeaderSize + (strDb.Strings.Count * sizeof(uint));
                    var  strTable    = GetStringDbTable(strDb.Strings);
                    bs.Position = SDB.HeaderSize + (strDb.Strings.Count * sizeof(uint));
                    strTable.SaveStream(bs);

                    for (int i = 0; i < strDb.Strings.Count; i++)
                    {
                        bs.Position = SDB.HeaderSize + (i * sizeof(uint));
                        bs.WriteInt32(strTable.GetStringOffset(strDb.Strings[i]));
                    }
                }
        }
Ejemplo n.º 2
0
        private void PopulateRowStringsIfNeeded(SpecDB db)
        {
            foreach (var row in Rows)
            {
                foreach (var dataType in row.ColumnData)
                {
                    if (dataType is DBString str)
                    {
                        // Lazy load
                        if (!db.StringDatabases.TryGetValue(str.FileName, out StringDatabase strDb))
                        {
                            var newStrDb = StringDatabase.LoadFromFile(Path.Combine(db.FolderName, str.FileName));
                            db.StringDatabases.Add(str.FileName, newStrDb);
                            strDb = newStrDb;
                        }

                        str.Value = strDb.Strings[str.StringIndex];
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public static StringDatabase LoadFromFile(string fileName)
        {
            using (var file = File.Open(fileName, FileMode.Open))
                using (var bs = new BinaryStream(file))
                {
                    if (bs.ReadString(4) != "GTST")
                    {
                        throw new InvalidDataException($"Invalid SDB file '{fileName}'. Magic does not match.");
                    }

                    var strDb = new StringDatabase();
                    bs.Position   = 0x08;
                    strDb.Version = bs.ReadInt32();
                    strDb.Endian  = strDb.Version == 1 ? Endian.Little : Endian.Big;
                    if (strDb.Endian == Endian.Big)
                    {
                        bs.ByteConverter = ByteConverter.Big;
                    }

                    bs.Position = 0x04;
                    int entryCount = bs.ReadInt32();

                    bs.Position = 0x10;
                    for (int i = 0; i < entryCount; i++)
                    {
                        int strOffset = bs.ReadInt32();
                        using (var seek = bs.TemporarySeek(0x10 + (entryCount * sizeof(uint) + strOffset), SeekOrigin.Begin))
                        {
                            seek.Stream.Position += 2;
                            strDb.Strings.Add(seek.Stream.ReadString(StringCoding.ZeroTerminated));
                        }
                    }

                    return(strDb);
                }
        }