mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-19 00:43:14 +00:00
63 lines
2 KiB
C#
63 lines
2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Runtime.CompilerServices;
|
|||
|
|
|||
|
namespace PKHeX.Core
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Frame List used to cache <see cref="RNG"/> results.
|
|||
|
/// </summary>
|
|||
|
public class FrameCache
|
|||
|
{
|
|||
|
private const int DefaultSize = 32;
|
|||
|
private readonly List<uint> Seeds = new List<uint>(DefaultSize);
|
|||
|
private readonly List<uint> Values = new List<uint>(DefaultSize);
|
|||
|
private readonly Func<uint, uint> Advance;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a new instance of a <see cref="FrameCache"/>.
|
|||
|
/// </summary>
|
|||
|
/// <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)
|
|||
|
{
|
|||
|
Advance = advance;
|
|||
|
Add(origin);
|
|||
|
}
|
|||
|
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
private void Add(uint seed)
|
|||
|
{
|
|||
|
Seeds.Add(seed);
|
|||
|
Values.Add(seed >> 16);
|
|||
|
}
|
|||
|
|
|||
|
/// <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>
|
|||
|
/// <returns></returns>
|
|||
|
public uint this[int index]
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
while (index >= Seeds.Count)
|
|||
|
Add(Advance(Seeds[Seeds.Count - 1]));
|
|||
|
return Values[index];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <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[Seeds.Count - 1]));
|
|||
|
return Seeds[index];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|