]> git.localhorst.tv Git - blobs.git/blobdiff - src/world/Simulation.hpp
better record logging
[blobs.git] / src / world / Simulation.hpp
index 2acf54981b29b9bc04177a44a9b5cd84256503ca..50f06b4ca693456505662659d1aae938e85e932e 100644 (file)
@@ -1,16 +1,31 @@
 #ifndef BLOBS_WORLD_SIMULATION_HPP_
 #define BLOBS_WORLD_SIMULATION_HPP_
 
+#include "Record.hpp"
+#include "Set.hpp"
+#include "../app/Assets.hpp"
+
+#include <iosfwd>
+#include <set>
+#include <vector>
+
 
 namespace blobs {
+namespace creature {
+       class Creature;
+}
 namespace world {
 
 class Body;
+class Planet;
+class Resource;
+class Sun;
+class TileType;
 
 class Simulation {
 
 public:
-       explicit Simulation(Body &root);
+       explicit Simulation(Body &root, app::Assets &);
        ~Simulation();
 
        Simulation(const Simulation &) = delete;
@@ -20,13 +35,53 @@ public:
        Simulation &operator =(Simulation &&) = delete;
 
 public:
-       void Tick();
+       void Tick(double dt);
+
+       Body &Root() noexcept { return root; }
+       const Body &Root() const noexcept { return root; }
+
+       app::Assets &Assets() noexcept { return assets; }
+       const app::Assets &Assets() const noexcept { return assets; }
+       const Set<Resource> &Resources() const noexcept { return assets.data.resources; }
+       const Set<TileType> &TileTypes() const noexcept { return assets.data.tile_types; }
+
+       void AddBody(Body &);
+       void AddPlanet(Planet &);
+       void AddSun(Sun &);
+
+       const std::set<Body *> &Bodies() const noexcept { return bodies; }
+       const std::set<Planet *> &Planets() const noexcept { return planets; }
+       const std::set<Sun *> &Suns() const noexcept { return suns; }
 
-       Body &Root() { return root; }
-       const Body &Root() const { return root; }
+       void SetAlive(creature::Creature *);
+       std::vector<creature::Creature *> &LiveCreatures() noexcept { return alive; }
+       const std::vector<creature::Creature *> &LiveCreatures() const noexcept { return alive; }
+
+       void SetDead(creature::Creature *);
+       std::vector<creature::Creature *> &DeadCreatures() noexcept { return dead; }
+       const std::vector<creature::Creature *> &DeadCreatures() const noexcept { return dead; }
+
+       double Time() const noexcept { return time; }
+
+       const std::vector<Record> &Records() const noexcept { return records; }
+       void CheckRecords(creature::Creature &) noexcept;
+       void LogRecord(const Record &rold, const Record &rnew);
+
+       std::ostream &Log();
 
 private:
        Body &root;
+       app::Assets &assets;
+
+       std::set<Body *> bodies;
+       std::set<Planet *> planets;
+       std::set<Sun *> suns;
+
+       std::vector<creature::Creature *> alive;
+       std::vector<creature::Creature *> dead;
+
+       double time;
+       std::vector<Record> records;
 
 };