]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/blockallocator.cpp
Reserve enough blocks for the entire train when placing
[r2c2.git] / source / libr2c2 / blockallocator.cpp
index 547415aa965173ad5eeb68fb0966eceb6aff000c..2e816775f7dfa7c86683a559e3f1f638e436b33f 100644 (file)
@@ -60,13 +60,53 @@ void BlockAllocator::set_active(bool a)
        }
 }
 
-void BlockAllocator::start_from(const BlockIter &block)
+bool BlockAllocator::start_from(const BlockIter &block)
 {
        if(!block)
                throw invalid_argument("BlockAllocator::start_from");
 
+       float remaining_length = 0;
+       unsigned n_vehs = train.get_n_vehicles();
+       for(unsigned i=0; i<n_vehs; ++i)
+               remaining_length += train.get_vehicle(i).get_type().get_length();
+
        clear();
-       reserve_block(block);
+
+       BlockList blocks_to_reserve;
+       for(BlockIter b=block; b; b=b.next())
+       {
+               if(b->get_train())
+                       break;
+               blocks_to_reserve.push_back(b);
+               for(TrackIter t=b.track_iter(); (t && &t->get_block()==&*b); t=t.next())
+                       remaining_length -= t->get_type().get_path_length(t->get_active_path());
+               if(remaining_length<=0)
+                       break;
+       }
+
+       if(remaining_length>0)
+               return false;
+
+       for(BlockList::iterator i=blocks_to_reserve.begin(); i!=blocks_to_reserve.end(); ++i)
+       {
+               blocks.push_back(*i);
+               try
+               {
+                       (*i)->reserve(&train);
+               }
+               catch(...)
+               {
+                       blocks.pop_back();
+                       while(i!=blocks_to_reserve.begin())
+                       {
+                               blocks.pop_back();
+                               (*--i)->reserve(0);
+                       }
+                       throw;
+               }
+       }
+
+       return true;
 }
 
 void BlockAllocator::rewind_to(const Block &block)