/// <summary> /// Try to move the given loc to a new block. /// </summary> /// <returns>True if the loc has moved, false if there are no routes available.</returns> private bool MoveLoc(FutureAlternativeSet genSet, ILocState loc) { // Get possible routes var currentBlock = state.GetCurrentBlock(loc); var currentBlockEnterSide = state.GetCurrentBlockEnterSide(loc); var locDirection = currentBlockEnterSide.Invert(); var avoidDirectionChanges = (loc.ChangeDirection == ChangeDirection.Avoid); var routeFromFromBlock = state.RailwayState.GetAllPossibleNonClosedRoutesFromBlock(currentBlock); var routeOptions = routeFromFromBlock.Select(x => state.IsAvailableFor(x, loc, locDirection, avoidDirectionChanges, 0)).ToList(); var possibleRoutes = routeOptions.Where(x => x.IsPossible).Select(x => x.Route).ToList(); // If no routes, then return if (!possibleRoutes.Any()) { return(false); } if (possibleRoutes.Count > 1) { // Create alternate generations foreach (var route in possibleRoutes.Skip(1)) { var alternateState = new FutureRouteAvailabilityTester(state); alternateState.TakeRoute(route, loc); genSet.Add(new FutureAlternative(alternateState, generation)); } } // Take the first route var firstRoute = possibleRoutes[0]; state.TakeRoute(firstRoute, loc); return(true); }
/// <summary> /// Default ctor /// </summary> public FutureAlternativeSet(LiveRouteAvailabilityTester live, IRouteState route, ILocState loc) { this.testLoc = loc; minGenerations = live.railwayState.BlockStates.Count; var tester = new FutureRouteAvailabilityTester(live.railwayState); tester.TakeRoute(route, loc); alternatives.Add(new FutureAlternative(tester, 0)); autoLocs = live.railwayState.LocStates.Where(x => x.ControlledAutomatically.Actual && (x.CurrentBlock.Actual != null)).ToList(); }