void Update()
    {
        switch (GameStateHolder.GameMode)
        {
        case GameStateHolder.GameModesEnum.SinglePlayer:
            FirstPlayerScoreText.text  = TurnAndScoreScript.GetComponent <TurnAndScore> ().GetScoreFirstPlayer().ToString();
            SecondPlayerScoreText.text = TurnAndScoreScript.GetComponent <TurnAndScore> ().GetScoreSecondPlayer().ToString();
            QueenPocketedBy            = TurnAndScoreScript.GetComponent <TurnAndScore> ().GetQueenPocketed();
            QueenCoveredBy             = TurnAndScoreScript.GetComponent <TurnAndScore> ().GetQueenCovered();
            break;

        case GameStateHolder.GameModesEnum.MultiPlayer:
            FirstPlayerScoreText.text  = TurnAndScoreScript.GetComponent <MPTurnAndScore> ().GetScoreFirstPlayer().ToString();
            SecondPlayerScoreText.text = TurnAndScoreScript.GetComponent <MPTurnAndScore> ().GetScoreSecondPlayer().ToString();
            QueenPocketedBy            = TurnAndScoreScript.GetComponent <MPTurnAndScore> ().GetQueenPocketed();
            QueenCoveredBy             = TurnAndScoreScript.GetComponent <MPTurnAndScore> ().GetQueenCovered();
            break;
        }

        if (QueenPocketedBy != PlayerStateHolder.PlayerEnum.Unknown && QueenCoveredBy == PlayerStateHolder.PlayerEnum.Unknown)
        {
            QueenText.text = QueenPocketedBy.ToString() + " (Pocketed)";
        }
        else if (QueenPocketedBy != PlayerStateHolder.PlayerEnum.Unknown && QueenCoveredBy != PlayerStateHolder.PlayerEnum.Unknown)
        {
            QueenText.text = QueenPocketedBy.ToString() + " (Pocketed + Covered)";
        }
        else
        {
            QueenText.text = "Not pocketed yet.";
        }
    }
    void Start()
    {
        GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.Unknown;
        PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.Unknown;
        FirstPlayerPocketedArray   = new ArrayList();
        SecondPlayerPocketedArray  = new ArrayList();

        DisplayScoreScript = (DisplayScores)GameObject.FindObjectOfType(typeof(DisplayScores));
        PlayerPrefs.SetInt("Winner", -1);
    }
    public void PrevPlayerTurnChange(int val)
    {
        PrevPlayerTurnInt = val;
        switch (PrevPlayerTurnInt)
        {
        case 1:
            PrevPlayerTurn = PlayerStateHolder.PlayerEnum.FirstPlayer;
            break;

        case 2:
            PrevPlayerTurn = PlayerStateHolder.PlayerEnum.SecondPlayer;
            break;
        }
    }
    void Update()
    {
        if (!FirstTurnAllocated)
        {
            //Tossing
            int val = Random.Range(1, 3);
            switch (val)
            {
            case 1:
                GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.FirstPlayer;
                PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.FirstPlayer;
                break;

            case 2:
                GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.SecondPlayer;
                PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.SecondPlayer;
                break;
            }
            FirstTurnAllocated = true;
            //Placing Striker
            GameObject Striker = GameObject.FindGameObjectWithTag("Striker");
            switch (GameStateHolder.PlayerTurn)
            {
            case PlayerStateHolder.PlayerEnum.FirstPlayer:
                Striker.transform.localPosition = new Vector3(0f, 0f, (-1) * StrikerZeroPos);
                Striker.transform.localRotation = Quaternion.identity;
                break;

            case PlayerStateHolder.PlayerEnum.SecondPlayer:
                Striker.transform.localPosition = new Vector3(0f, 0f, StrikerZeroPos);
                Striker.transform.localRotation = Quaternion.Euler(0f, 180f, 0f);
                break;
            }
        }

        if (GameStateHolder.PlayerTurn == PlayerStateHolder.PlayerEnum.Unknown)
        {
            if (!MainCoroutineStarted)
            {
                MainCoroutineStarted = true;
                StartCoroutine(MainCoroutine());
            }
        }
    }
    IEnumerator MainCoroutine()
    {
        FirstPlayerTempPocketedArray  = new ArrayList();
        SecondPlayerTempPocketedArray = new ArrayList();
        yield return(new WaitForSeconds(TimeDelayBeforeBaseCoroutine));

        while (!EveryPieceAndStrikerStopped())
        {
            yield return(new WaitForSeconds(1f));
        }
        bool Foul = false;
        int  WhitePiecesPocketed = FirstPlayerPocketedArray.Count;
        int  BlackPiecesPocketed = SecondPlayerPocketedArray.Count;

        switch (PrevPlayerTurn)
        {
        case PlayerStateHolder.PlayerEnum.FirstPlayer:
            foreach (GameObject G in FirstPlayerTempPocketedArray)
            {
                //Striker Pocketting Foul
                if (G.tag.Equals("Striker"))
                {
                    Foul = true;
                }
                //Opponent Piece Pocketting Foul
                if (G.tag.Equals("BlackPiece"))
                {
                    BlackPiecesPocketed++;
                    Foul = true;
                }
                //Queen Covering
                if (FirstPlayerPocketedArray.Count > 0 && G.tag.Equals("Queen"))
                {
                    FirstPlayerQueenPocketed = true;
                }
                if (FirstPlayerQueenPocketed && G.tag.Equals("WhitePiece"))
                {
                    FirstPlayerQueenCovered = true;
                }
                //All White Pieces Pocketted Before Queen => Foul
                if (G.tag.Equals("WhitePiece"))
                {
                    WhitePiecesPocketed++;
                    if (WhitePiecesPocketed == 9 && !FirstPlayerQueenPocketed)
                    {
                        Foul = true;
                    }
                }
            }
            if (Foul)
            {
                DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Foul, "Player 1's Foul");
                //Opponent Last Piece Pocketting Handling
                if (BlackPiecesPocketed == 9)
                {
                    foreach (GameObject G in FirstPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("BlackPiece"))
                        {
                            G.transform.localPosition = Vector3.zero;
                            G.GetComponent <Rigidbody> ().isKinematic = false;
                            break;
                        }
                    }
                }
                //Own Foul Pieces Handling
                foreach (GameObject G in FirstPlayerTempPocketedArray)
                {
                    if (G.tag.Equals("WhitePiece"))
                    {
                        G.transform.localPosition = Vector3.zero;
                        G.GetComponent <Rigidbody> ().isKinematic = false;
                    }
                }
                //Giving A Penality Piece
                bool PenalityGiven = false;
                if (FirstPlayerPocketedArray.Count > 0)
                {
                    ((GameObject)FirstPlayerPocketedArray [0]).transform.localPosition = Vector3.zero;
                    ((GameObject)FirstPlayerPocketedArray [0]).GetComponent <Rigidbody> ().isKinematic = false;
                    FirstPlayerPocketedArray.RemoveAt(0);
                    PenalityGiven = true;
                }
                //Duing Piece if not Penality Given
                if (!PenalityGiven)
                {
                    FirstPlayerPenalityDue++;
                }

                //Returning Queen if not Covered
                if (!FirstPlayerQueenCovered && FirstPlayerQueenPocketed)
                {
                    bool QueenReturned = false;
                    foreach (GameObject G in FirstPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("Queen"))
                        {
                            G.transform.localPosition = Vector3.zero;
                            G.GetComponent <Rigidbody> ().isKinematic = false;
                            FirstPlayerQueenPocketed = false;
                            QueenReturned            = true;
                            break;
                        }
                    }
                    if (!QueenReturned)
                    {
                        foreach (GameObject G in FirstPlayerPocketedArray)
                        {
                            if (G.tag.Equals("Queen"))
                            {
                                G.transform.localPosition = Vector3.zero;
                                G.GetComponent <Rigidbody> ().isKinematic = false;
                                FirstPlayerPocketedArray.Remove(G);
                                FirstPlayerQueenPocketed = false;
                                QueenReturned            = true;
                                break;
                            }
                        }
                    }
                }
                //Changing Turn
                yield return(new WaitForSeconds(1f));

                PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.SecondPlayer;
                GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.SecondPlayer;
            }
            // No Foul
            else
            {
                //Counting Pieces Pocketted
                int WhitePocketedThisTurn = 0;
                foreach (GameObject G in FirstPlayerTempPocketedArray)
                {
                    if (G.tag.Equals("WhitePiece"))
                    {
                        WhitePocketedThisTurn++;
                    }
                }
                //If No White Piece Pocketted
                if (WhitePocketedThisTurn == 0)
                {
                    DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Info, "No White Piece Pocketed");
                    //Returning Queen if not Covered
                    if (!FirstPlayerQueenCovered && FirstPlayerQueenPocketed)
                    {
                        bool QueenReturned = false;
                        foreach (GameObject G in FirstPlayerTempPocketedArray)
                        {
                            if (G.tag.Equals("Queen"))
                            {
                                G.transform.localPosition = Vector3.zero;
                                G.GetComponent <Rigidbody> ().isKinematic = false;
                                FirstPlayerQueenPocketed = false;
                                QueenReturned            = true;
                                break;
                            }
                        }
                        if (!QueenReturned)
                        {
                            foreach (GameObject G in FirstPlayerPocketedArray)
                            {
                                if (G.tag.Equals("Queen"))
                                {
                                    G.transform.localPosition = Vector3.zero;
                                    G.GetComponent <Rigidbody> ().isKinematic = false;
                                    FirstPlayerPocketedArray.Remove(G);
                                    FirstPlayerQueenPocketed = false;
                                    QueenReturned            = true;
                                    break;
                                }
                            }
                        }
                    }
                    //Changing Turn
                    yield return(new WaitForSeconds(1f));

                    PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.SecondPlayer;
                    GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.SecondPlayer;
                }
                //If Some pieces are pocketted
                else
                {
                    DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Score, WhitePocketedThisTurn.ToString() + " Piece(s) Pocketed");
                    //Adding All White Pieces to Our Array
                    foreach (GameObject G in FirstPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("WhitePiece") || G.tag.Equals("Queen"))
                        {
                            FirstPlayerPocketedArray.Add(G);
                        }
                    }
                    yield return(new WaitForSeconds(1f));

                    PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.FirstPlayer;
                    GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.FirstPlayer;
                }
                //Giving Due Penality Piece if Possible
                while (FirstPlayerPocketedArray.Count > 0)
                {
                    if (FirstPlayerPenalityDue > 0)
                    {
                        ((GameObject)FirstPlayerPocketedArray [0]).transform.localPosition = Vector3.zero;
                        ((GameObject)FirstPlayerPocketedArray [0]).GetComponent <Rigidbody> ().isKinematic = false;
                        FirstPlayerPocketedArray.RemoveAt(0);
                        FirstPlayerPenalityDue--;
                    }
                    else
                    {
                        break;
                    }
                }
                if (GameStateHolder.GameMode == GameStateHolder.GameModesEnum.SinglePlayer && FirstPlayerQueenCovered && FirstPlayerPocketedArray.Count == 10)
                {
                    int ScoresToSave = GetScores(PlayerStateHolder.PlayerName);
                    switch (GameStateHolder.PlayerGameDifficulty)
                    {
                    case GameStateHolder.GameDifficultyEnum.Easy:
                        ScoresToSave += 5;
                        break;

                    case GameStateHolder.GameDifficultyEnum.Medium:
                        ScoresToSave += 10;
                        break;

                    case GameStateHolder.GameDifficultyEnum.Hard:
                        ScoresToSave += 15;
                        break;
                    }
                    SaveScores(PlayerStateHolder.PlayerName, ScoresToSave);
                    PlayerPrefs.SetInt("Winner", 1);
                    PlayerPrefs.Save();
                    SceneManager.LoadScene("EndGame");
                }
                else if (GameStateHolder.GameMode == GameStateHolder.GameModesEnum.MultiPlayer && (FirstPlayerQueenCovered && PlayerStateHolder.PlayerType == PlayerStateHolder.PlayerEnum.FirstPlayer) && FirstPlayerPocketedArray.Count == 10)
                {
                    int ScoresToSave = GetScores(PlayerStateHolder.PlayerName);
                    ScoresToSave += 10;
                    SaveScores(PlayerStateHolder.PlayerName, ScoresToSave);
                    PlayerPrefs.SetInt("Winner", 1);
                    PlayerPrefs.Save();
                    SceneManager.LoadScene("EndGame");
                }
            }
            break;

        case PlayerStateHolder.PlayerEnum.SecondPlayer:
            foreach (GameObject G in SecondPlayerTempPocketedArray)
            {
                //Striker Pocketting Foul
                if (G.tag.Equals("Striker"))
                {
                    Foul = true;
                }
                //Opponent Piece Pocketting Foul
                if (G.tag.Equals("WhitePiece"))
                {
                    WhitePiecesPocketed++;
                    Foul = true;
                }
                //Queen Covering
                if (SecondPlayerPocketedArray.Count > 0 && G.tag.Equals("Queen"))
                {
                    SecondPlayerQueenPocketed = true;
                }
                if (SecondPlayerQueenPocketed && G.tag.Equals("BlackPiece"))
                {
                    SecondPlayerQueenCovered = true;
                }
                //All White Pieces Pocketted Before Queen => Foul
                if (G.tag.Equals("BlackPiece"))
                {
                    BlackPiecesPocketed++;
                    if (BlackPiecesPocketed == 9 && !SecondPlayerQueenPocketed)
                    {
                        Foul = true;
                    }
                }
            }
            if (Foul)
            {
                DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Foul, "Player 2's Foul");
                //Opponent Last Piece Pocketting Handling
                if (WhitePiecesPocketed == 9)
                {
                    foreach (GameObject G in SecondPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("WhitePiece"))
                        {
                            G.transform.localPosition = Vector3.zero;
                            G.GetComponent <Rigidbody> ().isKinematic = false;
                            break;
                        }
                    }
                }
                //Own Foul Pieces Handling
                foreach (GameObject G in SecondPlayerTempPocketedArray)
                {
                    if (G.tag.Equals("BlackPiece"))
                    {
                        G.transform.localPosition = Vector3.zero;
                        G.GetComponent <Rigidbody> ().isKinematic = false;
                    }
                }
                //Giving A Penality Piece
                bool PenalityGiven = false;
                if (SecondPlayerPocketedArray.Count > 0)
                {
                    ((GameObject)SecondPlayerPocketedArray [0]).transform.localPosition = Vector3.zero;
                    ((GameObject)SecondPlayerPocketedArray [0]).GetComponent <Rigidbody> ().isKinematic = false;
                    SecondPlayerPocketedArray.RemoveAt(0);
                    PenalityGiven = true;
                }
                //Duing Piece if not Penality Given
                if (!PenalityGiven)
                {
                    SecondPlayerPenalityDue++;
                }

                //Returning Queen if not Covered
                if (!SecondPlayerQueenCovered && SecondPlayerQueenPocketed)
                {
                    bool QueenReturned = false;
                    foreach (GameObject G in SecondPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("Queen"))
                        {
                            G.transform.localPosition = Vector3.zero;
                            G.GetComponent <Rigidbody> ().isKinematic = false;
                            SecondPlayerQueenPocketed = false;
                            QueenReturned             = true;
                            break;
                        }
                    }
                    if (!QueenReturned)
                    {
                        foreach (GameObject G in SecondPlayerPocketedArray)
                        {
                            if (G.tag.Equals("Queen"))
                            {
                                G.transform.localPosition = Vector3.zero;
                                G.GetComponent <Rigidbody> ().isKinematic = false;
                                SecondPlayerPocketedArray.Remove(G);
                                SecondPlayerQueenPocketed = false;
                                QueenReturned             = true;
                                break;
                            }
                        }
                    }
                }
                //Changing Turn
                yield return(new WaitForSeconds(1f));

                PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.FirstPlayer;
                GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.FirstPlayer;
            }
            // No Foul
            else
            {
                //Counting Pieces Pocketted
                int BlackPocketedThisTurn = 0;
                foreach (GameObject G in SecondPlayerTempPocketedArray)
                {
                    if (G.tag.Equals("BlackPiece"))
                    {
                        BlackPocketedThisTurn++;
                    }
                }
                //If No White Piece Pocketted
                if (BlackPocketedThisTurn == 0)
                {
                    DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Info, "No Black Piece Pocketed");
                    //Returning Queen if not Covered
                    if (!SecondPlayerQueenCovered && SecondPlayerQueenPocketed)
                    {
                        bool QueenReturned = false;
                        foreach (GameObject G in SecondPlayerTempPocketedArray)
                        {
                            if (G.tag.Equals("Queen"))
                            {
                                G.transform.localPosition = Vector3.zero;
                                G.GetComponent <Rigidbody> ().isKinematic = false;
                                SecondPlayerQueenPocketed = false;
                                QueenReturned             = true;
                                break;
                            }
                        }
                        if (!QueenReturned)
                        {
                            foreach (GameObject G in SecondPlayerPocketedArray)
                            {
                                if (G.tag.Equals("Queen"))
                                {
                                    G.transform.localPosition = Vector3.zero;
                                    G.GetComponent <Rigidbody> ().isKinematic = false;
                                    SecondPlayerPocketedArray.Remove(G);
                                    SecondPlayerQueenPocketed = false;
                                    QueenReturned             = true;
                                    break;
                                }
                            }
                        }
                    }
                    //Changing Turn
                    yield return(new WaitForSeconds(1f));

                    PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.FirstPlayer;
                    GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.FirstPlayer;
                }
                //If Some pieces are pocketted
                else
                {
                    DisplayScoreScript.ShowNotification(DisplayScores.NotificationTypeEnum.Score, BlackPocketedThisTurn.ToString() + " Piece(s) Pocketed");
                    //Adding All White Pieces to Our Array
                    foreach (GameObject G in SecondPlayerTempPocketedArray)
                    {
                        if (G.tag.Equals("BlackPiece") || G.tag.Equals("Queen"))
                        {
                            SecondPlayerPocketedArray.Add(G);
                        }
                    }
                    yield return(new WaitForSeconds(1f));

                    PrevPlayerTurn             = PlayerStateHolder.PlayerEnum.SecondPlayer;
                    GameStateHolder.PlayerTurn = PlayerStateHolder.PlayerEnum.SecondPlayer;
                }
                //Giving Due Penality Piece if Possible
                while (SecondPlayerPocketedArray.Count > 0)
                {
                    if (SecondPlayerPenalityDue > 0)
                    {
                        ((GameObject)SecondPlayerPocketedArray [0]).transform.localPosition = Vector3.zero;
                        ((GameObject)SecondPlayerPocketedArray [0]).GetComponent <Rigidbody> ().isKinematic = false;
                        SecondPlayerPocketedArray.RemoveAt(0);
                        SecondPlayerPenalityDue--;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            if (GameStateHolder.GameMode == GameStateHolder.GameModesEnum.MultiPlayer && (SecondPlayerQueenCovered && PlayerStateHolder.PlayerType == PlayerStateHolder.PlayerEnum.SecondPlayer) && SecondPlayerPocketedArray.Count == 10)
            {
                int ScoresToSave = GetScores(PlayerStateHolder.PlayerName);
                ScoresToSave += 10;
                SaveScores(PlayerStateHolder.PlayerName, ScoresToSave);
                PlayerPrefs.SetInt("Winner", 2);
                PlayerPrefs.Save();
                SceneManager.LoadScene("EndGame");
            }
            break;
        }
        //Placing Striker
        GameObject Striker = GameObject.FindGameObjectWithTag("Striker");

        Striker.GetComponent <Rigidbody> ().velocity        = Vector3.zero;
        Striker.GetComponent <Rigidbody> ().angularVelocity = Vector3.zero;
        switch (GameStateHolder.PlayerTurn)
        {
        case PlayerStateHolder.PlayerEnum.FirstPlayer:
            Striker.transform.localPosition = new Vector3(0f, 0f, (-1) * StrikerZeroPos);
            Striker.transform.localRotation = Quaternion.identity;
            break;

        case PlayerStateHolder.PlayerEnum.SecondPlayer:
            Striker.transform.localPosition = new Vector3(0f, 0f, StrikerZeroPos);
            Striker.transform.localRotation = Quaternion.Euler(0f, 180f, 0f);
            break;
        }
        //CoroutineStarted false so that it can run again
        MainCoroutineStarted = false;
        yield return(null);
    }