diff --git a/src/balancing/ArenaView.cpp b/src/balancing/ArenaView.cpp index 99697e5..dd06d4b 100644 --- a/src/balancing/ArenaView.cpp +++ b/src/balancing/ArenaView.cpp @@ -4,11 +4,13 @@ #include #include +#include #include #include #include #include "ArenaSimulation.h" +#include "AttackBehavior.h" #include "Building.h" #include "BuildingSystem.h" #include "EntityHitTest.h" @@ -20,6 +22,7 @@ #include "HealthComponent.h" #include "PositionComponent.h" #include "ScrapSystem.h" +#include "SensorRangeComponent.h" #include "ShipIdentityComponent.h" #include "StationBodyComponent.h" @@ -38,6 +41,7 @@ ArenaView::ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals, , m_prevNonZeroSpeed(1.0) , m_rng(std::random_device{}()) , m_finishedEmitted(false) + , m_debugDraw(false) { setFocusPolicy(Qt::StrongFocus); @@ -167,6 +171,11 @@ void ArenaView::paintGL() drawBuildings(painter); drawStations(painter); drawScrap(painter); + if (m_debugDraw) + { + drawDebugSensorRanges(painter); + drawDebugTargetLines(painter); + } drawShips(painter); drawBeams(painter); } @@ -249,6 +258,16 @@ void ArenaView::mousePressEvent(QMouseEvent* event) QOpenGLWidget::mousePressEvent(event); } +void ArenaView::keyPressEvent(QKeyEvent* event) +{ + if (event->key() == Qt::Key_M) + { + m_debugDraw = !m_debugDraw; + return; + } + QOpenGLWidget::keyPressEvent(event); +} + // --------------------------------------------------------------------------- // Rendering // --------------------------------------------------------------------------- @@ -418,6 +437,55 @@ void ArenaView::drawShips(QPainter& painter) }); } +void ArenaView::drawDebugSensorRanges(QPainter& painter) +{ + painter.setBrush(Qt::NoBrush); + m_sim->admin().forEach( + [&](entt::entity /*e*/, const ShipIdentityComponent& si, + const PositionComponent& pos, const SensorRangeComponent& sensor) + { + const std::map::const_iterator it = + m_visuals->ships.find(si.schematicId); + if (it == m_visuals->ships.end()) { return; } + + const QPointF center = worldToWidget(pos.value); + const qreal radiusPx = static_cast(sensor.value_tiles) + * static_cast(tilePx()); + painter.setPen(QPen(it->second.outline, 1)); + painter.drawEllipse(center, radiusPx, radiusPx); + }); +} + +void ArenaView::drawDebugTargetLines(QPainter& painter) +{ + m_sim->admin().forEach( + [&](entt::entity /*e*/, const ShipIdentityComponent& /*si*/, + const PositionComponent& pos, const FactionComponent& fac, + const AttackBehavior& attack) + { + if (!attack.currentTarget.has_value()) { return; } + + const std::optional targetPos = + entityPosition(*attack.currentTarget); + if (!targetPos.has_value()) { return; } + + // Color the line by the ship's team, matching the per-side HQ/station + // colors used elsewhere in the arena (team 1 player, team 2 enemy). + const BuildingType visType = fac.isEnemy + ? BuildingType::EnemyDefenceStation + : BuildingType::PlayerDefenceStation; + const std::map::const_iterator it = + m_visuals->buildings.find(visType); + if (it == m_visuals->buildings.end()) { return; } + + QColor lineColor = it->second.fill; + lineColor.setAlpha(128); + painter.setPen(QPen(lineColor, 1)); + painter.drawLine(worldToWidget(pos.value), worldToWidget(*targetPos)); + }); +} + void ArenaView::drawBeams(QPainter& painter) { painter.setPen(QPen(m_visuals->beams.color, m_visuals->beams.widthPx)); diff --git a/src/balancing/ArenaView.h b/src/balancing/ArenaView.h index 83035a6..a519339 100644 --- a/src/balancing/ArenaView.h +++ b/src/balancing/ArenaView.h @@ -39,6 +39,7 @@ public: protected: void paintGL() override; void mousePressEvent(QMouseEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; private slots: void onFrame(); @@ -51,6 +52,8 @@ private: void drawStations(QPainter& painter); void drawScrap(QPainter& painter); void drawShips(QPainter& painter); + void drawDebugSensorRanges(QPainter& painter); + void drawDebugTargetLines(QPainter& painter); void drawBeams(QPainter& painter); float tilePx() const; @@ -86,4 +89,6 @@ private: bool m_finishedEmitted; std::optional m_selectedEntity; + + bool m_debugDraw; };