PkmnLibRSharp/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs

71 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using PkmnLibSharp.FFI;
using PkmnLibSharp.Utils;
using Interface = PkmnLibSharp.FFI.StaticData.Libraries.NatureLibrary;
namespace PkmnLibSharp.StaticData.Libraries
{
public class NatureLibrary : ExternPointer<NatureLibrary.CacheData>
{
public class CacheData
{
public Dictionary<string, Nature> Natures { get; } = new(StringComparer.InvariantCultureIgnoreCase);
}
public NatureLibrary(ulong capacity) : base(Interface.nature_library_new(capacity), true)
{
}
internal NatureLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner)
{
}
public Optional<Nature> TryGetNature(string name)
{
if (Cache.Natures.TryGetValue(name, out var nature))
return nature;
var naturePtr = Interface.nature_library_get_nature(Ptr, name.ToPtr());
if (naturePtr.Ptr == IntPtr.Zero)
return Optional<Nature>.None();
nature = new Nature(naturePtr);
Cache.Natures.Add(name, nature);
return nature;
}
public Nature GetRandomNature(ulong seed)
{
return new Nature(Interface.nature_library_get_random_nature(Ptr, seed));
}
public string GetNatureName(Nature nature)
{
var fd = Cache.Natures.FirstOrDefault(x => x.Value == nature);
return fd.Key ?? Interface.nature_library_get_nature_name(Ptr, nature.Ptr).PtrString()!;
}
public void LoadNature(string name, Nature nature) =>
Interface.nature_library_load_nature(Ptr, name.ToPtr(), nature.TakeOwnershipAndInvalidate());
protected override CacheData CreateCache() => new();
protected override void Destructor() => Interface.nature_library_drop(Ptr);
public override void InvalidateChildren()
{
base.InvalidateChildren();
foreach (var nature in Cache.Natures.Values)
{
nature.Invalidate();
}
}
~NatureLibrary()
{
Dispose();
}
}
}