using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using PkmnLibSharp.Library.Items; using PkmnLibSharp.Library.Moves; using PkmnLibSharp.Utilities; namespace PkmnLibSharp.Library.Evolution { public sealed class EvolutionData : PointerWrapper { internal EvolutionData(IntPtr ptr) : base(ptr) { } public static EvolutionData CreateLevelEvolution(byte level, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateLevelEvolution(level, into.Ptr)); } public static EvolutionData CreateFriendshipEvolution(byte friendship, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateFriendshipEvolution(friendship, into.Ptr)); } public static EvolutionData CreateFriendshipTimeEvolution(byte friendship, TimeOfDay start, TimeOfDay end, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateFriendshipTimeEvolution(friendship, (Pkmnlib.TimeOfDay) start, (Pkmnlib.TimeOfDay) end, into.Ptr)); } public static EvolutionData CreateKnownMoveEvolution(MoveData move, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateKnownMoveEvolution(move.Ptr, into.Ptr)); } public static EvolutionData CreateLocationEvolution(string location, Species into) { return new EvolutionData( Pkmnlib.Generated.EvolutionData.CreateLocationEvolution(location.ToPtr(), into.Ptr)); } public static EvolutionData CreateTimeEvolution(TimeOfDay start, TimeOfDay end, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateTimeEvolution((Pkmnlib.TimeOfDay) start, (Pkmnlib.TimeOfDay) end, into.Ptr)); } public static EvolutionData CreateHeldItemEvolution(Item item, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateHeldItemEvolution(item.Ptr, into.Ptr)); } public static EvolutionData CreateHeldItemTimeEvolution(Item item, TimeOfDay start, TimeOfDay end, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateHeldItemTimeEvolution(item.Ptr, (Pkmnlib.TimeOfDay) start, (Pkmnlib.TimeOfDay) end, into.Ptr)); } public static EvolutionData CreateGenderBasedEvolution(Gender gender, byte level, Species into) { return new EvolutionData( Pkmnlib.Generated.EvolutionData.CreateGenderBasedEvolution((Pkmnlib.Gender) gender, level, into.Ptr)); } public static EvolutionData CreateItemUseEvolution(Item item, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateItemUseEvolution(item.Ptr, into.Ptr)); } public static EvolutionData CreateItemUseWithGenderEvolution(Item item, Gender gender, Species into) { return new EvolutionData( Pkmnlib.Generated.EvolutionData.CreateItemUseWithGenderEvolution(item.Ptr, (Pkmnlib.Gender) gender, into.Ptr)); } public static EvolutionData CreateTradeEvolution(Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateTradeEvolution(into.Ptr)); } public static EvolutionData CreateTradeWithItemEvolution(Item item, Species into) { return new EvolutionData(Pkmnlib.Generated.EvolutionData.CreateTradeWithItemEvolution(item.Ptr, into.Ptr)); } public static EvolutionData CreateTradeWithSpeciesEvolution(Species with, Species into) { return new EvolutionData( Pkmnlib.Generated.EvolutionData.CreateTradeWithSpeciesEvolution(with.Ptr, into.Ptr)); } public static EvolutionData CreateCustomEvolution(IList parameters, Species into) { var parametersPtrs = parameters.Select(x => x.Ptr).ToArray(); GCHandle.Alloc(parametersPtrs, GCHandleType.Pinned); var ptr = parametersPtrs.ArrayPtr(); return new EvolutionData( Pkmnlib.Generated.EvolutionData.CreateCustomEvolution(ptr, (ulong) parameters.Count, into.Ptr)); } public EvolutionMethod Method => (EvolutionMethod) Pkmnlib.Generated.EvolutionData.GetMethod(Ptr); public Species NewSpecies { get { if (_species != null) return _species; var ptr = Pkmnlib.Generated.EvolutionData.GetNewSpecies(Ptr); if (TryResolvePointer(ptr, out _species)) return _species!; _species = Constructor.Active.ConstructSpecies(ptr)!; return _species; } } public ulong DataLength => Pkmnlib.Generated.EvolutionData.GetDataCount(Ptr); public EffectParameter GetData(ulong index) { var ptr = IntPtr.Zero; Pkmnlib.Generated.EvolutionData.GetData(Ptr, index, ref ptr).Assert(); if (TryResolvePointer(ptr, out EffectParameter? parameter)) return parameter!; return new EffectParameter(ptr); } private Species? _species; protected override void DeletePtr() { throw new NotImplementedException(); } } }