From 974e9b33250b053b2b940c6037fd268bb07cac68 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 17 May 2013 22:50:04 +1200 Subject: [PATCH] Write XCC compatible mix files. --- .../FileFormats/XccLocalDatabase.cs | 30 +++++++++++++++++++ OpenRA.FileFormats/Filesystem/MixFile.cs | 4 +-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/OpenRA.FileFormats/FileFormats/XccLocalDatabase.cs b/OpenRA.FileFormats/FileFormats/XccLocalDatabase.cs index f75c5b4063..a117823d18 100644 --- a/OpenRA.FileFormats/FileFormats/XccLocalDatabase.cs +++ b/OpenRA.FileFormats/FileFormats/XccLocalDatabase.cs @@ -10,6 +10,8 @@ using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Text; namespace OpenRA.FileFormats { @@ -33,5 +35,33 @@ namespace OpenRA.FileFormats Entries[i] = new string(chars.ToArray()); } } + + public XccLocalDatabase(IEnumerable filenames) + { + Entries = filenames.ToArray(); + } + + public byte[] Data() + { + var data = new MemoryStream(); + using (var writer = new BinaryWriter(data)) + { + writer.Write(Encoding.ASCII.GetBytes("XCC by Olaf van der Spek")); + writer.Write(new byte[] {0x1A,0x04,0x17,0x27,0x10,0x19,0x80,0x00}); + + writer.Write((int)(Entries.Aggregate(Entries.Length, (a,b) => a + b.Length) + 52)); // Size + writer.Write((int)0); // Type + writer.Write((int)0); // Version + writer.Write((int)0); // Game/Format (0 == TD) + writer.Write((int)Entries.Length); // Entries + foreach (var e in Entries) + { + writer.Write(Encoding.ASCII.GetBytes(e)); + writer.Write((byte)0); + } + } + + return data.ToArray(); + } } } \ No newline at end of file diff --git a/OpenRA.FileFormats/Filesystem/MixFile.cs b/OpenRA.FileFormats/Filesystem/MixFile.cs index 10679de967..8e32eb46a4 100644 --- a/OpenRA.FileFormats/Filesystem/MixFile.cs +++ b/OpenRA.FileFormats/Filesystem/MixFile.cs @@ -39,8 +39,8 @@ namespace OpenRA.FileFormats File.Delete(filename); s = File.Create(filename); - - // TODO: Add a local mix database.dat for compatibility with XCC Mixer + index = new Dictionary(); + contents.Add("local mix database.dat", new XccLocalDatabase(contents.Keys.Append("local mix database.dat")).Data()); Write(contents); }