/// <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());
            }
        }
    }
예제 #2
0
        /// <summary>
        /// Loads all connectors into the UI and Form
        /// </summary>
        /// <returns></returns>
        private async Task LoadConnectorsAsync(ILoadProgress P = null)
        {
            await Task.Run(() =>
            {
                P?.Report((0, "Loading connectors"));

                // Load connectors
                ConnectorCollection = ConnectorsManager.GetAll( );

                // Sort connectors

                P?.Report((50, "Sorting connectors"));
                Array.Sort(ConnectorCollection, (MangaConnector x, MangaConnector y) => x.Website.CompareTo(y.Website));

                // Populate connectors combobox
                P?.Report((75, "Populating UI with connectors"));

                cbConnectors.InvokeEx(cb =>
                {
                    if (ConnectorCollection.Count( ) < 1)
                    {
                        return;
                    }

                    foreach (var connector in ConnectorCollection)
                    {
                        cb.Items.Add(connector.Website);
                    }
                    cb.SelectedIndex = 0;
                });

                P?.Report((100, "Connectors loaded"));
            });
        }
 public static void OnShapeRotateStart(Shape shape)
 {
     SignalsUtils.DestroySignalsInCell(shape.Xindex, shape.Yindex);
     if (CurrentGameMode != GameMode.InvokeAdjuster)
     {
         ConnectorsManager.CheckAllConnections();
     }
 }
예제 #4
0
    private void OnTriggerEnter(Collider c) //проверка, пришел ли сигнал
    {
        if (IsStartConnector)
        {
            return;
        }

        ConnectorsManager.CheckAllConnections();
        if (ConnectorsManager.IsConnectedAtLastChecking(this))
        {
            SwitchToOn();
        }
    }
    public static void Generate()
    {
        _shapesCount = 0;

        var        astarNode = AstarPath.active.astarData.gridGraph.GetNearest(ConnectorsManager.StartConnector.transform.position).node;
        VectorInt2 nodeIndex = astarNode.position.ToVector3();
        var        node      = NodesGrid.Grid[nodeIndex.x, nodeIndex.y];

        GenerateRecursively(node, ConnectorsManager.StartConnector.CurrentDirection);

        int  i = 0;
        bool isAllConnected = false;

        while (i < 100 && isAllConnected == false)
        {
            RandomSafeRotateWithGenerationAllShapes();
            isAllConnected = ConnectorsManager.GetConnectedCount() == ConnectorsManager.TargetConnectors.Count();
            i++;
        }
        //if (isAllConnected)
        //    Debug.LogWarning("<color=green>AllConnected=true</color> iterations_count=" + i);


        RandomReplacementAllShapes();
        ShapesPathBaker.FindAndSavePath();

        FillEmptyNodes();

        RandomRotateAllShapes();
        //проверка, чтобы не был соединен ни один коннектор.
        while (ConnectorsManager.GetConnectedCount() > 0)
        {
            //Debug.LogWarning("<color=cyan>ConnectedCount>0</color>");
            RandomRotateAllShapes();
        }

        //EventMessenger.SendMessage(GameEvent.CompleteGeneration, null); //typeof(ShapesGenerator));
    }
 /// <summary>
 /// Вращает teeShape, пока он не будет соединен с другим, если это возможно. Если teeShape расположен в ноде с коннектором, то будет требоваться соединение еще и с коннектором
 /// </summary>
 private static void FastRotateToConnection(TeeShape teeShape, Direction direction)
 {
     for (int i = 0; i < 4; i++)
     {
         if (teeShape.HasConnection(direction))
         {
             var connector = ConnectorsManager.FindConnectorWithNearestShape(teeShape);
             if (connector == null)
             {
                 return;
             }
             if (teeShape.HasConnection(connector.CurrentDirection))
             {
                 return;
             }
         }
         if (i < 3)
         {
             teeShape.FastRotate();
         }
     }
     Debug.LogError("connection not found");
 }
    /// <summary>
    /// Рэндомная замена с проверкой существования пути
    /// </summary>
    private static void RandomReplacementAllShapes()
    {
        //количество подключенных коннекторов в начале этой функции
        int connectedConnectorsMaxCount = ConnectorsManager.GetConnectedCount();

        foreach (var node in NodesGrid.Grid)
        {
            if (node.Shape != null)
            {
                Direction currentDir       = node.Shape.CurrentDirection;
                Type      currentShapeType = node.Shape.GetType();

                RemoveShape(node);
                CreateRandomShape(node);

                //вращение с целью попытаться соединить ноду с другими
                int connectedCount = ConnectorsManager.GetConnectedCount();
                int i = 0;
                while (i < 3 && connectedCount < connectedConnectorsMaxCount)
                {
                    node.Shape.FastRotate();
                    connectedCount = ConnectorsManager.GetConnectedCount();
                    i++;
                }

                //возврат к состоянию до рендома
                if (connectedCount < connectedConnectorsMaxCount)
                {
                    RemoveShape(node);
                    CreateShape(node, currentShapeType);
                    node.Shape.FastRotateToDirection(currentDir);
                }

                connectedConnectorsMaxCount = Mathf.Max(connectedConnectorsMaxCount, connectedCount);
            }
        }
    }