using System.Threading.Tasks; using UnityEngine; using UnityEngine.SceneManagement; using Vanguard.Api.Contracts; using Vanguard.Battle; namespace Vanguard.App { /// /// Переходы между сценами-экранами. Boot и VanguardApp остаются /// персистентными; данные перехода (выбранная колода, тикет) временно /// лежат здесь и забираются целевой сценой. /// public sealed class SceneFlow { public const string Boot = "Boot"; public const string Login = "Login"; public const string Lobby = "Lobby"; public const string Community = "Community"; public const string DeckBuilder = "DeckBuilder"; public const string Battle = "Battle"; public const string PlaymatSandbox = "GameBoard3D"; public DeckDto PendingQueueDeck { get; private set; } public MatchConnectionInfo PendingMatch { get; private set; } public Task LoadLoginAsync() { PendingQueueDeck = null; PendingMatch = null; return LoadAsync(Login); } public Task LoadLobbyAsync() => LoadAsync(Lobby); public Task LoadCommunityAsync() => LoadAsync(Community); public Task LoadDeckBuilderAsync() => LoadAsync(DeckBuilder); public Task OpenLobbyWithQueueAsync(DeckDto deck) { PendingQueueDeck = deck; return LoadAsync(Lobby); } public Task LoadBattleAsync(MatchConnectionInfo info) { PendingMatch = info; return LoadAsync(Battle); } public DeckDto ConsumePendingQueueDeck() { var deck = PendingQueueDeck; PendingQueueDeck = null; return deck; } public MatchConnectionInfo ConsumePendingMatch() { var match = PendingMatch; PendingMatch = null; return match; } public async Task LoadAsync(string sceneName) { if (string.IsNullOrEmpty(sceneName)) return; if (SceneManager.GetActiveScene().name == sceneName) return; var operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single); if (operation == null) { Debug.LogError("Сцена не добавлена в Build Settings: " + sceneName); return; } while (!operation.isDone) await Task.Yield(); } } }