using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine.Rendering.PostProcessing; [RequireComponent(typeof(AudioSource))] public class GameManager : MonoBehaviour { public AudioClip goalSound; [Header("Tankstellen")] public int scorePlayer1 = 0; public int scorePlayer2 = 0; public int maxGoals = 1; [Header("Player")] public float inputTimeout = 0.3f; public GameObject player1; public GameObject player2; public GameObject[] players; [Header("Boll")] public GameObject ball; private Transform player1Initial, player2Initial, ballInitial; [Header("Misc")] public Vector3[] initialPositions; public Quaternion[] initialRotations; public GameObject camera; public AudioClip tensionTrack; public AudioClip finalTrack; public AudioClip finishedTrack; [Header("Effects")] public int effectStage = 0; public float cameraRotationSpeed = 1; public float goalSizeSpeed = 1; public GameObject topWall, bottomWall; public float wallSpeed = 1; public GameObject goalBlue, goalRed; public PhysicMaterial bouncy; [Header("UI")] private float stageNameCountdown = 1; private float stageNameT = 1; public float stageNameDuration = 1; public float stageSmall = 1; public GameObject stageName; public Text scoreLabel; public Text winLabel; public PostProcessProfile postProcess; public ColorGrading colorGadingLayer; private AudioSource audioSource; private GameSettings settings; private MusicManager musicManager; // Start is called before the first frame update void Awake() { Cursor.visible = false; this.players = GameObject.FindGameObjectsWithTag("Player"); this.initialPositions = new Vector3[this.players.Length]; this.initialRotations = new Quaternion[this.players.Length]; for (int i = 0; i < this.players.Length; i++) { this.initialPositions[i] = this.players[i].transform.position; this.initialRotations[i] = this.players[i].transform.rotation; } this.audioSource = GetComponent(); this.player1Initial = new GameObject().transform; this.player1Initial.position = this.player1.transform.position; this.player1Initial.rotation = this.player1.transform.rotation; this.player2Initial = new GameObject().transform; this.player2Initial.position = this.player2.transform.position; this.player2Initial.rotation = this.player2.transform.rotation; this.ballInitial = new GameObject().transform; this.ballInitial.position = this.ball.transform.position; winLabel.transform.gameObject.SetActive(false); this.postProcess.TryGetSettings(out this.colorGadingLayer); //apply global settings try { this.settings = GameObject.Find("/settings").GetComponent(); this.musicManager = GameObject.Find("/BackgroundMusic").GetComponent(); if (this.settings.playerMode == 1) { this.player2.GetComponent().aiControlled = true; } } catch (System.Exception) { Debug.LogWarning("No settings or music manager object available!"); } } // Update is called once per frame void Update() { if (this.stageNameCountdown <= this.stageSmall) { this.stageNameT += 4.0f * Time.deltaTime; this.stageName.GetComponent().fontSize = (int)Mathf.Lerp(170, 100, this.stageNameT); } if (this.stageNameCountdown <= 0) { this.stageName.SetActive(false); } this.stageNameCountdown -= Time.deltaTime; if (this.effectStage >= 1) { //Walls this.stageName.GetComponent().text = "Walls"; this.topWall.SetActive(true); this.bottomWall.SetActive(true); } if (this.effectStage >= 2) { //Wall movement this.stageName.GetComponent().text = "Walls move"; this.topWall.transform.position = new Vector3(this.topWall.transform.position.x, this.topWall.transform.position.y, Mathf.Lerp(5, 18, Mathf.PingPong(Time.time * this.wallSpeed, 1))); this.bottomWall.transform.position = new Vector3(this.bottomWall.transform.position.x, this.bottomWall.transform.position.y, Mathf.Lerp(5, 18, Mathf.PingPong(Time.time * this.wallSpeed, 1)) * -1); } if (this.effectStage >= 3) { //Dynamic goals this.stageName.GetComponent().text = "Goal size"; float size = Mathf.Clamp(Mathf.PingPong(Time.time * this.goalSizeSpeed, 15), 5, 15); this.goalRed.transform.localScale = new Vector3(this.goalRed.transform.localScale.x, this.goalRed.transform.localScale.y, size); this.goalBlue.transform.localScale = new Vector3(this.goalBlue.transform.localScale.x, this.goalBlue.transform.localScale.y, size); } if (this.effectStage >= 4) { //Rotating Camera this.stageName.GetComponent().text = "Rotating camera"; this.camera.GetComponent().orthographicSize = 48.0f; this.camera.transform.Rotate(new Vector3(0, 0, 1) * this.cameraRotationSpeed * Time.deltaTime); } if (this.effectStage >= 5) { //Ball bouncer this.stageName.GetComponent().text = "Bouncy ball"; this.ball.GetComponent().material = this.bouncy; } if (this.effectStage >= 6) { //Ball size this.stageName.GetComponent().text = "Smol bol"; this.ball.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); } if (this.effectStage >= 7) { //On ice this.stageName.GetComponent().text = "On ice"; this.player1.GetComponent().drag = .3f; this.player2.GetComponent().drag = .3f; this.colorGadingLayer.temperature.value = -40.0f; } if (this.effectStage >= 8) { //Unstoppable this.stageName.GetComponent().text = "Unstoppable"; this.player1.GetComponent().unstoppable = true; this.player2.GetComponent().unstoppable = true; } if (Input.GetKeyDown(KeyCode.P)) { GameObject aiPlayer = GameObject.Find("PlayerBlue"); aiPlayer.GetComponent().aiControlled = !aiPlayer.GetComponent().aiControlled; aiPlayer.GetComponent().enabled = true; } //Debug.Log("Calculating matrix: Vector(" + Time.deltaTime * Random.Range(12, 123) + ")"); //Debug.Log("Hacking pentagon: in pr0gress..."); this.scoreLabel.text = this.scorePlayer1 + " : " + this.scorePlayer2; if (this.scorePlayer1 >= maxGoals) { winLabel.text = "Player 1 won!"; winLabel.transform.gameObject.SetActive(true); Time.timeScale = 0.0f; } if (this.scorePlayer2 >= maxGoals) { winLabel.text = "Player 2 won!"; winLabel.transform.gameObject.SetActive(true); Time.timeScale = 0.0f; } int currentMaxScore = Mathf.Max(this.scorePlayer1, this.scorePlayer2); if (currentMaxScore == 3) { this.musicManager.CrossfadeToTrack(this.tensionTrack, 0.2f); } if (currentMaxScore == 4) { this.musicManager.CrossfadeToTrack(this.finalTrack); } if (this.scorePlayer2 >= maxGoals || this.scorePlayer1 >= maxGoals) { this.musicManager.CrossfadeToTrack(this.finishedTrack, 1.5f); this.stageName.GetComponent().text = "Press R to restart \n Esc for main menu"; this.stageName.GetComponent().fontSize = 80; if (Input.GetKeyDown(KeyCode.R)) { Time.timeScale = 1; SceneManager.LoadScene(SceneManager.GetActiveScene().name); this.colorGadingLayer.temperature.value = 0.0f; } if (Input.GetKeyDown(KeyCode.Escape)) { Cursor.visible = true; Time.timeScale = 1; SceneManager.LoadScene("menu"); this.colorGadingLayer.temperature.value = 0.0f; //Do this persist on scene unload? } } } public void ApplyEffects() { this.stageName.SetActive(true); this.stageName.GetComponent().fontSize = 145; this.stageNameT = 0f; this.stageNameCountdown = this.stageNameDuration; this.effectStage = this.scorePlayer1 + this.scorePlayer2; } public void ResetPositions() { this.ApplyEffects(); this.audioSource.clip = this.goalSound; this.audioSource.Play(); for (int i = 0; i < this.players.Length; i++) { this.players[i].transform.position = this.initialPositions[i]; this.players[i].transform.rotation = this.initialRotations[i]; this.players[i].GetComponent().velocity = Vector3.zero; this.players[i].GetComponent().InputTimeout(this.inputTimeout); } this.ball.transform.position = this.ballInitial.position; this.ball.transform.GetComponent().velocity = Vector3.zero; } public void LockControls(float duration) { for (int i = 0; i < this.players.Length; i++) { this.players[i].GetComponent().InputTimeout(duration); } } }