PkmnLibSharp/PkmnLibSharp/Battling/Events/BattleEventListener.cs

49 lines
1.6 KiB
C#

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}'");
}
}
}