Пример #1
0
    void ProceedToNarrative(string narrativeDataGUID)
    {
        DialogueNodeData    nodeData = currPatient.dialogue.DialogueNodeData.Find(x => x.NodeGUID == narrativeDataGUID);
        string              text     = nodeData.DialogueText;
        List <NodeLinkData> choices  = currPatient.dialogue.NodeLinks.Where(x => x.BaseNodeGUID == narrativeDataGUID).ToList();

        PatientData.PatientMoodData mood = currPatient.GetMoodData(nodeData.mood);

        if (mood.mood == PatientMood.ExitNotOK)
        {
            AudioManager.Instance.PlayMusic(loseAmbient, time: 0.5f);
        }
        else if (mood.mood == PatientMood.ExitOk)
        {
            AudioManager.Instance.MuteMusic(AudioManager.Instance.crossfadeTime);
            winAmbientAS = AudioManager.Instance.Play(winAmbient, 0.4f, 1.0f, AudioManager.Instance.crossfadeTime);
            LeanTween.delayedCall(winAmbient.length - AudioManager.Instance.crossfadeTime, AudioManager.Instance.ContinueMusicAfterMute);
        }

        dialogLog.AddToLog(DialogLogUI.LogEntryType.Patient, ProcessProperties(text), currPatient.name, mood.backColor, currPatient, mood, () => {
            AudioManager.Instance.Play(patientWriteSound, 0.5f);
        }, () => {
            AudioManager.Instance.Play(buttonAppear, buttonAppearVolume);

            foreach (var choice in choices)
            {
                string choiceText = ProcessProperties(choice.PortName);

                dialogSelect.AddButton(choiceText, () => {
                    dialogSelect.Clear();
                    dialogLog.AddToLog(DialogLogUI.LogEntryType.Operator, choiceText, operatorName, minTimeToCallShow: 0.5f, onShowLog: () => {
                        switch (mood.mood)
                        {
                        case PatientMood.ExitOk:
                        case PatientMood.ExitNotOK:
                            EndPatient();
                            break;

                        case PatientMood.Normal:
                        case PatientMood.Angry:
                        default:
                            ProceedToNarrative(choice.TargetNodeGUID);
                            break;
                        }
                    });
                });
            }

            if (mood.mood == PatientMood.ExitOk || mood.mood == PatientMood.ExitNotOK)
            {
                EndPatient();
            }
        });
    }
Пример #2
0
    public void AddToLog(LogEntryType type, string text, string name = "", Color backColor = default, PatientData patientData = null, PatientData.PatientMoodData moodData = default, Action beforeStartScroll = null, Action onShowLog = null, float minTimeToCallShow = 0.0f)
    {
        if (type == LogEntryType.Patient)
        {
            GameObject typingGO = Instantiate(patientTypingPrefab, layoutGroup.transform);
            patientTyping = typingGO.GetComponent <PatientTypingEntry>();
            patientTyping.Init(patientData != null ? patientData.GetMoodData("normal").backColor : backColor);

            StartCoroutine(ScrollToBottom(null, 0.0f));

            float delay = dotsAnimLenghtRange.GetRandomValueFloat();
            LeanTween.delayedCall(delay, () => {
                beforeStartScroll?.Invoke();
                Destroy(patientTyping.gameObject);
                AddToLogImmediatly();
            });
        }
        else
        {
            beforeStartScroll?.Invoke();
            AddToLogImmediatly();
        }

        void AddToLogImmediatly()
        {
            GameObject entryGO;
            Color      c;

            switch (type)
            {
            case LogEntryType.Operator:
                entryGO = Instantiate(operatorLogPrefab, layoutGroup.transform);
                c       = operatorColor;
                break;

            case LogEntryType.Servise:
                entryGO = Instantiate(serviceLogPrefab, layoutGroup.transform);
                c       = serviceColor;
                break;

            case LogEntryType.Patient:
            default:
                entryGO = Instantiate(patientLogPrefab, layoutGroup.transform);
                c       = backColor;
                break;
            }

            DialogLogEntry entry = entryGO.GetComponent <DialogLogEntry>();

            if (patientData != null && patientData.skeletonDataAsset != null && moodData.animationSpine != null)
            {
                entry.Init(name, text, patientData.skeletonDataAsset, moodData.animationSpine, c);
            }
            else
            {
                entry.Init(name, text, moodData.avatar, c);
            }

            if (type != LogEntryType.Servise)
            {
                for (int i = 0; i < entries.Count; ++i)
                {
                    entries[i].OnBecomeOld();
                }
            }
            entries.Add(entry);

            contentSizeFitter.enabled = false;
            contentSizeFitter.SetLayoutVertical();
            foreach (Transform child in entryGO.transform)
            {
                LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)child.transform);
            }
            LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)entryGO.transform);
            contentSizeFitter.enabled = true;

            StartCoroutine(ScrollToBottom(onShowLog, minTimeToCallShow));
        }
    }