]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Situation.hpp
overhaul need system
[blobs.git] / src / creature / Situation.hpp
index d4a376a8d6f25cfdd853cf46ab729553ec353f0a..4205cff449c8e0f1d57cdaedd39c56662c62ddd2 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef BLOBS_CREATURE_SITUATION_HPP_
 #define BLOBS_CREATURE_SITUATION_HPP_
 
-#include "../graphics/glm.hpp"
+#include "../math/glm.hpp"
 
 
 namespace blobs {
@@ -14,24 +14,67 @@ namespace creature {
 
 class Situation {
 
+public:
+       struct State {
+               // position
+               glm::dvec3 pos;
+               // velocity
+               glm::dvec3 vel;
+               // face direction, normalized
+               glm::dvec3 dir;
+               State(
+                       const glm::dvec3 &pos = glm::dvec3(0.0),
+                       const glm::dvec3 &vel = glm::dvec3(0.0),
+                       const glm::dvec3 &dir = glm::dvec3(0.0, 0.0, -1.0))
+               : pos(pos), vel(vel), dir(dir) { }
+       };
+       struct Derivative {
+               // velocity
+               glm::dvec3 vel;
+               // acceleration
+               glm::dvec3 acc;
+               Derivative(
+                       const glm::dvec3 &vel = glm::dvec3(0.0),
+                       const glm::dvec3 &acc = glm::dvec3(0.0))
+               : vel(vel), acc(acc) { }
+       };
+
 public:
        Situation();
        ~Situation();
 
+       Situation(const Situation &) = delete;
+       Situation &operator =(const Situation &) = delete;
+
+       Situation(Situation &&) = delete;
+       Situation &operator =(Situation &&) = delete;
+
 public:
        bool OnPlanet() const noexcept;
        world::Planet &GetPlanet() const noexcept { return *planet; }
        bool OnSurface() const noexcept;
        int Surface() const noexcept { return surface; }
-       const glm::dvec3 &Position() const noexcept { return position; }
+       const glm::dvec3 &Position() const noexcept { return state.pos; }
+       bool OnTile() const noexcept;
+       glm::ivec2 SurfacePosition() const noexcept;
        world::Tile &GetTile() const noexcept;
        const world::TileType &GetTileType() const noexcept;
 
+       void SetState(const State &s) noexcept { state = s; }
+       const State &GetState() const noexcept { return state; }
+
+       const glm::dvec3 &Velocity() const noexcept { return state.vel; }
+       bool Moving() const noexcept { return glm::length2(state.vel) > 0.0000001; }
+       void Move(const glm::dvec3 &dp) noexcept;
+
+       void Heading(const glm::dvec3 &h) noexcept { state.dir = h; }
+       const glm::dvec3 &Heading() const noexcept { return state.dir; }
+
        void SetPlanetSurface(world::Planet &, int srf, const glm::dvec3 &pos) noexcept;
 
 public:
        world::Planet *planet;
-       glm::dvec3 position;
+       State state;
        int surface;
        enum {
                LOST,