]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Skip routes that are completely covered by the lead route
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index ca3e93d97d6f8b7126c10fa64f3c8aa212b00463..a0f30e92ae43d9a7f2bde2a6a85046245d836dfa 100644 (file)
@@ -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<Route *> &planned_routes = planner->get_routes_for(train);
+
+                       routes.clear();
+                       Route *lead = create_lead_route(0, planned_routes.front());
+                       routes.push_back(lead);
+
+                       list<Route *>::const_iterator begin = planned_routes.begin();
+                       for(; begin!=planned_routes.end(); ++begin)
                        {
-                               const list<Route *> &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)