YDR/YDD/YFT/YPT/XML conversion progress

This commit is contained in:
dexy
2020-01-18 04:20:40 +11:00
Unverified
parent f81958679a
commit cd4c87cd71
9 changed files with 965 additions and 223 deletions
@@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CodeWalker.GameFiles
{
@@ -93,4 +94,68 @@ namespace CodeWalker.GameFiles
}
}
public class YddXml : MetaXmlBase
{
public static string GetXml(YddFile ydd, string outputFolder = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(XmlHeader);
var ddsfolder = outputFolder;
if (!string.IsNullOrEmpty(ddsfolder))
{
ddsfolder = Path.Combine(outputFolder, ydd.Name);
if (!Directory.Exists(ddsfolder))
{
Directory.CreateDirectory(ddsfolder);
}
}
if (ydd?.DrawableDict != null)
{
DrawableDictionary.WriteXmlNode(ydd.DrawableDict, sb, 0, ddsfolder);
}
return sb.ToString();
}
}
public class XmlYdd
{
public static YddFile GetYdd(string xml, string inputFolder = "")
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return GetYdd(doc, inputFolder);
}
public static YddFile GetYdd(XmlDocument doc, string inputFolder = "")
{
YddFile r = new YddFile();
var ddsfolder = inputFolder;
var node = doc.DocumentElement;
if (node != null)
{
r.DrawableDict = DrawableDictionary.ReadXmlNode(node, ddsfolder);
}
r.Name = Path.GetFileName(inputFolder);
return r;
}
}
}
@@ -4,6 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CodeWalker.GameFiles
{
@@ -62,5 +63,64 @@ namespace CodeWalker.GameFiles
public class YdrXml : MetaXmlBase
{
public static string GetXml(YdrFile ydr, string outputFolder = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(XmlHeader);
var ddsfolder = outputFolder;
if (!string.IsNullOrEmpty(ddsfolder))
{
ddsfolder = Path.Combine(outputFolder, ydr.Name);
if (!Directory.Exists(ddsfolder))
{
Directory.CreateDirectory(ddsfolder);
}
}
if (ydr?.Drawable != null)
{
Drawable.WriteXmlNode(ydr.Drawable, sb, 0, ddsfolder);
}
return sb.ToString();
}
}
public class XmlYdr
{
public static YdrFile GetYdr(string xml, string inputFolder = "")
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return GetYdr(doc, inputFolder);
}
public static YdrFile GetYdr(XmlDocument doc, string inputFolder = "")
{
YdrFile r = new YdrFile();
var ddsfolder = inputFolder;
var node = doc.DocumentElement;
if (node != null)
{
r.Drawable = Drawable.ReadXmlNode(node, ddsfolder);
}
r.Name = Path.GetFileName(inputFolder);
return r;
}
}
}
@@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CodeWalker.GameFiles
{
@@ -61,4 +62,70 @@ namespace CodeWalker.GameFiles
}
public class YftXml : MetaXmlBase
{
public static string GetXml(YftFile yft, string outputFolder = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(XmlHeader);
var ddsfolder = outputFolder;
if (!string.IsNullOrEmpty(ddsfolder))
{
ddsfolder = Path.Combine(outputFolder, yft.Name);
if (!Directory.Exists(ddsfolder))
{
Directory.CreateDirectory(ddsfolder);
}
}
if (yft?.Fragment != null)
{
FragType.WriteXmlNode(yft.Fragment, sb, 0, ddsfolder);
}
return sb.ToString();
}
}
public class XmlYft
{
public static YftFile GetYft(string xml, string inputFolder = "")
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return GetYft(doc, inputFolder);
}
public static YftFile GetYft(XmlDocument doc, string inputFolder = "")
{
YftFile r = new YftFile();
var ddsfolder = inputFolder;
var node = doc.DocumentElement;
if (node != null)
{
r.Fragment = FragType.ReadXmlNode(node, ddsfolder);
}
r.Name = Path.GetFileName(inputFolder);
return r;
}
}
}
+84 -18
View File
@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CodeWalker.GameFiles
{
@@ -50,12 +52,29 @@ namespace CodeWalker.GameFiles
}
BuildDrawableDict();
Loaded = true;
}
public byte[] Save()
{
byte[] data = ResourceBuilder.Build(PtfxList, 68); //ypt is type/version 68...
return data;
}
private void BuildDrawableDict()
{
var dDict = PtfxList?.DrawableDictionary;
if ((dDict != null) &&
(dDict.Drawables != null) &&
(dDict.Drawables.data_items != null) &&
(dDict.Hashes != null))
if ((dDict?.Drawables?.data_items != null) && (dDict?.Hashes != null))
{
DrawableDict = new Dictionary<uint, Drawable>();
var drawables = dDict.Drawables.data_items;
@@ -85,29 +104,76 @@ namespace CodeWalker.GameFiles
}
}
}
}
Loaded = true;
}
public byte[] Save()
{
byte[] data = ResourceBuilder.Build(PtfxList, 68); //ypt is type/version 68...
return data;
}
}
public class YptXml : MetaXmlBase
{
public static string GetXml(YptFile ypt, string outputFolder = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(XmlHeader);
var ddsfolder = outputFolder;
if (!string.IsNullOrEmpty(ddsfolder))
{
ddsfolder = Path.Combine(outputFolder, ypt.Name);
if (!Directory.Exists(ddsfolder))
{
Directory.CreateDirectory(ddsfolder);
}
}
if (ypt?.PtfxList != null)
{
ParticleEffectsList.WriteXmlNode(ypt.PtfxList, sb, 0, ddsfolder);
}
return sb.ToString();
}
}
public class XmlYpt
{
public static YptFile GetYpt(string xml, string inputFolder = "")
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return GetYpt(doc, inputFolder);
}
public static YptFile GetYpt(XmlDocument doc, string inputFolder = "")
{
YptFile r = new YptFile();
var ddsfolder = inputFolder;
var node = doc.DocumentElement;
if (node != null)
{
r.PtfxList = ParticleEffectsList.ReadXmlNode(node, ddsfolder);
}
r.Name = Path.GetFileName(inputFolder);
return r;
}
}
}
@@ -71,6 +71,26 @@ namespace CodeWalker.GameFiles
YtdFile ytd = RpfFile.GetFile<YtdFile>(e, data);
return GetXml(ytd, out filename, outputfolder);
}
else if (fnl.EndsWith(".ydr"))
{
YdrFile ydr = RpfFile.GetFile<YdrFile>(e, data);
return GetXml(ydr, out filename, outputfolder);
}
else if (fnl.EndsWith(".ydd"))
{
YddFile ydd = RpfFile.GetFile<YddFile>(e, data);
return GetXml(ydd, out filename, outputfolder);
}
else if (fnl.EndsWith(".yft"))
{
YftFile yft = RpfFile.GetFile<YftFile>(e, data);
return GetXml(yft, out filename, outputfolder);
}
else if (fnl.EndsWith(".ypt"))
{
YptFile ypt = RpfFile.GetFile<YptFile>(e, data);
return GetXml(ypt, out filename, outputfolder);
}
filename = fn;
return string.Empty;
}
@@ -154,6 +174,30 @@ namespace CodeWalker.GameFiles
filename = fn + ".xml";
return YtdXml.GetXml(ytd, outputfolder);
}
public static string GetXml(YdrFile ydr, out string filename, string outputfolder)
{
var fn = (ydr?.Name) ?? "";
filename = fn + ".xml";
return YdrXml.GetXml(ydr, outputfolder);
}
public static string GetXml(YddFile ydd, out string filename, string outputfolder)
{
var fn = (ydd?.Name) ?? "";
filename = fn + ".xml";
return YddXml.GetXml(ydd, outputfolder);
}
public static string GetXml(YftFile yft, out string filename, string outputfolder)
{
var fn = (yft?.Name) ?? "";
filename = fn + ".xml";
return YftXml.GetXml(yft, outputfolder);
}
public static string GetXml(YptFile ypt, out string filename, string outputfolder)
{
var fn = (ypt?.Name) ?? "";
filename = fn + ".xml";
return YptXml.GetXml(ypt, outputfolder);
}
@@ -2041,6 +2085,10 @@ namespace CodeWalker.GameFiles
Ycd = 7,
Ybn = 8,
Ytd = 9,
Ydr = 10,
Ydd = 11,
Yft = 12,
Ypt = 13,
}
}
File diff suppressed because it is too large Load Diff
+47 -21
View File
@@ -31,7 +31,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CodeWalker.GameFiles
{
@@ -123,9 +123,6 @@ namespace CodeWalker.GameFiles
public YftFile Yft { get; set; }
/// <summary>
/// Reads the data-block from a stream.
/// </summary>
public override void Read(ResourceDataReader reader, params object[] parameters)
{
base.Read(reader, parameters);
@@ -250,10 +247,6 @@ namespace CodeWalker.GameFiles
}
/// <summary>
/// Writes the data-block to a stream.
/// </summary>
public override void Write(ResourceDataWriter writer, params object[] parameters)
{
base.Write(writer, parameters);
@@ -332,10 +325,29 @@ namespace CodeWalker.GameFiles
writer.Write(this.Unknown_128h);
writer.Write(this.Unknown_12Ch);
}
public void WriteXml(StringBuilder sb, int indent, string ddsfolder)
{
//TODO
}
public void ReadXml(XmlNode node, string ddsfolder)
{
//TODO
}
public static void WriteXmlNode(FragType f, StringBuilder sb, int indent, string ddsfolder, string name = "Fragment")
{
if (f == null) return;
YftXml.OpenTag(sb, indent, name);
f.WriteXml(sb, indent + 1, ddsfolder);
YftXml.CloseTag(sb, indent, name);
}
public static FragType ReadXmlNode(XmlNode node, string ddsfolder)
{
if (node == null) return null;
var f = new FragType();
f.ReadXml(node, ddsfolder);
return f;
}
/// <summary>
/// Returns a list of data blocks which are referenced by this block.
/// </summary>
public override IResourceBlock[] GetReferences()
{
var list = new List<IResourceBlock>(base.GetReferences());
@@ -413,9 +425,6 @@ namespace CodeWalker.GameFiles
private ResourceSystemStructBlock<Matrix> Unknown_108h_DataBlock = null;
private string_r NameBlock = null;
/// <summary>
/// Reads the data-block from a stream.
/// </summary>
public override void Read(ResourceDataReader reader, params object[] parameters)
{
base.Read(reader, parameters);
@@ -465,10 +474,6 @@ namespace CodeWalker.GameFiles
if (FragMatrices != null)
{ }
}
/// <summary>
/// Writes the data-block to a stream.
/// </summary>
public override void Write(ResourceDataWriter writer, params object[] parameters)
{
base.Write(writer, parameters);
@@ -508,10 +513,31 @@ namespace CodeWalker.GameFiles
writer.Write(this.Unknown_148h);
writer.Write(this.Unknown_14Ch);
}
public override void WriteXml(StringBuilder sb, int indent, string ddsfolder)
{
base.WriteXml(sb, indent, ddsfolder);
//TODO
}
public override void ReadXml(XmlNode node, string ddsfolder)
{
base.ReadXml(node, ddsfolder);
//TODO
}
public static void WriteXmlNode(FragDrawable d, StringBuilder sb, int indent, string ddsfolder, string name = "FragDrawable")
{
if (d == null) return;
YftXml.OpenTag(sb, indent, name);
d.WriteXml(sb, indent + 1, ddsfolder);
YftXml.CloseTag(sb, indent, name);
}
public static FragDrawable ReadXmlNode(XmlNode node, string ddsfolder)
{
if (node == null) return null;
var d = new FragDrawable();
d.ReadXml(node, ddsfolder);
return d;
}
/// <summary>
/// Returns a list of data blocks which are referenced by this block.
/// </summary>
public override IResourceBlock[] GetReferences()
{
var list = new List<IResourceBlock>(base.GetReferences());
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using TC = System.ComponentModel.TypeConverterAttribute;
using EXP = System.ComponentModel.ExpandableObjectConverter;
@@ -110,7 +111,6 @@ namespace CodeWalker.GameFiles
this.EffectRuleDictionaryPointer // offset
);
}
public override void Write(ResourceDataWriter writer, params object[] parameters)
{
base.Write(writer, parameters);
@@ -139,6 +139,28 @@ namespace CodeWalker.GameFiles
writer.Write(this.Unknown_58h);
writer.Write(this.Unknown_5Ch);
}
public void WriteXml(StringBuilder sb, int indent, string ddsfolder)
{
//TODO
}
public void ReadXml(XmlNode node, string ddsfolder)
{
//TODO
}
public static void WriteXmlNode(ParticleEffectsList p, StringBuilder sb, int indent, string ddsfolder, string name = "ParticleEffectsList")
{
if (p == null) return;
YptXml.OpenTag(sb, indent, name);
p.WriteXml(sb, indent + 1, ddsfolder);
YptXml.CloseTag(sb, indent, name);
}
public static ParticleEffectsList ReadXmlNode(XmlNode node, string ddsfolder)
{
if (node == null) return null;
var p = new ParticleEffectsList();
p.ReadXml(node, ddsfolder);
return p;
}
public override IResourceBlock[] GetReferences()
{