diff --git a/PkmnLib.Static/Utils/StringKey.cs b/PkmnLib.Static/Utils/StringKey.cs
index 0ef5ef8..f962706 100644
--- a/PkmnLib.Static/Utils/StringKey.cs
+++ b/PkmnLib.Static/Utils/StringKey.cs
@@ -46,4 +46,17 @@ public readonly record struct StringKey
///
public static bool operator !=(StringKey left, string right) => !(left == right);
+
+ ///
+ public static bool operator ==(StringKey? left, string? right) =>
+ (left is null && right is null) || (right != null && (left?.Equals(right) ?? false));
+
+ ///
+ public static bool operator !=(StringKey? left, string? right) => !(left == right);
+
+ ///
+ public static bool operator ==(StringKey? left, StringKey right) => left?.Equals(right) ?? false;
+
+ ///
+ public static bool operator !=(StringKey? left, StringKey right) => !(left == right);
}
\ No newline at end of file
diff --git a/PkmnLib.Tests/Data/Moves.json b/PkmnLib.Tests/Data/Moves.json
index 4778e59..1d67481 100755
--- a/PkmnLib.Tests/Data/Moves.json
+++ b/PkmnLib.Tests/Data/Moves.json
@@ -4346,7 +4346,10 @@
"flags": [
"snatch",
"ignore-substitute"
- ]
+ ],
+ "effect": {
+ "name": "gear_up"
+ }
},
{
"name": "genesis_supernova",
@@ -4357,7 +4360,10 @@
"priority": 0,
"target": "Any",
"category": "special",
- "flags": []
+ "flags": [],
+ "effect": {
+ "name": "genesis_supernova"
+ }
},
{
"name": "geomancy",
@@ -4371,7 +4377,10 @@
"flags": [
"charge",
"nonskybattle"
- ]
+ ],
+ "effect": {
+ "name": "geomancy"
+ }
},
{
"name": "giga_drain",
@@ -4386,7 +4395,13 @@
"protect",
"mirror",
"heal"
- ]
+ ],
+ "effect": {
+ "name": "drain",
+ "parameters": {
+ "drain_modifier": 0.5
+ }
+ }
},
{
"name": "giga_impact",
@@ -4402,7 +4417,10 @@
"recharge",
"protect",
"mirror"
- ]
+ ],
+ "effect": {
+ "name": "requires_recharge"
+ }
},
{
"name": "gigavolt_havoc__physical",
@@ -4438,7 +4456,13 @@
"flags": [
"protect",
"mirror"
- ]
+ ],
+ "effect": {
+ "name": "change_target_speed",
+ "parameters": {
+ "amount": -1
+ }
+ }
},
{
"name": "glare",
@@ -4453,7 +4477,13 @@
"protect",
"reflectable",
"mirror"
- ]
+ ],
+ "effect": {
+ "name": "set_status",
+ "parameters": {
+ "status": "paralyzed"
+ }
+ }
},
{
"name": "grass_knot",
@@ -4469,7 +4499,10 @@
"protect",
"mirror",
"nonskybattle"
- ]
+ ],
+ "effect": {
+ "name": "grass_knot"
+ }
},
{
"name": "grass_pledge",
@@ -4484,7 +4517,10 @@
"protect",
"mirror",
"nonskybattle"
- ]
+ ],
+ "effect": {
+ "name": "grass_pledge"
+ }
},
{
"name": "grass_whistle",
@@ -4501,7 +4537,13 @@
"mirror",
"sound",
"ignore-substitute"
- ]
+ ],
+ "effect": {
+ "name": "set_status",
+ "parameters": {
+ "status": "sleep"
+ }
+ }
},
{
"name": "grassy_terrain",
@@ -4514,7 +4556,10 @@
"category": "status",
"flags": [
"nonskybattle"
- ]
+ ],
+ "effect": {
+ "name": "grassy_terrain"
+ }
},
{
"name": "gravity",
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BaseChargeMove.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BaseChargeMove.cs
index ff0d57a..9ad64e5 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BaseChargeMove.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BaseChargeMove.cs
@@ -1,8 +1,9 @@
using System.Collections.Generic;
+using PkmnLib.Plugin.Gen7.Scripts.Pokemon;
namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
-public abstract class BaseChargeMove : Script where TVolatile : Script
+public abstract class BaseChargeMove : Script where TVolatile : RequireChargeEffect
{
public abstract TVolatile CreateVolatile(IPokemon user);
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ElectricTerrain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ElectricTerrain.cs
index c98054d..c61fcc8 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ElectricTerrain.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ElectricTerrain.cs
@@ -7,6 +7,6 @@ public class ElectricTerrain : Script
public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
{
var battleData = move.User.BattleData;
- battleData?.Battle.SetTerrain(ScriptUtils.ResolveName());
+ battleData?.Battle.SetTerrain(ScriptUtils.ResolveName());
}
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs
index 727fec4..6708df4 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs
@@ -3,10 +3,10 @@ using PkmnLib.Plugin.Gen7.Scripts.Pokemon;
namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
[Script(ScriptCategory.Move, "freeze_shock")]
-public class FreezeShock : BaseChargeMove
+public class FreezeShock : BaseChargeMove
{
///
- public override FreezeShockEffect CreateVolatile(IPokemon user) => new(user);
+ public override RequireChargeEffect CreateVolatile(IPokemon user) => new(user, "freeze_shock");
///
public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs
new file mode 100644
index 0000000..f0f9e00
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs
@@ -0,0 +1,27 @@
+using PkmnLib.Static;
+using PkmnLib.Static.Utils;
+
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "gear_up")]
+public class GearUp : Script
+{
+ ///
+ public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
+ {
+ var battleData = move.User.BattleData;
+ if (battleData == null)
+ return;
+
+ var side = battleData.Battle.Sides[battleData.SideIndex];
+ EventBatchId evtBatchId = new();
+ foreach (var pokemon in side.Pokemon.WhereNotNull())
+ {
+ var ability = pokemon.ActiveAbility?.Name;
+ if (ability != "plus" && ability != "minus")
+ continue;
+ pokemon.ChangeStatBoost(Statistic.Attack, 1, pokemon == move.User, evtBatchId);
+ pokemon.ChangeStatBoost(Statistic.SpecialAttack, 1, pokemon == move.User, evtBatchId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GenesisSupernova.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GenesisSupernova.cs
new file mode 100644
index 0000000..1a2c93c
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GenesisSupernova.cs
@@ -0,0 +1,17 @@
+using PkmnLib.Plugin.Gen7.Scripts.Terrain;
+
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "genesis_supernova")]
+public class GenesisSupernova : Script
+{
+ ///
+ public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
+ {
+ var battleData = move.User.BattleData;
+ if (battleData == null)
+ return;
+
+ battleData.Battle.SetTerrain(ScriptUtils.ResolveName());
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs
new file mode 100644
index 0000000..627d3f6
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs
@@ -0,0 +1,19 @@
+using PkmnLib.Plugin.Gen7.Scripts.Pokemon;
+using PkmnLib.Static;
+
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+public class Geomancy : BaseChargeMove
+{
+ ///
+ public override RequireChargeEffect CreateVolatile(IPokemon user) => new(user, "geomancy");
+
+ ///
+ public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
+ {
+ EventBatchId eventBatchId = new();
+ move.User.ChangeStatBoost(Statistic.SpecialAttack, 2, true, eventBatchId);
+ move.User.ChangeStatBoost(Statistic.SpecialDefense, 2, true, eventBatchId);
+ move.User.ChangeStatBoost(Statistic.Speed, 2, true, eventBatchId);
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassKnot.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassKnot.cs
new file mode 100644
index 0000000..e4337b7
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassKnot.cs
@@ -0,0 +1,20 @@
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "grass_knot")]
+public class GrassKnot : Script
+{
+ ///
+ public override void ChangeBasePower(IExecutingMove move, IPokemon target, byte hit, ref byte basePower)
+ {
+ var targetWeight = target.WeightInKg;
+ basePower = targetWeight switch
+ {
+ < 10 => 20,
+ < 25 => 40,
+ < 50 => 60,
+ < 100 => 80,
+ < 200 => 100,
+ _ => 120,
+ };
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassPledge.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassPledge.cs
new file mode 100644
index 0000000..0ef9511
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassPledge.cs
@@ -0,0 +1,7 @@
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "grass_pledge")]
+public class GrassPledge : Script
+{
+ // TODO: pledge moves
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassTerrain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassTerrain.cs
new file mode 100644
index 0000000..64ca658
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassTerrain.cs
@@ -0,0 +1,14 @@
+using PkmnLib.Plugin.Gen7.Scripts.Terrain;
+
+namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
+
+[Script(ScriptCategory.Move, "grassy_terrain")]
+public class GrassyTerrain : Script
+{
+ ///
+ public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
+ {
+ var battleData = move.User.BattleData;
+ battleData?.Battle.SetTerrain(ScriptUtils.ResolveName());
+ }
+}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs
index a4b9c0e..1ddf80f 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs
@@ -1,13 +1,14 @@
using PkmnLib.Plugin.Gen7.Scripts.Utils;
+using PkmnLib.Static.Utils;
namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon;
public abstract class BaseChargeEffect : Script
{
private readonly IPokemon _owner;
- private readonly string _moveName;
+ private readonly StringKey _moveName;
- public BaseChargeEffect(IPokemon owner, string moveName)
+ public BaseChargeEffect(IPokemon owner, StringKey moveName)
{
_owner = owner;
_moveName = moveName;
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FreezeShockEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FreezeShockEffect.cs
index 83b5660..bbf9298 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FreezeShockEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FreezeShockEffect.cs
@@ -1,4 +1,5 @@
+using PkmnLib.Static.Utils;
+
namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon;
-[Script(ScriptCategory.Pokemon, "freeze_shock")]
-public class FreezeShockEffect(IPokemon owner) : BaseChargeEffect(owner, "freeze_shock");
\ No newline at end of file
+public class RequireChargeEffect(IPokemon owner, StringKey moveName) : BaseChargeEffect(owner, moveName);
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/ElectricTerrain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/ElectricTerrain.cs
index 7132eba..8d737d1 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/ElectricTerrain.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/ElectricTerrain.cs
@@ -3,5 +3,5 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Terrain;
[Script(ScriptCategory.Terrain, "electric_terrain")]
public class ElectricTerrain : Script
{
- // TODO: Implement Electric Terrain
+ // TODO: Implement Terrain
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/GrassyTerrain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/GrassyTerrain.cs
index 82aebff..d82c38a 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/GrassyTerrain.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/GrassyTerrain.cs
@@ -3,5 +3,5 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Terrain;
[Script(ScriptCategory.Terrain, "grassy_terrain")]
public class GrassyTerrain : Script
{
- // TODO: Implement Electric Terrain
+ // TODO: Implement Terrain
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/PsychicTerrain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/PsychicTerrain.cs
new file mode 100644
index 0000000..489d8db
--- /dev/null
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/PsychicTerrain.cs
@@ -0,0 +1,7 @@
+namespace PkmnLib.Plugin.Gen7.Scripts.Terrain;
+
+[Script(ScriptCategory.Terrain, "psychic_terrain")]
+public class PsychicTerrain : Script
+{
+ // TODO: Implement Terrain
+}
\ No newline at end of file