// Check if we've reached the next route
if(routes.size()>1)
{
- const Route &route = **++routes.begin();
- if(route.has_track(*b_iter.endpoint().track))
+ Track &track = *b_iter.endpoint().track;
+ const Route *route = get_route();
+ bool change_route = false;
+ if(route->is_loop())
+ change_route = (*++routes.begin())->has_track(track);
+ else
+ change_route = !route->has_track(track);
+
+ if(change_route)
{
routes.pop_front();
- const Route *r = get_route();
+ route = get_route();
// XXX Exceptions?
- signal_route_changed.emit(r);
- signal_event.emit(Message("route-changed", r));
+ signal_route_changed.emit(route);
+ signal_event.emit(Message("route-changed", route));
}
}
bool TrainRouter::advance_route(RouteList::iterator &iter, const Block &block)
{
const set<Track *> &tracks = block.get_tracks();
+ unsigned turnout_addr = block.get_turnout_address();
for(; iter!=routes.end(); ++iter)
+ {
+ if(turnout_addr && (*iter)->get_turnout(turnout_addr)<0)
+ continue;
for(set<Track *>::const_iterator j=tracks.begin(); j!=tracks.end(); ++j)
if((*iter)->has_track(**j))
return true;
+ }
return false;
}