2022-06-18 18:04:24 +00:00
|
|
|
using System;
|
2018-02-05 00:30:50 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
namespace PKHeX.Core;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Frame List used to cache <see cref="RNG"/> results.
|
|
|
|
/// </summary>
|
|
|
|
public sealed class FrameCache
|
2018-02-05 00:30:50 +00:00
|
|
|
{
|
2022-06-18 18:04:24 +00:00
|
|
|
private const int DefaultSize = 32;
|
|
|
|
private readonly List<uint> Seeds = new(DefaultSize);
|
|
|
|
private readonly List<uint> Values = new(DefaultSize);
|
|
|
|
private readonly Func<uint, uint> Advance;
|
|
|
|
|
2018-02-05 00:30:50 +00:00
|
|
|
/// <summary>
|
2022-06-18 18:04:24 +00:00
|
|
|
/// Creates a new instance of a <see cref="FrameCache"/>.
|
2018-02-05 00:30:50 +00:00
|
|
|
/// </summary>
|
2022-06-18 18:04:24 +00:00
|
|
|
/// <param name="origin">Seed at frame 0.</param>
|
|
|
|
/// <param name="advance"><see cref="RNG"/> method used to get the next seed. Can use <see cref="RNG.Next"/> or <see cref="RNG.Prev"/>.</param>
|
|
|
|
public FrameCache(uint origin, Func<uint, uint> advance)
|
2018-02-05 00:30:50 +00:00
|
|
|
{
|
2022-06-18 18:04:24 +00:00
|
|
|
Advance = advance;
|
|
|
|
Add(origin);
|
|
|
|
}
|
2018-02-05 00:30:50 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
private void Add(uint seed)
|
|
|
|
{
|
|
|
|
Seeds.Add(seed);
|
|
|
|
Values.Add(seed >> 16);
|
|
|
|
}
|
2018-02-05 00:30:50 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the 16 bit value from <see cref="Values"/> at a given <see cref="index"/>.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="index">Index to grab the value from</param>
|
|
|
|
public uint this[int index]
|
|
|
|
{
|
|
|
|
get
|
2018-02-05 00:30:50 +00:00
|
|
|
{
|
|
|
|
while (index >= Seeds.Count)
|
2021-05-14 22:30:55 +00:00
|
|
|
Add(Advance(Seeds[^1]));
|
2022-06-18 18:04:24 +00:00
|
|
|
return Values[index];
|
2018-02-05 00:30:50 +00:00
|
|
|
}
|
|
|
|
}
|
2022-06-18 18:04:24 +00:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the Seed at a specified frame index.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="index">Frame number</param>
|
|
|
|
/// <returns>Seed at index</returns>
|
|
|
|
public uint GetSeed(int index)
|
|
|
|
{
|
|
|
|
while (index >= Seeds.Count)
|
|
|
|
Add(Advance(Seeds[^1]));
|
|
|
|
return Seeds[index];
|
|
|
|
}
|
2018-02-05 00:30:50 +00:00
|
|
|
}
|