2025-09-17 16:40:02 -07:00

63 lines
2.0 KiB
C#

using AssetRipper.IO.Files.SerializedFiles;
namespace AssetRipper.AssemblyDumper;
internal class UniversalNodeComparer
{
private const TransferMetaFlags MetaMask = TransferMetaFlags.TreatIntegerValueAsBoolean
| TransferMetaFlags.AlignBytes
| TransferMetaFlags.TransferUsingFlowMappingStyle;
public static bool Equals(UniversalNode? left, UniversalNode? right, bool root)
{
if (left is null || right is null)
{
return left is null && right is null;
}
if (!root && left.OriginalName != right.OriginalName) //The root nodes will most likely not have the same name
{
//Console.WriteLine($"\tInequal because original name {left.OriginalName} doesn't match {right.OriginalName}");
return false;
}
if (!root && left.Name != right.Name) //The root nodes will most likely not have the same name
{
//Console.WriteLine($"\tInequal because name {left.Name} doesn't match {right.Name}");
return false;
}
if (left.OriginalTypeName != right.OriginalTypeName)
{
//Console.WriteLine($"\tInequal because original type name {left.OriginalTypeName} doesn't match {right.OriginalTypeName}");
return false;
}
if (left.TypeName != right.TypeName)
{
//Console.WriteLine($"\tInequal because type name {left.TypeName} doesn't match {right.TypeName}");
return false;
}
if (left.Version != right.Version)
{
//Console.WriteLine($"\tInequal because version {left.Version} doesn't match {right.Version}");
return false;
}
if (!root && (left.MetaFlag & MetaMask) != (right.MetaFlag & MetaMask))
//if (!root && left.MetaFlag != right.MetaFlag)
{
//Console.WriteLine($"\tInequal because meta flag {left.MetaFlag} doesn't match {right.MetaFlag}");
return false;
}
if (left.SubNodes!.Count != right.SubNodes!.Count)
{
//Console.WriteLine($"\tInequal because subnode count {left.SubNodes.Count} doesn't match {right.SubNodes.Count}");
return false;
}
for (int i = 0; i < left.SubNodes.Count; i++)
{
if (!Equals(left.SubNodes[i], right.SubNodes[i], false))
{
return false;
}
}
return true;
}
}