mirror of
https://github.com/ppy/osu
synced 2025-01-03 04:42:10 +00:00
Move FastRandom
to LegacyRandom
in osu.Game
project
This commit is contained in:
parent
027ba17844
commit
93db6c6bb0
@ -5,10 +5,10 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Catch.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
using osu.Game.Rulesets.Catch.UI;
|
using osu.Game.Rulesets.Catch.UI;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Catch.Beatmaps
|
namespace osu.Game.Rulesets.Catch.Beatmaps
|
||||||
{
|
{
|
||||||
@ -46,7 +46,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
|
|
||||||
public void ApplyPositionOffsets(IBeatmap beatmap)
|
public void ApplyPositionOffsets(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var rng = new FastRandom(RNG_SEED);
|
var rng = new LegacyRandom(RNG_SEED);
|
||||||
|
|
||||||
float? lastPosition = null;
|
float? lastPosition = null;
|
||||||
double lastStartTime = 0;
|
double lastStartTime = 0;
|
||||||
@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
initialiseHyperDash(beatmap);
|
initialiseHyperDash(beatmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void applyHardRockOffset(CatchHitObject hitObject, ref float? lastPosition, ref double lastStartTime, FastRandom rng)
|
private static void applyHardRockOffset(CatchHitObject hitObject, ref float? lastPosition, ref double lastStartTime, LegacyRandom rng)
|
||||||
{
|
{
|
||||||
float offsetPosition = hitObject.OriginalX;
|
float offsetPosition = hitObject.OriginalX;
|
||||||
double startTime = hitObject.StartTime;
|
double startTime = hitObject.StartTime;
|
||||||
@ -146,7 +146,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
/// <param name="position">The position which the offset should be applied to.</param>
|
/// <param name="position">The position which the offset should be applied to.</param>
|
||||||
/// <param name="maxOffset">The maximum offset, cannot exceed 20px.</param>
|
/// <param name="maxOffset">The maximum offset, cannot exceed 20px.</param>
|
||||||
/// <param name="rng">The random number generator.</param>
|
/// <param name="rng">The random number generator.</param>
|
||||||
private static void applyRandomOffset(ref float position, double maxOffset, FastRandom rng)
|
private static void applyRandomOffset(ref float position, double maxOffset, LegacyRandom rng)
|
||||||
{
|
{
|
||||||
bool right = rng.NextBool();
|
bool right = rng.NextBool();
|
||||||
float rand = Math.Min(20, (float)rng.Next(0, Math.Max(0, maxOffset)));
|
float rand = Math.Min(20, (float)rng.Next(0, Math.Max(0, maxOffset)));
|
||||||
|
@ -11,8 +11,8 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps.Patterns;
|
using osu.Game.Rulesets.Mania.Beatmaps.Patterns;
|
||||||
using osu.Game.Rulesets.Mania.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy;
|
using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy;
|
||||||
|
using osu.Game.Utils;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps
|
namespace osu.Game.Rulesets.Mania.Beatmaps
|
||||||
@ -31,7 +31,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
private readonly int originalTargetColumns;
|
private readonly int originalTargetColumns;
|
||||||
|
|
||||||
// Internal for testing purposes
|
// Internal for testing purposes
|
||||||
internal FastRandom Random { get; private set; }
|
internal LegacyRandom Random { get; private set; }
|
||||||
|
|
||||||
private Pattern lastPattern = new Pattern();
|
private Pattern lastPattern = new Pattern();
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
IBeatmapDifficultyInfo difficulty = original.Difficulty;
|
IBeatmapDifficultyInfo difficulty = original.Difficulty;
|
||||||
|
|
||||||
int seed = (int)MathF.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)MathF.Round(difficulty.ApproachRate);
|
int seed = (int)MathF.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)MathF.Round(difficulty.ApproachRate);
|
||||||
Random = new FastRandom(seed);
|
Random = new LegacyRandom(seed);
|
||||||
|
|
||||||
return base.ConvertBeatmap(original, cancellationToken);
|
return base.ConvertBeatmap(original, cancellationToken);
|
||||||
}
|
}
|
||||||
@ -227,7 +227,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private class SpecificBeatmapPatternGenerator : Patterns.Legacy.PatternGenerator
|
private class SpecificBeatmapPatternGenerator : Patterns.Legacy.PatternGenerator
|
||||||
{
|
{
|
||||||
public SpecificBeatmapPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
public SpecificBeatmapPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
||||||
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,12 @@ using System.Linq;
|
|||||||
using osu.Framework.Extensions.EnumExtensions;
|
using osu.Framework.Extensions.EnumExtensions;
|
||||||
using osu.Game.Audio;
|
using osu.Game.Audio;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.Beatmaps.Formats;
|
using osu.Game.Beatmaps.Formats;
|
||||||
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
||||||
{
|
{
|
||||||
@ -34,7 +34,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
|
|
||||||
private PatternType convertType;
|
private PatternType convertType;
|
||||||
|
|
||||||
public DistanceObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
public DistanceObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
||||||
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
||||||
{
|
{
|
||||||
convertType = PatternType.None;
|
convertType = PatternType.None;
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Game.Rulesets.Mania.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Audio;
|
using osu.Game.Audio;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
||||||
{
|
{
|
||||||
@ -17,7 +17,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
private readonly int endTime;
|
private readonly int endTime;
|
||||||
private readonly PatternType convertType;
|
private readonly PatternType convertType;
|
||||||
|
|
||||||
public EndTimeObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
public EndTimeObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
||||||
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
||||||
{
|
{
|
||||||
endTime = (int)((HitObject as IHasDuration)?.EndTime ?? 0);
|
endTime = (int)((HitObject as IHasDuration)?.EndTime ?? 0);
|
||||||
|
@ -9,11 +9,11 @@ using osuTK;
|
|||||||
using osu.Game.Audio;
|
using osu.Game.Audio;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.Rulesets.Mania.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
||||||
{
|
{
|
||||||
@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
|
|
||||||
private readonly PatternType convertType;
|
private readonly PatternType convertType;
|
||||||
|
|
||||||
public HitObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, double previousTime, Vector2 previousPosition, double density,
|
public HitObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, double previousTime, Vector2 previousPosition, double density,
|
||||||
PatternType lastStair, IBeatmap originalBeatmap)
|
PatternType lastStair, IBeatmap originalBeatmap)
|
||||||
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
|
||||||
{
|
{
|
||||||
|
@ -5,8 +5,8 @@ using System;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.MathUtils;
|
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
||||||
{
|
{
|
||||||
@ -23,14 +23,14 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The random number generator to use.
|
/// The random number generator to use.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected readonly FastRandom Random;
|
protected readonly LegacyRandom Random;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The beatmap which <see cref="HitObject"/> is being converted from.
|
/// The beatmap which <see cref="HitObject"/> is being converted from.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected readonly IBeatmap OriginalBeatmap;
|
protected readonly IBeatmap OriginalBeatmap;
|
||||||
|
|
||||||
protected PatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
protected PatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
|
||||||
: base(hitObject, beatmap, previousPattern)
|
: base(hitObject, beatmap, previousPattern)
|
||||||
{
|
{
|
||||||
if (random == null) throw new ArgumentNullException(nameof(random));
|
if (random == null) throw new ArgumentNullException(nameof(random));
|
||||||
|
@ -1,95 +0,0 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.MathUtils
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A PRNG specified in http://heliosphan.org/fastrandom.html.
|
|
||||||
/// </summary>
|
|
||||||
internal class FastRandom
|
|
||||||
{
|
|
||||||
private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
|
|
||||||
private const uint int_mask = 0x7FFFFFFF;
|
|
||||||
private const uint y = 842502087;
|
|
||||||
private const uint z = 3579807591;
|
|
||||||
private const uint w = 273326509;
|
|
||||||
|
|
||||||
internal uint X { get; private set; }
|
|
||||||
internal uint Y { get; private set; } = y;
|
|
||||||
internal uint Z { get; private set; } = z;
|
|
||||||
internal uint W { get; private set; } = w;
|
|
||||||
|
|
||||||
public FastRandom(int seed)
|
|
||||||
{
|
|
||||||
X = (uint)seed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FastRandom()
|
|
||||||
: this(Environment.TickCount)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a random unsigned integer within the range [<see cref="uint.MinValue"/>, <see cref="uint.MaxValue"/>).
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public uint NextUInt()
|
|
||||||
{
|
|
||||||
uint t = X ^ (X << 11);
|
|
||||||
X = Y;
|
|
||||||
Y = Z;
|
|
||||||
Z = W;
|
|
||||||
return W = W ^ (W >> 19) ^ t ^ (t >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a random integer value within the range [0, <see cref="int.MaxValue"/>).
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public int Next() => (int)(int_mask & NextUInt());
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a random integer value within the range [0, <paramref name="upperBound"/>).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="upperBound">The upper bound.</param>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public int Next(int upperBound) => (int)(NextDouble() * upperBound);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a random integer value within the range [<paramref name="lowerBound"/>, <paramref name="upperBound"/>).
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="lowerBound">The lower bound of the range.</param>
|
|
||||||
/// <param name="upperBound">The upper bound of the range.</param>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public int Next(int lowerBound, int upperBound) => (int)(lowerBound + NextDouble() * (upperBound - lowerBound));
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a random double value within the range [0, 1).
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public double NextDouble() => int_to_real * Next();
|
|
||||||
|
|
||||||
private uint bitBuffer;
|
|
||||||
private int bitIndex = 32;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates a reandom boolean value. Cached such that a random value is only generated once in every 32 calls.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The random value.</returns>
|
|
||||||
public bool NextBool()
|
|
||||||
{
|
|
||||||
if (bitIndex == 32)
|
|
||||||
{
|
|
||||||
bitBuffer = NextUInt();
|
|
||||||
bitIndex = 1;
|
|
||||||
|
|
||||||
return (bitBuffer & 1) == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bitIndex++;
|
|
||||||
return ((bitBuffer >>= 1) & 1) == 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,27 +2,36 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using osu.Framework.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Catch.MathUtils
|
namespace osu.Game.Utils
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A PRNG specified in http://heliosphan.org/fastrandom.html.
|
/// A PRNG specified in http://heliosphan.org/fastrandom.html.
|
||||||
|
/// Should only be used to match legacy behaviour. See <see cref="RNG"/> for a newer alternative.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class FastRandom
|
/// <remarks>
|
||||||
|
/// Known in osu-stable code as `FastRandom`.
|
||||||
|
/// </remarks>
|
||||||
|
public class LegacyRandom
|
||||||
{
|
{
|
||||||
private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
|
private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
|
||||||
private const uint int_mask = 0x7FFFFFFF;
|
private const uint int_mask = 0x7FFFFFFF;
|
||||||
private const uint y_initial = 842502087;
|
private const uint y = 842502087;
|
||||||
private const uint z_initial = 3579807591;
|
private const uint z = 3579807591;
|
||||||
private const uint w_initial = 273326509;
|
private const uint w = 273326509;
|
||||||
private uint x, y = y_initial, z = z_initial, w = w_initial;
|
|
||||||
|
|
||||||
public FastRandom(int seed)
|
public uint X { get; private set; }
|
||||||
|
public uint Y { get; private set; } = y;
|
||||||
|
public uint Z { get; private set; } = z;
|
||||||
|
public uint W { get; private set; } = w;
|
||||||
|
|
||||||
|
public LegacyRandom(int seed)
|
||||||
{
|
{
|
||||||
x = (uint)seed;
|
X = (uint)seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FastRandom()
|
public LegacyRandom()
|
||||||
: this(Environment.TickCount)
|
: this(Environment.TickCount)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -33,11 +42,11 @@ namespace osu.Game.Rulesets.Catch.MathUtils
|
|||||||
/// <returns>The random value.</returns>
|
/// <returns>The random value.</returns>
|
||||||
public uint NextUInt()
|
public uint NextUInt()
|
||||||
{
|
{
|
||||||
uint t = x ^ (x << 11);
|
uint t = X ^ (X << 11);
|
||||||
x = y;
|
X = Y;
|
||||||
y = z;
|
Y = Z;
|
||||||
z = w;
|
Z = W;
|
||||||
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
|
return W = W ^ (W >> 19) ^ t ^ (t >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
Loading…
Reference in New Issue
Block a user