From d2069fc938b95d8a671f0fe8c5362c40533a9b80 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 20 Sep 2022 17:31:20 +0200 Subject: [PATCH] Implements growth rates --- PkmnLibRSharp/FFI/StaticData/GrowthRate.cs | 22 +++++++++ PkmnLibRSharp/StaticData/GrowthRate.cs | 49 +++++++++++++++++++ PkmnLibRSharp/libpkmn_lib.so | 4 +- .../StaticData/GrowthRateTests.cs | 38 ++++++++++++++ .../StaticData/MoveDataTests.cs | 11 +++++ 5 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 PkmnLibRSharp/FFI/StaticData/GrowthRate.cs create mode 100644 PkmnLibRSharp/StaticData/GrowthRate.cs create mode 100644 PkmnLibRSharpTests/StaticData/GrowthRateTests.cs diff --git a/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs b/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs new file mode 100644 index 0000000..d81bd4b --- /dev/null +++ b/PkmnLibRSharp/FFI/StaticData/GrowthRate.cs @@ -0,0 +1,22 @@ +using System; +using System.Runtime.InteropServices; + +using LevelInt = System.Byte; + +namespace PkmnLibSharp.FFI.StaticData +{ + internal static class GrowthRate + { + [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + internal static extern IntPtr growth_rate_lookup_new(IntPtr array, ulong length); + + [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + internal static extern void growth_rate_lookup_drop(IntPtr p); + + [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + internal static extern LevelInt growth_rate_calculate_level(IntPtr p, uint experience); + + [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + internal static extern uint growth_rate_calculate_experience(IntPtr p, LevelInt level); + } +} \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/GrowthRate.cs b/PkmnLibRSharp/StaticData/GrowthRate.cs new file mode 100644 index 0000000..9e23e84 --- /dev/null +++ b/PkmnLibRSharp/StaticData/GrowthRate.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using PkmnLibSharp.Utils; +using Interface = PkmnLibSharp.FFI.StaticData.GrowthRate; +using LevelInt = System.Byte; + +namespace PkmnLibSharp.StaticData +{ + public abstract class GrowthRate : ExternPointer + { + protected internal GrowthRate() + { + } + + protected internal GrowthRate(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + { + } + + public LevelInt CalculateLevel(uint experience) + { + return Interface.growth_rate_calculate_level(Ptr, experience); + } + + public uint CalculateExperience(LevelInt level) + { + return Interface.growth_rate_calculate_experience(Ptr, level); + } + + protected override void Destructor() + { + Interface.growth_rate_lookup_drop(Ptr); + } + } + + public class LookupGrowthRate : GrowthRate + { + public LookupGrowthRate(uint[] experienceArray) + { + var arrayPtr = experienceArray.ArrayPtr(); + var ptr = Interface.growth_rate_lookup_new(arrayPtr, (ulong)experienceArray.Length); + InitializePointer(ptr, true); + } + + protected override object CreateCache() + { + return new object(); + } + } +} \ No newline at end of file diff --git a/PkmnLibRSharp/libpkmn_lib.so b/PkmnLibRSharp/libpkmn_lib.so index 9683056..5717c3e 100755 --- a/PkmnLibRSharp/libpkmn_lib.so +++ b/PkmnLibRSharp/libpkmn_lib.so @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebf27a2fcae1c04d58e5c7cde6b58479f47084ceeae09863a6cfcba5f132687f -size 155499256 +oid sha256:780800f432a4d36d270db0b0fe412a0d95eefd3fbedb0e00ce49d4487b98e8d0 +size 155516656 diff --git a/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs b/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs new file mode 100644 index 0000000..617c367 --- /dev/null +++ b/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs @@ -0,0 +1,38 @@ +using NUnit.Framework; +using PkmnLibSharp.StaticData; + +namespace PkmnLibRSharpTests.StaticData +{ + public class GrowthRateTests + { + [Test] + public void CreateAndDropLookupGrowthRate() + { + var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); + growthRate.Dispose(); + } + + [Test] + public void LookupGrowthRateCalculateLevel() + { + var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); + Assert.AreEqual(1, growthRate.CalculateLevel(0)); + Assert.AreEqual(2, growthRate.CalculateLevel(1)); + Assert.AreEqual(2, growthRate.CalculateLevel(2)); + Assert.AreEqual(3, growthRate.CalculateLevel(5)); + growthRate.Dispose(); + } + + [Test] + public void LookupGrowthRateCalculateExperience() + { + var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); + Assert.AreEqual(0, growthRate.CalculateExperience(1)); + Assert.AreEqual(1, growthRate.CalculateExperience(2)); + Assert.AreEqual(5, growthRate.CalculateExperience(3)); + Assert.AreEqual(10, growthRate.CalculateExperience(4)); + growthRate.Dispose(); + } + + } +} \ No newline at end of file diff --git a/PkmnLibRSharpTests/StaticData/MoveDataTests.cs b/PkmnLibRSharpTests/StaticData/MoveDataTests.cs index 4d4c63f..7f6788e 100644 --- a/PkmnLibRSharpTests/StaticData/MoveDataTests.cs +++ b/PkmnLibRSharpTests/StaticData/MoveDataTests.cs @@ -20,5 +20,16 @@ namespace PkmnLibRSharpTests.StaticData Assert.AreEqual(-3, move.Priority); Assert.AreEqual(null, move.SecondaryEffect); } + + [Test] + public void TestMoveWithSecondaryEffect() + { + using var effect = new SecondaryEffect(0.25f, "foobar", Array.Empty()); + using var move = new MoveData("foobar", new TypeIdentifier(), MoveCategory.Physical, 68, 23, 56, + MoveTarget.Any, -3, effect, Array.Empty()); + Assert.That(move.SecondaryEffect != null); + Assert.AreEqual("foobar", move.SecondaryEffect!.Name); + } + } } \ No newline at end of file