112 lines
3.3 KiB
C#
112 lines
3.3 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.Utilities.UnifiedRandom
|
|
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
|
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
|
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
|
|
|
using System;
|
|
|
|
namespace Terraria.Utilities
|
|
{
|
|
[Serializable]
|
|
public class UnifiedRandom
|
|
{
|
|
private const int MBIG = 2147483647;
|
|
private const int MSEED = 161803398;
|
|
private const int MZ = 0;
|
|
private int inext;
|
|
private int inextp;
|
|
private int[] SeedArray = new int[56];
|
|
|
|
public UnifiedRandom()
|
|
: this(Environment.TickCount)
|
|
{
|
|
}
|
|
|
|
public UnifiedRandom(int Seed)
|
|
{
|
|
int num1 = 161803398 - (Seed == int.MinValue ? int.MaxValue : Math.Abs(Seed));
|
|
this.SeedArray[55] = num1;
|
|
int num2 = 1;
|
|
for (int index1 = 1; index1 < 55; ++index1)
|
|
{
|
|
int index2 = 21 * index1 % 55;
|
|
this.SeedArray[index2] = num2;
|
|
num2 = num1 - num2;
|
|
if (num2 < 0)
|
|
num2 += int.MaxValue;
|
|
num1 = this.SeedArray[index2];
|
|
}
|
|
for (int index3 = 1; index3 < 5; ++index3)
|
|
{
|
|
for (int index4 = 1; index4 < 56; ++index4)
|
|
{
|
|
this.SeedArray[index4] -= this.SeedArray[1 + (index4 + 30) % 55];
|
|
if (this.SeedArray[index4] < 0)
|
|
this.SeedArray[index4] += int.MaxValue;
|
|
}
|
|
}
|
|
this.inext = 0;
|
|
this.inextp = 21;
|
|
Seed = 1;
|
|
}
|
|
|
|
protected virtual double Sample() => (double) this.InternalSample() * 4.6566128752458E-10;
|
|
|
|
private int InternalSample()
|
|
{
|
|
int inext = this.inext;
|
|
int inextp = this.inextp;
|
|
int index1;
|
|
if ((index1 = inext + 1) >= 56)
|
|
index1 = 1;
|
|
int index2;
|
|
if ((index2 = inextp + 1) >= 56)
|
|
index2 = 1;
|
|
int num = this.SeedArray[index1] - this.SeedArray[index2];
|
|
if (num == int.MaxValue)
|
|
--num;
|
|
if (num < 0)
|
|
num += int.MaxValue;
|
|
this.SeedArray[index1] = num;
|
|
this.inext = index1;
|
|
this.inextp = index2;
|
|
return num;
|
|
}
|
|
|
|
public virtual int Next() => this.InternalSample();
|
|
|
|
private double GetSampleForLargeRange()
|
|
{
|
|
int num = this.InternalSample();
|
|
if ((this.InternalSample() % 2 == 0 ? 1 : 0) != 0)
|
|
num = -num;
|
|
return ((double) num + 2147483646.0) / 4294967293.0;
|
|
}
|
|
|
|
public virtual int Next(int minValue, int maxValue)
|
|
{
|
|
if (minValue > maxValue)
|
|
throw new ArgumentOutOfRangeException(nameof (minValue), "minValue must be less than maxValue");
|
|
long num = (long) maxValue - (long) minValue;
|
|
return num <= (long) int.MaxValue ? (int) (this.Sample() * (double) num) + minValue : (int) ((long) (this.GetSampleForLargeRange() * (double) num) + (long) minValue);
|
|
}
|
|
|
|
public virtual int Next(int maxValue)
|
|
{
|
|
if (maxValue < 0)
|
|
throw new ArgumentOutOfRangeException(nameof (maxValue), "maxValue must be positive.");
|
|
return (int) (this.Sample() * (double) maxValue);
|
|
}
|
|
|
|
public virtual double NextDouble() => this.Sample();
|
|
|
|
public virtual void NextBytes(byte[] buffer)
|
|
{
|
|
if (buffer == null)
|
|
throw new ArgumentNullException(nameof (buffer));
|
|
for (int index = 0; index < buffer.Length; ++index)
|
|
buffer[index] = (byte) (this.InternalSample() % 256);
|
|
}
|
|
}
|
|
}
|