protected void FreeSpace(StreetType last) { if (last is StreetSegment) { StreetSegment segment = (StreetSegment)last; int direction = segment.EP1.Connector == currentConnector ? 2 : 1; segment.FreeSpace(direction, size); } else if (last is StreetHub) { StreetHub hub = (StreetHub)last; hub.FreeSpace(size); } else { throw new StreetMapException("Unknown StreetType"); } }
protected bool AdvanceRoute() { StreetType typeCur, typeLast; TimeSpan requiredTime; if (currentConnector.EP1.FindNeighbours().Contains(nextConnector)) { typeCur = currentConnector.EP1.Self; typeLast = currentConnector.EP2.Self; } else { typeCur = currentConnector.EP2.Self; typeLast = currentConnector.EP1.Self; } if (typeCur is StreetSegment) { StreetSegment segment = (StreetSegment)typeCur; if (!claimedSpace) { int direction = segment.EP1.Connector == currentConnector ? 1 : 2; if (!segment.ClaimSpace(direction, size)) { timeBonus = TimeSpan.Zero; return(false); } if (isFirstClaim) { isFirstClaim = false; } else { FreeSpace(typeLast); } claimedSpace = true; } requiredTime = maxSpeed < segment.SpeedLimit ? TimeSpan.FromSeconds(segment.Length / maxSpeed) : segment.MinDriveTime; if (requiredTime.CompareTo(timeBonus) > 0) { return(false); } timeBonus = timeBonus.Subtract(requiredTime); lastConnector = currentConnector; currentConnector = nextConnector; nextConnector = null; claimedSpace = false; ReportManager.PrintDebug(this + " advanced to " + currentConnector + " over " + segment + "."); return(true); } else if (typeCur is StreetHub) { StreetHub hub = (StreetHub)typeCur; bool isGreen; hub.IsGreenList.TryGetValue(currentConnector.ID, out isGreen); if (!isGreen) { timeBonus = TimeSpan.Zero; return(false); } if (!claimedSpace) { if (!hub.ClaimSpace(size)) { timeBonus = TimeSpan.Zero; return(false); } if (isFirstClaim) { isFirstClaim = false; } else { FreeSpace(typeLast); } claimedSpace = true; } double speed = maxSpeed < hub.SpeedLimit ? maxSpeed : hub.SpeedLimit; requiredTime = TimeSpan.FromSeconds(Coordinate.GetDistance(currentConnector.Coordinate, nextConnector.Coordinate) / speed); if (requiredTime.CompareTo(timeBonus) > 0) { return(false); } timeBonus = timeBonus.Subtract(requiredTime); lastConnector = currentConnector; currentConnector = nextConnector; nextConnector = null; claimedSpace = false; ReportManager.PrintDebug(this + " advanced to " + currentConnector + " over " + hub + "."); return(true); } else { throw new StreetMapException("Unknown StreetType"); } }