From 3571b2130e00a6e375bf91fa91400cd3da5bffe2 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Fri, 7 Mar 2025 12:07:57 +0100 Subject: [PATCH] Adds more move scripts --- PkmnLib.Static/Utils/StringKey.cs | 13 ++++ PkmnLib.Tests/Data/Moves.json | 67 ++++++++++++++++--- .../Scripts/Moves/BaseChargeMove.cs | 3 +- .../Scripts/Moves/ElectricTerrain.cs | 2 +- .../Scripts/Moves/FreezeShock.cs | 4 +- .../Scripts/Moves/GearUp.cs | 27 ++++++++ .../Scripts/Moves/GenesisSupernova.cs | 17 +++++ .../Scripts/Moves/Geomancy.cs | 19 ++++++ .../Scripts/Moves/GrassKnot.cs | 20 ++++++ .../Scripts/Moves/GrassPledge.cs | 7 ++ .../Scripts/Moves/GrassTerrain.cs | 14 ++++ .../Scripts/Pokemon/BaseChargeEffect.cs | 5 +- .../Scripts/Pokemon/FreezeShockEffect.cs | 5 +- .../Scripts/Terrain/ElectricTerrain.cs | 2 +- .../Scripts/Terrain/GrassyTerrain.cs | 2 +- .../Scripts/Terrain/PsychicTerrain.cs | 7 ++ 16 files changed, 193 insertions(+), 21 deletions(-) create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GenesisSupernova.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassKnot.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassPledge.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GrassTerrain.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Terrain/PsychicTerrain.cs 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