X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=9f19ffcdfb06ae470447ebeb5f01154845ae49ea;hb=ecd7af790bd3ab7c7e768f68968379e1feea56a9;hp=08d787805140610a41af21100c4894ea0870c615;hpb=100c7f252e145f095205c55a178ab57bb8da7e75;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index 08d7878..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) @@ -488,10 +497,9 @@ void TrainRoutePlanner::RoutingStep::create_successors(list &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 &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 &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::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)