using System; using System.Collections.Generic; using Creaturelib.Generated; using Pkmnlib; using Pkmnlib.Generated; using PkmnLibSharp.Utilities; using EvolutionData = PkmnLibSharp.Library.Evolution.EvolutionData; using Gender = PkmnLibSharp.Library.Gender; using Random = PkmnLibSharp.Utilities.Random; namespace PkmnLibSharp.Library { public class Species : PointerWrapper { internal Species(IntPtr ptr) : base(ptr) { } public Species(ushort id, string name, Forme defaultForme, float genderRatio, string growthRate, byte captureRate, byte baseHappiness) { var ptr = IntPtr.Zero; PokemonSpecies.Construct(ref ptr, id, name.ToPtr(), defaultForme.Ptr, genderRatio, growthRate.ToPtr(), captureRate, baseHappiness).Assert(); _formes.Add("default", defaultForme); Initialize(ptr); } public ushort Id => CreatureSpecies.GetId(Ptr); public float GenderRate => CreatureSpecies.GetGenderRate(Ptr); public byte CaptureRate => CreatureSpecies.GetCaptureRate(Ptr); public string Name => _name ??= CreatureSpecies.GetName(Ptr).PtrString()!; public string GrowthRate => _growthRate ??= CreatureSpecies.GetGrowthRate(Ptr).PtrString()!; public ReadOnlyNativePtrArray Evolutions { get { if (_evolutions != null) return _evolutions; var ptr = IntPtr.Zero; PokemonSpecies.GetEvolutions(Ptr, ref ptr); var length = PokemonSpecies.GetEvolutionCount(Ptr); _evolutions = new ReadOnlyNativePtrArray(ptr, (int) length); return _evolutions; } } public bool HasForme(string s) { return CreatureSpecies.HasVariant(Ptr, s.ToPtr()) == MarshalHelper.True; } public bool TryGetForme(string s, out Forme? forme) { if (_formes.TryGetValue(s, out forme)) return true; var ptr = IntPtr.Zero; if (CreatureSpecies.TryGetVariant(Ptr, s.ToPtr(), ref ptr) == MarshalHelper.True) { if (TryResolvePointer(ptr, out forme)) { _formes.Add(s, forme!); return true; } forme = new Forme(ptr); _formes.Add(s, forme); return true; } return false; } public Forme GetForme(string s) { if (_formes.TryGetValue(s, out var forme)) return forme; var ptr = IntPtr.Zero; CreatureSpecies.GetVariant(ref ptr, Ptr, s.ToPtr()).Assert(); if (TryResolvePointer(ptr, out Forme? f)) { _formes.Add(s, f!); return f!; } forme = new Forme(ptr); _formes.Add(s, forme); return forme; } public void SetForme(string s, Forme forme) { _formes.Add(s, forme); CreatureSpecies.SetVariant(Ptr, s.ToPtr(), forme.Ptr).Assert(); } public Gender GetRandomGender(Random random) { return (Gender) CreatureSpecies.GetRandomGender(Ptr, random.Ptr); } public void AddEvolution(EvolutionData evolutionData) { Pkmnlib.Generated.PokemonSpecies.AddEvolution(Ptr, evolutionData.Ptr); } private string? _name; private string? _growthRate; private readonly Dictionary _formes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); private ReadOnlyNativePtrArray? _evolutions; protected internal override void MarkAsDeleted() { base.MarkAsDeleted(); foreach (var forme in _formes) { forme.Value.MarkAsDeleted(); } } protected override void DeletePtr() { PokemonSpecies.Destruct(Ptr); } } }