From 02510fd1d0834548806eebb7b6388cfa62c84b8f Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 22 Jun 2025 10:53:56 +0200 Subject: [PATCH] Implements sandstorm --- .../Scripts/Abilities/Overcoat.cs | 6 +++- .../Scripts/Abilities/SandForce.cs | 10 +++++- .../Scripts/Abilities/SandRush.cs | 10 +++++- .../Scripts/Abilities/SandVeil.cs | 10 +++++- .../Scripts/CustomTriggers.cs | 7 ++++ .../Scripts/Weather/Sandstorm.cs | 36 ++++++++++++++++++- 6 files changed, 74 insertions(+), 5 deletions(-) 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