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

404 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class BOOTUP_Manager : MonoBehaviour
{
[SerializeField]
private int MessengerCutsceneIndex;
[SerializeField]
private float CutsceneMultiplier = 1f;
[SerializeField]
private bool HasViewedDisclaimer;
[Space(10f)]
[Header("-= References =-")]
[SerializeField]
private Transform Camera;
[SerializeField]
private float CameraLerpSpeed = 5f;
[SerializeField]
private TRIG_LEVELTRANSITION LevelTransition;
[SerializeField]
private AudioSource source;
[SerializeField]
private AudioClip snd_jingle;
[SerializeField]
private AudioClip[] snd_typesounds;
[SerializeField]
private AudioClip snd_startup;
[SerializeField]
private AudioClip snd_notification;
[SerializeField]
private AudioClip snd_chatshow;
[Header("Computer Screen")]
[SerializeField]
private SpriteRenderer ScreenButtonLight;
[SerializeField]
private GameObject ScreenWhite;
[SerializeField]
private GameObject HourGlass;
[Header("BIOS loading Text")]
[SerializeField]
private TextMeshProUGUI BIOSTextMesh;
[TextArea]
[SerializeField]
private string BIOSText;
[SerializeField]
private float BIOSTextCharPerFrame = 2f;
[Header("Logo Glitched")]
[SerializeField]
private Image LogoGlitched;
[Header("Messenger")]
[SerializeField]
private GameObject Messenger;
[SerializeField]
private TMP_InputField MessengerInputField;
[SerializeField]
private TextMeshProUGUI MessageWindow;
[SerializeField]
private bool ForceFocusOnText;
[SerializeField]
private string previousAnswer;
[SerializeField]
private List<string> CurrentHostMessageQueue = new List<string>();
[SerializeField]
private List<bool> CurrentHostMessageFinale = new List<bool>();
[SerializeField]
private List<float> CurrentHostMessageLengths = new List<float>();
private void Start()
{
if (PlayerPrefs.GetInt("NewDisclaimerViewed", 0) == 1)
{
CutsceneMultiplier = 3f;
HasViewedDisclaimer = true;
}
else
{
PlayerPrefs.SetInt("NewDisclaimerViewed", 1);
HasViewedDisclaimer = false;
CutsceneMultiplier = 1f;
}
Camera.position = new Vector3(0f, 0f, -14f);
StartCoroutine(BOOTUP_Cutscene());
}
private IEnumerator BOOTUP_Cutscene()
{
yield return new WaitForSeconds(0.5f);
yield return new WaitForSeconds(1f / CutsceneMultiplier);
ScreenButtonLight.color = new Color32(byte.MaxValue, 108, 0, byte.MaxValue);
source.PlayOneShot(snd_startup, 0.5f);
source.PlayDelayed(0.5f);
ScreenButtonLight.enabled = true;
yield return new WaitForSeconds(1f / CutsceneMultiplier);
ScreenWhite.SetActive(value: true);
yield return new WaitForSeconds(1f / CutsceneMultiplier);
ScreenWhite.SetActive(value: false);
yield return new WaitForSeconds(0.35f / CutsceneMultiplier);
ScreenButtonLight.color = new Color32(0, byte.MaxValue, 0, byte.MaxValue);
yield return new WaitForSeconds(1.5f / CutsceneMultiplier);
int TargetVisibleCharacterCount = BIOSText.Length;
BIOSTextMesh.maxVisibleCharacters = 0;
BIOSTextMesh.text = BIOSText;
StartCoroutine(BIOSSpeedRandomizer());
while (BIOSTextMesh.maxVisibleCharacters < TargetVisibleCharacterCount)
{
yield return new WaitForSeconds(0f);
BIOSTextMesh.maxVisibleCharacters += (int)(BIOSTextCharPerFrame * CutsceneMultiplier);
if (BIOSTextMesh.maxVisibleCharacters < BIOSTextMesh.text.Length && BIOSTextMesh.text.ToCharArray()[BIOSTextMesh.maxVisibleCharacters] == '|')
{
yield return new WaitForSeconds(0.15f);
}
}
yield return new WaitForSeconds(0.25f / CutsceneMultiplier);
BIOSTextMesh.enabled = false;
yield return new WaitForSeconds(0.5f / CutsceneMultiplier);
HourGlass.SetActive(value: true);
yield return new WaitForSeconds(0.5f / CutsceneMultiplier);
HourGlass.SetActive(value: false);
yield return new WaitForSeconds(0.25f / CutsceneMultiplier);
LogoGlitched.fillAmount = 0.127f;
yield return new WaitForSeconds(0.1f / CutsceneMultiplier);
LogoGlitched.fillAmount = 0.256f;
yield return new WaitForSeconds(0.32f / CutsceneMultiplier);
LogoGlitched.fillAmount = 0.3f;
yield return new WaitForSeconds(0.25f / CutsceneMultiplier);
LogoGlitched.fillAmount = 0.73f;
yield return new WaitForSeconds(0.5f / CutsceneMultiplier);
LogoGlitched.fillAmount = 1f;
yield return new WaitForSeconds(0.1f / CutsceneMultiplier);
source.PlayOneShot(snd_jingle);
yield return new WaitForSeconds(3f);
LogoGlitched.enabled = false;
yield return new WaitForSeconds(0.1f);
if (HasViewedDisclaimer)
{
Vector3 TargetPos2 = new Vector3(0f, 0f, -8f);
while ((double)Vector3.Distance(Camera.position, TargetPos2) > 0.1)
{
Camera.position = Vector3.Lerp(Camera.position, TargetPos2, CameraLerpSpeed * Time.deltaTime);
yield return new WaitForSeconds(0f / CutsceneMultiplier);
}
LevelTransition.BeginTransition();
}
else
{
StartCoroutine(DisclaimerCutscene());
}
}
private IEnumerator DisclaimerCutscene()
{
yield return new WaitForSeconds(1f);
Messenger.SetActive(value: true);
source.PlayOneShot(snd_chatshow, 0.5f);
ForceFocusOnText = false;
yield return new WaitForSeconds(1.5f);
AddNewHostMessage("我们连上网络了吗?", EnableOnEnd: true);
StartCoroutine(PostHostLoop());
}
public void PlayTypeSFX()
{
source.PlayOneShot(snd_typesounds[Random.Range(0, snd_typesounds.Length)], 0.25f);
}
private void RunMessengerCutscene()
{
switch (MessengerCutsceneIndex)
{
case 1:
if (PreviousMessageHadValidAnswer())
{
AddNewHostMessage("太棒了。", EnableOnEnd: false);
AddNewHostMessage("我们可以开始了。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("首先,这里的一切均为<b>非官方内容<b>,纯属虚构。\n你是否知晓", EnableOnEnd: true);
}
else
{
AddNewHostMessage("怪了...", EnableOnEnd: false);
AddNewHostMessage("请不要做出不合逻辑的回应。", EnableOnEnd: false);
AddNewHostMessage("不管怎样,我们可以开始了。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("首先,这里的一切均为<b>非官方内容<b>,纯属虚构。\n你是否知晓", EnableOnEnd: true);
}
break;
case 2:
if (PreviousMessageHadValidAnswer())
{
AddNewHostMessage("明白。", EnableOnEnd: false);
AddNewHostMessage("我们继续。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("你能否接受异常现象和可能存在的\n<b>奇怪之处<b>", EnableOnEnd: true);
}
else
{
AddNewHostMessage("那问题就大了。", EnableOnEnd: false);
AddNewHostMessage("记住,犬科动物是没法在这个宇宙中\n生存下去的", EnableOnEnd: false, 3.5f);
AddNewHostMessage("这些实验皆非官方所作。", EnableOnEnd: false);
AddNewHostMessage("我们继续。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("你能否接受异常现象和可能存在的\n<b>奇怪之处<b>", EnableOnEnd: true);
}
break;
case 3:
if (PreviousMessageHadValidAnswer())
{
AddNewHostMessage("那我就放心了。", EnableOnEnd: false);
AddNewHostMessage("如果出现任何异常状况...", EnableOnEnd: false);
AddNewHostMessage("请随时联系... 制造商。", EnableOnEnd: false);
AddNewHostMessage("现在,我们来看最后一项。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("你是否有癫痫等症状?", EnableOnEnd: true);
}
else
{
AddNewHostMessage("有趣。", EnableOnEnd: false);
AddNewHostMessage("非常有趣。", EnableOnEnd: false);
AddNewHostMessage("如果你确实遇到异常状况,请不要惊慌。", EnableOnEnd: false, 3.5f);
AddNewHostMessage("联系制造商,把你的问题反映给他们。", EnableOnEnd: false, 3.5f);
AddNewHostMessage("现在,我们来看最后一项。", EnableOnEnd: false);
AddNewHostMessage("", EnableOnEnd: false, 0.25f);
AddNewHostMessage("你是否有癫痫等症状?", EnableOnEnd: true);
}
break;
case 4:
AddNewHostMessage("如果对频闪感到不适,请在设置中启用“简化视觉特效”。", EnableOnEnd: false);
AddNewHostMessage("记住,这很有用的。", EnableOnEnd: false, 3.5f);
AddNewHostMessage("...", EnableOnEnd: false);
AddNewHostMessage("至此,我们已经完成了所有确认步骤。", EnableOnEnd: false, 3.5f);
AddNewHostMessage("显然,你已准备好开始进行三角符文模拟实验。", EnableOnEnd: false, 4f);
AddNewHostMessage("我非常期待你的表现。", EnableOnEnd: false, 5f);
AddNewHostMessage("只要我们共同努力,我们的梦想就一定能够实现。", EnableOnEnd: false, 4f);
AddNewHostMessage("...", EnableOnEnd: false);
AddNewHostMessage("我不久后会再次联系你。", EnableOnEnd: false, 3.5f);
AddNewHostMessage("十分感谢你能百忙之中抽出时间回答我。", EnableOnEnd: false);
AddNewHostMessage("再见了HYPOASTER博士。", EnableOnEnd: false, 3f);
AddNewHostMessage("\"", EnableOnEnd: false, 1f);
break;
case 0:
break;
}
}
private bool PreviousMessageHadValidAnswer()
{
char[] array = previousAnswer.ToUpper().ToCharArray();
string input = previousAnswer.ToUpper();
if (array.Length == 0)
{
return false;
}
string pattern = "(YES|YEP|YEA(?:H)?|YUP|OKAY|ACKNOWLEDGED|UNDERSTAND|AGREE2ALL|MHM|OK|SI|SÍ|是(?:的|滴)?|对|好(?:的|滴)?|可以|嗯|当然|没问题|能接受|接受|可以|能|当然|确认|收到|了解|明白|晓得|认可|赞同|同意|支持|能|理解|清楚|懂|可|行|成|没毛病|没错|连(?:接)?上了|已阅|知道|知晓)";
string pattern2 = "(否|不是(?:的|滴)?|不对|不可以|不赞同|没有|没|不同意|不接受|不能接受|不可以|不行|不能|不理解|不懂|没连上|未连接|不清楚|不了解|不支持|不认可|没明白|不明白|不知道|不知晓)";
if (!Regex.IsMatch(input, pattern2, RegexOptions.IgnoreCase))
{
return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
}
return false;
}
private void Update()
{
if (ForceFocusOnText)
{
EventSystem.current.SetSelectedGameObject(MessengerInputField.gameObject, null);
MessengerInputField.gameObject.SetActive(value: true);
MessengerInputField.OnPointerClick(new PointerEventData(EventSystem.current));
if (Input.GetKeyDown(KeyCode.Return) && MessengerInputField.text.Length > 0)
{
MessengerCutsceneIndex++;
AddNewClientMessage(MessengerInputField.text);
previousAnswer = MessengerInputField.text;
StartCoroutine(RunMessageCutsceneDelay());
MessengerInputField.gameObject.SetActive(value: false);
MessengerInputField.text = "";
ForceFocusOnText = false;
}
}
else
{
EventSystem.current.SetSelectedGameObject(null, null);
MessengerInputField.gameObject.SetActive(value: false);
MessengerInputField.text = "";
}
}
private IEnumerator RunMessageCutsceneDelay()
{
yield return new WaitForSeconds(1.5f);
RunMessengerCutscene();
}
private IEnumerator PostHostLoop()
{
yield return new WaitForSeconds(0.1f);
if (CurrentHostMessageQueue.Count > 0)
{
yield return new WaitForSeconds(CurrentHostMessageLengths[0]);
if ((double)CurrentHostMessageLengths[0] >= 0.25)
{
PlayHostMessage(CurrentHostMessageQueue[0]);
}
else
{
PlayHostMessage(CurrentHostMessageQueue[0], PlaySound: false);
}
if (CurrentHostMessageQueue[0] == "\"")
{
StartCoroutine(DelayUntilLevelTransition());
}
CurrentHostMessageQueue.RemoveAt(0);
CurrentHostMessageLengths.RemoveAt(0);
if (CurrentHostMessageFinale[0])
{
ForceFocusOnText = true;
}
CurrentHostMessageFinale.RemoveAt(0);
}
StartCoroutine(PostHostLoop());
}
private void PlayHostMessage(string message, bool PlaySound = true)
{
if (message != "")
{
if (message != "\"")
{
if (PlaySound)
{
source.PlayOneShot(snd_notification, 0.5f);
}
TextMeshProUGUI messageWindow = MessageWindow;
messageWindow.text = messageWindow.text + "> " + message + "\n\n";
}
}
else
{
TextMeshProUGUI messageWindow2 = MessageWindow;
messageWindow2.text = messageWindow2.text + message + "\n\n";
}
}
private void AddNewHostMessage(string message, bool EnableOnEnd, float Length = 2.5f)
{
CurrentHostMessageQueue.Add(message.ToUpper() ?? "");
CurrentHostMessageFinale.Add(EnableOnEnd);
CurrentHostMessageLengths.Add(Length);
}
private IEnumerator DelayUntilLevelTransition()
{
yield return new WaitForSeconds(1f);
LevelTransition.BeginTransition(0.35f);
}
private void AddNewClientMessage(string message)
{
TextMeshProUGUI messageWindow = MessageWindow;
messageWindow.text = messageWindow.text + "< " + message + "\n\n";
}
private IEnumerator BIOSSpeedRandomizer()
{
if (BIOSTextMesh.maxVisibleCharacters < BIOSText.Length)
{
yield return new WaitForSeconds(Random.Range(0.25f, 2f) / CutsceneMultiplier);
BIOSTextCharPerFrame = Random.Range(3, 6);
StartCoroutine(BIOSSpeedRandomizer());
}
}
}