X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicle.cpp;h=d1819a0fbe5c9e652b7a165970ab0d54bdd19cae;hb=8b7d4054b05002d82338775ac9b4ee764a8560e4;hp=b7355c6a6e2fab2bd73caaeafafd4881ce989b2d;hpb=d18d5c1c3cf417e20840238eec4f3caa431fa2b5;p=r2c2.git diff --git a/source/libr2c2/vehicle.cpp b/source/libr2c2/vehicle.cpp index b7355c6..d1819a0 100644 --- a/source/libr2c2/vehicle.cpp +++ b/source/libr2c2/vehicle.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010-2011 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include "catalogue.h" #include "driver.h" @@ -21,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) { @@ -45,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; @@ -60,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; @@ -72,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; @@ -81,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; @@ -128,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]; } @@ -196,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) @@ -207,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(disttdist+margin) + if(!track_pos.track || disttdist+margin) { track_pos = veh.track_pos; track_pos.advance(sign*tdist); @@ -398,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),