ReisenYoumuOuting/Assets/Scripts/Dialogue/DialogueManager.cs
2026-07-13 17:46:02 -07:00

224 lines
8.5 KiB
C#

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)
{
dialogueUI.SetActive(true);
WaveManager.instance.bossUI.SetActive(false);
dialogueActive = true;
currentText = 0;
scriptToShow = newDialogue;
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.volume = WaveManager.instance.bossVolume;
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.volume = WaveManager.instance.finalVolume;
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;
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();
}
}
}
}