]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Unify destination and waypoints
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index 266bc6fc3641f4e6a72c069771132cb734f0546b..2d6ab54550284f636a16d52870fee744f196b405 100644 (file)
@@ -16,8 +16,7 @@ TrainRouter::TrainRouter(Train &t):
        TrainAI(t),
        priority(0),
        arrival(ON_THE_WAY),
-       destination(0),
-       destination_changed(false),
+       waypoints_changed(false),
        metrics_stale(false),
        current_sequence(0),
        sequence_check_pending(false)
@@ -47,7 +46,6 @@ bool TrainRouter::set_route(const Route *r)
                create_lead_route();
        }
 
-       destination = 0;
        waypoints.clear();
        sequence_points.clear();
        current_sequence = 0;
@@ -122,15 +120,18 @@ void TrainRouter::route_changed()
 
 void TrainRouter::set_destination(const TrackChain &d)
 {
-       destination = &d;
-       destination_changed = true;
+       if(waypoints.empty())
+               waypoints.push_back(&d);
+       else
+               waypoints.back() = &d;
+       waypoints_changed = true;
        metrics_stale = true;
 }
 
 void TrainRouter::add_waypoint(const TrackChain &wp)
 {
        waypoints.push_back(&wp);
-       destination_changed = true;
+       waypoints_changed = true;
        metrics_stale = true;
 }
 
@@ -144,23 +145,23 @@ const TrackChain &TrainRouter::get_waypoint(unsigned index) const
 
 const TrainRouteMetric &TrainRouter::get_metric(int index) const
 {
-       if(!destination)
+       if(waypoints.empty())
                throw logic_error("no metrics");
        else if(metrics_stale)
                throw logic_error("metrics are stale");
 
        if(index<0)
-               return *metrics.front();
+               return *metrics.back();
        else if(static_cast<unsigned>(index)>=waypoints.size())
                throw out_of_range("TrainRouter::get_metric");
        else
-               return *metrics[index+1];
+               return *metrics[index];
 }
 
 void TrainRouter::set_departure_delay(const Time::TimeDelta &d)
 {
        delay = d;
-       destination_changed = true;
+       waypoints_changed = true;
 }
 
 void TrainRouter::set_trip_duration(const Time::TimeDelta &d)
@@ -213,12 +214,12 @@ void TrainRouter::tick(const Time::TimeDelta &dt)
        else if(duration)
                duration = max(duration-dt, Time::zero);
 
-       if(destination_changed && !planner)
+       if(waypoints_changed && !planner)
                start_planning(train.get_layout());
 
        if(planner && planner->check()!=TrainRoutePlanner::PENDING)
        {
-               destination_changed = false;
+               waypoints_changed = false;
                if(planner->get_result()==TrainRoutePlanner::COMPLETE)
                {
                        const list<Route *> &planned_routes = planner->get_routes_for(train);
@@ -245,8 +246,8 @@ void TrainRouter::tick(const Time::TimeDelta &dt)
 
        if(arrival==RESERVED_TO_END && !train.get_speed())
        {
-               signal_arrived.emit(destination);
-               signal_event.emit(Message("arrived", destination));
+               signal_arrived.emit(waypoints.back());
+               signal_event.emit(Message("arrived", waypoints.back()));
                arrival = ARRIVED;
        }
        else if(arrival==ARRIVED && !train.get_block_allocator().is_active())
@@ -351,7 +352,7 @@ void TrainRouter::train_advanced(Block &block)
 {
        BlockIter b_iter = train.get_block_allocator().iter_for(block);
 
-       if(!waypoints.empty())
+       if(waypoints.size()>1)
        {
                // A waypoint is considered reached when the train has advanced through it.
                const TrackChain &wp = *waypoints.front();
@@ -402,15 +403,14 @@ void TrainRouter::create_metrics()
 
        metrics_stale = false;
 
-       if(!destination)
+       if(waypoints.empty())
                return;
 
-       metrics.push_back(new TrainRouteMetric(*destination));
        for(vector<const TrackChain *>::const_iterator i=waypoints.begin(); i!=waypoints.end(); ++i)
                metrics.push_back(new TrainRouteMetric(**i));
 
-       for(unsigned i=metrics.size(); --i>0; )
-               metrics[i]->chain_to(*metrics[(i+1)%metrics.size()]);
+       for(unsigned i=metrics.size()-1; i-->0; )
+               metrics[i]->chain_to(*metrics[i+1]);
 }
 
 bool TrainRouter::create_lead_route()