using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; using System.Collections; public class LevelEnder : MonoBehaviour { public WorldFiller worldFiller; public BallSpawner ballSpawner; public MultiplierSpawner multiplierSpawner; public SharkSpawner sharkSpawner; public CakeSpawner cakeSpawner; public MusicManager musicManager; public Player player; public SpriteRenderer levelEndTally; public SpriteRenderer levelEndTallyBackground; public Animator levelEndTallyAnimator; public AudioClip victory; public AudioClip showBonus; public AudioClip countBonus; public AudioClip multiplierBonusSound; public AudioClip multiplierPenaltySound; public Text timeBonus; public Text overachieverBonus; public Text overachieverPercent; public Text isolationBonus; public Text isolationCount; public Text multiplierBonus; public Text totalBonus; public SpriteRenderer overarchieverPercentLabel; public SpriteRenderer isolationCountSingleLabel; public SpriteRenderer isolationCountPluralLabel; private AudioSource audioSource; private bool levelEnded = false; private bool tallyShown = false; private bool addScoreToPlayer = false; private int scoreTotal = 0; private float addScoreTimer = 0.0f; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { audioSource = GetComponent(); } // Update is called once per frame void Update() { // Check for victory condition. if ( player && player.percentCovered >= 80 && !levelEnded ) { musicManager.PauseMusic(); audioSource.PlayOneShot(victory); levelEnded = true; StartCoroutine(EndLevelAfterDelay()); } if ( levelEnded && ( Mouse.current.leftButton.wasPressedThisFrame || Keyboard.current.anyKey.wasPressedThisFrame ) ) { addScoreToPlayer = true; } if (addScoreToPlayer && tallyShown) { addScoreTimer += Time.deltaTime; if (addScoreTimer >= 0.02f && scoreTotal > 0) { addScoreTimer = 0.0f; addScoreToPlayer = AddScore(); } } } public void EndLevel() { tallyShown = false; // Stop all spawners. ballSpawner.StopSpawning(); multiplierSpawner.StopSpawning(); sharkSpawner.StopSpawning(); cakeSpawner.StopSpawning(); // Show the level end tally. musicManager.PlayVictoryMusic(); levelEndTally.enabled = true; levelEndTallyBackground.enabled = true; levelEndTallyAnimator.ResetTrigger("replay"); levelEndTallyAnimator.SetTrigger("replay"); // Destroy all objects other than the player. ClearBoard(); } private void ClearBoard() { // Clear the game board by destroying all objects except the player. var yummies = GameObject.FindGameObjectsWithTag("Yummy"); var multipliers = GameObject.FindGameObjectsWithTag("Multiplier"); var shark = GameObject.FindGameObjectWithTag("Shark"); foreach (var yummy in yummies) { Destroy(yummy); } foreach (var multiplier in multipliers) { Destroy(multiplier); } if (shark != null) { Destroy(shark); } worldFiller.ClearSpawnedWalls(); } private bool AddScore() { audioSource.PlayOneShot(countBonus); int scoreToAdd = scoreTotal > 100 ? 100 : scoreTotal; scoreTotal -= 100; scoreTotal = Mathf.Max(scoreTotal, 0); player.score += scoreToAdd; ShowBonus(totalBonus, scoreTotal, null, null, null, showBonus); if (scoreTotal <= 0) { audioSource.PlayOneShot(showBonus); return false; } return true; } private void ShowBonus(Text bonusText, int bonusValue, int? bonusCount, Text countLabel, SpriteRenderer bonusLabel, AudioClip bonusSound) { bonusText.text = $"{bonusValue}"; if (bonusCount.HasValue) { countLabel.text = $"{bonusCount.Value}"; } if (bonusLabel) { bonusLabel.enabled = true; } audioSource.PlayOneShot(bonusSound); } private IEnumerator EndLevelAfterDelay() { yield return new WaitForSeconds(victory.length); EndLevel(); // Wait a moment before showing the bonus tally. yield return new WaitForSeconds(1.5f); scoreTotal = player.bonus; ShowBonus(timeBonus, player.bonus, null, null, null, showBonus); ShowBonus(totalBonus, scoreTotal, null, null, null, showBonus); // Calculate and show the overachiever bonus. yield return new WaitForSeconds(0.75f); int overachieverBonusCount = 20 - (100 - player.percentCovered); int overachieverBonusValue = 100 * overachieverBonusCount; scoreTotal += overachieverBonusValue; ShowBonus( overachieverBonus, overachieverBonusValue, overachieverBonusCount, overachieverPercent, overarchieverPercentLabel, showBonus ); ShowBonus(totalBonus, scoreTotal, null, null, null, showBonus); // Calculate and show the isolation bonus. yield return new WaitForSeconds(0.75f); int isolationBonusCount = 0; int isolationBonusValue = 100 * isolationBonusCount; scoreTotal += isolationBonusValue; ShowBonus( isolationBonus, isolationBonusValue, isolationBonusCount, isolationCount, isolationBonusCount == 1 ? isolationCountSingleLabel : isolationCountPluralLabel, showBonus ); ShowBonus(totalBonus, scoreTotal, null, null, null, showBonus); // Calculate and show the multiplier bonus if applicable. if (player.multiplier != 1.0f) { yield return new WaitForSeconds(0.75f); int multiplierValue = player.multiplier == 0.5f ? 1 : (int)(player.multiplier); scoreTotal = (int)(scoreTotal * player.multiplier); ShowBonus( multiplierBonus, multiplierValue, null, null, null, multiplierValue == 1 ? multiplierPenaltySound : multiplierBonusSound ); ShowBonus(totalBonus, scoreTotal, null, null, null, showBonus); } tallyShown = true; yield return new WaitForSeconds(7.3f - 3.0f - (player.multiplier != 1.0f ? 0.75f : 0.0f)); addScoreToPlayer = true; } }