Files
A-Fairytale-Gone-Bad-Briar-…/Assets/Scripts/Game/Cinematics/OpeningCinematic.cs

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;
}
}
}