+ if(delay)
+ {
+ delay -= dt;
+ if(delay<=Time::zero)
+ delay = Time::zero;
+ }
+
+ if(destination_changed && !planner)
+ start_planning(train.get_layout());
+
+ if(planner && planner->get_result()!=TrainRoutePlanner::PENDING)
+ {
+ destination_changed = false;
+ if(planner->get_result()==TrainRoutePlanner::COMPLETE)
+ {
+ const list<Route *> &planned_routes = planner->get_routes_for(train);
+
+ routes.clear();
+ Route *lead = create_lead_route(0, planned_routes.front());
+ routes.push_back(lead);
+
+ list<Route *>::const_iterator begin = planned_routes.begin();
+ for(; begin!=planned_routes.end(); ++begin)
+ {
+ const Route::TrackSet &tracks = (*begin)->get_tracks();
+ bool eclipsed = true;
+ for(Route::TrackSet::const_iterator i=tracks.begin(); (eclipsed && i!=tracks.end()); ++i)
+ eclipsed = lead->has_track(**i);
+ if(!eclipsed)
+ break;
+ }
+ routes.insert(routes.end(), begin, planned_routes.end());
+
+ sequence_points = planner->get_sequence_for(train);
+ current_sequence = 0;
+ sequence_check_pending = false;
+
+ route_changed();
+ }
+ planner = 0;
+ }
+
+ if(sequence_check_pending)
+ {
+ if(sequence_points.front().is_cleared())
+ train.stop_at(0);
+ sequence_check_pending = false;
+ }