]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Add support for named zones
[r2c2.git] / source / libr2c2 / train.cpp
index dd7139f864824c7aac2e80b1eea4f8c40691c6ab..ffa436b1d6a0c07795bf876d304077bb08a80fcd 100644 (file)
@@ -21,6 +21,7 @@ Distributed under the GPL
 #include "train.h"
 #include "vehicle.h"
 #include "vehicletype.h"
+#include "zone.h"
 
 using namespace std;
 using namespace Msp;
@@ -266,6 +267,35 @@ bool Train::go_to(Track &to)
        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);
+}
+
 bool Train::divert(Track &from)
 {
        if(!from.get_turnout_id())