iter = iter.next();
}
+ travel_multiplier = info->metrics[waypoint]->get_travel_multiplier(*track, track.reverse(path).entry());
+
update_estimate();
}
delay(other.delay),
duration(other.duration),
waypoint(other.waypoint),
+ travel_multiplier(other.travel_multiplier),
distance_traveled(other.distance_traveled),
remaining_estimate(other.remaining_estimate),
wait_time(other.wait_time),
Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_next_track() const
{
- return ((track->get_type().get_path_length(path)-offset)/info->speed)*Time::sec+delay;
+ return ((occupied_tracks->path_length-offset)/info->speed)*Time::sec+delay;
}
Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_pass(Track &trk) const
occupied_tracks->n_tracks -= count_to_free;
}
- distance_traveled += distance;
- remaining_estimate -= distance;
+ distance_traveled += distance*travel_multiplier;
+ remaining_estimate -= distance*travel_multiplier;
}
void TrainRoutePlanner::TrainRoutingState::advance(const Time::TimeDelta &dt)
void TrainRoutePlanner::TrainRoutingState::advance_track(unsigned next_path)
{
float distance = occupied_tracks->path_length-offset;
+
track = track.next(path);
path = next_path;
occupied_tracks = new OccupiedTrack(*track, path, occupied_tracks);
+
advance(distance);
offset = 0;
+ travel_multiplier = info->metrics[waypoint]->get_travel_multiplier(*track, track.reverse(path).entry());
+}
+
+void TrainRoutePlanner::TrainRoutingState::set_path(unsigned p)
+{
+ path = p;
+ OccupiedTrack *next_occ = occupied_tracks->next;
+ if(!--occupied_tracks->refcount)
+ delete occupied_tracks;
+ occupied_tracks = new OccupiedTrack(*track, path, next_occ);
+ update_estimate();
}
void TrainRoutePlanner::TrainRoutingState::update_estimate()
{
TrackIter iter = track.reverse(path);
- remaining_estimate = info->metrics[waypoint]->get_distance_from(*iter.track(), iter.entry());
+ const TrainRouteMetric *metric = info->metrics[waypoint];
+ remaining_estimate = metric->get_distance_from(*iter, iter.entry());
+ travel_multiplier = metric->get_travel_multiplier(*iter, iter.entry());
if(remaining_estimate>=0)
- remaining_estimate += track->get_type().get_path_length(path)-offset;
+ remaining_estimate += (occupied_tracks->path_length-offset)*travel_multiplier;
}
bool TrainRoutePlanner::TrainRoutingState::is_viable() const
{
TrainRoutingState &train = next.trains[train_index];
- train.path = path;
- train.update_estimate();
+ train.set_path(path);
next.update_estimate();
if(next.is_viable())
new_steps.push_back(next);