]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouteplanner.cpp
Avoid negative values of wait_time
[r2c2.git] / source / libr2c2 / trainrouteplanner.cpp
index 95b981cb2e7965f650034f773361ef2920107aa8..476d102617ff1045658d80391f73cf1f4ccedfee 100644 (file)
@@ -308,6 +308,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(TrainRoutingInfo &inf):
        delay(info->router->get_departure_delay()),
        duration(info->router->get_trip_duration()),
        waypoint(0),
+       distance_traveled(0),
        blocked_by(-1)
 {
        const Vehicle *veh = &info->train->get_vehicle(0);
@@ -492,15 +493,16 @@ void TrainRoutePlanner::TrainRoutingState::advance(const Time::TimeDelta &dt)
        if(estimated_wait)
                estimated_wait = max(estimated_wait-secs*Time::sec, Time::zero);
 
-       if(state==MOVING)
+       float distance = info->speed*secs;
+       float remaining_on_track = occupied_tracks->path_length-offset;
+       if(state==MOVING || distance<remaining_on_track)
                advance(info->speed*secs);
        else if(state!=ARRIVED)
        {
-               float remaining_distance = occupied_tracks->path_length-offset;
-               if(remaining_distance>0)
+               if(remaining_on_track>0)
                {
-                       advance(remaining_distance);
-                       wait_time += (secs-remaining_distance/info->speed)*Time::sec;
+                       advance(remaining_on_track);
+                       wait_time += (secs-remaining_on_track/info->speed)*Time::sec;
                }
                else
                        wait_time += secs*Time::sec;
@@ -569,7 +571,7 @@ void TrainRoutePlanner::RoutingStep::create_successors(list<RoutingStep> &new_st
        if(next.update_states() && next.check_deadlocks())
                return;
 
-       int train_index = find_next_train();
+       int train_index = next.find_next_train();
        if(train_index<0)
                return;
 
@@ -726,10 +728,13 @@ int TrainRoutePlanner::RoutingStep::get_occupant(Track &track) const
 
 int TrainRoutePlanner::RoutingStep::find_next_train() const
 {
+       /* Pick a moving train with the lowest time to next track.  A train that
+       just became blocked can still travel until the end of its current track,
+       so consider those too. */
        Time::TimeDelta min_dt;
        int next_train = -1;
        for(unsigned i=0; i<trains.size(); ++i)
-               if(trains[i].state==MOVING)
+               if(trains[i].state==MOVING || (trains[i].state==BLOCKED && prev && prev->trains[i].state==MOVING))
                {
                        Time::TimeDelta dt = trains[i].get_time_to_next_track();
                        if(dt<min_dt || next_train<0)