-bool Train::set_route(const Route *r)
-{
- free_noncritical_blocks();
-
- Route *lead = 0;
- if(r && !blocks.empty())
- {
- TrackIter first = blocks.front().track_iter();
- TrackIter next = blocks.back().next().track_iter();
- if(!r->has_track(*next))
- {
- lead = Route::find(next, *r);
- if(!lead)
- return false;
- create_lead_route(lead, lead);
- routes.push_front(lead);
- }
- else if(!r->has_track(*first))
- lead = create_lead_route(0, r);
- }
-
- routes.clear();
- if(lead)
- routes.push_back(lead);
- if(r)
- routes.push_back(r);
- end_of_route = false;
-
- reserve_more();
-
- signal_route_changed.emit(get_route());
-
- return true;
-}
-
-bool Train::go_to(Track &to)
-{
- for(BlockList::const_iterator i=blocks.begin(); i!=cur_blocks_end; ++i)
- if((*i)->has_track(to))
- {
- 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);
- return set_route(route);
-}
-
-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);
-}
-
-const Route *Train::get_route() const
-{
- if(routes.empty())
- return 0;
- return routes.front();
-}
-
-void Train::place(Block &block, unsigned entry)