// 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));
}
}
lead->set_temporary(true);
}
- set<Track *> tracks;
- for(BlockIter i=train.get_block_allocator().first(); (i && i->get_train()==&train); i=i.next())
+ bool target_reached = false;
+ for(TrackIter i=train.get_block_allocator().first().track_iter(); i; i=i.next())
{
- const set<Track *> &btracks = i->get_tracks();
- for(set<Track *>::const_iterator j=btracks.begin(); j!=btracks.end(); ++j)
- if(!target || !target->has_track(**j))
- tracks.insert(*j);
+ if(i->get_block().get_train()!=&train)
+ break;
+ if(target)
+ {
+ if(target->has_track(*i))
+ target_reached = true;
+ else if(target_reached)
+ break;
+ }
+ lead->add_track(*i);
}
- lead->add_tracks(tracks);
-
return lead;
}
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;
}