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 { public class CacheData { public Dictionary 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 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.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(); } } }