signal_train_removed.emit(t);
}
-void Layout::tick()
+void Layout::tick(float speed)
{
if(driver)
driver->tick();
dt = t-last_tick;
last_tick = t;
+ dt *= speed;
+ unsigned count = dt/(10*Time::msec)+1;
+ dt /= count;
+ while(count--)
+ step(dt);
+}
+
+void Layout::step(const Time::TimeDelta &dt)
+{
if(!driver || !driver->is_halted())
clock.tick(dt);
void Layout::block_reserved(Block &block, Train *train)
{
if(emitting_block_reserved)
+ {
+ if(!train)
+ {
+ for(deque<BlockReservation>::iterator i=block_reserve_queue.end(); i!=block_reserve_queue.begin(); )
+ if((--i)->block==&block)
+ {
+ block_reserve_queue.erase(i);
+ return;
+ }
+ }
+
block_reserve_queue.push_back(BlockReservation(block, train));
+ }
else
{
SetFlag setf(emitting_block_reserved);
{
BlockReservation br = block_reserve_queue.front();
block_reserve_queue.pop_front();
- signal_block_reserved.emit(br.block, br.train);
+ signal_block_reserved.emit(*br.block, br.train);
}
}
}
Layout::BlockReservation::BlockReservation(Block &b, Train *t):
- block(b),
+ block(&b),
train(t)
{ }