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