diff options
author | Aki <please@ignore.pl> | 2023-01-29 02:06:52 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2023-01-29 02:06:52 +0100 |
commit | dd997209468bde60f57089960f46067a375890ca (patch) | |
tree | 568f7a1b10d09d0d8fa40e45ea52be7d274b0146 | |
parent | e3fbcfc085411475cb07da84308f03dbd3405e5e (diff) | |
download | kurator-dd997209468bde60f57089960f46067a375890ca.zip kurator-dd997209468bde60f57089960f46067a375890ca.tar.gz kurator-dd997209468bde60f57089960f46067a375890ca.tar.bz2 |
Damage popups will now merge when possible
-rw-r--r-- | kurator/CMakeLists.txt | 1 | ||||
-rw-r--r-- | kurator/src/Battle.cpp | 11 | ||||
-rw-r--r-- | kurator/src/PopupEmitter.cpp | 38 | ||||
-rw-r--r-- | kurator/src/PopupEmitter.h | 20 |
4 files changed, 63 insertions, 7 deletions
diff --git a/kurator/CMakeLists.txt b/kurator/CMakeLists.txt index e2e4821..5b49bfb 100644 --- a/kurator/CMakeLists.txt +++ b/kurator/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable( src/ForceBalance.cpp src/main.cpp src/Pause.cpp + src/PopupEmitter.cpp src/ScenarioEditor.cpp src/SceneBuilder.cpp src/SceneFrame.cpp diff --git a/kurator/src/Battle.cpp b/kurator/src/Battle.cpp index d7232ff..8073585 100644 --- a/kurator/src/Battle.cpp +++ b/kurator/src/Battle.cpp @@ -22,6 +22,7 @@ #include "colors.h" #include "components.h" #include "Pause.h" +#include "PopupEmitter.h" #include "Session.h" #include "Summary.h" @@ -51,6 +52,7 @@ Battle::Battle(std::shared_ptr<Session> _session, campaign::Scenario scenario, B for (const auto& [entity, team, type, identifier] : ships.each()) { std::string label = TextFormat("%s (%d)", type.name.c_str(), identifier.id); registry.emplace<Marker>(entity, 5.0, team_color(team.id), std::move(label)); + registry.emplace<PopupEmitter>(entity); } } @@ -195,15 +197,10 @@ Battle::on_hit(const sim::Hit& hit) auto& registry = battle->registry(); if (!registry.valid(hit.victim)) return; - const std::string text = TextFormat("%.1f", hit.damage); const auto& source = registry.get<sim::Transform>(hit.source); const auto& victim = registry.get<sim::Transform>(hit.victim); - const auto popup = registry.create(); - registry.emplace<Timed>(popup, 1.2); - registry.emplace<CenteredText>(popup, text, MeasureText(text.c_str(), 10), 10, RED); - registry.emplace<sim::Transform>(popup, victim.position, 0.0); - registry.emplace<UIOffset>(popup, 0, 0); - registry.emplace<PopMove>(popup, sim::Point{0.0, -20}, 0.9998); + auto& popup = registry.get<PopupEmitter>(hit.victim); + popup.emit(registry, victim, hit.damage); const auto line = registry.create(); registry.emplace<Timed>(line, 0.2, true); registry.emplace<Line>( diff --git a/kurator/src/PopupEmitter.cpp b/kurator/src/PopupEmitter.cpp new file mode 100644 index 0000000..c382ef1 --- /dev/null +++ b/kurator/src/PopupEmitter.cpp @@ -0,0 +1,38 @@ +#include "PopupEmitter.h" + +#include <string> + +#include <entt/entity/registry.hpp> +#include <raylib.h> + +#include <kurator/sim/components.h> +#include <kurator/sim/Point.h> + +#include "components.h" + + +namespace kurator +{ + + +void +PopupEmitter::emit(entt::registry& registry, const sim::Transform& transform, const double damage) +{ + constexpr int size = 10; + if (!registry.valid(popup)) { + total = 0.0; + popup = registry.create(); + registry.emplace<Timed>(popup, 1.2); + registry.emplace<sim::Transform>(popup, transform.position, 0.0); + registry.emplace<CenteredText>(popup, std::string{}, 0, size, RED); + registry.emplace<UIOffset>(popup, 0, 0); + registry.emplace<PopMove>(popup, sim::Point{0, -20}, 0.9998); + } + total += damage; + auto& text = registry.get<CenteredText>(popup); + text.text = TextFormat("%.1f", total); + text.width = MeasureText(text.text.c_str(), size); +} + + +} // namespace kurator diff --git a/kurator/src/PopupEmitter.h b/kurator/src/PopupEmitter.h new file mode 100644 index 0000000..0d90427 --- /dev/null +++ b/kurator/src/PopupEmitter.h @@ -0,0 +1,20 @@ +#pragma once + +#include <entt/entity/registry.hpp> + +#include <kurator/sim/components.h> + + +namespace kurator +{ + + +struct PopupEmitter +{ + entt::entity popup = entt::null; + double total = 0.0; + void emit(entt::registry& registry, const sim::Transform& transform, double damage); +}; + + +} // namespace kurator |