]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Genome.hpp
overhaul need system
[blobs.git] / src / creature / Genome.hpp
index 057c6609915abc0cece270fbdb197a426215eb41..75ca79c70188c439c4683b3a238e8271663d9196 100644 (file)
@@ -2,6 +2,8 @@
 #define BLOBS_CREATURE_GENOME_HPP_
 
 #include "../math/Distribution.hpp"
+#include "../math/GaloisLFSR.hpp"
+#include "../math/glm.hpp"
 
 #include <vector>
 
@@ -18,36 +20,58 @@ struct Genome {
 
        template<class T>
        struct Properties {
-               T birth_mass;
-               T fertile_mass;
-               T max_mass;
-
-               T fertile_age;
-               T infertile_age;
-               T death_age;
-
-               T fertility;
+               /// every one of these should have at least one
+               /// negative impact to prevent super-beings evolving
+               T props[8];
+               /// power at the cost of higher solid intake
+               T &Strength() noexcept { return props[0]; }
+               const T &Strength() const noexcept { return props[0]; }
+               /// more endurance at the cost of higher liquid intake
+               T &Stamina() noexcept { return props[1]; }
+               const T &Stamina() const noexcept { return props[1]; }
+               /// more speed at the cost of higher fatigue
+               T &Dexerty() noexcept { return props[2]; }
+               const T &Dexerty() const noexcept { return props[2]; }
+               /// higher mental capacity at the cost of boredom
+               T &Intelligence() noexcept { return props[3]; }
+               const T &Intelligence() const noexcept { return props[3]; }
+               /// average lifetime in seconds
+               T &Lifetime() noexcept { return props[4]; }
+               const T &Lifetime() const noexcept { return props[4]; }
+               /// how likely to succeed in reproduction
+               T &Fertility() noexcept { return props[5]; }
+               const T &Fertility() const noexcept { return props[5]; }
+               /// how likely to mutate
+               T &Mutability() noexcept { return props[6]; }
+               const T &Mutability() const noexcept { return props[6]; }
+               /// mass of offspring
+               T &OffspringMass() noexcept { return props[7]; }
+               const T &OffspringMass() const noexcept { return props[7]; }
        };
        Properties<math::Distribution> properties;
 
-
-       struct Composition {
-               // which resource
-               int resource;
-               // how much contained in the body
-               // relative value to determine average density
-               math::Distribution mass;
-               // how much to circulate
-               math::Distribution intake;
-               // how important for alive-being
-               math::Distribution penalty;
-               // how much off the mass may stay in the body
-               math::Distribution growth;
-       };
-       std::vector<Composition> composition;
+       math::Distribution base_hue;
+       math::Distribution base_saturation;
+       math::Distribution base_lightness;
 
        void Configure(Creature &) const;
 
+       static Properties<double> Instantiate(
+               const Properties<math::Distribution> &p,
+               math::GaloisLFSR &rand
+       ) noexcept {
+               return {
+                       p.props[0].FakeNormal(rand.SNorm()),
+                       p.props[1].FakeNormal(rand.SNorm()),
+                       p.props[2].FakeNormal(rand.SNorm()),
+                       p.props[3].FakeNormal(rand.SNorm()),
+                       p.props[4].FakeNormal(rand.SNorm()),
+                       p.props[5].FakeNormal(rand.SNorm()),
+                       p.props[6].FakeNormal(rand.SNorm()),
+                       p.props[7].FakeNormal(rand.SNorm())
+               };
+       }
+
 };
 
 }