From 6434f9925c7d74d644d6ba689ef9a664abf2c1da Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Fri, 10 Jan 2025 12:16:29 +0100 Subject: [PATCH] Implements Hail --- .../Models/BattleFlow/TurnRunner.cs | 6 +-- PkmnLib.Dynamic/Models/DamageSource.cs | 5 +++ PkmnLib.Dynamic/ScriptHandling/Script.cs | 3 +- .../Pokemon/HealEachEndOfTurnEffect.cs | 3 +- .../Scripts/Side/AuroraVeilEffect.cs | 3 +- .../DoublePowerIfTargetDamagedInTurnData.cs | 5 ++- .../Scripts/Weather/Hail.cs | 45 ++++++++++++++++++- 7 files changed, 61 insertions(+), 9 deletions(-) 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