- std::cout << "require eating " << assets.data.resources[solid].label << std::endl;
- std::unique_ptr<Need> need(new IngestNeed(solid, 0.1, 0.001));
- need->name = assets.data.resources[solid].label;
- need->gain = 0.017;
- need->inconvenient = 0.6;
+ genome.composition.push_back({
+ solid, // resource
+ { 0.4, 0.01 }, // mass
+ { 0.1, 0.001 }, // intake
+ { 0.001, 0.0001 } // penalty
+ });
+ }
+
+ genome.Configure(assets, c);
+ c.GetSteering().MaxAcceleration(1.4);
+ c.GetSteering().MaxSpeed(4.4);
+}
+
+void Genome::Configure(app::Assets &assets, Creature &c) const {
+ c.GetGenome() = *this;
+ double mass = 0.0;
+ double volume = 0.0;
+ for (const auto &comp : composition) {
+ double comp_mass = comp.mass.FakeNormal(assets.random.SNorm());
+ double intake = comp.intake.FakeNormal(assets.random.SNorm());
+ double penalty = comp.intake.FakeNormal(assets.random.SNorm());
+
+ mass += comp_mass;
+ volume += comp_mass / assets.data.resources[comp.resource].density;
+
+ std::unique_ptr<Need> need;
+ if (assets.data.resources[comp.resource].state == world::Resource::SOLID) {
+ need.reset(new IngestNeed(comp.resource, intake, penalty));
+ need->gain = intake * 0.05;
+ } else if (assets.data.resources[comp.resource].state == world::Resource::LIQUID) {
+ need.reset(new IngestNeed(comp.resource, intake, penalty));
+ need->gain = intake * 0.1;
+ } else {
+ need.reset(new InhaleNeed(comp.resource, intake, penalty));
+ need->gain = intake * 0.5;
+ }
+ need->name = assets.data.resources[comp.resource].label;
+ need->inconvenient = 0.5;