]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Support routing through multiple waypoints
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index b2993ee74ba47d0620234719016ff465f06b7aeb..da3b7d515fe253b79db3412ea0e98d2bd062d6ea 100644 (file)
@@ -61,6 +61,7 @@ bool TrainRouter::set_route(const Route *r)
        if(!r)
        {
                destination = 0;
+               waypoints.clear();
        }
 
        train.refresh_blocks_from(*fncb);
@@ -101,6 +102,20 @@ bool TrainRouter::is_destination(Track &track) const
                return false;
 }
 
+void TrainRouter::add_waypoint(const TrackChain &wp)
+{
+       waypoints.push_back(&wp);
+       update_pending = true;
+}
+
+bool TrainRouter::is_waypoint(unsigned index, Track &track) const
+{
+       if(index>=waypoints.size())
+               throw out_of_range("TrainRouter::is_waypoint");
+
+       return waypoints[index]->has_track(track);
+}
+
 void TrainRouter::set_departure_delay(const Time::TimeDelta &d)
 {
        delay = d;
@@ -125,6 +140,13 @@ void TrainRouter::message(const Message &msg)
                else
                        set_destination(*msg.value.value<const TrackChain *>());
        }
+       else if(msg.type=="add-waypoint")
+       {
+               if(msg.value.check_type<TrackChain *>())
+                       add_waypoint(*msg.value.value<TrackChain *>());
+               else
+                       add_waypoint(*msg.value.value<const TrackChain *>());
+       }
        else if(msg.type=="set-departure-delay")
                set_departure_delay(msg.value.value<Time::TimeDelta>());
 }