r2mods/ilspy_dump/ror2_csproj/RoR2/XmlUtility.cs

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;
}
}