More abilities, refactor custom triggers to be typed.
All checks were successful
Build / Build (push) Successful in 48s

This commit is contained in:
2025-06-13 11:15:48 +02:00
parent 4326794611
commit 6d71de375e
43 changed files with 630 additions and 196 deletions

View File

@@ -40,13 +40,9 @@ public class AuroraVeil : Script
var side = battle.Sides[move.User.BattleData!.SideIndex];
var numberOfTurns = 5;
var dict = new Dictionary<StringKey, object?>
{
{ "duration", numberOfTurns },
};
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.AuroraVeilDuration, dict));
numberOfTurns = (int)dict.GetOrDefault("duration", numberOfTurns)!;
var args = new CustomTriggers.AuroraVeilDurationArgs(move, 5);
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.AuroraVeilDuration, args));
var numberOfTurns = args.Duration;
var script = side.VolatileScripts.StackOrAdd(ScriptUtils.ResolveName<AuroraVeilEffect>(), () =>
{

View File

@@ -13,7 +13,7 @@ public class BellyDrum : Script
return;
}
target.Damage(maxHealthHalved, DamageSource.Misc);
target.Damage(maxHealthHalved, DamageSource.Misc, forceDamage: true);
// Raising the user's Attack by 12 stages should always set it to +6.
target.ChangeStatBoost(Statistic.Attack, 12, true, false);
}

View File

@@ -9,13 +9,11 @@ public class Bind : Script
/// <inheritdoc />
public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
{
var bindTurnsParameters = new Dictionary<StringKey, object?> { { "bind_number_of_turns", 5 } };
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.BindNumberOfTurns, bindTurnsParameters));
var bindDamageParameters = new Dictionary<StringKey, object?> { { "bind_percent_of_max_health", 1f / 8f } };
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.BindPercentOfMaxHealth, bindDamageParameters));
var args = new CustomTriggers.ModifyBindArgs(move);
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyBind, args));
var bindTurns = bindTurnsParameters.GetOrDefault("bind_number_of_turns", 5) as int? ?? 5;
var bindDamage = bindDamageParameters.GetOrDefault("bind_percent_of_max_health", 1f / 8f) as float? ?? 1f / 8f;
var bindTurns = args.Duration;
var bindDamage = args.DamagePercent;
var bindEffect = new BindEffect(target, bindTurns, bindDamage);
target.Volatile.Add(bindEffect);

View File

@@ -7,13 +7,10 @@ public class ChargeMove : Script
{
public override void PreventMove(IExecutingMove move, ref bool prevent)
{
var bypassCharge = false;
var parameters = new Dictionary<StringKey, object?>
{
{ "move", move },
{ "bypassCharge", bypassCharge },
};
move.RunScriptHook(script => script.CustomTrigger(CustomTriggers.BypassChargeMove, parameters));
var args = new CustomTriggers.BypassChargeMoveArgs(move, false);
move.RunScriptHook(script => script.CustomTrigger(CustomTriggers.BypassChargeMove, args));
if (args.Bypass)
return;
var chargeMoveEffect = move.User.Volatile.Get<ChargeMoveEffect>();
if (chargeMoveEffect != null && chargeMoveEffect.MoveName == move.UseMove.Name)

View File

@@ -16,7 +16,7 @@ public class Curse : Script
return;
if (move.User.Types.Contains(ghostType))
{
move.User.Damage(move.User.CurrentHealth / 2, DamageSource.Misc);
move.User.Damage(move.User.CurrentHealth / 2, DamageSource.Misc, forceDamage: true);
if (move.User.CurrentHealth == 0)
return;
target.Volatile.Add(new GhostCurseEffect(target));

View File

@@ -23,21 +23,15 @@ public class Drain : Script
if (move.User.HasHeldItem("big_root"))
healed = (uint)(healed * 1.3f);
var invert = false;
var parameters = new Dictionary<StringKey, object?>
{
{ "user", user },
{ "target", target },
{ "damage", damage },
{ "healed", healed },
{ "invert", invert },
};
target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, parameters));
if (parameters.TryGetValue("invert", out var invertObj) && invertObj is bool invertBool)
invert = invertBool;
var args = new CustomTriggers.ModifyDrainArgs(move, target, hit, damage, healed, invert);
target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, args));
invert = args.Invert;
healed = args.Healed;
if (invert)
{
user.Damage(damage, DamageSource.Misc);
user.Damage(healed, DamageSource.Misc);
}
else
{

View File

@@ -19,22 +19,14 @@ public class DreamEater : Script
if (move.User.HasHeldItem("big_root"))
healed = (uint)(healed * 1.3f);
var invert = false;
var parameters = new Dictionary<StringKey, object?>
{
{ "user", user },
{ "target", target },
{ "damage", damage },
{ "healed", healed },
{ "invert", invert },
};
target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, parameters));
if (parameters.TryGetValue("invert", out var invertObj) && invertObj is bool invertBool)
invert = invertBool;
var args = new CustomTriggers.ModifyDrainArgs(move, target, hit, damage, healed, false);
target.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyDrain, args));
var invert = args.Invert;
healed = args.Healed;
if (invert)
{
user.Damage(damage, DamageSource.Misc);
user.Damage(healed, DamageSource.Misc);
}
else
{

View File

@@ -19,6 +19,10 @@ public class HealPercent : Script
/// <inheritdoc />
public override void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
{
target.Heal((uint)(move.User.BoostedStats.Hp * _healPercent));
var args = new CustomTriggers.ModifyHealPercentArgs(move, target, hit, _healPercent);
move.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ModifyHealPercent, args));
var healPercent = args.HealPercent;
target.Heal(target.BoostedStats.Hp.MultiplyOrMax(healPercent));
}
}

View File

@@ -13,13 +13,9 @@ public class LightScreen : Script
if (battleData == null)
return;
var turns = 5;
var dict = new Dictionary<StringKey, object?>
{
{ "duration", turns },
};
move.RunScriptHook(x => x.CustomTrigger(CustomTriggers.LightScreenNumberOfTurns, dict));
turns = (int)dict.GetOrDefault("duration", turns)!;
var args = new CustomTriggers.LightScreenNumberOfTurnsArgs(move, 5);
move.RunScriptHook(x => x.CustomTrigger(CustomTriggers.LightScreenNumberOfTurns, args));
var turns = args.Duration;
battleData.BattleSide.VolatileScripts.StackOrAdd(ScriptUtils.ResolveName<LightScreenEffect>(),
() => new LightScreenEffect(turns));

View File

@@ -12,12 +12,10 @@ public class Reflect : Script
if (battleData is null)
return;
var numberOfTurns = 5;
var dict = new Dictionary<StringKey, object?>
{
{ "duration", numberOfTurns },
};
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ReflectNumberOfTurns, dict));
numberOfTurns = (int)dict.GetOrDefault("duration", numberOfTurns)!;
var args = new CustomTriggers.ReflectNumberOfTurnsArgs(move, numberOfTurns);
move.User.RunScriptHook(x => x.CustomTrigger(CustomTriggers.ReflectNumberOfTurns, args));
numberOfTurns = args.Duration;
battleData.BattleSide.VolatileScripts.Add(new Side.ReflectEffect(numberOfTurns));
}

View File

@@ -14,14 +14,10 @@ public class Whirlpool : Script
{
var turns = move.Battle.Random.GetInt(4, 6);
var damagePercent = 0.125f;
var parameters = new Dictionary<StringKey, object?>
{
{ "number_of_turns", turns },
{ "damage_percent", damagePercent },
};
move.RunScriptHook(x => x.CustomTrigger(CustomTriggers.Whirlpool, parameters));
turns = parameters.GetValueOrDefault("number_of_turns", turns) as int? ?? turns;
damagePercent = parameters.GetValueOrDefault("damage_percent", damagePercent) as float? ?? damagePercent;
var args = new CustomTriggers.WhirlpoolArgs(move, target, hit, turns, damagePercent);
move.RunScriptHook(x => x.CustomTrigger(CustomTriggers.Whirlpool, args));
turns = args.Turns;
damagePercent = args.DamagePercent;
whirlpoolEffect.AddTargetedPokemon(target, turns, damagePercent);
}
}