public override MazeGenerationResults Generate()
        {
            if (CurrentIteration++ == 0)
            {
                var mapInitializationResults = InitializeMap();
                var pointFrom = Point.CreateSameAllDimensions(Map.Dimensions, 0);
                var mapRect   = new Rectangle(pointFrom + 1, Map.Size - 1);
                Rectangles.Add(mapRect);
                if (ShowMapInitializationStep)
                {
                    return(mapInitializationResults);
                }
            }

            if (CurrentRectangle == null)
            {
                if (Rectangles.Count != 0)
                {
                    BeginNewRectangle();
                }
                else
                {
                    return(new MazeGenerationResults(GenerationResultsType.GenerationCompleted));
                }
            }

            var results      = new MazeGenerationResults();
            var offset       = Vertical ? new Point(1, 0) : new Point(0, 1);
            var currentPoint = LastPoint + offset;

            if (!CurrentRectangle.Contains(currentPoint))
            {
                var rects = new List <Rectangle>
                {
                    new Rectangle(CurrentRectangle.From, currentPoint)
                };
                Point path;
                Point newRectFrom;
                if (Vertical)
                {
                    newRectFrom = new Point(CurrentRectangle.From[0], LastPoint[1] + 1);
                    var pathCoord = RNG.Next(InitialPoint[0] / 2, LastPoint[0] / 2) * 2 + 1;
                    path = new Point(pathCoord, InitialPoint[1]);
                }
                else
                {
                    newRectFrom = new Point(LastPoint[0] + 1, CurrentRectangle.From[1]);
                    var pathCoord = RNG.Next(InitialPoint[1] / 2, LastPoint[1] / 2) * 2 + 1;
                    path = new Point(InitialPoint[0], pathCoord);
                }

                ChangeCell(results, path, CellState.Empty, CellDisplayState.Path);

                var newRect = new Rectangle(newRectFrom, CurrentRectangle.To);
                rects.Add(newRect);

                var doReverseRecursionOrder = ReverseRecursionOrder > RNG.NextDouble();
                if (doReverseRecursionOrder)
                {
                    rects.Reverse();
                }

                foreach (var rect in rects)
                {
                    if (rect.Size[0] > 2 || rect.Size[1] > 2)
                    {
                        if (ProcessSingleCellBlocks || (rect.Size[0] > 1 && rect.Size[1] > 1))
                        {
                            Rectangles.Add(rect);
                        }
                    }
                }

                CurrentRectangle = null;
            }
            else
            {
                ChangeCell(results, currentPoint, CellState.Filled, CellDisplayState.Wall);
                LastPoint = currentPoint;
            }
            return(results);
        }