115 lines
3.8 KiB
C#
115 lines
3.8 KiB
C#
using System;
|
|
using BriarQueen.Data.Identifiers;
|
|
using BriarQueen.Framework.Assets;
|
|
using BriarQueen.Framework.Coordinators.Events;
|
|
using BriarQueen.Framework.Managers.Input;
|
|
using BriarQueen.Framework.Managers.IO;
|
|
using BriarQueen.Framework.Managers.Levels;
|
|
using BriarQueen.Framework.Registries;
|
|
using BriarQueen.Framework.Services.Game;
|
|
using Cysharp.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.ResourceManagement.AsyncOperations;
|
|
using UnityEngine.ResourceManagement.ResourceProviders;
|
|
using VContainer;
|
|
|
|
namespace BriarQueen.Game.Cinematics
|
|
{
|
|
public class OpeningCinematic : BaseCinematic
|
|
{
|
|
private AddressableManager _addressableManager;
|
|
private AssetRegistry _assetRegistry;
|
|
private GameService _gameService;
|
|
private LevelManager _levelManager;
|
|
private SaveManager _saveManager;
|
|
|
|
private SceneInstance _loadedScene;
|
|
private AsyncOperationHandle<SceneInstance> _loadedSceneHandle;
|
|
|
|
protected async UniTaskVoid Start()
|
|
{
|
|
var destroyToken = this.GetCancellationTokenOnDestroy();
|
|
|
|
try
|
|
{
|
|
if (_assetRegistry == null ||
|
|
!_assetRegistry.TryGetReference(
|
|
AssetKeyIdentifiers.Get(SceneKey.GameScene),
|
|
out var loadedSceneRef))
|
|
{
|
|
Debug.LogWarning("[OpeningCinematic] Missing GameScene reference in AssetRegistry.");
|
|
return;
|
|
}
|
|
|
|
_loadedSceneHandle = await _addressableManager.LoadSceneAsync(
|
|
loadedSceneRef,
|
|
autoLoad: false,
|
|
cancellationToken: destroyToken);
|
|
|
|
if (_loadedSceneHandle.IsValid())
|
|
_loadedScene = _loadedSceneHandle.Result;
|
|
else
|
|
{
|
|
Debug.LogWarning("[OpeningCinematic] Failed to preload GameScene.");
|
|
return;
|
|
}
|
|
|
|
await PlayCinematic(destroyToken);
|
|
}
|
|
catch (OperationCanceledException)
|
|
{
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogException(ex);
|
|
}
|
|
}
|
|
|
|
protected override async UniTask OnCinematicEnd()
|
|
{
|
|
if (!_loadedSceneHandle.IsValid())
|
|
{
|
|
Debug.LogWarning("[OpeningCinematic] Game scene handle invalid; cannot transition.");
|
|
await _gameService.LoadMainMenu();
|
|
return;
|
|
}
|
|
|
|
gameObject.SetActive(false);
|
|
|
|
await _loadedScene.ActivateAsync().ToUniTask();
|
|
await _gameService.SwapGameSceneHandle(_loadedSceneHandle);
|
|
|
|
if (_saveManager.CurrentSave != null)
|
|
_saveManager.CurrentSave.OpeningCinematicPlayed = true;
|
|
|
|
var levelLoaded = await _levelManager.LoadLevel(
|
|
AssetKeyIdentifiers.Get(LevelKey.ChapterOneVillageEdge));
|
|
|
|
if (!levelLoaded)
|
|
{
|
|
Debug.LogError(
|
|
"[OpeningCinematic] Failed to load ChapterOneVillageEdge after cinematic. Returning to main menu.");
|
|
await _gameService.LoadMainMenu();
|
|
}
|
|
}
|
|
|
|
[Inject]
|
|
public void Construct(
|
|
AddressableManager addressableManager,
|
|
AssetRegistry assetRegistry,
|
|
EventCoordinator eventCoordinator,
|
|
LevelManager levelManager,
|
|
GameService gameService,
|
|
InputManager inputManager,
|
|
SaveManager saveManager)
|
|
{
|
|
base.Construct(eventCoordinator, inputManager);
|
|
|
|
_addressableManager = addressableManager;
|
|
_assetRegistry = assetRegistry;
|
|
_levelManager = levelManager;
|
|
_gameService = gameService;
|
|
_saveManager = saveManager;
|
|
}
|
|
}
|
|
} |