#pragma once

#include <Redacted3D/types/entity/entity.h>

///A "Movable Object". Things that will move often are derived from this.
class Moby : public Entity {
private:
    ///The angle of velocity.
    Vector3 velAngle = {0,0,0};
    ///Speed.
    float velocity;
public:
    Moby(): Entity(){}

    ///Move
    void move(Direction a, float speed);
    ///Move in the direction a moby is facing.
    void move(float speed);

    ///Horizontal Move.
    virtual void hMove(Direction a, float speed);
    ///Vertical Move.
    void vMove(float vel);
    ///The position we would be at if we did a horizontal movement.
    Position projectedHorizontalMove(Direction a, float speed);
    ///The position we would be at if we did a vertical movement.
    Position projectedVerticalMove(float speed);
    float getVelocity();
    void setVelocity(float vel);
    void setVelocityAngle(const Vector3& a);
    void setVelocityAngle(float pitch, float yaw, float roll);
    Vector3 getVelocityAngle();
    Direction getVelocityAngleDirection();
    /// Forward angle
    Direction fAngle();
    /// Backwards angle
    Direction bAngle();
    /// Left angle
    Direction lAngle();
    /// Right angle
    Direction rAngle();

    void vAngleMove(float speed);
};

