bool Train::free_block(Block &block)
{
- float margin = 10*layout.get_catalogue().get_scale();
- if(get_reserved_distance_until(&block, false)<controller->get_braking_distance()*1.3+margin)
+ if(get_reserved_distance_until(&block, false)<controller->get_braking_distance()*1.3)
return false;
unsigned nsens = 0;
float Train::get_reserved_distance() const
{
- return get_reserved_distance_until(0, false);
+ if(blocks.empty())
+ return 0;
+
+ float margin = 0;
+ TrackIter next = blocks.back().next().track_iter();
+ if(next && next->get_type().is_turnout())
+ margin = 15*layout.get_catalogue().get_scale();
+
+ return max(get_reserved_distance_until(0, false)-margin, 0.0f);
}
void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
}
// Move blocks up to the next sensor to our current blocks
+ for(BlockList::iterator j=cur_blocks_end; j!=end; ++j)
+ signal_advanced.emit(**j);
cur_blocks_end = end;
// Try to get more blocks if we're moving
if(!block || block->get_endpoints().size()<2)
{
if(!blocking_train)
+ {
good_end = blocks.end();
+ end_of_route = true;
+ }
break;
}
contested_blocks.push_back(block);
continue;
}
- else if(divert_track && (entry_conflict || exit_conflict))
+ else if(divert_track && (entry_conflict || exit_conflict || !other_train->is_active()))
// We are blocked, but there's a diversion possibility
try_divert = true;
if(real_speed[i].weight)
{
last = i;
- if(real_speed[i].speed<real)
- low = i;
- else
+ if(real_speed[i].speed>=real)
high = i;
+ else if(real_speed[i].speed>real_speed[low].speed)
+ low = i;
}
if(!high)
{
track1 = track1.next(path);
- if(track1.looped())
+ if(!track1 || track1.looped())
return false;
}
bool ok = (track2!=from && diversion.has_track(*track2));
track2 = track2.next(path);
+ if(!track2)
+ return false;
if(ok)
break;