PkmnLibRSharp/PkmnLibRSharp/StaticData/SecondaryEffect.cs

70 lines
2.3 KiB
C#

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<SecondaryEffect.CacheData>
{
public class CacheData
{
public float? Chance { get; internal set; }
public string? Name { get; internal set; }
public DisposableCachedExternArray<EffectParameter>? Parameters { get; internal set; }
}
internal SecondaryEffect(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner)
{
}
public SecondaryEffect(float chance, string effectName, IReadOnlyCollection<EffectParameter> 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<EffectParameter> GetParameters()
{
return Cache.Parameters ??= new DisposableCachedExternArray<EffectParameter>(
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();
}
}
}