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