diff --git a/PkmnLib.Dynamic/Events/AbilityTriggerEvent.cs b/PkmnLib.Dynamic/Events/AbilityTriggerEvent.cs index ddfee0a..3e41d04 100644 --- a/PkmnLib.Dynamic/Events/AbilityTriggerEvent.cs +++ b/PkmnLib.Dynamic/Events/AbilityTriggerEvent.cs @@ -1,5 +1,6 @@ using PkmnLib.Dynamic.Models; using PkmnLib.Static.Species; +using PkmnLib.Static.Utils; namespace PkmnLib.Dynamic.Events; @@ -18,6 +19,8 @@ public record AbilityTriggerEvent : IEventData /// public IAbility? Ability { get; } + public Dictionary? Metadata { get; init; } = null; + /// public AbilityTriggerEvent(IPokemon pokemon) { diff --git a/PkmnLib.Dynamic/Models/Pokemon.cs b/PkmnLib.Dynamic/Models/Pokemon.cs index 6746f43..76386ef 100644 --- a/PkmnLib.Dynamic/Models/Pokemon.cs +++ b/PkmnLib.Dynamic/Models/Pokemon.cs @@ -274,8 +274,9 @@ public interface IPokemon : IScriptSource, IDeepCloneable /// The stat to be changed /// The amount to change the stat by /// Whether the change was self-inflicted. This can be relevant in scripts. + /// /// The event batch ID this change is a part of. This is relevant for visual handling - bool ChangeStatBoost(Statistic stat, sbyte change, bool selfInflicted, EventBatchId batchId = default); + bool ChangeStatBoost(Statistic stat, sbyte change, bool selfInflicted, bool force, EventBatchId batchId = default); /// /// Suppresses the ability of the Pokémon. @@ -354,7 +355,7 @@ public interface IPokemon : IScriptSource, IDeepCloneable /// /// Adds a non-volatile status to the Pokemon. /// - bool SetStatus(StringKey status, EventBatchId batchId = default); + bool SetStatus(StringKey status, bool selfInflicted, EventBatchId batchId = default); /// /// Removes the current non-volatile status from the Pokemon. @@ -841,15 +842,20 @@ public class PokemonImpl : ScriptSource, IPokemon } /// - public bool ChangeStatBoost(Statistic stat, sbyte change, bool selfInflicted, EventBatchId batchId = default) + public bool ChangeStatBoost(Statistic stat, sbyte change, bool selfInflicted, bool force, + EventBatchId batchId = default) { - var prevented = false; - this.RunScriptHook(script => script.PreventStatBoostChange(this, stat, change, selfInflicted, ref prevented)); - if (prevented) - return false; - this.RunScriptHook(script => script.ChangeStatBoostChange(this, stat, selfInflicted, ref change)); - if (change == 0) - return false; + if (!force) + { + var prevented = false; + this.RunScriptHook(script => + script.PreventStatBoostChange(this, stat, change, selfInflicted, ref prevented)); + if (prevented) + return false; + this.RunScriptHook(script => script.ChangeStatBoostChange(this, stat, selfInflicted, ref change)); + if (change == 0) + return false; + } var changed = false; var oldBoost = StatBoost.GetStatistic(stat); changed = change switch @@ -1135,7 +1141,7 @@ public class PokemonImpl : ScriptSource, IPokemon public bool HasStatus(StringKey status) => StatusScript.Script?.Name == status; /// - public bool SetStatus(StringKey status, EventBatchId batchId = default) + public bool SetStatus(StringKey status, bool selfInflicted, EventBatchId batchId = default) { if (!Library.ScriptResolver.TryResolve(ScriptCategory.Status, status, null, out var statusScript)) throw new KeyNotFoundException($"Status script {status} not found"); @@ -1145,7 +1151,7 @@ public class PokemonImpl : ScriptSource, IPokemon var oldStatus = StatusScript.Script?.Name; var preventStatus = false; - this.RunScriptHook(script => script.PreventStatusChange(this, status, ref preventStatus)); + this.RunScriptHook(script => script.PreventStatusChange(this, status, selfInflicted, ref preventStatus)); if (preventStatus) return false; diff --git a/PkmnLib.Dynamic/ScriptHandling/ProxyScript.cs b/PkmnLib.Dynamic/ScriptHandling/ProxyScript.cs new file mode 100644 index 0000000..77494e2 --- /dev/null +++ b/PkmnLib.Dynamic/ScriptHandling/ProxyScript.cs @@ -0,0 +1,36 @@ +using PkmnLib.Dynamic.Models; +using PkmnLib.Static; + +namespace PkmnLib.Dynamic.ScriptHandling; + +public class ProxyScript : Script +{ + public delegate void ChangeOffensiveStatValueEventHandler(IExecutingMove move, IPokemon target, byte hit, + uint defensiveStat, ImmutableStatisticSet targetStats, ref uint value); + + private readonly List<(Script, ChangeOffensiveStatValueEventHandler)> _changeOffensiveStatValueEvents = new(); + + public void AddChangeOffensiveStatValueEvent(Script script, ChangeOffensiveStatValueEventHandler handler) + { + _changeOffensiveStatValueEvents.Add((script, handler)); + script.OnRemoveEvent += OnRemoveScriptEvent; + } + + private void OnRemoveScriptEvent(Script script) + { + _changeOffensiveStatValueEvents.RemoveAll(x => x.Item1 == script); + } + + /// + public override void ChangeOffensiveStatValue(IExecutingMove move, IPokemon target, byte hit, uint defensiveStat, + ImmutableStatisticSet targetStats, ref uint value) + { + foreach (var (script, handler) in _changeOffensiveStatValueEvents) + { + if (!script.IsSuppressed) + { + handler(move, target, hit, defensiveStat, targetStats, ref value); + } + } + } +} \ No newline at end of file diff --git a/PkmnLib.Dynamic/ScriptHandling/Script.cs b/PkmnLib.Dynamic/ScriptHandling/Script.cs index 8736190..b2db0f0 100644 --- a/PkmnLib.Dynamic/ScriptHandling/Script.cs +++ b/PkmnLib.Dynamic/ScriptHandling/Script.cs @@ -728,7 +728,8 @@ public abstract class Script : IDeepCloneable /// /// This function allows a script to prevent a Pokemon from being affected by a status condition. /// - public virtual void PreventStatusChange(IPokemon pokemonImpl, StringKey status, ref bool preventStatus) + public virtual void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) { } diff --git a/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs b/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs index 7500809..4134ab2 100644 --- a/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs +++ b/PkmnLib.Dynamic/ScriptHandling/ScriptContainer.cs @@ -65,10 +65,7 @@ public class ScriptContainer : IReadOnlyScriptContainer /// public Script? Clear() { - if (Script is not null) - { - Script.OnRemove(); - } + Script?.OnRemove(); var script = Script; Script = null; return script; diff --git a/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs b/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs index 089fe64..135bf91 100644 --- a/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs +++ b/PkmnLib.Dynamic/ScriptHandling/ScriptSet.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Diagnostics.CodeAnalysis; using PkmnLib.Dynamic.ScriptHandling.Registry; using PkmnLib.Static.Utils; @@ -31,6 +32,11 @@ public interface IScriptSet : IEnumerable /// ScriptContainer? Get(StringKey scriptKey); + /// + /// Tries to get a script from the set using its type. + /// + bool TryGet([NotNullWhen(true)] out T? script) where T : Script; + /// /// Gets a script from the set using its type. /// @@ -144,6 +150,20 @@ public class ScriptSet : IScriptSet /// public ScriptContainer? Get(StringKey scriptKey) => _scripts.FirstOrDefault(s => s.Script?.Name == scriptKey); + /// + public bool TryGet([NotNullWhen(true)] out T? script) where T : Script + { + var scriptName = ScriptUtils.ResolveName(); + var container = _scripts.FirstOrDefault(sc => sc.Script?.Name == scriptName); + if (container?.Script is not T s) + { + script = null; + return false; + } + script = s; + return true; + } + /// public T? Get() where T : Script => Get(ScriptUtils.ResolveName())?.Script as T; diff --git a/PkmnLib.Tests/Static/DeepCloneTests.cs b/PkmnLib.Tests/Static/DeepCloneTests.cs index e5f8b4c..9895562 100644 --- a/PkmnLib.Tests/Static/DeepCloneTests.cs +++ b/PkmnLib.Tests/Static/DeepCloneTests.cs @@ -111,7 +111,7 @@ public class DeepCloneTests using var battle = new BattleImpl(library, parties, false, 2, 3, false, 0); battle.Sides[0].SwapPokemon(0, party1[0]); battle.Sides[1].SwapPokemon(0, party2[0]); - party1[0]!.ChangeStatBoost(Statistic.Defense, 2, true); + party1[0]!.ChangeStatBoost(Statistic.Defense, 2, true, false); await Assert.That(party1[0]!.StatBoost.Defense).IsEqualTo((sbyte)2); var clone = battle.DeepClone(); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc index 3227200..0098278 100755 --- a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc +++ b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc @@ -180,24 +180,36 @@ "flare_boost": { "effect": "flare_boost" }, - "flash_fire": {}, + "flash_fire": { + "effect": "flash_fire" + }, "flower_gift": { - "flags": [ - "cant_be_copied" - ] + "effect": "flower_gift" + }, + "flower_veil": { + "effect": "flower_veil" + }, + "fluffy": { + "effect": "fluffy" }, - "flower_veil": {}, - "fluffy": {}, "forecast": { - "flags": [ - "cant_be_copied" - ] + "effect": "forecast" + }, + "forewarn": { + "effect": "forewarn" + }, + "friend_guard": { + "effect": "friend_guard" + }, + "frisk": { + "effect": "frisk" + }, + "full_metal_body": { + "effect": "full_metal_body" + }, + "fur_coat": { + "effect": "fur_coat" }, - "forewarn": {}, - "friend_guard": {}, - "frisk": {}, - "full_metal_body": {}, - "fur_coat": {}, "gale_wings": {}, "galvanize": {}, "gluttony": {}, diff --git a/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json b/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json index 4b76740..2c52e7a 100755 --- a/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json +++ b/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json @@ -18247,6 +18247,126 @@ ], "formeChange": [] } + }, + "sunshine": { + "abilities": [ + "flower_gift" + ], + "hiddenAbilities": [], + "baseStats": { + "attack": 90, + "defense": 70, + "hp": 70, + "specialAttack": 87, + "specialDefense": 117, + "speed": 85 + }, + "evReward": { + "specialAttack": 2 + }, + "types": [ + "grass" + ], + "height": 0.5, + "weight": 9.3, + "baseExp": 158, + "moves": { + "levelMoves": [ + { + "name": "petal_dance", + "level": 0 + }, + { + "name": "morning_sun", + "level": 1 + }, + { + "name": "leech_seed", + "level": 1 + }, + { + "name": "petal_dance", + "level": 1 + }, + { + "name": "growth", + "level": 1 + }, + { + "name": "tackle", + "level": 1 + }, + { + "name": "growth", + "level": 7 + }, + { + "name": "leech_seed", + "level": 10 + }, + { + "name": "helping_hand", + "level": 13 + }, + { + "name": "magical_leaf", + "level": 19 + }, + { + "name": "sunny_day", + "level": 22 + }, + { + "name": "worry_seed", + "level": 30 + }, + { + "name": "take_down", + "level": 35 + }, + { + "name": "solar_beam", + "level": 43 + }, + { + "name": "lucky_chant", + "level": 48 + }, + { + "name": "petal_blizzard", + "level": 50 + } + ], + "eggMoves": [], + "tutorMoves": [], + "machine": [ + "swords_dance", + "hyper_beam", + "solar_beam", + "toxic", + "double_team", + "rest", + "substitute", + "protect", + "swagger", + "attract", + "sleep_talk", + "return", + "frustration", + "safeguard", + "hidden_power", + "sunny_day", + "facade", + "nature_power", + "energy_ball", + "giga_impact", + "grass_knot", + "round", + "confide", + "dazzling_gleam" + ], + "formeChange": [] + } } }, "evolutions": [] diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/AngerPoint.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/AngerPoint.cs index ec79d10..3b82572 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/AngerPoint.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/AngerPoint.cs @@ -19,7 +19,7 @@ public class AngerPoint : Script { BatchId = batchId, }); - target.ChangeStatBoost(Statistic.Attack, 12, true, batchId); + target.ChangeStatBoost(Statistic.Attack, 12, true, false, batchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/BeastBoost.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/BeastBoost.cs index 9125ecb..2053105 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/BeastBoost.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/BeastBoost.cs @@ -18,6 +18,6 @@ public class BeastBoost : Script { BatchId = batchId, }); - move.User.ChangeStatBoost(highestStat, 1, true, batchId); + move.User.ChangeStatBoost(highestStat, 1, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Berserk.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Berserk.cs index 9e1c051..fdf4473 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Berserk.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Berserk.cs @@ -22,6 +22,6 @@ public class Berserk : Script { BatchId = batchId, }); - pokemon.ChangeStatBoost(Statistic.SpecialAttack, 1, true, batchId); + pokemon.ChangeStatBoost(Statistic.SpecialAttack, 1, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Comatose.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Comatose.cs index 6ee500f..9f7cce1 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Comatose.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Comatose.cs @@ -13,7 +13,8 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; public class Comatose : Script { /// - public override void PreventStatusChange(IPokemon pokemonImpl, StringKey status, ref bool preventStatus) + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) { if (status == ScriptUtils.ResolveName()) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Competitive.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Competitive.cs index fa9e8ca..c6f6fc0 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Competitive.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Competitive.cs @@ -22,6 +22,6 @@ public class Competitive : Script { BatchId = batchId, }); - pokemon.ChangeStatBoost(Statistic.SpecialAttack, 2, true, batchId); + pokemon.ChangeStatBoost(Statistic.SpecialAttack, 2, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Defiant.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Defiant.cs index f63212d..4d277b1 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Defiant.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Defiant.cs @@ -22,6 +22,6 @@ public class Defiant : Script { BatchId = batchId, }); - pokemon.ChangeStatBoost(Statistic.Attack, 2, true, batchId); + pokemon.ChangeStatBoost(Statistic.Attack, 2, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Download.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Download.cs index 3101eb0..4b4c0b6 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Download.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Download.cs @@ -31,6 +31,6 @@ public class Download : Script }); pokemon.ChangeStatBoost( opponentAverageDefense < opponentAverageSpecialDefense ? Statistic.Attack : Statistic.SpecialAttack, 1, - true, batchId); + true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs index 7e96138..fa29722 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/EffectSpore.cs @@ -36,13 +36,13 @@ public class EffectSpore : Script switch (chance) { case < 9: - move.User.SetStatus(ScriptUtils.ResolveName(), batchId); + move.User.SetStatus(ScriptUtils.ResolveName(), false, batchId); break; case < 19: - move.User.SetStatus(ScriptUtils.ResolveName(), batchId); + move.User.SetStatus(ScriptUtils.ResolveName(), false, batchId); break; case < 30: - move.User.SetStatus(ScriptUtils.ResolveName(), batchId); + move.User.SetStatus(ScriptUtils.ResolveName(), false, batchId); break; } } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs index 755bd82..d4c92b2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlameBody.cs @@ -20,6 +20,6 @@ public class FlameBody : Script return; move.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); - move.User.SetStatus(ScriptUtils.ResolveName()); + move.User.SetStatus(ScriptUtils.ResolveName(), false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlashFire.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlashFire.cs index bc3a3ec..8395ca5 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlashFire.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlashFire.cs @@ -16,14 +16,13 @@ public class FlashFire : Script public override void ChangeIncomingEffectiveness(IExecutingMove executingMove, IPokemon target, byte hitIndex, ref float effectiveness) { - if (executingMove.GetHitData(target, hitIndex).Type?.Name == "fire") - { - effectiveness = 0f; + if (executingMove.GetHitData(target, hitIndex).Type?.Name != "fire") + return; + effectiveness = 0f; - if (target.Volatile.Contains()) - return; - target.Volatile.Add(new FlashFireEffect()); - executingMove.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); - } + if (target.Volatile.Contains()) + return; + target.Volatile.Add(new FlashFireEffect()); + executingMove.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerGift.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerGift.cs new file mode 100644 index 0000000..8d715fb --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerGift.cs @@ -0,0 +1,60 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Flower Gift is an ability that boosts the Attack and Special Defense of the Pokémon and its allies in sunlight. +/// This ability is exclusive to Cherrim. +/// +/// Bulbapedia - Flower Gift +/// +[Script(ScriptCategory.Ability, "flower_gift")] +public class FlowerGift : Script +{ + private IPokemon? _pokemon; + + /// + public override void OnAddedToParent(IScriptSource source) + { + if (source is not IPokemon pokemon) + throw new InvalidOperationException("Flower Gift can only be added to a Pokemon script source."); + _pokemon = pokemon; + var effect = _pokemon.BattleData?.BattleSide.VolatileScripts.Add(new Side.FlowerGiftEffect()); + (effect?.Script as Side.FlowerGiftEffect)?.OnAdded(_pokemon); + } + + /// + public override void OnWeatherChange(IBattle battle, StringKey? weatherName, StringKey? oldWeatherName) + { + if (_pokemon is null) + return; + if (weatherName != ScriptUtils.ResolveName()) + return; + if (_pokemon.Species.Name != "cherrim") + return; + EventBatchId batchId = new(); + if (_pokemon.Species.TryGetForm("sunshine", out var form) && _pokemon.Form != form) + { + _pokemon.ChangeForm(form, batchId); + } + } + + /// + public override void OnRemove() + { + if (_pokemon is null) + return; + if (_pokemon.BattleData?.BattleSide.VolatileScripts.TryGet(out var script) == true) + { + script.OnRemoved(_pokemon); + } + + if (_pokemon.Species.Name != "cherrim") + return; + + EventBatchId batchId = new(); + var defaultForm = _pokemon.Species.GetDefaultForm(); + if (_pokemon.Form != defaultForm) + { + _pokemon.ChangeForm(defaultForm, batchId); + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerVeil.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerVeil.cs new file mode 100644 index 0000000..4f20186 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FlowerVeil.cs @@ -0,0 +1,34 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Flower Veil is an ability that prevents Grass-type allies from having their stats lowered or being afflicted by status conditions. +/// This ability is exclusive to Florges and its evolutionary line. +/// +/// Bulbapedia - Flower Veil +/// +[Script(ScriptCategory.Ability, "flower_veil")] +public class FlowerVeil : Script +{ + private IPokemon? _pokemon; + + /// + public override void OnAddedToParent(IScriptSource source) + { + if (source is not IPokemon pokemon) + throw new InvalidOperationException("Flower Veil can only be added to a Pokemon script source."); + _pokemon = pokemon; + var effect = _pokemon.BattleData?.BattleSide.VolatileScripts.Add(new Side.FlowerVeilEffect()); + (effect?.Script as Side.FlowerVeilEffect)?.OnAdded(_pokemon); + } + + /// + public override void OnRemove() + { + if (_pokemon is null) + return; + if (_pokemon.BattleData?.BattleSide.VolatileScripts.TryGet(out var script) == true) + { + script.OnRemoved(_pokemon); + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs new file mode 100644 index 0000000..b0c8710 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Fluffy.cs @@ -0,0 +1,24 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Fluffy is an ability that halves the damage taken from contact moves but doubles the damage taken from Fire-type moves. +/// This ability is exclusive to Stufful and Bewear. +/// +/// Bulbapedia - Fluffy +/// +[Script(ScriptCategory.Ability, "fluffy")] +public class Fluffy : Script +{ + /// + public override void ChangeDamageModifier(IExecutingMove move, IPokemon target, byte hit, ref float modifier) + { + if (move.GetHitData(target, hit).Type?.Name == "fire") + { + modifier *= 2f; + } + if (move.UseMove.HasFlag("contact")) + { + modifier *= 0.5f; + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forecast.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forecast.cs new file mode 100644 index 0000000..afdfa26 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forecast.cs @@ -0,0 +1,71 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Forecast is an ability that changes the Pokémon's form depending on the weather. +/// This ability is exclusive to Castform. +/// +/// Bulbapedia - Forecast +/// +[Script(ScriptCategory.Ability, "forecast")] +public class Forecast : Script +{ + private IPokemon? _pokemon; + + /// + public override void OnAddedToParent(IScriptSource source) + { + if (source is not IPokemon pokemon) + throw new InvalidOperationException("Forecast can only be added to a Pokemon script source."); + _pokemon = pokemon; + } + + /// + public override void OnSwitchIn(IPokemon pokemon, byte position) + { + ChangeForm(pokemon, pokemon.BattleData?.Battle.WeatherName); + } + + /// + public override void OnWeatherChange(IBattle battle, StringKey? weatherName, StringKey? oldWeatherName) + { + if (_pokemon is null) + return; + + ChangeForm(_pokemon, weatherName); + } + + /// + public override void OnRemove() + { + if (_pokemon is null) + return; + + ChangeForm(_pokemon, null); + } + + private static void ChangeForm(IPokemon pokemon, StringKey? weather) + { + if (pokemon.Species.Name != "castform") + return; + + if (weather == ScriptUtils.ResolveName() && + pokemon.Species.TryGetForm("sunny", out var sunnyForm) && pokemon.Form != sunnyForm) + { + pokemon.ChangeForm(sunnyForm); + } + else if (weather == ScriptUtils.ResolveName() && + pokemon.Species.TryGetForm("rainy", out var rainyForm) && pokemon.Form != rainyForm) + { + pokemon.ChangeForm(rainyForm); + } + else if (weather == ScriptUtils.ResolveName() && + pokemon.Species.TryGetForm("snowy", out var snowyForm) && pokemon.Form != snowyForm) + { + pokemon.ChangeForm(snowyForm); + } + else if (pokemon.Form != pokemon.Species.GetDefaultForm()) + { + pokemon.ChangeForm(pokemon.Species.GetDefaultForm()); + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forewarn.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forewarn.cs new file mode 100644 index 0000000..652f5eb --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Forewarn.cs @@ -0,0 +1,64 @@ +using PkmnLib.Static.Moves; + +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Forewarn is an ability that reveals the opponent's move with the highest base power when the Pokémon enters battle. +/// This ability is commonly associated with Drowzee and Hypno. +/// +/// Bulbapedia - Forewarn +/// +[Script(ScriptCategory.Ability, "forewarn")] +public class Forewarn : Script +{ + /// + public override void OnSwitchIn(IPokemon pokemon, byte position) + { + var battleData = pokemon.BattleData; + if (battleData == null) + return; + + var opponents = battleData.Battle.Sides.Where(x => x != battleData.BattleSide).SelectMany(x => x.Pokemon) + .WhereNotNull(); + + var highestPowerMove = opponents.SelectMany(opponent => opponent.Moves).WhereNotNull().Select(move => new + { + Move = move, + Power = GetBasePower(move.MoveData), + }).OrderByDescending(move => move.Power).FirstOrDefault(); + + battleData.Battle.EventHook.Invoke(new AbilityTriggerEvent(pokemon) + { + Metadata = new Dictionary + { + { "highest_power_move", highestPowerMove?.Move }, + { "power", highestPowerMove?.Power }, + }, + }); + } + + private static byte GetBasePower(IMoveData moveData) + { + // OHKO moves (handled by secondary effect) + if (moveData.SecondaryEffect?.Name == "one_hit_ko") + return 150; + + return moveData.Name.ToString() switch + { + // 150 BP: Specific moves + "blast_burn" or "eruption" or "water_spout" or "fissure" or "guillotine" or "horn_drill" + or "sheer_cold" => 150, + // 120 BP: Counter, Metal Burst, Mirror Coat + "counter" or "metal_burst" or "mirror_coat" => 120, + // 80 BP: List of variable power and fixed-damage moves + "crush_grip" or "dragon_rage" or "electro_ball" or "endeavor" or "final_gambit" or "flail" or "fling" + or "frustration" or "grass_knot" or "guardian_of_alola" or "gyro_ball" or "heat_crash" or "heavy_slam" + or "hidden_power" or "low_kick" or "natural_gift" or "natures_madness" or "night_shade" or "present" + or "psywave" or "punishment" or "return" or "reversal" or "seismic_toss" or "sonic_boom" or "spit_up" + or "super_fang" or "trump_card" or "wring_out" => 80, + // 20 BP: Stored Power, Power Trip + "stored_power" or "power_trip" => 20, + _ => moveData.BasePower == 0 ? (byte)1 : moveData.BasePower, + }; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FriendGuard.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FriendGuard.cs new file mode 100644 index 0000000..6f9fb31 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FriendGuard.cs @@ -0,0 +1,34 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Friend Guard is an ability that reduces the damage taken by allies by 25%. +/// This ability is commonly associated with Clefairy and Vivillon. +/// +/// Bulbapedia - Friend Guard +/// +[Script(ScriptCategory.Ability, "friend_guard")] +public class FriendGuard : Script +{ + private IPokemon? _pokemon; + + /// + public override void OnAddedToParent(IScriptSource source) + { + if (source is not IPokemon pokemon) + throw new InvalidOperationException("Friend Guard can only be added to a Pokemon script source."); + _pokemon = pokemon; + var effect = _pokemon.BattleData?.BattleSide.VolatileScripts.Add(new Side.FriendGuardEffect()); + (effect?.Script as Side.FriendGuardEffect)?.OnAdded(_pokemon); + } + + /// + public override void OnRemove() + { + if (_pokemon is null) + return; + if (_pokemon.BattleData?.BattleSide.VolatileScripts.TryGet(out var script) == true) + { + script.OnRemoved(_pokemon); + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Frisk.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Frisk.cs new file mode 100644 index 0000000..a1dd691 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/Frisk.cs @@ -0,0 +1,43 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Frisk is an ability that reveals the held items of opposing Pokémon when the Pokémon enters battle. +/// This ability is commonly associated with Banette and Gothitelle. +/// +/// Bulbapedia - Frisk +/// +[Script(ScriptCategory.Ability, "frisk")] +public class Frisk : Script +{ + /// + public override void OnSwitchIn(IPokemon pokemon, byte position) + { + if (pokemon.BattleData?.BattleSide is null) + return; + + // Check if the Pokémon has an opposing side + var opposingSide = + pokemon.BattleData.Battle.Sides.FirstOrDefault(side => side != pokemon.BattleData.BattleSide); + if (opposingSide is null) + return; + + EventBatchId batchId = new(); + // Iterate through the opposing Pokémon + foreach (var opponent in opposingSide.Pokemon.WhereNotNull()) + { + // If the opponent has a held item, reveal it + if (opponent.HeldItem != null) + { + pokemon.BattleData.Battle.EventHook.Invoke(new AbilityTriggerEvent(pokemon) + { + Metadata = new Dictionary + { + { "opponent", opponent }, + { "held_item", opponent.HeldItem }, + }, + BatchId = batchId, + }); + } + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FullMetalBody.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FullMetalBody.cs new file mode 100644 index 0000000..359910b --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FullMetalBody.cs @@ -0,0 +1,21 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Full Metal Body is an ability that prevents the Pokémon's stats from being lowered by other Pokémon's moves or abilities. +/// This ability is exclusive to Solgaleo. +/// +/// Bulbapedia - Full Metal Body +/// +[Script(ScriptCategory.Ability, "full_metal_body")] +public class FullMetalBody : Script +{ + /// + public override void PreventStatBoostChange(IPokemon target, Statistic stat, sbyte amount, bool selfInflicted, + ref bool prevent) + { + if (selfInflicted) + return; + + prevent = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FurCoat.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FurCoat.cs new file mode 100644 index 0000000..a6ecba6 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/FurCoat.cs @@ -0,0 +1,22 @@ +using PkmnLib.Static.Moves; + +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Fur Coat is an ability that halves the damage taken from physical moves. +/// This ability is exclusive to Furfrou. +/// +/// Bulbapedia - Fur Coat +/// +[Script(ScriptCategory.Ability, "fur_coat")] +public class FurCoat : Script +{ + /// + public override void ChangeIncomingMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage) + { + if (move.UseMove.Category == MoveCategory.Physical) + { + damage /= 2; + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Battle/UproarEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Battle/UproarEffect.cs index ee8fbd8..e6616e9 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Battle/UproarEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Battle/UproarEffect.cs @@ -16,7 +16,8 @@ public class UproarEffect : Script } /// - public override void PreventStatusChange(IPokemon pokemonImpl, StringKey status, ref bool preventStatus) + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) { if (status == ScriptUtils.ResolveName()) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Acupressure.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Acupressure.cs index 902abe6..7684b08 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Acupressure.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Acupressure.cs @@ -23,6 +23,6 @@ public class Acupressure : Script // Choose a random stat to raise. 0 is HP, so we start at 1. var stat = (Statistic)move.User.BattleData!.Battle.Random.GetInt(1, (int)Statistic.Speed + 1); - target.ChangeStatBoost(stat, 2, false); + target.ChangeStatBoost(stat, 2, false, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Autotomize.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Autotomize.cs index 9aff584..f2cc786 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Autotomize.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Autotomize.cs @@ -21,7 +21,7 @@ public class Autotomize : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { var user = move.User; - if (user.ChangeStatBoost(Statistic.Speed, 2, true) && user.ChangeWeightInKgBy(-100.0f)) + if (user.ChangeStatBoost(Statistic.Speed, 2, true, false) && user.ChangeWeightInKgBy(-100.0f)) { var battle = user.BattleData?.Battle; battle?.EventHook.Invoke(new DialogEvent("pokemon_became_nimble", new Dictionary diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BellyDrum.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BellyDrum.cs index acb75e9..aba839c 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BellyDrum.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/BellyDrum.cs @@ -15,6 +15,6 @@ public class BellyDrum : Script target.Damage(maxHealthHalved, DamageSource.Misc); // Raising the user's Attack by 12 stages should always set it to +6. - target.ChangeStatBoost(Statistic.Attack, 12, true); + target.ChangeStatBoost(Statistic.Attack, 12, true, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Bounce.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Bounce.cs index 2f317db..c470c1f 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Bounce.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Bounce.cs @@ -34,7 +34,7 @@ public class Bounce : Script var random = battle.Random; if (random.EffectChance(30, move, target, hit)) { - target.SetStatus("paralyzed"); + target.SetStatus("paralyzed", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Captivate.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Captivate.cs index bc23347..ffa1e20 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Captivate.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Captivate.cs @@ -19,6 +19,6 @@ public class Captivate : Script move.GetHitData(target, hit).Fail(); return; } - target.ChangeStatBoost(Statistic.SpecialAttack, -2, false); + target.ChangeStatBoost(Statistic.SpecialAttack, -2, false, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs index f56ce9b..5091fde 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeAllTargetStats.cs @@ -24,10 +24,10 @@ public class ChangeAllTargetStats : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - target.ChangeStatBoost(Statistic.Attack, _amount, target == move.User); - target.ChangeStatBoost(Statistic.Defense, _amount, target == move.User); - target.ChangeStatBoost(Statistic.SpecialAttack, _amount, target == move.User); - target.ChangeStatBoost(Statistic.SpecialDefense, _amount, target == move.User); - target.ChangeStatBoost(Statistic.Speed, _amount, target == move.User); + target.ChangeStatBoost(Statistic.Attack, _amount, target == move.User, false); + target.ChangeStatBoost(Statistic.Defense, _amount, target == move.User, false); + target.ChangeStatBoost(Statistic.SpecialAttack, _amount, target == move.User, false); + target.ChangeStatBoost(Statistic.SpecialDefense, _amount, target == move.User, false); + target.ChangeStatBoost(Statistic.Speed, _amount, target == move.User, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleTargetStatBoosts.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleTargetStatBoosts.cs index 02dcd54..b897247 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleTargetStatBoosts.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleTargetStatBoosts.cs @@ -32,7 +32,7 @@ public class ChangeMultipleTargetStatBoosts : Script EventBatchId batchId = new(); foreach (var stat in _statBoosts) { - target.ChangeStatBoost(stat.Key, stat.Value, true, batchId); + target.ChangeStatBoost(stat.Key, stat.Value, true, false, batchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleUserStatBoosts.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleUserStatBoosts.cs index 914c302..06dd718 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleUserStatBoosts.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeMultipleUserStatBoosts.cs @@ -32,7 +32,7 @@ public class ChangeMultipleUserStatBoosts : Script EventBatchId batchId = new(); foreach (var stat in _statBoosts) { - move.User.ChangeStatBoost(stat.Key, stat.Value, true, batchId); + move.User.ChangeStatBoost(stat.Key, stat.Value, true, false, batchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs index 53140e7..fda2959 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeTargetStats.cs @@ -31,7 +31,7 @@ public abstract class ChangeTargetStats : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - target.ChangeStatBoost(_stat, _amount, target == move.User); + target.ChangeStatBoost(_stat, _amount, target == move.User, false); } } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs index 8147539..1ca91ca 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ChangeUserStats.cs @@ -31,7 +31,7 @@ public abstract class ChangeUserStats : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - move.User.ChangeStatBoost(_stat, _amount, true); + move.User.ChangeStatBoost(_stat, _amount, true, false); } } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Charge.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Charge.cs index 6e5a69c..61c062f 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Charge.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Charge.cs @@ -8,7 +8,7 @@ public class Charge : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - move.User.ChangeStatBoost(Statistic.SpecialDefense, 1, true); + move.User.ChangeStatBoost(Statistic.SpecialDefense, 1, true, false); move.User.Volatile.Add(new ChargeEffect()); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Curse.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Curse.cs index 6664fbb..39ae511 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Curse.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Curse.cs @@ -24,9 +24,9 @@ public class Curse : Script else { EventBatchId batchId = new(); - move.User.ChangeStatBoost(Statistic.Speed, -1, true, batchId); - move.User.ChangeStatBoost(Statistic.Defense, 1, true, batchId); - move.User.ChangeStatBoost(Statistic.Attack, 1, true, batchId); + move.User.ChangeStatBoost(Statistic.Speed, -1, true, false, batchId); + move.User.ChangeStatBoost(Statistic.Defense, 1, true, false, batchId); + move.User.ChangeStatBoost(Statistic.Attack, 1, true, false, batchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DragonAscent.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DragonAscent.cs index 5c3abc8..5e28ec9 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DragonAscent.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DragonAscent.cs @@ -7,7 +7,7 @@ public class DragonAscent : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { EventBatchId batchId = new(); - move.User.ChangeStatBoost(Statistic.Defense, -1, true, batchId); - move.User.ChangeStatBoost(Statistic.SpecialDefense, -1, true, batchId); + move.User.ChangeStatBoost(Statistic.Defense, -1, true, false, batchId); + move.User.ChangeStatBoost(Statistic.SpecialDefense, -1, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FellStinger.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FellStinger.cs index 8808f1e..b214d98 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FellStinger.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FellStinger.cs @@ -8,7 +8,7 @@ public class FellStinger : Script { if (target.IsFainted) { - move.User.ChangeStatBoost(Statistic.Attack, 2, true); + move.User.ChangeStatBoost(Statistic.Attack, 2, true, false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs index 5fd1ee2..6a4ead9 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs @@ -14,7 +14,7 @@ public class FireFang : Script var random = battleData.Battle.Random; if (random.EffectChance(10, move, target, hit)) { - target.SetStatus("burned"); + target.SetStatus("burned", false); } // It also has an independent 10% chance of causing the target to flinch, if the user attacks before the target. diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlameWheel.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlameWheel.cs index 93ef572..407f3ba 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlameWheel.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlameWheel.cs @@ -28,7 +28,7 @@ public class FlameWheel : Script if (move.Battle.Random.EffectChance(_burnChance, move, target, hit)) { - target.SetStatus("burned"); + target.SetStatus("burned", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlareBlitz.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlareBlitz.cs index ed9ccf0..719d10d 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlareBlitz.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlareBlitz.cs @@ -12,7 +12,7 @@ public class FlareBlitz : Script if (battleData.Battle.Random.EffectChance(10, move, target, hit)) { - target.SetStatus("burned"); + target.SetStatus("burned", false); } var hitData = move.GetHitData(target, hit); diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flatter.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flatter.cs index a40b50a..6df8165 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flatter.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Flatter.cs @@ -8,7 +8,7 @@ public class Flatter : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - target.ChangeStatBoost(Statistic.SpecialAttack, 1, false); + target.ChangeStatBoost(Statistic.SpecialAttack, 1, false, false); target.Volatile.StackOrAdd("confusion", () => new Confusion()); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlowerShield.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlowerShield.cs index 967b907..cbed1ee 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlowerShield.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FlowerShield.cs @@ -22,7 +22,7 @@ public class FlowerShield : Script continue; if (!pokemon.Types.Contains(grassType)) continue; - pokemon.ChangeStatBoost(Statistic.Defense, 1, pokemon == move.User, batchId); + pokemon.ChangeStatBoost(Statistic.Defense, 1, pokemon == move.User, false, batchId); } } } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Foresight.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Foresight.cs index 45086b6..94d2f4a 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Foresight.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Foresight.cs @@ -13,6 +13,6 @@ public class Foresight : Script return; var typeLibrary = battleData.Battle.Library.StaticLibrary.Types; target.Volatile.Add(new ForesightEffect(typeLibrary)); - target.ChangeStatBoost(Statistic.Evasion, (sbyte)-target.StatBoost.Evasion, false); + target.ChangeStatBoost(Statistic.Evasion, (sbyte)-target.StatBoost.Evasion, false, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeDry.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeDry.cs index 10ea0e6..793bfa5 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeDry.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeDry.cs @@ -31,7 +31,7 @@ public class FreezeDry : Script if (battleData.Battle.Random.EffectChance(10, move, target, hit)) { - target.SetStatus("frozen"); + target.SetStatus("frozen", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs index 6708df4..df70d21 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FreezeShock.cs @@ -17,7 +17,7 @@ public class FreezeShock : BaseChargeMove if (battleData.Battle.Random.EffectChance(30, move, target, hit)) { - target.SetStatus("paralyzed"); + target.SetStatus("paralyzed", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs index 3b81930..ef85cb1 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GearUp.cs @@ -19,8 +19,8 @@ public class GearUp : Script var ability = pokemon.ActiveAbility?.Name; if (ability != "plus" && ability != "minus") continue; - pokemon.ChangeStatBoost(Statistic.Attack, 1, pokemon == move.User, evtBatchId); - pokemon.ChangeStatBoost(Statistic.SpecialAttack, 1, pokemon == move.User, evtBatchId); + pokemon.ChangeStatBoost(Statistic.Attack, 1, pokemon == move.User, false, evtBatchId); + pokemon.ChangeStatBoost(Statistic.SpecialAttack, 1, pokemon == move.User, false, evtBatchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs index 7b8d0df..f14b28d 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Geomancy.cs @@ -12,8 +12,8 @@ public class Geomancy : BaseChargeMove public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { EventBatchId eventBatchId = new(); - move.User.ChangeStatBoost(Statistic.SpecialAttack, 2, true, eventBatchId); - move.User.ChangeStatBoost(Statistic.SpecialDefense, 2, true, eventBatchId); - move.User.ChangeStatBoost(Statistic.Speed, 2, true, eventBatchId); + move.User.ChangeStatBoost(Statistic.SpecialAttack, 2, true, false, eventBatchId); + move.User.ChangeStatBoost(Statistic.SpecialDefense, 2, true, false, eventBatchId); + move.User.ChangeStatBoost(Statistic.Speed, 2, true, false, eventBatchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Growth.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Growth.cs index acbd93a..8169f3c 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Growth.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Growth.cs @@ -12,7 +12,7 @@ public class Growth : Script sbyte amount = 1; if (move.Battle.WeatherName == ScriptUtils.ResolveName()) amount = 2; - move.User.ChangeStatBoost(Statistic.Attack, amount, true, batchId); - move.User.ChangeStatBoost(Statistic.SpecialAttack, amount, true, batchId); + move.User.ChangeStatBoost(Statistic.Attack, amount, true, false, batchId); + move.User.ChangeStatBoost(Statistic.SpecialAttack, amount, true, false, batchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GuardSwap.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GuardSwap.cs index 716702b..204534e 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GuardSwap.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/GuardSwap.cs @@ -17,11 +17,11 @@ public class GuardSwap : Script var userSpecialDefense = userStats.GetStatistic(Statistic.SpecialDefense); var targetSpecialDefense = targetStats.GetStatistic(Statistic.SpecialDefense); - user.ChangeStatBoost(Statistic.Defense, (sbyte)(targetDefense - userDefense), true, eventBatchId); - user.ChangeStatBoost(Statistic.SpecialDefense, (sbyte)(targetSpecialDefense - userSpecialDefense), true, + user.ChangeStatBoost(Statistic.Defense, (sbyte)(targetDefense - userDefense), true, true, eventBatchId); + user.ChangeStatBoost(Statistic.SpecialDefense, (sbyte)(targetSpecialDefense - userSpecialDefense), true, true, eventBatchId); - target.ChangeStatBoost(Statistic.Defense, (sbyte)(userDefense - targetDefense), false, eventBatchId); + target.ChangeStatBoost(Statistic.Defense, (sbyte)(userDefense - targetDefense), false, true, eventBatchId); target.ChangeStatBoost(Statistic.SpecialDefense, (sbyte)(userSpecialDefense - targetSpecialDefense), false, - eventBatchId); + true, eventBatchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/HeartSwap.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/HeartSwap.cs index bf8893a..0133236 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/HeartSwap.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/HeartSwap.cs @@ -16,8 +16,8 @@ public class HeartSwap : Script var targetStat = targetStats.GetStatistic(stat); if (userStat == targetStat) continue; - move.User.ChangeStatBoost(stat, (sbyte)(userStat - targetStat), true, eventBatchId); - target.ChangeStatBoost(stat, (sbyte)(targetStat - userStat), false, eventBatchId); + move.User.ChangeStatBoost(stat, (sbyte)(userStat - targetStat), true, true, eventBatchId); + target.ChangeStatBoost(stat, (sbyte)(targetStat - userStat), false, true, eventBatchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceBurn.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceBurn.cs index 5696833..8064be7 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceBurn.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceBurn.cs @@ -17,7 +17,7 @@ public class IceBurn : BaseChargeMove if (battleData.Battle.Random.EffectChance(30, move, target, hit)) { - target.SetStatus("burned"); + target.SetStatus("burned", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceFang.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceFang.cs index cb72ea7..016c814 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceFang.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/IceFang.cs @@ -14,7 +14,7 @@ public class IceFang : Script if (battleData.Battle.Random.EffectChance(10, move, target, hit)) { - target.SetStatus("frozen"); + target.SetStatus("frozen", false); } if (battleData.Battle.Random.EffectChance(10, move, target, hit)) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MagneticFlux.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MagneticFlux.cs index e28175c..940bade 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MagneticFlux.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MagneticFlux.cs @@ -18,8 +18,8 @@ public class MagneticFlux : Script continue; EventBatchId batch = new(); - pokemon.ChangeStatBoost(Statistic.Defense, 1, pokemon == move.User, batch); - pokemon.ChangeStatBoost(Statistic.SpecialDefense, 1, pokemon == move.User, batch); + pokemon.ChangeStatBoost(Statistic.Defense, 1, pokemon == move.User, false, batch); + pokemon.ChangeStatBoost(Statistic.SpecialDefense, 1, pokemon == move.User, false, batch); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Memento.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Memento.cs index 17b02fe..c5fc20d 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Memento.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Memento.cs @@ -7,8 +7,8 @@ public class Memento : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { var evtBatch = new EventBatchId(); - target.ChangeStatBoost(Statistic.Attack, -2, false, evtBatch); - target.ChangeStatBoost(Statistic.SpecialAttack, -2, false, evtBatch); + target.ChangeStatBoost(Statistic.Attack, -2, false, false, evtBatch); + target.ChangeStatBoost(Statistic.SpecialAttack, -2, false, false, evtBatch); move.User.Faint(DamageSource.Misc); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MiracleEye.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MiracleEye.cs index 2e7e2fc..6074edc 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MiracleEye.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/MiracleEye.cs @@ -10,7 +10,7 @@ public class MiracleEye : Script { if (target.StatBoost.Evasion > 0) { - target.ChangeStatBoost(Statistic.Evasion, (sbyte)-target.StatBoost.Evasion, false); + target.ChangeStatBoost(Statistic.Evasion, (sbyte)-target.StatBoost.Evasion, false, false); } target.Volatile.Add(new MiracleEyeEffect()); } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PartingShot.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PartingShot.cs index 8719314..dbc2bcf 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PartingShot.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PartingShot.cs @@ -15,8 +15,8 @@ public class PartingShot : Script return; var evtBatch = new EventBatchId(); - var attackChanged = target.ChangeStatBoost(Statistic.Attack, -1, false, evtBatch); - var specialAttackChanged = target.ChangeStatBoost(Statistic.SpecialAttack, -1, false, evtBatch); + var attackChanged = target.ChangeStatBoost(Statistic.Attack, -1, false, false, evtBatch); + var specialAttackChanged = target.ChangeStatBoost(Statistic.SpecialAttack, -1, false, false, evtBatch); if (attackChanged || specialAttackChanged) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PoisonTail.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PoisonTail.cs index f06ee7e..f0fac98 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PoisonTail.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PoisonTail.cs @@ -22,7 +22,7 @@ public class PoisonTail : Script if (battleData.Battle.Random.EffectChance(10, move, target, hit)) { - target.SetStatus(ScriptUtils.ResolveName()); + target.SetStatus(ScriptUtils.ResolveName(), false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PowerSwap.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PowerSwap.cs index a62ff07..a982f34 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PowerSwap.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/PowerSwap.cs @@ -14,11 +14,11 @@ public class PowerSwap : Script var userSpecialAttack = user.StatBoost.SpecialAttack; var targetSpecialAttack = target.StatBoost.SpecialAttack; - user.ChangeStatBoost(Statistic.Attack, (sbyte)(targetAttack - userAttack), true, eventBatchId); - user.ChangeStatBoost(Statistic.SpecialAttack, (sbyte)(targetSpecialAttack - userSpecialAttack), true, + user.ChangeStatBoost(Statistic.Attack, (sbyte)(targetAttack - userAttack), true, true, eventBatchId); + user.ChangeStatBoost(Statistic.SpecialAttack, (sbyte)(targetSpecialAttack - userSpecialAttack), true, true, eventBatchId); - target.ChangeStatBoost(Statistic.Attack, (sbyte)(userAttack - targetAttack), true, eventBatchId); - target.ChangeStatBoost(Statistic.SpecialAttack, (sbyte)(userSpecialAttack - targetSpecialAttack), true, + target.ChangeStatBoost(Statistic.Attack, (sbyte)(userAttack - targetAttack), true, true, eventBatchId); + target.ChangeStatBoost(Statistic.SpecialAttack, (sbyte)(userSpecialAttack - targetSpecialAttack), true, true, eventBatchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ResetTargetStats.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ResetTargetStats.cs index 6c84000..3a8f1b2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ResetTargetStats.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ResetTargetStats.cs @@ -9,7 +9,7 @@ public class ResetTargetStats : Script EventBatchId eventBatchId = new(); foreach (Statistic stat in Enum.GetValues(typeof(Statistic))) { - target.ChangeStatBoost(stat, (sbyte)-target.StatBoost.GetStatistic(stat), true, eventBatchId); + target.ChangeStatBoost(stat, (sbyte)-target.StatBoost.GetStatistic(stat), true, true, eventBatchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rest.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rest.cs index cd634fe..21ee145 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rest.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rest.cs @@ -18,7 +18,7 @@ public class Rest : Script move.GetHitData(target, hit).Fail(); return; } - if (move.User.SetStatus(ScriptUtils.ResolveName()) && move.User.StatusScript.Script is Sleep sleep) + if (move.User.SetStatus(ScriptUtils.ResolveName(), true) && move.User.StatusScript.Script is Sleep sleep) sleep.Turns = 2; } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rototiller.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rototiller.cs index bf90478..fae83e7 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rototiller.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Rototiller.cs @@ -13,8 +13,8 @@ public class Rototiller : Script EventBatchId batchId = new(); foreach (var pkmn in pokemon) { - pkmn.ChangeStatBoost(Statistic.Attack, 1, pkmn == move.User, batchId); - pkmn.ChangeStatBoost(Statistic.SpecialAttack, 1, pkmn == move.User, batchId); + pkmn.ChangeStatBoost(Statistic.Attack, 1, pkmn == move.User, false, batchId); + pkmn.ChangeStatBoost(Statistic.SpecialAttack, 1, pkmn == move.User, false, batchId); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SetStatus.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SetStatus.cs index f830ca6..8c8498c 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SetStatus.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SetStatus.cs @@ -20,6 +20,6 @@ public class SetStatus : Script { if (_status == null) throw new Exception("Missing required parameter 'status'"); - target.SetStatus(_status); + target.SetStatus(_status, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ShellSmash.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ShellSmash.cs index 1d1b92f..1bac9e3 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ShellSmash.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ShellSmash.cs @@ -7,11 +7,11 @@ public class ShellSmash : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { EventBatchId eventBatchId = new(); - move.User.ChangeStatBoost(Statistic.Attack, 2, true, eventBatchId); - move.User.ChangeStatBoost(Statistic.SpecialAttack, 2, true, eventBatchId); - move.User.ChangeStatBoost(Statistic.Speed, 2, true, eventBatchId); + move.User.ChangeStatBoost(Statistic.Attack, 2, true, false, eventBatchId); + move.User.ChangeStatBoost(Statistic.SpecialAttack, 2, true, false, eventBatchId); + move.User.ChangeStatBoost(Statistic.Speed, 2, true, false, eventBatchId); eventBatchId = new EventBatchId(); - move.User.ChangeStatBoost(Statistic.Defense, -1, true, eventBatchId); - move.User.ChangeStatBoost(Statistic.SpecialDefense, -1, true, eventBatchId); + move.User.ChangeStatBoost(Statistic.Defense, -1, true, false, eventBatchId); + move.User.ChangeStatBoost(Statistic.SpecialDefense, -1, true, false, eventBatchId); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SkullBash.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SkullBash.cs index 906d526..3c4684a 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SkullBash.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SkullBash.cs @@ -10,7 +10,7 @@ public class SkullBash : Script { if (move.User.Volatile.Contains()) return; - move.User.ChangeStatBoost(Statistic.Defense, 1, true); + move.User.ChangeStatBoost(Statistic.Defense, 1, true, false); move.User.Volatile.Add(new SkullBashEffect(move.User)); prevent = true; } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SpectralThief.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SpectralThief.cs index 0910194..bd05c99 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SpectralThief.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/SpectralThief.cs @@ -12,8 +12,8 @@ public class SpectralThief : Script EventBatchId batchId = new(); foreach (var positiveStat in positiveStats) { - move.User.ChangeStatBoost(positiveStat.statistic, positiveStat.value, true, batchId); - target.ChangeStatBoost(positiveStat.statistic, (sbyte)-positiveStat.value, true, batchId); + move.User.ChangeStatBoost(positiveStat.statistic, positiveStat.value, true, true, batchId); + target.ChangeStatBoost(positiveStat.statistic, (sbyte)-positiveStat.value, true, true, batchId); } } } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/StrengthSap.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/StrengthSap.cs index 32dacd5..a3393b8 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/StrengthSap.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/StrengthSap.cs @@ -7,7 +7,7 @@ public class StrengthSap : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { var attack = target.BoostedStats.Attack; - if (!target.ChangeStatBoost(Statistic.Attack, -1, false)) + if (!target.ChangeStatBoost(Statistic.Attack, -1, false, false)) { move.GetHitData(target, hit).Fail(); return; diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Superpower.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Superpower.cs index 1edeff9..93ae7ca 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Superpower.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Superpower.cs @@ -7,7 +7,7 @@ public class Superpower : Script public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { EventBatchId eventBatch = new(); - move.User.ChangeStatBoost(Statistic.Attack, -1, true, eventBatch); - move.User.ChangeStatBoost(Statistic.Defense, -1, true, eventBatch); + move.User.ChangeStatBoost(Statistic.Attack, -1, true, false, eventBatch); + move.User.ChangeStatBoost(Statistic.Defense, -1, true, false, eventBatch); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Swagger.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Swagger.cs index 80961ac..f9cc2ad 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Swagger.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Swagger.cs @@ -6,7 +6,7 @@ public class Swagger : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - target.ChangeStatBoost(Statistic.Attack, 2, false); + target.ChangeStatBoost(Statistic.Attack, 2, false, false); target.Volatile.Add(new Pokemon.Confusion()); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ThunderFang.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ThunderFang.cs index ee28876..e5a66b7 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ThunderFang.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ThunderFang.cs @@ -12,7 +12,7 @@ public class ThunderFang : Script var random = move.Battle.Random; if (random.EffectChance(10, move, target, hit)) { - target.SetStatus(ScriptUtils.ResolveName()); + target.SetStatus(ScriptUtils.ResolveName(), false); } if (random.EffectChance(10, move, target, hit)) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TopsyTurvy.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TopsyTurvy.cs index 71b5641..ddc0403 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TopsyTurvy.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TopsyTurvy.cs @@ -16,7 +16,7 @@ public class TopsyTurvy : Script hasChanged = true; var newStatBoost = -statBoost; - target.ChangeStatBoost(stat, (sbyte)newStatBoost, target == move.User, batchId); + target.ChangeStatBoost(stat, (sbyte)newStatBoost, target == move.User, true, batchId); } if (!hasChanged) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ToxicThread.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ToxicThread.cs index d72f630..38dc4dd 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ToxicThread.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/ToxicThread.cs @@ -6,7 +6,7 @@ public class ToxicThread : Script /// public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit) { - target.SetStatus(ScriptUtils.ResolveName()); - target.ChangeStatBoost(Statistic.Speed, -1, false); + target.SetStatus(ScriptUtils.ResolveName(), false); + target.ChangeStatBoost(Statistic.Speed, -1, false, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TriAttack.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TriAttack.cs index 6f8fd58..468b0c1 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TriAttack.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/TriAttack.cs @@ -14,6 +14,6 @@ public class TriAttack : Script ScriptUtils.ResolveName(), ScriptUtils.ResolveName(), ]); - target.SetStatus(status); + target.SetStatus(status, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Twineedle.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Twineedle.cs index 892b07e..7242680 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Twineedle.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/Twineedle.cs @@ -11,7 +11,7 @@ public class Twineedle : Script { if (move.Battle.Random.EffectChance(20, move, target, hit)) { - target.SetStatus(ScriptUtils.ResolveName()); + target.SetStatus(ScriptUtils.ResolveName(), false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VenomDrench.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VenomDrench.cs index 11337a8..b0e0e99 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VenomDrench.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VenomDrench.cs @@ -11,8 +11,8 @@ public class VenomDrench : Script return; EventBatchId eventBatch = new(); - target.ChangeStatBoost(Statistic.Attack, -1, false, eventBatch); - target.ChangeStatBoost(Statistic.SpecialAttack, -1, false, eventBatch); - target.ChangeStatBoost(Statistic.Speed, -1, false, eventBatch); + target.ChangeStatBoost(Statistic.Attack, -1, false, false, eventBatch); + target.ChangeStatBoost(Statistic.SpecialAttack, -1, false, false, eventBatch); + target.ChangeStatBoost(Statistic.Speed, -1, false, false, eventBatch); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VoltTackle.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VoltTackle.cs index 59250f8..237d229 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VoltTackle.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/VoltTackle.cs @@ -12,7 +12,7 @@ public class VoltTackle : Script if (move.Battle.Random.EffectChance(10, move, target, hit)) { - target.SetStatus(ScriptUtils.ResolveName()); + target.SetStatus(ScriptUtils.ResolveName(), false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs index 4066d18..6270ce7 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BanefulBunkerEffect.cs @@ -11,7 +11,7 @@ public class BanefulBunkerEffect : ProtectionEffectScript base.BlockIncomingHit(executingMove, target, hitIndex, ref block); if (executingMove.UseMove.Category != MoveCategory.Status && executingMove.UseMove.HasFlag("contact")) { - executingMove.User.SetStatus("poisoned"); + executingMove.User.SetStatus("poisoned", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs index 8b00dcb..1d5c999 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/BeakBlastEffect.cs @@ -8,7 +8,7 @@ public class BeakBlastEffect : Script { if (move.UseMove.HasFlag("contact")) { - move.User.SetStatus("burned"); + move.User.SetStatus("burned", false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs index 1cd6cc9..44d69ca 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/KingsShield.cs @@ -11,7 +11,7 @@ public class KingsShield : ProtectionEffectScript base.BlockIncomingHit(executingMove, target, hitIndex, ref block); if (executingMove.UseMove.Category != MoveCategory.Status && executingMove.UseMove.HasFlag("contact")) { - executingMove.User.ChangeStatBoost(Statistic.Accuracy, -2, false); + executingMove.User.ChangeStatBoost(Statistic.Accuracy, -2, false, false); } } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RageEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RageEffect.cs index 4ca1c95..b3bc3fc 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RageEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/RageEffect.cs @@ -6,7 +6,7 @@ public class RageEffect : Script /// public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) { - move.User.ChangeStatBoost(Statistic.Attack, 1, true); + move.User.ChangeStatBoost(Statistic.Attack, 1, true, false); } /// diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/StockpileEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/StockpileEffect.cs index c63e2f3..27d0d0b 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/StockpileEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/StockpileEffect.cs @@ -15,8 +15,8 @@ public class StockpileEffect : Script } _pokemon = pokemon; EventBatchId batchId = new(); - pokemon.ChangeStatBoost(Statistic.Defense, 1, true, batchId); - pokemon.ChangeStatBoost(Statistic.SpecialDefense, 1, true, batchId); + pokemon.ChangeStatBoost(Statistic.Defense, 1, true, false, batchId); + pokemon.ChangeStatBoost(Statistic.SpecialDefense, 1, true, false, batchId); StockpileCount = 1; } @@ -26,8 +26,8 @@ public class StockpileEffect : Script if (StockpileCount < 3) { EventBatchId batchId = new(); - _pokemon?.ChangeStatBoost(Statistic.Defense, 1, true, batchId); - _pokemon?.ChangeStatBoost(Statistic.SpecialDefense, 1, true, batchId); + _pokemon?.ChangeStatBoost(Statistic.Defense, 1, true, false, batchId); + _pokemon?.ChangeStatBoost(Statistic.SpecialDefense, 1, true, false, batchId); StockpileCount++; } } @@ -40,8 +40,8 @@ public class StockpileEffect : Script return; } EventBatchId batchId = new(); - _pokemon.ChangeStatBoost(Statistic.Defense, (sbyte)-StockpileCount, true, batchId); - _pokemon.ChangeStatBoost(Statistic.SpecialDefense, (sbyte)-StockpileCount, true, batchId); + _pokemon.ChangeStatBoost(Statistic.Defense, (sbyte)-StockpileCount, true, false, batchId); + _pokemon.ChangeStatBoost(Statistic.SpecialDefense, (sbyte)-StockpileCount, true, false, batchId); StockpileCount = 0; } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/YawnEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/YawnEffect.cs index efff3e0..9c2a5f7 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/YawnEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/YawnEffect.cs @@ -31,6 +31,6 @@ public class YawnEffect : Script _hasDoneFirstTurn = true; return; } - _pokemon.SetStatus(ScriptUtils.ResolveName()); + _pokemon.SetStatus(ScriptUtils.ResolveName(), true); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerGiftEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerGiftEffect.cs new file mode 100644 index 0000000..d782992 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerGiftEffect.cs @@ -0,0 +1,31 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Side; + +[Script(ScriptCategory.Side, "flower_gift")] +public class FlowerGiftEffect : Script +{ + private readonly HashSet _placerPokemon = []; + + public void OnAdded(IPokemon placer) + { + _placerPokemon.Add(placer); + } + + public void OnRemoved(IPokemon placer) + { + _placerPokemon.Remove(placer); + if (_placerPokemon.Count == 0) + { + RemoveSelf(); + } + } + + /// + public override void ChangeOffensiveStatValue(IExecutingMove move, IPokemon target, byte hit, uint defensiveStat, + ImmutableStatisticSet targetStats, ref uint value) + { + if (move.Battle.WeatherName != ScriptUtils.ResolveName()) + return; + + value = value.MultiplyOrMax(1.5f); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerVeilEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerVeilEffect.cs new file mode 100644 index 0000000..0d0159c --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FlowerVeilEffect.cs @@ -0,0 +1,49 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Side; + +[Script(ScriptCategory.Side, "flower_veil")] +public class FlowerVeilEffect : Script +{ + private readonly HashSet _placerPokemon = []; + + public void OnAdded(IPokemon placer) + { + _placerPokemon.Add(placer); + } + + public void OnRemoved(IPokemon placer) + { + _placerPokemon.Remove(placer); + if (_placerPokemon.Count == 0) + { + RemoveSelf(); + } + } + + /// + public override void PreventStatBoostChange(IPokemon target, Statistic stat, sbyte amount, bool selfInflicted, + ref bool prevent) + { + if (selfInflicted) + return; + + if (amount > 0) + return; + + if (target.Types.All(x => x.Name != "grass")) + return; + + prevent = true; + } + + /// + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) + { + if (selfInflicted) + return; + if (pokemon.Types.All(x => x.Name != "grass")) + return; + + preventStatus = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FriendGuardEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FriendGuardEffect.cs new file mode 100644 index 0000000..21fd770 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FriendGuardEffect.cs @@ -0,0 +1,28 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Side; + +[Script(ScriptCategory.Side, "friend_guard")] +public class FriendGuardEffect : Script +{ + private readonly HashSet _placerPokemon = []; + + public void OnAdded(IPokemon placer) + { + _placerPokemon.Add(placer); + } + + public void OnRemoved(IPokemon placer) + { + _placerPokemon.Remove(placer); + if (_placerPokemon.Count == 0) + { + RemoveSelf(); + } + } + + /// + public override void ChangeIncomingMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage) + { + var modifier = Math.Pow(0.75f, _placerPokemon.Count); + damage = (uint)(damage * modifier); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/SafeguardEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/SafeguardEffect.cs index c96dbd0..71ff07f 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/SafeguardEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/SafeguardEffect.cs @@ -6,7 +6,8 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Side; public class SafeguardEffect : Script { /// - public override void PreventStatusChange(IPokemon pokemonImpl, StringKey status, ref bool preventStatus) + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) { preventStatus = true; } diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/StickyWebEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/StickyWebEffect.cs index e3d9792..dc5a1b2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/StickyWebEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/StickyWebEffect.cs @@ -8,6 +8,6 @@ public class StickyWebEffect : Script { if (pokemon.IsFloating) return; - pokemon.ChangeStatBoost(Statistic.Speed, -1, false); + pokemon.ChangeStatBoost(Statistic.Speed, -1, false, false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/ToxicSpikesEffect.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/ToxicSpikesEffect.cs index 0bd0c07..d3cd1dc 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/ToxicSpikesEffect.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/ToxicSpikesEffect.cs @@ -9,6 +9,6 @@ public class ToxicSpikesEffect : Script if (pokemon.IsFloating) return; - pokemon.SetStatus(ScriptUtils.ResolveName()); + pokemon.SetStatus(ScriptUtils.ResolveName(), false); } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/HarshSunlight.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/HarshSunlight.cs index 02fb8e2..a83e0e4 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/HarshSunlight.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Weather/HarshSunlight.cs @@ -39,7 +39,8 @@ public class HarshSunlight : Script } /// - public override void PreventStatusChange(IPokemon pokemonImpl, StringKey status, ref bool preventStatus) + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) { if (status == ScriptUtils.ResolveName()) {