85 lines
2.5 KiB
C#
85 lines
2.5 KiB
C#
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using Vanguard.Api.Contracts;
|
|
using Vanguard.Battle;
|
|
|
|
namespace Vanguard.App
|
|
{
|
|
/// <summary>
|
|
/// Переходы между сценами-экранами. Boot и VanguardApp остаются
|
|
/// персистентными; данные перехода (выбранная колода, тикет) временно
|
|
/// лежат здесь и забираются целевой сценой.
|
|
/// </summary>
|
|
public sealed class SceneFlow
|
|
{
|
|
public const string Boot = "Boot";
|
|
public const string Login = "Login";
|
|
public const string Lobby = "Lobby";
|
|
public const string Collection = "Collection";
|
|
public const string DeckBuilder = "DeckBuilder";
|
|
public const string Battle = "Battle";
|
|
|
|
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 LoadCollectionAsync() => LoadAsync(Collection);
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|