X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=100842b6001fc44ebbf32a06e08ed0331f346189;hb=d41f66805bc9fe0b33e3d46b47f52e67b5782028;hp=d29438fef588b1107a70bddc620b7aa4a9bfb56e;hpb=dda1e6c8716b6ac70d63a3f6ff95474a8b8b7336;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index d29438f..100842b 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -14,7 +14,7 @@ namespace R2C2 { TrainRouter::TrainRouter(Train &t): TrainAI(t), priority(0), - arriving(false), + arriving(0), dest_zone(0), dest_block(0), update_pending(false) @@ -30,14 +30,14 @@ void TrainRouter::set_priority(int p) bool TrainRouter::set_route(const Route *r) { - train.free_noncritical_blocks(); + BlockIter fncb = train.get_first_noncritical_block(); Route *lead = 0; if(r && train.is_placed()) { const BlockAllocator &allocator = train.get_block_allocator(); TrackIter first = allocator.first().track_iter(); - TrackIter next = allocator.last().next().track_iter(); + TrackIter next = fncb.track_iter(); if(!r->has_track(*next)) { lead = Route::find(next, *r); @@ -55,9 +55,9 @@ bool TrainRouter::set_route(const Route *r) if(r) routes.push_back(r); train.stop_at(0); - arriving = false; + arriving = 0; - train.reserve_more(); + train.refresh_blocks_from(*fncb); const Route *route = get_route(); signal_route_changed.emit(route); @@ -137,18 +137,19 @@ void TrainRouter::message(const Message &msg) } } -void TrainRouter::tick(const Time::TimeStamp &, const Time::TimeDelta &) +void TrainRouter::tick(const Time::TimeDelta &) { if(update_pending) create_plans(train.get_layout()); - if(arriving && !train.get_speed()) + if(arriving==1 && !train.get_speed()) { - train.set_active(false); signal_arrived.emit(); signal_event.emit(Message("arrived")); - set_route(0); + arriving = 2; } + else if(arriving==2 && !train.get_block_allocator().is_active()) + set_route(0); } void TrainRouter::save(list &st) const @@ -224,7 +225,7 @@ void TrainRouter::train_advanced(Block &block) { b_iter = b_iter.next(); if(b_iter && !is_on_route(*b_iter)) - arriving = true; + arriving = 1; } }