using Godot; using Godot.Collections; namespace Scripts; public partial class GameManager : Node { [Export] private Array asteroids; private float spawnTimer; [Export] private RichTextLabel labelAsteroids; [Export] private RichTextLabel labelLifes; [Export] private RichTextLabel labelPoints; [Export] private RichTextLabel labelLevel; [Export] private RichTextLabel labelNextLevel; [Export] private Node3D asteroidsContainer; public int AsteroidNumber { get => asteroidNumber; set { asteroidNumber = value; RefreshUi(); } } public int Lives { get => lives; set { lives = value; if (lives <= 0) GameOver(); RefreshUi(); } } public int Points { get => points; set { points = value; if (points >= nextLevelPoints) NextLevel(); RefreshUi(); } } public int Level { get => level; private set { level = value; RefreshUi(); } } private int NextLevelPoints { get => nextLevelPoints; set { nextLevelPoints = value; RefreshUi(); } } private int AsteroidMaxNumber { get => asteroidMaxNumber; set { asteroidMaxNumber = value; RefreshUi(); } } private int asteroidMaxNumber = 3; private int lives = 10; private int points; private int nextLevelPoints = 11; private int level = 1; private int asteroidNumber; private float spawnRate = 1f; public static GameManager Instance { get; private set; } public override void _Ready() { Instance = this; spawnTimer = spawnRate; RefreshUi(); } public override void _Process(double delta) { spawnTimer -= (float)delta; if (spawnTimer < 0) { if (AsteroidNumber < asteroidMaxNumber) SpawnNewAsteroid(); spawnTimer = spawnRate; } } private void SpawnNewAsteroid() { GD.Print("Spawn new asteroid"); AsteroidNumber++; Node asteroid = asteroids.PickRandom().Instantiate(); asteroidsContainer.AddChild(asteroid); asteroid.Name = $"Asteroid{AsteroidNumber}"; } private void RefreshUi() { labelLifes.Text = $"Lives: {lives}"; labelAsteroids.Text = $"Asteroids: {asteroidNumber} / {asteroidMaxNumber}"; labelPoints.Text = $"Points: {points}"; labelNextLevel.Text = $"Next Level at: {NextLevelPoints}"; labelLevel.Text = $"Actual Level: {Level}"; } private static void GameOver() => GD.Print("GAME OVER!"); private void NextLevel() { GD.Print("Next Level!"); Level++; NextLevelPoints = Level * 11; AsteroidMaxNumber = 3 + Level; spawnRate = 1f - Level * 0.1f; } public void OnGameAreaBodyExited(Node body) => GD.Print($"{body.Name} leaved GameArea!"); }