X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=9f19ffcdfb06ae470447ebeb5f01154845ae49ea;hb=ecd7af790bd3ab7c7e768f68968379e1feea56a9;hp=653cfda6d9f01fc1288722d8f1c6ca33e47634c6;hpb=6a351de12a65e5a005e73bca7e1bba26dbe4288f;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index 653cfda..9f19ffc 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -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()), 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) @@ -546,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; } @@ -630,7 +643,7 @@ void TrainRoutePlanner::RoutingStep::update_estimate() bool TrainRoutePlanner::RoutingStep::is_viable() const { for(vector::const_iterator i=trains.begin(); i!=trains.end(); ++i) - if(i->remaining_estimate<0) + if(!i->is_viable()) return false; for(vector::const_iterator i=trains.begin(); i!=trains.end(); ++i)