private static WallData[] FindRoom(
            WallUseCounter wallCounter,
            bool useReversedWall,
            PointWallsMap pointWallsMap,
            ref WallUseCounter[] path,
            int depth = 0)
        {
            var indent = new string (' ', depth * 2);

//            Debug.Log ($"{indent}Wall {wallCounter}");
            Assert.IsTrue(depth < 10);

            if (path != null && path.Length > 0 && wallCounter == path[0])
            {
                Array.ForEach(path, x => x.Counter++);
                var room = path.Select(x => x.Wall).ToArray();
//                Debug.Log ($"{indent}Room found {RoomToString (room)}");
                return(room);
            }

            var wall = wallCounter.Wall;

            if (useReversedWall)
            {
                wall = wall.Reverse();
            }

            var end = wall
                      .Points
                      .Last();

            var wallVector   = wall.GetInverseVector();
            var allNextWalls = pointWallsMap[end];
            var nextWalls    = allNextWalls
                               .Where(
                x => x != wallCounter && !x.Deadlock && x.Counter < 2)
                               .Select(x => GetNextWallData(wall, wallVector, x))
                               .OrderBy(x => x.Item3)
                               .ToList();

            path = AppendToArray(path, wallCounter);
            foreach (var nextWall in nextWalls)
            {
                var room = FindRoom(
                    nextWall.Item1,
                    nextWall.Item2,
                    pointWallsMap,
                    ref path,
                    depth + 1);

                if (room != null)
                {
                    return(room);
                }
            }

//            Debug.Log ($"{indent}Wall {wallCounter.Wall} deadlocked");
            wallCounter.Deadlock = true;
            return(null);
        }
        private static Tuple <WallUseCounter, bool, float> GetNextWallData(
            WallData wall,
            Vector2 wallVector,
            WallUseCounter anotherWallUseCounter)
        {
            var anotherWall     = anotherWallUseCounter.Wall;
            var useReversedWall = wall.End != anotherWall.Start;

            if (useReversedWall)
            {
                anotherWall = anotherWall.Reverse();
            }

            var wallAngle = wallVector.GetWallAngle(anotherWall);

            return(new Tuple <WallUseCounter, bool, float> (
                       anotherWallUseCounter,
                       useReversedWall,
                       wallAngle));
        }