Surprisingly, more abilities
All checks were successful
Build / Build (push) Successful in 50s

This commit is contained in:
2025-06-14 13:37:58 +02:00
parent 5961bb746e
commit 1b9d137bb0
86 changed files with 311 additions and 88 deletions

View File

@@ -20,7 +20,7 @@ public class BadDreams : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_owner is null)
return;

View File

@@ -39,7 +39,7 @@ public class DrySkin : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_owningPokemon == null)
return;

View File

@@ -19,7 +19,7 @@ public class Harvest : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon?.BattleData is null)
return;

View File

@@ -19,7 +19,7 @@ public class Healer : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon?.BattleData is null)
return;

View File

@@ -19,7 +19,7 @@ public class Hydration : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon is null)
return;

View File

@@ -19,7 +19,7 @@ public class IceBody : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon is null)
return;

View File

@@ -19,7 +19,7 @@ public class Moody : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon == null)
return;

View File

@@ -19,7 +19,7 @@ public class PowerConstruct : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_pokemon?.BattleData?.Battle == null)
return;

View File

@@ -19,7 +19,7 @@ public class RainDish : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_owner is null)
return;

View File

@@ -22,7 +22,7 @@ public class Schooling : Script
public override void OnSwitchIn(IPokemon pokemon, byte position) => ChangeFormIfNeeded(pokemon);
/// <inheritdoc />
public override void OnEndTurn(IBattle battle) => ChangeFormIfNeeded(_owningPokemon);
public override void OnEndTurn(IScriptSource owner, IBattle battle) => ChangeFormIfNeeded(_owningPokemon);
private static void ChangeFormIfNeeded(IPokemon? pokemon)
{

View File

@@ -19,7 +19,7 @@ public class ShedSkin : Script
}
/// <inheritdoc />
public override void OnEndTurn(IBattle battle)
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (_owningPokemon is null || _owningPokemon.StatusScript.IsEmpty)
return;

View File

@@ -22,7 +22,7 @@ public class ShieldsDown : Script
public override void OnSwitchIn(IPokemon pokemon, byte position) => ChangeFormIfNeeded(pokemon);
/// <inheritdoc />
public override void OnEndTurn(IBattle battle) => ChangeFormIfNeeded(_owningPokemon);
public override void OnEndTurn(IScriptSource owner, IBattle battle) => ChangeFormIfNeeded(_owningPokemon);
private static void ChangeFormIfNeeded(IPokemon? pokemon)
{

View File

@@ -0,0 +1,19 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Slush Rush is an ability that doubles the Pokémon's Speed during hail.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Slush_Rush_(Ability)">Bulbapedia - Slush Rush</see>
/// </summary>
[Script(ScriptCategory.Ability, "slush_rush")]
public class SlushRush : Script
{
/// <inheritdoc />
public override void ChangeSpeed(ITurnChoice choice, ref uint speed)
{
if (choice.User.BattleData?.Battle.WeatherName == ScriptUtils.ResolveName<Weather.Hail>())
{
speed *= 2;
}
}
}

View File

@@ -0,0 +1,16 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Sniper is an ability that increases the power of critical hits.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Sniper_(Ability)">Bulbapedia - Sniper</see>
/// </summary>
[Script(ScriptCategory.Ability, "sniper")]
public class Sniper : Script
{
/// <inheritdoc />
public override void ChangeCriticalModifier(IExecutingMove move, IPokemon target, byte hit, ref float modifier)
{
modifier *= 1.5f;
}
}

View File

@@ -0,0 +1,27 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Snow Cloak is an ability that raises the Pokémon's evasion during hail.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Snow_Cloak_(Ability)">Bulbapedia - Snow Cloak</see>
/// </summary>
[Script(ScriptCategory.Ability, "snow_cloak")]
public class SnowCloak : Script
{
/// <inheritdoc />
public override void ChangeIncomingAccuracy(IExecutingMove executingMove, IPokemon target, byte hitIndex,
ref int modifiedAccuracy)
{
// If the weather is hail, increase evasion by 20%
if (executingMove.Battle.WeatherName == ScriptUtils.ResolveName<Weather.Hail>())
{
modifiedAccuracy = (int)(modifiedAccuracy * 0.8f);
}
}
public override void CustomTrigger(StringKey eventName, ICustomTriggerArgs args)
{
if (eventName == CustomTriggers.IgnoreHail && args is CustomTriggers.IgnoreHailArgs hailArgs)
hailArgs.Ignore = true;
}
}

View File

@@ -0,0 +1,25 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Snow Warning is an ability that creates hail when the Pokémon enters battle.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Snow_Warning_(Ability)">Bulbapedia - Snow Warning</see>
/// </summary>
[Script(ScriptCategory.Ability, "snow_warning")]
public class SnowWarning : Script
{
/// <inheritdoc />
public override void OnSwitchIn(IPokemon pokemon, byte position)
{
var battleData = pokemon.BattleData;
if (battleData == null)
return;
if (battleData.Battle.WeatherName == ScriptUtils.ResolveName<Weather.Hail>())
return;
EventBatchId batchId = new();
battleData.Battle.EventHook.Invoke(new AbilityTriggerEvent(pokemon));
battleData.Battle.SetWeather(ScriptUtils.ResolveName<Weather.Hail>(), 5, batchId);
}
}

View File

@@ -0,0 +1,34 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Solar Power is an ability that boosts Special Attack in harsh sunlight but causes the Pokémon to lose HP each turn.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Solar_Power_(Ability)">Bulbapedia - Solar Power</see>
/// </summary>
[Script(ScriptCategory.Ability, "solar_power")]
public class SolarPower : Script
{
/// <inheritdoc />
public override void ChangeOffensiveStatValue(IExecutingMove move, IPokemon target, byte hit, uint defensiveStat,
ImmutableStatisticSet<uint> targetStats, Statistic stat, ref uint value)
{
if ((stat == Statistic.SpecialAttack &&
move.Battle.WeatherName == ScriptUtils.ResolveName<Weather.HarshSunlight>()) ||
move.Battle.WeatherName == ScriptUtils.ResolveName<Weather.DesolateLands>())
{
value = value.MultiplyOrMax(1.5f);
}
}
/// <inheritdoc />
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (owner is not IPokemon pokemon)
return;
if (!pokemon.IsUsable)
return;
pokemon.Damage(pokemon.MaxHealth / 8, DamageSource.Weather);
}
}

View File

@@ -0,0 +1,17 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Solid Rock is an ability that reduces damage from super-effective moves.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Solid_Rock_(Ability)">Bulbapedia - Solid Rock</see>
/// </summary>
[Script(ScriptCategory.Ability, "solid_rock")]
public class SolidRock : Script
{
/// <inheritdoc />
public override void ChangeIncomingMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage)
{
if (move.GetHitData(target, hit).Effectiveness >= 2f)
damage = (uint)(damage * 0.75f);
}
}

View File

@@ -0,0 +1,22 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Soul-Heart is an ability that raises Special Attack when another Pokémon faints.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Soul-Heart_(Ability)">Bulbapedia - Soul-Heart</see>
/// </summary>
[Script(ScriptCategory.Ability, "soul_heart")]
public class SoulHeart : Script
{
/// <inheritdoc />
public override void OnAllyFaint(IPokemon ally, IPokemon faintedPokemon)
{
ally.ChangeStatBoost(Statistic.SpecialAttack, 1, true, false);
}
/// <inheritdoc />
public override void OnOpponentFaints(IExecutingMove move, IPokemon target, byte hit)
{
move.User.ChangeStatBoost(Statistic.SpecialAttack, 1, true, false);
}
}

View File

@@ -0,0 +1,17 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Soundproof is an ability that grants immunity to sound-based moves.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Soundproof_(Ability)">Bulbapedia - Soundproof</see>
/// </summary>
[Script(ScriptCategory.Ability, "soundproof")]
public class Soundproof : Script
{
/// <inheritdoc />
public override void IsInvulnerableToMove(IExecutingMove move, IPokemon target, ref bool invulnerable)
{
if (move.UseMove.HasFlag("sound"))
invulnerable = true;
}
}

View File

@@ -0,0 +1,24 @@
namespace PkmnLib.Plugin.Gen7.Scripts.Abilities;
/// <summary>
/// Speed Boost is an ability that raises the Pokémon's Speed at the end of each turn.
///
/// <see href="https://bulbapedia.bulbagarden.net/wiki/Speed_Boost_(Ability)">Bulbapedia - Speed Boost</see>
/// </summary>
[Script(ScriptCategory.Ability, "speed_boost")]
public class SpeedBoost : Script
{
/// <inheritdoc />
public override void OnEndTurn(IScriptSource owner, IBattle battle)
{
if (owner is not IPokemon pokemon)
return;
EventBatchId batchId = new();
battle.EventHook.Invoke(new AbilityTriggerEvent(pokemon)
{
BatchId = batchId,
});
pokemon.ChangeStatBoost(Statistic.Speed, 1, true, false, batchId);
}
}