PkmnLibSharp/PkmnLibSharp/Battling/Events/BattleEventListener.cs

49 lines
1.6 KiB
C#
Raw Normal View History

2020-07-26 12:47:56 +00:00
using System;
using System.Runtime.InteropServices;
namespace PkmnLibSharp.Battling.Events
{
public class BattleEventListener
{
2020-08-04 15:32:20 +00:00
public delegate void BattleEventDelegate(EventData evt);
2020-07-26 12:47:56 +00:00
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);
}
2020-08-04 15:32:20 +00:00
private static EventData WrapEventPtr(IntPtr ptr)
2020-07-26 12:47:56 +00:00
{
2020-08-04 15:32:20 +00:00
var evtType = (EventDataKind)Creaturelib.Generated.EventData.GetKind(ptr);
2020-07-26 12:47:56 +00:00
switch (evtType)
{
case EventDataKind.Damage:
2020-08-04 15:32:20 +00:00
return new DamageEvent(evtType, ptr);
2020-07-26 12:47:56 +00:00
case EventDataKind.Heal:
break;
case EventDataKind.Faint:
break;
case EventDataKind.DisplayText:
break;
2020-08-04 15:32:20 +00:00
default:
break;
2020-07-26 12:47:56 +00:00
}
2020-08-04 15:32:20 +00:00
Creaturelib.Generated.EventData.Destruct(ptr);
2020-07-26 12:47:56 +00:00
throw new NotImplementedException($"Unhandled battle event: '{evtType}'");
}
}
}