X-Git-Url: http://git.localhorst.tv/?p=blobs.git;a=blobdiff_plain;f=src%2Fcreature%2Fcreature.cpp;h=536144b276bb4abe2b4f2dd9db33ca4e0223b1df;hp=396385e9ce33253c512eea680c1f9a3ee255da5a;hb=c49dd02dfabb123e0c6c4b49f761ce6578dfc464;hpb=1f8fe0fd81053821f26787e9809cd1a13f747819 diff --git a/src/creature/creature.cpp b/src/creature/creature.cpp index 396385e..536144b 100644 --- a/src/creature/creature.cpp +++ b/src/creature/creature.cpp @@ -80,6 +80,35 @@ double Composition::Get(int res) const noexcept { return 0.0; } +double Composition::Proportion(int res) const noexcept { + return Get(res) / TotalMass(); +} + +double Composition::Compatibility(const world::Set &resources, int res) const noexcept { + if (Has(res)) { + return Proportion(res); + } + double max_compat = -1.0; + double min_compat = 1.0; + for (const auto &c : components) { + double prop = c.value / TotalMass(); + for (const auto &compat : resources[c.resource].compatibility) { + double value = compat.second * prop; + if (value > max_compat) { + max_compat = value; + } + if (value < min_compat) { + min_compat = value; + } + } + } + if (min_compat < 0.0) { + return min_compat; + } else { + return max_compat; + } +} + Creature::Creature(world::Simulation &sim) : sim(sim) @@ -131,13 +160,12 @@ void Creature::HighlightColor(const glm::dvec3 &c) noexcept { } void Creature::Ingest(int res, double amount) noexcept { - // TODO: check foreign materials if (sim.Resources()[res].state == world::Resource::SOLID) { - // 15% of solids stays in body - AddMass(res, amount * 0.15); + // 30% of solids stays in body + AddMass(res, amount * 0.3 * composition.Compatibility(sim.Resources(), res)); } else { // 10% of fluids stays in body - AddMass(res, amount * 0.05); + AddMass(res, amount * 0.1 * composition.Compatibility(sim.Resources(), res)); } math::GaloisLFSR &random = sim.Assets().random; if (random.UNorm() < AdaptChance()) {