Browse Source

mii: Fix multiple inconsistencies (#2392)

I found multiple inconsistencies while diffing with latest sdb, this PR fixes those findings.
Mary 4 years ago
parent
commit
e334303559

+ 7 - 2
Ryujinx.HLE/HOS/Services/Mii/Helper.cs

@@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii
 {
     static class Helper
     {
-        public static ushort CalculateCrc16BE(ReadOnlySpan<byte> data, int crc = 0)
+        public static ushort CalculateCrc16(ReadOnlySpan<byte> data, int crc, bool reverseEndianess)
         {
             const ushort poly = 0x1021;
 
@@ -25,7 +25,12 @@ namespace Ryujinx.HLE.HOS.Services.Mii
                 }
             }
 
-            return BinaryPrimitives.ReverseEndianness((ushort)crc);
+            if (reverseEndianess)
+            {
+                return (ushort)(BinaryPrimitives.ReverseEndianness(crc) >> 16);
+            }
+
+            return (ushort)crc;
         }
 
         public static UInt128 GetDeviceId()

+ 20 - 20
Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs

@@ -416,35 +416,35 @@ namespace Ryujinx.HLE.HOS.Services.Mii
                 return ResultCode.InvalidStoreData;
             }
 
-            if (!metadata.MiiKeyCode.IsEnabledSpecialMii() && !storeData.IsSpecial())
+            if (!metadata.MiiKeyCode.IsEnabledSpecialMii() && storeData.IsSpecial())
             {
-                if (_database.GetIndexByCreatorId(out int index, storeData.CreateId))
-                {
-                    StoreData oldStoreData = _database.Get(index);
+                return ResultCode.InvalidOperationOnSpecialMii;
+            }
 
-                    if (oldStoreData.IsSpecial())
-                    {
-                        return ResultCode.InvalidOperationOnSpecialMii;
-                    }
+            if (_database.GetIndexByCreatorId(out int index, storeData.CreateId))
+            {
+                StoreData oldStoreData = _database.Get(index);
 
-                    _database.Replace(index, storeData);
-                }
-                else
+                if (oldStoreData.IsSpecial())
                 {
-                    if (_database.IsFull())
-                    {
-                        return ResultCode.DatabaseFull;
-                    }
-
-                    _database.Add(storeData);
+                    return ResultCode.InvalidOperationOnSpecialMii;
                 }
 
-                MarkDirty(metadata);
+                _database.Replace(index, storeData);
+            }
+            else
+            {
+                if (_database.IsFull())
+                {
+                    return ResultCode.DatabaseFull;
+                }
 
-                return ResultCode.Success;
+                _database.Add(storeData);
             }
 
-            return ResultCode.InvalidOperationOnSpecialMii;
+            MarkDirty(metadata);
+
+            return ResultCode.Success;
         }
 
         public ResultCode Delete(DatabaseSessionMetadata metadata, CreateId createId)

+ 1 - 1
Ryujinx.HLE/HOS/Services/Mii/Types/CoreData.cs

@@ -588,7 +588,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types
             Nickname        = charInfo.Nickname;
             FontRegion      = charInfo.FontRegion;
             FavoriteColor   = charInfo.FavoriteColor;
-            Gender          = (Gender)charInfo.Gender;
+            Gender          = charInfo.Gender;
             Height          = charInfo.Height;
             Build           = charInfo.Build;
             Type            = charInfo.Type;

+ 1 - 1
Ryujinx.HLE/HOS/Services/Mii/Types/NintendoFigurineDatabase.cs

@@ -233,7 +233,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types
 
         private ushort CalculateCrc()
         {
-            return Helper.CalculateCrc16BE(AsSpanWithoutCrc());
+            return Helper.CalculateCrc16(AsSpanWithoutCrc(), 0, true);
         }
 
         public Span<byte> AsSpan()

+ 9 - 10
Ryujinx.HLE/HOS/Services/Mii/Types/StoreData.cs

@@ -49,26 +49,30 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types
 
         public bool IsValidDataCrc()
         {
-            return DataCrc == CalculateDataCrc();
+            return Helper.CalculateCrc16(AsSpanWithoutDeviceCrc(), 0, false) == 0;
         }
 
         public bool IsValidDeviceCrc()
         {
-            return DeviceCrc == CalculateDeviceCrc();
+            UInt128 deviceId = Helper.GetDeviceId();
+
+            ushort deviceIdCrc16 = Helper.CalculateCrc16(SpanHelpers.AsByteSpan(ref deviceId), 0, false);
+
+            return Helper.CalculateCrc16(AsSpan(), deviceIdCrc16, false) == 0;
         }
 
         private ushort CalculateDataCrc()
         {
-            return Helper.CalculateCrc16BE(AsSpanWithoutCrc());
+            return Helper.CalculateCrc16(AsSpanWithoutDeviceCrc(), 0, true);
         }
 
         private ushort CalculateDeviceCrc()
         {
             UInt128 deviceId = Helper.GetDeviceId();
 
-            ushort deviceIdCrc16 = Helper.CalculateCrc16BE(SpanHelpers.AsByteSpan(ref deviceId));
+            ushort deviceIdCrc16 = Helper.CalculateCrc16(SpanHelpers.AsByteSpan(ref deviceId), 0, false);
 
-            return Helper.CalculateCrc16BE(AsSpanWithoutDeviceCrc(), deviceIdCrc16);
+            return Helper.CalculateCrc16(AsSpan(), deviceIdCrc16, true);
         }
 
         private ReadOnlySpan<byte> AsSpan()
@@ -76,11 +80,6 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types
             return MemoryMarshal.AsBytes(SpanHelpers.CreateReadOnlySpan(in this, 1));
         }
 
-        private ReadOnlySpan<byte> AsSpanWithoutCrc()
-        {
-            return AsSpan().Slice(0, Size - 4);
-        }
-
         private ReadOnlySpan<byte> AsSpanWithoutDeviceCrc()
         {
             return AsSpan().Slice(0, Size - 2);