internal RoadStationInfo EnsureStation(TownNode townNode) { if (this.stations.ContainsKey(townNode.TownId)) { return(this.stations[townNode.TownId]); } var place = RoadStationBuilder.FindPlaceForStation(townNode.Location.Tile); AIRoad.BuildRoadStation(place.tile, place.entryPoint, AIRoad.ROADVEHTYPE_BUS, AIStation.STATION_NEW); AIRoad.BuildRoad(place.tile, place.entryPoint); this.stations.Add(townNode.TownId, place); return(place); }
internal RoadStationInfo EnsureDepot(TownNode townNode) { if (this.depots.ContainsKey(townNode.TownId)) { return(this.depots[townNode.TownId]); } var place = RoadStationBuilder.FindPlaceForStation(townNode.Location.Tile); if (place != null) { AIRoad.BuildRoadDepot(place.tile, place.entryPoint); AIRoad.BuildRoad(place.tile, place.entryPoint); this.depots.Add(townNode.TownId, place); return(place); } else { return(null); } }
internal bool MakeRoute(TownNode fromTown, TownNode toTown) { AILog.Warning($"Building a route from {fromTown.Name} to {toTown.Name}."); RoadStationInfo fromStationTile = stations[fromTown.TownId]; RoadStationInfo toStationTile = stations[toTown.TownId]; Edge <TownNode> foundEdge = null; foreach (var edge in this.Graph.Edges) { if (((edge.Node1 == fromTown) && (edge.Node2 == toTown)) || ((edge.Node2 == fromTown) && (edge.Node1 == toTown))) { foundEdge = edge; } } if (foundEdge == null) { AILog.Warning($"No route found from {fromTown.Name} to {toTown.Name}."); return(false); } var list = new AIEngineList(AIVehicle.VT_ROAD); list.Valuate(AIEngine.GetMaxSpeed); VehicleID vehicleId = null; foreach (var(engineType, _) in list) { if (AICargo.HasCargoClass(AIEngine.GetCargoType(engineType), AICargo.CC_PASSENGERS)) { var price = AIEngine.GetPrice(engineType); CsTestAi.EnsureMoney(price + 1000); vehicleId = AIVehicle.BuildVehicle(depots[fromTown.TownId].tile, engineType); break; } } if (vehicleId == null) { AILog.Error("No passnger vehicle found."); } if (AIVehicle.IsValidVehicle(vehicleId)) { AIOrder.AppendOrder(vehicleId, fromStationTile.tile, AIOrder.OF_NONE); AIOrder.AppendOrder(vehicleId, toStationTile.tile, AIOrder.OF_NONE); AIVehicle.StartStopVehicle(vehicleId); if (!vehicles.ContainsKey(foundEdge)) { vehicles.Add(foundEdge, new List <VehicleID>()); } var vehicleList = vehicles[foundEdge]; vehicleList.Add(vehicleId); AILog.Info($"Route contains now {vehicleList.Count} vehicles."); return(true); } AILog.Error("Invalid vehicle."); return(false); }
public TownNetwork() { List <Graph <TownNode> > graphs = new List <Graph <TownNode> >(); var towns = new AITownList(); foreach (var(town, _) in towns) { graphs.Add(new Graph <TownNode>(new TownNode(town, new Point(AITown.GetLocation(town)), AITown.GetName(town)))); } while (graphs.Count > 1) { //if (graphs.Count % 10 == 0) //{ // AILog.Info($"Count: {graphs.Count}"); //} int graphMin = 100000; Graph <TownNode> graph1 = null; Graph <TownNode> graph2 = null; TownNode bestNode1 = null; TownNode bestNode2 = null; int graph2Index = -1; for (int a = 0; a < graphs.Count; a++) { for (int b = 0; b < graphs.Count; b++) { if (a != b) { TownNode node1 = null; TownNode node2 = null; int dist = graphMin; foreach (var n1 in graphs[a].Nodes) { foreach (var n2 in graphs[b].Nodes) { var nodeDist = n1.GetDistance(n2); if (nodeDist < dist) { dist = nodeDist; node1 = n1; node2 = n2; } } } if (dist < graphMin) { bestNode1 = node1; bestNode2 = node2; graph1 = graphs[a]; graph2 = graphs[b]; graph2Index = b; graphMin = dist; } } } } graph1.Nodes.AddRange(graph2.Nodes); graph1.Edges.AddRange(graph2.Edges); graph1.Edges.Add(new Edge <TownNode>() { Node1 = bestNode1, Node2 = bestNode2 }); graphs.RemoveAt(graph2Index); AILog.Info($"Combine {bestNode1.Name} and {bestNode2.Name} ({graphMin})."); } this.Graph = graphs[0]; foreach (var edge in this.Graph.Edges) { AILog.Info($"- {edge.Node1.Name} <-> {edge.Node2.Name}"); } }