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 _evolutionScriptCache = new Dictionary(); 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(); } } }