+float Train::get_reserved_distance() const
+{
+ Vehicle &veh = *(reverse ? vehicles.back() : vehicles.front());
+ const VehicleType &vtype = veh.get_type();
+
+ Track *track = veh.get_track();
+ if(!track)
+ return 0;
+ unsigned entry = veh.get_entry();
+
+ float result = -vtype.get_length()/2;
+ if(reverse)
+ {
+ entry = track->traverse(entry);
+ result += veh.get_offset();
+ }
+ else
+ result -= veh.get_offset();
+
+ bool first = true;
+ list<BlockRef>::const_iterator block = cur_blocks.begin();
+ while(1)
+ {
+ if(!first || !reverse)
+ result += track->get_type().get_path_length(track->get_active_path());
+ first = false;
+
+ if(track->get_type().get_endpoints().size()<2)
+ return result;
+
+ unsigned exit = track->traverse(entry);
+ Track *next = track->get_link(exit);
+
+ while(!block->block->get_tracks().count(next))
+ {
+ ++block;
+ if(block==cur_blocks.end())
+ block = rsv_blocks.begin();
+ if(block==rsv_blocks.end())
+ return result;
+ }
+
+ entry = next->get_endpoint_by_link(*track);
+ track = next;
+ }
+}
+