X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=a0f30e92ae43d9a7f2bde2a6a85046245d836dfa;hb=7ee0b97b7bea5b1b315d3d7847e15b987b0751f5;hp=ca3e93d97d6f8b7126c10fa64f3c8aa212b00463;hpb=f19d6828989582bc53086ce9d8dc35e52c02dc2a;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index ca3e93d..a0f30e9 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -62,6 +62,7 @@ bool TrainRouter::set_route(const Route *r) routes.clear(); if(lead) routes.push_back(lead); + // TODO Check if eclipsed by lead route if(r) routes.push_back(r); @@ -111,8 +112,9 @@ void TrainRouter::route_changed() { // We are not at the end of the route now, but might have been before. arrival = ON_THE_WAY; - train.stop_at(0); train.refresh_blocks_from(*fncb); + if(!arrival) + train.stop_at(0); } else if(!arrival) { @@ -217,27 +219,39 @@ void TrainRouter::tick(const Time::TimeDelta &dt) delay = Time::zero; } - if(destination_changed) + if(destination_changed && !planner) + start_planning(train.get_layout()); + + if(planner && planner->get_result()!=TrainRoutePlanner::PENDING) { - if(!planner) - start_planning(train.get_layout()); - else if(planner->get_result()!=TrainRoutePlanner::PENDING) + destination_changed = false; + if(planner->get_result()==TrainRoutePlanner::COMPLETE) { - destination_changed = false; - if(planner->get_result()==TrainRoutePlanner::COMPLETE) + const list &planned_routes = planner->get_routes_for(train); + + routes.clear(); + Route *lead = create_lead_route(0, planned_routes.front()); + routes.push_back(lead); + + list::const_iterator begin = planned_routes.begin(); + for(; begin!=planned_routes.end(); ++begin) { - const list &planned_routes = planner->get_routes_for(train); - routes.clear(); - routes.push_back(create_lead_route(0, planned_routes.front())); - routes.insert(routes.end(), planned_routes.begin(), planned_routes.end()); - sequence_points = planner->get_sequence_for(train); - current_sequence = 0; - sequence_check_pending = false; - - route_changed(); + const Route::TrackSet &tracks = (*begin)->get_tracks(); + bool eclipsed = true; + for(Route::TrackSet::const_iterator i=tracks.begin(); (eclipsed && i!=tracks.end()); ++i) + eclipsed = lead->has_track(**i); + if(!eclipsed) + break; } - planner = 0; + routes.insert(routes.end(), begin, planned_routes.end()); + + sequence_points = planner->get_sequence_for(train); + current_sequence = 0; + sequence_check_pending = false; + + route_changed(); } + planner = 0; } if(sequence_check_pending)