aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs')
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs b/src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs
new file mode 100644
index 00000000..30b201f6
--- /dev/null
+++ b/src/Ryujinx.HLE/HOS/Services/Mii/UtilityImpl.cs
@@ -0,0 +1,75 @@
+using Ryujinx.Common.Utilities;
+using Ryujinx.Cpu;
+using Ryujinx.HLE.HOS.Services.Mii.Types;
+using Ryujinx.HLE.HOS.Services.Time;
+using Ryujinx.HLE.HOS.Services.Time.Clock;
+using System;
+
+namespace Ryujinx.HLE.HOS.Services.Mii
+{
+ class UtilityImpl
+ {
+ private uint _x;
+ private uint _y;
+ private uint _z;
+ private uint _w;
+
+ public UtilityImpl(ITickSource tickSource)
+ {
+ _x = 123456789;
+ _y = 362436069;
+
+ TimeSpanType time = TimeManager.Instance.TickBasedSteadyClock.GetCurrentRawTimePoint(tickSource);
+
+ _w = (uint)(time.NanoSeconds & uint.MaxValue);
+ _z = (uint)((time.NanoSeconds >> 32) & uint.MaxValue);
+ }
+
+ private uint GetRandom()
+ {
+ uint t = (_x ^ (_x << 11));
+
+ _x = _y;
+ _y = _z;
+ _z = _w;
+ _w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8));
+
+ return _w;
+ }
+
+ public int GetRandom(int end)
+ {
+ return (int)GetRandom((uint)end);
+ }
+
+ public uint GetRandom(uint end)
+ {
+ uint random = GetRandom();
+
+ return random - random / end * end;
+ }
+
+ public uint GetRandom(uint start, uint end)
+ {
+ uint random = GetRandom();
+
+ return random - random / (1 - start + end) * (1 - start + end) + start;
+ }
+
+ public int GetRandom(int start, int end)
+ {
+ return (int)GetRandom((uint)start, (uint)end);
+ }
+
+ public CreateId MakeCreateId()
+ {
+ UInt128 value = UInt128Utils.CreateRandom();
+
+ // Ensure the random ID generated is valid as a create id.
+ value &= ~new UInt128(0xC0, 0);
+ value |= new UInt128(0x80, 0);
+
+ return new CreateId(value);
+ }
+ }
+}