PkmnLibSharp/PkmnLibSharp/Battling/Library/AngelScriptResolver.cs

87 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Pkmnlib;
using PkmnLibSharp.Library.Items;
using PkmnLibSharp.Utilities;
namespace PkmnLibSharp.Battling
{
public class AngelScriptResolver : ScriptResolver
{
private readonly Dictionary<string, EvolutionScript?> _evolutionScriptCache =
new Dictionary<string, EvolutionScript?>();
public AngelScriptResolver() : base(Pkmnlib.Generated.AngelScriptResolver.Construct())
{
}
internal AngelScriptResolver(IntPtr ptr) : base(ptr)
{
}
public void Initialize(BattleLibrary library)
{
Pkmnlib.Generated.AngelScriptResolver.Initialize(Ptr, library.Ptr).Assert();
}
public void CreateScript(string name, string script)
{
Pkmnlib.Generated.AngelScriptResolver.CreateScript(Ptr, name.ToPtr(), script.ToPtr()).Assert();
}
public Script LoadScript(PointerWrapper owner, ScriptCategory category, string name)
{
var ptr = IntPtr.Zero;
Pkmnlib.Generated.AngelScriptResolver
.LoadScript(ref ptr, Ptr, owner.Ptr, (Pkmnlib.ScriptCategory)category, name.ToPtr()).Assert();
return new AngelscriptScript(ptr);
}
public EvolutionScript? LoadEvolutionScript(string name)
{
if (_evolutionScriptCache.TryGetValue(name, out var s))
{
return s;
}
var ptr = IntPtr.Zero;
Pkmnlib.Generated.AngelScriptResolver.LoadEvolutionScript(ref ptr, Ptr, name.ToPtr()).Assert();
if (ptr == IntPtr.Zero)
{
_evolutionScriptCache.Add(name, null);
return null;
}
s = new EvolutionScript(ptr);
_evolutionScriptCache.Add(name, s);
return s;
}
public void LoadByteCodeFromMemory(byte[] data)
{
var pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned);
var pointer = pinnedArray.AddrOfPinnedObject();
Pkmnlib.Generated.AngelScriptResolver.LoadByteCodeFromMemory(Ptr, pointer, (ulong)data.Length).Assert();
pinnedArray.Free();
}
public unsafe delegate void* GlobalMethod(void* parameter);
public void RegisterGlobalMethod(string methodName, GlobalMethod method)
{
var methodPtr = Marshal.GetFunctionPointerForDelegate(method);
Pkmnlib.Generated.AngelScriptResolver.RegisterGlobalMethod(Ptr, methodName.ToPtr(), methodPtr).Assert();
}
public void FinalizeModule()
{
Pkmnlib.Generated.AngelScriptResolver.FinalizeModule(Ptr).Assert();
}
protected override void DeletePtr()
{
Pkmnlib.Generated.AngelScriptResolver.Destruct(Ptr).Assert();
}
}
}