87 lines
3.8 KiB
C#
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();
|
|
}
|
|
}
|
|
} |