X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrain.cpp;h=ffa436b1d6a0c07795bf876d304077bb08a80fcd;hb=7e27b311e33beda1746eb63e0945633f262427f6;hp=dd7139f864824c7aac2e80b1eea4f8c40691c6ab;hpb=2abb7008a1e2b93b77742693becf6fe0b8567d6e;p=r2c2.git diff --git a/source/libr2c2/train.cpp b/source/libr2c2/train.cpp index dd7139f..ffa436b 100644 --- a/source/libr2c2/train.cpp +++ b/source/libr2c2/train.cpp @@ -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 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())