71 lines
2.2 KiB
C#
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();
|
|
}
|
|
}
|
|
} |