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)
{
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)
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)
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);
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),