private void AddRoadsFromTemplateToMap(ObjectTemplate template, Map map, MapInfo info, string roadType) { var tileGraph = new TileGraph(info.Tiles, TileInfo.Free); var roads = template.Objects.Where(o => o.RoadOptions != RoadOptions.None && o.Type == ObjectTemplate.RoadTemplate).ToArray(); int count = info.Roads.Nodes.Count; ScriptObject road1, road2; for (int i = 0; i < roads.Length; i += 2) { road1 = roads[i]; road2 = roads[i + 1]; var start = info.Roads.FindNode(new Point(road1.X, road1.Y)); if (start == null) { start = new RoadGraphNode(new Point(road1.X, road1.Y), !road1.RoadOptions.HasFlag(RoadOptions.Join) && roads.Count(r2 => road1.X == r2.X && road1.Y == r2.Y) == 1, true); info.Roads.Nodes.AddLast(start); } var end = info.Roads.FindNode(new Point(road2.X, road2.Y)); if (end == null) { end = new RoadGraphNode(new Point(road2.X, road2.Y), !road2.RoadOptions.HasFlag(RoadOptions.Join) && roads.Count(r2 => road2.X == r2.X && road2.Y == r2.Y) == 1, true); info.Roads.Nodes.AddLast(end); } start.LinkTo(end); road1.Type = roadType; road2.Type = roadType; info.Roads.Segments.Add(new Tuple <ScriptObject, ScriptObject>(road1, road2)); tileGraph.UpdateTiles(new[] { map.PositionToCoordinates(start.Position), map.PositionToCoordinates(end.Position) }, TileInfo.Road); } IEnumerable <RoadGraphNode> nodes = info.Roads.Nodes.Skip(count).ToArray(); var endpoints = from r in nodes where !r.CanBeConnected && r.Neighbors.Count == 1 select r; foreach (var endpoint in endpoints) { foreach (var node in nodes) { if (node != endpoint && (node.Position - endpoint.Position).VectorLengthSquared() < endpointConnectionRange * endpointConnectionRange) { endpoint.LinkTo(node); } } } }
private bool TryAddEdge(RoadGraphEdge edge, IEnumerable <Point> positions) { var tiles = tileGraph.GetTiles(map, positions); if (tiles != null) // path possible { info.Roads.AddRoad(positions, map, info.ObjectFactory, info.Settings.Scenery.Road); tileGraph.UpdateTiles(tiles, TileInfo.Road, 2); return(true); } return(false); }