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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user