diff --git a/src/StarBreaker.DataCore.Generated/DataCoreBinaryGenerated.cs b/src/StarBreaker.DataCore.Generated/DataCoreBinaryGenerated.cs index 86383e4..abda016 100644 --- a/src/StarBreaker.DataCore.Generated/DataCoreBinaryGenerated.cs +++ b/src/StarBreaker.DataCore.Generated/DataCoreBinaryGenerated.cs @@ -5,7 +5,7 @@ namespace StarBreaker.DataCoreGenerated; //TODO: come up with a way of hashing the types we generated, then verify that the datacore file we're reading matches the types we have. // if they don't match we *WILL* fail to read it. We should throw before this. -public sealed partial class DataCoreBinaryGenerated : IDataCoreBinary +public sealed partial class DataCoreBinaryGenerated : IDataCoreBinary { public DataCoreDatabase Database { get; } @@ -14,14 +14,14 @@ public DataCoreBinaryGenerated(DataCoreDatabase database) Database = database; } - public IDataCoreReadable GetFromMainRecord(DataCoreRecord record) + public DataCoreTypedRecord GetFromMainRecord(DataCoreRecord record) { var data = ReadFromRecord(record.StructIndex, record.InstanceIndex); if (data == null) throw new InvalidOperationException($"Failed to read data from record {record}"); - return data; + return new DataCoreTypedRecord(record.GetFileName(Database), record.GetName(Database), record.Id, data); } public void SaveToFile(DataCoreRecord record, string path) diff --git a/src/StarBreaker.DataCore.Generated/DataCoreTypedRecord.cs b/src/StarBreaker.DataCore.Generated/DataCoreTypedRecord.cs new file mode 100644 index 0000000..b8c12b9 --- /dev/null +++ b/src/StarBreaker.DataCore.Generated/DataCoreTypedRecord.cs @@ -0,0 +1,10 @@ +using StarBreaker.Common; + +namespace StarBreaker.DataCoreGenerated; + +public record DataCoreTypedRecord( + string RecordFileName, + string RecordName, + CigGuid RecordId, + IDataCoreReadable Data +); \ No newline at end of file diff --git a/src/StarBreaker.Sandbox/DataCoreSandbox.cs b/src/StarBreaker.Sandbox/DataCoreSandbox.cs index d0ed872..dbea19a 100644 --- a/src/StarBreaker.Sandbox/DataCoreSandbox.cs +++ b/src/StarBreaker.Sandbox/DataCoreSandbox.cs @@ -16,36 +16,13 @@ public static void Run() //WriteJson(); } - private static void ExtractAll() - { - var timer = new TimeLogger(); - var dcb = DataForge.FromDcbXml(@"D:\StarCitizen\P4k\Data\Game2.dcb"); - timer.LogReset("Loaded DataForge"); - Directory.CreateDirectory(@"D:\StarCitizen\DataCore\Sandbox"); -#if DEBUG - dcb.ExtractAll(@"D:\StarCitizen\DataCore\Sandbox"); -#else - dcb.ExtractAllParallel(@"D:\StarCitizen\DataCore\Sandbox"); -#endif - timer.LogReset("Extracted all records."); - } - private static void ExtractProblematic() { var timer = new TimeLogger(); var dcb = DataForge.FromDcbXml(@"D:\StarCitizen\P4k\Data\Game2.dcb"); timer.LogReset("Loaded DataForge"); - - var yy = dcb.DataCore.Database.MainRecords - .AsParallel() - .Select(x => dcb.GetFromRecord(x)).ToArray(); - - timer.LogReset("Extracted all records."); - - return; - Directory.CreateDirectory(@"D:\StarCitizen\DataCore\Sandbox"); - + var megaMap = dcb.GetRecordsByFileName("*megamap.pu*").Values.Single(); var tagDatabase = dcb.GetRecordsByFileName("*TagDatabase*").Values.Single(); var broker = dcb.GetRecordsByFileName("*missionbroker.pu*").Values.Single(); @@ -70,28 +47,36 @@ private static void ExtractGenerated() var p4k = new P4kFileSystem(P4kFile.FromFile(@"C:\Program Files\Roberts Space Industries\StarCitizen\PTU\Data.p4k")); var dcbStream = p4k.OpenRead(@"Data\Game2.dcb"); - var df = new DataForge(new DataCoreBinaryGenerated(new DataCoreDatabase(dcbStream))); + var df = new DataForge(new DataCoreBinaryGenerated(new DataCoreDatabase(dcbStream))); timer.LogReset("Loaded DataForge"); - var megaMap = df.GetRecordsByFileName("*megamap.pu*").Values.Single(); - var tagDatabase = df.GetRecordsByFileName("*TagDatabase*").Values.Single(); - var broker = df.GetRecordsByFileName("*missionbroker.pu*").Values.Single(); - var unittest = df.GetRecordsByFileName("*unittesta*").Values.Single(); - var zeroggraph = df.GetRecordsByFileName("*playerzerogtraversalgraph*").Values.Single(); - var another = df.DataCore.Database.GetRecord(new CigGuid("04cd25f7-e0c6-4564-95ae-ecfc998e285f")); - var bruh = df.GetFromRecord(tagDatabase); - - var yy = df.DataCore.Database.MainRecords + var allRecords = df.DataCore.Database.MainRecords + .AsParallel() .Select(x => df.GetFromRecord(x)).ToList(); timer.LogReset("Extracted all records."); - var zeroGTraversalGraphs = yy.OfType().ToList(); - + var classDefinitions = allRecords.Where(r => r.Data is EntityClassDefinition).Select(r => r.Data as EntityClassDefinition).ToList(); + //var spaceships = classDefinitions.Where(x => x.Data.tags.Any(t => t?.tagName == "Ship")).ToList(); + Console.WriteLine(); } + + private static void ExtractXml() + { + var timer = new TimeLogger(); + var dcb = DataForge.FromDcbXml(@"D:\StarCitizen\P4k\Data\Game2.dcb"); + timer.LogReset("Loaded DataForge"); + Directory.CreateDirectory(@"D:\StarCitizen\DataCore\Sandbox"); +#if DEBUG + dcb.ExtractAll(@"D:\StarCitizen\DataCore\Sandbox"); +#else + dcb.ExtractAllParallel(@"D:\StarCitizen\DataCore\Sandbox"); +#endif + timer.LogReset("Extracted all records."); + } - private static void WriteJson() + private static void ExtractJson() { var timer = new TimeLogger(); var dcb = DataForge.FromDcbJson(@"D:\StarCitizen\P4k\Data\Game2.dcb");