]> git.localhorst.tv Git - blobs.git/commitdiff
remove ability to fly at will
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 9 Dec 2017 23:00:55 +0000 (00:00 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 9 Dec 2017 23:00:55 +0000 (00:00 +0100)
src/creature/Situation.hpp
src/creature/creature.cpp
src/creature/goal.cpp
src/ui/ui.cpp

index 8df8a7a4c8867dc07f0743d61a8654fd12285aa0..a442d4473e7b5dca314025d4538db1e97ef539ab 100644 (file)
@@ -53,6 +53,7 @@ public:
        bool OnPlanet() const noexcept;
        world::Planet &GetPlanet() const noexcept { return *planet; }
        bool OnSurface() const noexcept;
+       bool OnGround() const noexcept;
        const glm::dvec3 &Position() const noexcept { return state.pos; }
        glm::dvec3 SurfaceNormal() const noexcept;
        world::Tile &GetTile() const noexcept;
@@ -66,7 +67,6 @@ public:
        void Move(const glm::dvec3 &dp) noexcept;
        void Accelerate(const glm::dvec3 &dv) noexcept;
        void EnforceConstraints(State &) noexcept;
-       void CheckWrap() noexcept;
 
        void Heading(const glm::dvec3 &h) noexcept { state.dir = h; }
        const glm::dvec3 &Heading() const noexcept { return state.dir; }
index 72d0b3f348e3c548ba55f6dcc00c52c6694408af..b609fe8a169c35462622a65aee816c17b4d8e077 100644 (file)
@@ -927,6 +927,10 @@ bool Situation::OnSurface() const noexcept {
        return type == PLANET_SURFACE;
 }
 
+bool Situation::OnGround() const noexcept {
+       return OnSurface() && glm::length2(state.pos) < (planet->Radius() + 0.05) * (planet->Radius() + 0.05);
+}
+
 glm::dvec3 Situation::SurfaceNormal() const noexcept {
        return planet->NormalAt(state.pos);
 }
@@ -1059,6 +1063,10 @@ glm::dvec3 Steering::Force(const Situation::State &s) const noexcept {
                        result += TargetVelocity(s, diff * std::min(dist * force, speed) / dist, force);
                }
        }
+       // remove vertical component, if any
+       const glm::dvec3 normal(c.GetSituation().GetPlanet().NormalAt(s.pos));
+       result += normal * glm::dot(normal, result);
+       // clamp to max
        if (glm::length2(result) > max_force * max_force) {
                result = glm::normalize(result) * max_force;
        }
index 65de6c0c78317ab43e16e788cc6f023dce2e62cc..abac4679dcbb93f822f7e54339e9c930071c5d5b 100644 (file)
@@ -340,7 +340,7 @@ void IngestGoal::Action() {
 }
 
 bool IngestGoal::OnSuitableTile() {
-       if (!GetSituation().OnSurface()) {
+       if (!GetSituation().OnGround()) {
                return false;
        }
        const world::TileType &t = GetSituation().GetTileType();
index c3397fe5c13aec4aa5bbecf4a0ab40dbaf06dde7..9d73b925416a4cd4d00a6344a2683647bcf5b684 100644 (file)
@@ -231,7 +231,11 @@ void CreaturePanel::Draw(graphics::Viewport &viewport) noexcept {
        }
 
        pos->Text(VectorString(c->GetSituation().Position(), 2));
-       tile->Text(c->GetSituation().GetTileType().label);
+       tile->Text(c->GetSituation().GetTileType().label + (
+               c->GetSituation().OnGround()
+                       ? (c->GetSituation().Moving() ? " (moving)" : " (standing)")
+                       : (c->GetSituation().Moving() ? " (flying)" : " (hovering)")
+       ));
        head->Text(VectorString(c->GetSituation().Heading(), 2));
 
        const creature::Composition &comp = c->GetComposition();