#include "Composition.hpp"
#include "Genome.hpp"
-#include "Goal.hpp"
#include "Memory.hpp"
#include "Situation.hpp"
#include "Steering.hpp"
#include "../math/geometry.hpp"
#include "../math/glm.hpp"
+#include <functional>
#include <memory>
#include <string>
#include <vector>
}
namespace creature {
+class Goal;
+
class Creature {
public:
void HighlightColor(const glm::dvec3 &c) noexcept;
glm::dvec4 HighlightColor() const noexcept { return highlight_color; }
+ void BackSkin(double s) noexcept { skin_back = s; }
+ double BackSkin() const noexcept { return skin_back; }
+
+ void SideSkin(double s) noexcept { skin_side = s; }
+ double SideSkin() const noexcept { return skin_side; }
+
void Mass(double m) noexcept { mass = m; }
double Mass() const noexcept { return mass; }
void Ingest(int res, double amount) noexcept;
+ void DoWork(double amount) noexcept;
+
void Size(double s) noexcept { size = s; }
double Size() const noexcept { return size; }
/// age-depended multiplier, peak being the maximum in lifetime [0,1]
double AgeFactor(double peak) const noexcept;
+ double EnergyEfficiency() const noexcept;
double ExhaustionFactor() const noexcept;
double FatigueFactor() const noexcept;
// 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; }
- void Remove() noexcept { removable = true; }
+ bool Dead() const noexcept;
+ void WhenDead(Callback cb) noexcept { on_death = cb; }
+ void Remove() noexcept;
bool Removable() const noexcept { return removable; }
+ void Removed() noexcept;
+
+ void AddParent(Creature &);
+ const std::vector<Creature *> &Parents() const noexcept { return parents; }
Stats &GetStats() noexcept { return stats; }
const Stats &GetStats() const noexcept { return stats; }
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; }
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();
+ void KillVAO();
void Draw(graphics::Viewport &);
private:
+ void Cache() noexcept;
void TickState(double dt);
void TickStats(double dt);
void TickBrain(double dt);
glm::dvec3 base_color;
glm::dvec4 highlight_color;
+ double skin_back;
+ double skin_side;
double mass;
double size;
double birth;
+ double death;
Callback on_death;
bool removable;
+ std::vector<Creature *> parents;
+
Stats stats;
Memory memory;
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;
glm::vec3 normal;
glm::vec3 texture;
};
- graphics::SimpleVAO<Attributes, unsigned short> vao;
+ std::unique_ptr<graphics::SimpleVAO<Attributes, unsigned short>> vao;
};