+ Genome &GetGenome() noexcept { return genome; }
+ const Genome &GetGenome() const noexcept { return genome; }
+
+ Genome::Properties<double> &GetProperties() noexcept { return properties; }
+ const Genome::Properties<double> &GetProperties() const noexcept { return properties; }
+
+ void AddMass(int res, double amount);
+ const Composition &GetComposition() const noexcept { return composition; }
+
+ void BaseColor(const glm::dvec3 &c) noexcept { base_color = c; }
+ const glm::dvec3 &BaseColor() const noexcept { return base_color; }
+
+ void HighlightColor(const glm::dvec3 &c) noexcept;
+ glm::dvec4 HighlightColor() const noexcept { return highlight_color; }
+
+ 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; }
+
+ double Born() const noexcept { return birth; }
+ double Age() const noexcept;
+ /// 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 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;
+ 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; }
+
+ Memory &GetMemory() noexcept { return memory; }
+ 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 AddGoal(std::unique_ptr<Goal> &&);
+ const std::vector<std::unique_ptr<Goal>> &Goals() const noexcept { return goals; }