using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class NewMainMenu_Hypothetical_ContextMenu : MonoBehaviour { public List BackgroundTextLines = new List(); [SerializeField] private List BackgroundTextMaxCount = new List(); [SerializeField] private NewMainMenu_HypotheticalSubMenu hypotheticalSubMenu; [SerializeField] private TextMeshProUGUI optionText; private Coroutine currentMainTextWriting; private int CurrentSelected; private int previousSelected = -1; public Hypothesis CurrentHypothesis; [SerializeField] private TextMeshProUGUI HypotheticalTitle; [SerializeField] private TextMeshProUGUI HypotheticalDescription; [SerializeField] private TextMeshProUGUI Warning; [SerializeField] private TextMeshProUGUI HypotheticalQuests; [SerializeField] private Image HypotheticalIcon; private bool AllTextShown; private bool wasEnabled; private bool AllowInput = true; private void Awake() { CurrentSelected = PlayerPrefs.GetInt("NewMainMenu_PreviousSelectedHypothetical", 0); foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines) { BackgroundTextMaxCount.Add(backgroundTextLine.text.Length); backgroundTextLine.maxVisibleCharacters = 0; } } private void Update() { if (AllowInput) { if (Input.GetKeyDown(PlayerInput.Instance.Key_Right)) { CurrentSelected++; CheckCurrentSelectedOutsideBounds(); CheckUpdateScreenText(); } if (Input.GetKeyDown(PlayerInput.Instance.Key_Left)) { CurrentSelected--; CheckCurrentSelectedOutsideBounds(); CheckUpdateScreenText(); } if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm) || Input.GetKeyDown(PlayerInput.Instance.Key_Menu)) { SelectOption(); } if (Input.GetKeyDown(PlayerInput.Instance.Key_Cancel)) { NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny); hypotheticalSubMenu.AllowInput = true; base.gameObject.SetActive(value: false); } } if (!wasEnabled && base.gameObject.activeSelf) { previousSelected = -1; wasEnabled = true; AllowInput = true; StartCoroutine(ShowBackgroundText()); CheckUpdateScreenText(); SetupHypothetical(); } } private void SelectOption() { PlayerPrefs.SetInt("NewMainMenu_PreviousSelectedHypothetical", CurrentSelected); AllowInput = false; previousSelected = -1; NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuSelect); StartCoroutine(SelectOptionTimer()); CheckUpdateScreenText(); } private IEnumerator SelectOptionTimer() { yield return new WaitForSeconds(0.5f); if (CurrentSelected == 0) { GonerMenu.CurrentActiveHypothesis = CurrentHypothesis; UI_LoadingIcon.ToggleLoadingIcon(showIcon: true); UI_FADE.Instance.StartFadeIn(CurrentHypothesis.HypothesisStartingScene, 0.5f); DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.CheekyGrin); } else { NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny); hypotheticalSubMenu.AllowInput = true; base.gameObject.SetActive(value: false); } } private void CheckUpdateScreenText() { if (previousSelected != CurrentSelected) { previousSelected = CurrentSelected; string text = ""; string[] array = new string[2] { "游玩 ", "返回" }; for (int i = 0; i < array.Length; i++) { text = ((CurrentSelected != i) ? (text + array[i]) : (AllowInput ? (text + "-> " + array[i] + "") : (text + "-> " + array[i] + ""))); } ChangeMainText(text, AllowAnimation: true); } } private void CheckCurrentSelectedOutsideBounds() { if (CurrentSelected < 0) { CurrentSelected = 1; } if (CurrentSelected > 1) { CurrentSelected = 0; } NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuMove); } private void SetupHypothetical() { HypotheticalTitle.text = CurrentHypothesis.HypothesisName; HypotheticalDescription.text = "猜想是这样的...\n\n" + CurrentHypothesis.HypothesisDescription; if (CurrentHypothesis.HypothesisMenuSprite != null && CurrentHypothesis.HypotheticalReleased) { HypotheticalIcon.sprite = CurrentHypothesis.HypothesisMenuSprite; } else { HypotheticalIcon.sprite = hypotheticalSubMenu.noIconSprite; } Warning.text = CurrentHypothesis.TimeWhenWritten; string text = ""; text = ((CurrentHypothesis.HypothesisGoals.Length == 0) ? (text + "【本猜想没有小任务】") : (text + "【可选有奖小任务】")); HypothesisGoal[] hypothesisGoals = CurrentHypothesis.HypothesisGoals; foreach (HypothesisGoal hypothesisGoal in hypothesisGoals) { int @int = PlayerPrefs.GetInt("HypothesisGoal_" + hypothesisGoal.GoalPlayprefName, 0); text += "\n"; HypotheticalQuests.color = Color.white; if (hypothesisGoal.RequiredTasks > 1) { text = ((@int >= hypothesisGoal.RequiredTasks) ? (text + "") : (text + "")); text = text + "(" + @int + "/" + hypothesisGoal.RequiredTasks + ")"; } else { text = ((@int == 0) ? (text + "(未完成)") : (text + "(已完成)")); } text += hypothesisGoal.GoalHint; } HypotheticalQuests.text = text; } private void OnDisable() { wasEnabled = false; AllTextShown = false; ChangeMainText("", AllowAnimation: false); foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines) { backgroundTextLine.maxVisibleCharacters = 0; } } private IEnumerator ShowBackgroundText() { if (!SettingsManager.Instance.GetBoolSettingValue("SimpleVFX")) { List finishedTexts = new List(); while (!AllTextShown) { yield return null; foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines) { if (!finishedTexts.Contains(backgroundTextLine) && backgroundTextLine.maxVisibleCharacters >= backgroundTextLine.text.Length) { finishedTexts.Add(backgroundTextLine); } else if (backgroundTextLine.maxVisibleCharacters < backgroundTextLine.text.Length) { float num = 100 + Random.Range(-60, -10); backgroundTextLine.maxVisibleCharacters += Mathf.CeilToInt(num * Time.deltaTime); backgroundTextLine.maxVisibleCharacters = Mathf.Clamp(backgroundTextLine.maxVisibleCharacters, 0, backgroundTextLine.text.Length); NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuClick); } } if (CompareTextLists(finishedTexts, BackgroundTextLines)) { AllTextShown = true; MonoBehaviour.print("all text shown"); } } yield break; } foreach (TextMeshProUGUI backgroundTextLine2 in BackgroundTextLines) { backgroundTextLine2.maxVisibleCharacters = backgroundTextLine2.text.Length; } } private bool CompareTextLists(List list1, List list2) { if (list1.Count != list2.Count) { return false; } for (int i = 0; i < list1.Count; i++) { if (list1[i].text != list2[i].text) { return false; } } return true; } public void ChangeMainText(string text, bool AllowAnimation) { optionText.text = text; if (!SettingsManager.Instance.GetBoolSettingValue("SimpleVFX") && AllowAnimation) { optionText.maxVisibleCharacters = 0; if (currentMainTextWriting != null) { StopCoroutine(currentMainTextWriting); } currentMainTextWriting = StartCoroutine(ScrollMainText()); } else { optionText.maxVisibleCharacters = text.Length; } } private IEnumerator ScrollMainText() { yield return null; while (optionText.maxVisibleCharacters < optionText.text.Length) { float num = 600 + Random.Range(-120, 0); optionText.maxVisibleCharacters += Mathf.CeilToInt(num * Time.deltaTime); optionText.maxVisibleCharacters = Mathf.Clamp(optionText.maxVisibleCharacters, 0, optionText.text.Length); NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuClick); yield return null; } } }