using System; using System.Runtime.InteropServices; namespace PkmnLibSharp.Battling.Events { public class BattleEventListener { public delegate void BattleEventDelegate(EventData 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 EventData WrapEventPtr(IntPtr ptr) { var evtType = (EventDataKind)Creaturelib.Generated.EventData.GetKind(ptr); switch (evtType) { case EventDataKind.Damage: return new DamageEvent(evtType, ptr); case EventDataKind.Heal: break; case EventDataKind.Faint: break; case EventDataKind.DisplayText: break; default: break; } Creaturelib.Generated.EventData.Destruct(ptr); throw new NotImplementedException($"Unhandled battle event: '{evtType}'"); } } }