]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.cpp
Perform check_slope automatically with certain operations
[r2c2.git] / source / libr2c2 / vehicle.cpp
index 6b89fa8743b604036ccab17c7a42a48e94e8c208..d1819a0fbe5c9e652b7a165970ab0d54bdd19cae 100644 (file)
@@ -14,11 +14,10 @@ using namespace Msp;
 namespace R2C2 {
 
 Vehicle::Vehicle(Layout &l, const VehicleType &t):
-       layout(l),
+       Object(l),
        type(t),
        next(0),
        prev(0),
-       direction(0),
        front_sensor(0),
        back_sensor(0)
 {
@@ -38,10 +37,18 @@ Vehicle::~Vehicle()
        layout.remove_vehicle(*this);
 }
 
+Vehicle *Vehicle::clone(Layout *to_layout) const
+{
+       Vehicle *veh = new Vehicle((to_layout ? *to_layout : layout), type);
+       veh->set_position(position);
+       veh->set_rotation(rotation);
+       return veh;
+}
+
 void Vehicle::attach_back(Vehicle &veh)
 {
        if(next || veh.prev)
-               throw InvalidState("Already attached");
+               throw attachment_error("already attached");
 
        next = &veh;
        veh.prev = this;
@@ -53,7 +60,7 @@ void Vehicle::attach_back(Vehicle &veh)
 void Vehicle::attach_front(Vehicle &veh)
 {
        if(prev || veh.next)
-               throw InvalidState("Already attached");
+               throw attachment_error("already attached");
 
        prev = &veh;
        veh.next = this;
@@ -65,7 +72,7 @@ void Vehicle::attach_front(Vehicle &veh)
 void Vehicle::detach_back()
 {
        if(!next)
-               throw InvalidState("Not attached");
+               throw attachment_error("not attached");
 
        next->prev = 0;
        next = 0;
@@ -74,7 +81,7 @@ void Vehicle::detach_back()
 void Vehicle::detach_front()
 {
        if(!prev)
-               throw InvalidState("Not attached");
+               throw attachment_error("not attached");
 
        prev->next = 0;
        prev = 0;
@@ -121,30 +128,30 @@ void Vehicle::advance(float d)
 const Vehicle::Axle &Vehicle::get_fixed_axle(unsigned i) const
 {
        if(i>=axles.size())
-               throw InvalidParameterValue("Axle index out of range");
+               throw out_of_range("Vehicle::get_fixed_axle");
        return axles[i];
 }
 
 const Vehicle::Bogie &Vehicle::get_bogie(unsigned i) const
 {
        if(i>=bogies.size())
-               throw InvalidParameterValue("Bogie index out of range");
+               throw out_of_range("Vehicle::get_bogie");
        return bogies[i];
 }
 
 const Vehicle::Axle &Vehicle::get_bogie_axle(unsigned i, unsigned j) const
 {
        if(i>=bogies.size())
-               throw InvalidParameterValue("Bogie index out of range");
+               throw out_of_range("Vehicle::get_bogie_axle");
        if(j>=bogies[i].axles.size())
-               throw InvalidParameterValue("Axle index out of range");
+               throw out_of_range("Vehicle::get_bogie_axle");
        return bogies[i].axles[j];
 }
 
 const Vehicle::Rod &Vehicle::get_rod(unsigned i) const
 {
        if(i>=rods.size())
-               throw InvalidParameterValue("Rod index out of range");
+               throw out_of_range("Vehicle::get_rod");
        return rods[i];
 }
 
@@ -189,7 +196,7 @@ void Vehicle::update_position()
 
        position = tp.pos;
        position.z += layout.get_catalogue().get_rail_elevation();
-       direction = tp.dir;
+       rotation = tp.dir;
 }
 
 void Vehicle::update_position_from(const Vehicle &veh)
@@ -200,7 +207,7 @@ void Vehicle::update_position_from(const Vehicle &veh)
        float margin = layout.get_catalogue().get_scale();
 
        float dist = distance(veh.position, position);
-       if(dist<tdist-margin || dist>tdist+margin)
+       if(!track_pos.track || dist<tdist-margin || dist>tdist+margin)
        {
                track_pos = veh.track_pos;
                track_pos.advance(sign*tdist);
@@ -391,6 +398,29 @@ TrackPoint Vehicle::get_point(const TrackPosition &pos, float tdist, float ratio
        return get_point(front.get_point().pos, back.get_point().pos, ratio);
 }
 
+unsigned Vehicle::get_n_link_slots() const
+{
+       return 2;
+}
+
+Vehicle *Vehicle::get_link(unsigned i) const
+{
+       if(i>=2)
+               throw out_of_range("Vehicle::get_link");
+
+       return (i==0 ? prev : next);
+}
+
+int Vehicle::get_link_slot(const Object &other) const
+{
+       if(&other==prev)
+               return 0;
+       else if(&other==next)
+               return 1;
+       else
+               return -1;
+}
+
 
 Vehicle::Axle::Axle(const VehicleType::Axle &t):
        type(&t),