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>();

View File

@@ -1,4 +1,5 @@
#include "MainWindow.h"
#include "FactoryQueries.h"
#include <map>
#include <random>
@@ -277,9 +278,9 @@ void MainWindow::handleEvent(std::shared_ptr<const LayoutDialogRequestedEvent> e
{
// A construction site has no Building yet; fall back to its site record so
// the shipyard layout can be configured before it is built (REQ-BLD-SITE-CONFIG).
const Building* b = m_sim->getBuildings().findBuilding(event->shipyardId);
const Building* b = findBuilding(m_sim->getFactoryState(), event->shipyardId);
const ConstructionSite* s =
b ? nullptr : m_sim->getBuildings().findSite(event->shipyardId);
b ? nullptr : findSite(m_sim->getFactoryState(), event->shipyardId);
if (!b && !s)
{
return;
@@ -304,9 +305,9 @@ void MainWindow::handleEvent(std::shared_ptr<const RecipeSelectionRequestedEvent
// A construction site has no Building yet; fall back to its site record so
// the recipe/schematic can be chosen before it is built (REQ-BLD-SITE-CONFIG).
const Building* b = m_sim->getBuildings().findBuilding(event->buildingId);
const Building* b = findBuilding(m_sim->getFactoryState(), event->buildingId);
const ConstructionSite* s =
b ? nullptr : m_sim->getBuildings().findSite(event->buildingId);
b ? nullptr : findSite(m_sim->getFactoryState(), event->buildingId);
if (!b && !s)
{
return;

View File

@@ -1,4 +1,5 @@
#include "SelectedBuildingPanel.h"
#include "FactoryQueries.h"
#include <algorithm>
#include <cctype>
@@ -234,8 +235,8 @@ void SelectedBuildingPanel::buildSingle(BuildingId id)
m_singleBuildingId = id;
hideAllWidgets();
const Building* b = m_sim->getBuildings().findBuilding(id);
const ConstructionSite* s = b ? nullptr : m_sim->getBuildings().findSite(id);
const Building* b = findBuilding(m_sim->getFactoryState(), id);
const ConstructionSite* s = b ? nullptr : findSite(m_sim->getFactoryState(), id);
if (!b && !s)
{
buildEmpty();
@@ -602,7 +603,7 @@ void SelectedBuildingPanel::refreshSelectionDisplay(RefreshReason reason)
// category owns the panel there is none: yieldToFieldSelection() has cleared it, so
// this returns immediately and the field panel refreshes itself off the same events.
if (!m_singleBuildingId.has_value()) { return; }
const Building* b = m_sim->getBuildings().findBuilding(*m_singleBuildingId);
const Building* b = findBuilding(m_sim->getFactoryState(), *m_singleBuildingId);
if (b)
{
if (m_titleLabel->text().startsWith(tr("(Building) ")))
@@ -615,7 +616,7 @@ void SelectedBuildingPanel::refreshSelectionDisplay(RefreshReason reason)
}
return;
}
const ConstructionSite* s = m_sim->getBuildings().findSite(*m_singleBuildingId);
const ConstructionSite* s = findSite(m_sim->getFactoryState(), *m_singleBuildingId);
if (s)
{
// A periodic tick only advances construction progress, so update just the
@@ -649,13 +650,13 @@ void SelectedBuildingPanel::buildMulti(const std::vector<BuildingId>& ids)
std::map<BuildingType, int> counts;
for (BuildingId id : ids)
{
const Building* b = m_sim->getBuildings().findBuilding(id);
const Building* b = findBuilding(m_sim->getFactoryState(), id);
if (b)
{
counts[b->type]++;
continue;
}
const ConstructionSite* s = m_sim->getBuildings().findSite(id);
const ConstructionSite* s = findSite(m_sim->getFactoryState(), id);
if (s)
{
counts[s->type]++;
@@ -817,7 +818,7 @@ void SelectedBuildingPanel::onClearBelt()
std::vector<QPoint> tiles;
for (BuildingId id : m_selectedBuildingIds)
{
const Building* b = m_sim->getBuildings().findBuilding(id);
const Building* b = findBuilding(m_sim->getFactoryState(), id);
if (b && isBeltSubsystemType(b->type))
{
for (const QPoint& cell : b->bodyCells)