using Invector; using Invector.vCharacterController; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Serialization; using PixelCrushers.DialogueSystem; using System; namespace Beyond { public class MainMenuController : MonoBehaviour { private const float mainMenuSceneFadeTime = 1f; [vEditorToolbar("Input Mapping")] public GenericInput openInput = new GenericInput("I", "I", "I"); /// /// Dimming of inputs is currently unsuported /// [SerializeField] private SubmenuElementsContainer inventorySubmenuContainer, knowledgeSubmenuContainer, attributesSubmenuContainer, powersSubmenuContainer, skillsSubmenuContainer, questLogSubmenuContainer, mapSubmenuContainer, warningQuitSubmenuContainer; [SerializeField] private SubmenuElementsContainer menuSubmenuContainer, judgementSubmenuContainer, tradeSubmenuContainer; private SubmenuElementsContainer currentSubmenuContainer; [SerializeField] private InventoryMenuController inventoryMenuController; [SerializeField] private PowersMenuController powersMenuController; [SerializeField] private SkillsMenuController skillsMenuController; [SerializeField] private AttributesWindowController attributesWindowController; [SerializeField] private JudgementMenuController judgementMenuController; [SerializeField] private QuestLogMenuController questLogMenuController; [SerializeField] private TradeMenuController tradeMenuController; [SerializeField] private MenuScroll menuScroll; [SerializeField] private GameObject UIHUD; [SerializeField] private GameObject mainParentMenu, judgementParentMenu, tradeParentMenu; private GameObject currentParentMenu; private bool isLocked = false; private void Awake() { menuScroll.OnClosed += ShowOtherUI; menuScroll.OnOpened += StopTime; menuScroll.OnClosed += StartTime; currentSubmenuContainer = menuSubmenuContainer; currentParentMenu = mainParentMenu; } private void OnDestroy() { if (!menuScroll) return; menuScroll.OnClosed -= ShowOtherUI; menuScroll.OnOpened -= StopTime; menuScroll.OnClosed -= StartTime; } private void StartTime() { TimeController.Instance.SetTimeScale(1f); } private void StopTime() { TimeController.Instance.SetTimeScale(0f); } public void OpenInventory() { OpenInventoryBase(); StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenInventoryBase() { inventoryMenuController.OpenInventory(); currentSubmenuContainer = inventorySubmenuContainer; } [Button] public void TryToOpenImmediateShadowSlayer() { SetActiveParentMenu(mainParentMenu); currentSubmenuContainer.parentObject.SetActive(false); if (menuScroll.m_currentCanva) { menuScroll.m_currentCanva.SetActive(false); } OpenInventoryBase(); //select that gemstone you want currentSubmenuContainer.parentObject.SetActive(true); // menuScroll.m_currentlyOpenedElementsContainer.se menuScroll.m_currentlyOpenedElementsContainer = currentSubmenuContainer; inventoryMenuController.TryToSelectShadowSlayerInWeaponsArea(); OpenMenuBase(); } public void OpenKnowledge() { currentSubmenuContainer = knowledgeSubmenuContainer; StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenAttributes() { menuScroll.OnOpened += attributesWindowController.SetProperValues; currentSubmenuContainer = attributesSubmenuContainer; attributesWindowController.OpenAttributes(); StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenPowers() { OpenPowersBase(); StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenPowersBase() { currentSubmenuContainer = powersSubmenuContainer; powersMenuController.OpenPowers(); } [Button] public void OpenImmediateCovertGaze() { SetActiveParentMenu(mainParentMenu); currentSubmenuContainer.parentObject.SetActive(false); if (menuScroll.m_currentCanva) { menuScroll.m_currentCanva.SetActive(false); } OpenPowersBase(); currentSubmenuContainer.parentObject.SetActive(true); menuScroll.m_currentlyOpenedElementsContainer = currentSubmenuContainer; powersMenuController.TryToOpenScrollsOnPowerGaze(); OpenMenuBase(); } public void OpenSkills() { OpenSkillsBase(); StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenSkillsBase() { menuScroll.OnOpened += skillsMenuController.RefreshSpellsWindow; skillsMenuController.RefreshSpellsWindow(); currentSubmenuContainer = skillsSubmenuContainer; } [Button] public void OpenImmediateSkills() { SetActiveParentMenu(mainParentMenu); currentSubmenuContainer.parentObject.SetActive(false); if (menuScroll.m_currentCanva) { menuScroll.m_currentCanva.SetActive(false); } OpenSkillsBase(); currentSubmenuContainer.parentObject.SetActive(true); menuScroll.m_currentlyOpenedElementsContainer = currentSubmenuContainer; OpenMenuBase(); } public void OpenQuestLog() { menuScroll.OnOpened += questLogMenuController.OpenJournal; currentSubmenuContainer = questLogSubmenuContainer; StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); questLogMenuController.OpenJournal(); } public void OpenMap() { currentSubmenuContainer = mapSubmenuContainer; StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void OpenQuitWarning() { currentSubmenuContainer = warningQuitSubmenuContainer; StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(menuSubmenuContainer, currentSubmenuContainer)); } public void LoadMainMenuScene() { currentSubmenuContainer.interactableCanvas.ForEach(canva => canva.interactable = false); TimeController.Instance.SetTimeScale(1); StartCoroutine(LoadMainMenuCoroutine()); } private IEnumerator LoadMainMenuCoroutine() { FadeCanvasGroup.Instance.FadeOut(mainMenuSceneFadeTime); yield return new WaitForSecondsRealtime(mainMenuSceneFadeTime); ProxySceneLoader.LoadScene($"index:{0}"); } public void OpenMenuSelector() { if (currentSubmenuContainer == skillsSubmenuContainer) { menuScroll.OnOpened -= skillsMenuController.RefreshSpellsWindow; } else if (currentSubmenuContainer == inventorySubmenuContainer) { inventoryMenuController.CloseInventory(); } else if (currentSubmenuContainer == attributesSubmenuContainer) { menuScroll.OnOpened -= attributesWindowController.SetProperValues; //unify all exits on interface/methods? //could be currentWindow.Exit() and no if else } else if (currentSubmenuContainer == questLogSubmenuContainer) { menuScroll.OnOpened -= questLogMenuController.OpenJournal; } else if (currentSubmenuContainer == powersSubmenuContainer) { powersMenuController.ClosePowers(); } StartCoroutine(menuScroll.ChangeVisibleCanvaCoroutine(currentSubmenuContainer, menuSubmenuContainer)); currentSubmenuContainer = menuSubmenuContainer; } public void ShowOtherUI() { UIHUD.SetActive(true); // isLocked = false; } public void OpenMenu() { if (MusicManager.instance) { MusicManager.instance.MuteMusic(); } menuScroll.m_currentlyOpenedElementsContainer = currentSubmenuContainer; SetActiveParentMenu(mainParentMenu); OpenMenuBase(); } public void OpenMenuBase() { UIHUD.SetActive(false); menuScroll.OpenScroll(); } [Button] public void OpenJudgementMenu() { //if (MenuScrollHasCanvaFromMainMenuSet()) //{ // currentSubmenuContainer = menuScroll.currentlyOpenedElementsContainer; //} //else //{ // menuScroll.currentlyOpenedElementsContainer = judgementSubmenuContainer; //} SetActiveParentMenu(judgementParentMenu); OpenMenuBase(); judgementMenuController.OpenJudgementWindow(); } private bool MenuScrollHasCanvaFromMainMenuSet() { return menuScroll.m_currentlyOpenedElementsContainer != judgementSubmenuContainer || menuScroll.m_currentlyOpenedElementsContainer != tradeSubmenuContainer; } [Button] public void OpenTradeWindow() { OpenTradeWindowBase(); tradeMenuController.SetSelectorWindow(); } public void OpenTradeWindowBase() { //if (MenuScrollHasCanvaFromMainMenuSet()) //{ // currentSubmenuContainer = menuScroll.currentlyOpenedElementsContainer; //} //else //{ // menuScroll.currentlyOpenedElementsContainer = tradeSubmenuContainer; //} SetActiveParentMenu(tradeParentMenu); OpenMenuBase(); // tradeMenuController.OpenSelectorWindow(); } [Button] public void OpenConcreteTradeWindow(TradeOption option, TradeCategory category) { OpenTradeWindowBase(); switch (option) { case TradeOption.Buy: tradeMenuController.OpenBuyWindowStandalone(category); break; case TradeOption.Sell: tradeMenuController.OpenSellWindowStandalone(category); break; default: break; } } public void OpenBuyScrolls() { OpenConcreteTradeWindow(TradeOption.Buy, TradeCategory.Scrolls); } /// /// should be no longer needed? /// /// private void SetActiveParentMenu(GameObject parentMenu) { if (currentParentMenu) { currentParentMenu.SetActive(false); } currentParentMenu = parentMenu; currentParentMenu.SetActive(true); } public void CloseMenu() { if (MusicManager.instance) { MusicManager.instance.UnmuteMusic(); } menuScroll.OpenCloseScroll(false); } public void LateUpdate() { OpenCloseMenu(); } public void OpenCloseMenu() { if (!openInput.GetButtonDown() || isLocked) return; if (menuScroll.m_isOpen) { CloseMenu(); } else { //if (currentSubmenuContainer) //{ // menuScroll.currentlyOpenedElementsContainer = currentSubmenuContainer; //} OpenMenu(); } } } }