public virtual NavigationData GetNavigationData(Position startPosition, Position targetPosition) { if (!_grid.IsWalkable(targetPosition)) { return(null); } var navigationData = new NavigationData { Destination = targetPosition, RemainingStepsInCurrentSegment = new Stack <Position>(), LastStep = startPosition }; if (startPosition == targetPosition) { return(navigationData); } IList <Position> line = _rasterLineCreator.GetRasterLinePermissive(startPosition.x, startPosition.y, targetPosition.x, targetPosition.y, _grid.IsWalkable); bool rasterLineReachesTarget = line.Last() == targetPosition; if (rasterLineReachesTarget) { _debugPathPresenter.PresentStraight(line); // performance: if GetRasterLinePermissive returned a stack, we wouldn't need to allocate memory for the list navigationData.RemainingNodes = new[] { targetPosition }.ToList(); return(navigationData); } PathfindingResponse result = _pathfinder.FindJumpPointsWithJps(startPosition, targetPosition); if (result.Result != PathfindingResult.Success) { return(null); } IEnumerable <Position> naturalJumpPoints = _naturalLineCreator.GetNaturalJumpPoints(result.Positions).Skip(1); navigationData.RemainingNodes = naturalJumpPoints.ToList(); _debugPathPresenter.PresentNonStraight(navigationData.RemainingNodes); return(navigationData); }