public SettlementPathNode CreatePathFromNode(SettlementPathNode node, int width, bool extraLength = false, int chosenDirection = -1, int length = -1) { //If no direction is given, choose a null one if (chosenDirection == -1) { List <int> nullDirection = new List <int>(); for (int i = 0; i < 4; i++) { if (node.Connected[i] == null) { nullDirection.Add(i); } } Debug.Log(nullDirection.Count); //Choose a valid direction and find the vector step chosenDirection = GenerationRandom.RandomFromList(nullDirection); } Vec2i step = SettlementPathNode.GetDirection(chosenDirection); //If no length is given or given length is invalid, choose a path length if (length == -1 || !InBounds(node.Position + step * length)) { int attemptLength = length == -1 ? GenerationRandom.RandomInt(40, TileSize) : length; while (!InBounds(node.Position + step * attemptLength)) { attemptLength -= 1; } length = attemptLength; } int halfWidth = width / 2; Vec2i perpDirection = SettlementPathNode.GetPerpendicular(chosenDirection); if (extraLength) { length += halfWidth; } for (int l = 0; l < length; l++) { for (int w = -halfWidth; w <= halfWidth; w++) { Vec2i pos = node.Position + step * l + perpDirection * w; SetTile(pos.x, pos.z, Tile.TEST_BLUE); } } SettlementPathNode endNode = new SettlementPathNode(node.Position + step * length); node.AddConnection(chosenDirection, endNode); endNode.AddConnection(SettlementPathNode.OppositeDirection(chosenDirection), node); return(endNode); }
public void ConnectNodes(SettlementPathNode first, SettlementPathNode second, int width) { Vec2i diff = second.Position - first.Position; //Find the vector between the two nodes int length = diff.x + diff.z; int direction = SettlementPathNode.GetDirection(diff); //first.AddConnection(direction, second); //second.AddConnection(SettlementPathNode.OppositeDirection(direction), first); Vec2i step = SettlementPathNode.GetDirection(direction); Vec2i perpDirection = SettlementPathNode.GetPerpendicular(direction); int halfWidth = width / 2; for (int l = 0; l < length; l++) { for (int w = -halfWidth; w <= halfWidth; w++) { Vec2i pos = first.Position + step * l + perpDirection * w; SetTile(pos.x, pos.z, Tile.TEST_BLUE); } } }