+bool Train::go_to(const Zone &to)
+{
+ set<Track *> tracks;
+ for(BlockList::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
+ tracks.insert((*i)->get_tracks().begin(), (*i)->get_tracks().end());
+
+ const Zone::TrackSet &ztracks = to.get_tracks();
+ unsigned union_size = 0;
+ for(Zone::TrackSet::const_iterator i=ztracks.begin(); i!=ztracks.end(); ++i)
+ union_size += tracks.count(*i);
+
+ if(union_size==tracks.size() || union_size==ztracks.size())
+ {
+ signal_arrived.emit();
+ return set_route(0);
+ }
+
+ free_noncritical_blocks();
+
+ TrackIter next = blocks.back().next().track_iter();
+
+ Route *route = Route::find(next, to);
+ if(!route)
+ return false;
+ create_lead_route(route, route);
+ route->add_tracks(ztracks);
+ return set_route(route);
+}
+