1 #ifndef BLOBS_CREATURE_CREATURE_HPP_
2 #define BLOBS_CREATURE_CREATURE_HPP_
8 #include "Situation.hpp"
9 #include "Steering.hpp"
10 #include "../graphics/SimpleVAO.hpp"
11 #include "../math/glm.hpp"
35 using Callback = std::function<void(Creature &)>;
38 explicit Creature(world::Simulation &);
41 Creature(const Creature &) = delete;
42 Creature &operator =(const Creature &) = delete;
44 Creature(Creature &&) = delete;
45 Creature &operator =(Creature &&) = delete;
48 world::Simulation &GetSimulation() noexcept { return sim; }
49 const world::Simulation &GetSimulation() const noexcept { return sim; }
51 void Name(const std::string &n) noexcept { name = n; }
52 const std::string &Name() const noexcept { return name; }
54 Genome &GetGenome() noexcept { return genome; }
55 const Genome &GetGenome() const noexcept { return genome; }
57 Genome::Properties<double> &GetProperties() noexcept { return properties; }
58 const Genome::Properties<double> &GetProperties() const noexcept { return properties; }
60 const Genome::PropertySet<double> &CurProps() const noexcept { return properties.props[cur_prop]; }
61 const Genome::PropertySet<double> &NextProps() const noexcept { return properties.props[std::min(5, cur_prop + 1)]; }
63 void BaseColor(const glm::dvec3 &c) noexcept { base_color = c; }
64 const glm::dvec3 &BaseColor() const noexcept { return base_color; }
66 void HighlightColor(const glm::dvec3 &c) noexcept { highlight_color = c; }
67 glm::dvec4 HighlightColor() const noexcept;
69 void Mass(double m) noexcept { mass = m; size = std::cbrt(mass / density); }
70 double Mass() const noexcept { return mass; }
71 void Ingest(int res, double amount) noexcept;
73 void Density(double d) noexcept { density = d; size = std::cbrt(mass / density); }
74 double Density() const noexcept { return density; }
76 double Size() const noexcept;
77 double Age() const noexcept;
78 std::string AgeName() const;
79 double AgeLerp(double from, double to) const noexcept;
80 // chance of giving birth per tick
81 double Fertility() const noexcept;
82 // chance of random genetic mutation per tick
83 double Mutability() const noexcept;
85 void Health(double h) noexcept { health = h; }
86 double Health() const noexcept { return health; }
87 void Hurt(double d) noexcept;
89 void OnDeath(Callback cb) noexcept { on_death = cb; }
90 void Remove() noexcept { removable = true; }
91 bool Removable() const noexcept { return removable; }
93 Memory &GetMemory() noexcept { return memory; }
94 const Memory &GetMemory() const noexcept { return memory; }
96 /// constantly active goal. every creature in the simulation is required to have one
97 void SetBackgroundTask(std::unique_ptr<Goal> &&g) { bg_task = std::move(g); }
98 Goal &BackgroundTask() { return *bg_task; }
100 void AddNeed(std::unique_ptr<Need> &&n) { needs.emplace_back(std::move(n)); }
101 const std::vector<std::unique_ptr<Need>> &Needs() const noexcept { return needs; }
103 void AddGoal(std::unique_ptr<Goal> &&);
104 const std::vector<std::unique_ptr<Goal>> &Goals() const noexcept { return goals; }
106 void Tick(double dt);
108 Situation &GetSituation() noexcept { return situation; }
109 const Situation &GetSituation() const noexcept { return situation; }
111 Steering &GetSteering() noexcept { return steering; }
112 const Steering &GetSteering() const noexcept { return steering; }
114 glm::dmat4 LocalTransform() noexcept;
117 void Draw(graphics::Viewport &);
120 Situation::Derivative Step(const Situation::Derivative &ds, double dt) const noexcept;
123 world::Simulation ∼
127 Genome::Properties<double> properties;
130 glm::dvec3 base_color;
131 glm::dvec3 highlight_color;
144 std::unique_ptr<Goal> bg_task;
145 std::vector<std::unique_ptr<Need>> needs;
146 std::vector<std::unique_ptr<Goal>> goals;
156 graphics::SimpleVAO<Attributes, unsigned short> vao;
160 /// put creature on planet and configure it to (hopefully) survive
161 void Spawn(Creature &, world::Planet &);
163 /// split the creature into two
164 void Split(Creature &);