private Frame ResolveAction(Message message, Frame frame = null) { if (frame == null) { frame = new Frame(); } if (frame.IsValid && message != null) { switch (message.Type) { case (GameConstants.MOVEMENT): { var target = Mobiles.WithName(message.Name); var targetLocation = message.To.ToPoint(); var mobileCollisionInfo = Mobiles.CollisionDetection(target, targetLocation); var staticCollisionInfo = Statics.CollisionDetection(target, targetLocation); frame.IsValid = target.IsActive && !(mobileCollisionInfo.Collision || staticCollisionInfo.Collision); if (!frame.IsValid) { return(frame); } foreach (var ciMessage in mobileCollisionInfo.Messages) { ResolveAction(ciMessage, frame); } } break; } frame.FrameData.Add(message); frame.FrameData.AddRange(_gameMessageReactor.Select(r => r(message)).Where(m => m != null)); return(frame); } return(frame); }