Kolja Strohm 11 часов назад
Родитель
Сommit
4545916a8a
2 измененных файлов с 49 добавлено и 16 удалено
  1. 43 14
      FactoryCraft/QuestGraph.cpp
  2. 6 2
      FactoryCraft/QuestGraph.h

+ 43 - 14
FactoryCraft/QuestGraph.cpp

@@ -313,6 +313,18 @@ int Connection::getVx() const
     return vx;
 }
 
+bool Connection::hasTarget(AndNode* zAndNode, int index) const
+{
+    for (auto target : targets)
+    {
+        if (target.zTarget == zAndNode && target.targetIndex == index)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 AndNode::AndNode()
     : ZeichnungHintergrund()
 {
@@ -515,14 +527,19 @@ bool OrConnection::isActive() const
     return 0;
 }
 
-bool OrConnection::isHorizontalLineConflict(int y) const
+bool OrConnection::isHorizontalLineConflict(
+    int y, Connection* zIgnoredIncommingConnection) const
 {
     for (AndNode* node : andNodes)
     {
         for (int i = 0; i < node->getConnectionCount(); i++)
         {
-            Punkt connection = node->getTargetPosition(i);
-            if (abs(y - connection.y) < 5) return 1;
+            if (!zIgnoredIncommingConnection || !zIgnoredIncommingConnection
+                    ->hasTarget(node, i))
+            {
+                Punkt connection = node->getTargetPosition(i);
+                if (abs(y - connection.y) < 5) return 1;
+            }
         }
     }
     return 0;
@@ -990,25 +1007,32 @@ const Framework::RCArray<QuestGraphItem>& QuestGraphItemLayer::getItems() const
     return items;
 }
 
-int QuestGraphItemLayer::getLeyerHeight() const
+int QuestGraphItemLayer::getLeyerHeight(int& minY) const
 {
-    int start = 0;
+    minY = 0;
     int end = 0;
     bool first = 1;
     for (QuestGraphItem* item : items)
     {
-        if (first || item->getY() < start) start = item->getY();
+        if (first || item->getY() < minY) minY = item->getY();
         if (first || item->getY() + item->getHeight() > end)
             end = item->getY() + item->getHeight();
         first = 0;
     }
-    return end - start;
+    return end - minY;
+}
+
+int QuestGraphItemLayer::getLeyerHeight() const
+{
+    int y;
+    return getLeyerHeight(y);
 }
 
 void QuestGraphItemLayer::centerVertically(int pos)
 {
-    int height = getLeyerHeight();
-    int yOffset = pos - height / 2;
+    int minY = 0;
+    int height = getLeyerHeight(minY);
+    int yOffset = pos - height / 2 - minY;
     for (QuestGraphItem* item : items)
     {
         item->setPosition(item->getX(), item->getY() + yOffset);
@@ -1023,17 +1047,19 @@ void QuestGraphItemLayer::resolveHorizontalConflicts(
     for (QuestGraphItem* item : items)
     {
         int outgoingY = item->getY() + item->getHeight() / 2;
-        if (zNextLayer->isHorizontalLineConflict(outgoingY))
+        if (zNextLayer->isHorizontalLineConflict(outgoingY, item->zOutgoingConnection()))
         {
             int offset = 0;
             for (int i = 1; i <= 10; i++)
             {
-                if (!zNextLayer->isHorizontalLineConflict(outgoingY - i))
+                if (!zNextLayer->isHorizontalLineConflict(
+                        outgoingY - i, item->zOutgoingConnection()))
                 {
                     offset = -i;
                     break;
                 }
-                if (!zNextLayer->isHorizontalLineConflict(outgoingY + i))
+                if (!zNextLayer->isHorizontalLineConflict(
+                        outgoingY + i, item->zOutgoingConnection()))
                 {
                     offset = i;
                     break;
@@ -1046,11 +1072,14 @@ void QuestGraphItemLayer::resolveHorizontalConflicts(
     }
 }
 
-bool QuestGraphItemLayer::isHorizontalLineConflict(int y) const
+bool QuestGraphItemLayer::isHorizontalLineConflict(
+    int y, Connection* zIgnoredIncommingConnection) const
 {
     for (QuestGraphItem* item : items)
     {
-        if (item->zIncommingConnection()->isHorizontalLineConflict(y)) return 1;
+        if (item->zIncommingConnection()->isHorizontalLineConflict(
+                y, zIgnoredIncommingConnection))
+            return 1;
     }
     return 0;
 }

+ 6 - 2
FactoryCraft/QuestGraph.h

@@ -85,6 +85,7 @@ public:
     int getTargetCount() const;
     int getVerticalLength() const;
     int getVx() const;
+    bool hasTarget(AndNode* zAndNode, int index) const;
 };
 
 class AndNode : public Framework::ZeichnungHintergrund
@@ -118,7 +119,8 @@ public:
     void layout();
     int getNeededHeight() const;
     bool isActive() const;
-    bool isHorizontalLineConflict(int y) const;
+    bool isHorizontalLineConflict(
+        int y, Connection* zIgnoredIncommingConnection) const;
 };
 
 class QuestGraphItem : public Framework::ZeichnungHintergrund
@@ -190,10 +192,12 @@ public:
     int fixItemPositions(int x);
     void sortConnections();
     const Framework::RCArray<QuestGraphItem>& getItems() const;
+    int getLeyerHeight(int& minY) const;
     int getLeyerHeight() const;
     void centerVertically(int pos);
     void resolveHorizontalConflicts(const QuestGraphItemLayer* zNextLayer);
-    bool isHorizontalLineConflict(int y) const;
+    bool isHorizontalLineConflict(
+        int y, Connection* zIgnoredIncommingConnection) const;
 };
 
 class QuestGraph : public Framework::ZeichnungHintergrund