]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Creature.hpp
better heading implementation
[blobs.git] / src / creature / Creature.hpp
index 4d16f99bd35857689b5f1e09b8dcb9deffcd854a..db0aa5212dc92e52014446331912b6ce5e275052 100644 (file)
@@ -3,7 +3,6 @@
 
 #include "Composition.hpp"
 #include "Genome.hpp"
-#include "Goal.hpp"
 #include "Memory.hpp"
 #include "Situation.hpp"
 #include "Steering.hpp"
@@ -11,6 +10,7 @@
 #include "../math/geometry.hpp"
 #include "../math/glm.hpp"
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
@@ -30,6 +30,8 @@ namespace world {
 }
 namespace creature {
 
+class Goal;
+
 class Creature {
 
 public:
@@ -121,22 +123,34 @@ public:
 
        // stats with effects applied
        double Strength() const noexcept;
+       double StrengthFactor() const noexcept;
        double Stamina() const noexcept;
+       double StaminaFactor() const noexcept;
        double Dexerty() const noexcept;
+       double DexertyFactor() const noexcept;
        double Intelligence() const noexcept;
+       double IntelligenceFactor() const noexcept;
        double Lifetime() const noexcept;
        double Fertility() const noexcept;
        double Mutability() const noexcept;
+       double Adaptability() const noexcept;
        double OffspringMass() const noexcept;
 
+       double PerceptionRange() const noexcept;
+       double PerceptionOmniRange() const noexcept;
+       double PerceptionField() const noexcept;
+       bool PerceptionTest(const glm::dvec3 &) const noexcept;
        /// chance of giving birth per tick
        double OffspringChance() const noexcept;
-       /// chance of random genetic mutation per tick
+       /// chance of arbitrary genetic mutation per tick
        double MutateChance() const noexcept;
+       /// chance of environmental genetic mutation per tick
+       double AdaptChance() const noexcept;
 
        void Hurt(double d) noexcept;
        void Die() noexcept;
-       void OnDeath(Callback cb) noexcept { on_death = cb; }
+       bool Dead() const noexcept;
+       void WhenDead(Callback cb) noexcept { on_death = cb; }
        void Remove() noexcept;
        bool Removable() const noexcept { return removable; }
        void Removed() noexcept;
@@ -151,8 +165,8 @@ public:
        const Memory &GetMemory() const noexcept { return memory; }
 
        /// constantly active goal. every creature in the simulation is required to have one
-       void SetBackgroundTask(std::unique_ptr<Goal> &&g) { bg_task = std::move(g); }
-       Goal &BackgroundTask() { return *bg_task; }
+       void SetBackgroundTask(std::unique_ptr<Goal> &&g);
+       Goal &BackgroundTask();
 
        void AddGoal(std::unique_ptr<Goal> &&);
        const std::vector<std::unique_ptr<Goal>> &Goals() const noexcept { return goals; }
@@ -165,9 +179,13 @@ public:
        Steering &GetSteering() noexcept { return steering; }
        const Steering &GetSteering() const noexcept { return steering; }
 
-       math::AABB CollisionBox() const noexcept;
+       void HeadingTarget(const glm::dvec3 &t) noexcept { heading_target = t; heading_manual = true; }
+
+       math::AABB CollisionBounds() const noexcept;
        glm::dmat4 CollisionTransform() const noexcept;
 
+       void OnCollide(Creature &other);
+
        glm::dmat4 LocalTransform() noexcept;
 
        void BuildVAO();
@@ -175,6 +193,7 @@ public:
        void Draw(graphics::Viewport &);
 
 private:
+       void Cache() noexcept;
        void TickState(double dt);
        void TickStats(double dt);
        void TickBrain(double dt);
@@ -209,6 +228,15 @@ private:
 
        Situation situation;
        Steering steering;
+       glm::dvec3 heading_target;
+       bool heading_manual;
+
+       // cached because steering makes heavy use of this
+       double perception_range;
+       double perception_range_squared;
+       double perception_omni_range;
+       double perception_omni_range_squared;
+       double perception_field;
 
        struct Attributes {
                glm::vec3 position;