]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Redesign the train activation system
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index 8cfedee8f28623013cfa719f436704ec2963af5f..8de191b70ef0ac6fcf5cae6e289d238e3038d35a 100644 (file)
@@ -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);
@@ -57,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);
@@ -137,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);
@@ -176,7 +175,7 @@ void TrainRouter::block_reserved(Block &block, Train *t)
                return;
        }
 
-       BlockIter b_iter(&block, t->get_block_allocator().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))
@@ -206,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_block_allocator().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?
@@ -222,9 +221,8 @@ void TrainRouter::train_advanced(Block &block)
 
        if(!routes.empty())
        {
-               BlockIter iter(&block, train.get_block_allocator().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;
        }
 }