migrate every factory query off BuildingSystem onto the free functions
This commit is contained in:
@@ -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>();
|
||||
|
||||
Reference in New Issue
Block a user