60 lines
2.1 KiB
C#
60 lines
2.1 KiB
C#
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<SecondaryEffect.CacheData>
|
|
{
|
|
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<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 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);
|
|
}
|
|
}
|
|
} |