PkmnLibRSharp/PkmnLibRSharp/StaticData/Form.cs

87 lines
3.8 KiB
C#

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<Form.CacheData>
{
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<TypeIdentifier>? Types { get; internal set; }
public StaticStatisticSet<ushort>? BaseStats { get; internal set; }
public CachedExternArray<string>? Abilities { get; internal set; }
public CachedExternArray<string>? 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<short> baseStats, IReadOnlyCollection<string> abilities,
IReadOnlyCollection<string> hiddenAbilities, LearnableMoves learnableMoves,
IReadOnlyCollection<string> 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<TypeIdentifier> Types =>
Cache.Types ??= new CachedExternValueArray<TypeIdentifier>(Interface.form_types_length(Ptr),
arg => Interface.form_types_get(Ptr, arg));
public StaticStatisticSet<ushort> BaseStats =>
Cache.BaseStats ??= new StaticStatisticSet<ushort>(Interface.form_base_stats(Ptr), false);
public IReadOnlyList<string> Abilities =>
Cache.Abilities ??= new CachedExternArray<string>(Interface.form_abilities_length(Ptr),
arg => Interface.form_abilities_get(Ptr, arg).PtrString()!);
public IReadOnlyList<string> HiddenAbilities =>
Cache.HiddenAbilities ??= new CachedExternArray<string>(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();
}
}
}