Beispiel #1
0
    private void MarkOriginalWaterTiles(ref List <List <GameTile> > waterTilesSeperatedByArea)
    {
        //generates liquid in internal areas of the map that have been destoryed, basically generates liquid in blank spaces within the map
        //hands back a list of these water tiles seperated into their distinct areas
        board.UnMarkAllTiles();
        List <List <GameTile> > FloodFilledAreas        = new List <List <GameTile> >();
        List <GameTile>         FloodFillStartLocations = new List <GameTile>();
        GameTile destroyedTile;
        bool     containsMapEdge = false;

        do
        {
            Vector2 randomPoint = GetNextDestroyedUnMarkedPoint();
            destroyedTile = board.GetGrid()[(int)randomPoint.x][(int)randomPoint.y];
            board.GetGrid()[(int)randomPoint.x][(int)randomPoint.y].SetIsMarked(true);
            board.FloodFillDestroyedTiles(ref destroyedTile, ref FloodFilledAreas, ref containsMapEdge);
            if (!containsMapEdge)
            {
                FloodFillStartLocations.Add(board.GetGrid()[(int)randomPoint.x][(int)randomPoint.y]);
            }
        } while (HasUnmarkedDestroyedTiles());
        FloodFilledAreas.Clear();
        board.UnMarkAllTiles();
        for (int i = 0; i < FloodFillStartLocations.Count; i++)
        {
            destroyedTile = FloodFillStartLocations[i];
            destroyedTile.SetIsMarked(true);
            board.FloodFillDestroyedTiles(ref destroyedTile, ref FloodFilledAreas, ref containsMapEdge);
        }
        waterTilesSeperatedByArea = new List <List <GameTile> >(FloodFilledAreas);
    }
Beispiel #2
0
    private List <GameTile> GetTilesWithinRangeOfWater()
    {
        //return a list of floor tiles that are within 3 tiles of a waters edge, this means these tiles are valid for spawning live grass
        int validRangeFromWater = 3;         //TODO: public facing

        board.UnMarkAllTiles();
        List <GameTile> waterTiles      = new List <GameTile>();
        List <GameTile> edgeWaterTiles  = new List <GameTile>();
        List <GameTile> validFloorTiles = new List <GameTile>();

        for (int x = 0; x < board.GetCols(); x++)
        {
            for (int y = 0; y < board.GetRows(); y++)
            {
                if (board.GetGrid()[x][y].GetObject() != null && board.GetGrid()[x][y].GetObject().GetComponent <WaterTile>() != null)
                {
                    waterTiles.Add(board.GetGrid()[x][y]);
                }
            }
        }
        foreach (GameTile tile in waterTiles)
        {
            List <GameTile> possibleFloorTiles = board.GetTileCardinalNeighbours(tile);
            foreach (GameTile possibleFloortile in possibleFloorTiles)
            {
                if (possibleFloortile.OpenForPlacement())
                {
                    edgeWaterTiles.Add(possibleFloortile);
                }
            }
        }
        foreach (GameTile tile in edgeWaterTiles)
        {
            List <GameTile> possibleValidFloorTiles = board.GetAllTilesInRange(tile, validRangeFromWater);
            foreach (GameTile possibleValidFloorTile in possibleValidFloorTiles)
            {
                if (possibleValidFloorTile.OpenForPlacement())
                {
                    validFloorTiles.Add(possibleValidFloorTile);
                }
            }
        }
        board.UnMarkAllTiles();
        return(validFloorTiles);
    }
Beispiel #3
0
    public void GenerateLiquid(DungeonBoard p_board, ref Transform p_container, Sprite p_waterSprite)
    {
        //driver for water generation
        //use the board and container handed from the main generation settings
        board       = p_board;
        container   = p_container;
        waterSprite = p_waterSprite;
        //
        List <List <GameTile> > waterTilesSeperatedByArea = new List <List <GameTile> >();
        List <GameTile>         edgesOfWaterAreas         = new List <GameTile>();

        MarkOriginalWaterTiles(ref waterTilesSeperatedByArea);
        GenerateGameObjectsForLiquidTiles();
        BreakWallsRandomlyAroundWater(ref waterTilesSeperatedByArea, ref edgesOfWaterAreas);
        ExpandWaterEdges(edgesOfWaterAreas);
        board.UnMarkAllTiles();
    }