From 69dade793864169f7773cc133d54277eea9bf760 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 27 Nov 2017 17:38:52 +0100 Subject: [PATCH] track where a creature has been --- src/creature/Creature.hpp | 6 +++++ src/creature/Memory.hpp | 54 +++++++++++++++++++++++++++++++++++++++ src/creature/creature.cpp | 36 ++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 src/creature/Memory.hpp diff --git a/src/creature/Creature.hpp b/src/creature/Creature.hpp index 6c91827..7c06cc8 100644 --- a/src/creature/Creature.hpp +++ b/src/creature/Creature.hpp @@ -3,6 +3,7 @@ #include "Genome.hpp" #include "Goal.hpp" +#include "Memory.hpp" #include "Need.hpp" #include "Situation.hpp" #include "Steering.hpp" @@ -76,6 +77,9 @@ public: void Remove() noexcept { removable = true; } bool Removable() const noexcept { return removable; } + Memory &GetMemory() noexcept { return memory; } + const Memory &GetMemory() const noexcept { return memory; } + void AddNeed(std::unique_ptr &&n) { needs.emplace_back(std::move(n)); } const std::vector> &Needs() const noexcept { return needs; } @@ -115,6 +119,8 @@ private: Callback on_death; bool removable; + Memory memory; + std::vector> needs; std::vector> goals; diff --git a/src/creature/Memory.hpp b/src/creature/Memory.hpp new file mode 100644 index 0000000..a6910cc --- /dev/null +++ b/src/creature/Memory.hpp @@ -0,0 +1,54 @@ +#ifndef BLOBS_CREATURE_MEMORY_HPP_ +#define BLOBS_CREATURE_MEMORY_HPP_ + +#include "../math/glm.hpp" + +#include + + +namespace blobs { +namespace world { + class Planet; +} +namespace creature { + +class Creature; + +class Memory { + +public: + struct Location { + world::Planet *planet; + int surface; + glm::ivec2 coords; + }; + +public: + explicit Memory(Creature &); + ~Memory(); + +public: + void Tick(double dt); + +private: + /// track time spent on a tile + void TrackStay(const Location &, double t); + +private: + Creature &c; + + struct Stay { + double first_been; + Location first_loc; + double last_been; + Location last_loc; + double time_spent; + }; + std::map known_types; + +}; + +} +} + +#endif diff --git a/src/creature/creature.cpp b/src/creature/creature.cpp index c83f11c..4345bd9 100644 --- a/src/creature/creature.cpp +++ b/src/creature/creature.cpp @@ -1,5 +1,6 @@ #include "Creature.hpp" #include "Genome.hpp" +#include "Memory.hpp" #include "Situation.hpp" #include "Steering.hpp" @@ -35,6 +36,7 @@ Creature::Creature(world::Simulation &sim) , health(1.0) , on_death() , removable(false) +, memory(*this) , needs() , goals() , situation() @@ -112,6 +114,7 @@ void Creature::Tick(double dt) { << name << " died of old age" << std::endl; } + memory.Tick(dt); for (auto &need : needs) { need->Tick(dt); } @@ -391,6 +394,39 @@ void Split(Creature &c) { } +Memory::Memory(Creature &c) +: c(c) { +} + +Memory::~Memory() { +} + +void Memory::Tick(double dt) { + Situation &s = c.GetSituation(); + if (s.OnSurface()) { + TrackStay({ &s.GetPlanet(), s.Surface(), s.SurfacePosition() }, dt); + } +} + +void Memory::TrackStay(const Location &l, double t) { + const world::TileType &type = l.planet->TypeAt(l.surface, l.coords.x, l.coords.y); + auto entry = known_types.find(type.id); + if (entry != known_types.end()) { + entry->second.last_been = c.GetSimulation().Time(); + entry->second.last_loc = l; + entry->second.time_spent += t; + } else { + known_types.emplace(type.id, Stay{ + c.GetSimulation().Time(), + l, + c.GetSimulation().Time(), + l, + t + }); + } +} + + Situation::Situation() : planet(nullptr) , position(0.0) -- 2.39.2