using System; using System.Collections.Generic; using System.Linq; 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 ulong? ParameterLength { get; internal set; } public EffectParameter?[]? Parameters { get; internal set; } } internal SecondaryEffect(IntPtr 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 ulong ParameterLength => Cache.ParameterLength ?? (Cache.ParameterLength = Interface.secondary_effect_parameter_length(Ptr)).Value; public EffectParameter GetParameter(int index) { Cache.Parameters ??= new EffectParameter[ParameterLength]; if (Cache.Parameters[index] == null) { var ptr = Interface.secondary_effect_parameter_get(Ptr, (ulong)index); Cache.Parameters[index] = new EffectParameter(ptr, false); } return Cache.Parameters[index]!; } protected override CacheData CreateCache() { return new CacheData(); } protected override void Destructor() { Interface.secondary_effect_drop(Ptr); } } }