]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouter.cpp
Add a maximum speed property for vehicle types
[r2c2.git] / source / libr2c2 / trainrouter.cpp
index 8de191b70ef0ac6fcf5cae6e289d238e3038d35a..462af3853d5f04200eef5a0ca657e2006daad28e 100644 (file)
@@ -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)
@@ -55,7 +55,7 @@ bool TrainRouter::set_route(const Route *r)
        if(r)
                routes.push_back(r);
        train.stop_at(0);
-       arriving = false;
+       arriving = 0;
 
        train.refresh_blocks_from(*fncb);
 
@@ -110,6 +110,12 @@ bool TrainRouter::is_destination(Track &track) const
                return false;
 }
 
+void TrainRouter::set_departure_delay(const Time::TimeDelta &d)
+{
+       delay = d;
+       update_pending = true;
+}
+
 void TrainRouter::message(const Message &msg)
 {
        if(msg.type=="set-route")
@@ -135,19 +141,30 @@ void TrainRouter::message(const Message &msg)
                else
                        set_destination(*msg.value.value<const Zone *>());
        }
+       else if(msg.type=="set-departure-delay")
+               set_departure_delay(msg.value.value<Time::TimeDelta>());
 }
 
-void TrainRouter::tick(const Time::TimeDelta &)
+void TrainRouter::tick(const Time::TimeDelta &dt)
 {
+       if(delay)
+       {
+               delay -= dt;
+               if(delay<=Time::zero)
+                       delay = Time::zero;
+       }
+
        if(update_pending)
                create_plans(train.get_layout());
 
-       if(arriving && !train.get_speed())
+       if(arriving==1 && !train.get_speed())
        {
                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<DataFile::Statement> &st) const
@@ -181,9 +198,9 @@ void TrainRouter::block_reserved(Block &block, Train *t)
        if(advance_route(route, block))
        {
                // Check if the block is a turnout and set it to proper path
-               if(unsigned tid = block.get_turnout_id())
+               if(unsigned taddr = block.get_turnout_address())
                {
-                       int path = (*route)->get_turnout(tid);
+                       int path = (*route)->get_turnout(taddr);
                        if(path>=0)
                                b_iter.track_iter()->set_active_path(path);
                }
@@ -223,7 +240,7 @@ void TrainRouter::train_advanced(Block &block)
        {
                b_iter = b_iter.next();
                if(b_iter && !is_on_route(*b_iter))
-                       arriving = true;
+                       arriving = 1;
        }
 }