using BriarQueen.Data.Identifiers; using BriarQueen.Framework.Coordinators.Events; using BriarQueen.Framework.Events.UI; using BriarQueen.Framework.Managers.Audio; using BriarQueen.Framework.Managers.Interaction.Data; using BriarQueen.Framework.Managers.IO; using BriarQueen.Framework.Managers.Levels; using BriarQueen.Framework.Managers.Player.Data; using BriarQueen.Framework.Managers.UI; using BriarQueen.Framework.Services.Tutorials; using Cysharp.Threading.Tasks; using UnityEngine; using VContainer; namespace BriarQueen.Game.Items.HoverZones { public class TransitionZone : MonoBehaviour, IInteractable { [Header("Level Setup")] [SerializeField] private LevelKey _levelToLoad; [SerializeField] private string _levelName; [SerializeField] private string _lockedTooltipText = string.Empty; [SerializeField] private string _lockedInteractText = string.Empty; [SerializeField] private bool _locked; [Header("UI Setup")] [SerializeField] private UICursorService.CursorStyle _cursorStyle = UICursorService.CursorStyle.Travel; [Header("Optional")] [SerializeField] private SFXKey _soundEffectOnClick; protected EventCoordinator _eventCoordinator; protected LevelManager _levelManager; protected SaveManager _saveManager; protected AudioManager _audioManager; protected TutorialService _tutorialService; public CanvasGroup CanvasGroup; public bool CanInteract() { return true; } protected void Awake() { if(CanvasGroup == null) CanvasGroup = GetComponent(); } protected void Start() { if (_locked && CheckUnlockStatus()) Unlock(); } public UICursorService.CursorStyle ApplicableCursorStyle => _cursorStyle; public virtual string InteractableName => _locked ? _lockedTooltipText : _levelName; public virtual async UniTask OnInteract(ItemDataSo item = null) { if (_locked) { var message = !string.IsNullOrEmpty(_lockedInteractText) ? _lockedInteractText : InteractEventIDs.Get(EnvironmentInteractKey.Locked); _eventCoordinator.Publish(new DisplayInteractEvent(message)); return; } if (item != null) { _eventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(ItemInteractKey.CantUseItem))); return; } var levelId = AssetKeyIdentifiers.Get(_levelToLoad); if (_soundEffectOnClick != SFXKey.None) { _audioManager.Play(AudioNameIdentifiers.Get(_soundEffectOnClick)); } var loaded = await _levelManager.LoadLevel(levelId); if (!loaded) { _eventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(EnvironmentInteractKey.CantGoThere))); } _tutorialService.DisplayTutorial(TutorialPopupID.ReturnToPreviousLevel); } public virtual UniTask EnterHover() { return UniTask.CompletedTask; } public virtual UniTask ExitHover() { return UniTask.CompletedTask; } public void Unlock() { _locked = false; } protected virtual bool CheckUnlockStatus() { return false; } [Inject] public void Construct(LevelManager levelManager, EventCoordinator eventCoordinator, SaveManager saveManager, AudioManager audioManager, TutorialService tutorialService) { _levelManager = levelManager; _eventCoordinator = eventCoordinator; _saveManager = saveManager; _audioManager = audioManager; _tutorialService = tutorialService; } } }