using System; using TMPro; using UnityEngine; using UnityEngine.UI; public class DialogueManager : MonoBehaviour { #region Statication public static DialogueManager instance; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); return; } instance = this; } #endregion [Header("Status")] public DialogueScript scriptToShow; public int currentText; public bool dialogueActive; [Header("UI")] [SerializeField] private GameObject dialogueUI; [SerializeField] private Transform bossSpeechBubble; [SerializeField] private Vector3 offset; [SerializeField] private TextMeshProUGUI bossText; [SerializeField] private GameObject youmuSpeechBubble; [SerializeField] private TextMeshProUGUI youmuText; [SerializeField] private GameObject reisenSpeechBubble; //have to change the dialogue for this but it's probably fine [SerializeField] private TextMeshProUGUI reisenText; [SerializeField] private GameObject merlinSpeechBubble; //hell [SerializeField] private TextMeshProUGUI merlinText; [SerializeField] private GameObject lyricaSpeechBubble; [SerializeField] private TextMeshProUGUI lyricaText; [SerializeField] private GameObject lunasaSpeechBubble; [SerializeField] private TextMeshProUGUI lunasaText; [Header("Animation")] [SerializeField] private Animator reisenAnimator; [SerializeField] private Animator youmuAnimator; [SerializeField] private string switchToDialogueTrigger; [SerializeField] private string switchToIdleTrigger; [SerializeField] private string changeDialogueTrigger; [SerializeField] private string talkTrigger; public Animator battleUIAnimator; [SerializeField] private string dialogueStartTrigger; [SerializeField] private string dialogueEndTrigger; public string nobossTrigger; public void StartDialogue(DialogueScript newDialogue) { GameManager.instance.canPause = false; dialogueUI.SetActive(true); WaveManager.instance.bossUI.SetActive(false); dialogueActive = true; currentText = 0; scriptToShow = newDialogue; WaveManager.instance.player.invulnerable = true; battleUIAnimator.SetTrigger(dialogueStartTrigger); DialogueScript.Dialogue currentDialogue = scriptToShow.dialogueList[currentText]; if (WaveManager.instance.bossInstance) { bossSpeechBubble.position = WaveManager.instance.bossInstance.transform.position + offset; WaveManager.instance.musicSource.clip = WaveManager.instance.bossDialogueLoop; WaveManager.instance.musicSource.Play(); } if (WaveManager.instance.lyricaInstance) { WaveManager.instance.lyricaInstance.isStalled = true; lunasaSpeechBubble.transform.position = WaveManager.instance.lunasaInstance.transform.position + offset; merlinSpeechBubble.transform.position = WaveManager.instance.merlinInstance.transform.position + offset; lyricaSpeechBubble.transform.position = WaveManager.instance.lyricaInstance.transform.position + offset; WaveManager.instance.musicSource.clip = WaveManager.instance.finalDialogueLoop; WaveManager.instance.musicSource.Play(); } SetDialogue(currentDialogue); reisenAnimator.SetTrigger(switchToDialogueTrigger); youmuAnimator.SetTrigger(switchToDialogueTrigger); //GameManager.instance.SetPause(true); } public void ContinueDialogue() { currentText++; if (currentText >= scriptToShow.dialogueList.Length) { EndDialogue(); return; } DialogueScript.Dialogue currentDialogue = scriptToShow.dialogueList[currentText]; SetDialogue(currentDialogue); } public void EndDialogue() { dialogueActive = false; dialogueUI.SetActive(false); WaveManager.instance.player.isStalled = false; WaveManager.instance.player.invulnerable = false; GameManager.instance.canPause = true; battleUIAnimator.SetTrigger(dialogueEndTrigger); if (WaveManager.instance.bossInstance) { WaveManager.instance.bossInstance.isStalled = false; WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.musicSource.clip = WaveManager.instance.bossMusic; WaveManager.instance.musicSource.Play(); } if (WaveManager.instance.lunasaInstance) { WaveManager.instance.lunasaInstance.isStalled = false; WaveManager.instance.merlinInstance.isStalled = false; WaveManager.instance.lyricaInstance.isStalled = false; WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.musicSource.clip = WaveManager.instance.finalMusic; WaveManager.instance.musicSource.Play(); } //GameManager.instance.SetPause(false); WaveManager.instance.bossUI.SetActive(true); WaveManager.instance.musicSource.Play(); reisenAnimator.SetTrigger(switchToIdleTrigger); youmuAnimator.SetTrigger(switchToIdleTrigger); } private void SetDialogue(DialogueScript.Dialogue textToShow) { reisenSpeechBubble.SetActive(false); youmuSpeechBubble.SetActive(false); bossSpeechBubble.gameObject.SetActive(false); lyricaSpeechBubble.SetActive(false); merlinSpeechBubble.SetActive(false); lunasaSpeechBubble.SetActive(false); switch (textToShow.character.thisCharacter) //everyone will hate this code but that's alright { case DialogueCharacter.Character.Reisen: reisenSpeechBubble.SetActive(true); reisenText.text = textToShow.text; youmuAnimator.SetTrigger(changeDialogueTrigger); reisenAnimator.SetTrigger(talkTrigger); if (WaveManager.instance.lyricaInstance) { WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger); } else { WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger); } break; case DialogueCharacter.Character.Youmu: youmuSpeechBubble.SetActive(true); youmuText.text = textToShow.text; youmuAnimator.SetTrigger(talkTrigger); reisenAnimator.SetTrigger(changeDialogueTrigger); if (WaveManager.instance.lyricaInstance) { WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger); } else { WaveManager.instance.bossInstance.animator.SetTrigger(changeDialogueTrigger); } break; case DialogueCharacter.Character.Enemy: bossSpeechBubble.gameObject.SetActive(true); bossText.text = textToShow.text; reisenAnimator.SetTrigger(changeDialogueTrigger); youmuAnimator.SetTrigger(changeDialogueTrigger); WaveManager.instance.bossInstance.animator.SetTrigger(talkTrigger); break; case DialogueCharacter.Character.Lunasa: lunasaSpeechBubble.gameObject.SetActive(true); lunasaText.text = textToShow.text; reisenAnimator.SetTrigger(changeDialogueTrigger); youmuAnimator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(talkTrigger); break; case DialogueCharacter.Character.Merlin: merlinSpeechBubble.gameObject.SetActive(true); merlinText.text = textToShow.text; reisenAnimator.SetTrigger(changeDialogueTrigger); youmuAnimator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lyricaInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(talkTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger); break; case DialogueCharacter.Character.Lyrica: lyricaSpeechBubble.gameObject.SetActive(true); lyricaText.text = textToShow.text; reisenAnimator.SetTrigger(changeDialogueTrigger); youmuAnimator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lyricaInstance.animator.SetTrigger(talkTrigger); WaveManager.instance.merlinInstance.animator.SetTrigger(changeDialogueTrigger); WaveManager.instance.lunasaInstance.animator.SetTrigger(changeDialogueTrigger); break; } } private void Update() { if (dialogueActive) { if (Input.GetMouseButtonDown(0)) { ContinueDialogue(); } else if (Input.GetKeyDown(KeyCode.Escape)) { EndDialogue(); } } } }