using System.Collections.Generic; using Rewired; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; public class UIFrameManager : MonoBehaviour { public static UIFrameManager instance; [SerializeField] private string titleFrameSceneName = "_StartMenu"; [SerializeField] private UIFrame titleFrame; [SerializeField] private UIFrame overworldPauseMenuFrame; [SerializeField] private UIFrame inMatchPauseMenuFrame; [SerializeField] private UIFrame levelSelectFrame; [SerializeField] private UIFrame endOfMatchFrame; [SerializeField] private UIFrame levelUpRewardFrame; [SerializeField] private UIFrame choiceFrame; private UIFrame activeFrame; private List frames = new List(); private Player input; private Stack frameStack = new Stack(); [SerializeField] private RectTransform inGameUIContainer; [SerializeField] private RectTransform onScreenMarkerContainer; [SerializeField] private TreasureChestUIHelper treasureChest; [HideInInspector] public UnityEvent onFrameOpen = new UnityEvent(); private SceneTransitionManager sceneTransitionManager; public UIFrame ActiveFrame => activeFrame; public RectTransform InGameUIContainer => inGameUIContainer; public RectTransform OnScreenMarkerContainer => onScreenMarkerContainer; public TreasureChestUIHelper TreasureChest => treasureChest; private void Awake() { if (instance != null) { Object.Destroy(base.gameObject); } else { instance = this; } } private void Start() { if (SceneManager.sceneCount <= 1) { SceneManager.LoadScene(titleFrameSceneName, LoadSceneMode.Additive); } foreach (UIFrame frame in frames) { frame.Deactivate(); } if (IsSceneLoaded(titleFrameSceneName)) { SwitchToTitleFrame(); } input = ReInput.players.GetPlayer(0); sceneTransitionManager = SceneTransitionManager.instance; sceneTransitionManager.onSceneChange.AddListener(UpdateUIBasedOnCurrentScene); UpdateUIBasedOnCurrentScene(); } public void SwitchToTitleFrame() { ChangeActiveFrame(titleFrame); } public bool IsSceneLoaded(string sceneName) { for (int i = 0; i < SceneManager.sceneCount; i++) { if (SceneManager.GetSceneAt(i).name == sceneName) { return true; } } return false; } private void Update() { if (input.GetButtonDown("Pause Menu")) { OpenMenu(); } else if (input.GetButtonDown("Cancel")) { Cancel(); } } private void Cancel() { if (activeFrame != null && activeFrame != titleFrame && !activeFrame.canNotBeEscaped) { CloseActiveFrame(); } } private void OpenMenu() { if (activeFrame != null && !activeFrame.canNotBeEscaped) { CloseActiveFrame(); } else if (activeFrame == null && SceneManager.GetSceneByName(SceneTransitionManager.instance.levelSelectScene).IsValid()) { ChangeActiveFrame(overworldPauseMenuFrame); } else if (activeFrame == null) { ChangeActiveFrame(inMatchPauseMenuFrame); } } public void RegisterFrame(UIFrame frame) { frames.Add(frame); } public void ChangeActiveFrame(UIFrame nextFrame) { ProcessFrameChange(nextFrame, writeOldFrameToStack: true); } public void ChangeActiveFrameKeepOldVisible(UIFrame nextFrame) { ProcessFrameChange(nextFrame, writeOldFrameToStack: true, keepOldFrameGameObjectActive: true); } private void ProcessFrameChange(UIFrame nextFrame, bool writeOldFrameToStack, bool keepOldFrameGameObjectActive = false) { if (nextFrame != null) { if (LocalGamestate.Instance != null) { LocalGamestate.Instance.SetPlayerFreezeState(nextFrame.freezePlayer); } if (nextFrame.freezeTime) { Time.timeScale = 0f; } else { Time.timeScale = 1f; } if (activeFrame != null && writeOldFrameToStack) { frameStack.Push(activeFrame); } onFrameOpen.Invoke(); } else { if (LocalGamestate.Instance != null) { LocalGamestate.Instance.SetPlayerFreezeState(frozen: false); } Time.timeScale = 1f; frameStack.Clear(); } if (activeFrame != null) { if (activeFrame == choiceFrame && ChoiceManager.instance.ChoiceCoroutineWaiting) { ChoiceManager.instance.CancelChoice(); } activeFrame.Deactivate(keepOldFrameGameObjectActive); } if (nextFrame != null) { nextFrame.Activate(); } activeFrame = nextFrame; } public void CloseActiveFrame() { if (activeFrame != null) { if (frameStack.Count > 0) { ProcessFrameChange(frameStack.Pop(), writeOldFrameToStack: false); } else { ChangeActiveFrame(null); } } } public void CloseAllFrames() { if (activeFrame != null) { frameStack.Clear(); ChangeActiveFrame(null); } } public void ResetToTileScreen() { ProcessFrameChange(titleFrame, writeOldFrameToStack: false); frameStack.Clear(); } public void QuitToDesktop() { Application.Quit(); } public static bool TryOpenLevelSelect() { if (instance.activeFrame != null) { return false; } instance.ChangeActiveFrame(instance.levelSelectFrame); return true; } public static void TriggerEndOfMatch() { instance.ProcessFrameChange(instance.endOfMatchFrame, writeOldFrameToStack: false); } public static void ShowLevelUpReward() { instance.ProcessFrameChange(instance.levelUpRewardFrame, writeOldFrameToStack: true, keepOldFrameGameObjectActive: true); } private void UpdateUIBasedOnCurrentScene() { switch (sceneTransitionManager.CurrentSceneState) { case SceneTransitionManager.SceneState.InGame: treasureChest.gameObject.SetActive(value: true); break; case SceneTransitionManager.SceneState.LevelSelect: treasureChest.gameObject.SetActive(value: false); break; case SceneTransitionManager.SceneState.MainMenu: treasureChest.gameObject.SetActive(value: false); break; } } public void PresentChoiceFrame() { ProcessFrameChange(choiceFrame, writeOldFrameToStack: false); } }