void SetNodeType(NodeMass mass, Node[,] grid, NodeType newType) { foreach (var node in mass.Mass) { node.Type = newType; if (newType == NodeType.Air) { node.Solid = false; } else if (newType == NodeType.Land) { node.Solid = true; } } }
NodeMass FillNodeType(Queue <Node> q, Node[,] grid, Node first) { NodeType massType = NodeType.Null; if (first.Solid) { massType = NodeType.Floating; } else if (!first.Solid && first.Position.y == 0) { massType = NodeType.WaterCave; } else if (!first.Solid) { massType = NodeType.Cave; } List <Node> massList = new List <Node>(); first.InRegion = true; while (q.Count > 0) { Node C = q.Dequeue(); Node N = GetNeighbourNode(C, grid, Vector2Int.up); Node S = GetNeighbourNode(C, grid, Vector2Int.down); Node E = GetNeighbourNode(C, grid, Vector2Int.right); Node W = GetNeighbourNode(C, grid, Vector2Int.left); if (N && N.Solid == C.Solid && !N.InRegion) { N.Type = C.Type; q.Enqueue(N); N.InRegion = true; massList.Add(N); } if (S && S.Solid == C.Solid && !S.InRegion) { S.Type = C.Type; q.Enqueue(S); S.InRegion = true; massList.Add(S); } if (E && E.Solid == C.Solid && !E.InRegion) { E.Type = C.Type; q.Enqueue(E); E.InRegion = true; massList.Add(E); } if (W && W.Solid == C.Solid && !W.InRegion) { W.Type = C.Type; q.Enqueue(W); W.InRegion = true; massList.Add(W); } if (!N || !S || !E || !W) { if (C.Solid && IsTouchingGround(C)) { massType = NodeType.Land; } else if (!C.Solid && IsTouchingAir(C)) { massType = NodeType.Air; } } } foreach (var node in massList) { if (node != null) { node.Type = massType; } } NodeMass nodeMass = new NodeMass(massList, first.Solid, massType, massList.Count); return(nodeMass); }
NodeType GetMassType(NodeMass mass) { return(mass.Type); }
//Node[,] TrimGrid(Node[,] oldGrid, int amount = 0) //{ // if(amount == 0) // { // amount = (int)(height * (1 - Flatness) + 1); // } // int newHeight = height - amount + 10; // Node[,] newGrid = new Node[width, newHeight]; // for (int x = 0; x < width; x++) // { // for (int y = 0; y < height; y++) // { // if (y < newHeight) // newGrid[x, y] = oldGrid[x, y]; // } // } // height = newHeight; // return newGrid; //} #endregion #region Node regions Node[,] SetNodeTypes(Node[,] grid) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Node node = grid[x, y]; if (node.Type == NodeType.Null) { //Debug.LogFormat("Node to fill {0}", node); Queue <Node> q = new Queue <Node>(); q.Enqueue(node); //Node[,] mass = FillNodeType(q, grid, node); NodeMass mass = FillNodeType(q, grid, node); Masses.Add(mass); //if (GetMassType(mass) == NodeType.Floating) // if (EraseFloatingAndCaves) SetNodeType(mass, grid, NodeType.Air); // else SetNodeType(mass, grid, NodeType.Land); //else if (GetMassType(mass) == NodeType.Cave) // if (EraseFloatingAndCaves) SetNodeType(mass, grid, NodeType.Land); // else SetNodeType(mass, grid, NodeType.Air); } } } List <NodeMass> toDelete = new List <NodeMass>(); foreach (var mass in Masses) { //Debug.Log(mass); if (mass.Solid == true && mass.Type == NodeType.Floating) { if (mass.Size < DeleteMassThreshold) { foreach (var node in mass.Mass) { node.Solid = false; node.Type = NodeType.Air; } toDelete.Add(mass); } else { foreach (var node in mass.Mass) { node.Type = NodeType.Land; } mass.Type = NodeType.Land; } } //if(mass.Solid == false && mass.Type == NodeType.Cave) //{ // foreach (var node in mass.Mass) // { // node.Type = NodeType.Air; // } // mass.Type = NodeType.Air; //} } foreach (var mass in toDelete) { Masses.Remove(mass); } return(null); }