using System.Collections.Generic;
public static NiftyHat.LevelTableTest test = new NiftyHat.LevelTableTest();
public static void Main()
Random rand = new Random();
ulong[] testAmounts = new ulong[] {1,11,50,51,250,1500, (ulong)rand.Next(0,1500), (ulong)rand.Next(0,1500)};
foreach (ulong amount in testAmounts)
public struct ValueRange<TValue> where TValue : IComparable<TValue>
public TValue Min => _min;
public TValue Max => _max;
private readonly TValue _min;
private readonly TValue _max;
public ValueRange(TValue min, TValue max)
public bool Contains(TValue value)
return _min.CompareTo(value) <= 0 && _max.CompareTo(value) >= 0;
public interface ILevelEntry
ValueRange<ulong> ExpRange {get;}
public class LevelTableTest
public struct Entry : ILevelEntry
public uint Level {get; internal set;}
public ValueRange<ulong> ExpRange {get; internal set;}
readonly IList<ulong> _expAmounts;
_expAmounts = new List<ulong> () {50,150,300,500,1000};
_cache.ExpRange = new ValueRange<ulong>(0,_expAmounts[0]);
public void Debug(ulong amount)
if (_cache.ExpRange.Contains(amount))
Console.WriteLine($"Cache Level:{_cache.Level} Exp:{amount}/{_cache.ExpRange.Max}");
for (int i = 1; i < _expAmounts.Count; i++)
ulong requiredForLevel = _expAmounts[i];
if (amount > requiredForLevel)
_cache.Level = (uint)i + 1;
_cache.ExpRange = new ValueRange<ulong>(_expAmounts[i],requiredForLevel);
Console.WriteLine($"Current Level:{_cache.Level} Exp:{amount}/{_cache.ExpRange.Max}");