fix splitter filters being lost when rotating in place and add test
This commit is contained in:
@@ -1719,29 +1719,25 @@ void BuildingSystem::rotateInPlace(BuildingId id, Rotation newRotation)
|
||||
// the new port set (REQ-MAT-INPUT-INTAKE).
|
||||
b.incomingItems.assign(b.inputPorts.size(), {});
|
||||
|
||||
// Re-register with BeltSystem (items on tile are discarded).
|
||||
if (b.type == BuildingType::Belt)
|
||||
// Re-register with BeltSystem (items on tile are discarded). A splitter's
|
||||
// filters live in BeltSystem and would be lost by removeTile, so capture
|
||||
// them first and hand them back to reregisterBeltTile (REQ-BLD-SPLITTER).
|
||||
if (isBeltSubsystemType(b.type))
|
||||
{
|
||||
std::vector<ItemType> splitterFilterA;
|
||||
std::vector<ItemType> splitterFilterB;
|
||||
if (b.type == BuildingType::Splitter)
|
||||
{
|
||||
if (const std::optional<BeltSystem::SplitterInfo> info =
|
||||
m_belts.getSplitterInfo(b.anchor))
|
||||
{
|
||||
splitterFilterA = info->filterA;
|
||||
splitterFilterB = info->filterB;
|
||||
}
|
||||
}
|
||||
|
||||
m_belts.removeTile(b.anchor);
|
||||
m_belts.placeBelt(b.anchor, newRotation);
|
||||
}
|
||||
else if (b.type == BuildingType::Splitter)
|
||||
{
|
||||
m_belts.removeTile(b.anchor);
|
||||
assert(mask.outputPorts.size() >= 2);
|
||||
m_belts.placeSplitter(b.anchor,
|
||||
mask.outputPorts[0].direction,
|
||||
mask.outputPorts[1].direction);
|
||||
}
|
||||
else if (b.type == BuildingType::TunnelEntry)
|
||||
{
|
||||
m_belts.removeTile(b.anchor);
|
||||
m_belts.placeTunnelEntry(b.anchor, newRotation, m_config.world.tunnelMaxDistance_tiles);
|
||||
}
|
||||
else if (b.type == BuildingType::TunnelExit)
|
||||
{
|
||||
m_belts.removeTile(b.anchor);
|
||||
m_belts.placeTunnelExit(b.anchor, newRotation);
|
||||
reregisterBeltTile(b, splitterFilterA, splitterFilterB);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user