private void ProcessIfPawnStepOnFinalLine(int x, int y)
    {
        if (selectedChessman.GetType() == typeof(Pawn))
        {
            // check if pawn steps on final line, it becomes Queen
            if (y == 7) // white team
            {
                int currentX = selectedChessman.CurrentX, currentY = selectedChessman.CurrentY;
                // remove selected chessman
                activeChessmans.Remove(selectedChessman.gameObject);
                Destroy(selectedChessman.gameObject);

                // spawn new chessman
                SpawnChessman(1, currentX, currentY);
                selectedChessman = Chessmans[currentX, currentY];

                // rotate the chessman
                selectedChessman.RotateEach(ROTATE_TIME);
            }
            else if (y == 0) // black team
            {
                int currentX = selectedChessman.CurrentX, currentY = selectedChessman.CurrentY;
                // remove selected chessman
                activeChessmans.Remove(selectedChessman.gameObject);
                Destroy(selectedChessman.gameObject);

                // spawn new chessman
                SpawnChessman(7, currentX, currentY);
                selectedChessman = Chessmans[currentX, currentY];

                // rotate the chessman
                // selectedChessman.RotateEach(ROTATE_TIME);
            }
        }
    }
    public void MoveChessman(int x, int y)
    {
        if (allowedMoves[x, y])
        {
            if (chessMate != null)
            {
                BoardHighlights.Instance.HideCheckedHighlight();
                chessMate.HidePowerEffect();
                chessMate = null;
            }

            Chessman c      = Chessmans[x, y];
            float    delays = 0f;

            // Check EnPassantMove
            ProcessEnPassantMove(c, x, y, out delays);

            // Eat chessman
            bool isEatChess = false;
            if (c != null && c.isWhite != isWhiteTurn)
            {
                delays = DELAY_TIME;
                c.RotateEach(ROTATE_TIME);
                c.DestroyAfter(delays);

                BoardHighlights.Instance.ShowKillerHighlight(new Vector3(x + 0.5f, 0, y + 0.5f));
                BoardHighlights.Instance.HideKillerHighlightAfter(delays);
                isEatChess = true;

                if (c.GetType() == typeof(King))
                {
                    EndGame();
                    return;
                }
            }

            BoardHighlights.Instance.ShowHoverHighlight(new Vector3(x + 0.5f, 0, y + 0.5f));

            // check if pawn step on final line
            ProcessIfPawnStepOnFinalLine(x, y);

            // Move selected chessman to x, y position
            MoveSelectedChessmanTo(x, y, delays);

            // Checkmate
            if (!IsCheckmate(Chessmans[x, y].PossibleMove()) && isEatChess)
            {
                selectedChessman.PlayPowerEffectFor(DELAY_TIME);
            }
            ProcessCheckmate(x, y);

            // Change turn
            isWhiteTurn = !isWhiteTurn;
        }

        BoardHighlights.Instance.HideHighlights();
        selectedChessman = null;
    }
    private void ProcessEnPassantMove(Chessman c, int x, int y, out float delay)
    {
        delay = 0;
        if (x == EnPassantMove[0] && y == EnPassantMove[1])
        {
            if (isWhiteTurn)
            {
                c = Chessmans[x, y - 1];
            }
            else
            {
                c = Chessmans[x, y + 1];
            }

            c.RotateEach(ROTATE_TIME);
            c.DestroyAfter(DELAY_TIME);

            //selectedChessman.RotateEach(ROTATE_TIME);

            delay = DELAY_TIME;
        }

        EnPassantMove[0] = -1;
        EnPassantMove[1] = -1;
        // EnPassant
        if (selectedChessman.GetType() == typeof(Pawn))
        {
            if (selectedChessman.CurrentY == 1 && y == 3)
            {
                EnPassantMove[0] = x;
                EnPassantMove[1] = y - 1;
            }
            else if (selectedChessman.CurrentY == 6 && y == 4)
            {
                EnPassantMove[0] = x;
                EnPassantMove[1] = y + 1;
            }
        }
    }