diff --git a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml new file mode 100644 index 00000000..baec0694 --- /dev/null +++ b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml @@ -0,0 +1,20 @@ + + + + + + + + *.rsc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj index 4be246af..100c9cf3 100644 --- a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj +++ b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj @@ -41,6 +41,7 @@ + diff --git a/CSharp/Plugins/UniversalEditor.Plugins.KnowledgeAdventure/DataFormats/FileSystem/KnowledgeAdventure/RSC/RSCDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.KnowledgeAdventure/DataFormats/FileSystem/KnowledgeAdventure/RSC/RSCDataFormat.cs new file mode 100644 index 00000000..e056d602 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.KnowledgeAdventure/DataFormats/FileSystem/KnowledgeAdventure/RSC/RSCDataFormat.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.DataFormats.FileSystem.KnowledgeAdventure.RSC +{ + public class RSCDataFormat : DataFormat + { + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + string signature = reader.ReadFixedLengthString(6); + if (signature != "BWRF10") throw new InvalidDataFormatException("File does not begin with 'BWRF10'"); + + int fileCount = reader.ReadInt32(); + if (fileCount * 20 > reader.Accessor.Length) throw new InvalidDataFormatException("Number of files (" + fileCount.ToString() + ") does not make sense"); + + for (int i = 0; i < fileCount; i++) + { + string fileName = reader.ReadFixedLengthString(12).TrimNull(); + int offset = reader.ReadInt32(); + int length = reader.ReadInt32(); + + File file = new File(); + file.Name = fileName; + file.Size = length; + file.Properties.Add("reader", reader); + file.Properties.Add("offset", offset); + file.Properties.Add("length", length); + file.DataRequest += file_DataRequest; + fsom.Files.Add(file); + } + } + + private void file_DataRequest(object sender, DataRequestEventArgs e) + { + File file = (sender as File); + Reader reader = (Reader)file.Properties["reader"]; + int offset = (int)file.Properties["offset"]; + int length = (int)file.Properties["length"]; + reader.Seek(offset, SeekOrigin.Begin); + e.Data = reader.ReadBytes(length); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) throw new ObjectModelNotSupportedException(); + + Writer writer = base.Accessor.Writer; + writer.WriteFixedLengthString("BWRF10"); + writer.WriteInt32(fsom.Files.Count); + + int offset = 10; + for (int i = 0; i < fsom.Files.Count; i++) + { + offset += 20; + } + + for (int i = 0; i < fsom.Files.Count; i++) + { + writer.WriteFixedLengthString(fsom.Files[i].Name, 12); + writer.WriteInt32(offset); + + int length = (int)fsom.Files[i].Size; + writer.WriteInt32(length); + offset += length; + } + + for (int i = 0; i < fsom.Files.Count; i++) + { + byte[] data = fsom.Files[i].GetDataAsByteArray(); + writer.WriteBytes(data); + } + } + } +}