#ifndef VEHICLE_HH #define VEHICLE_HH #include "body.hh" #include "permstr.hh" #include "vector.hh" class Actuator; class Logic; class Sensor; class World; class Vehicle: public Body { World *_world; int _gc; double _length; double _width; double _mass; double _moment_inertia; Vector _sensors; Vector _actuators; Vector _logics; Vector _attachments; double _rotation; Point _velocity; double _angular_velocity; double _total_firing; Vector _trail; Vector _rotation_trail; Vehicle(const Vehicle &); public: Vehicle(double, double); virtual ~Vehicle() { } World *world() const { return _world; } double rotation() const { return _rotation; } int gc() const { return _gc; } int sensor_gc() const { return _gc; } Vehicle *clone(); void embody(World *w); void set_color(int, int, int); int nsensors() const { return _sensors.size(); } Sensor *sensor(int i) const { return _sensors[i]; } int sensor_id(PermString) const; Point sensor_position(int) const; Point actuator_position(int) const; Logic *logic(int i) const { return _logics[i]; } bool has_stimulus(int); double stimulus(int, Point, Point &); void add_sensor(Sensor *sensor) { _sensors.push_back(sensor); } void add_actuator(Actuator *, Logic * = 0); void set_sensor(int n, Sensor *s) { _sensors[n] = s; } void set_logic(int n, Logic *l) { _logics[n] = l; } void make_attachment(Body *attach); void place(const Point &p, double r); void reset(); void rotate(double); void drive(double len); bool movable() { return true; } Point velocity() { return _velocity; } void move(double); void collide(Body *); const Vector &trail() const { return _trail; } void trail_snapshot(); void draw(View *); Vehicle *cast_vehicle() { return this; } }; #endif