//Megcserél két piece-t
    public void FlipPieces(Point firstPoint, Point secondPoint, bool isItMain)
    {
        if (GetValueofPoint(firstPoint) < 0)
        {
            return;
        }

        GridCell firstCell  = GetCellAtPoint(firstPoint);
        Piece    firstPiece = firstCell.GetPieceFromCell();

        //Ellenőrzi a másik elemet is
        if (GetValueofPoint(secondPoint) > 0)
        {
            GridCell secondCell  = GetCellAtPoint(secondPoint);
            Piece    secondPiece = secondCell.GetPieceFromCell();

            firstCell.AddPieceToCell(secondPiece);
            secondCell.AddPieceToCell(firstPiece);

            if (isItMain)
            {
                flippedPieceList.Add(new FlippedPieces(firstPiece, secondPiece));
            }

            //Hozzáadjuk őket, mert kell az update
            updatePieceList.Add(firstPiece);
            updatePieceList.Add(secondPiece);
        }
        //Ha a második piece nem érvényes (pl hole, blank stb) akkor nincs csere
        else
        {
            ResetPiece(firstPiece);
        }
    }
    //A már rendezett grid értékek szerint létrehozza a Piece elemeket és a cellákhoz adja őket
    void CreateBoard()
    {
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                GridCell currentCell = GetCellAtPoint(new Point(x, y));
                if (currentCell.valueOfCell <= 0)
                {
                    continue;
                }

                GameObject    point        = Instantiate(piecePrefab, gameBoard);
                Piece         piece        = point.GetComponent <Piece>();
                RectTransform basePosition = point.GetComponent <RectTransform>();
                basePosition.anchoredPosition = new Vector2(imageSize / 2 + (imageSize * x), -imageSize / 2 - (imageSize * y));
                piece.Initialize(currentCell.valueOfCell, new Point(x, y), dataController.elements[currentCell.valueOfCell - 1].returnSprite());
                currentCell.AddPieceToCell(piece);
            }
        }
    }
    void ApplyGravityToColumn(int x)
    {
        //Lentről felfele vizsgáljuk a gridet.
        for (int y = (height - 1); y >= 0; y--)
        {
            Point    checkedPoint = new Point(x, y);
            GridCell cell         = GetCellAtPoint(checkedPoint);
            int      val          = GetValueofPoint(checkedPoint);
            if (val != 0)
            {
                continue;
            }

            //A következő elemeket vizsgáljuk
            for (int my = (y - 1); my >= -1; my--)
            {
                Point nextPoint = new Point(x, my);
                int   nextval   = GetValueofPoint(nextPoint);
                if (nextval == 0)
                {
                    continue;
                }

                //Ha a következő pont nem egy lyuk
                if (nextval != -1)
                {
                    //Akkor a következő elemet magunkra húzzuk és lyukat hagyunk helyette
                    GridCell nextCell  = GetCellAtPoint(nextPoint);
                    Piece    nextPiece = nextCell.GetPieceFromCell();

                    cell.AddPieceToCell(nextPiece);
                    updatePieceList.Add(nextPiece);

                    nextCell.AddPieceToCell(null);
                }

                //Ha a következő elem egy lyuk
                else
                {
                    //Kérünk egy random értéket
                    int   newPieceValue = GiveRandomPieceValue();
                    Piece newPiece;

                    //Beállítjuk az eséspontot
                    Point fallPoint = new Point(x, (-1 - fills[x]));

                    //Ha van már használt piece akkor újrahasznosítjuk
                    if (usedPieceList.Count > 0)
                    {
                        Piece reusedPiece = usedPieceList[0];
                        reusedPiece.gameObject.SetActive(true);
                        newPiece = reusedPiece;

                        //Eltávolítjuk az újrahasznált piece-t a listáról
                        usedPieceList.RemoveAt(0);
                    }
                    //Ha nincs akkor meg csinálunk újat
                    else
                    {
                        GameObject obj          = Instantiate(piecePrefab, gameBoard);
                        Piece      createdPiece = obj.GetComponent <Piece>();
                        newPiece = createdPiece;
                    }
                    //Létrehozzuk a zuhanási pontra az új elemünket
                    newPiece.Initialize(newPieceValue, checkedPoint, dataController.elements[newPieceValue - 1].returnSprite());
                    newPiece.rect.anchoredPosition = GetPositionFromPoint(fallPoint);

                    //Betömjük a lyukat
                    GridCell hole = GetCellAtPoint(checkedPoint);
                    hole.AddPieceToCell(newPiece);
                    ResetPiece(newPiece);
                    fills[x]++;
                }
                break;
            }
        }
    }
    //*******Aktív fázis*******

    //Változások kezelése
    void Update()
    {
        if (battleManager.GetBattleState() == BattleState.PlayerTurn)
        {
            //Mozgások szerint a pozíciók frissítése
            List <Piece> finishedUpdatingList = new List <Piece>();
            for (int i = 0; i < updatePieceList.Count; i++)
            {
                Piece piece = updatePieceList[i];
                if (!piece.UpdatePiece())
                {
                    finishedUpdatingList.Add(piece);
                }
            }
            for (int i = 0; i < finishedUpdatingList.Count; i++)
            {
                Piece         piece        = finishedUpdatingList[i];
                FlippedPieces flip         = GetFlipped(piece);
                Piece         flippedPiece = null;

                //Simább piece esés
                int x = (int)piece.positionInGrid.x;
                fills[x] = Mathf.Clamp(fills[x] - 1, 0, width);

                List <Point> listOfConnectedPoints = IsConnected(piece.positionInGrid, true);
                bool         wasFlipped            = (flip != null);

                //Ha volt flip az update előtt megnézzük, hogy lett-e match
                if (wasFlipped)
                {
                    flippedPiece = flip.GetOtherPiece(piece);
                    IncludePoints(ref listOfConnectedPoints, IsConnected(flippedPiece.positionInGrid, true));
                }
                //Ha nem lett match
                if (listOfConnectedPoints.Count == 0)
                {
                    if (wasFlipped) //Visszacsinaljuk a flippet
                    {
                        FlipPieces(piece.positionInGrid, flippedPiece.positionInGrid, false);
                    }
                }
                //Ha match lett
                else
                {
                    //Eltávolítja a listában szereplő pontokat
                    foreach (Point pointInConnection in listOfConnectedPoints)
                    {
                        GridCell cell      = GetCellAtPoint(pointInConnection);
                        Piece    tempPiece = cell.GetPieceFromCell();

                        if (tempPiece != null)
                        {
                            tempPiece.gameObject.SetActive(false);
                            usedPieceList.Add(tempPiece);

                            //Növeljük az adott típus counterét
                            ScoreController.IncreasePoints(tempPiece.typeValue - 1);
                            battleManager.Attack(tempPiece.typeValue - 1);
                        }


                        //Kinullázzuk az adott cellához tartozó piece-t
                        cell.AddPieceToCell(null);
                        //Lyuk keletkezett, szóval hívjuk a gravitációt
                        ApplyGravityToColumn(cell.positionOfCell.x);
                    }
                    battleManager.ChangeTurn();
                }
                //Eltakarítjuk a pontokat mikor már végeztünk velük
                flippedPieceList.Remove(flip);
                updatePieceList.Remove(piece);
            }
        }

        else if (battleManager.GetBattleState() == BattleState.EnemyTurn)
        {
            int random = UnityEngine.Random.Range(1, 3);
            for (int i = 0; i < random; i++)
            {
                battleManager.Attack();
            }
            battleManager.ChangeTurn();
        }
    }