156 lines
4.9 KiB
C#
156 lines
4.9 KiB
C#
|
using System.Linq;
|
||
|
using System.Xml;
|
||
|
using System.Xml.Linq;
|
||
|
using RoR2.Stats;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
public static class XmlUtility
|
||
|
{
|
||
|
private static XElement CreateStringField(string name, string value)
|
||
|
{
|
||
|
return new XElement(name, value);
|
||
|
}
|
||
|
|
||
|
private static XElement CreateUintField(string name, uint value)
|
||
|
{
|
||
|
return new XElement(name, TextSerialization.ToStringInvariant(value));
|
||
|
}
|
||
|
|
||
|
private static XElement CreateStatsField(string name, StatSheet statSheet)
|
||
|
{
|
||
|
XElement xElement = new XElement(name);
|
||
|
for (int i = 0; i < statSheet.fields.Length; i++)
|
||
|
{
|
||
|
XElement xElement2 = new XElement("stat", new XText(statSheet.fields[i].ToString()));
|
||
|
xElement2.SetAttributeValue("name", statSheet.fields[i].name);
|
||
|
xElement.Add(xElement2);
|
||
|
}
|
||
|
int unlockableCount = statSheet.GetUnlockableCount();
|
||
|
for (int j = 0; j < unlockableCount; j++)
|
||
|
{
|
||
|
UnlockableDef unlockable = statSheet.GetUnlockable(j);
|
||
|
XElement content = new XElement("unlock", new XText(unlockable.cachedName));
|
||
|
xElement.Add(content);
|
||
|
}
|
||
|
return xElement;
|
||
|
}
|
||
|
|
||
|
private static XElement CreateLoadoutField(string name, Loadout loadout)
|
||
|
{
|
||
|
return loadout.ToXml(name);
|
||
|
}
|
||
|
|
||
|
private static uint GetUintField(XElement container, string fieldName, uint defaultValue)
|
||
|
{
|
||
|
XElement xElement = container.Element(fieldName);
|
||
|
if (xElement != null)
|
||
|
{
|
||
|
XNode firstNode = xElement.FirstNode;
|
||
|
if (firstNode != null && firstNode.NodeType == XmlNodeType.Text)
|
||
|
{
|
||
|
if (!TextSerialization.TryParseInvariant(((XText)firstNode).Value, out uint result))
|
||
|
{
|
||
|
return defaultValue;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
return defaultValue;
|
||
|
}
|
||
|
|
||
|
private static string GetStringField(XElement container, string fieldName, string defaultValue)
|
||
|
{
|
||
|
XElement xElement = container.Element(fieldName);
|
||
|
if (xElement != null)
|
||
|
{
|
||
|
XNode firstNode = xElement.FirstNode;
|
||
|
if (firstNode != null && firstNode.NodeType == XmlNodeType.Text)
|
||
|
{
|
||
|
return ((XText)firstNode).Value;
|
||
|
}
|
||
|
}
|
||
|
return defaultValue;
|
||
|
}
|
||
|
|
||
|
private static void GetStatsField(XElement container, string fieldName, StatSheet dest)
|
||
|
{
|
||
|
XElement xElement = container.Element(fieldName);
|
||
|
if (xElement == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
foreach (XElement item in from element in xElement.Elements()
|
||
|
where element.Name == "stat"
|
||
|
select element)
|
||
|
{
|
||
|
string statName = item.Attributes().FirstOrDefault((XAttribute attribute) => attribute.Name == "name")?.Value;
|
||
|
string value = (item.Nodes().FirstOrDefault((XNode node) => node.NodeType == XmlNodeType.Text) as XText)?.Value;
|
||
|
dest.SetStatValueFromString(StatDef.Find(statName), value);
|
||
|
}
|
||
|
foreach (XElement item2 in from element in xElement.Elements()
|
||
|
where element.Name == "unlock"
|
||
|
select element)
|
||
|
{
|
||
|
UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef((item2.Nodes().FirstOrDefault((XNode node) => node.NodeType == XmlNodeType.Text) as XText)?.Value);
|
||
|
if (unlockableDef != null)
|
||
|
{
|
||
|
dest.AddUnlockable(unlockableDef);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void GetLoadoutField(XElement container, string fieldName, Loadout dest)
|
||
|
{
|
||
|
XElement xElement = container.Element(fieldName);
|
||
|
if (xElement != null)
|
||
|
{
|
||
|
Loadout loadout = new Loadout();
|
||
|
if (loadout.FromXml(xElement))
|
||
|
{
|
||
|
loadout.Copy(dest);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static XDocument ToXml(UserProfile userProfile)
|
||
|
{
|
||
|
object[] array = new object[UserProfile.saveFields.Length];
|
||
|
for (int i = 0; i < UserProfile.saveFields.Length; i++)
|
||
|
{
|
||
|
SaveFieldAttribute saveFieldAttribute = UserProfile.saveFields[i];
|
||
|
array[i] = CreateStringField(saveFieldAttribute.fieldName, saveFieldAttribute.getter(userProfile));
|
||
|
}
|
||
|
object[] element = new object[5]
|
||
|
{
|
||
|
CreateStatsField("stats", userProfile.statSheet),
|
||
|
CreateUintField("tutorialDifficulty", userProfile.tutorialDifficulty.showCount),
|
||
|
CreateUintField("tutorialEquipment", userProfile.tutorialEquipment.showCount),
|
||
|
CreateUintField("tutorialSprint", userProfile.tutorialSprint.showCount),
|
||
|
CreateLoadoutField("loadout", userProfile.loadout)
|
||
|
};
|
||
|
return new XDocument(new XElement("UserProfile", array.Append(element).ToArray()));
|
||
|
}
|
||
|
|
||
|
public static UserProfile FromXml(XDocument doc)
|
||
|
{
|
||
|
UserProfile userProfile = new UserProfile();
|
||
|
XElement root = doc.Root;
|
||
|
SaveFieldAttribute[] saveFields = UserProfile.saveFields;
|
||
|
foreach (SaveFieldAttribute saveFieldAttribute in saveFields)
|
||
|
{
|
||
|
string stringField = GetStringField(root, saveFieldAttribute.fieldName, null);
|
||
|
if (stringField != null)
|
||
|
{
|
||
|
saveFieldAttribute.setter(userProfile, stringField);
|
||
|
}
|
||
|
}
|
||
|
GetStatsField(root, "stats", userProfile.statSheet);
|
||
|
GetLoadoutField(root, "loadout", userProfile.loadout);
|
||
|
userProfile.tutorialDifficulty.showCount = GetUintField(root, "tutorialDifficulty", userProfile.tutorialDifficulty.showCount);
|
||
|
userProfile.tutorialEquipment.showCount = GetUintField(root, "tutorialEquipment", userProfile.tutorialEquipment.showCount);
|
||
|
userProfile.tutorialSprint.showCount = GetUintField(root, "tutorialSprint", userProfile.tutorialSprint.showCount);
|
||
|
return userProfile;
|
||
|
}
|
||
|
}
|