using System; using System.Collections.Generic; using System.Linq; using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.MoveData; namespace PkmnLibSharp.StaticData { public class SecondaryEffect : ExternPointer { public class CacheData { public float? Chance { get; internal set; } public string? Name { get; internal set; } public DisposableCachedExternArray? Parameters { get; internal set; } } internal SecondaryEffect(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } public SecondaryEffect(float chance, string effectName, IReadOnlyCollection parameters) { var parameterPtrs = parameters.Select(x => x.TakeOwnershipAndInvalidate()).ToArray(); var parameterArrayPtr = parameterPtrs.ArrayPtr(); InitializePointer( Interface.secondary_effect_new(chance, effectName.ToPtr(), parameterArrayPtr, (ulong)parameters.Count), true); } public float Chance => Cache.Chance ??= Interface.secondary_effect_chance(Ptr); public string Name => Cache.Name ?? (Cache.Name = Interface.secondary_effect_effect_name(Ptr).PtrString()!); public IReadOnlyList GetParameters() { return Cache.Parameters ??= new DisposableCachedExternArray( Interface.secondary_effect_parameter_length(Ptr), arg => new EffectParameter(Interface.secondary_effect_parameter_get(Ptr, arg), false)); } protected override CacheData CreateCache() { return new CacheData(); } protected override void Destructor() { Interface.secondary_effect_drop(Ptr); } public override void InvalidateChildren() { base.InvalidateChildren(); if (Cache.Parameters != null) { for (var index = 0; index < Cache.Parameters.Count; index++) { Cache.Parameters.GetCachedValue(index)?.Invalidate(); } Cache.Parameters.Dispose(); } } ~SecondaryEffect() { Dispose(); } } }