]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Reserve enough blocks for the entire train when placing
[r2c2.git] / source / libr2c2 / train.cpp
index 95b78b567c9498ba687c05bbd445082d252ad065..07461b80a9558ecc4000c176bf73565e4c6d922b 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()