+ return ((occupied_tracks->path_length-offset)/info->speed)*Time::sec+delay+estimated_wait;
+}
+
+Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_pass(Track &trk) const
+{
+ if(is_occupying(trk))
+ {
+ if(state==ARRIVED && info->has_duration)
+ return duration;
+
+ float passed_length = 0;
+ for(const OccupiedTrack *occ=occupied_tracks; (occ && occ->track!=&trk); occ=occ->next)
+ passed_length += occ->path_length;
+ return (max(info->length-passed_length, 0.0f)/info->speed)*Time::sec+delay;
+ }
+
+ for(unsigned wp=waypoint; wp<info->waypoints.size(); ++wp)
+ {
+ float distance = info->metrics[wp]->get_distance_from(trk);
+ if(distance>=0 && distance<remaining_estimate)
+ return ((remaining_estimate-distance+info->length)/info->speed)*Time::sec+delay;
+ }
+
+ return Time::day;