namespace PkmnLib.Plugin.Gen7.Scripts.Weather; [Script(ScriptCategory.Weather, "sandstorm")] public class Sandstorm : Script, IScriptChangeBasePower, IScriptChangeDefensiveStatValue, IScriptOnEndTurn, IAIInfoScriptExpectedEndOfTurnDamage { /// public 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 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 void ChangeBasePower(IExecutingMove move, IPokemon target, byte hit, ref ushort basePower) { if (move.UseMove.Name == "solar_beam") basePower /= 2; } /// public void ExpectedEndOfTurnDamage(IPokemon pokemon, ref int damage) { if (pokemon.Types.Any(x => x.Name == "rock" || x.Name == "ground" || x.Name == "steel")) return; // Rock, Ground, and Steel types are immune to Sandstorm damage. damage += (int)(pokemon.MaxHealth / 16f); } }