From 4e3dc519813655ee1d79ab60fcd9a74311154b69 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Fri, 22 May 2026 21:15:26 +0200 Subject: [PATCH] fix stations were not drawn --- src/balancing/ArenaView.cpp | 44 ++++++++++++++++++++++++++ src/balancing/ArenaView.h | 1 + src/lib/sim/BuildingSystem.cpp | 4 +-- src/ui/GameWorldView.cpp | 58 +++++++++++++++++++++++++++++----- src/ui/GameWorldView.h | 1 + 5 files changed, 97 insertions(+), 11 deletions(-) diff --git a/src/balancing/ArenaView.cpp b/src/balancing/ArenaView.cpp index 6cb3cf2..b1a0b4a 100644 --- a/src/balancing/ArenaView.cpp +++ b/src/balancing/ArenaView.cpp @@ -145,6 +145,7 @@ void ArenaView::paintGL() drawTiles(painter); drawBuildings(painter); + //drawStations(painter); drawScrap(painter); drawShips(painter); drawBeams(painter); @@ -264,6 +265,48 @@ void ArenaView::drawScrap(QPainter& painter) } } +void ArenaView::drawStations(QPainter& painter) +{ + m_sim->admin().forEach( + [&](entt::entity /*e*/, const StationBody& sb, const Faction& f, const Health& h) + { + const BuildingType visType = f.isEnemy + ? BuildingType::EnemyDefenceStation + : BuildingType::PlayerDefenceStation; + const std::map::const_iterator it = + m_visuals->buildings.find(visType); + if (it == m_visuals->buildings.end()) { return; } + const BuildingVisuals& bv = it->second; + + painter.setPen(Qt::NoPen); + for (const QPoint& cell : sb.bodyCells) + { + painter.fillRect(tileRect(cell), bv.fill); + } + + const QPointF tl = tileToWidget(sb.anchor); + const QRectF bboxRect(tl.x(), tl.y(), + sb.footprint.width() * static_cast(tilePx()), + sb.footprint.height() * static_cast(tilePx())); + + painter.setPen(QPen(bv.outline, 1)); + painter.setBrush(Qt::NoBrush); + painter.drawRect(bboxRect); + + if (h.maxHp > 0.0f) + { + const float fraction = std::max(0.0f, h.hp / h.maxHp); + const qreal barH = static_cast(tilePx()) * 0.12; + const qreal barY = bboxRect.bottom() + 1.0; + const qreal barW = bboxRect.width(); + painter.fillRect(QRectF(bboxRect.left(), barY, barW, barH), + QColor(60, 60, 60)); + painter.fillRect(QRectF(bboxRect.left(), barY, barW * static_cast(fraction), barH), + f.isEnemy ? QColor(200, 60, 60) : QColor(60, 200, 60)); + } + }); +} + void ArenaView::drawShips(QPainter& painter) { m_sim->admin().forEach( @@ -312,3 +355,4 @@ void ArenaView::drawBeams(QPainter& painter) worldToWidget(*targetPos + beam.targetOffset)); } } + diff --git a/src/balancing/ArenaView.h b/src/balancing/ArenaView.h index 1bf8859..7efaf04 100644 --- a/src/balancing/ArenaView.h +++ b/src/balancing/ArenaView.h @@ -43,6 +43,7 @@ private slots: private: void drawTiles(QPainter& painter); void drawBuildings(QPainter& painter); + void drawStations(QPainter& painter); void drawScrap(QPainter& painter); void drawShips(QPainter& painter); void drawBeams(QPainter& painter); diff --git a/src/lib/sim/BuildingSystem.cpp b/src/lib/sim/BuildingSystem.cpp index 273848d..37f710e 100644 --- a/src/lib/sim/BuildingSystem.cpp +++ b/src/lib/sim/BuildingSystem.cpp @@ -600,9 +600,7 @@ void BuildingSystem::tickProduction(Tick currentTick) building.type == BuildingType::Splitter || building.type == BuildingType::Shipyard || building.type == BuildingType::SalvageBay || - building.type == BuildingType::Hq || - building.type == BuildingType::PlayerDefenceStation || - building.type == BuildingType::EnemyDefenceStation) + building.type == BuildingType::Hq) { continue; } diff --git a/src/ui/GameWorldView.cpp b/src/ui/GameWorldView.cpp index 244161d..acfa8de 100644 --- a/src/ui/GameWorldView.cpp +++ b/src/ui/GameWorldView.cpp @@ -262,6 +262,7 @@ void GameWorldView::paintGL() drawTiles(painter); drawBuildings(painter); + drawStations(painter); drawBeltItems(painter); drawScrap(painter); if (m_debugDraw) { drawDebugSensorRanges(painter); } @@ -342,17 +343,16 @@ float GameWorldView::enemyStationRightEdge() const { float rightX = static_cast(m_config->world.regions.playerBufferWidth + m_config->world.regions.contestZoneWidth); - for (const Building& b : m_sim->buildings().allBuildings()) - { - if (b.type == BuildingType::EnemyDefenceStation) + m_sim->admin().forEach( + [&rightX](entt::entity /*e*/, const StationBody& sb, const Faction& f) { - for (const QPoint& cell : b.bodyCells) + if (!f.isEnemy) { return; } + for (const QPoint& cell : sb.bodyCells) { const float cx = static_cast(cell.x() + 1); if (cx > rightX) { rightX = cx; } } - } - } + }); return rightX; } @@ -792,6 +792,49 @@ void GameWorldView::drawScrap(QPainter& painter) } } +void GameWorldView::drawStations(QPainter& painter) +{ + m_sim->admin().forEach( + [&](entt::entity /*e*/, const StationBody& sb, const Faction& f, const Health& h) + { + const BuildingType visType = f.isEnemy + ? BuildingType::EnemyDefenceStation + : BuildingType::PlayerDefenceStation; + const std::map::const_iterator it = + m_visuals->buildings.find(visType); + if (it == m_visuals->buildings.end()) { return; } + const BuildingVisuals& bv = it->second; + + painter.setPen(Qt::NoPen); + for (const QPoint& cell : sb.bodyCells) + { + painter.fillRect(tileRect(cell), bv.fill); + } + + const QPointF tl = tileToWidget(QPoint(sb.anchor.x(), sb.anchor.y())); + const QRectF bboxRect(tl.x(), tl.y(), + sb.footprint.width() * static_cast(tilePx()), + sb.footprint.height() * static_cast(tilePx())); + + painter.setPen(QPen(bv.outline, 1)); + painter.setBrush(Qt::NoBrush); + painter.drawRect(bboxRect); + + // HP bar below footprint. + if (h.maxHp > 0.0f) + { + const float fraction = std::max(0.0f, h.hp / h.maxHp); + const qreal barH = static_cast(tilePx()) * 0.12; + const qreal barY = bboxRect.bottom() + 1.0; + const qreal barW = bboxRect.width(); + painter.fillRect(QRectF(bboxRect.left(), barY, barW, barH), + QColor(60, 60, 60)); + painter.fillRect(QRectF(bboxRect.left(), barY, barW * static_cast(fraction), barH), + f.isEnemy ? QColor(200, 60, 60) : QColor(60, 200, 60)); + } + }); +} + void GameWorldView::drawShips(QPainter& painter) { m_sim->admin().forEach( @@ -1133,8 +1176,7 @@ void GameWorldView::mousePressEvent(QMouseEvent* event) if (hovered != kInvalidEntityId) { const Building* b = m_sim->buildings().findBuilding(hovered); - const bool isProtected = b && (b->type == BuildingType::Hq - || b->type == BuildingType::PlayerDefenceStation); + const bool isProtected = b && b->type == BuildingType::Hq; if (!isProtected) { m_sim->demolish(hovered); diff --git a/src/ui/GameWorldView.h b/src/ui/GameWorldView.h index ddb3201..de99f09 100644 --- a/src/ui/GameWorldView.h +++ b/src/ui/GameWorldView.h @@ -81,6 +81,7 @@ private slots: private: void drawTiles(QPainter& painter); void drawBuildings(QPainter& painter); + void drawStations(QPainter& painter); void drawBeltItems(QPainter& painter); void drawScrap(QPainter& painter); void drawShips(QPainter& painter);