diff --git a/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs b/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs
index bce904b..fb4737f 100644
--- a/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs
+++ b/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs
@@ -58,7 +58,7 @@ public class ScriptRegistry
var constructor = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null, Type.EmptyTypes, null);
if (constructor == null)
- throw new ArgumentException($"Type {type} does not have a parameterless constructor.");
+ return;
// We create a lambda that creates a new instance of the script type.
// This is more performant than using Activator.CreateInstance.
diff --git a/PkmnLib.Tests/Data/Moves.json b/PkmnLib.Tests/Data/Moves.json
index dbe9473..3254c94 100755
--- a/PkmnLib.Tests/Data/Moves.json
+++ b/PkmnLib.Tests/Data/Moves.json
@@ -307,7 +307,7 @@
"category": "status",
"flags": [],
"effect": {
- "name": "SwapWithTarget"
+ "name": "ally_switch"
}
},
{
@@ -644,7 +644,7 @@
"mirror"
],
"effect": {
- "name": "double_power_user_damaged_by_target_in_turn"
+ "name": "double_power_if_target_damaged_in_turn"
}
},
{
@@ -2371,7 +2371,7 @@
"mirror"
],
"effect": {
- "name": "raise_user_defense",
+ "name": "change_user_defense",
"chance": 50,
"parameters": {
"amount": 2
diff --git a/PkmnLib.Tests/DataTests/MoveDataTests.cs b/PkmnLib.Tests/DataTests/MoveDataTests.cs
new file mode 100644
index 0000000..feb5ab2
--- /dev/null
+++ b/PkmnLib.Tests/DataTests/MoveDataTests.cs
@@ -0,0 +1,30 @@
+using PkmnLib.Dynamic.ScriptHandling;
+using PkmnLib.Tests.Integration;
+
+namespace PkmnLib.Tests.DataTests;
+
+public class MoveDataTests
+{
+ [Test]
+ public async Task AllMoveEffectsHaveValidScripts()
+ {
+ var library = LibraryHelpers.LoadLibrary();
+ var moveLibrary = library.StaticLibrary.Moves;
+ foreach (var move in moveLibrary)
+ {
+ if (move.SecondaryEffect == null)
+ continue;
+ var scriptName = move.SecondaryEffect.Name;
+
+ try
+ {
+ await Assert.That(library.ScriptResolver.TryResolve(ScriptCategory.Move, scriptName,
+ move.SecondaryEffect.Parameters, out var script)).IsTrue();
+ }
+ catch (Exception e)
+ {
+ throw new AggregateException($"Failed to resolve script for move {move.Name} with effect {scriptName}", e);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/AllySwitch.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/AllySwitch.cs
new file mode 100644
index 0000000..b2ef15e
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/AllySwitch.cs
@@ -0,0 +1,7 @@
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "ally_switch")]
+public class AllySwitch : Script
+{
+ // TODO: Implement the AllySwitch script.
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Belch.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Belch.cs
index 99bbbd3..57733fc 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Belch.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Belch.cs
@@ -3,6 +3,7 @@ using PkmnLib.Static;
namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+[Script(ScriptCategory.Move, "belch")]
public class Belch : Script
{
///
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs
index f7a7c11..24a6f5e 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs
@@ -21,7 +21,7 @@ public class ChangeAllTargetStats : Script
{
throw new ArgumentException("Parameter 'amount' is required.");
}
- _amount = (sbyte)amount;
+ _amount = (sbyte)(int)amount;
}
///
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs
index 7f2bb6f..11888ec 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs
@@ -28,7 +28,7 @@ public abstract class ChangeTargetStats : Script
throw new ArgumentException("Parameter 'amount' is required.");
}
- _amount = (sbyte)amount;
+ _amount = (sbyte)(int)amount;
}
///
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs
index 184e839..a0f3953 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs
@@ -28,7 +28,7 @@ public abstract class ChangeUserStats : Script
throw new ArgumentException("Parameter 'amount' is required.");
}
- _amount = (sbyte)amount;
+ _amount = (sbyte)(int)amount;
}
///
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BindEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BindEffect.cs
index 5a296de..3c15ab2 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BindEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BindEffect.cs
@@ -7,10 +7,6 @@ public class BindEffect : Script
private int _turns;
private readonly float _percentOfMaxHealth;
- private BindEffect(float percentOfMaxHealth)
- {
- _percentOfMaxHealth = percentOfMaxHealth;
- }
public BindEffect(IPokemon owner, int turns, float percentOfMaxHealth)
{
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoomDesireEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoomDesireEffect.cs
index 89f822f..f60a555 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoomDesireEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoomDesireEffect.cs
@@ -19,7 +19,7 @@ public class DoomDesireEffect : Script
}
}
- private readonly IBattleSide _side;
+ private readonly IBattleSide? _side;
private List _targets = new();
public DoomDesireEffect(IBattleSide side)
@@ -40,6 +40,9 @@ public class DoomDesireEffect : Script
///
public override void OnEndTurn(IBattle battle)
{
+ if (_side == null)
+ return;
+
var toRemove = new List();
foreach (var v in _targets)
{