diff --git a/PkmnLib.Dynamic/Models/Choices/MoveChoice.cs b/PkmnLib.Dynamic/Models/Choices/MoveChoice.cs index 054c1a8..f4bd9c0 100644 --- a/PkmnLib.Dynamic/Models/Choices/MoveChoice.cs +++ b/PkmnLib.Dynamic/Models/Choices/MoveChoice.cs @@ -1,4 +1,5 @@ using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Static.Utils; namespace PkmnLib.Dynamic.Models.Choices; @@ -31,6 +32,8 @@ public interface IMoveChoice : ITurnChoice /// The underlying script of the move. /// ScriptContainer Script { get; set; } + + Dictionary? AdditionalData { get; } } /// @@ -69,6 +72,9 @@ public class MoveChoice : TurnChoice, IMoveChoice /// public ScriptContainer Script { get; set; } = new(); + /// + public Dictionary? AdditionalData { get; } + /// public override int ScriptCount => 1 + User.ScriptCount; diff --git a/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs b/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs index c886b60..30e27c6 100644 --- a/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs +++ b/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs @@ -65,4 +65,9 @@ public class ScriptContainer : IEnumerable, IDeepCloneable } Script = null; } + + public void ClearWithoutRemoving() + { + Script = null; + } } \ No newline at end of file diff --git a/PkmnLib.Tests/Data/Moves.json b/PkmnLib.Tests/Data/Moves.json index 7fa32b6..d095ed3 100755 --- a/PkmnLib.Tests/Data/Moves.json +++ b/PkmnLib.Tests/Data/Moves.json @@ -728,7 +728,10 @@ "priority": 0, "target": "Self", "category": "status", - "flags": [] + "flags": [], + "effect": { + "name": "baton_pass" + } }, { "name": "beak_blast", diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BatonPass.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BatonPass.cs new file mode 100644 index 0000000..72e1187 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BatonPass.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using PkmnLib.Dynamic.Models; +using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Dynamic.ScriptHandling.Registry; +using PkmnLib.Static; +using PkmnLib.Static.Utils; + +namespace PkmnLib.Plugin.Gen7.Scripts.Moves; + +[Script(ScriptCategory.Move, "baton_pass")] +public class BatonPass : Script +{ + /// + public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) + { + var user = move.User; + var additionalData = move.MoveChoice.AdditionalData; + if (additionalData == null) + return; + if (additionalData["to_switch"] is not IPokemon toSwitch) + return; + var battleData = user.BattleData; + if (battleData == null) + return; + + var statBoosts = user.StatBoost; + var volatileScripts = user.Volatile.Select(x => x.Script).WhereNotNull().ToList(); + foreach (var container in user.Volatile) + { + container.ClearWithoutRemoving(); + } + + var side = battleData.Battle.Sides[battleData.SideIndex]; + side.SwapPokemon(battleData.Position, toSwitch); + + foreach (Statistic stat in Enum.GetValues(typeof(Statistic))) + { + toSwitch.StatBoost.SetStatistic(stat, statBoosts.GetStatistic(stat)); + } + toSwitch.RecalculateBoostedStats(); + + foreach (var script in volatileScripts) + { + toSwitch.Volatile.Add(script); + } + } +} \ No newline at end of file