Exemplo n.º 1
0
        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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
        }