using Godot; using Godot.Collections; using System.Linq; public partial class Main : Node { [Export] public Array Levels; [Export] public PackedScene GameManager; [Export] private Label _fpsCounter; public int NumberOfPlayers = 0; public override void _Ready() { Input.MouseMode = Input.MouseModeEnum.Captured; } public override void _Process(double delta) { _fpsCounter.Text = $"FPS: {Engine.GetFramesPerSecond()}"; } public void LoadLevel(int indexToLoad, int numberOfPlayers) { var sceneToLoad = Levels.ElementAt(indexToLoad); CallDeferred(nameof(DeferredGoToScene), sceneToLoad); NumberOfPlayers = numberOfPlayers; var gameManager = GameManager.Instantiate(); AddChild(gameManager); var gameManagerInstance = (GameManager)gameManager; var bgmPlayer = GetTree().Root.GetNode("BgmPlayer"); bgmPlayer.ProcessMode = ProcessModeEnum.Always; bgmPlayer.SetBGMFromFilepath("Audio/BGM/An-Imitation-of-Heaven.ogg"); bgmPlayer.PlayBGM(); var animationNode = GetNode("SceneTransition/AnimationPlayer"); animationNode.Play($"Level{indexToLoad + 1}"); animationNode.AnimationFinished += EnableCharacterSelect; } public void LoadNextLevel(int currentSceneIndex) { if (currentSceneIndex < Levels.Count()) { var currentScene = Levels.ToList().ElementAt(currentSceneIndex); CallDeferred(nameof(DeferredGoToScene), Levels.ElementAt(currentSceneIndex)); var animationNode = GetNode("SceneTransition/AnimationPlayer"); animationNode.Play($"Level{currentSceneIndex + 1}"); animationNode.AnimationFinished += EnableCharacterSelect; } } private void DeferredGoToScene(PackedScene sceneToAdd) { if (GetTree().GetFirstNodeInGroup("Level") != null) GetTree().GetFirstNodeInGroup("Level").QueueFree(); var nextScene = GD.Load(sceneToAdd.ResourcePath); var newScene = nextScene.Instantiate(); GetTree().Root.AddChild(newScene); } private void EnableCharacterSelect(StringName animationName) { GD.Print("On animation finished: Enable characters"); var gameManagerInstance = GetNode("GameManager"); foreach (var player in gameManagerInstance.Players) gameManagerInstance.OnHandleCharacterSelectUI(player); GetTree().Paused = true; var animationNode = GetNode("SceneTransition/AnimationPlayer"); animationNode.AnimationFinished -= EnableCharacterSelect; } }