fix stations were not drawn

This commit is contained in:
2026-05-22 21:15:26 +02:00
parent 9d20048705
commit 4e3dc51981
5 changed files with 97 additions and 11 deletions

View File

@@ -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<float>(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<StationBody, Faction>(
[&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<float>(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<StationBody, Faction, Health>(
[&](entt::entity /*e*/, const StationBody& sb, const Faction& f, const Health& h)
{
const BuildingType visType = f.isEnemy
? BuildingType::EnemyDefenceStation
: BuildingType::PlayerDefenceStation;
const std::map<BuildingType, BuildingVisuals>::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<qreal>(tilePx()),
sb.footprint.height() * static_cast<qreal>(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<qreal>(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<qreal>(fraction), barH),
f.isEnemy ? QColor(200, 60, 60) : QColor(60, 200, 60));
}
});
}
void GameWorldView::drawShips(QPainter& painter)
{
m_sim->admin().forEach<ShipIdentity, Position, Facing, Faction>(
@@ -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);