private static DashCollision CreateDashCollisionHook(DashCollision orig, DashCollisionHook init = null) { orig ??= DashCollisionDefault; var hooks = new List <DashCollisionHook>(); DashCollision handler = (Player player, Vector2 direction) => { int i = 0; DashCollisionResults Trampoline(DashCollision orig, Player player, Vector2 direction) { if (hooks.Count <= i) { return(orig(player, direction)); } DashCollisionHook current = hooks[i++]; return(Trampoline((Player player, Vector2 direction) => current.Invoke(orig, player, direction), player, direction)); } return(Trampoline(orig, player, direction)); }; DynamicData.For(handler).Add(DASHCOLLISIONHOOK_TAG, hooks); if (init is not null) { hooks.Add(init); } return(handler); }
/// <returns>Handler to be assigned to Platform.OnDashCollide</returns> public static DashCollision ApplyDashCollisionHook(DashCollision orig, DashCollisionHook hook) { if (hook is null) { throw new ArgumentNullException("hook"); } if (orig is not null && DynamicData.For(orig).TryGet(DASHCOLLISIONHOOK_TAG, out List <DashCollisionHook> hooks)) { hooks.Add(hook); return(orig); }