diff options
-rw-r--r-- | kurator/src/Battle.cpp | 42 | ||||
-rw-r--r-- | kurator/src/Battle.h | 3 | ||||
-rw-r--r-- | kurator/src/components.h | 9 | ||||
-rw-r--r-- | sim/include/kurator/sim/events.h | 6 | ||||
-rw-r--r-- | sim/src/BaseBattle.cpp | 1 |
5 files changed, 60 insertions, 1 deletions
diff --git a/kurator/src/Battle.cpp b/kurator/src/Battle.cpp index 3d0ac72..d7232ff 100644 --- a/kurator/src/Battle.cpp +++ b/kurator/src/Battle.cpp @@ -44,6 +44,7 @@ Battle::Battle(std::shared_ptr<Session> _session, campaign::Scenario scenario, B { battle->dispatcher().sink<sim::End>().connect<&Battle::on_end>(*this); battle->dispatcher().sink<sim::Hit>().connect<&Battle::on_hit>(*this); + battle->dispatcher().sink<sim::Destroyed>().connect<&Battle::on_destroyed>(*this); battle->dispatcher().sink<stats::ShipLeft>().connect<&Battle::on_ship_left>(*this); auto& registry = battle->registry(); auto ships = registry.view<sim::Team, universe::ShipType, universe::UniqueIdentifier>(); @@ -58,6 +59,7 @@ Battle::~Battle() { battle->dispatcher().sink<sim::End>().disconnect(*this); battle->dispatcher().sink<sim::Hit>().disconnect(*this); + battle->dispatcher().sink<sim::Destroyed>().disconnect(*this); battle->dispatcher().sink<stats::ShipLeft>().disconnect(*this); } @@ -84,6 +86,13 @@ Battle::update(const float dt) pop.speed.x -= damp.x; pop.speed.y -= damp.y; } + auto crosses = registry.view<Cross>(); + for (auto&& [entity, cross] : crosses.each()) { + cross.timer += dt; + const auto dphase = cross.phase * 2; + if (cross.timer > dphase) + cross.timer -= dphase; + } auto lines = registry.view<Line>(); for (auto&& [entity, line] : lines.each()) line.position += (1.0 + line.hlength) / line.duration * dt * time_factor; @@ -115,6 +124,25 @@ Battle::draw() const const int hheight = GetScreenHeight() / 2; const double scale = std::min(hwidth/15000.0, hheight/15000.0); auto& registry = battle->registry(); + auto crosses = registry.view<sim::Transform, Cross>(); + for (const auto& [entity, transform, cross] : crosses.each()) { + if (cross.timer > cross.phase) + continue; + const int x = hwidth + transform.position.x*scale; + const int y = hheight + transform.position.y*scale; + DrawLine( + x - cross.hlength, + y - cross.hlength, + x + cross.hlength, + y + cross.hlength, + cross.color); + DrawLine( + x + cross.hlength, + y - cross.hlength, + x - cross.hlength, + y + cross.hlength, + cross.color); + } auto lines = registry.view<Line>(); for (const auto& [entity, line] : lines.each()) { const auto diff = line.end - line.start; @@ -189,6 +217,20 @@ Battle::on_hit(const sim::Hit& hit) void +Battle::on_destroyed(const sim::Destroyed& event) +{ + auto& registry = battle->registry(); + if (!registry.valid(event.victim)) + return; + const auto& victim = registry.get<sim::Transform>(event.victim); + const auto cross = registry.create(); + registry.emplace<Timed>(cross, 1.6); + registry.emplace<Cross>(cross, 0.2, 6.0); + registry.emplace<sim::Transform>(cross, victim.position, 0.0); +} + + +void Battle::on_ship_left(const stats::ShipLeft& event) { log.push_back(event); diff --git a/kurator/src/Battle.h b/kurator/src/Battle.h index 500318a..7a48e21 100644 --- a/kurator/src/Battle.h +++ b/kurator/src/Battle.h @@ -29,7 +29,8 @@ public: void draw() const override; void on_end(const sim::End& end); void on_hit(const sim::Hit& hit); - void on_ship_left(const stats::ShipLeft& event); + void on_destroyed(const sim::Destroyed& event); + void on_ship_left(const stats::ShipLeft& event); // duplicated? private: std::shared_ptr<Session> session; std::unique_ptr<sim::Battle> battle; diff --git a/kurator/src/components.h b/kurator/src/components.h index 7d0239f..bcd34e6 100644 --- a/kurator/src/components.h +++ b/kurator/src/components.h @@ -58,4 +58,13 @@ struct Line }; +struct Cross +{ + double phase; + double hlength; + Color color = GRAY; + double timer = 0.0; +}; + + } // namespace kurator diff --git a/sim/include/kurator/sim/events.h b/sim/include/kurator/sim/events.h index 71ce098..87cd430 100644 --- a/sim/include/kurator/sim/events.h +++ b/sim/include/kurator/sim/events.h @@ -22,5 +22,11 @@ struct End }; +struct Destroyed +{ + entt::entity victim; +}; + + } // namespace sim } // namespace kurator diff --git a/sim/src/BaseBattle.cpp b/sim/src/BaseBattle.cpp index 5173892..99a0199 100644 --- a/sim/src/BaseBattle.cpp +++ b/sim/src/BaseBattle.cpp @@ -105,6 +105,7 @@ BaseBattle::kill_off_dead() if (_registry.all_of<universe::UniqueIdentifier, Team>(entity)) { const auto& [identifier, team] = _registry.get<universe::UniqueIdentifier, Team>(entity); _dispatcher.trigger(stats::ShipLeft{time, identifier, team.id, true}); + _dispatcher.trigger(Destroyed{entity}); } _registry.destroy(entity); } |