DRHPS/code-csharp/zh_TW/GonerMenu.cs
2025-04-08 11:31:35 +08:00

583 lines
22 KiB
C#

using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class GonerMenu : MonoBehaviour
{
[SerializeField]
public Vector2 TargetSoulPosition;
[SerializeField]
private float SoulLerpSpeed;
[SerializeField]
private Transform SoulTransform;
[SerializeField]
private Material UnselectedGonerMaterial;
[SerializeField]
private Material SelectedGonerMaterial;
private SettingsManager Settings;
public AudioSource GonerMenuSource;
private Animator GonerMenuAnimator;
private AudioReverbPreset PreviousPreset;
private MusicManager GameMusic;
private AudioReverbFilter PlayerReverbFilter;
private PlayerManager Kris;
private bool PreviousAnimationState;
private float PreviousMusicVolume;
private ChatboxManager ChatboxManager;
private bool PreviousChatboxInputState;
public Image CMenu_SoulIcon;
private LightworldMenu LWMenu;
private bool PreviousLWMenuInputState;
public bool gonerMenuWasOpen;
private bool PreviousPlayerInteractionState;
private TRIG_LEVELTRANSITION ReturnToMenu;
[SerializeField]
private AudioClip[] GonerMenuClips;
[SerializeReference]
private RuntimeAnimatorController DefaultLightworldKrisRuntimeController;
[SerializeReference]
private RuntimeAnimatorController DefaultDarkworldKrisRuntimeController;
[SerializeField]
private TextMeshProUGUI TipText;
[SerializeField]
private TextMeshProUGUI MusicText;
[SerializeField]
private TextMeshProUGUI CashText;
[SerializeField]
private AudioClip CashgainSFX;
[SerializeField]
private TextMeshProUGUI CurrentQuestsText;
[Space(5f)]
public static Hypothesis CurrentActiveHypothesis;
[Space(5f)]
public bool GonerMenuOpen;
public bool CanOpenGonerMenu;
public string CurrentMenuState = "Default";
public int CurrentCursorPosition;
private int CurrentCursorMax;
private int CurrentCursorMin;
private bool UseHorizontalControls;
private bool XReturnDebounce;
private bool HasRanXReturnDebounce;
public static bool RecoveringFromGameOver;
[Header("Base Menu References")]
[SerializeField]
private Transform[] BaseMenuOptions;
[SerializeField]
private Color[] BaseMenuOptionsColors;
[SerializeField]
private TextMeshProUGUI[] BaseMenuTexts;
[SerializeField]
private GameObject RestartBattleOption;
[Header("Settings Menu References")]
[SerializeField]
private GonerMenu_Settings SettingsMenu;
[Header("Return Menu References")]
[SerializeField]
private Transform ReturnWarningMenu;
[SerializeField]
private Transform[] ReturnWarningOptions;
[SerializeField]
private TextMeshProUGUI[] ReturnWarningText;
[Header("Restart Menu References")]
[SerializeField]
private Transform RestartWarningMenu;
[SerializeField]
private Transform[] RestartWarningOptions;
[SerializeField]
private TextMeshProUGUI[] RestartWarningText;
private static GonerMenu instance;
public static GonerMenu Instance => instance;
private void Awake()
{
if (instance != null && instance != this)
{
Object.Destroy(base.gameObject);
}
else
{
instance = this;
}
}
private void Start()
{
CurrentMenuState = "Default";
GonerMenuSource = GetComponent<AudioSource>();
GonerMenuAnimator = GetComponent<Animator>();
ChatboxManager = Object.FindFirstObjectByType<ChatboxManager>();
GameMusic = MusicManager.Instance;
ReturnToMenu = GetComponent<TRIG_LEVELTRANSITION>();
}
private void Update()
{
if (PlayerReverbFilter == null && Camera.main != null)
{
PlayerReverbFilter = Camera.main.transform.GetComponent<AudioReverbFilter>();
}
if (Kris == null)
{
Kris = Object.FindFirstObjectByType<PlayerManager>();
}
if (LWMenu == null)
{
LWMenu = Object.FindFirstObjectByType<LightworldMenu>();
}
if (GonerMenuOpen)
{
SoulTransform.localPosition = Vector2.Lerp(SoulTransform.localPosition, TargetSoulPosition, SoulLerpSpeed * Time.unscaledDeltaTime);
MenuUpdate();
}
else
{
SoulTransform.position = Vector2.one * -500f;
}
RestartBattleOption.SetActive(BattleSystem.CurrentlyInBattle);
if (Input.GetKeyDown(PlayerInput.Instance.Key_Pause) && CanOpenGonerMenu)
{
if (!GonerMenuOpen)
{
PauseGame();
}
else
{
UnpauseGame();
}
}
}
private void MenuUpdate()
{
if (!UseHorizontalControls)
{
if (Input.GetKeyDown(PlayerInput.Instance.Key_Down))
{
CurrentCursorPosition++;
}
if (Input.GetKeyDown(PlayerInput.Instance.Key_Up))
{
CurrentCursorPosition--;
}
}
else
{
if (Input.GetKeyDown(PlayerInput.Instance.Key_Right))
{
CurrentCursorPosition++;
}
if (Input.GetKeyDown(PlayerInput.Instance.Key_Left))
{
CurrentCursorPosition--;
}
}
CurrentCursorPosition = Mathf.Clamp(CurrentCursorPosition, CurrentCursorMin, CurrentCursorMax);
switch (CurrentMenuState)
{
case "Options":
XReturnDebounce = false;
HasRanXReturnDebounce = false;
SettingsMenu.SettingsMenuOpen = true;
SettingsMenu.gameObject.SetActive(value: true);
break;
case "ReturnWarning":
{
XReturnDebounce = false;
HasRanXReturnDebounce = false;
CurrentCursorMin = 0;
CurrentCursorMax = 1;
UseHorizontalControls = true;
TargetSoulPosition = new Vector2(ReturnWarningOptions[CurrentCursorPosition].localPosition.x - 80f, ReturnWarningOptions[CurrentCursorPosition].localPosition.y);
SoulTransform.localPosition = new Vector2(ReturnWarningOptions[CurrentCursorPosition].localPosition.x - 80f, ReturnWarningOptions[CurrentCursorPosition].localPosition.y);
if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm))
{
GonerMenuSource.PlayOneShot(GonerMenuClips[1]);
switch (CurrentCursorPosition)
{
case 0:
UI_LoadingIcon.ToggleLoadingIcon(showIcon: true);
UI_FADE.Instance.StartFadeIn(2, 1f, UnpauseOnEnd: true, NewMainMenuManager.MainMenuStates.Hypothetical);
CurrentActiveHypothesis = null;
ResetPlayer();
break;
case 1:
CurrentMenuState = "Default";
if (BattleSystem.CurrentlyInBattle)
{
CurrentCursorMax = 3;
CurrentCursorPosition = 2;
}
else
{
CurrentCursorMax = 2;
CurrentCursorPosition = 2;
}
break;
}
}
for (int k = 0; k < ReturnWarningOptions.Length; k++)
{
if (k == CurrentCursorPosition)
{
ReturnWarningText[k].color = Color.yellow;
}
else
{
ReturnWarningText[k].color = Color.white;
}
}
ReturnWarningMenu.position = new Vector2(645f, 480f);
break;
}
case "RestartBattleWarning":
{
XReturnDebounce = false;
HasRanXReturnDebounce = false;
bool flag = false;
CurrentCursorMin = 0;
CurrentCursorMax = 1;
UseHorizontalControls = true;
TargetSoulPosition = new Vector2(RestartWarningOptions[CurrentCursorPosition].localPosition.x - 80f, RestartWarningOptions[CurrentCursorPosition].localPosition.y);
SoulTransform.localPosition = new Vector2(RestartWarningOptions[CurrentCursorPosition].localPosition.x - 80f, RestartWarningOptions[CurrentCursorPosition].localPosition.y);
if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm))
{
GonerMenuSource.PlayOneShot(GonerMenuClips[1]);
switch (CurrentCursorPosition)
{
case 0:
StartCoroutine(Delay_RestartBattle());
flag = true;
RestartWarningMenu.position = new Vector2(645f, 5760f);
break;
case 1:
CurrentMenuState = "Default";
if (BattleSystem.CurrentlyInBattle)
{
CurrentCursorMax = 3;
CurrentCursorPosition = 3;
flag = true;
RestartWarningMenu.position = new Vector2(645f, 5760f);
}
else
{
CurrentCursorMax = 2;
CurrentCursorPosition = 2;
}
break;
}
}
for (int j = 0; j < RestartWarningOptions.Length; j++)
{
if (j == CurrentCursorPosition)
{
RestartWarningText[j].color = Color.yellow;
}
else
{
RestartWarningText[j].color = Color.white;
}
}
if (!flag)
{
RestartWarningMenu.position = new Vector2(645f, 480f);
}
break;
}
case "Default":
{
CurrentCursorMin = 0;
if (BattleSystem.CurrentlyInBattle)
{
CurrentCursorMax = 3;
}
else
{
CurrentCursorMax = 2;
}
UseHorizontalControls = false;
TargetSoulPosition = new Vector2(BaseMenuOptions[CurrentCursorPosition].localPosition.x - 500f, BaseMenuOptions[CurrentCursorPosition].localPosition.y);
if (!HasRanXReturnDebounce && !XReturnDebounce)
{
StartCoroutine(XReturn());
HasRanXReturnDebounce = true;
}
SettingsMenu.gameObject.SetActive(value: false);
ReturnWarningMenu.position = new Vector2(645f, 5760f);
RestartWarningMenu.position = new Vector2(645f, 5760f);
for (int i = 0; i < BaseMenuOptions.Length; i++)
{
if (i == CurrentCursorPosition)
{
BaseMenuTexts[i].color = Color.yellow;
BaseMenuTexts[i].fontSharedMaterial = SelectedGonerMaterial;
}
else
{
BaseMenuTexts[i].color = Color.white;
BaseMenuTexts[i].fontSharedMaterial = UnselectedGonerMaterial;
}
}
if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm))
{
GonerMenuSource.PlayOneShot(GonerMenuClips[1]);
switch (CurrentCursorPosition)
{
case 0:
UnpauseGame();
CurrentMenuState = "Default";
break;
case 1:
CurrentCursorPosition = 0;
CurrentMenuState = "Options";
break;
case 2:
CurrentMenuState = "ReturnWarning";
CurrentCursorPosition = 1;
break;
case 3:
CurrentMenuState = "RestartBattleWarning";
CurrentCursorPosition = 1;
break;
}
}
if (Input.GetKeyDown(PlayerInput.Instance.Key_Cancel) && XReturnDebounce)
{
UnpauseGame();
CurrentMenuState = "Default";
}
break;
}
}
}
private IEnumerator Delay_RestartBattle()
{
UI_FADE.Instance.StartFadeIn(-1, 3f);
Battle storedBattle = BattleSystem.Instance.CurrentBattle;
UnpauseGame();
BattleSystem.EndBattle(BattleSystem.EndBattleTypes.Instant);
BattleSystem.OpenBottomBarWindow(BattleSystem.BottomBarWindows.None);
BattleSystem.BattleChatbox.TextVisible = true;
foreach (ActivePartyMember activePartyMember in PartyMemberSystem.Instance.ActivePartyMembers)
{
activePartyMember.CurrentHealth = activePartyMember.PartyMemberDescription.MaximumHealth;
}
yield return new WaitForSeconds(0.1f);
BattleSystem.StartBattle(storedBattle, CameraManager.instance.transform.position, SkipIntro: true);
}
public void PauseGame()
{
if (PlayerReverbFilter != null)
{
PreviousPreset = PlayerReverbFilter.reverbPreset;
PlayerReverbFilter.reverbPreset = AudioReverbPreset.Cave;
}
GonerMenuAnimator.Play("GonerMenu_Open");
ChatboxManager.StartCoroutine(ChatboxManager.Instance.InputDebounceDelay());
PreviousChatboxInputState = ChatboxManager.AllowInput;
ChatboxManager.AllowInput = false;
CMenu_SoulIcon.enabled = false;
Vector3 position = Camera.main.WorldToScreenPoint(Kris.transform.position);
SoulTransform.position = position;
CurrentQuestsText.color = Color.white;
if (CurrentActiveHypothesis != null)
{
CurrentQuestsText.text = "";
HypothesisGoal[] hypothesisGoals = CurrentActiveHypothesis.HypothesisGoals;
foreach (HypothesisGoal hypothesisGoal in hypothesisGoals)
{
int @int = PlayerPrefs.GetInt("HypothesisGoal_" + hypothesisGoal.GoalPlayprefName, 0);
if (hypothesisGoal.RequiredTasks > 1)
{
if (@int < hypothesisGoal.RequiredTasks)
{
TextMeshProUGUI currentQuestsText = CurrentQuestsText;
currentQuestsText.text = currentQuestsText.text + "<color=white>" + hypothesisGoal.GoalHint + " (" + @int + "/" + hypothesisGoal.RequiredTasks + ")</color>\n";
}
else
{
TextMeshProUGUI currentQuestsText2 = CurrentQuestsText;
currentQuestsText2.text = currentQuestsText2.text + "<color=yellow>" + hypothesisGoal.GoalHint + " (" + @int + "/" + hypothesisGoal.RequiredTasks + ")</color>\n";
}
}
else if (@int != 0)
{
TextMeshProUGUI currentQuestsText3 = CurrentQuestsText;
currentQuestsText3.text = currentQuestsText3.text + "<color=yellow>" + hypothesisGoal.GoalHint + " (已完成)</color>\n";
}
else
{
TextMeshProUGUI currentQuestsText4 = CurrentQuestsText;
currentQuestsText4.text = currentQuestsText4.text + "<color=white>" + hypothesisGoal.GoalHint + " (未完成)</color>\n";
}
}
}
else
{
CurrentQuestsText.text = "";
}
PreviousAnimationState = Kris._PMove.FreezeAnimation;
Kris._PMove.FreezeAnimation = true;
GonerMenuOpen = true;
PreviousMusicVolume = MusicManager.Instance.source.volume;
MusicManager.Instance.source.volume = 0.1f;
GameMusic.GetComponent<AudioLowPassFilter>().enabled = true;
PreviousLWMenuInputState = LWMenu.AllowInput;
LWMenu.AllowInput = false;
PreviousPlayerInteractionState = Kris._PInteract.CanInteract;
Kris._PInteract.CanInteract = false;
Time.timeScale = 0f;
}
public void Pause_OpenOptionMenu()
{
PauseGame();
CurrentMenuState = "Options";
}
public void ResetPlayer()
{
ChatboxManager.EndText();
ChatboxManager.AllowInput = true;
BattleSystem.EndBattle(BattleSystem.EndBattleTypes.Instant);
PlayerManager.Instance.transform.GetComponent<Collider2D>().enabled = true;
PlayerManager.Instance.transform.GetComponent<Collider2D>().isTrigger = false;
PlayerManager.Instance.transform.GetComponent<Rigidbody2D>().simulated = true;
PlayerManager.Instance.GetComponentInChildren<SpriteRenderer>().color = Color.white;
PlayerManager.Instance.GetComponentInChildren<SpriteRenderer>().enabled = true;
PlayerManager.Instance._PAnimation.FootstepsEnabled = false;
PlayerManager.Instance._PMove.AnimationOverriden = false;
PlayerManager.Instance._PInteract.CanInteract = true;
PlayerManager.Instance._PMove.AllowSprint = true;
MusicManager.Instance.source.loop = true;
MusicManager.Instance.source.volume = 0.65f;
MusicManager.Instance.source.pitch = 1f;
LightworldMenu.Instance.CanOpenMenu = true;
LightworldMenu.Instance.AllowInput = true;
DarkworldMenu.Instance.CanOpenMenu = true;
if (PlayerManager.Instance._PMove.InDarkworld)
{
PlayerManager.Instance._PAnimation.GetComponent<Animator>().runtimeAnimatorController = DefaultDarkworldKrisRuntimeController;
PlayerManager.Instance._PAnimation.GetComponent<Animator>().Play("DARKWORLD_KRIS_IDLE");
}
else
{
PlayerManager.Instance._PAnimation.GetComponent<Animator>().runtimeAnimatorController = DefaultLightworldKrisRuntimeController;
PlayerManager.Instance._PAnimation.GetComponent<Animator>().Play("OVERWORLD_NOELLE_IDLE");
}
}
public void UnpauseGame()
{
CurrentMenuState = "Default";
StartCoroutine(InformPreviousClosure());
SettingsMenu.SettingsMenuOpen = true;
SettingsMenu.gameObject.SetActive(value: false);
ReturnWarningMenu.position = new Vector2(645f, 5760f);
RestartWarningMenu.position = new Vector2(645f, 5760f);
GonerMenuAnimator.Play("GonerMenu_Close");
CMenu_SoulIcon.enabled = true;
GonerMenuOpen = false;
Kris._PMove.FreezeAnimation = PreviousAnimationState;
ChatboxManager.AllowInput = PreviousChatboxInputState;
CutsceneUtils.FadeOutText(CurrentQuestsText, 4f);
MusicManager.Instance.source.volume = PreviousMusicVolume;
if (PlayerReverbFilter != null)
{
PlayerReverbFilter.reverbPreset = PreviousPreset;
}
GameMusic.GetComponent<AudioLowPassFilter>().enabled = false;
LWMenu.AllowInput = PreviousLWMenuInputState;
Kris._PInteract.CanInteract = PreviousPlayerInteractionState;
Time.timeScale = 1f;
}
private IEnumerator XReturn()
{
yield return new WaitForSeconds(0f);
XReturnDebounce = true;
}
private IEnumerator InformPreviousClosure()
{
gonerMenuWasOpen = true;
yield return new WaitForSeconds(0.1f);
gonerMenuWasOpen = false;
}
public void ShowTip(string tip)
{
TipText.text = "小貼士!" + tip;
TipText.GetComponent<Animator>().Play("GonerMenu_Tip", -1, 0f);
}
public void ShowMusicCredit(string songName, string Credit)
{
MusicText.text = "<scale=0.5> </scale>~ " + songName + " ~ " + Credit;
MusicText.GetComponent<Animator>().Play("GonerMenu_Music", -1, 0f);
}
public void ShowCashGain(float moneyGain)
{
CashText.text = $"+${moneyGain}";
CashText.GetComponent<Animator>().Play("GonerMenu_Cash", -1, 0f);
CutsceneUtils.PlaySound(CashgainSFX, CutsceneUtils.DRH_MixerChannels.Effect, 0.4f, Random.Range(0.9f, 1.1f));
}
}