/// <summary> /// Вращение всех shape так, чтобы не пропали соединения с коннекторами. Также генерирует shape-ы, если у повернутого shape есть свободные выходы в соседние пустые ноды. /// </summary> private static void RandomSafeRotateWithGenerationAllShapes() { //количество подключенных коннекторов в начале этой функции int connectedConnectorsMaxCount = ConnectorsManager.GetConnectedCount(); foreach (var node in NodesGrid.Grid) { if (node.Shape != null) { Direction currentDir = node.Shape.CurrentDirection; RandomRotateShape(node.Shape); int connectedCount = ConnectorsManager.GetConnectedCount(); //возврат к состоянию до рэндомного вращения if (connectedCount < connectedConnectorsMaxCount) { node.Shape.FastRotateToDirection(currentDir); } connectedConnectorsMaxCount = Mathf.Max(connectedConnectorsMaxCount, connectedCount); } //генерация ноды, если свободная клетка List <KeyValuePair <Node, Direction> > nodes = NodesGrid.FindAvailableNeighborNodesForShapeSides(node); foreach (var nodeDirPair in nodes) { GenerateRecursively(nodeDirPair.Key, nodeDirPair.Value.GetOpposite()); } } }
private static void GenerateRecursively(Node node, Direction prevOutDirection) { if (!node.IsAvailable) { return; } CreateShape(node, typeof(TeeShape)); FastRotateToConnection((TeeShape)node.Shape, prevOutDirection); //генерация ноды, если свободная клетка List <KeyValuePair <Node, Direction> > nodes = NodesGrid.FindAvailableNeighborNodesForShapeSides(node); foreach (var nodeDirPair in nodes) { GenerateRecursively(nodeDirPair.Key, nodeDirPair.Value.GetOpposite()); } }