From b11203cb3aeda9ad1feeb31f19e94547af651774 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 15 Jun 2025 13:32:58 +0200 Subject: [PATCH] Last couple abilities --- .../PkmnLib.Plugin.Gen7/Data/Abilities.jsonc | 35 ++++++++++++++----- Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json | 1 + .../Scripts/Abilities/ShieldsDown.cs | 12 +------ .../Scripts/Abilities/WaterBubble.cs | 32 +++++++++++++++++ .../Scripts/Abilities/WaterCompaction.cs | 19 ++++++++++ .../Scripts/Abilities/WaterVeil.cs | 18 ++++++++++ .../Scripts/Abilities/WeakArmor.cs | 23 ++++++++++++ .../Scripts/Abilities/WhiteSmoke.cs | 20 +++++++++++ .../Scripts/Abilities/WimpOut.cs | 12 +++++++ .../Scripts/Abilities/WonderGuard.cs | 20 +++++++++++ .../Scripts/Abilities/WonderSkin.cs | 23 ++++++++++++ .../Scripts/Abilities/ZenMode.cs | 34 ++++++++++++++++++ 12 files changed, 229 insertions(+), 20 deletions(-) create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterBubble.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterCompaction.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterVeil.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WeakArmor.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WhiteSmoke.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WimpOut.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderGuard.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderSkin.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ZenMode.cs diff --git a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc index 3918a6d..77de6d9 100755 --- a/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc +++ b/Plugins/PkmnLib.Plugin.Gen7/Data/Abilities.jsonc @@ -726,17 +726,34 @@ "water_absorb": { "effect": "water_absorb" }, - "water_bubble": {}, - "water_compaction": {}, - "water_veil": {}, - "weak_armor": {}, - "white_smoke": {}, - "wimp_out": {}, - "wonder_guard": {}, - "wonder_skin": {}, + "water_bubble": { + "effect": "water_bubble" + }, + "water_compaction": { + "effect": "water_compaction" + }, + "water_veil": { + "effect": "water_veil" + }, + "weak_armor": { + "effect": "weak_armor" + }, + "white_smoke": { + "effect": "white_smoke" + }, + "wimp_out": { + "effect": "wimp_out" + }, + "wonder_guard": { + "effect": "wonder_guard" + }, + "wonder_skin": { + "effect": "wonder_skin" + }, "zen_mode": { "flags": [ "cant_be_copied" - ] + ], + "effect": "zen_mode" } } \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json b/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json index 3e0803f..a64fc15 100755 --- a/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json +++ b/Plugins/PkmnLib.Plugin.Gen7/Data/Pokemon.json @@ -25251,6 +25251,7 @@ } }, "zen": { + "isBattleOnly": true, "abilities": [ "sheer_force" ], diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ShieldsDown.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ShieldsDown.cs index 82a3b29..e30f76a 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ShieldsDown.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ShieldsDown.cs @@ -8,21 +8,11 @@ namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; [Script(ScriptCategory.Ability, "shields_down")] public class ShieldsDown : Script { - private IPokemon? _owningPokemon; - - /// - public override void OnAddedToParent(IScriptSource source) - { - if (source is not IPokemon pokemon) - throw new ArgumentException("ShieldsDown script must be added to a Pokemon.", nameof(source)); - _owningPokemon = pokemon; - } - /// public override void OnSwitchIn(IPokemon pokemon, byte position) => ChangeFormIfNeeded(pokemon); /// - public override void OnEndTurn(IScriptSource owner, IBattle battle) => ChangeFormIfNeeded(_owningPokemon); + public override void OnEndTurn(IScriptSource owner, IBattle battle) => ChangeFormIfNeeded(owner as IPokemon); private static void ChangeFormIfNeeded(IPokemon? pokemon) { diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterBubble.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterBubble.cs new file mode 100644 index 0000000..3fb0e6d --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterBubble.cs @@ -0,0 +1,32 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Water Bubble is an ability that halves the damage taken from Fire-type moves and prevents the Pokémon from being burned. +/// +/// Bulbapedia - Water Bubble +/// +[Script(ScriptCategory.Ability, "water_bubble")] +public class WaterBubble : Script +{ + /// + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) + { + if (status == ScriptUtils.ResolveName()) + preventStatus = true; + } + + /// + public override void ChangeIncomingMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage) + { + if (move.GetHitData(target, hit).Type?.Name == "fire") + damage /= 2; + } + + /// + public override void ChangeMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage) + { + if (move.GetHitData(target, hit).Type?.Name == "water") + damage *= 2; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterCompaction.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterCompaction.cs new file mode 100644 index 0000000..09b302b --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterCompaction.cs @@ -0,0 +1,19 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Water Compaction is an ability that sharply raises Defense when hit by a Water-type move. +/// +/// Bulbapedia - Water Compaction +/// +[Script(ScriptCategory.Ability, "water_compaction")] +public class WaterCompaction : Script +{ + /// + public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) + { + if (move.GetHitData(target, hit).Type?.Name != "water") + return; + target.BattleData?.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); + target.ChangeStatBoost(Statistic.Defense, 2, true, false); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterVeil.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterVeil.cs new file mode 100644 index 0000000..3d7bcf7 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WaterVeil.cs @@ -0,0 +1,18 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Water Veil is an ability that prevents the Pokémon from being burned. +/// +/// Bulbapedia - Water Veil +/// +[Script(ScriptCategory.Ability, "water_veil")] +public class WaterVeil : Script +{ + /// + public override void PreventStatusChange(IPokemon pokemon, StringKey status, bool selfInflicted, + ref bool preventStatus) + { + if (status == ScriptUtils.ResolveName()) + preventStatus = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WeakArmor.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WeakArmor.cs new file mode 100644 index 0000000..347954e --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WeakArmor.cs @@ -0,0 +1,23 @@ +using PkmnLib.Static.Moves; + +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Weak Armor is an ability that lowers Defense and raises Speed when hit by a physical move. +/// +/// Bulbapedia - Weak Armor +/// +[Script(ScriptCategory.Ability, "weak_armor")] +public class WeakArmor : Script +{ + /// + public override void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit) + { + if (move.UseMove.Category != MoveCategory.Physical) + return; + + target.BattleData?.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); + target.ChangeStatBoost(Statistic.Defense, -1, true, false); + target.ChangeStatBoost(Statistic.Speed, 1, true, false); + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WhiteSmoke.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WhiteSmoke.cs new file mode 100644 index 0000000..62923d0 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WhiteSmoke.cs @@ -0,0 +1,20 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// White Smoke is an ability that prevents the Pokémon's stats from being lowered by other Pokémon. +/// +/// Bulbapedia - White Smoke +/// +[Script(ScriptCategory.Ability, "white_smoke")] +public class WhiteSmoke : Script +{ + /// + public override void PreventStatBoostChange(IPokemon target, Statistic stat, sbyte amount, bool selfInflicted, + ref bool prevent) + { + if (selfInflicted || amount >= 0) + return; + + prevent = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WimpOut.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WimpOut.cs new file mode 100644 index 0000000..f4f3c93 --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WimpOut.cs @@ -0,0 +1,12 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Wimp Out is an ability that causes the Pokémon to switch out when its HP falls below half. +/// +/// Bulbapedia - Wimp Out +/// +[Script(ScriptCategory.Ability, "wimp_out")] +public class WimpOut : Script +{ + // TODO: Implement Wimp Out ability logic +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderGuard.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderGuard.cs new file mode 100644 index 0000000..1f3fe8f --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderGuard.cs @@ -0,0 +1,20 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Wonder Guard is an ability that only allows super-effective moves to hit the Pokémon. +/// +/// Bulbapedia - Wonder Guard +/// +[Script(ScriptCategory.Ability, "wonder_guard")] +public class WonderGuard : Script +{ + /// + public override void BlockIncomingHit(IExecutingMove executingMove, IPokemon target, byte hitIndex, ref bool block) + { + var effectiveness = executingMove.GetHitData(target, hitIndex).Effectiveness; + if (!(effectiveness <= 1.0)) + return; + executingMove.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); + block = true; + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderSkin.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderSkin.cs new file mode 100644 index 0000000..2ca2f2a --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/WonderSkin.cs @@ -0,0 +1,23 @@ +using PkmnLib.Static.Moves; + +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Wonder Skin is an ability that makes status moves more likely to miss. +/// +/// Bulbapedia - Wonder Skin +/// +[Script(ScriptCategory.Ability, "wonder_skin")] +public class WonderSkin : Script +{ + /// + public override void ChangeIncomingAccuracy(IExecutingMove executingMove, IPokemon target, byte hitIndex, + ref int modifiedAccuracy) + { + if (executingMove.UseMove.Category == MoveCategory.Status && executingMove.UseMove.Accuracy != 255) + { + executingMove.Battle.EventHook.Invoke(new AbilityTriggerEvent(target)); + modifiedAccuracy /= 2; + } + } +} \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ZenMode.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ZenMode.cs new file mode 100644 index 0000000..c0e085d --- /dev/null +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Abilities/ZenMode.cs @@ -0,0 +1,34 @@ +namespace PkmnLib.Plugin.Gen7.Scripts.Abilities; + +/// +/// Zen Mode is an ability that changes the Pokémon's form when its HP falls below half. +/// +/// Bulbapedia - Zen Mode +/// +[Script(ScriptCategory.Ability, "zen_mode")] +public class ZenMode : Script +{ + /// + public override void OnSwitchIn(IPokemon pokemon, byte position) => ChangeFormIfNeeded(pokemon); + + /// + public override void OnEndTurn(IScriptSource owner, IBattle battle) => ChangeFormIfNeeded(owner as IPokemon); + + private static void ChangeFormIfNeeded(IPokemon? pokemon) + { + if (pokemon is null) + return; + + if (pokemon.Species.Name != "darmanitan" || pokemon.BattleData?.Battle == null) + return; + if (pokemon.CurrentHealth < pokemon.MaxHealth / 2 && pokemon.Form.Name != "zen" && + pokemon.Species.TryGetForm("zen", out var zenForm)) + { + pokemon.ChangeForm(zenForm); + } + else if (pokemon.CurrentHealth >= pokemon.MaxHealth / 2 && pokemon.Form.Name == "zen") + { + pokemon.ChangeForm(pokemon.Species.GetDefaultForm()); + } + } +} \ No newline at end of file