]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Don't attempt to use planned route if no waypoints are set
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index 9befe4788c4b03114cfe4939f6ea7c02eee0fe06..122b91a3bd195837f90455cc3da66289d37ea453 100644 (file)
@@ -1,3 +1,4 @@
+#include "driver.h"
 #include "layout.h"
 #include "route.h"
 #include "trackiter.h"
@@ -67,6 +68,8 @@ void TrainRouter::use_planned_route()
 {
        if(!planner || planner->get_result()!=TrainRoutePlanner::COMPLETE)
                return;
+       if(waypoints.empty())
+               return;
 
        const list<Route *> &planned_routes = planner->get_routes_for(train);
 
@@ -118,7 +121,7 @@ void TrainRouter::route_changed()
                if(!sequence_points.empty())
                {
                        const SequencePoint &sp = sequence_points.front();
-                       if(sp.block==fncb.block() && !sp.is_cleared())
+                       if(sp.block==fncb.block() && sp.preceding_train)
                        {
                                arrival = WAITING_FOR_SEQUENCE;
                                sequence_check_pending = true;
@@ -225,24 +228,28 @@ void TrainRouter::message(const Message &msg)
 
 void TrainRouter::tick(const Time::TimeDelta &dt)
 {
-       if(delay)
-       {
-               delay -= dt;
-               if(delay<Time::zero)
-               {
-                       duration = max(duration+delay, Time::zero);
-                       delay = Time::zero;
-               }
-       }
-       else if(duration)
-               duration = max(duration-dt, Time::zero);
-
        if(waypoints_changed && !planner)
                start_planning(train.get_layout());
 
        if(planner && planner->check()!=TrainRoutePlanner::PENDING)
                apply_plan(train.get_layout(), *planner);
 
+       Layout &layout = train.get_layout();
+       if(!layout.get_driver().is_halted() && !layout.get_clock().is_stopped())
+       {
+               if(delay)
+               {
+                       delay -= dt;
+                       if(delay<Time::zero)
+                       {
+                               duration = max(duration+delay, Time::zero);
+                               delay = Time::zero;
+                       }
+               }
+               else if(duration)
+                       duration = max(duration-dt, Time::zero);
+       }
+
        if(sequence_check_pending)
        {
                if(sequence_points.front().is_cleared())
@@ -537,6 +544,9 @@ void TrainRouter::start_planning(Layout &layout)
 
 void TrainRouter::apply_plan(Layout &layout, TrainRoutePlanner &planner)
 {
+       if(planner.get_result()==TrainRoutePlanner::FAILED)
+               layout.emergency(0, "Route planning failed");
+
        vector<TrainRouter *> routers;
        get_routers(layout, routers);