Added '187 Ride or Die MFD' DataFormat to FileSystem plugin

This commit is contained in:
Michael Becker 2014-06-07 18:24:17 -04:00
parent e382650d03
commit d62f62d5c8
2 changed files with 91 additions and 0 deletions

View File

@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.IO;
using UniversalEditor.ObjectModels.FileSystem;
namespace UniversalEditor.DataFormats.FileSystem.MFD
{
public class MFDDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("187 Ride or Die MFD archive", new string[] { "*.mfd" });
_dfr.Sources.Add("http://wiki.xentax.com/index.php?title=GRAF:187_Ride_Or_Die_MFD");
}
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;
uint fileCount = reader.ReadUInt32();
for (uint i = 0; i < fileCount; i++)
{
uint fileID = reader.ReadUInt32();
uint offset = reader.ReadUInt32();
uint length = reader.ReadUInt32();
File file = new File();
file.Name = i.ToString().PadLeft(8, '0');
file.Size = length;
file.DataRequest += file_DataRequest;
file.Properties.Add("reader", reader);
file.Properties.Add("offset", offset);
file.Properties.Add("length", length);
fsom.Files.Add(file);
}
}
private void file_DataRequest(object sender, DataRequestEventArgs e)
{
File file = (sender as File);
Reader reader = (Reader)file.Properties["reader"];
uint offset = (uint)file.Properties["offset"];
uint length = (uint)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();
File[] files = fsom.GetAllFiles();
Writer writer = base.Accessor.Writer;
writer.WriteUInt32((uint)files.Length);
uint offset = (uint)(4 + (12 * files.Length));
foreach (File file in files)
{
uint fileID = (uint)Array.IndexOf(files, file);
writer.WriteUInt32(fileID);
uint length = (uint)file.Size;
writer.WriteUInt32(offset);
writer.WriteUInt32(length);
offset += length + (length % 4);
}
foreach (File file in files)
{
writer.WriteBytes(file.GetDataAsByteArray());
writer.Align(4);
}
writer.Flush();
}
}
}

View File

@ -96,6 +96,7 @@
<Compile Include="DataFormats\FileSystem\JadeEmpire\RIMDataFormat.cs" />
<Compile Include="DataFormats\FileSystem\MementoMori\RESCompressionType.cs" />
<Compile Include="DataFormats\FileSystem\MementoMori\RESDataFormat.cs" />
<Compile Include="DataFormats\FileSystem\MFD\MFDDataFormat.cs" />
<Compile Include="DataFormats\FileSystem\Moero\DownhillNight\PKDDataFormat.cs" />
<Compile Include="DataFormats\FileSystem\MoPaQ\Internal\HETTable.cs" />
<Compile Include="DataFormats\FileSystem\MoPaQ\Internal\MPQHeader.cs" />