]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouteplanner.cpp
Unoccupy destination during planning when the train has departed again
[r2c2.git] / source / libr2c2 / trainrouteplanner.cpp
index b4f01ab6a860084901add49d3ab21de3405d49d0..99700699c452a21a81ef51bdad8dd25b5cab8e5e 100644 (file)
@@ -133,7 +133,7 @@ void TrainRoutePlanner::finalize_plan()
        {
                i->routes.clear();
                i->sequence.clear();
-               for(unsigned j=0; j<3; ++j)
+               for(unsigned j=0; j<2; ++j)
                        i->track_history[j] = 0;
        }
 
@@ -168,16 +168,13 @@ void TrainRoutePlanner::finalize_plan()
                                route = new Route(j->info->train->get_layout());
                                route->set_name("Router");
                                route->set_temporary(true);
-                               for(unsigned k=2; k>0; --k)
-                                       if(history[k])
-                                               route->add_track(*history[k]);
+                               for(unsigned k=0; (k<2 && history[k]); ++k)
+                                       route->add_track(*history[k]);
                                j->info->routes.push_front(route);
                        }
 
-                       if(history[0])
-                               route->add_track(*history[0]);
-                       for(unsigned k=2; k>0; --k)
-                               history[k] = history[k-1];
+                       route->add_track(*j->track.track());
+                       history[1] = history[0];
                        history[0] = j->track.track();
 
                        bool waitable = j->track.endpoint().paths!=j->track->get_type().get_paths();
@@ -251,6 +248,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(TrainRoutingInfo &inf):
        occupied_tracks(0),
        state(MOVING),
        delay(info->router->get_departure_delay()),
+       duration(info->router->get_trip_duration()),
        waypoint(info->router->get_n_waypoints() ? 0 : -1),
        blocked_by(-1)
 {
@@ -287,6 +285,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(const TrainRoutingState
        back_offset(other.back_offset),
        state(other.state),
        delay(other.delay),
+       duration(other.duration),
        waypoint(other.waypoint),
        distance_traveled(other.distance_traveled),
        remaining_estimate(other.remaining_estimate),
@@ -309,6 +308,9 @@ Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_next_track() c
 
 bool TrainRoutePlanner::TrainRoutingState::is_occupying(Track &trk) const
 {
+       if(state==ARRIVED && !duration && info->router->get_trip_duration())
+               return false;
+
        OccupiedTrack *occ = occupied_tracks;
        for(unsigned n=occ->n_tracks; n>0; --n, occ=occ->next)
                if(occ->track==&trk)
@@ -376,6 +378,9 @@ void TrainRoutePlanner::TrainRoutingState::advance(const Time::TimeDelta &dt)
                delay = Time::zero;
        }
 
+       if(duration)
+               duration = max(duration-secs*Time::sec, Time::zero);
+
        if(state==MOVING)
                advance(info->speed*secs);
        else if(state!=ARRIVED)