From 45439a20a4131c6b6ab00955ab6a9cde0f416db7 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 22 Dec 2024 11:24:01 +0100 Subject: [PATCH] Adds several new scripts --- PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs | 11 +++++- .../Moves/DoublePowerIfTargetDamagedInTurn.cs | 9 ++--- .../Scripts/Moves/Drain.cs | 34 +++++++++++++++++++ .../Scripts/Moves/Flinch.cs | 16 +++++++++ .../Scripts/Pokemon/FlinchEffect.cs | 16 +++++++++ 5 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flinch.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FlinchEffect.cs diff --git a/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs b/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs index d94accd..26a4408 100644 --- a/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs +++ b/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs @@ -1,4 +1,5 @@ using System.Collections; +using PkmnLib.Dynamic.ScriptHandling.Registry; using PkmnLib.Static.Utils; namespace PkmnLib.Dynamic.ScriptHandling; @@ -26,7 +27,12 @@ public interface IScriptSet : IEnumerable /// Gets a script from the set using its unique name. /// ScriptContainer? Get(StringKey scriptKey); - + + /// + /// Gets a script from the set using its type. + /// + T? Get() where T : Script; + /// /// Removes a script from the set using its unique name. /// @@ -107,6 +113,9 @@ public class ScriptSet : IScriptSet /// public ScriptContainer? Get(StringKey scriptKey) => _scripts.FirstOrDefault(s => s.Script?.Name == scriptKey); + /// + public T? Get() where T : Script => Get(ScriptUtils.ResolveName())?.Script as T; + /// public void Remove(StringKey scriptKey) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DoublePowerIfTargetDamagedInTurn.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DoublePowerIfTargetDamagedInTurn.cs index 246dd41..83447ed 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DoublePowerIfTargetDamagedInTurn.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DoublePowerIfTargetDamagedInTurn.cs @@ -28,11 +28,12 @@ public class DoublePowerIfTargetDamagedInTurn : Script var battle = move.User.BattleData?.Battle; if (battle == null) return; - var side = battle.Sides[target.BattleData!.SideIndex]; - var script = side.VolatileScripts.Get(ScriptUtils.ResolveName()); - if (script?.Script == null) + if (target.BattleData == null) + return; + var side = battle.Sides[target.BattleData.SideIndex]; + var data = side.VolatileScripts.Get(); + if (data == null) return; - var data = (DoublePowerIfTargetDamagedInTurnData)script.Script; if (data._hitPokemon.Contains(target)) basePower *= 2; } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs new file mode 100644 index 0000000..603a7ae --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Drain.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using PkmnLib.Dynamic.Libraries; +using PkmnLib.Dynamic.Models; +using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Dynamic.ScriptHandling.Registry; +using PkmnLib.Static.Utils; + +namespace PkmnLib.Plugin.Gen7.Scripts.Moves; + +[Script(ScriptCategory.Move, "drain")] +public class Drain : Script +{ + public float DrainModifier { get; set; } = 0.5f; + + /// + public override void OnInitialize(IDynamicLibrary library, IReadOnlyDictionary? parameters) + { + base.OnInitialize(library, parameters); + if (parameters == null) + return; + DrainModifier = parameters.GetValueOrDefault("drain_modifier") as float? ?? DrainModifier; + } + + /// + public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) + { + var user = move.User; + var damage = move.GetHitData(target, hit).Damage; + var healed = (uint)(damage * DrainModifier); + if (move.User.HasHeldItem("big_root")) + healed = (uint)(healed * 1.3f); + user.Heal(healed, false); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flinch.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flinch.cs new file mode 100644 index 0000000..8bba10a --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flinch.cs @@ -0,0 +1,16 @@ +using PkmnLib.Dynamic.Models; +using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Dynamic.ScriptHandling.Registry; +using PkmnLib.Plugin.Gen7.Scripts.Pokemon; + +namespace PkmnLib.Plugin.Gen7.Scripts.Moves; + +[Script(ScriptCategory.Move, "flinch")] +public class Flinch : Script +{ + /// + public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) + { + target.Volatile.Add(new FlinchEffect()); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FlinchEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FlinchEffect.cs new file mode 100644 index 0000000..6602a9b --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FlinchEffect.cs @@ -0,0 +1,16 @@ +using PkmnLib.Dynamic.Models; +using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Dynamic.ScriptHandling.Registry; + +namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon; + +[Script(ScriptCategory.Pokemon, "flinch_effect")] +public class FlinchEffect : Script +{ + /// + public override void PreventMove(IExecutingMove move, ref bool prevent) + { + prevent = true; + RemoveSelf(); + } +} \ No newline at end of file