Skip to content
Snippets Groups Projects
GameManager.cs 6.40 KiB
using System.Collections;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    private int turnDuration;
    [SerializeField] private GameObject ballPrefab;
    [SerializeField] private GameObject playerPrefab;
    [SerializeField] private GameObject opponentPrefab;
    [SerializeField] private Transform[] targets;
    [SerializeField] private Transform[] spawPoints;
    [SerializeField] private UnityEngine.UI.Text timer;
    [SerializeField] private UnityEngine.UI.Text score;
    private int maxScore;
    private float currentTime;
    private bool inTurn;
    private bool threw;
    private bool scored;
    private int playerScore;
    private int opponentScore;
    private GameObject ball;
    private GameObject player;
    private PlayerController playerController;
    private GameObject npc;
    private OpponentController npcController;

    private void Start()
    {
        BallController.ballContact += verifyEndTurn;
        BasketController.score += wasScored;

        player = Instantiate(playerPrefab, spawPoints[0].position, spawPoints[0].rotation) as GameObject;
        npc = Instantiate(opponentPrefab, spawPoints[1].position, spawPoints[1].rotation) as GameObject;
        playerController = player.GetComponent<PlayerController>();
        npcController = npc.GetComponent<OpponentController>();
        playerController.setListenner(npcController);
        npcController.setListenner(playerController);
        npc.GetComponent<IAMovementScript>().setPlayerTransform(player.transform);
        FindObjectOfType<ForceBarController>().setPlayer(player);
        playerController.setTarget(targets[0]);
        npcController.setTarget(targets[1]);
        inTurn = true;
        threw = false;
        playerScore = 0;
        opponentScore = 0;
        scored = false;
        maxScore = SettingsPersistance.INSTANCE.maxPoints;
        turnDuration = SettingsPersistance.INSTANCE.turnDuration;
        score.text = "Player " + playerScore + " x " + opponentScore + " NPC";
    }

    private void Update()
    {
        timer.text = System.Math.Round(turnDuration - currentTime, 1).ToString(); 
        if (inTurn)
        {
            currentTime += Time.deltaTime;
        }
    }

    private void FixedUpdate()
    {
        if (currentTime >= turnDuration)
        {
            StartCoroutine(endTurn());
        }
    }

    private IEnumerator endTurn()
    {
        inTurn = false;
        currentTime = 0;
        npcController.enabled = false;
        playerController.enabled = false;
        stopAnimations();
        player.GetComponent<Rigidbody2D>().velocity = Vector2.zero;
        npc.GetComponent<Rigidbody2D>().velocity = Vector2.zero;
        yield return new WaitForSecondsRealtime(1);
        //do something

        verifyEndGame();

        StartCoroutine(setupTurn());
    }

    private IEnumerator setupTurn()
    {
        npcController.enabled = true;
        playerController.enabled = true;
        playerController.moveToPosition(spawPoints[0], spawPoints[2]);
        npcController.moveToPosition(spawPoints[3], spawPoints[1]);
        yield return new WaitForSecondsRealtime(1);
        //do something
        Destroy(ball);
        scored = false;
        StartCoroutine(startTurn());
    }

    private IEnumerator startTurn()
    {
        inTurn = true;
        playerController.changeTurn();
        npcController.changeTurn();
        threw = false;
        yield return null;
    }

    public void shoot(float force, Transform throwPoint, Transform target)
    {
        if (!threw)
        {
            threw = true;
            float xdistance;
            float time = SettingsPersistance.INSTANCE.difficulty.getForce() + force <= 0 ? -force : SettingsPersistance.INSTANCE.difficulty.getForce() + force;
            xdistance = target.position.x - throwPoint.position.x;
            float ydistance;
            ydistance = target.position.y - throwPoint.position.y;

            float throwAngle; 
            throwAngle = Mathf.Atan((ydistance + calculateGravity() * (time * time)) / xdistance);
            float totalVelo = xdistance / (Mathf.Cos(throwAngle) * time);

            float xVelo, yVelo;
            xVelo = totalVelo * Mathf.Cos(throwAngle);
            yVelo = totalVelo * Mathf.Sin(throwAngle);

            GameObject bulletInstance = Instantiate(ballPrefab, throwPoint.position, throwPoint.rotation) as GameObject;
            bulletInstance.GetComponent<Rigidbody2D>().velocity = new Vector2(xVelo, yVelo);
            StartCoroutine(setupEndTurn());
        }
    }

    private IEnumerator setupEndTurn()
    {
        inTurn = false;
        currentTime = 0;
        npcController.enabled = false;
        playerController.enabled = false;
        yield return new WaitUntil(() => currentTime > turnDuration);
    }

    private float calculateGravity()
    {
        return Physics2D.gravity.y / -2;
    }

    public float getCurrentTime()
    {
        return currentTime;
    }

    public float getTurnDuration()
    {
        return turnDuration;
    }

    private void stopAnimations()
    {
        if (player.GetComponent<Animation>() != null)
        {
            player.GetComponent<Animation>().Stop();
        }
        if (npc.GetComponent<Animation>() != null)
        {
            npc.GetComponent<Animation>().Stop();
        }
    }

    public void verifyEndTurn(GameObject obj)
    {
        if (scored)
        {
            if (playerController.isMyturn())
            {
                playerScore += playerController.getShootLocation();
            }
            else
            {
                opponentScore += npcController.getShootLocation();
            }
        }
        score.text = "Player " + playerScore + " x " + opponentScore + " Npc";
        currentTime = turnDuration + 1f;
        ball = obj;
        ball.GetComponent<Collider2D>().enabled = false;
        Rigidbody2D ballRb = ball.GetComponent<Rigidbody2D>();
        ballRb.sharedMaterial.friction = 0;
        ballRb.velocity = Vector2.zero;
        ballRb.gravityScale = 0;
    }

    private void verifyEndGame()
    {
        if (playerScore >= maxScore)
        {
            Debug.Log("Player wins");
            UnityEngine.SceneManagement.SceneManager.LoadScene("Menu");
        }
        if (opponentScore >= maxScore)
        {
            Debug.Log("NPC wins");
            UnityEngine.SceneManagement.SceneManager.LoadScene("Menu");
        }
    }

    private void wasScored()
    {
        scored = true;
    }
}