diff --git a/PkmnLibRSharp/FFI/StaticData/Form.cs b/PkmnLibRSharp/FFI/StaticData/Form.cs
new file mode 100644
index 0000000..719b032
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Form.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Runtime.InteropServices;
+using PkmnLibSharp.StaticData;
+
+namespace PkmnLibSharp.FFI.StaticData
+{
+ internal static class Form
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_new(IntPtr name, float height, float weight, uint baseExperience,
+ IntPtr types, ulong typesLength, IntPtr baseStats, IntPtr abilities, ulong abilitiesLength,
+ IntPtr hiddenAbilities, ulong hiddenAbilitiesLength, IntPtr learnableMoves, IntPtr flags,
+ ulong flagsLength);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern void form_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_name(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern float form_height(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern float form_weight(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern uint form_base_experience(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern ulong form_types_length(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern TypeIdentifier form_types_get(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_base_stats(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern ulong form_abilities_length(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_abilities_get(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern ulong form_hidden_abilities_length(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_hidden_abilities_get(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern IntPtr form_moves(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)]
+ internal static extern byte form_has_flag(IntPtr ptr, IntPtr flag);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/PkmnLibRSharp.csproj b/PkmnLibRSharp/PkmnLibRSharp.csproj
index 67b5255..83b4963 100644
--- a/PkmnLibRSharp/PkmnLibRSharp.csproj
+++ b/PkmnLibRSharp/PkmnLibRSharp.csproj
@@ -3,7 +3,7 @@
netstandard2.1
PkmnLibSharp
- 8
+ 9
enable
diff --git a/PkmnLibRSharp/StaticData/Form.cs b/PkmnLibRSharp/StaticData/Form.cs
new file mode 100644
index 0000000..2f58b94
--- /dev/null
+++ b/PkmnLibRSharp/StaticData/Form.cs
@@ -0,0 +1,70 @@
+using System.Collections.Generic;
+using System.Linq;
+using PkmnLibSharp.Utils;
+using Interface = PkmnLibSharp.FFI.StaticData.Form;
+
+namespace PkmnLibSharp.StaticData
+{
+ public class Form : ExternPointer
+ {
+ 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? Types { get; internal set; }
+ public StaticStatisticSet? BaseStats { get; internal set; }
+ public CachedExternArray? Abilities { get; internal set; }
+ public CachedExternArray? HiddenAbilities { get; internal set; }
+ public LearnableMoves? LearnableMoves { get; internal set; }
+ }
+
+ public Form(string name, float height, float weight, uint baseExperience, TypeIdentifier[] types,
+ StaticStatisticSet baseStats, IReadOnlyCollection abilities,
+ IReadOnlyCollection hiddenAbilities, LearnableMoves learnableMoves,
+ IReadOnlyCollection 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 Types =>
+ Cache.Types ??= new CachedExternValueArray(Interface.form_types_length(Ptr),
+ arg => Interface.form_types_get(Ptr, arg));
+
+ public StaticStatisticSet BaseStats =>
+ Cache.BaseStats ??= new StaticStatisticSet(Interface.form_base_stats(Ptr), false);
+
+ public IReadOnlyList Abilities =>
+ Cache.Abilities ??= new CachedExternArray(Interface.form_abilities_length(Ptr),
+ arg => Interface.form_abilities_get(Ptr, arg).PtrString()!);
+
+ public IReadOnlyList HiddenAbilities =>
+ Cache.HiddenAbilities ??= new CachedExternArray(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);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/LearnableMoves.cs b/PkmnLibRSharp/StaticData/LearnableMoves.cs
index 93bf34e..954d0b6 100644
--- a/PkmnLibRSharp/StaticData/LearnableMoves.cs
+++ b/PkmnLibRSharp/StaticData/LearnableMoves.cs
@@ -1,3 +1,4 @@
+using System;
using PkmnLibSharp.Utils;
using Interface = PkmnLibSharp.FFI.StaticData.LearnableMoves;
using LevelInt = System.Byte;
@@ -6,6 +7,10 @@ namespace PkmnLibSharp.StaticData
{
public class LearnableMoves : ExternPointer