PkmnLibRSharp/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs

59 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
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(IntPtr ptr, bool isOwner) : base(ptr, isOwner)
{
}
public bool TryGetNature(string name, out Nature nature)
{
if (Cache.Natures.TryGetValue(name, out nature))
return true;
var naturePtr = Interface.nature_library_get_nature(Ptr, name.ToPtr());
if (naturePtr == IntPtr.Zero)
return false;
nature = new Nature(naturePtr, false);
Cache.Natures.Add(name, nature);
return true;
}
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();
}
}
}
}