]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/train.cpp
Rename turnout/sensor_id fields in Track and Block to *_addr
[r2c2.git] / source / libr2c2 / train.cpp
index 95b78b567c9498ba687c05bbd445082d252ad065..50ad137723d42ec2a8c10775767a3de92c91d745 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()
@@ -247,7 +255,7 @@ BlockIter Train::get_first_noncritical_block() const
 
                dist += i->get_path_length(i.entry());
 
-               if(i->get_sensor_id())
+               if(i->get_sensor_address())
                        sensor_seen = true;
        }
 
@@ -436,7 +444,7 @@ void Train::sensor_state_changed(Sensor &sensor, Sensor::State state)
        if(last_entry_block && &*last_entry_block!=block)
        {
                for(BlockIter i=last_entry_block.next(); (i && &*i!=block); i=i.next())
-                       if(i->get_train()!=this || i->get_sensor_id())
+                       if(i->get_train()!=this || i->get_sensor_address())
                                return;
        }
 
@@ -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)
@@ -594,7 +602,7 @@ void Train::Loader::router()
 
 void Train::Loader::vehicle(ArticleNumber art_nr)
 {
-       const VehicleType &vtype = obj.layout.get_catalogue().get_vehicle(art_nr);
+       const VehicleType &vtype = obj.layout.get_catalogue().get<VehicleType>(art_nr);
        Vehicle *veh = new Vehicle(obj.layout, vtype);
        obj.vehicles.back()->attach_back(*veh);
        obj.vehicles.push_back(veh);