]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Add a utility function to get path length from Track
[r2c2.git] / source / libr2c2 / train.cpp
index 95b78b567c9498ba687c05bbd445082d252ad065..7e4a6904610a7b51ee19940e7f4d9cc1812f95aa 100644 (file)
@@ -185,21 +185,29 @@ void Train::ai_message(const TrainAI::Message &msg)
                (*i)->message(msg);
 }
 
-void Train::place(const BlockIter &block)
+bool Train::place(const BlockIter &block)
 {
        if(!block)
                throw invalid_argument("Train::place");
        if(controller->get_speed())
                throw logic_error("moving");
 
-       allocator.start_from(block);
        accurate_position = false;
        last_entry_block = BlockIter();
 
-       if(reverse)
-               vehicles.front()->place(block.reverse().track_iter(), VehiclePlacement::FRONT_BUFFER);
+       if(allocator.start_from(block))
+       {
+               if(reverse)
+                       vehicles.front()->place(block.reverse().track_iter(), VehiclePlacement::FRONT_BUFFER);
+               else
+                       vehicles.back()->place(block.track_iter(), VehiclePlacement::BACK_BUFFER);
+               return true;
+       }
        else
-               vehicles.back()->place(block.track_iter(), VehiclePlacement::BACK_BUFFER);
+       {
+               unplace();
+               return false;
+       }
 }
 
 void Train::unplace()
@@ -522,14 +530,14 @@ float Train::get_reserved_distance_until(const Block *until_block) const
        if(reverse)
                track = track.reverse();
        else
-               result = track->get_type().get_path_length(track->get_active_path())-result;
+               result = track->get_path_length()-result;
        result -= veh.get_type().get_length()/2;
 
        BlockIter block = track.block_iter();
 
        // Count remaining distance in the vehicle's current block
        for(track=track.next(); &track->get_block()==&*block; track=track.next())
-               result += track->get_type().get_path_length(track->get_active_path());
+               result += track->get_path_length();
 
        const BlockIter &last = allocator.last();
        if(&*block==&*last)