public static SolarSystem GetNearestSystem(List <Empire> empireToFind, SolarSystem startSystem) { if (empireToFind.Count == 0) { return(null); } SystemPathNode currentNode = new SystemPathNode(); List <SystemPathNode> nodes = new List <SystemPathNode>(); List <SystemPathNode> closedNodes = new List <SystemPathNode>(); //if (startSystem == null) //{ // if (systemLocation == null) // { // currentNode.system = destinationSystem; // } // else // { // currentNode.system = systemLocation; // } //} //else //{ // currentNode.system = startSystem; //} currentNode.system = startSystem; currentNode.parent = null; currentNode.travelDistanceFromStart = 0; nodes.Add(currentNode); while (!empireToFind.Contains(currentNode.system.GetEmpire())) { foreach (TravelRoute route in currentNode.system.GetTravelRoutes()) { SystemPathNode newNode = new SystemPathNode(); newNode.system = route.GetDestination(currentNode.system); newNode.parent = currentNode; newNode.travelDistanceFromStart = currentNode.travelDistanceFromStart + route.GetDistance(); SystemPathNode inList = nodes.Find(c => c.system == newNode.system); if (inList == null || closedNodes.Exists(c => c.system == newNode.system) == false) { nodes.Add(newNode); } else { if (newNode.travelDistanceFromStart < inList.travelDistanceFromStart) { nodes.Remove(inList); nodes.Add(newNode); } } } nodes.Remove(currentNode); closedNodes.Add(currentNode); nodes.Sort((l, r) => l.travelDistanceFromStart.CompareTo(r.travelDistanceFromStart)); currentNode = nodes[0]; } return(currentNode.system); }
private void CreatePath() { path.Clear(); SystemPathNode currentNode = new SystemPathNode(); List <SystemPathNode> nodes = new List <SystemPathNode>(); List <SystemPathNode> closedNodes = new List <SystemPathNode>(); currentNode.system = systemLocation; currentNode.parent = null; currentNode.travelDistanceFromStart = 0; nodes.Add(currentNode); while (currentNode.system != systemTarget) { foreach (TravelRoute route in currentNode.system.GetTravelRoutes()) { SolarSystem neighbour = route.GetDestination(currentNode.system); if (closedNodes.Exists(c => c.system == neighbour) == false && !route.IsBlocked(currentEmpire)) { if (neighbour == systemTarget || !currentEmpire || !neighbour.GetEmpire() || currentEmpire == neighbour.GetEmpire()) { SystemPathNode newNode = new SystemPathNode(); newNode.system = neighbour; newNode.parent = currentNode; newNode.travelDistanceFromStart = currentNode.travelDistanceFromStart + route.GetDistance(); SystemPathNode inList = nodes.Find(c => c.system == newNode.system); if (inList == null) { nodes.Add(newNode); } else { if (newNode.travelDistanceFromStart < inList.travelDistanceFromStart) { nodes.Remove(inList); nodes.Add(newNode); } } } } } nodes.Remove(currentNode); closedNodes.Add(currentNode); if (nodes.Count == 0) { break; } nodes.Sort((l, r) => l.travelDistanceFromStart.CompareTo(r.travelDistanceFromStart)); currentNode = nodes[0]; } if (currentNode.system != systemTarget) { return; } List <SolarSystem> finalPath = new List <SolarSystem>(); while (currentNode.parent != null) { finalPath.Add(currentNode.system); currentNode = currentNode.parent; } finalPath.Reverse(); foreach (SolarSystem system in finalPath) { path.Enqueue(system); } }