From e305cfaef66903aa6123b07cd43a833938f4e39f Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 15 Jun 2025 14:23:28 +0200 Subject: [PATCH] Support for changing turn choice when executing --- PkmnLib.Dynamic/BattleFlow/TurnRunner.cs | 1 + PkmnLib.Dynamic/Models/Battle.cs | 2 +- PkmnLib.Dynamic/ScriptHandling/Script.cs | 8 ++++++-- .../Libraries/Battling/Gen7DamageCalculator.cs | 11 +++++++---- .../Scripts/Abilities/IncreasedStabAbility.cs | 4 ++-- .../Scripts/Pokemon/BaseChargeEffect.cs | 2 +- .../PkmnLib.Plugin.Gen7/Scripts/Pokemon/BideEffect.cs | 2 +- .../Scripts/Pokemon/ChargeBounceEffect.cs | 2 +- .../Scripts/Pokemon/ChargeFlyEffect.cs | 2 +- .../Scripts/Pokemon/ChargeMoveEffect.cs | 2 +- .../Scripts/Pokemon/ChargeSkyDropEffect.cs | 2 +- .../PkmnLib.Plugin.Gen7/Scripts/Pokemon/DigEffect.cs | 2 +- .../PkmnLib.Plugin.Gen7/Scripts/Pokemon/DiveEffect.cs | 2 +- .../Scripts/Pokemon/EncoreEffect.cs | 2 +- .../Scripts/Pokemon/IceBallEffect.cs | 2 +- .../Scripts/Pokemon/OutrageLikeEffect.cs | 2 +- .../Scripts/Pokemon/PhantomForceCharge.cs | 2 +- .../Scripts/Pokemon/RequiresRechargeEffect.cs | 2 +- .../Scripts/Pokemon/ShadowForceCharge.cs | 2 +- .../Scripts/Pokemon/SkullbashEffect.cs | 2 +- .../Scripts/Pokemon/SkyAttackEffect.cs | 2 +- .../Scripts/Pokemon/TruantEffect.cs | 2 +- .../Scripts/Utils/TurnChoiceHelper.cs | 2 -- 23 files changed, 34 insertions(+), 28 deletions(-) diff --git a/PkmnLib.Dynamic/BattleFlow/TurnRunner.cs b/PkmnLib.Dynamic/BattleFlow/TurnRunner.cs index defd738..107dfdd 100644 --- a/PkmnLib.Dynamic/BattleFlow/TurnRunner.cs +++ b/PkmnLib.Dynamic/BattleFlow/TurnRunner.cs @@ -77,6 +77,7 @@ public static class TurnRunner /// public static void ExecuteChoice(IBattle battle, ITurnChoice choice) { + choice.RunScriptHook(x => x.ChangeTurnChoice(ref choice)); if (choice is IPassChoice) return; if (battle.HasEnded) diff --git a/PkmnLib.Dynamic/Models/Battle.cs b/PkmnLib.Dynamic/Models/Battle.cs index 311d48a..335d254 100644 --- a/PkmnLib.Dynamic/Models/Battle.cs +++ b/PkmnLib.Dynamic/Models/Battle.cs @@ -296,7 +296,7 @@ public class BattleImpl : ScriptSource, IBattle ITurnChoice? forcedChoice = null; pokemon.RunScriptHook(script => - script.ForceTurnSelection(battleData.SideIndex, battleData.Position, ref forcedChoice)); + script.ForceTurnSelection(this, battleData.SideIndex, battleData.Position, ref forcedChoice)); choice = forcedChoice; return choice != null; } diff --git a/PkmnLib.Dynamic/ScriptHandling/Script.cs b/PkmnLib.Dynamic/ScriptHandling/Script.cs index f3525e8..410d0c5 100644 --- a/PkmnLib.Dynamic/ScriptHandling/Script.cs +++ b/PkmnLib.Dynamic/ScriptHandling/Script.cs @@ -115,7 +115,7 @@ public abstract class Script : IDeepCloneable /// Force a certain move choice to be selected. If the choice is set, the Pokemon will be forced /// to use it, and will not be able to select any other choice. /// - public virtual void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public virtual void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { } @@ -302,7 +302,7 @@ public abstract class Script : IDeepCloneable /// This function allows a script to change the damage modifier of a Same Type Attack Bonus, which /// occurs when the user has the move type as one of its own types. /// - public virtual void ChangeStabModifier(IExecutingMove executingMove, IPokemon target, byte hitNumber, + public virtual void ChangeStabModifier(IExecutingMove executingMove, IPokemon target, byte hitNumber, bool isStab, ref float modifier) { } @@ -851,4 +851,8 @@ public abstract class Script : IDeepCloneable public virtual void OnAfterMoveChoice(IMoveChoice moveChoice) { } + + public virtual void ChangeTurnChoice(ref ITurnChoice choice) + { + } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Libraries/Battling/Gen7DamageCalculator.cs b/Plugins/PkmnLib.Plugin.Gen7/Libraries/Battling/Gen7DamageCalculator.cs index 5b2f5d4..d2d0a63 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Libraries/Battling/Gen7DamageCalculator.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Libraries/Battling/Gen7DamageCalculator.cs @@ -44,13 +44,16 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama floatDamage = MathF.Floor(floatDamage * randomFactor); } + var stabModifier = 1.0f; + var isStab = false; if (hitData.Type != null && executingMove.User.Types.Contains(hitData.Type.Value)) { - var stabModifier = 1.5f; - executingMove.RunScriptHook(script => - script.ChangeStabModifier(executingMove, target, hitNumber, ref stabModifier)); - floatDamage = MathF.Floor(floatDamage * stabModifier); + stabModifier = 1.5f; + isStab = true; } + executingMove.RunScriptHook(script => + script.ChangeStabModifier(executingMove, target, hitNumber, isStab, ref stabModifier)); + floatDamage = MathF.Floor(floatDamage * stabModifier); floatDamage = MathF.Floor(floatDamage * hitData.Effectiveness); uint damage = floatDamage switch diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IncreasedStabAbility.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IncreasedStabAbility.cs index 184b9f1..be304fb 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IncreasedStabAbility.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/IncreasedStabAbility.cs @@ -10,10 +10,10 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; public class IncreasedStab : Script { /// - public override void ChangeStabModifier(IExecutingMove executingMove, IPokemon target, byte hitNumber, + public override void ChangeStabModifier(IExecutingMove executingMove, IPokemon target, byte hitNumber, bool isStab, ref float modifier) { - if (!modifier.IsApproximatelyEqualTo(1.5f)) + if (!isStab || !modifier.IsApproximatelyEqualTo(1.5f)) return; executingMove.Battle.EventHook.Invoke(new AbilityTriggerEvent(executingMove.User)); modifier = 2.0f; diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs index 1ddf80f..77dc003 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BaseChargeEffect.cs @@ -15,7 +15,7 @@ public abstract class BaseChargeEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, _moveName, opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BideEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BideEffect.cs index 1b17287..42cbbe5 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BideEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BideEffect.cs @@ -34,7 +34,7 @@ public class BideEffect : Script private ITurnChoice? _choice; /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { if (_owner == null) return; diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeBounceEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeBounceEffect.cs index 7e0ff9c..1ea9271 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeBounceEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeBounceEffect.cs @@ -13,7 +13,7 @@ public class ChargeBounceEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "bounce", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeFlyEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeFlyEffect.cs index 029c53e..a3598be 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeFlyEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeFlyEffect.cs @@ -13,7 +13,7 @@ public class ChargeFlyEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "fly", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeMoveEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeMoveEffect.cs index 89a3d1c..ba380a1 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeMoveEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeMoveEffect.cs @@ -20,7 +20,7 @@ public class ChargeMoveEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = TurnChoiceHelper.CreateMoveChoice(_user, MoveName, _targetSide, _targetPosition); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeSkyDropEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeSkyDropEffect.cs index 37ebcf3..83299dd 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeSkyDropEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ChargeSkyDropEffect.cs @@ -13,7 +13,7 @@ public class ChargeSkyDropEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "sky_drop", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DigEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DigEffect.cs index 2c1f279..0b97123 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DigEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DigEffect.cs @@ -13,7 +13,7 @@ public class DigEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "dig", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DiveEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DiveEffect.cs index cf9bc82..7774b15 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DiveEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DiveEffect.cs @@ -13,7 +13,7 @@ public class DiveEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "dive", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/EncoreEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/EncoreEffect.cs index 0094d86..6f79ba4 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/EncoreEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/EncoreEffect.cs @@ -18,7 +18,7 @@ public class EncoreEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, _move, opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/IceBallEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/IceBallEffect.cs index 5655341..892b92b 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/IceBallEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/IceBallEffect.cs @@ -18,7 +18,7 @@ public class IceBallEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, _moveName, opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/OutrageLikeEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/OutrageLikeEffect.cs index 48b1521..d4a2f1a 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/OutrageLikeEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/OutrageLikeEffect.cs @@ -21,7 +21,7 @@ public abstract class OutrageLikeEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = TurnChoiceHelper.CreateMoveChoice(_owner, _move, _targetSide, _targetPosition); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/PhantomForceCharge.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/PhantomForceCharge.cs index 55d8892..3e8cec3 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/PhantomForceCharge.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/PhantomForceCharge.cs @@ -13,7 +13,7 @@ public class PhantomForceCharge : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "phantom_force", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RequiresRechargeEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RequiresRechargeEffect.cs index 2e8966d..61636fb 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RequiresRechargeEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RequiresRechargeEffect.cs @@ -11,7 +11,7 @@ public class RequiresRechargeEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = new PassChoice(_owner); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ShadowForceCharge.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ShadowForceCharge.cs index 776b101..a164083 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ShadowForceCharge.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/ShadowForceCharge.cs @@ -13,7 +13,7 @@ public class ShadowForceCharge : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0); choice = TurnChoiceHelper.CreateMoveChoice(_owner, "shadow_force", opposingSideIndex, position); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkullbashEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkullbashEffect.cs index 3e296fd..e03b3e9 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkullbashEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkullbashEffect.cs @@ -13,7 +13,7 @@ public class SkullBashEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = TurnChoiceHelper.CreateMoveChoice(_owner, "skull_bash", sideIndex, position); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkyAttackEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkyAttackEffect.cs index b9eeb5b..d259fe5 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkyAttackEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/SkyAttackEffect.cs @@ -13,7 +13,7 @@ public class SkyAttackEffect : Script } /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = TurnChoiceHelper.CreateMoveChoice(_owner, "sky_attack", sideIndex, position); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/TruantEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/TruantEffect.cs index ac27728..ba95933 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/TruantEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/TruantEffect.cs @@ -3,7 +3,7 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon; public class TruantEffect(IPokemon owner) : Script { /// - public override void ForceTurnSelection(byte sideIndex, byte position, ref ITurnChoice? choice) + public override void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice) { choice = new PassChoice(owner); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Utils/TurnChoiceHelper.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Utils/TurnChoiceHelper.cs index ae406df..5ff4281 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Utils/TurnChoiceHelper.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Utils/TurnChoiceHelper.cs @@ -1,5 +1,3 @@ -using PkmnLib.Static.Utils; - namespace PkmnLib.Plugin.Gen7.Scripts.Utils; public static class TurnChoiceHelper