public void SaveTable(SpecDB db, string outputDir) { // Write the IDI first SaveIDTable(Path.Combine(outputDir, $"{TableName}.idi")); // Write the DBT SaveDBTable(Path.Combine(outputDir, $"{TableName}.dbt")); // Write linked String Databases var savedStringDatabases = new HashSet <string>(); foreach (var meta in TableMetadata.Columns) { if (meta.ColumnType != DBColumnType.String) { continue; } if (!savedStringDatabases.Contains(meta.StringFileName)) { SaveStringDatabase(db.StringDatabases[meta.StringFileName], Path.Combine(outputDir, meta.StringFileName)); savedStringDatabases.Add(meta.StringFileName); } } }
// Non original functions public void LoadAllRows(SpecDB db) { LoadAllRowKeys(); LoadMetadata(db); LoadAllRowData(); PopulateRowStringsIfNeeded(db); IsLoaded = true; }
public static SpecDB LoadFromSpecDBFolder(string folderName, SpecDBFolder specDbType, bool loadAsOriginalImplementation) { if (!Directory.Exists(folderName)) { throw new DirectoryNotFoundException("SpecDB directory is not found."); } SpecDB db = new SpecDB(folderName, specDbType, loadAsOriginalImplementation); if (db.LoadingAsOriginalImplementation) { db.ReadAllTables(); db.ReadStringDatabases(); } else { db.PreLoadAllTablesFromCurrentFolder(); } return(db); }
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]; } } } }
public void ReadIDIMapOffsets(SpecDB specDb) { //if (TableName.Equals("CAR_NAME_")) // TableName += specDb.LocaleName; var buffer = File.ReadAllBytes(Path.Combine(specDb.FolderName, TableName) + ".idi"); SpanReader sr = new SpanReader(buffer); var magic = sr.ReadStringRaw(4); if (magic != "GTID") { throw new InvalidDataException("IDI Table had invalid magic."); } Endian endian = sr.ReadByte() != 0 ? Endian.Little : Endian.Big; IDI = new IDI(buffer, endian); sr.Endian = endian; sr.Position = 0x0C; TableID = sr.ReadInt32(); }
/// <summary> /// Write file information for games that uses PartsInfo.tbd/tbi. /// </summary> /// <param name="progress"></param> /// <param name="folder"></param> public static void WritePartsInformationNew(SpecDB db, IProgress <(int, string)> progress, string folder)
private void LoadMetadata(SpecDB db) { if (TableName.StartsWith("CAR_NAME_")) { string locale = TableName.Split('_')[2]; if (locale.Equals("ALPHABET") || locale.Equals("JAPAN")) { locale = "UnistrDB.sdb"; } else { locale += "_StrDB.sdb"; } TableMetadata = new CarName(db.SpecDBFolderType, locale); } else if (TableName.StartsWith("CAR_VARIATION_")) { string locale = TableName.Split('_')[2]; if (locale.Equals("ALPHABET") || locale.Equals("JAPAN")) { locale = "UnistrDB.sdb"; } else { locale += "_StrDB.sdb"; } TableMetadata = new CarVariation(db.SpecDBFolderType, locale); } else if (TableName.StartsWith("COURSE_NAME_")) { string locale = TableName.Split('_')[2]; if (locale.Equals("ALPHABET") || locale.Equals("JAPAN")) { locale = "UnistrDB.sdb"; } else { locale += "_StrDB.sdb"; } TableMetadata = new CourseName(db.SpecDBFolderType, locale); } else if (TableName.StartsWith("VARIATION")) { string locale = "UnistrDB.sdb"; if (TableName.Length > 9) { locale = TableName.Substring(9); if (!locale.Equals("ALPHABET") && !locale.Equals("JAPAN")) { locale += "_StrDB.sdb"; } } TableMetadata = new Variation(db.SpecDBFolderType, locale); } else if (TableName.StartsWith("RIDER_EQUIPMENT")) { string locale = "UnistrDB.sdb"; if (TableName.Length > 15) { locale = TableName.Substring(15); if (!locale.Equals("ALPHABET") && !locale.Equals("JAPAN")) { locale += "_StrDB.sdb"; } } TableMetadata = new RiderEquipment(db.SpecDBFolderType, locale); } else { switch (TableName) { case "AIR_CLEANER": TableMetadata = new AirCleaner(db.SpecDBFolderType); break; case "ALLOW_ENTRY": TableMetadata = new AllowEntry(db.SpecDBFolderType); break; case "ARCADEINFO_NORMAL": case "ARCADEINFO_TUNED": TableMetadata = new ArcadeInfoNormal(db.SpecDBFolderType); break; case "ASCC": TableMetadata = new ASCC(db.SpecDBFolderType); break; case "BRAKE": TableMetadata = new Brake(db.SpecDBFolderType); break; case "BRAKECONTROLLER": TableMetadata = new BrakeController(db.SpecDBFolderType); break; case "CATALYST": TableMetadata = new Catalyst(db.SpecDBFolderType); break; case "CLUTCH": TableMetadata = new Clutch(db.SpecDBFolderType); break; case "COMPUTER": TableMetadata = new Computer(db.SpecDBFolderType); break; case "COURSE": TableMetadata = new Course(db.SpecDBFolderType); break; case "CAR_CUSTOM_INFO": TableMetadata = new CarCustomInfo(db.SpecDBFolderType); break; case "DEFAULT_PARAM": TableMetadata = new DefaultParam(db.SpecDBFolderType); break; case "DEFAULT_PARTS": TableMetadata = new DefaultParts(db.SpecDBFolderType); break; case "DISPLACEMENT": TableMetadata = new Displacement(db.SpecDBFolderType); break; case "DRIVETRAIN": TableMetadata = new Drivetrain(db.SpecDBFolderType); break; case "ENGINE": TableMetadata = new Engine(db.SpecDBFolderType); break; case "EXHAUST_MANIFOLD": TableMetadata = new ExhaustManifold(db.SpecDBFolderType); break; case "FLYWHEEL": TableMetadata = new Flywheel(db.SpecDBFolderType); break; case "GEAR": TableMetadata = new Gear(db.SpecDBFolderType); break; case "MAKER": TableMetadata = new Maker(db.SpecDBFolderType); break; case "MODEL_INFO": TableMetadata = new ModelInfo(db.SpecDBFolderType); break; case "PAINT_COLOR_INFO": TableMetadata = new PaintColorInfo(db.SpecDBFolderType); break; case "GENERIC_CAR": TableMetadata = new GenericCar(db.SpecDBFolderType); break; case "FRONTTIRE": TableMetadata = new FrontTire(db.SpecDBFolderType); break; case "REARTIRE": TableMetadata = new RearTire(db.SpecDBFolderType); break; case "RACINGMODIFY": TableMetadata = new RacingModify(db.SpecDBFolderType); break; case "CHASSIS": TableMetadata = new Chassis(db.SpecDBFolderType); break; case "INTAKE_MANIFOLD": TableMetadata = new IntakeManifold(db.SpecDBFolderType); break; case "LIGHTWEIGHT": TableMetadata = new Lightweight(db.SpecDBFolderType); break; case "LSD": TableMetadata = new Lsd(db.SpecDBFolderType); break; case "MUFFLER": TableMetadata = new Muffler(db.SpecDBFolderType); break; case "NATUNE": TableMetadata = new Natune(db.SpecDBFolderType); break; case "NOS": TableMetadata = new NOS(db.SpecDBFolderType); break; case "PROPELLERSHAFT": TableMetadata = new PropellerShaft(db.SpecDBFolderType); break; case "RACE": TableMetadata = new Race(db.SpecDBFolderType); break; case "STEER": TableMetadata = new Steer(db.SpecDBFolderType); break; case "SUPERCHARGER": TableMetadata = new Supercharger(db.SpecDBFolderType); break; case "SUSPENSION": TableMetadata = new Suspension(db.SpecDBFolderType); break; case "TIRECOMPOUND": TableMetadata = new TireCompound(db.SpecDBFolderType); break; case "TURBINEKIT": TableMetadata = new TurbineKit(db.SpecDBFolderType); break; case "GENERIC_ITEMS": TableMetadata = new GenericItems(db.SpecDBFolderType); break; case "TUNED_CARS": TableMetadata = new TunedCars(db.SpecDBFolderType); break; case "TUNER": TableMetadata = new Tuner(db.SpecDBFolderType); break; case "WHEEL": TableMetadata = new Wheel(db.SpecDBFolderType); break; // Unmapped, but havent seen having rows case "TCSC": TableMetadata = new TCSC(db.SpecDBFolderType); break; case "TIREFORCEVOL": TableMetadata = new TireForceVol(db.SpecDBFolderType); break; case "GENERIC_CAR_INFO": TableMetadata = new GenericCarInfo(db.SpecDBFolderType); break; case "INDEP_THROTTLE": TableMetadata = new IndepThrottle(db.SpecDBFolderType); break; case "INTERCOOLER": TableMetadata = new Intercooler(db.SpecDBFolderType); break; case "PORTPOLISH": TableMetadata = new PortPolish(db.SpecDBFolderType); break; case "WING": TableMetadata = new Wing(db.SpecDBFolderType); break; case "TUNER_LIST": TableMetadata = new TunerList(db.SpecDBFolderType); break; case "TIRESIZE": TableMetadata = new TireSize(db.SpecDBFolderType); break; case "ENEMY_CARS": TableMetadata = new EnemyCars(db.SpecDBFolderType); break; case "ENGINEBALANCE": TableMetadata = new EngineBalance(db.SpecDBFolderType); break; case "RIDER_SET_ASSIGN": TableMetadata = new RiderSetAssign(db.SpecDBFolderType); break; case "RIDER_SET": TableMetadata = new RiderSet(db.SpecDBFolderType); break; default: throw new NotSupportedException($"This table ({TableName}) is not yet mapped."); } for (int i = 0; i < TableMetadata.Columns.Count; i++) { TableMetadata.Columns[i].ColumnIndex = i; } } }
public void AddressInitialize(SpecDB specDb) { //if (TableName.Equals("CAR_NAME_")) // TableName += specDb.LocaleName; var buffer = File.ReadAllBytes(Path.Combine(specDb.FolderName, TableName) + ".dbt"); SpanReader sr = new SpanReader(buffer); var magic = sr.ReadStringRaw(4); if (magic != "GTDB") { throw new InvalidDataException("DBT Table had invalid magic."); } ushort versionHigh = sr.ReadUInt16(); switch (versionHigh) { case 0x0001: case 0x0003: case 0x0103: case 0x0004: case 0x0104: sr.Endian = Endian.Little; break; case 0x0500: case 0x0700: case 0x0800: case 0x0801: sr.Endian = Endian.Big; break; } DBT = new DBT(buffer, sr.Endian); sr.Position = 4; versionHigh = sr.ReadUInt16(); sr.Position += 2; uint entryCount = sr.ReadUInt32(); if (sr.Length <= 32) { return; } sr.Position = (int)(DBT.HeaderSize + (entryCount * 8)); DBT.EntryInfoMapOffset = sr.Position; if ((versionHigh & 1) != 0) { DBT.RawEntryInfoMapOffset = sr.Position + 0x08; DBT.SearchTableOffset = sr.Position + 0x208; sr.Position += sr.ReadInt32(); DBT.DataMapOffset = sr.Position; DBT.RawDataMapOffset = sr.Position + 0x08; DBT.UnkOffset4 = sr.Position + sr.ReadInt32(); } else { DBT.UnkOffset4 = sr.Position; } }