X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=8de191b70ef0ac6fcf5cae6e289d238e3038d35a;hb=0c2a3e6c435fd4cf05cc5275f750d341842aa543;hp=77d6f71c8a082f9108921b3d3051b58b4fada51f;hpb=1c072afdb1866ba397ee8e6155f5f68c6c7ab4da;p=r2c2.git diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index 77d6f71..8de191b 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -30,13 +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()) { - TrackIter first = train.get_tail_block().track_iter(); - TrackIter next = train.get_head_block().next().track_iter(); + const BlockAllocator &allocator = train.get_block_allocator(); + TrackIter first = allocator.first().track_iter(); + TrackIter next = fncb.track_iter(); if(!r->has_track(*next)) { lead = Route::find(next, *r); @@ -56,7 +57,7 @@ bool TrainRouter::set_route(const Route *r) train.stop_at(0); arriving = false; - train.reserve_more(); + train.refresh_blocks_from(*fncb); const Route *route = get_route(); signal_route_changed.emit(route); @@ -136,14 +137,13 @@ 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()) { - train.set_active(false); signal_arrived.emit(); signal_event.emit(Message("arrived")); set_route(0); @@ -175,7 +175,7 @@ void TrainRouter::block_reserved(Block &block, Train *t) return; } - BlockIter b_iter(&block, t->get_entry_to_block(block)); + BlockIter b_iter = t->get_block_allocator().iter_for(block); RouteList::iterator route = routes.begin(); if(advance_route(route, block)) @@ -205,13 +205,13 @@ void TrainRouter::block_reserved(Block &block, Train *t) void TrainRouter::train_advanced(Block &block) { + BlockIter b_iter = train.get_block_allocator().iter_for(block); + // Check if we've reached the next route if(routes.size()>1) { - unsigned entry = train.get_entry_to_block(block); - Track &track = *block.get_endpoint(entry).track; const Route &route = **++routes.begin(); - if(route.has_track(track)) + if(route.has_track(*b_iter.endpoint().track)) { routes.pop_front(); // XXX Exceptions? @@ -221,9 +221,8 @@ void TrainRouter::train_advanced(Block &block) if(!routes.empty()) { - BlockIter iter(&block, train.get_entry_to_block(block)); - iter = iter.next(); - if(iter && !is_on_route(*iter)) + b_iter = b_iter.next(); + if(b_iter && !is_on_route(*b_iter)) arriving = true; } } @@ -249,7 +248,7 @@ Route *TrainRouter::create_lead_route(Route *lead, const Route *target) } set tracks; - for(BlockIter i=train.get_tail_block(); (i && i->get_train()==&train); i=i.next()) + for(BlockIter i=train.get_block_allocator().first(); (i && i->get_train()==&train); i=i.next()) { const set &btracks = i->get_tracks(); for(set::const_iterator j=btracks.begin(); j!=btracks.end(); ++j)