// Contains the diffrent ways to move players.
    #region Move Player Methods

    // Moves a player to a x,y location.
    private void MovePlayerDirect(int x, int y, FantPlayer fp)
    {
        gridPlayer[fp.Poss.x, fp.Poss.y] = null;
        gridPlayer[x, y]      = fp;
        fp.transform.position = new Vector3(OffSetX(x), OffSetY(y) + 3f, -1);
        fp.Poss = new Vector2Int(x, y);
        SpriteRenderer sr = fp.GetComponent <SpriteRenderer>();

        sr.sortingOrder = -y;
    }
 // Plugs all of the players stats into fields.
 private void ShowPlayerStats(FantPlayer player)
 {
     actionText.text   = ("Action: " + player.Actions.ToString());
     raceText.text     = ("Race: " + player.Race.ToString());
     classText.text    = ("Class: " + player.tag);
     passingText.text  = ("Passing: " + player.Passing);
     movingText.text   = ("Moving: " + player.Moving);
     shootingText.text = ("Shooting: " + player.Shooting);
     combatText.text   = ("Combat: " + player.Combat);
     defenseText.text  = ("Defense: " + player.Defence);
 }
    // When you select a peice it will go though to logic to figure out if its on your team, if the player can move etc.
    private void SelectPiece(int x, int y)
    {
        //out of bounds
        if (x < 0 || x >= gridPlayer.GetLength(0) || y < 0 || y >= gridPlayer.GetLength(1))
        {
            return;
        }

        //gets access to the player
        FantPlayer fp = gridPlayer[x, y];

        if (fp != null)
        {
            selectedPlayer = fp;
            DeleteTileMods();
            Debug.Log(selectedPlayer.name);
            ShowPlayerStats(selectedPlayer);
            if (IsOnTeam(selectedPlayer))
            {
                if (selectedPlayer.Actions < 2)
                {
                    selectedPlayer.Poss = new Vector2Int(x, y);
                    canAct = true;
                    if (selectedPlayer.HasBall)
                    {
                        CoverActionsBar(2);
                    }
                    else
                    {
                        CoverActionsBar(1);
                    }
                }
            }
            else
            {
                CoverActionsBar(0);
            }
        }
    }
    private void DoPass()
    {
        if (selectedPlayer.Actions > 2)
            return;

        passingPlayer = selectedPlayer;

        Vector2 passPoss = (Camera.main.ScreenToWorldPoint(Input.mousePosition));
        passPoss.x = (int)(passPoss.x / 5);
        passPoss.y = (int)((passPoss.y - 15) / 5);
        for (int x = 0; x < gridTile.GetLength(0); x++)
        {
            for (int y = 0; y < gridTile.GetLength(1); y++)
            {
                if (gridTileMod[x, y] != null)
                {
                    if (x == passPoss.x && y == passPoss.y)
                    {

                        gridPlayer[selectedPlayer.Poss.x, selectedPlayer.Poss.y] = null;
                        gridPlayer[x, y] = selectedPlayer;


                        DeleteTileMods();


                        passingPlayer.HasBall = false;
                        selectedPlayer.HasBall = true;

                        passingPlayer.Actions -= 1;
                        CoverActionsBar(0);
                        actionAttack = false;
                        ShowPlayerStats(selectedPlayer);

                    }
                }
            }
        }
    }
    private void SeePass(int playerX, int playerY)
    {
        FantPlayer fp = gridPlayer[playerX, playerY];
        int passDistance = selectedPlayer.Passing + 7;
        List<Vector2> passRadius = new List<Vector2>();
        PlayerRace playerTeam = selectedPlayer.Race;

        // If tile mods have already been drawn it deletes it.
        if (drawnOnMap)
        {
            DeleteTileMods();
        }
        else
        {
            drawnOnMap = true;
        }

        for (int x = 0; x < gridTile.GetLength(0); x++)
        {
            for (int y = 0; y < gridTile.GetLength(1); y++)
            {
                if (gridPlayer[x, y] != null)
                {
                    if (gridPlayer[x, y].Race == playerTeam)
                    {
                        if (playerX + passDistance > x && playerY + passDistance > y && playerX - passDistance < x && playerY - passDistance < y)
                        {
                            passRadius.Add(new Vector2(x, y));
                            gridTileMod[x, y] = Instantiate(tileGreen, new Vector3(OffSetX(x), OffSetY(y), -.5f), Quaternion.identity);
                            gridTileMod[x, y].name = "Green Tile (" + x + ", " + y + ")";
                        }
                    }
                }

            }
        }
    }
    // Generates a player at an x and y position and is given a type.
    private void GeneratePlayer(int x, int y, PlayerType type, PlayerRace race)
    {
        GameObject go = null;
        int        startingPassing  = 0;
        int        startingMoving   = 0;
        int        startingShooting = 0;
        int        startingCombat   = 0;
        int        startingDefence  = 0;

        #region Switch: Race & Type W/ Benefits

        switch (race)
        {
        case PlayerRace.Human:
            switch (type)
            {
            case PlayerType.PointGuard:
                go               = Instantiate(playerPassGaurd);
                startingCombat   = -1;
                startingDefence  = 0;
                startingMoving   = 1;
                startingPassing  = 2;
                startingShooting = 0;
                break;

            case PlayerType.ShootingGuard:
                go               = Instantiate(playerScoringGuard);
                startingCombat   = 0;
                startingDefence  = -1;
                startingMoving   = 0;
                startingPassing  = 1;
                startingShooting = 2;
                break;

            case PlayerType.SmallForward:
                go               = Instantiate(playerTallForward);
                startingCombat   = 1;
                startingDefence  = 0;
                startingMoving   = 2;
                startingPassing  = 0;
                startingShooting = -1;
                break;

            case PlayerType.PowerForward:
                go               = Instantiate(playerHulkForward);
                startingCombat   = 1;
                startingDefence  = 2;
                startingMoving   = 0;
                startingPassing  = 0;
                startingShooting = -1;
                break;

            case PlayerType.Center:
                go               = Instantiate(playerSmallTitan);
                startingCombat   = 2;
                startingDefence  = 2;
                startingMoving   = -2;
                startingPassing  = 0;
                startingShooting = -2;
                break;

            default:
                Debug.LogError("Human instaniate error");
                break;
            }
            break;

        case PlayerRace.Orc:
            switch (type)
            {
            case PlayerType.PointGuard:
                go               = Instantiate(playerPazzer);
                startingCombat   = -1;
                startingDefence  = 0;
                startingMoving   = 1;
                startingPassing  = 2;
                startingShooting = 0;
                break;

            case PlayerType.ShootingGuard:
                go               = Instantiate(playerShootzer);
                startingCombat   = 0;
                startingDefence  = -1;
                startingMoving   = 0;
                startingPassing  = 1;
                startingShooting = 2;
                break;

            case PlayerType.SmallForward:
                go               = Instantiate(playerSmallDunker);
                startingCombat   = 1;
                startingDefence  = 0;
                startingMoving   = 2;
                startingPassing  = 0;
                startingShooting = -1;
                break;

            case PlayerType.PowerForward:
                go               = Instantiate(playerBuffOrc);
                startingCombat   = 1;
                startingDefence  = 2;
                startingMoving   = 0;
                startingPassing  = 0;
                startingShooting = -1;
                break;

            case PlayerType.Center:
                go               = Instantiate(playerBigBoi);
                startingCombat   = 2;
                startingDefence  = 2;
                startingMoving   = -2;
                startingPassing  = 0;
                startingShooting = -2;
                break;

            default:
                Debug.LogError("Orc instaniate error");
                break;
            }
            break;

        default:
            Debug.LogError("Instaniate player error");
            break;
        }
        #endregion

        FantPlayer fp = go.GetComponent <FantPlayer>();
        fp.Poss = new Vector2Int(x, y);
        MovePlayerDirect(x, y, fp);
        fp.SetStats(startingPassing, startingMoving, startingShooting, startingCombat, startingDefence, race, new Vector2Int(x, y));
        go.transform.SetParent(transform.GetChild(1));
        go.tag  = type.ToString();
        go.name = (race.ToString() + ": " + type.ToString());
        //gridPlayer[x, y] = fp;
    }
 // Checks if a player is on the clients team.
 private bool IsOnTeam(FantPlayer player)
 {
     return(player.Race == teamRace);
 }
    private void DoAttack()
    {
        if (selectedPlayer.Actions > 2)
        {
            return;
        }

        int attackingPlayerCombat = selectedPlayer.Combat;

        attackingPlayer = selectedPlayer;

        Vector2 enemyPos = (Camera.main.ScreenToWorldPoint(Input.mousePosition));

        enemyPos.x = (int)(enemyPos.x / 5);
        enemyPos.y = (int)((enemyPos.y - 15) / 5);
        for (int x = 0; x < gridTile.GetLength(0); x++)
        {
            for (int y = 0; y < gridTile.GetLength(1); y++)
            {
                if (gridTileMod[x, y] != null)
                {
                    if (x == enemyPos.x && y == enemyPos.y)
                    {
                        selectedPlayer = gridPlayer[x, y];

                        DeleteTileMods();

                        int attackRoll = Random.Range(0, 101); //Decides what the combat role is
                        int modifier   = attackingPlayerCombat - selectedPlayer.Defence;

                        switch (modifier)
                        {
                        case 2:
                            if (attackRoll >= 0 && attackRoll <= 15)
                            {
                                //MissGraze();
                                Debug.Log("Miss");
                            }
                            if (attackRoll >= 16 && attackRoll <= 89)
                            {
                                KnockBack();
                                Debug.Log("Back");
                            }
                            if (attackRoll >= 90 && attackRoll <= 100)
                            {
                                KnockOut();
                                Debug.Log("KO");
                            }
                            break;

                        case 1:
                            if (attackRoll >= 0 && attackRoll <= 25)
                            {
                                //MissGraze();
                                Debug.Log("Miss");
                            }
                            if (attackRoll >= 26 && attackRoll <= 95)
                            {
                                KnockBack();
                                Debug.Log("Back");
                            }
                            if (attackRoll >= 90 && attackRoll <= 100)
                            {
                                KnockOut();
                                Debug.Log("KO");
                            }
                            break;

                        case 0:
                            if (attackRoll >= 0 && attackRoll <= 30)
                            {
                                //MissGraze();
                                Debug.Log("Miss");
                            }
                            if (attackRoll >= 31 && attackRoll <= 98)
                            {
                                KnockBack();
                                Debug.Log("Back");
                            }
                            if (attackRoll >= 99 && attackRoll <= 100)
                            {
                                KnockOut();
                                Debug.Log("KO");
                            }
                            break;

                        case -1:
                            if (attackRoll >= 0 && attackRoll <= 35)
                            {
                                //MissGraze();
                                Debug.Log("Miss");
                            }
                            if (attackRoll >= 36 && attackRoll <= 99)
                            {
                                KnockBack();
                                Debug.Log("Back");
                            }
                            if (attackRoll >= 100)
                            {
                                KnockOut();
                                Debug.Log("KO");
                            }
                            break;

                        case -2:
                            if (attackRoll >= 0 && attackRoll <= 69)
                            {
                                //MissGraze();
                                Debug.Log("Miss");
                            }
                            if (attackRoll >= 70 && attackRoll <= 100)
                            {
                                KnockBack();
                                Debug.Log("Back");
                            }
                            break;
                        }

                        selectedPlayer.Actions += 1;
                        CoverActionsBar(0);
                        actionAttack = false;
                        ShowPlayerStats(selectedPlayer);
                    }
                }
            }
        }
    }
    // Moves a player to a position tile to tile with pathing around people.
    private void MovePlayer(int x, int y, FantPlayer fp)
    {
        Vector2Int currentPos = new Vector2Int(fp.Poss.x, fp.Poss.y);
        Vector2Int targetPos  = new Vector2Int(x, y);
        Direction  moveDirection;

        #region Find Direction
        if (currentPos.x > targetPos.x)
        {
            if (currentPos.y > targetPos.y)
            {
                moveDirection = Direction.DownLeft;
            }
            else
            {
                moveDirection = Direction.UpLeft;
            }
        }
        else
        {
            if (currentPos.y > targetPos.y)
            {
                moveDirection = Direction.DownRight;
            }
            else
            {
                moveDirection = Direction.UpRight;
            }
        }
        #endregion

        switch (moveDirection)
        {
        case Direction.UpRight:
            while (currentPos != targetPos)
            {
                if (gridPlayer[currentPos.x + 1, currentPos.y] == null)
                {
                    fp.transform.position = new Vector2(OffSetX(currentPos.x + 1), OffSetY(currentPos.y));
                }
                else
                {
                    if (gridPlayer[currentPos.x, currentPos.y + 1] == null)
                    {
                        fp.transform.position = new Vector2(OffSetX(currentPos.x), OffSetY(currentPos.y + 1));
                    }
                }
            }
            break;

        case Direction.UpLeft:
            break;

        case Direction.DownRight:
            break;

        case Direction.DownLeft:
            break;

        default:
            break;
        }
    }
    // Contains the diffrent ways to move players.
    #region Move Player Methods

    // Moves a player to a x,y location.
    private void MovePlayerDirect(int x, int y, FantPlayer fp)
    {
        fp.transform.position = new Vector3(OffSetX(x), OffSetY(y) + 3f, -1);
        SpriteRenderer sr = fp.GetComponent<SpriteRenderer>();
        sr.sortingOrder = -y;
    }