void spawnDoors()
    {
        TilePatternTemplate[,] threeByThreeVertical = new TilePatternTemplate[3, 3] {
            { TilePatternTemplate.Any, TilePatternTemplate.Floor, TilePatternTemplate.Any },
            { TilePatternTemplate.Wall, TilePatternTemplate.Wall, TilePatternTemplate.Wall },
            { TilePatternTemplate.Any, TilePatternTemplate.Floor, TilePatternTemplate.Any }
        };

        TilePatternTemplate[,] threeByThreeHorizontal = new TilePatternTemplate[3, 3] {
            { TilePatternTemplate.Any, TilePatternTemplate.Wall, TilePatternTemplate.Any },
            { TilePatternTemplate.Floor, TilePatternTemplate.Wall, TilePatternTemplate.Floor },
            { TilePatternTemplate.Any, TilePatternTemplate.Wall, TilePatternTemplate.Any }
        };

        //Add Doors to the rooms, where there are two tiles on opposite sides of a 1x3 wall.
        Tile[,] tiles = TileManager.instance.tiles;
        for (int i = 1; i < TileManager.instance.width - 1; i++)
        {
            for (int j = 0; j < TileManager.instance.height - 3; j++)
            {
                if (CheckPattern(threeByThreeVertical, i, j) || CheckPattern(threeByThreeHorizontal, i, j))
                {
                    tiles[i + 1, j + 1].UpdateTile(Tile.TileType.Door);
                }
            }
        }

        //Store the original values of all tiles
        TileManager.instance.SetTiles();
    }
    void RemoveExtraDoors()
    {
        TilePatternTemplate[,] verticalFive = new TilePatternTemplate[1, 5] {
            { TilePatternTemplate.Door,
              TilePatternTemplate.Any,
              TilePatternTemplate.Door,
              TilePatternTemplate.Any,
              TilePatternTemplate.Door }
        };

        TilePatternTemplate[,] horizontalFive = new TilePatternTemplate[5, 1] {
            { TilePatternTemplate.Door },
            { TilePatternTemplate.Any },
            { TilePatternTemplate.Door },
            { TilePatternTemplate.Any },
            { TilePatternTemplate.Door }
        };

        TilePatternTemplate[,] verticalDoubleDoors = new TilePatternTemplate[3, 3]
        {
            { TilePatternTemplate.Floor, TilePatternTemplate.Floor, TilePatternTemplate.Floor },
            { TilePatternTemplate.Door, TilePatternTemplate.Wall, TilePatternTemplate.Door },
            { TilePatternTemplate.Floor, TilePatternTemplate.Floor, TilePatternTemplate.Floor }
        };

        TilePatternTemplate[,] horizontalDoubleDoors = new TilePatternTemplate[3, 3]
        {
            { TilePatternTemplate.Floor, TilePatternTemplate.Door, TilePatternTemplate.Floor },
            { TilePatternTemplate.Floor, TilePatternTemplate.Wall, TilePatternTemplate.Floor },
            { TilePatternTemplate.Floor, TilePatternTemplate.Door, TilePatternTemplate.Floor }
        };

        //Add Doors to the rooms, where there are two tiles on opposite sides of a 1x3 wall.
        Tile[,] tiles = TileManager.instance.tiles;
        for (int rescan = 0; rescan < 10; rescan++)
        {
            for (int i = 0; i < TileManager.instance.width; i++)
            {
                for (int j = 0; j < TileManager.instance.height; j++)
                {
                    List <Tile.TileType> data;
                    if (CheckPattern(verticalFive, i, j))
                    {
                        tiles[i, j + 2].UpdateTile(Tile.TileType.Wall);
                    }
                    else if (CheckPattern(horizontalFive, i, j))
                    {
                        tiles[i + 2, j].UpdateTile(Tile.TileType.Wall);
                    }
                    else if (CheckPattern(verticalDoubleDoors, i, j, out data))
                    {
                        TileManager.instance.tiles[i + 1, j - 1].UpdateTile(Tile.TileType.Wall);
                        TileManager.instance.tiles[i + 1, j].UpdateTile(Tile.TileType.Wall);
                        TileManager.instance.tiles[i + 1, j + 1].UpdateTile(Tile.TileType.Wall);
                    }
                    else if (CheckPattern(horizontalDoubleDoors, i, j))
                    {
                        tiles[i - 1, j + 1].UpdateTile(Tile.TileType.Wall);
                        tiles[i, j + 1].UpdateTile(Tile.TileType.Wall);
                        tiles[i + 1, j + 1].UpdateTile(Tile.TileType.Wall);
                    }
                    else if (tiles[i, j].type == Tile.TileType.Door)
                    {
                        int adjacentWalls = 0;
                        new List <Tile>()
                        {
                            tiles[i - 1, j], tiles[i + 1, j], tiles[i, j - 1], tiles[i, j + 1]
                        }
                        .ForEach(tile => adjacentWalls += (tile.type == Tile.TileType.Wall) ? 1 : 0);
                        if (adjacentWalls > 2)
                        {
                            tiles[i, j].UpdateTile(Tile.TileType.Wall);
                        }
                    }
                }
            }
        }


        //Store the original values of all tiles
        TileManager.instance.SetTiles();

        //Finally, clean up the boids
        foreach (Boid b in FindObjectsOfType <Boid>())
        {
            Destroy(b.gameObject);
        }
    }