PkmnLibRSharp/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs

79 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using PkmnLibSharp.FFI;
using PkmnLibSharp.Utils;
using Interface = PkmnLibSharp.FFI.StaticData.Libraries.NatureLibrary;
namespace PkmnLibSharp.StaticData.Libraries
{
/// <summary>
/// A library of all natures that can be used, stored by their names.
/// </summary>
public class NatureLibrary : HandleType
{
private Dictionary<string, Nature> _natures = new();
/// <inheritdoc cref="NatureLibrary"/>
protected NatureLibrary(FFIHandle handle) : base(handle)
{
}
/// <summary>
/// Creates a new nature library with a given capacity.
/// </summary>
public static NatureLibrary Create(ulong capacity)
{
var handle = Interface.nature_library_new(capacity);
var lib = Resolver.Instance.ResolveNatureLibrary(handle.Resolve());
if (capacity > 0)
lib._natures = new Dictionary<string, Nature>((int)capacity, StringComparer.InvariantCultureIgnoreCase);
return lib;
}
/// <summary>
/// Try to get a nature from the library by its name.
/// </summary>
public bool TryGetNature(string name, [NotNullWhen(true)] out Nature? nature)
{
if (_natures.TryGetValue(name, out nature))
return true;
var naturePtr = Interface.nature_library_get_nature(Handle, name.ToPtr());
if (naturePtr.Handle == 0)
return false;
nature = Resolver.Instance.ResolveNature(naturePtr.Resolve());
_natures.Add(name, nature);
return true;
}
/// <summary>
/// Gets a random nature.
/// </summary>
/// <param name="seed">
/// The seed to use for the random number generator.
/// </param>
public Nature GetRandomNature(ulong seed)
{
return Resolver.Instance.ResolveNature(Interface.nature_library_get_random_nature(Handle, seed).Result().Resolve());
}
/// <summary>
/// Gets the name of a nature from its object.
/// </summary>
public string GetNatureName(Nature nature)
{
var fd = _natures.FirstOrDefault(x => x.Value == nature);
return fd.Key ?? Interface.nature_library_get_nature_name(Handle, nature.Handle).PtrString()!;
}
/// <summary>
/// Adds a new nature with name to the library.
/// </summary>
public void LoadNature(string name, Nature nature)
{
Interface.nature_library_load_nature(Handle, name.ToPtr(), nature.Handle);
_natures.Add(name, nature);
}
}
}