using System; using System.Collections.Generic; using System.Linq; using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Form; namespace PkmnLibSharp.StaticData { public class Form : ExternPointer { public class CacheData { public string? Name { get; internal set; } public float? Height { get; internal set; } public float? Weight { get; internal set; } public uint? BaseExperience { get; internal set; } public ulong? TypesLength { get; internal set; } public CachedExternValueArray? Types { get; internal set; } public StaticStatisticSet? BaseStats { get; internal set; } public CachedExternArray? Abilities { get; internal set; } public CachedExternArray? HiddenAbilities { get; internal set; } public LearnableMoves? LearnableMoves { get; internal set; } } internal Form(IdentifiablePointer formPtr) : base(formPtr, true) { } public Form(string name, float height, float weight, uint baseExperience, TypeIdentifier[] types, StaticStatisticSet baseStats, IReadOnlyCollection abilities, IReadOnlyCollection hiddenAbilities, LearnableMoves learnableMoves, IReadOnlyCollection flags) { var typesArr = types.ArrayPtr(); var abilitiesPtrArray = abilities.Select(x => x.ToPtr()).ToArray(); var hiddenAbilitiesPtrArray = hiddenAbilities.Select(x => x.ToPtr()).ToArray(); var flagsPtrArray = flags.Select(x => x.ToPtr()).ToArray(); var ptr = Interface.form_new(name.ToPtr(), height, weight, baseExperience, typesArr, (ulong)types.Length, baseStats.TakeOwnershipAndInvalidate(), abilitiesPtrArray.ArrayPtr(), (ulong)abilities.Count, hiddenAbilitiesPtrArray.ArrayPtr(), (ulong)hiddenAbilities.Count, learnableMoves.TakeOwnershipAndInvalidate(), flagsPtrArray.ArrayPtr(), (ulong)flags.Count); InitializePointer(ptr, true); } public string Name => Cache.Name ??= Interface.form_name(Ptr).PtrString()!; public float Height => Cache.Height ??= Interface.form_height(Ptr); public float Weight => Cache.Weight ??= Interface.form_weight(Ptr); public uint BaseExperience => Cache.BaseExperience ??= Interface.form_base_experience(Ptr); public IReadOnlyList Types => Cache.Types ??= new CachedExternValueArray(Interface.form_types_length(Ptr), arg => Interface.form_types_get(Ptr, arg)); public StaticStatisticSet BaseStats => Cache.BaseStats ??= new StaticStatisticSet(Interface.form_base_stats(Ptr), false); public IReadOnlyList Abilities => Cache.Abilities ??= new CachedExternArray(Interface.form_abilities_length(Ptr), arg => Interface.form_abilities_get(Ptr, arg).PtrString()!); public IReadOnlyList HiddenAbilities => Cache.HiddenAbilities ??= new CachedExternArray(Interface.form_hidden_abilities_length(Ptr), arg => Interface.form_hidden_abilities_get(Ptr, arg).PtrString()!); public LearnableMoves LearnableMoves => Cache.LearnableMoves ??= new LearnableMoves(Interface.form_moves(Ptr), false); protected override CacheData CreateCache() => new CacheData(); protected override void Destructor() => Interface.form_drop(Ptr); public override void InvalidateChildren() { Cache.LearnableMoves?.Invalidate(); } ~Form() { Dispose(); } } }