PkmnLib.NET/PkmnLib.Dynamic/ScriptHandling/ScriptExecution.cs

70 lines
2.1 KiB
C#
Raw Normal View History

using System.Runtime.CompilerServices;
2025-01-26 10:55:13 +00:00
using PkmnLib.Dynamic.Models;
using PkmnLib.Static;
2024-07-27 14:53:06 +00:00
namespace PkmnLib.Dynamic.ScriptHandling;
2024-07-28 10:52:17 +00:00
/// <summary>
/// Helper functions for script execution.
/// </summary>
2024-07-27 14:53:06 +00:00
public static class ScriptExecution
{
2024-07-28 10:52:17 +00:00
/// <summary>
/// Executes a hook on all scripts in a source.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2024-07-27 14:53:06 +00:00
public static void RunScriptHook(this IScriptSource source, Action<Script> hook)
{
var iterator = source.GetScripts();
foreach (var container in iterator)
{
if (container.IsEmpty)
continue;
var script = container.Script;
if (script.IsSuppressed)
continue;
2024-07-27 14:53:06 +00:00
hook(script);
}
}
2024-08-10 09:18:10 +00:00
/// <summary>
/// Executes a hook on all scripts in a list of sources. Note that this does not walk through the parents of the
/// sources, but only the sources themselves.
/// </summary>
public static void RunScriptHook(this IReadOnlyList<IEnumerable<ScriptContainer>> source, Action<Script> hook)
{
foreach (var container in source.SelectMany(x => x))
{
if (container.IsEmpty)
continue;
var script = container.Script;
if (script.IsSuppressed)
continue;
hook(script);
}
}
2025-01-26 10:55:13 +00:00
public static void RunItemScript(this IItem item, ScriptResolver scriptResolver, IPokemon? target)
{
if (!scriptResolver.TryResolveBattleItemScript(item, out var itemScript))
{
return;
}
if (!itemScript.IsItemUsable)
return;
itemScript.OnInitialize(item.BattleEffect!.Parameters);
var requiresTarget = itemScript.RequiresTarget;
if (requiresTarget)
{
if (target == null)
throw new ArgumentNullException(nameof(target), "Item script requires a target.");
itemScript.OnUseWithTarget(target);
}
else
{
itemScript.OnUse();
}
}
2024-07-27 14:53:06 +00:00
}