diff --git a/PkmnLib.Dynamic/Models/BattleFlow/TurnRunner.cs b/PkmnLib.Dynamic/Models/BattleFlow/TurnRunner.cs
index acb1957..8195e99 100644
--- a/PkmnLib.Dynamic/Models/BattleFlow/TurnRunner.cs
+++ b/PkmnLib.Dynamic/Models/BattleFlow/TurnRunner.cs
@@ -57,15 +57,15 @@ public static class TurnRunner
{
scripts.Clear();
pokemon.GetOwnScripts(scripts);
- scripts.RunScriptHook(x => x.OnEndTurn());
+ scripts.RunScriptHook(x => x.OnEndTurn(battle));
}
scripts.Clear();
side.GetOwnScripts(scripts);
- scripts.RunScriptHook(x => x.OnEndTurn());
+ scripts.RunScriptHook(x => x.OnEndTurn(battle));
}
scripts.Clear();
battle.GetOwnScripts(scripts);
- scripts.RunScriptHook(x => x.OnEndTurn());
+ scripts.RunScriptHook(x => x.OnEndTurn(battle));
}
}
diff --git a/PkmnLib.Dynamic/Models/DamageSource.cs b/PkmnLib.Dynamic/Models/DamageSource.cs
index 33a6d2f..9b1242f 100644
--- a/PkmnLib.Dynamic/Models/DamageSource.cs
+++ b/PkmnLib.Dynamic/Models/DamageSource.cs
@@ -25,4 +25,9 @@ public enum DamageSource
/// This happens when the form of a Pokemon changes, and it has less max HP than it had before.
///
FormChange = 3,
+
+ ///
+ /// The damage is done because of the weather.
+ ///
+ Weather = 4,
}
\ No newline at end of file
diff --git a/PkmnLib.Dynamic/ScriptHandling/Script.cs b/PkmnLib.Dynamic/ScriptHandling/Script.cs
index 71abbee..0b01cd8 100644
--- a/PkmnLib.Dynamic/ScriptHandling/Script.cs
+++ b/PkmnLib.Dynamic/ScriptHandling/Script.cs
@@ -428,7 +428,8 @@ public abstract class Script : IDeepCloneable
/// running. Note that choices are not active anymore here, so their scripts do not call this
/// function.
///
- public virtual void OnEndTurn()
+ ///
+ public virtual void OnEndTurn(IBattle battle)
{
}
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/HealEachEndOfTurnEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/HealEachEndOfTurnEffect.cs
index 191c7eb..6c1f379 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/HealEachEndOfTurnEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/HealEachEndOfTurnEffect.cs
@@ -20,8 +20,9 @@ public class HealEachEndOfTurnEffect : Script
_pokemon = pokemon;
}
+ ///
///
- public override void OnEndTurn()
+ public override void OnEndTurn(IBattle battle)
{
if (_pokemon is null)
return;
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/AuroraVeilEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/AuroraVeilEffect.cs
index a5bfaac..7e1f2f7 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/AuroraVeilEffect.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/AuroraVeilEffect.cs
@@ -35,8 +35,9 @@ public class AuroraVeilEffect : Script
NumberOfTurns = numberOfTurns;
}
+ ///
///
- public override void OnEndTurn()
+ public override void OnEndTurn(IBattle battle)
{
if (NumberOfTurns > 0)
NumberOfTurns--;
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoublePowerIfTargetDamagedInTurnData.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoublePowerIfTargetDamagedInTurnData.cs
index 2ca195b..302c2d7 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoublePowerIfTargetDamagedInTurnData.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/DoublePowerIfTargetDamagedInTurnData.cs
@@ -9,9 +9,10 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Side;
public class DoublePowerIfTargetDamagedInTurnData : Script
{
public HashSet _hitPokemon = new();
-
+
+ ///
///
- public override void OnEndTurn()
+ public override void OnEndTurn(IBattle battle)
{
RemoveSelf();
}
diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Hail.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Hail.cs
index ed14160..277be46 100644
--- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Hail.cs
+++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/Hail.cs
@@ -1,10 +1,53 @@
+using System.Collections.Generic;
+using System.Linq;
+using PkmnLib.Dynamic.Events;
+using PkmnLib.Dynamic.Models;
using PkmnLib.Dynamic.ScriptHandling;
using PkmnLib.Dynamic.ScriptHandling.Registry;
+using PkmnLib.Static;
+using PkmnLib.Static.Utils;
namespace PkmnLib.Plugin.Gen7.Scripts.Weather;
[Script(ScriptCategory.Weather, "hail")]
public class Hail : Script
{
- // TODO: Implement Hail weather effect
+ public static void RegisterHailIgnoreAbility(StringKey abilityName)
+ {
+ _hailIgnoreAbilities.Add(abilityName);
+ }
+
+ private static readonly HashSet _hailIgnoreAbilities =
+ [
+ "ice_body",
+ "magic_guard",
+ "overcoat",
+ "snow_cloak"
+ ];
+
+ ///
+ public override void OnEndTurn(IBattle battle)
+ {
+ if (!battle.Library.StaticLibrary.Types.TryGetTypeIdentifier("ice", out var iceType))
+ {
+ iceType = new TypeIdentifier(255);
+ }
+ foreach (var side in battle.Sides)
+ {
+ foreach (var pokemon in side.Pokemon.WhereNotNull())
+ {
+ if (!pokemon.IsUsable)
+ continue;
+ if (pokemon.Types.Contains(iceType))
+ continue;
+ if (_hailIgnoreAbilities.Contains(pokemon.ActiveAbility.Name))
+ continue;
+
+ var maxHealth = pokemon.BoostedStats.Hp;
+ var damage = maxHealth / 16;
+ // TODO: Consider Safety Goggles. Handle it inside the Damage method?
+ pokemon.Damage(damage, DamageSource.Weather, new EventBatchId());
+ }
+ }
+ }
}
\ No newline at end of file