]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Be stricter with const qualifiers
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index b2993ee74ba47d0620234719016ff465f06b7aeb..b388bb2be9bc1a1062f49ce6d41f7b3e8ee86382 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>());
 }
@@ -143,8 +165,8 @@ void TrainRouter::tick(const Time::TimeDelta &dt)
 
        if(arriving==1 && !train.get_speed())
        {
-               signal_arrived.emit();
-               signal_event.emit(Message("arrived"));
+               signal_arrived.emit(destination);
+               signal_event.emit(Message("arrived", destination));
                arriving = 2;
        }
        else if(arriving==2 && !train.get_block_allocator().is_active())
@@ -215,8 +237,31 @@ void TrainRouter::train_advanced(Block &block)
                if(route.has_track(*b_iter.endpoint().track))
                {
                        routes.pop_front();
+                       const Route *r = get_route();
                        // XXX Exceptions?
-                       signal_event.emit(Message("route-changed", get_route()));
+                       signal_route_changed.emit(r);
+                       signal_event.emit(Message("route-changed", r));
+               }
+       }
+
+       if(!waypoints.empty())
+       {
+               const TrackChain &wp = *waypoints.front();
+               TrackIter t_iter = b_iter.track_iter();
+               if(wp.has_track(*t_iter))
+               {
+                       for(; t_iter; t_iter=t_iter.next())
+                       {
+                               if(!wp.has_track(*t_iter))
+                               {
+                                       waypoints.erase(waypoints.begin());
+                                       signal_waypoint_reached.emit(&wp);
+                                       signal_event.emit(Message("waypoint-reached", &wp));
+                                       break;
+                               }
+                               else if(!block.has_track(*t_iter))
+                                       break;
+                       }
                }
        }