diff --git a/src/StarBreaker.Cli/Properties/launchSettings.json b/src/StarBreaker.Cli/Properties/launchSettings.json index c1f8cce..71ed5d2 100644 --- a/src/StarBreaker.Cli/Properties/launchSettings.json +++ b/src/StarBreaker.Cli/Properties/launchSettings.json @@ -10,11 +10,7 @@ }, "p4k-extract": { "commandName": "Project", - "commandLineArgs": "p4k-extract --p4k \"C:\\Program Files\\Roberts Space Industries\\StarCitizen\\4.0_PREVIEW\\Data.p4k\" --output \"D:\\StarCitizen\\p4keptu\"" - }, - "p4k-extract-datacore": { - "commandName": "Project", - "commandLineArgs": "p4k-extract --p4k \"C:\\Program Files\\Roberts Space Industries\\StarCitizen\\4.0_PREVIEW\\Data.p4k\" --output \"D:\\StarCitizen\\p4keptu\" --filter \"*.dcb\"" + "commandLineArgs": "p4k-extract --p4k \"C:\\Program Files\\Roberts Space Industries\\StarCitizen\\4.0_PREVIEW\\Data.p4k\" --output \"D:\\StarCitizen\\P4k\"" }, "chf-download": { "commandName": "Project", diff --git a/src/StarBreaker.CryXmlB/CryXml.cs b/src/StarBreaker.CryXmlB/CryXml.cs index cc93325..d60e0f0 100644 --- a/src/StarBreaker.CryXmlB/CryXml.cs +++ b/src/StarBreaker.CryXmlB/CryXml.cs @@ -87,100 +87,16 @@ private static string GetString(Span data, int offset) var length = relevantData.IndexOf((byte)'\0'); if (length == 0) - return ""; + return "empty"; return Encoding.ASCII.GetString(relevantData[..length]); } - public void WriteXmlFast(TextWriter writer) + public override string ToString() { - if (_nodes[0].ParentIndex != -1) - throw new Exception("Root node has parent"); - - writer.WriteLine(""); - WriteXmlElementFast(writer, 0, 0); - } - - private void WriteXmlElementFast(TextWriter writer, int depth, int nodeIndex) - { - var node = _nodes[nodeIndex]; - - for (var i = 0; i < depth; i++) - { - writer.Write(' '); - writer.Write(' '); - } - - writer.Write('<'); - if (writer.WriteXmlString(_stringData, (int)node.TagStringOffset) == 0) - writer.Write("__unknown__"); - - var attributes = _attributes.AsSpan(node.FirstAttributeIndex, node.AttributeCount); - foreach (var attribute in attributes) - { - writer.Write(' '); - writer.WriteXmlString(_stringData, (int)attribute.KeyStringOffset); - writer.Write('='); - writer.Write('\"'); - writer.WriteXmlString(_stringData, (int)attribute.ValueStringOffset); - writer.Write('\"'); - } - - var stringElementLength = _stringData.AsSpan((int)node.ItemType).IndexOf((byte)'\0'); - var hasStringElement = stringElementLength != 0; - var hasChildren = node.ChildCount != 0; - - if (!hasChildren && !hasStringElement) - { - writer.Write(' '); - writer.Write('/'); - writer.WriteLine('>'); - return; - } - - writer.Write('>'); - - if (hasStringElement && !hasChildren) - { - writer.WriteXmlString(_stringData, (int)node.ItemType); - writer.Write('<'); - writer.Write('/'); - writer.WriteXmlString(_stringData, (int)node.TagStringOffset); - writer.WriteLine('>'); - return; - } - - if (hasStringElement) - { - writer.WriteLine(); - writer.WriteXmlString(_stringData, (int)node.ItemType); - writer.WriteLine(); - } - - if (!hasStringElement && hasChildren) - { - writer.WriteLine(); - } - - var childIndices = _childIndices.AsSpan(node.FirstChildIndex, node.ChildCount); - foreach (var childIndex in childIndices) - { - WriteXmlElementFast(writer, depth + 1, childIndex); - } - - for (var i = 0; i < depth; i++) - { - writer.Write(' '); - writer.Write(' '); - } - - writer.Write('<'); - writer.Write('/'); - writer.WriteXmlString(_stringData, (int)node.TagStringOffset); - - if (nodeIndex == 0) - writer.Write('>'); - else - writer.WriteLine('>'); + var sb = new StringBuilder(); + using var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true }); + WriteXml(writer); + return sb.ToString(); } } \ No newline at end of file diff --git a/src/StarBreaker.CryXmlB/TextWriterExtensions.cs b/src/StarBreaker.CryXmlB/TextWriterExtensions.cs deleted file mode 100644 index 3db79f2..0000000 --- a/src/StarBreaker.CryXmlB/TextWriterExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Buffers; -using System.Text; - -namespace StarBreaker.CryXmlB; - -public static class TextWriterExtensions -{ - private static readonly SearchValues _escapeCharacters = SearchValues.Create(['<', '>', '&', '\'', '"']); - - public static int WriteXmlString(this TextWriter writer, ReadOnlySpan data, int offset) - { - var relevantData = data[offset..]; - var length = relevantData.IndexOf((byte)'\0'); - - if (length == 0) - return length; - - Span span = stackalloc char[length]; - Encoding.ASCII.GetChars(relevantData[..length], span); - - var escapeCount = span.IndexOfAny(_escapeCharacters); - if (escapeCount == -1) - { - //nothing we need to escape, happy path. just write the span. - writer.Write(span); - return length; - } - - //we have to escape some characters. don't worry about performance too much here - var str = span.ToString(); - var replaced = str - .Replace("&", "&") - .Replace("<", "<") - .Replace(">", ">") - .Replace("'", "'") - .Replace("\"", """); - - writer.Write(replaced); - - return replaced.Length; - } -} \ No newline at end of file diff --git a/src/StarBreaker.DataCore/DataCoreBinary.cs b/src/StarBreaker.DataCore/DataCoreBinary.cs index 23c7157..fb2364c 100644 --- a/src/StarBreaker.DataCore/DataCoreBinary.cs +++ b/src/StarBreaker.DataCore/DataCoreBinary.cs @@ -173,11 +173,6 @@ private XElement GetFromInstance(int structIndex, int instanceIndex, DataCoreExt var reader = Database.GetReader(Database.Offsets[structIndex][instanceIndex]); var element = GetFromStruct(structIndex, ref reader, context); - //TODO: make this configurable? - // Popping it here makes it repeat the same data more often. - // If we leave it in the stack (could be a HashSet), it will only ever print the same data once per file. - //context.Tracker.Pop(); - // add some metadata to the element, mostly so we can figure out what a CircularReference is pointing to element.Add(new XAttribute("__structIndex", structIndex.ToString(CultureInfo.InvariantCulture))); element.Add(new XAttribute("__instanceIndex", instanceIndex.ToString(CultureInfo.InvariantCulture))); diff --git a/src/StarBreaker.P4k/P4kFile.cs b/src/StarBreaker.P4k/P4kFile.cs index b7d9c20..752e874 100644 --- a/src/StarBreaker.P4k/P4kFile.cs +++ b/src/StarBreaker.P4k/P4kFile.cs @@ -208,8 +208,9 @@ public void Extract(string outputDir, string? filter = null, IProgress? return; Directory.CreateDirectory(Path.GetDirectoryName(entryPath) ?? throw new InvalidOperationException()); - - using (var writeStream = new FileStream(entryPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: (int)entry.UncompressedSize, useAsync: true)) + var sss = (int)entry.UncompressedSize; + using (var writeStream = new FileStream(entryPath, FileMode.Create, FileAccess.Write, FileShare.None, + bufferSize: entry.UncompressedSize > int.MaxValue ? 81920 : (int)entry.UncompressedSize, useAsync: true)) { using (var entryStream = Open(entry)) { diff --git a/src/StarBreaker.Sandbox/ChfProcessing.cs b/src/StarBreaker.Sandbox/ChfProcessing.cs index cddeb69..c61a155 100644 --- a/src/StarBreaker.Sandbox/ChfProcessing.cs +++ b/src/StarBreaker.Sandbox/ChfProcessing.cs @@ -1,12 +1,20 @@ using System.Text; +using StarBreaker.Chf; using StarBreaker.Common; -namespace StarBreaker.Chf; +namespace StarBreaker.Sandbox; -public class DebugCommand +public static class ChfProcessing { - public async ValueTask ExecuteAsync() + public static async Task Run() { + var dnas = @"C:\Users\Diogo\Desktop\dnas.txt"; + var load = (await File.ReadAllLinesAsync(dnas)).Select(FixWeirdDnaString).ToArray(); + int i = 0; + await CreateCharactersFromDnaStrings(load.Select(x => ($"female_{i++}.chf", x))); + + return; + await FixDnaStrings(); var hugeData = Path.Combine(DefaultPaths.ResearchFolder, "dna", "huge_fixed.csv"); diff --git a/src/StarBreaker.Sandbox/Program.cs b/src/StarBreaker.Sandbox/Program.cs index b202d7b..00b9526 100644 --- a/src/StarBreaker.Sandbox/Program.cs +++ b/src/StarBreaker.Sandbox/Program.cs @@ -5,10 +5,12 @@ //Project just so I can run throwaway code without adding a project for each thing. + +await ChfProcessing.Run(); //ExtractChunkFiles.Run(); //ExtractSocPak.Run(); //await GrpcClient.RunAsync(); //TimeP4kExtract.Run(); -TagDatabase.Run(); +//TagDatabase.Run(); //StringCrc32c.Run(); //DdsUnsplit.Run(); \ No newline at end of file