]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Genome.hpp
more variety over age
[blobs.git] / src / creature / Genome.hpp
index 057c6609915abc0cece270fbdb197a426215eb41..882a8a28f3b9c5e6acf1671c4a6883c944c9339c 100644 (file)
@@ -2,6 +2,7 @@
 #define BLOBS_CREATURE_GENOME_HPP_
 
 #include "../math/Distribution.hpp"
+#include "../math/GaloisLFSR.hpp"
 
 #include <vector>
 
@@ -17,17 +18,27 @@ class Creature;
 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;
-
+       struct PropertySet {
+               T age;
+               T mass;
                T fertility;
        };
+       template<class T>
+       struct Properties {
+               PropertySet<T> props[6];
+               PropertySet<T> &Birth() noexcept { return props[0]; }
+               const PropertySet<T> &Birth() const noexcept { return props[0]; }
+               PropertySet<T> &Child() noexcept { return props[1]; }
+               const PropertySet<T> &Child() const noexcept { return props[1]; }
+               PropertySet<T> &Youth() noexcept { return props[2]; }
+               const PropertySet<T> &Youth() const noexcept { return props[2]; }
+               PropertySet<T> &Adult() noexcept { return props[3]; }
+               const PropertySet<T> &Adult() const noexcept { return props[3]; }
+               PropertySet<T> &Elder() noexcept { return props[4]; }
+               const PropertySet<T> &Elder() const noexcept { return props[4]; }
+               PropertySet<T> &Death() noexcept { return props[5]; }
+               const PropertySet<T> &Death() const noexcept { return props[5]; }
+       };
        Properties<math::Distribution> properties;
 
 
@@ -48,6 +59,31 @@ struct Genome {
 
        void Configure(Creature &) const;
 
+       static PropertySet<double> Instantiate(
+               const PropertySet<math::Distribution> &p,
+               math::GaloisLFSR &rand
+       ) noexcept {
+               return {
+                       p.age.FakeNormal(rand.SNorm()),
+                       p.mass.FakeNormal(rand.SNorm()),
+                       p.fertility.FakeNormal(rand.SNorm())
+               };
+       }
+
+       static Properties<double> Instantiate(
+               const Properties<math::Distribution> &p,
+               math::GaloisLFSR &rand
+       ) noexcept {
+               return {
+                       Instantiate(p.props[0], rand),
+                       Instantiate(p.props[1], rand),
+                       Instantiate(p.props[2], rand),
+                       Instantiate(p.props[3], rand),
+                       Instantiate(p.props[4], rand),
+                       Instantiate(p.props[5], rand)
+               };
+       }
+
 };
 
 }