void Start()
 {
     numberOfMoves    = new Vector2(0f, 0f);
     chessboard       = GameObject.FindGameObjectWithTag("Ground");
     chessMovement    = chessboard.GetComponent <ChessMovement> ();
     chessPieceOfList = chessMovement.chessPiecesOnBoard.Find((ChessMovement.PGNMoveData obj) => { return(obj.chessPiece == this.gameObject); });
 }
 void OnTriggerEnter(Collider other)
 {
     //Debug.Log (other.gameObject.tag + " " + other.gameObject.name);
     if ((other.gameObject.tag.Contains("White") || other.gameObject.tag.Contains("Black")) && gridMovement.isMoving)
     {
         ChessMovement.PGNMoveData pieceToDestroy = chessMovement.chessPiecesOnBoard.Find((ChessMovement.PGNMoveData obj) => { return(obj.chessPiece == other.gameObject); });
         ChessMovement.PGNMoveData destroyerPiece = chessMovement.chessPiecesOnBoard.Find((ChessMovement.PGNMoveData obj) => { return(obj.chessPiece == this.gameObject); });
         if (pieceToDestroy != null && destroyerPiece != null)
         {
             if (destroyerPiece.sourceVector == pieceToDestroy.sourceVector)
             {
                 pieceToDestroy.chessPiece.SetActive(false);
                 Destroy(pieceToDestroy.chessPiece);
                 chessMovement.chessPiecesOnBoard.Remove(pieceToDestroy);
             }
         }
     }
 }
    void InstantiatePieceFromPawn(char c, int color, ChessMovement.PGNMoveData pawn)
    {
        GameObject newPiece;
        Vector3    tempPosition;

        ChessMovement.PGNMoveData tempPiece;
        switch (c)
        {
        case 'Q':
            //instantiate queen and destroy pawn
            newPiece       = Instantiate <GameObject> (pieceToInstantiate[color * 4 + 3]);      //queen=3
            tempPosition   = newPiece.transform.position;
            tempPosition.x = pawn.chessPiece.transform.position.x;
            tempPosition.y = pawn.chessPiece.transform.position.y + 46.5f;
            tempPosition.z = pawn.chessPiece.transform.position.z;
            newPiece.transform.position = tempPosition;
            newPiece.name = (color > 0 ? "Black" : "White") + "Queen" + (++newlyInstantiatedPieces[color * 4 + 3]).ToString();
            newPiece.tag  = (color > 0 ? "Black" : "White") + "Queen";

            tempPiece              = new ChessMovement.PGNMoveData();
            tempPiece.chessPiece   = newPiece;
            tempPiece.sourceVector = pawn.sourceVector;
            Destroy(pawn.chessPiece);
            chessMovement.chessPiecesOnBoard.Remove(pawn);
            chessMovement.chessPiecesOnBoard.Add(tempPiece);
            break;

        case 'R':
            //instantiate rook and destroy pawn
            newPiece       = Instantiate <GameObject> (pieceToInstantiate[color * 4]);     //rook=0
            tempPosition   = newPiece.transform.position;
            tempPosition.x = pawn.chessPiece.transform.position.x;
            tempPosition.y = pawn.chessPiece.transform.position.y + 31f;
            tempPosition.z = pawn.chessPiece.transform.position.z;
            newPiece.transform.position = tempPosition;
            newPiece.name = (color > 0 ? "Black" : "White") + "Rook" + (++newlyInstantiatedPieces[color * 4]).ToString();
            newPiece.tag  = (color > 0 ? "Black" : "White") + "Rook";

            tempPiece              = new ChessMovement.PGNMoveData();
            tempPiece.chessPiece   = newPiece;
            tempPiece.sourceVector = pawn.sourceVector;
            Destroy(pawn.chessPiece);
            chessMovement.chessPiecesOnBoard.Remove(pawn);
            chessMovement.chessPiecesOnBoard.Add(tempPiece);
            break;

        case 'N':
            //instantiate Knight and destroy pawn
            newPiece       = Instantiate <GameObject> (pieceToInstantiate[color * 4 + 1]);     //knight=1
            tempPosition   = newPiece.transform.position;
            tempPosition.x = pawn.chessPiece.transform.position.x;
            tempPosition.y = pawn.chessPiece.transform.position.y + 21f;
            tempPosition.z = pawn.chessPiece.transform.position.z;
            newPiece.transform.position = tempPosition;
            newPiece.name = (color > 0 ? "Black" : "White") + "Knight" + (++newlyInstantiatedPieces[color * 4 + 1]).ToString();
            newPiece.tag  = (color > 0 ? "Black" : "White") + "Knight";

            tempPiece              = new ChessMovement.PGNMoveData();
            tempPiece.chessPiece   = newPiece;
            tempPiece.sourceVector = pawn.sourceVector;
            Destroy(pawn.chessPiece);
            chessMovement.chessPiecesOnBoard.Remove(pawn);
            chessMovement.chessPiecesOnBoard.Add(tempPiece);
            break;

        case 'B':
            //instantiate bishop and destroy pawn
            newPiece       = Instantiate <GameObject> (pieceToInstantiate[color * 4 + 2]);     //bishop=2
            tempPosition   = newPiece.transform.position;
            tempPosition.x = pawn.chessPiece.transform.position.x;
            tempPosition.y = pawn.chessPiece.transform.position.y - 2f;
            tempPosition.z = pawn.chessPiece.transform.position.z;
            newPiece.transform.position = tempPosition;
            newPiece.name = (color > 0 ? "Black" : "White") + "Bishop" + (++newlyInstantiatedPieces[color * 4 + 2]).ToString();
            newPiece.tag  = (color > 0 ? "Black" : "White") + "Bishop";

            tempPiece              = new ChessMovement.PGNMoveData();
            tempPiece.chessPiece   = newPiece;
            tempPiece.sourceVector = pawn.sourceVector;
            Destroy(pawn.chessPiece);
            chessMovement.chessPiecesOnBoard.Remove(pawn);
            chessMovement.chessPiecesOnBoard.Add(tempPiece);
            break;
        }
    }
    /*public Move FetchbyMoveNumber(int no)
     * {
     *      for (int i=0; i<database.Count; i++)
     *      {
     *              if(database[i].MoveNumber == no)
     *                      return database[i];
     *      }
     *      return null;
     * }*/
    ChessMovement.PGNMoveData FindPieceFromList(string PieceName, Vector2 destination, char Type, bool conflict, Vector2 currentLocation)
    {
        int flag = 0;

        ChessMovement.PGNMoveData temp = new ChessMovement.PGNMoveData();
        //Debug.Log (PieceName+" "+destination.ToString());
        //Debug.Log (chessMovement.chessPiecesOnBoard.FindAll ((ChessMovement.PGNMoveData obj) => { return (obj.chessPiece.name.Contains(PieceName)); }).Count);
        foreach (ChessMovement.PGNMoveData o in chessMovement.chessPiecesOnBoard.FindAll((ChessMovement.PGNMoveData obj) => { return(obj.chessPiece.name.Contains(PieceName)); }))
        {
            //Debug.Log(o.chessPiece.name + " " + o.sourceVector);
            if (flag == 0)
            {
                switch (Type)
                {
                case 'R':
                    if (conflict)
                    {
                        if (currentLocation.x == 0)
                        {
                            if (o.sourceVector.y == currentLocation.y)
                            {
                                temp.chessPiece = o.chessPiece;
                                temp.moveVector = destination - o.sourceVector;
                                flag            = 1;
                                o.moveVector    = temp.moveVector;
                            }
                        }
                        else
                        {
                            if (o.sourceVector.x == currentLocation.x)
                            {
                                temp.chessPiece = o.chessPiece;
                                temp.moveVector = destination - o.sourceVector;
                                flag            = 1;
                                o.moveVector    = temp.moveVector;
                            }
                        }
                    }
                    else
                    {
                        if (o.sourceVector.x == destination.x || o.sourceVector.y == destination.y)
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    break;

                case 'N':
                    if (conflict)
                    {
                        if (currentLocation.x == 0)
                        {
                            if (o.sourceVector.y == currentLocation.y)
                            {
                                temp.chessPiece = o.chessPiece;
                                temp.moveVector = destination - o.sourceVector;
                                flag            = 1;
                                o.moveVector    = temp.moveVector;
                            }
                        }
                        else
                        {
                            if (o.sourceVector.x == currentLocation.x)
                            {
                                temp.chessPiece = o.chessPiece;
                                temp.moveVector = destination - o.sourceVector;
                                flag            = 1;
                                o.moveVector    = temp.moveVector;
                            }
                        }
                    }
                    else
                    {
                        if (Mathf.Abs((o.sourceVector.x - destination.x) + Mathf.Abs(o.sourceVector.y - destination.y)) == 3 && Mathf.Abs(o.sourceVector.x - destination.x) != 0 && Mathf.Abs(o.sourceVector.y - destination.y) != 0)
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    break;

                case 'B':
                    int a = Mathf.RoundToInt(destination.x + destination.y);
                    if (a % 2 == 0)               //black one
                    {
                        if (o.chessPiece.name.Contains("Left"))
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    else                    //white one
                    {
                        if (o.chessPiece.name.Contains("Right"))
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    break;

                case 'P':
                    if (conflict)
                    {
                        if (o.sourceVector.x == currentLocation.x)
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    else
                    {
                        if ((o.sourceVector.x == destination.x))
                        {
                            temp.chessPiece = o.chessPiece;
                            temp.moveVector = destination - o.sourceVector;
                            flag            = 1;
                            o.moveVector    = temp.moveVector;
                        }
                    }
                    break;

                case 'K':
                    temp.chessPiece = o.chessPiece;
                    temp.moveVector = destination - o.sourceVector;
                    flag            = 1;
                    o.moveVector    = temp.moveVector;
                    break;

                case 'Q':
                    temp.chessPiece = o.chessPiece;
                    temp.moveVector = destination - o.sourceVector;
                    flag            = 1;
                    o.moveVector    = temp.moveVector;
                    break;
                }
            }
            else
            {
                break;
            }
        }
        //Debug.Log (temp.chessPiece.ToString () + " " + temp.moveVector.ToString () + "  " + temp.sourceVector.ToString ());
        return(temp);
    }
    ChessMovement.PGNMoveData movePieceLogic(string[] move, int i)
    {
        string [] color = new string[2];
        color[0] = "White";
        color[1] = "Black";
        string  pieceToMove;
        Vector2 destination = new Vector2();
        bool    pieceCaptured;
        bool    pieceConflict;

        ChessMovement.PGNMoveData piece = null;
        Vector2 source = new Vector2();

        source.x      = 0;
        source.y      = 0;
        pieceConflict = false;
        switch (move[i][0])
        {
        case 'R':
            pieceToMove = color[i] + "Rook";
            if (move[i].Length == 3)
            {
                pieceCaptured = false;
                destination.x = move[i][1] - 96;
                destination.y = move[i][2] - 48;
            }
            else if (move[i].Length == 4)
            {
                if (move[i][1] == 'x')
                {
                    pieceCaptured = true;
                }
                else
                {
                    pieceCaptured = false;
                    pieceConflict = true;
                    if (move[i][1] > 48 && move[i][1] < 57)
                    {
                        source.y = move[i][1] - 48;
                    }
                    else
                    {
                        source.x = move[i][1] - 96;
                    }
                }
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
            }
            else
            {
                pieceCaptured = true;
                pieceConflict = true;
                destination.x = move[i][3] - 96;
                destination.y = move[i][4] - 48;
                if (move[i][1] > 48 && move[i][1] < 57)
                {
                    source.y = move[i][1] - 48;
                }
                else
                {
                    source.x = move[i][1] - 96;
                }
            }
            piece = FindPieceFromList(pieceToMove, destination, 'R', pieceConflict, source);
            break;

        case 'N':
            pieceToMove = color[i] + "Knight";
            if (move[i].Length == 3)
            {
                pieceCaptured = false;
                destination.x = move[i][1] - 96;
                destination.y = move[i][2] - 48;
            }
            else if (move[i].Length == 4)
            {
                if (move[i][1] == 'x')
                {
                    pieceCaptured = true;
                }
                else
                {
                    pieceCaptured = false;
                    pieceConflict = true;
                    if (move[i][1] > 48 && move[i][1] < 57)
                    {
                        source.y = move[i][1] - 48;
                    }
                    else
                    {
                        source.x = move[i][1] - 96;
                    }
                }
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
            }
            else
            {
                pieceCaptured = true;
                pieceConflict = true;
                destination.x = move[i][3] - 96;
                destination.y = move[i][4] - 48;
                if (move[i][1] > 48 && move[i][1] < 57)
                {
                    source.y = move[i][1] - 48;
                }
                else
                {
                    source.x = move[i][1] - 96;
                }
            }
            piece = FindPieceFromList(pieceToMove, destination, 'N', pieceConflict, source);
            break;

        case 'B':
            pieceToMove = color[i] + "Bishop";
            if (move[i].Length == 3)
            {
                pieceCaptured = false;
                destination.x = move[i][1] - 96;
                destination.y = move[i][2] - 48;
            }
            else
            {
                pieceCaptured = true;
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
            }
            piece = FindPieceFromList(pieceToMove, destination, 'B', pieceConflict, source);
            break;

        case 'K':
            pieceToMove = color[i] + "King";
            if (move[i].Length == 3)
            {
                pieceCaptured = false;
                destination.x = move[i][1] - 96;
                destination.y = move[i][2] - 48;
            }
            else
            {
                pieceCaptured = true;
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
            }
            piece = FindPieceFromList(pieceToMove, destination, 'K', pieceConflict, source);
            break;

        case 'Q':
            pieceToMove = color[i] + "Queen";
            if (move[i].Length == 3)
            {
                pieceCaptured = false;
                destination.x = move[i][1] - 96;
                destination.y = move[i][2] - 48;
            }
            else
            {
                pieceCaptured = true;
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
            }
            piece = FindPieceFromList(pieceToMove, destination, 'Q', pieceConflict, source);
            break;

        case 'O':
            //need to move two chess pieces rook and king
            pieceCaptured = false;
            if (move[i].Length == 3)
            {
                if (i == 0)
                {
                    pieceToMove = color[i] + "Rook";
                    //rook destination
                    pieceConflict = true;
                    source.x      = 8;
                    destination.x = 6;
                    destination.y = 1;
                    piece         = FindPieceFromList(pieceToMove, destination, 'R', pieceConflict, source);
                    pieceToMove   = color[i] + "King";
                    //king destination
                    pieceConflict = false;
                    source.x      = 0;
                    destination.x = 7;
                    destination.y = 1;
                    piece         = FindPieceFromList(pieceToMove, destination, 'K', pieceConflict, source);
                }

                else
                {
                    pieceToMove = color[i] + "Rook";
                    //rook destination
                    pieceConflict = true;
                    source.x      = 8;
                    destination.x = 6;
                    destination.y = 8;
                    piece         = FindPieceFromList(pieceToMove, destination, 'R', pieceConflict, source);
                    pieceToMove   = color[i] + "King";
                    //king destination
                    pieceConflict = false;
                    source.x      = 0;
                    destination.x = 7;
                    destination.y = 8;
                    piece         = FindPieceFromList(pieceToMove, destination, 'K', pieceConflict, source);
                }
            }
            else
            {
                if (i == 0)
                {
                    pieceToMove = color[i] + "Rook";
                    //rook destination
                    pieceConflict = true;
                    source.x      = 1;
                    destination.x = 4;
                    destination.y = 1;
                    piece         = FindPieceFromList(pieceToMove, destination, 'R', pieceConflict, source);
                    pieceToMove   = color[i] + "King";
                    //king destination
                    pieceConflict = false;
                    source.x      = 0;
                    destination.x = 3;
                    destination.y = 1;
                    piece         = FindPieceFromList(pieceToMove, destination, 'K', pieceConflict, source);
                }

                else
                {
                    pieceToMove = color[i] + "Rook";
                    //rook destination
                    pieceConflict = true;
                    source.x      = 1;
                    destination.x = 4;
                    destination.y = 8;
                    piece         = FindPieceFromList(pieceToMove, destination, 'R', pieceConflict, source);
                    pieceToMove   = color[i] + "King";
                    pieceConflict = false;
                    source.x      = 0;
                    //king destination
                    destination.x = 3;
                    destination.y = 8;
                    piece         = FindPieceFromList(pieceToMove, destination, 'K', pieceConflict, source);
                }
            }
            break;

        case '1':
            //stop
            break;

        case '0':
            // stop
            break;

        default:
            pieceToMove = color[i] + "Pawn";
            if (move[i].Length == 2)
            {
                pieceCaptured = false;
                destination.x = move[i][0] - 96;
                destination.y = move[i][1] - 48;
            }
            else if (move[i].Length == 4)
            {
                if (move[i][1] == 'x')
                {                       //piece is captured
                    pieceCaptured = true;
                    pieceConflict = true;
                    destination.x = move[i][2] - 96;
                    destination.y = move[i][3] - 48;
                    if (move[i][0] > 48 && move[i][0] < 57)
                    {
                        source.y = move[i][0] - 48;
                    }
                    else
                    {
                        source.x = move[i][0] - 96;
                    }
                }
                else if (move[i][2] == '=')
                {
                    //piece is promoted but not capturing
                    // You need to instantiate the piece and destroy the pawn
                    pieceCaptured = false;
                    destination.x = move[i][2] - 96;
                    destination.y = move[i][3] - 48;
                }
            }
            else if (move[i].Length == 6)
            {
                //piece is promoted and piece is also capturing
                // You need to instantiate the piece and destroy the pawn
                pieceCaptured = true;
                pieceConflict = true;
                destination.x = move[i][2] - 96;
                destination.y = move[i][3] - 48;
                if (move[i][0] > 48 && move[i][0] < 57)
                {
                    source.y = move[i][0] - 48;
                }
                else
                {
                    source.x = move[i][0] - 96;
                }
            }
            piece = FindPieceFromList(pieceToMove, destination, 'P', pieceConflict, source);
            if (move[i].Length == 4 || move[i].Length == 6)
            {
                InstantiatePieceFromPawn(move[i][move[i].Length - 1], i, piece);
            }
            break;
        }
        return(piece);
    }