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