Skip to content
Snippets Groups Projects
Dialog.cs 3.25 KiB
Newer Older
Samuel Truman's avatar
Samuel Truman committed
using System;
using System.Collections.Generic;
Samuel Truman's avatar
Samuel Truman committed
using Articy.Unity;
using Articy.Unity.Interfaces;
Samuel Truman's avatar
Samuel Truman committed
using TMPro;
Samuel Truman's avatar
Samuel Truman committed
using UnityEngine;
Samuel Truman's avatar
Samuel Truman committed
using UnityEngine.Serialization;
using UnityEngine.UI;
Samuel Truman's avatar
Samuel Truman committed

namespace de.jmu.ge.viavr.dialogs.runtime {
    [RequireComponent(typeof(ArticyFlowPlayer))]
    public class Dialog: MonoBehaviour, IArticyFlowPlayerCallbacks {
Samuel Truman's avatar
Samuel Truman committed
        public string dialogId;
        public string avatarName;
        [SerializeField] private TMP_Text[] avatarNameTexts;
Samuel Truman's avatar
Samuel Truman committed
        [SerializeField] private TMP_Text contentText;
        [SerializeField] private Button[] buttons;
        [SerializeField] private GameObject dialogPanel;
Samuel Truman's avatar
Samuel Truman committed
        private ArticyFlowPlayer articyFlowPlayer;


        private void Awake() {
            articyFlowPlayer = GetComponent<ArticyFlowPlayer>();
        }

        private void Start() {
            var id = Convert.ToUInt64(dialogId, 16);
Samuel Truman's avatar
Samuel Truman committed
            articyFlowPlayer.StartOn = ArticyDatabase.GetObject(id);
Samuel Truman's avatar
Samuel Truman committed
            foreach(var tmpText in avatarNameTexts) {
                tmpText.text = avatarName;
            }
        }

        public void OnFlowPlayerPaused(IFlowObject currentNode) {
            if(currentNode != null) {
                var currentText = string.Empty;
                if(currentNode is IObjectWithText objWithText) {
                    currentText = objWithText.Text;
                    contentText.text = objWithText.Text;
                }
                if(currentNode is IObjectWithSpeaker objSpeaker) {
                    var speakerDisplayName = objSpeaker.Speaker as IObjectWithDisplayName;
                    var actor = speakerDisplayName?.DisplayName ?? string.Empty;
                    foreach(var tmpText in avatarNameTexts) {
                        tmpText.text = actor;
                    }
                }
                
                // Skip dialog fragment if it has no text and only one branch
                var hasExactlyOneBranch = articyFlowPlayer.AvailableBranches.Count == 1;
                if(string.IsNullOrWhiteSpace(currentText) && hasExactlyOneBranch) {
                    articyFlowPlayer.Play(articyFlowPlayer.AvailableBranches[0]);
                }
            }
            else {
                dialogPanel.SetActive(false);
            }
        }

        public void OnBranchesUpdated(IList<Branch> currentBranches) {
            for(var i = 0; i < buttons.Length; i++) {
                var correspondingBranchExists = currentBranches.Count > i;
                buttons[i].gameObject.SetActive(correspondingBranchExists);
                buttons[i].onClick.RemoveAllListeners();
                if(!correspondingBranchExists) continue;
                var branchText = string.Empty;
                if(currentBranches[i].Target is IObjectWithMenuText target) {
                    branchText = target.MenuText;
                }
                if(string.IsNullOrWhiteSpace(branchText)) {
                    var hasNext = currentBranches[i].Target is IObjectWithText;
                    branchText = hasNext ? "Continue" : "End dialog";
                }
                buttons[i].GetComponentInChildren<TMP_Text>().text = branchText;
                var i1 = i;
                buttons[i].onClick.AddListener(() => articyFlowPlayer.Play(currentBranches[i1]));
            }