using System; using System.Collections.Generic; using System.Linq; using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Species; namespace PkmnLibSharp.StaticData { public class Species : ExternPointer { public class CacheData { public ushort? Id { get; internal set; } public string? Name { get; internal set; } public float? GenderRate { get; internal set; } public string? GrowthRate { get; internal set; } public byte? CaptureRate { get; internal set; } public Dictionary Forms { get; } = new(); } internal Species(IdentifiablePointer ptr) : base(ptr, true) { } public Species(ushort id, string name, float genderRate, string growthRate, byte captureRate, Form defaultForm, IReadOnlyCollection flags) { var flagsPtrArray = flags.Select(x => x.ToPtr()).ToArray(); var ptr = Interface.species_new(id, name.ToPtr(), genderRate, growthRate.ToPtr(), captureRate, defaultForm.Ptr, flagsPtrArray.ArrayPtr(), (ulong)flags.Count); InitializePointer(ptr, true); } public ushort Id => Cache.Id ??= Interface.species_id(Ptr); public string Name => Cache.Name ??= Interface.species_name(Ptr).PtrString()!; public float GenderRate => Cache.GenderRate ??= Interface.species_gender_rate(Ptr); public string GrowthRate => Cache.GrowthRate ??= Interface.species_growth_rate(Ptr).PtrString()!; public byte CaptureRate => Cache.CaptureRate ??= Interface.species_capture_rate(Ptr); public bool TryGetForm(string formName, out Form? form) { if (Cache.Forms.TryGetValue(formName, out form)) return true; var formPtr = Interface.species_get_form(Ptr, formName.ToPtr()); if (formPtr.Ptr == IntPtr.Zero) { form = null; return false; } form = new Form(formPtr); Cache.Forms.Add(formName, form); return true; } public void AddForm(Form form) => Interface.species_add_form(Ptr, form.Name.ToPtr(), form.TakeOwnershipAndInvalidate()); protected override CacheData CreateCache() => new CacheData(); protected override void Destructor() => Interface.species_drop(Ptr); public override void InvalidateChildren() { base.InvalidateChildren(); foreach (var form in Cache.Forms) { form.Value.Invalidate(); } } ~Species() { Dispose(); } } }