migrate every factory query off BuildingSystem onto the free functions

This commit is contained in:
2026-08-05 06:45:49 +02:00
parent 1fb63cce4e
commit 58b94223f7
20 changed files with 212 additions and 244 deletions

View File

@@ -1,4 +1,5 @@
#include "GameWorldView.h"
#include "FactoryQueries.h"
#include <algorithm>
#include <cctype>
@@ -577,7 +578,7 @@ QRect GameWorldView::getViewportRect() const
float GameWorldView::getAsteroidLeftEdge() const
{
float leftX = -static_cast<float>(m_sim->getCurrentAsteroidWidth_tiles());
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
for (const QPoint& cell : b.bodyCells)
{
@@ -672,7 +673,7 @@ bool GameWorldView::isValidPlacement(BuildingType type, QPoint anchor,
bool anyOccupied = false;
for (const QPoint& relCell : parsed.bodyCells)
{
if (m_sim->getBuildings().isTileOccupied(anchor + relCell))
if (isTileOccupied(m_sim->getFactoryState(), anchor + relCell))
{
anyOccupied = true;
break;
@@ -688,7 +689,7 @@ bool GameWorldView::isValidPlacement(BuildingType type, QPoint anchor,
std::optional<BuildingId> GameWorldView::buildingAtTile(QPoint tile) const
{
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
for (const QPoint& cell : b.bodyCells)
{
@@ -703,7 +704,7 @@ std::optional<BuildingId> GameWorldView::buildingAtTile(QPoint tile) const
std::optional<BuildingId> GameWorldView::siteAtTile(QPoint tile) const
{
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
for (const ConstructionSite& s : getAllSites(m_sim->getFactoryState()))
{
for (const QPoint& cell : s.bodyCells)
{
@@ -725,7 +726,7 @@ std::vector<BuildingId> GameWorldView::buildingsInBox(QPoint cornerA, QPoint cor
const int y1 = std::max(cornerA.y(), cornerB.y());
std::vector<BuildingId> ids;
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
for (const QPoint& cell : b.bodyCells)
{
@@ -737,7 +738,7 @@ std::vector<BuildingId> GameWorldView::buildingsInBox(QPoint cornerA, QPoint cor
}
}
}
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
for (const ConstructionSite& s : getAllSites(m_sim->getFactoryState()))
{
for (const QPoint& cell : s.bodyCells)
{
@@ -951,14 +952,14 @@ TunnelTileMap GameWorldView::collectTunnelTiles() const
// single-cell tile, so a just-placed tunnel (not yet constructed) is matchable
// (REQ-BLD-TUNNEL-MODE, REQ-BLD-TUNNEL-SELECT-HIGHLIGHT).
TunnelTileMap tunnels;
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
if (b.type == BuildingType::TunnelEntry || b.type == BuildingType::TunnelExit)
{
tunnels[b.anchor] = TunnelTileInfo{b.type, b.rotation};
}
}
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
for (const ConstructionSite& s : getAllSites(m_sim->getFactoryState()))
{
if (s.type == BuildingType::TunnelEntry || s.type == BuildingType::TunnelExit)
{
@@ -1034,7 +1035,7 @@ void GameWorldView::placeAtTile(QPoint tile)
|| type == BuildingType::TunnelEntry
|| type == BuildingType::TunnelExit)
{
if (!m_sim->getBuildings().isTileOccupied(tile) && canAfford(type))
if (!isTileOccupied(m_sim->getFactoryState(), tile) && canAfford(type))
{
enqueuePlaceBuilding(type, tile, m_ghostRotation);
}
@@ -1061,7 +1062,7 @@ void GameWorldView::recomputeBeltDragPath(QPoint cursorTile)
std::optional<BuildingType> targetType;
if (targetId.has_value())
{
if (const Building* building = m_sim->getBuildings().findBuilding(*targetId))
if (const Building* building = findBuilding(m_sim->getFactoryState(), *targetId))
{
targetType = building->type;
}
@@ -1069,7 +1070,7 @@ void GameWorldView::recomputeBeltDragPath(QPoint cursorTile)
else if (std::optional<BuildingId> siteId = siteAtTile(cursorTile); siteId.has_value())
{
targetId = siteId;
if (const ConstructionSite* site = m_sim->getBuildings().findSite(*siteId))
if (const ConstructionSite* site = findSite(m_sim->getFactoryState(), *siteId))
{
targetType = site->type;
}
@@ -1298,7 +1299,7 @@ bool GameWorldView::drawBuildingIcon(QPainter& painter, BuildingType type,
void GameWorldView::drawBuildings(QPainter& painter)
{
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
const std::map<BuildingType, BuildingVisuals>::const_iterator it =
m_visuals->buildings.find(b.type);
@@ -1365,7 +1366,7 @@ void GameWorldView::drawBuildings(QPainter& painter)
}
painter.setOpacity(0.5);
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
for (const ConstructionSite& s : getAllSites(m_sim->getFactoryState()))
{
const std::map<BuildingType, BuildingVisuals>::const_iterator it =
m_visuals->buildings.find(s.type);
@@ -1442,7 +1443,7 @@ void GameWorldView::drawBuildings(QPainter& painter)
// after every building and construction site fill so a belt (or other tile)
// placed directly below the HQ cannot overpaint the bar (REQ-UI-STATUS-LIGHT
// neighbours case, same rationale as the selection highlights below).
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
if (b.type != BuildingType::Hq) { continue; }
const QPointF tl = tileToWidget(b.anchor);
@@ -1473,12 +1474,12 @@ std::optional<QRectF> GameWorldView::footprintWidgetRect(BuildingId id) const
std::optional<QPoint> anchor;
std::optional<QSize> footprint;
if (const Building* b = m_sim->getBuildings().findBuilding(id))
if (const Building* b = findBuilding(m_sim->getFactoryState(), id))
{
anchor = b->anchor;
footprint = b->footprint;
}
else if (const ConstructionSite* s = m_sim->getBuildings().findSite(id))
else if (const ConstructionSite* s = findSite(m_sim->getFactoryState(), id))
{
anchor = s->anchor;
footprint = s->footprint;
@@ -1530,13 +1531,13 @@ void GameWorldView::drawCopyConfigFeedback(QPainter& painter)
painter.setPen(Qt::NoPen);
painter.setBrush(color);
const BuildingType type = m_copiedConfig->type;
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
if (b.type != type) { continue; }
const std::optional<QRectF> rect = footprintWidgetRect(b.id);
if (rect.has_value()) { painter.drawRect(*rect); }
}
for (const ConstructionSite& s : m_sim->getBuildings().getAllSites())
for (const ConstructionSite& s : getAllSites(m_sim->getFactoryState()))
{
if (s.type != type) { continue; }
const std::optional<QRectF> rect = footprintWidgetRect(s.id);
@@ -1571,7 +1572,7 @@ void GameWorldView::drawPortItems(QPainter& painter)
const double margin = kPortMarginTiles * static_cast<double>(getTilePx());
QRegion clip(rect());
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
if (b.type == BuildingType::Belt || b.type == BuildingType::Splitter
|| b.type == BuildingType::TunnelEntry || b.type == BuildingType::TunnelExit)
@@ -1982,11 +1983,11 @@ void GameWorldView::drawSelectedTunnelConnections(QPainter& painter)
std::optional<QPoint> anchor;
std::optional<BuildingType> type;
Rotation rotation = Rotation::East;
if (const Building* b = m_sim->getBuildings().findBuilding(id))
if (const Building* b = findBuilding(m_sim->getFactoryState(), id))
{
anchor = b->anchor; type = b->type; rotation = b->rotation;
}
else if (const ConstructionSite* s = m_sim->getBuildings().findSite(id))
else if (const ConstructionSite* s = findSite(m_sim->getFactoryState(), id))
{
anchor = s->anchor; type = s->type; rotation = s->rotation;
}
@@ -2091,7 +2092,7 @@ void GameWorldView::drawOverlays(QPainter& painter)
// Queued for deconstruction: tint every building currently in the
// deconstruction queue, regardless of mode (REQ-BLD-DECON-QUEUE).
for (const Building& b : m_sim->getBuildings().getAllBuildings())
for (const Building& b : getAllBuildings(m_sim->getFactoryState()))
{
if (!b.queuedForDeconstruction) { continue; }
for (const QPoint& cell : b.bodyCells)
@@ -2106,12 +2107,12 @@ void GameWorldView::drawOverlays(QPainter& painter)
{
for (BuildingId id : buildingsInBox(m_boxStartTile, m_boxCurrentTile))
{
const Building* b = m_sim->getBuildings().findBuilding(id);
const Building* b = findBuilding(m_sim->getFactoryState(), id);
if (b && b->type == BuildingType::Hq) { continue; }
const std::vector<QPoint>* cells = nullptr;
const ConstructionSite* s = nullptr;
if (b) { cells = &b->bodyCells; }
else if ((s = m_sim->getBuildings().findSite(id))) { cells = &s->bodyCells; }
else if ((s = findSite(m_sim->getFactoryState(), id))) { cells = &s->bodyCells; }
if (cells)
{
for (const QPoint& cell : *cells)
@@ -2123,7 +2124,7 @@ void GameWorldView::drawOverlays(QPainter& painter)
}
else if (m_deconstructMode && m_deconstructHoverBuildingId.has_value())
{
const Building* b = m_sim->getBuildings().findBuilding(*m_deconstructHoverBuildingId);
const Building* b = findBuilding(m_sim->getFactoryState(), *m_deconstructHoverBuildingId);
if (b)
{
for (const QPoint& cell : b->bodyCells)
@@ -2748,7 +2749,7 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
if (m_deconstructMode)
{
const BuildingSystem& buildings = m_sim->getBuildings();
const FactoryState& factory = m_sim->getFactoryState();
// Split covered ids into construction sites (removed instantly) and
// operational deconstructible buildings (the HQ is protected; player
@@ -2757,12 +2758,12 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
std::vector<BuildingId> operational;
for (BuildingId id : boxIds)
{
if (const Building* b = buildings.findBuilding(id))
if (const Building* b = findBuilding(factory, id))
{
if (b->type == BuildingType::Hq) { continue; }
operational.push_back(id);
}
else if (buildings.findSite(id))
else if (findSite(factory, id))
{
sites.push_back(id);
}
@@ -2784,7 +2785,7 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
bool allQueued = !operational.empty();
for (BuildingId id : operational)
{
if (!buildings.isQueuedForDeconstruction(id)) { allQueued = false; break; }
if (!isQueuedForDeconstruction(factory, id)) { allQueued = false; break; }
}
for (BuildingId id : operational)
{
@@ -2795,7 +2796,7 @@ void GameWorldView::mouseReleaseEvent(QMouseEvent* event)
command->id = id;
enqueueCommand(command);
}
else if (!buildings.isQueuedForDeconstruction(id))
else if (!isQueuedForDeconstruction(factory, id))
{
std::shared_ptr<DeconstructCommand> command =
std::make_shared<DeconstructCommand>();
@@ -2997,7 +2998,7 @@ void GameWorldView::pasteConfigTo(BuildingId id)
{
// Operational splitters are configured by tile; sites by BuildingId
// (mirrors SelectedBuildingPanel::onSplitterFilterChanged).
if (const Building* building = m_sim->getBuildings().findBuilding(id))
if (const Building* building = findBuilding(m_sim->getFactoryState(), id))
{
std::shared_ptr<SetSplitterFiltersCommand> command =
std::make_shared<SetSplitterFiltersCommand>();