X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=fc62faaa48ab25d6478e42dc55205cc3f5c92f46;hb=f305e582aef0dceafd3b7b00bf9374bb69bdf8b0;hp=9ba860be29cd765a1ade273779a040e2ccbdcfff;hpb=d578d036656c0e89fe9dca5aefd1f81d2777a69e;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index 9ba860b..fc62faa 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -66,24 +66,49 @@ void TrainRoutePlanner::create_routes(const RoutingStep &goal) { for(vector::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) { - i->route = new Route(i->train->get_layout()); - i->route->set_name("Router"); - i->route->set_temporary(true); + Route *route = new Route(i->train->get_layout()); + route->set_name("Router"); + route->set_temporary(true); + i->routes.push_front(route); + + for(unsigned j=0; j<3; ++j) + i->track_history[j] = 0; } for(const RoutingStep *i=&goal; i; i=i->prev) { for(vector::const_iterator j=i->trains.begin(); j!=i->trains.end(); ++j) { + Track **history = j->info->track_history; + if(j->track.track()==history[0]) + continue; + if(j->state==WAITING || j->state==BLOCKED) j->info->waits.push_front(&*j); - j->info->route->add_track(*j->track); + + Route *route = j->info->routes.front(); + if(route->has_track(*j->track)) + { + route = new Route(j->info->train->get_layout()); + route->set_name("Router"); + route->set_temporary(true); + for(unsigned k=2; k>0; --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]; + history[0] = j->track.track(); } } for(vector::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) { - i->router->set_route(i->route); + for(list::iterator j=i->routes.begin(); j!=i->routes.end(); ++j) + i->router->add_route(**j); const TrainRoutingState *current_wait = 0; for(list::const_iterator j=i->waits.begin(); j!=i->waits.end(); ++j) if(!current_wait || (*j)->track.track()!=current_wait->track.track()) @@ -99,8 +124,7 @@ void TrainRoutePlanner::create_routes(const RoutingStep &goal) TrainRoutePlanner::TrainRoutingInfo::TrainRoutingInfo(Train &t): train(&t), speed(train->get_maximum_speed()), - router(train->get_ai_of_type()), - route(0) + router(train->get_ai_of_type()) { // If no maximum speed is specified, use a sensible default if(!speed) @@ -246,9 +270,7 @@ void TrainRoutePlanner::TrainRoutingState::advance(float distance) --occupied_tracks->n_tracks; } - remaining_estimate -= (distance/info->speed)*Time::sec; - if(remaining_estimaterouter->get_metric(waypoint).get_distance_from(*iter.track(), iter.entry()); distance += track->get_type().get_path_length(path)-offset; - remaining_estimate = (distance/info->speed)*Time::sec+delay; + remaining_estimate = distance; } @@ -434,13 +456,7 @@ void TrainRoutePlanner::RoutingStep::update_estimate() { for(vector::const_iterator i=trains.begin(); i!=trains.end(); ++i) { - if(i->remaining_estimateremaining_estimate; - return; - } - - Time::TimeDelta t = time+i->remaining_estimate; + Time::TimeDelta t = time+(i->remaining_estimate/i->info->speed)*Time::sec+i->delay; if(i==trains.begin() || t>total_estimate) total_estimate = t; } @@ -451,6 +467,10 @@ bool TrainRoutePlanner::RoutingStep::is_viable() const if(total_estimate::const_iterator i=trains.begin(); i!=trains.end(); ++i) + if(i->remaining_estimate<0) + return false; + for(vector::const_iterator i=trains.begin(); i!=trains.end(); ++i) if(i->state==MOVING) return true;