X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicle.h;h=94ae2b1683e648cc8f07cb9edfc1ff56d107ecdf;hb=107a7f787d406f1f664c4986557f9a896e0845ea;hp=b9c36d95d1e42bdbd6b06b5bc655138ac8ab3fb2;hpb=f8a7788cee0261babfc4c804a58515aad6dfbc3d;p=r2c2.git diff --git a/source/libr2c2/vehicle.h b/source/libr2c2/vehicle.h index b9c36d9..94ae2b1 100644 --- a/source/libr2c2/vehicle.h +++ b/source/libr2c2/vehicle.h @@ -1,22 +1,25 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #ifndef LIBR2C2_VEHICLE_H_ #define LIBR2C2_VEHICLE_H_ #include "geometry.h" +#include "object.h" +#include "trackiter.h" #include "vehicletype.h" namespace R2C2 { class Layout; -class Track; +class Train; -class Vehicle +class attachment_error: public std::logic_error +{ +public: + attachment_error(const std::string &w): std::logic_error(w) { } + virtual ~attachment_error() throw() { } +}; + + +class Vehicle: public Object { public: enum PlaceMode @@ -31,7 +34,7 @@ public: struct Axle { const VehicleType::Axle *type; - float angle; + Angle angle; Axle(const VehicleType::Axle &); }; @@ -39,7 +42,7 @@ public: struct Bogie { const VehicleType::Bogie *type; - float direction; + Angle direction; std::vector axles; Bogie(const VehicleType::Bogie &); @@ -49,7 +52,7 @@ public: { const VehicleType::Rod *type; Vector position; - float angle; + Angle angle; Rod(const VehicleType::Rod &); }; @@ -57,23 +60,20 @@ public: private: struct TrackPosition { - Track *track; - unsigned ep; + TrackIter track; float offs; TrackPosition(); - TrackPosition(Track *, unsigned, float); + TrackPosition(const TrackIter &, float); void advance(float); TrackPoint get_point() const; }; - Layout &layout; const VehicleType &type; + Train *train; Vehicle *next; Vehicle *prev; TrackPosition track_pos; - Vector position; - float direction; std::vector axles; std::vector bogies; std::vector rods; @@ -84,8 +84,11 @@ public: Vehicle(Layout &, const VehicleType &); ~Vehicle(); - const VehicleType &get_type() const { return type; } + virtual Vehicle *clone(Layout * = 0) const; + virtual const VehicleType &get_type() const { return type; } + void set_train(Train *); + Train *get_train() const { return train; } void attach_back(Vehicle &); void attach_front(Vehicle &); void detach_back(); @@ -93,15 +96,18 @@ public: Vehicle *get_next() const { return next; } Vehicle *get_previous() const { return prev; } - void place(Track &, unsigned, float, PlaceMode = CENTER); + // TODO implement these - should call place() with suitable parameters + virtual void set_position(const Vector &) { } + virtual void set_rotation(const Angle &) { } + virtual void set_tilt(const Angle &) { } + void place(const TrackIter &, float, PlaceMode = CENTER); void unplace(); void advance(float); - Track *get_track() const { return track_pos.track; } - unsigned get_entry() const { return track_pos.ep; } + const TrackIter &get_track_iter() const { return track_pos.track; } + Track *get_track() const { return track_pos.track.track(); } + unsigned get_entry() const { return track_pos.track.entry(); } float get_offset() const { return track_pos.offs; } - const Vector &get_position() const { return position; } - float get_direction() const { return direction; } - const Axle &get_axle(unsigned) const; + const Axle &get_fixed_axle(unsigned) const; const Bogie &get_bogie(unsigned) const; const Axle &get_bogie_axle(unsigned, unsigned) const; const Rod &get_rod(unsigned) const; @@ -118,6 +124,11 @@ private: void adjust_for_distance(TrackPosition &, TrackPosition &, float, float = 0.5) const; TrackPoint get_point(const Vector &, const Vector &, float = 0.5) const; TrackPoint get_point(const TrackPosition &, float, float = 0.5) const; + +public: + virtual unsigned get_n_link_slots() const; + virtual Vehicle *get_link(unsigned) const; + virtual int get_link_slot(const Object &) const; }; } // namespace R2C2