Ejemplo n.º 1
0
        /// <summary>
        /// When loading a game, load the dialogue entry records and resume the conversation.
        /// </summary>
        public virtual void OnApplyPersistentData()
        {
            if (DontLoadInThisScene())
            {
                Debug.Log("OnApplyPersistentData Dont Load in this scene: " + SceneManager.GetActiveScene().buildIndex);
            }
            if (DontLoadInThisScene())
            {
                return;
            }
            records.Clear();
            if (!DialogueLua.DoesVariableExist(currentDialogueEntryRecords))
            {
                return;
            }
            StopAllCoroutines();

            // Load dialogue entry records:
            var s = DialogueLua.GetVariable(currentDialogueEntryRecords).AsString;

            if (Debug.isDebugBuild)
            {
                Debug.Log("TextlineDialogueUI.OnApplyPersistentData: Restoring current conversation from " + currentDialogueEntryRecords + ": " + s);
            }
            var ints       = s.Split(';');
            var numRecords = Tools.StringToInt(ints[0]);

            for (int i = 0; i < numRecords; i++)
            {
                var conversationID = Tools.StringToInt(ints[1 + i * 2]);
                var entryID        = Tools.StringToInt(ints[2 + i * 2]);
                records.Add(new DialogueEntryRecord(conversationID, entryID));
            }

            // If we have records, resume the conversation:
            if (records.Count == 0)
            {
                return;
            }
            var lastRecord = records[records.Count - 1];

            if (lastRecord.conversationID >= 0 && lastRecord.entryID > 0)
            {
                UnityEngine.UI.Button lastContinueButton = null;
                try
                {
                    // Resume conversation:
                    //if (dontRepeatLastSequence) isLoadingGame = true;
                    isLoadingGame = true;
                    var conversation        = DialogueManager.MasterDatabase.GetConversation(lastRecord.conversationID);
                    var actorName           = DialogueLua.GetVariable(currentConversationActor).AsString;
                    var conversantName      = DialogueLua.GetVariable(currentConversationConversant).AsString;
                    var actor               = GameObject.Find(actorName);
                    var conversant          = GameObject.Find(conversantName);
                    var actorTransform      = (actor != null) ? actor.transform : null;
                    var conversantTransform = (conversant != null) ? conversant.transform : null;
                    if (Debug.isDebugBuild)
                    {
                        Debug.Log("Resuming '" + conversation.Title + "' at entry " + lastRecord.entryID);
                    }
                    DialogueManager.StopConversation();
                    var lastEntry        = DialogueManager.MasterDatabase.GetDialogueEntry(lastRecord.conversationID, lastRecord.entryID);
                    var originalSequence = lastEntry.Sequence; // Handle last entry's sequence differently if end entry.
                    npcPreDelaySettings.CopyTo(npcPreDelaySettingsCopy);
                    pcPreDelaySettings.CopyTo(pcPreDelaySettingsCopy);
                    npcPreDelaySettings.basedOnTextLength = false;
                    npcPreDelaySettings.additionalSeconds = 0;
                    pcPreDelaySettings.basedOnTextLength  = false;
                    pcPreDelaySettings.additionalSeconds  = 0;
                    var isEndEntry = lastEntry.Sequence.Contains("WaitForMessage(Forever)") || lastEntry.outgoingLinks.Count == 0;
                    if (isEndEntry)
                    {
                        if (!lastEntry.Sequence.Contains("WaitForMessage(Forever)"))
                        {
                            lastEntry.Sequence = "WaitForMessage(Forever); " + lastEntry.Sequence;
                        }
                    }
                    else if (dontRepeatLastSequence)
                    {
                        lastEntry.Sequence = "None()";
                    }
                    else
                    {
                        lastEntry.Sequence = "Delay(0.1)";
                    }
                    skipNextRecord = true;
                    isInPreDelay   = false;
                    DialogueManager.StartConversation(conversation.Title, actorTransform, conversantTransform, lastRecord.entryID);
                    lastContinueButton = continueButton;
                    lastEntry.Sequence = originalSequence;
                    npcPreDelaySettingsCopy.CopyTo(npcPreDelaySettings);
                    pcPreDelaySettingsCopy.CopyTo(pcPreDelaySettings);

                    // Populate UI with previous records:
                    var lastInstance = (instantiatedMessages.Count > 0) ? instantiatedMessages[instantiatedMessages.Count - 1] : null;
                    instantiatedMessages.Remove(lastInstance);
                    DestroyInstantiatedMessages();
                    for (int i = 0; i < records.Count - 1; i++)
                    {
                        var entry         = DialogueManager.MasterDatabase.GetDialogueEntry(records[i].conversationID, records[i].entryID);
                        var speakerInfo   = DialogueManager.ConversationModel.GetCharacterInfo(entry.ActorID);
                        var listenerInfo  = DialogueManager.ConversationModel.GetCharacterInfo(entry.ConversantID);
                        var formattedText = FormattedText.Parse(entry.currentDialogueText, DialogueManager.MasterDatabase.emphasisSettings);
                        var subtitle      = new Subtitle(speakerInfo, listenerInfo, null, formattedText, "None()", entry.ResponseMenuSequence, entry);
                        AddMessage(subtitle);
                    }
                    if (lastInstance != null)
                    {
                        instantiatedMessages.Add(lastInstance);
                        lastInstance.transform.SetAsLastSibling();
                    }
                }
                finally
                {
                    isLoadingGame = false;
                    scrollRect.verticalNormalizedPosition = 0;
                    continueButton = lastContinueButton;
                    if (shouldShowContinueButton && lastContinueButton != null)
                    {
                        lastContinueButton.gameObject.SetActive(true);
                    }
                }
            }
            ScrollToBottom();
        }