using System; using System.Runtime.InteropServices; using Creaturelibbattling; namespace PkmnLibSharp.Battling.Events { public class BattleEventListener { public delegate void BattleEventDelegate(BattleEvent evt); private delegate void BattleEventPtrDelegate(IntPtr ptr); private readonly BattleEventDelegate _del; // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable private readonly BattleEventPtrDelegate _innerDel; internal readonly IntPtr FunctionPtr; public BattleEventListener(BattleEventDelegate del) { _del = del; _innerDel = OnEventPtr; FunctionPtr = Marshal.GetFunctionPointerForDelegate(_innerDel); } private void OnEventPtr(IntPtr ptr) { var wrapped = WrapEventPtr(ptr); _del.Invoke(wrapped); } private static BattleEvent WrapEventPtr(IntPtr ptr) { var evtType = Creaturelibbattling.Generated.EventData.GetKind(ptr); switch (evtType) { case EventDataKind.Damage: return new DamageEvent(ptr); case EventDataKind.Heal: break; case EventDataKind.Faint: break; case EventDataKind.DisplayText: break; } throw new NotImplementedException($"Unhandled battle event: '{evtType}'"); } } }