X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=99700699c452a21a81ef51bdad8dd25b5cab8e5e;hb=e8d2abb48b5236cc3455a035628292ae7908240e;hp=b4f01ab6a860084901add49d3ab21de3405d49d0;hpb=bf321305d7bf65aa5033a835f61370cd48f54619;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index b4f01ab..9970069 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -133,7 +133,7 @@ void TrainRoutePlanner::finalize_plan() { i->routes.clear(); i->sequence.clear(); - for(unsigned j=0; j<3; ++j) + for(unsigned j=0; j<2; ++j) i->track_history[j] = 0; } @@ -168,16 +168,13 @@ void TrainRoutePlanner::finalize_plan() route = new Route(j->info->train->get_layout()); route->set_name("Router"); route->set_temporary(true); - for(unsigned k=2; k>0; --k) - if(history[k]) - route->add_track(*history[k]); + for(unsigned k=0; (k<2 && history[k]); ++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]; + route->add_track(*j->track.track()); + history[1] = history[0]; history[0] = j->track.track(); bool waitable = j->track.endpoint().paths!=j->track->get_type().get_paths(); @@ -251,6 +248,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(TrainRoutingInfo &inf): occupied_tracks(0), state(MOVING), delay(info->router->get_departure_delay()), + duration(info->router->get_trip_duration()), waypoint(info->router->get_n_waypoints() ? 0 : -1), blocked_by(-1) { @@ -287,6 +285,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(const TrainRoutingState back_offset(other.back_offset), state(other.state), delay(other.delay), + duration(other.duration), waypoint(other.waypoint), distance_traveled(other.distance_traveled), remaining_estimate(other.remaining_estimate), @@ -309,6 +308,9 @@ Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_next_track() c bool TrainRoutePlanner::TrainRoutingState::is_occupying(Track &trk) const { + if(state==ARRIVED && !duration && info->router->get_trip_duration()) + return false; + OccupiedTrack *occ = occupied_tracks; for(unsigned n=occ->n_tracks; n>0; --n, occ=occ->next) if(occ->track==&trk) @@ -376,6 +378,9 @@ void TrainRoutePlanner::TrainRoutingState::advance(const Time::TimeDelta &dt) delay = Time::zero; } + if(duration) + duration = max(duration-secs*Time::sec, Time::zero); + if(state==MOVING) advance(info->speed*secs); else if(state!=ARRIVED)