ReisenTasker/Assets/Scripts/Dialogue/DialogueManager.cs

171 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
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
private class Choice
{
public string choiceName;
public DialogueScript choiceScript;
}
[Header("Player")]
public Player player;
[Header("Dialogue Script")]
public DialogueScript currentDialogueScript;
public DialogueScript[] allDialogue;
public bool clickingDisabled = false;
private int textProgress;
public string[] scriptLines;
[Header("UI")]
public GameObject uiCanvas;
public TextMeshProUGUI nameText;
public TextMeshProUGUI dialogueText;
public Button choiceButton;
public Transform choicePanel;
public void StartDialogue(DialogueScript scriptToShow)
{
uiCanvas.SetActive(true);
textProgress = 0;
currentDialogueScript = scriptToShow;
scriptLines = currentDialogueScript.script.text.Split("\n");
player.abilitiesDisabled = true;
player.stalled = true;
UpdateDialogue();
}
private void ContinueDialogue()
{
textProgress++;
clickingDisabled = false;
UpdateDialogue();
}
private void UpdateDialogue()
{
string[] words = scriptLines[textProgress].Split(" ");
switch (words[0].ToUpper())
{
case "END":
EndDialogue();
break;
case "TEXT":
foreach (DialogueCharacter character in currentDialogueScript.characters)
{
if (string.Equals(character.name, words[1], StringComparison.CurrentCultureIgnoreCase))
{
nameText.text = character.name;
string text = string.Join(" ", words[2..]);
text = text.Replace("\"", "");
dialogueText.text = text;
break;
}
}
break;
case "TASK": //must use 3 words on these.
string taskModifier = words[1].ToUpper();
if (taskModifier == "ADD")
{
foreach (Task task in TaskManager.instance.taskList)
{
if (string.Equals(task.taskID, words[2], StringComparison.CurrentCultureIgnoreCase))
{
TaskManager.instance.AddTask(task);
break;
}
}
}
ContinueDialogue();
break;
case "ITEM":
string itemModifier = words[1].ToUpper();
if (itemModifier == "ADD")
{
foreach (Item item in InventoryManager.instance.itemList)
{
if (string.Equals(item.itemName, words[2], StringComparison.CurrentCultureIgnoreCase))
{
InventoryManager.instance.AddItem(item, Int32.Parse(words[3]));
break;
}
}
}
ContinueDialogue();
break;
case "#":
ContinueDialogue();
break;
case "CHOICE":
clickingDisabled = true;
List<Choice> choices = new();
for (int i = 1; i < words.Length; i++)
{
Choice newChoice = new Choice();
string[] c = words[i].Split(":");
newChoice.choiceName = c[0];
foreach (DialogueScript dialogueScript in allDialogue)
{
if (string.Equals(c[1], dialogueScript.dialogueID, StringComparison.CurrentCultureIgnoreCase))
{
newChoice.choiceScript = dialogueScript; //this is the worst way ever to find a matching id but WHATEVER
break;
}
}
if (!newChoice.choiceScript)
{
Debug.LogWarning("BRO WTF THERE IS NO MATCHING ID!!!");
}
else
{
choices.Add(newChoice);
}
}
foreach (Choice possibleChoice in choices)
{
Button newChoiceButton = Instantiate(choiceButton, choicePanel);
newChoiceButton.onClick.AddListener(() => StartDialogue(possibleChoice.choiceScript));
newChoiceButton.GetComponentInChildren<TextMeshProUGUI>().text = possibleChoice.choiceName;
}
break;
}
}
public void EndDialogue()
{
//TaskManager.instance.AddTask(currentDialogueScript.taskToStart);
uiCanvas.SetActive(false);
currentDialogueScript = null;
scriptLines = null;
player.abilitiesDisabled = false;
player.stalled = false;
}
private void Update()
{
if (currentDialogueScript && Input.GetMouseButtonDown(0))
{
ContinueDialogue();
}
}
}