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)); }