state(MOVING)
{
const Vehicle *veh = &info->train->get_vehicle(0);
- track = TrackIter(veh->get_track(), veh->get_entry());
// TODO margins
- offset = veh->get_offset()+veh->get_type().get_length()/2;
+ TrackOffsetIter track_and_offs = veh->get_placement().get_position(VehiclePlacement::FRONT_BUFFER);
+ track = track_and_offs.track_iter();
+ offset = track_and_offs.offset();
path = track->get_active_path();
- float path_length = track->get_type().get_path_length(path);
- while(offset>path_length)
- {
- offset -= path_length;
- track = track.next();
- path = track->get_active_path();
- path_length = track->get_type().get_path_length(path);
- }
-
while(Vehicle *next = veh->get_link(1))
veh = next;
- back_offset = veh->get_offset()-veh->get_type().get_length()/2;
-
- TrackIter iter(veh->get_track(), veh->get_entry());
- while(back_offset<0)
- {
- TrackIter prev = iter.flip().reverse();
- if(!prev)
- break;
- iter = prev;
- back_offset += iter->get_type().get_path_length(iter->get_active_path());
- }
+ track_and_offs = veh->get_placement().get_position(VehiclePlacement::BACK_BUFFER);
+ back_offset = track_and_offs.offset();
+ TrackIter iter = track_and_offs.track_iter();
while(1)
{
occupied_tracks = new OccupiedTrack(*iter, iter->get_active_path(), occupied_tracks);