diff options
-rw-r--r-- | kurator/CMakeLists.txt | 1 | ||||
-rw-r--r-- | kurator/src/Battle.cpp | 13 | ||||
-rw-r--r-- | kurator/src/Battle.h | 2 | ||||
-rw-r--r-- | kurator/src/EventLog.h | 14 | ||||
-rw-r--r-- | kurator/src/Log.cpp | 61 | ||||
-rw-r--r-- | kurator/src/Log.h | 26 | ||||
-rw-r--r-- | stats/include/kurator/stats/BaseLog.h | 28 | ||||
-rw-r--r-- | stats/include/kurator/stats/BaseLog.inl.h | 33 |
8 files changed, 168 insertions, 10 deletions
diff --git a/kurator/CMakeLists.txt b/kurator/CMakeLists.txt index 2a46ef9..d085f07 100644 --- a/kurator/CMakeLists.txt +++ b/kurator/CMakeLists.txt @@ -4,6 +4,7 @@ add_executable( src/Battle.cpp src/colors.cpp src/ForceBalance.cpp + src/Log.cpp src/main.cpp src/Session.cpp src/Skybox.cpp diff --git a/kurator/src/Battle.cpp b/kurator/src/Battle.cpp index a77b57e..b7893da 100644 --- a/kurator/src/Battle.cpp +++ b/kurator/src/Battle.cpp @@ -2,7 +2,6 @@ #include <algorithm> #include <cmath> -#include <iostream> #include <memory> #include <string> #include <utility> @@ -20,8 +19,8 @@ #include "colors.h" #include "components.h" +#include "Log.h" #include "Session.h" -#include "Title.h" namespace kurator @@ -72,7 +71,7 @@ Battle::update(const float dt) } balance.update(registry); if (IsKeyPressed(KEY_SPACE)) - session->set(std::make_shared<Title>(session)); + session->set(std::make_shared<Log>(session, log)); } @@ -140,13 +139,7 @@ Battle::on_hit(const sim::Hit& hit) void Battle::on_ship_left(const stats::ShipLeft& event) { - std::cout - << event.time - << "\tShip " << (event.destroyed ? "destroyed" : "left") << ": " - << event.ship.id - << " team " - << event.team - << std::endl; + log.push_back(event); } diff --git a/kurator/src/Battle.h b/kurator/src/Battle.h index 9080219..009f9c3 100644 --- a/kurator/src/Battle.h +++ b/kurator/src/Battle.h @@ -6,6 +6,7 @@ #include <kurator/sim/events.h> #include <kurator/stats/events.h> +#include "EventLog.h" #include "ForceBalance.h" #include "Scene.h" #include "Session.h" @@ -28,6 +29,7 @@ private: std::shared_ptr<Session> session; std::unique_ptr<sim::Battle> battle; ForceBalance balance; + EventLog log; }; diff --git a/kurator/src/EventLog.h b/kurator/src/EventLog.h new file mode 100644 index 0000000..c676814 --- /dev/null +++ b/kurator/src/EventLog.h @@ -0,0 +1,14 @@ +#pragma once + +#include <kurator/stats/BaseLog.h> +#include <kurator/stats/events.h> + + +namespace kurator +{ + + +using EventLog = stats::BaseLog<stats::ShipLeft>; + + +} // namespace kurator diff --git a/kurator/src/Log.cpp b/kurator/src/Log.cpp new file mode 100644 index 0000000..6ef2833 --- /dev/null +++ b/kurator/src/Log.cpp @@ -0,0 +1,61 @@ +#include "Log.h" + +#include <memory> +#include <utility> + +#include <raylib.h> + +#include <kurator/stats/events.h> + +#include "EventLog.h" +#include "Session.h" +#include "Title.h" + + +namespace kurator +{ + + +struct Dumper +{ + const int x; + int y; + const int width; + void operator()(const stats::ShipLeft& event); +}; + + +Log::Log(std::shared_ptr<Session> _session, EventLog _events) : + session {std::move(_session)}, + events {std::move(_events)} +{ +} + + +void +Log::update(const float) +{ + if (IsKeyPressed(KEY_SPACE)) + session->set(std::make_shared<Title>(session)); +} + + +void +Log::draw() const +{ + ClearBackground(BLACK); + const int width = GetScreenWidth() / 2; + events.for_each(Dumper{width / 2, 10, width}); +} + + +void +Dumper::operator()(const stats::ShipLeft& event) +{ + DrawRectangle(x - 2, y - 2, width + 4, 24, DARKGRAY); + DrawText(TextFormat("%3.1f (%d) destroyed", event.time, event.ship.id), x, y, 20, WHITE); + y += 25; +} + + +} // namespace kurator diff --git a/kurator/src/Log.h b/kurator/src/Log.h new file mode 100644 index 0000000..2fabccf --- /dev/null +++ b/kurator/src/Log.h @@ -0,0 +1,26 @@ +#pragma once + +#include <memory> + +#include "EventLog.h" +#include "Session.h" +#include "Scene.h" + + +namespace kurator +{ + + +class Log : public Scene +{ +public: + Log(std::shared_ptr<Session> _session, EventLog _events); + void update(float dt) override; + void draw() const override; +private: + std::shared_ptr<Session> session; + EventLog events; +}; + + +} // namespace kurator diff --git a/stats/include/kurator/stats/BaseLog.h b/stats/include/kurator/stats/BaseLog.h new file mode 100644 index 0000000..142b2f2 --- /dev/null +++ b/stats/include/kurator/stats/BaseLog.h @@ -0,0 +1,28 @@ +#pragma once + +#include <variant> +#include <vector> + + +namespace kurator +{ +namespace stats +{ + + +template<typename... Events> +class BaseLog +{ +public: + template<typename Event> void push_back(Event event); + template<typename Visitor> void for_each(Visitor visitor) const; +private: + std::vector<std::variant<Events...>> events; +}; + + +} // namespace stats +} // namespace kurator + + +#include "BaseLog.inl.h" diff --git a/stats/include/kurator/stats/BaseLog.inl.h b/stats/include/kurator/stats/BaseLog.inl.h new file mode 100644 index 0000000..288f105 --- /dev/null +++ b/stats/include/kurator/stats/BaseLog.inl.h @@ -0,0 +1,33 @@ +#pragma once + +#include <utility> +#include <variant> + + +namespace kurator +{ +namespace stats +{ + + +template<typename... Events> +template<typename Event> +void +BaseLog<Events...>::push_back(Event event) +{ + events.push_back(std::move(event)); +} + + +template<typename... Events> +template<typename Visitor> +void +BaseLog<Events...>::for_each(Visitor visitor) const +{ + for (const auto& event : events) + std::visit(visitor, event); +} + + +} // namespace stats +} // namespace kurator |