diff --git a/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs b/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs
index d81bd4b..0ba6793 100644
--- a/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs
+++ b/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs
@@ -1,7 +1,6 @@
using System;
using System.Runtime.InteropServices;
-
-using LevelInt = System.Byte;
+using PkmnLibSharp.StaticData;
namespace PkmnLibSharp.FFI.StaticData
{
diff --git a/PkmnLibRSharp/FFI/StaticData/LearnableMoves.cs b/PkmnLibRSharp/FFI/StaticData/LearnableMoves.cs
index fbcd070..fcf11d2 100644
--- a/PkmnLibRSharp/FFI/StaticData/LearnableMoves.cs
+++ b/PkmnLibRSharp/FFI/StaticData/LearnableMoves.cs
@@ -2,8 +2,6 @@ using System;
using System.Runtime.InteropServices;
using PkmnLibSharp.StaticData;
-using LevelInt = System.Byte;
-
namespace PkmnLibSharp.FFI.StaticData
{
internal static class LearnableMoves
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs
new file mode 100644
index 0000000..bf8a90d
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class AbilityLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr ability_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void ability_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr ability_library_get(IntPtr ptr, IntPtr key);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr ability_library_get_key_by_index(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void ability_library_add(IntPtr ptr, IntPtr key, IntPtr value);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern ulong ability_library_len(IntPtr ptr);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs
new file mode 100644
index 0000000..43732e6
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Runtime.InteropServices;
+using PkmnLibSharp.StaticData;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class GrowthRateLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr growth_rate_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void growth_rate_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern LevelInt growth_rate_library_calculate_level(IntPtr ptr, IntPtr growthRate, uint experience);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern uint growth_rate_library_calculate_experience(IntPtr ptr, IntPtr growthRate, LevelInt level);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern uint growth_rate_library_add_growth_rate(IntPtr ptr, IntPtr name, IntPtr growthRate);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs
new file mode 100644
index 0000000..51b0dc4
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class ItemLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr item_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void item_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr item_library_get(IntPtr ptr, IntPtr key);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr item_library_get_key_by_index(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void item_library_add(IntPtr ptr, IntPtr key, IntPtr value);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern ulong item_library_len(IntPtr ptr);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs
new file mode 100644
index 0000000..e5259f2
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Runtime.InteropServices;
+using PkmnLibSharp.StaticData;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class LibrarySettings
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr library_settings_new(LevelInt maxLevel);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void library_settings_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern LevelInt library_settings_maximum_level(IntPtr ptr);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs
new file mode 100644
index 0000000..68274f9
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class MoveLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr move_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void move_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr move_library_get(IntPtr ptr, IntPtr key);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr move_library_get_key_by_index(IntPtr ptr, ulong index);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void move_library_add(IntPtr ptr, IntPtr key, IntPtr value);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern ulong move_library_len(IntPtr ptr);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs
new file mode 100644
index 0000000..83eb31d
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class NatureLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr nature_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void nature_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void nature_library_load_nature(IntPtr ptr, IntPtr name, IntPtr nature);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr nature_library_get_nature(IntPtr ptr, IntPtr name);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr nature_library_get_nature_name(IntPtr ptr, IntPtr nature);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs
index 1813ea8..5ac5844 100644
--- a/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs
@@ -14,6 +14,9 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries
[DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern IntPtr species_library_get(IntPtr ptr, IntPtr key);
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr species_library_get_key_by_index(IntPtr ptr, ulong index);
+
[DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern void species_library_add(IntPtr ptr, IntPtr key, IntPtr value);
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs
new file mode 100644
index 0000000..2b5e955
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class StaticData
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_new(IntPtr settings);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void static_data_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_settings(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_species(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_moves(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_items(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_growth_rates(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_types(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_natures(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr static_data_abilities(IntPtr ptr);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs
new file mode 100644
index 0000000..be6a126
--- /dev/null
+++ b/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Runtime.InteropServices;
+using PkmnLibSharp.StaticData;
+
+namespace PkmnLibSharp.FFI.StaticData.Libraries
+{
+ internal static class TypeLibrary
+ {
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr type_library_new(ulong capacity);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void type_library_drop(IntPtr ptr);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern TypeIdentifier type_library_get_type_id(IntPtr ptr, IntPtr name, IntPtr success);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern IntPtr type_library_get_type_name(IntPtr ptr, TypeIdentifier typeIdentifier,
+ IntPtr success);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern float type_library_get_single_effectiveness(IntPtr ptr, TypeIdentifier attacking,
+ TypeIdentifier defending);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern float type_library_get_effectiveness(IntPtr ptr, TypeIdentifier attacking,
+ IntPtr defending, ulong defendingLength);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern TypeIdentifier type_library_register_type(IntPtr ptr, IntPtr name);
+
+ [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
+ internal static extern void type_library_set_effectiveness(IntPtr ptr, TypeIdentifier attacking,
+ TypeIdentifier defending, float effectiveness);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/PkmnLibRSharp.csproj b/PkmnLibRSharp/PkmnLibRSharp.csproj
index 62138a8..31ec70f 100644
--- a/PkmnLibRSharp/PkmnLibRSharp.csproj
+++ b/PkmnLibRSharp/PkmnLibRSharp.csproj
@@ -11,6 +11,11 @@
6
true
;NU1605;CA2000
+ true
+
+
+
+ true
diff --git a/PkmnLibRSharp/StaticData/Ability.cs b/PkmnLibRSharp/StaticData/Ability.cs
index d1ef3cb..a1ba946 100644
--- a/PkmnLibRSharp/StaticData/Ability.cs
+++ b/PkmnLibRSharp/StaticData/Ability.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
@@ -27,6 +28,10 @@ namespace PkmnLibSharp.StaticData
true);
}
+ internal Ability(IntPtr ptr, bool isOwner) : base(ptr, isOwner)
+ {
+ }
+
public string Name => Cache.Name ?? (Cache.Name = Interface.ability_name(Ptr));
public string Effect => Cache.Effect ?? (Cache.Effect = Interface.ability_effect(Ptr));
@@ -55,5 +60,14 @@ namespace PkmnLibSharp.StaticData
{
Interface.ability_drop(Ptr);
}
+
+ public override void InvalidateChildren()
+ {
+ if (Cache.Parameters == null) return;
+ foreach (var cacheParameter in Cache.Parameters)
+ {
+ cacheParameter?.Invalidate();
+ }
+ }
}
}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/Form.cs b/PkmnLibRSharp/StaticData/Form.cs
index 23bd549..0ab474e 100644
--- a/PkmnLibRSharp/StaticData/Form.cs
+++ b/PkmnLibRSharp/StaticData/Form.cs
@@ -72,5 +72,10 @@ namespace PkmnLibSharp.StaticData
protected override CacheData CreateCache() => new CacheData();
protected override void Destructor() => Interface.form_drop(Ptr);
+
+ public override void InvalidateChildren()
+ {
+ Cache.LearnableMoves?.Invalidate();
+ }
}
}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/GrowthRate.cs b/PkmnLibRSharp/StaticData/GrowthRate.cs
index 9e23e84..93c6b02 100644
--- a/PkmnLibRSharp/StaticData/GrowthRate.cs
+++ b/PkmnLibRSharp/StaticData/GrowthRate.cs
@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using PkmnLibSharp.Utils;
using Interface = PkmnLibSharp.FFI.StaticData.GrowthRate;
-using LevelInt = System.Byte;
namespace PkmnLibSharp.StaticData
{
diff --git a/PkmnLibRSharp/StaticData/Item.cs b/PkmnLibRSharp/StaticData/Item.cs
index 42d8e8a..c328e0a 100644
--- a/PkmnLibRSharp/StaticData/Item.cs
+++ b/PkmnLibRSharp/StaticData/Item.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using System.Linq;
using PkmnLibSharp.Utils;
@@ -102,6 +103,10 @@ namespace PkmnLibSharp.StaticData
InitializePointer(ptr, true);
}
+ internal Item(IntPtr ptr, bool isOwner) : base(ptr, isOwner)
+ {
+ }
+
public string Name => Cache.Name ??= Interface.item_name(Ptr).PtrString()!;
public ItemCategory Category => Cache.Category ??= Interface.item_category(Ptr);
public BattleItemCategory BattleCategory => Cache.BattleCategory ??= Interface.item_battle_category(Ptr);
diff --git a/PkmnLibRSharp/StaticData/LearnableMoves.cs b/PkmnLibRSharp/StaticData/LearnableMoves.cs
index 954d0b6..9baed7f 100644
--- a/PkmnLibRSharp/StaticData/LearnableMoves.cs
+++ b/PkmnLibRSharp/StaticData/LearnableMoves.cs
@@ -1,7 +1,6 @@
using System;
using PkmnLibSharp.Utils;
using Interface = PkmnLibSharp.FFI.StaticData.LearnableMoves;
-using LevelInt = System.Byte;
namespace PkmnLibSharp.StaticData
{
diff --git a/PkmnLibRSharp/StaticData/LevelInt.cs b/PkmnLibRSharp/StaticData/LevelInt.cs
new file mode 100644
index 0000000..ff239ef
--- /dev/null
+++ b/PkmnLibRSharp/StaticData/LevelInt.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using BackingLevelInt = System.Byte;
+
+namespace PkmnLibSharp.StaticData
+{
+ [StructLayout(LayoutKind.Explicit)]
+ public struct LevelInt : IComparable, IComparable, IComparable, IConvertible,
+ IEquatable, IEquatable, IEquatable, IFormattable
+ {
+ [FieldOffset(0)] private BackingLevelInt _value;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static implicit operator BackingLevelInt(LevelInt l)
+ {
+ return l._value;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static implicit operator LevelInt(BackingLevelInt b)
+ {
+ return new LevelInt { _value = b };
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (obj is LevelInt l)
+ return _value.CompareTo(l._value);
+ return _value.CompareTo(obj);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public int CompareTo(BackingLevelInt other) => _value.CompareTo(other);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public int CompareTo(LevelInt other) => _value.CompareTo(other._value);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public TypeCode GetTypeCode() => Type.GetTypeCode(typeof(BackingLevelInt));
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool ToBoolean(IFormatProvider provider) => ((IConvertible)_value).ToBoolean(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public byte ToByte(IFormatProvider provider) => ((IConvertible)_value).ToByte(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public char ToChar(IFormatProvider provider) => ((IConvertible)_value).ToChar(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public DateTime ToDateTime(IFormatProvider provider) => ((IConvertible)_value).ToDateTime(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public decimal ToDecimal(IFormatProvider provider) => ((IConvertible)_value).ToDecimal(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public double ToDouble(IFormatProvider provider) => ((IConvertible)_value).ToDouble(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public short ToInt16(IFormatProvider provider) => ((IConvertible)_value).ToInt16(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public int ToInt32(IFormatProvider provider) => ((IConvertible)_value).ToInt32(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public long ToInt64(IFormatProvider provider) => ((IConvertible)_value).ToInt64(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public sbyte ToSByte(IFormatProvider provider) => ((IConvertible)_value).ToSByte(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float ToSingle(IFormatProvider provider) => ((IConvertible)_value).ToSingle(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public string ToString(IFormatProvider provider) => _value.ToString(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public object ToType(Type conversionType, IFormatProvider provider) =>
+ ((IConvertible)_value).ToType(conversionType, provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public ushort ToUInt16(IFormatProvider provider) => ((IConvertible)_value).ToUInt16(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public uint ToUInt32(IFormatProvider provider) => ((IConvertible)_value).ToUInt32(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public ulong ToUInt64(IFormatProvider provider) => ((IConvertible)_value).ToUInt64(provider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool Equals(BackingLevelInt other) => _value == other;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public string ToString(string format, IFormatProvider formatProvider) =>
+ _value.ToString(format, formatProvider);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool Equals(LevelInt other) => _value == other._value;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool Equals(int other) => _value == other;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public override bool Equals(object? obj) => obj is LevelInt other && Equals(other);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public override int GetHashCode()
+ {
+ return _value.GetHashCode();
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool operator ==(LevelInt left, LevelInt right) => left.Equals(right);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool operator !=(LevelInt left, LevelInt right) => !left.Equals(right);
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs
new file mode 100644
index 0000000..535ad8c
--- /dev/null
+++ b/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs
@@ -0,0 +1,41 @@
+using System;
+using PkmnLibSharp.Utils;
+using Interface = PkmnLibSharp.FFI.StaticData.Libraries.ItemLibrary;
+
+namespace PkmnLibSharp.StaticData.Libraries
+{
+ public class AbilityLibrary : DataLibrary
+ {
+ public AbilityLibrary(ulong capacity) : base(Interface.item_library_new(capacity), true)
+ {
+ }
+
+ internal AbilityLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner)
+ {
+ }
+
+ protected override void Destructor() => Interface.item_library_drop(Ptr);
+
+ public override void Add(string key, Ability value) =>
+ Interface.item_library_add(Ptr, key.ToPtr(), value.TakeOwnershipAndInvalidate());
+
+ public override int Count => (int)Interface.item_library_len(Ptr);
+
+ protected override Ability? GetValueByKey(string key)
+ {
+ var ptr = Interface.item_library_get(Ptr, key.ToPtr());
+ return ptr == IntPtr.Zero ? null : new Ability(ptr, false);
+ }
+
+ public override string? GetKeyByIndex(ulong index) =>
+ Interface.item_library_get_key_by_index(Ptr, index).PtrString();
+
+ public override void InvalidateChildren()
+ {
+ foreach (var value in Cache.ValueCache.Values)
+ {
+ value.Invalidate();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs
index 22fe855..9447300 100644
--- a/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs
+++ b/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs
@@ -1,10 +1,12 @@
using System;
+using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using PkmnLibSharp.Utils;
namespace PkmnLibSharp.StaticData.Libraries
{
- public abstract class DataLibrary : ExternPointer.CacheData>
+ public abstract class DataLibrary : ExternPointer.CacheData>, IReadOnlyDictionary
{
protected DataLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner)
{
@@ -12,25 +14,32 @@ namespace PkmnLibSharp.StaticData.Libraries
public class CacheData
{
+ public List? KeyCache { get; internal set; }
public Dictionary ValueCache { get; } = new();
}
public abstract void Add(string key, T value);
- public abstract ulong Length { get; }
+ public abstract int Count { get; }
protected abstract T? GetValueByKey(string key);
- public bool TryGetValue(string key, out T? value)
+ public bool ContainsKey(string key)
+ {
+ return GetValueByKey(key) != null;
+ }
+
+ public bool TryGetValue(string key, out T value)
{
if (Cache.ValueCache.TryGetValue(key, out value) && value != null)
return true;
- value = GetValueByKey(key);
- if (value != null)
+ var v = GetValueByKey(key);
+ if (v != null)
{
- Cache.ValueCache.Add(key, value);
+ Cache.ValueCache.Add(key, v);
+ value = v;
}
- return value != null;
+ return v != null;
}
public T this[string key]
@@ -43,6 +52,43 @@ namespace PkmnLibSharp.StaticData.Libraries
}
}
+ public abstract string? GetKeyByIndex(ulong index);
+
+ public IEnumerable Keys
+ {
+ get
+ {
+ if (Cache.KeyCache == null)
+ {
+ Cache.KeyCache = new List(Count);
+ for (ulong i = 0; i < (ulong)Count; i++)
+ {
+ var key = GetKeyByIndex(i);
+ if (key == null)
+ break;
+ Cache.KeyCache.Add(key);
+ }
+ }
+
+ return Cache.KeyCache;
+ }
+ }
+
+ public IEnumerable Values
+ {
+ get { return Keys.Select(key => this[key]); }
+ }
+
protected override CacheData CreateCache() => new();
+
+ public IEnumerator> GetEnumerator()
+ {
+ return Keys.Select(key => new KeyValuePair(key, this[key])).GetEnumerator();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
}
}
\ No newline at end of file
diff --git a/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs
new file mode 100644
index 0000000..238e13f
--- /dev/null
+++ b/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs
@@ -0,0 +1,33 @@
+using System;
+using JetBrains.Annotations;
+using PkmnLibSharp.Utils;
+using Interface = PkmnLibSharp.FFI.StaticData.Libraries.GrowthRateLibrary;
+
+namespace PkmnLibSharp.StaticData.Libraries
+{
+ public class GrowthRateLibrary : ExternPointer