]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouteplanner.cpp
Fix critical block logic
[r2c2.git] / source / libr2c2 / trainrouteplanner.cpp
index 08d787805140610a41af21100c4894ea0870c615..9f19ffcdfb06ae470447ebeb5f01154845ae49ea 100644 (file)
@@ -214,7 +214,7 @@ void TrainRoutePlanner::finalize_plan()
 TrainRoutePlanner::TrainRoutingInfo::TrainRoutingInfo(Train &t):
        train(&t),
        speed(train->get_maximum_speed()),
-       first_noncritical(train->get_first_noncritical_block().block()),
+       first_noncritical(train->get_last_critical_block().next().block()),
        router(train->get_ai_of_type<TrainRouter>()),
        waypoints(router ? router->get_n_waypoints() : 0),
        has_duration(false)
@@ -448,6 +448,15 @@ void TrainRoutePlanner::TrainRoutingState::update_estimate()
        remaining_estimate = distance;
 }
 
+bool TrainRoutePlanner::TrainRoutingState::is_viable() const
+{
+       if(remaining_estimate<0)
+               return false;
+       if(critical && state==BLOCKED)
+               return false;
+       return true;
+}
+
 
 TrainRoutePlanner::RoutingStep::RoutingStep():
        prev(0)
@@ -488,10 +497,9 @@ void TrainRoutePlanner::RoutingStep::create_successors(list<RoutingStep> &new_st
                return;
        }
 
-       TrackIter next_track = train.track.next(train.path);
        train.advance_track(0);
 
-       const TrackType::Endpoint &next_entry_ep = next_track.endpoint();
+       const TrackType::Endpoint &entry_ep = train.track.endpoint();
        if(train.critical)
        {
                train.path = train.track->get_type().coerce_path(train.track.entry(), train.track->get_active_path());
@@ -502,8 +510,8 @@ void TrainRoutePlanner::RoutingStep::create_successors(list<RoutingStep> &new_st
        }
        else
        {
-               for(unsigned i=0; next_entry_ep.paths>>i; ++i)
-                       if(next_entry_ep.has_path(i))
+               for(unsigned i=0; entry_ep.paths>>i; ++i)
+                       if(entry_ep.has_path(i))
                        {
                                train.path = i;
                                train.update_estimate();
@@ -520,7 +528,7 @@ void TrainRoutePlanner::RoutingStep::create_successors(list<RoutingStep> &new_st
                i->update_estimate();
        }
 
-       if(next_entry_ep.paths!=next_track->get_type().get_paths() && !train.critical)
+       if(entry_ep.paths!=train.track->get_type().get_paths() && !train.critical)
        {
                RoutingStep wait(this);
                wait.advance(dt);
@@ -547,7 +555,11 @@ bool TrainRoutePlanner::RoutingStep::update_states()
                {
                        i->blocked_by = get_occupant(*next_track);
                        if(i->blocked_by>=0)
+                       {
+                               if(i->info->first_noncritical->has_track(*next_track))
+                                       i->critical = false;
                                i->state = BLOCKED;
+                       }
                        else if(i->state==BLOCKED)
                                i->state = MOVING;
                }
@@ -631,7 +643,7 @@ void TrainRoutePlanner::RoutingStep::update_estimate()
 bool TrainRoutePlanner::RoutingStep::is_viable() const
 {
        for(vector<TrainRoutingState>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
-               if(i->remaining_estimate<0)
+               if(!i->is_viable())
                        return false;
 
        for(vector<TrainRoutingState>::const_iterator i=trains.begin(); i!=trains.end(); ++i)