Skip to content
Snippets Groups Projects
Dialog.cs 3.31 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;
Samuel Truman's avatar
Samuel Truman committed
        [FormerlySerializedAs("avatarNameText")] [SerializeField] private TMP_Text[] avatarNameTexts;
        [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;
            }
            // Jump into first dialog fragment if dialog itself has no text
            // if(ArticyDatabase.GetObject(id) is IObjectWithText current && string.IsNullOrWhiteSpace(current.Text)) {
            //     Debug.Log("skip");
            //     if(current is IObjectWithTarget currentWithTarget) {
            //         Debug.Log("adsfasdfasdf");
            //         // articyFlowPlayer.Play(ArticyDatabase.GetObject(currentWithTarget.Target.Id));
            //     }
            // }
        }

        public void OnFlowPlayerPaused(IFlowObject currentNode) {
            if(currentNode != null) {
                if(currentNode is IObjectWithText objWithText) {
                    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;
                    }
                }
            }
            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 != null;
                    branchText = hasNext ? "Continue" : "End dialog";
                }
                buttons[i].GetComponentInChildren<TMP_Text>().text = branchText;
                var i1 = i;
                buttons[i].onClick.AddListener(() => articyFlowPlayer.Play(currentBranches[i1]));
            }