using System; using Godot; using Godot.Collections; namespace GodotspaceShooter.Scripts; public partial class GameManager : Node { private int asteroidMaxNumber = 3; private int asteroidNumber; private bool gameOver; public bool GameOver { get => gameOver; private set { gameOver = value; SoundManager.Instance.Stop(SoundManager.Sound.BackgroundMusic); SoundManager.Instance.Play(SoundManager.Sound.GameOver); OnGameOver?.Invoke(this,EventArgs.Empty); } } [Export] private Array asteroids; [Export] private Node3D asteroidsContainer; private int level = 1; public int MaxLives { get; private set; } = 10; private int lives = 10; private int nextLevelPoints = 11; private int points; private float spawnRate = 1f; private float spawnTimer; public event EventHandler OnRefreshStats; public event EventHandler OnNewCountdown; public event EventHandler OnGameOver; public int AsteroidNumber { get => asteroidNumber; set { asteroidNumber = value; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } public int Lives { get => lives; set { lives = value; if (lives <= 0) GameOver = true; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } public int Points { get => points; set { points = value; if (points >= nextLevelPoints) NextLevel(); OnRefreshStats?.Invoke(this, EventArgs.Empty); } } public int Level { get => level; private set { level = value; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } public int LastLevelPoints { get; private set; } public int NextLevelPoints { get => nextLevelPoints; private set { nextLevelPoints = value; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } private int AsteroidMaxNumber { get => asteroidMaxNumber; set { asteroidMaxNumber = value; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } private bool gamePaused; public bool GamePaused{ get => gamePaused; set { gamePaused = value; GetTree().Paused = gamePaused; OnRefreshStats?.Invoke(this, EventArgs.Empty); } } private bool countdown; public bool Countdown { get => countdown; set { countdown = value; if (countdown) OnNewCountdown?.Invoke(this, EventArgs.Empty); } } public static GameManager Instance { get; private set; } [Export] public bool Debug { get; private set; } = true; public override void _Ready() { Instance = this; Lives = MaxLives; spawnTimer = spawnRate; Countdown = true; SoundManager.Instance.Play(SoundManager.Sound.BackgroundMusic); } public override void _Process(double delta) { if (!GamePaused && !Countdown) { spawnTimer -= (float)delta; if (spawnTimer < 0) { if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid(); spawnTimer = spawnRate; } } } private void SpawnNewAsteroid() { if (GameOver) return; GD.Print("Spawn new asteroid"); AsteroidNumber++; Node asteroid = asteroids.PickRandom().Instantiate(); asteroidsContainer.AddChild(asteroid); asteroid.Name = $"Asteroid{AsteroidNumber}"; } private void NextLevel() { Ui.Instance.ShowMessage("Next Level!"); Level++; LastLevelPoints = NextLevelPoints; NextLevelPoints = Level * 33; AsteroidMaxNumber = 3 + Level; spawnRate = 1f - Level * 0.1f; } }