-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010-2011 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
#include <cmath>
#include "catalogue.h"
#include "driver.h"
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)
- throw InvalidState("Already attached");
+ throw attachment_error("already attached");
next = &veh;
veh.prev = this;
void Vehicle::attach_front(Vehicle &veh)
{
if(prev || veh.next)
- throw InvalidState("Already attached");
+ throw attachment_error("already attached");
prev = &veh;
veh.next = this;
void Vehicle::detach_back()
{
if(!next)
- throw InvalidState("Not attached");
+ throw attachment_error("not attached");
next->prev = 0;
next = 0;
void Vehicle::detach_front()
{
if(!prev)
- throw InvalidState("Not attached");
+ throw attachment_error("not attached");
prev->next = 0;
prev = 0;
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];
}
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);