mirror of
https://github.com/GreemDev/Ryujinx.git
synced 2024-12-23 01:05:47 +00:00
mii: Fix multiple inconsistencies (#2392)
I found multiple inconsistencies while diffing with latest sdb, this PR fixes those findings.
This commit is contained in:
parent
0644db02ad
commit
e334303559
5 changed files with 44 additions and 40 deletions
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
||||
if (oldStoreData.IsSpecial())
|
||||
{
|
||||
return ResultCode.InvalidOperationOnSpecialMii;
|
||||
}
|
||||
|
||||
_database.Replace(index, storeData);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_database.IsFull())
|
||||
{
|
||||
return ResultCode.DatabaseFull;
|
||||
}
|
||||
|
||||
_database.Add(storeData);
|
||||
}
|
||||
|
||||
MarkDirty(metadata);
|
||||
|
||||
return ResultCode.Success;
|
||||
return ResultCode.InvalidOperationOnSpecialMii;
|
||||
}
|
||||
|
||||
return ResultCode.InvalidOperationOnSpecialMii;
|
||||
if (_database.GetIndexByCreatorId(out int index, storeData.CreateId))
|
||||
{
|
||||
StoreData oldStoreData = _database.Get(index);
|
||||
|
||||
if (oldStoreData.IsSpecial())
|
||||
{
|
||||
return ResultCode.InvalidOperationOnSpecialMii;
|
||||
}
|
||||
|
||||
_database.Replace(index, storeData);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_database.IsFull())
|
||||
{
|
||||
return ResultCode.DatabaseFull;
|
||||
}
|
||||
|
||||
_database.Add(storeData);
|
||||
}
|
||||
|
||||
MarkDirty(metadata);
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
public ResultCode Delete(DatabaseSessionMetadata metadata, CreateId createId)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue