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