using System; using System.Collections.Immutable; using System.Linq; using System.Runtime.InteropServices; using Creatureliblibrary; using Creatureliblibrary.Generated; namespace PkmnLibSharp.Library { public class Forme : PointerWrapper { private string _name; private ImmutableArray _types; public string Name => _name ??= SpeciesVariant.GetName(Ptr); public float Height => SpeciesVariant.GetHeight(Ptr); public float Weight => SpeciesVariant.GetWeight(Ptr); public float BaseExperience => SpeciesVariant.GetBaseExperience(Ptr); public ImmutableArray Types { get { if (_types != null) return _types; var typesCount = SpeciesVariant.GetTypeCount(Ptr); var types = new byte[typesCount]; for (ulong i = 0; i < typesCount; i++) { types[i] = SpeciesVariant.GetType(Ptr, i); } _types = types.ToImmutableArray(); return _types; } } public uint BaseHealth => SpeciesVariant.GetStatistic(Ptr, Statistic.Health); public uint BaseAttack => SpeciesVariant.GetStatistic(Ptr, Statistic.PhysicalAttack); public uint BaseDefense => SpeciesVariant.GetStatistic(Ptr, Statistic.PhysicalDefense); public uint BaseSpecialAttack => SpeciesVariant.GetStatistic(Ptr, Statistic.MagicalAttack); public uint BaseSpecialDefense => SpeciesVariant.GetStatistic(Ptr, Statistic.MagicalDefense); public uint BaseSpeed => SpeciesVariant.GetStatistic(Ptr, Statistic.Speed); public int GetPkmnType(int index) { return Types[index]; } public static unsafe Forme Create(string name, float height, float weight, uint baseExperience, byte[] types, ushort baseHealth, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack, ushort baseSpecialDefense, ushort baseSpeed, string[] abilities, string[] hiddenAbilities) { var abilitiesConverted = abilities.Select(Marshal.StringToHGlobalUni).ToArray(); var hiddenAbilitiesConverted = hiddenAbilities.Select(Marshal.StringToHGlobalUni).ToArray(); fixed (byte* t = types) { fixed (IntPtr* ab = abilitiesConverted) { fixed (IntPtr* hab = hiddenAbilitiesConverted) { var ptr = SpeciesVariant.Construct(name, height, weight, baseExperience, (IntPtr) t, (ulong) types.Length, baseHealth, baseAttack, baseDefense, baseSpecialAttack, baseSpecialDefense, baseSpeed, (IntPtr) ab, (ulong) abilities.Length, (IntPtr) hab, (ulong) hiddenAbilities.Length, IntPtr.Zero); var f = new Forme(ptr); foreach (var intPtr in abilitiesConverted) Marshal.FreeHGlobal(intPtr); foreach (var intPtr in hiddenAbilitiesConverted) Marshal.FreeHGlobal(intPtr); return f; } } } } private Forme(IntPtr parent) : base(parent) { } internal override void DeletePtr() { SpeciesVariant.Destruct(Ptr); } } }