diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Overcoat.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Overcoat.cs
index efe7d60..01f6162 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Overcoat.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Overcoat.cs
@@ -15,7 +15,11 @@ public class Overcoat : Script
{
hailArgs.Ignore = true;
}
- // TODO: Ignore sandstorm damage
+ else if (eventName == CustomTriggers.BypassSandstormDamage &&
+ args is CustomTriggers.BypassSandstormDamageArgs bypassArgs)
+ {
+ bypassArgs.Bypass = true;
+ }
}
///
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandForce.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandForce.cs
index a6c83f0..36aa525 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandForce.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandForce.cs
@@ -22,5 +22,13 @@ public class SandForce : Script
}
}
- // TODO: Prevent sandstorm damage.
+ ///
+ public override void CustomTrigger(StringKey eventName, ICustomTriggerArgs args)
+ {
+ if (eventName == CustomTriggers.BypassSandstormDamage &&
+ args is CustomTriggers.BypassSandstormDamageArgs bypassArgs)
+ {
+ bypassArgs.Bypass = true;
+ }
+ }
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandRush.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandRush.cs
index c193dec..a823e75 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandRush.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandRush.cs
@@ -17,5 +17,13 @@ public class SandRush : Script
}
}
- // TODO: Prevent sandstorm damage.
+ ///
+ public override void CustomTrigger(StringKey eventName, ICustomTriggerArgs args)
+ {
+ if (eventName == CustomTriggers.BypassSandstormDamage &&
+ args is CustomTriggers.BypassSandstormDamageArgs bypassArgs)
+ {
+ bypassArgs.Bypass = true;
+ }
+ }
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandVeil.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandVeil.cs
index 3b8ea70..6b56243 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandVeil.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/SandVeil.cs
@@ -18,5 +18,13 @@ public class SandVeil : Script
modifiedAccuracy = (int)(modifiedAccuracy * (3277f / 4096f));
}
- // TODO: Prevent sandstorm damage.
+ ///
+ public override void CustomTrigger(StringKey eventName, ICustomTriggerArgs args)
+ {
+ if (eventName == CustomTriggers.BypassSandstormDamage &&
+ args is CustomTriggers.BypassSandstormDamageArgs bypassArgs)
+ {
+ bypassArgs.Bypass = true;
+ }
+ }
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs
index ac2b398..242b2b0 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/CustomTriggers.cs
@@ -139,4 +139,11 @@ public static class CustomTriggers
{
public bool Prevent { get; set; } = false;
}
+
+ public static readonly StringKey BypassSandstormDamage = "bypass_sandstorm_damage";
+
+ public record BypassSandstormDamageArgs(IPokemon Pokemon) : ICustomTriggerArgs
+ {
+ public bool Bypass { get; set; } = false;
+ }
}
\ No newline at end of file
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Sandstorm.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Sandstorm.cs
index 019d4ed..214ad74 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Sandstorm.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Sandstorm.cs
@@ -3,5 +3,39 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Weather;
[Script(ScriptCategory.Weather, "sandstorm")]
public class Sandstorm : Script
{
- // TODO: Implement Sandstorm
+ ///
+ public override void OnEndTurn(IScriptSource owner, IBattle battle)
+ {
+ foreach (var pokemon in battle.Sides.SelectMany(x => x.Pokemon).WhereNotNull())
+ {
+ if (!pokemon.IsUsable)
+ continue;
+ if (pokemon.Types.Any(x => x.Name == "rock" || x.Name == "ground" || x.Name == "steel"))
+ {
+ // Rock, Ground, and Steel types are immune to Sandstorm damage.
+ continue;
+ }
+ var bypassSandstormArgs = new CustomTriggers.BypassSandstormDamageArgs(pokemon);
+ pokemon.RunScriptHook(x => x.CustomTrigger(CustomTriggers.BypassSandstormDamage, bypassSandstormArgs));
+ if (bypassSandstormArgs.Bypass)
+ continue;
+
+ pokemon.Damage(pokemon.MaxHealth / 16, DamageSource.Weather);
+ }
+ }
+
+ ///
+ public override void ChangeDefensiveStatValue(IExecutingMove move, IPokemon target, byte hit, uint offensiveStat,
+ ImmutableStatisticSet targetStats, Statistic stat, ref uint value)
+ {
+ if (stat == Statistic.SpecialDefense && target.Types.Any(x => x.Name == "rock"))
+ value = value.MultiplyOrMax(1.5f);
+ }
+
+ ///
+ public override void ChangeBasePower(IExecutingMove move, IPokemon target, byte hit, ref ushort basePower)
+ {
+ if (move.UseMove.Name == "solar_beam")
+ basePower /= 2;
+ }
}
\ No newline at end of file