Ejemplo n.º 1
0
    private DialogueNodeData SaveNodeData(DialogueNode _node)
    {
        DialogueNodeData dialogueNodeData = new DialogueNodeData
        {
            NodeGuid              = _node.NodeGuid,
            Position              = _node.GetPosition().position,
            TextType              = _node.Texts,
            Name                  = _node.Name,
            AudioClips            = _node.AudioClips,
            DialogueFaceImageType = _node.FaceImageType,
            Sprite                = _node.FaceImage,
            Background            = _node.BackGround,
            DialogueNodePorts     = new List <DialogueNodePort>(_node.DialogueNodePorts)
        };

        foreach (DialogueNodePort nodePort in dialogueNodeData.DialogueNodePorts)
        {
            nodePort.OutputGuid = string.Empty;
            nodePort.InputGuid  = string.Empty;
            foreach (Edge edge in edges)
            {
                if (edge.output == nodePort.MyPort)
                {
                    nodePort.OutputGuid = (edge.output.node as BaseNode).NodeGuid;
                    nodePort.InputGuid  = (edge.input.node as BaseNode).NodeGuid;
                }
            }
        }
        return(dialogueNodeData);
    }
Ejemplo n.º 2
0
 protected override void OnInit(Camera UICamera)
 {
     base.OnInit(UICamera);
     LeftIcon   = CacheTransform.Find("Content/LeftImage").GetComponent <Image>();
     RightIcon  = CacheTransform.Find("Content/RightImage").GetComponent <Image>();
     LeftModel  = CacheTransform.Find("Content/LeftModel");
     RightModel = CacheTransform.Find("Content/RightModel");
     ShowText   = CacheTransform.Find("Content/ShowText").GetComponent <Text>();
     TitleText  = CacheTransform.Find("Content/TitleText").GetComponent <Text>();
     for (int i = 0; i < 4; i++)
     {
         Answers[i] = CacheTransform.Find("Content/AnswerBtn" + (i + 1)).gameObject;
         EventTriggerListener.Get(Answers[i].gameObject).SetEventHandle(EnumTouchEventType.OnClick, (a, b, c) =>
         {
             StopContentText();
             string nextNode = NodeData.Answers[(int)(c[0])].Target;
             if (nextNode == "end")
             {
                 //关闭界面
                 Singleton <WindowManager> .GetInstance().CloseWindow(false, "Dialogue");
                 return;
             }
             NodeData  = GetDialogue(nextNode);
             Coroutine = SingletonMono <GameFrameWork> .GetInstance().StartCoroutine(ShowContentText());
         }, i);
     }
 }
    private void CreateNodes()
    {
        foreach (var nodeData in containerCache.baseNodesData)
        {
            switch (nodeData.nodeType)
            {
            case NodeType.StartNode:
                var startNode = new BaseNode(nodeData.nodeType, targetGraphView, nodeData.position, nodeData.guid);
                targetGraphView.AddElement(startNode);
                break;

            case NodeType.DialogueNode:
                DialogueNodeData dialogueData = containerCache.dialogueNodesData.Find(x => x.guid == nodeData.guid);
                var dialogueNode = new DialogueNode(targetGraphView, nodeData, dialogueData);
                targetGraphView.AddElement(dialogueNode);
                break;

            case NodeType.ChoiceNode:
                ChoiceNodeData choiceData = containerCache.choiceNodesData.Find(x => x.guid == nodeData.guid);
                var            nodePorts  = containerCache.nodeLinks.Where(x => x.thisNodeGuid == nodeData.guid).ToList();
                var            choiceNode = new ChoiceNode(targetGraphView, nodeData, choiceData, nodePorts);
                targetGraphView.AddElement(choiceNode);
                break;

            case NodeType.EndNode:
                var endNode = new BaseNode(nodeData.nodeType, targetGraphView, nodeData.position, nodeData.guid);
                targetGraphView.AddElement(endNode);
                break;
            }
        }
    }
Ejemplo n.º 4
0
        private bool SaveNodes(string fileName, DialogueContainer dialogueContainerObject)
        {
            if (!Edges.Any())
            {
                return(false);
            }
            var connectedSockets = Edges.Where(x => x.input.node != null).ToArray();

            for (var i = 0; i < connectedSockets.Count(); i++)
            {
                var outputNode = (connectedSockets[i].output.node as DialogueNode);
                var inputNode  = (connectedSockets[i].input.node as DialogueNode);
                dialogueContainerObject.NodeLinks.Add(new NodeLinkData
                {
                    BaseNodeGUID   = outputNode.GUID,
                    PortName       = connectedSockets[i].output.portName,
                    TargetNodeGUID = inputNode.GUID
                });
            }

            foreach (var node in Nodes.Where(node => !node.EntyPoint))
            {
                DialogueNodeData data = new DialogueNodeData {
                    NodeGUID     = node.GUID,
                    DialogueText = node.DialogueText,
                    mood         = node.mood,
                    Position     = node.GetPosition().position
                };

                dialogueContainerObject.DialogueNodeData.Add(data);
            }

            return(true);
        }
 public void Path2()
 {
     //moves onto next node
     currentNode = activeDialogue.FindNode(activeDialogue.ReturnValidEdges(currentNode)[1].secondNodeID);
     isNode      = true;
     NextDialogue();
 }
Ejemplo n.º 6
0
        // Saving dialogue node
        private DialogueNodeData SaveNodeData(DialogueNode node)
        {
            DialogueNodeData dialogueNodeData = new DialogueNodeData
            {
                NodeGuid          = node.NodeGuid,
                Position          = node.GetPosition().position,
                TextLanguages     = node.Texts,
                Name              = node.NameText,
                AudioClips        = node.AudioClips,
                npcSprite         = node.NpcFaceImage,
                playerSprite      = node.PlayerFaceImage,
                DialogueNodePorts = new List <DialogueNodePort>(node.DialogueNodePorts)
            };

            foreach (DialogueNodePort nodePort in dialogueNodeData.DialogueNodePorts)
            {
                nodePort.OutputGuid = string.Empty;
                nodePort.InputGuid  = string.Empty;

                foreach (Edge edge in edges)
                {
                    if (edge.output == nodePort.MyPort)
                    {
                        // Converting DialogueNode output and input guids to BaseNode for unified loading and saving
                        nodePort.OutputGuid = (edge.output.node as BaseNode).NodeGuid;
                        nodePort.InputGuid  = (edge.input.node as BaseNode).NodeGuid;
                    }
                }
            }

            return(dialogueNodeData);
        }
    public void Load(DialogueNodeData data, bool isEntryPoint = false)
    {
        (GUID, DialogueText, EntryPoint) =
            (data.Guid, data.DialogueText, isEntryPoint);

        RefreshExpandedState();
        RefreshPorts();
    }
Ejemplo n.º 8
0
        public static NodePresenter Create(Vector2 position)
        {
            var nodeView = new DialogueNodeView(LocalizationStrings.DialogueNode, position);
            var connectionPointInPresenter  = new ConnectionPointPresenter(new ConnectionPointView(nodeView, ConnectionPointType.In));
            var connectionPointOutPresenter = new ConnectionPointPresenter(new ConnectionPointView(nodeView, ConnectionPointType.Out));
            var nodeData      = new DialogueNodeData();
            var nodePresenter = new DialogueNodePresenter(nodeView, nodeData, connectionPointInPresenter, connectionPointOutPresenter);

            return(nodePresenter);
        }
    public void StartDialogue()
    {
        EdgeData leadingEdge = activeDialogue.GraphEdges.Where(x => x.portName == "StartNodeEdge").First();

        //set current node ID to the first nodeID
        currentNode = activeDialogue.NodeData.Where(x => x.nodeID == leadingEdge.secondNodeID).First();

        normalText.enabled = true;
        normalText.text    = currentNode.dialogueTxt;
        //StartCoroutine(typeSentence(currentNode.dialogueTxt));
    }
Ejemplo n.º 10
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();
            }
        });
    }
Ejemplo n.º 11
0
    protected override void OnAppear(int sequence, int openOrder, WindowContext context)
    {
        base.OnAppear(sequence, openOrder, context);
        Content = context as DialogueContent;
//        LeftIcon.sprite = Content.LeftIcon;
//        RightIcon.sprite = Content.RightIcon;
//        Content.LeftModel.transform.SetParent(LeftModel);
//        Content.RightModel.transform.SetParent(RightModel);
        LoadDialogueData(Content.FileName);
        this.NodeData = GetDialogue(Content.StartNode);
        Coroutine     = SingletonMono <GameFrameWork> .GetInstance().StartCoroutine(ShowContentText());
    }
    public new DialogueNodeData CopyData(bool keepGuid = true)
    {
        var textList = dialogueTexts.Select(textObject => textObject.text).ToList();

        var data = new DialogueNodeData
        {
            guid          = keepGuid ? guid : Guid.NewGuid().ToString(),
            speaker       = characterDropdown.value.PropertyName,
            dialogueTexts = textList,
        };

        return(data);
    }
Ejemplo n.º 13
0
    private void RunNode(DialogueNodeData _nodeData)
    {
        lastDialogueNodeData    = currentDialogueNodeData;
        currentDialogueNodeData = _nodeData;

        dialogueController.SetText(_nodeData.Name, _nodeData.TextType.Find(text => text.LanguageType == LanguageController.Instance.Language).LanguageGenericType);
        dialogueController.SetImage(_nodeData.Sprite);

        MakeButtons(_nodeData.DialogueNodePorts);

        audioSource.clip = _nodeData.AudioClips.Find(clip => clip.LanguageType == LanguageController.Instance.Language).LanguageGenericType;
        audioSource.Play();
    }
    public int ReturnPotentialEdges(DialogueNodeData current)
    {
        List <EdgeData>         edges = GraphEdges.Where(x => x.firstNodeID == current.nodeID).ToList();
        List <DialogueNodeData> nodes = new List <DialogueNodeData>();

        edges.ForEach(e => NodeData.Where(n => n.nodeID == e.secondNodeID).ToList().ForEach(n => nodes.Add(n)));

        List <EdgeData> validEdges = new List <EdgeData>();

        nodes.ForEach(n => edges.Where(e => e.secondNodeID == n.nodeID).ToList().ForEach(e => validEdges.Add(e)));

        totalEdges = validEdges.Count();
        return(totalEdges);
    }
    //method to retun all adjacent nodes
    public List <EdgeData> ReturnValidEdges(DialogueNodeData current)
    {
        List <EdgeData>         edges = GraphEdges.Where(x => x.firstNodeID == current.nodeID).ToList();
        List <DialogueNodeData> nodes = new List <DialogueNodeData>();

        edges.ForEach(e => NodeData.Where(n => n.nodeID == e.secondNodeID && RealParser.RP.inv.ContainsKey(Int32.Parse(n.dialogueKey))).ToList().ForEach(n => nodes.Add(n)));

        List <EdgeData> validEdges = new List <EdgeData>();

        nodes.ForEach(n => edges.Where(e => e.secondNodeID == n.nodeID).ToList().ForEach(e => validEdges.Add(e)));


        return(validEdges);
    }
Ejemplo n.º 16
0
 public void answerDialogue(int answer)
 {
     if (dialogueState == DialogueState.OPEN)
     {
         string nextNode = dialogueNode.answers[answer].target;
         if (nextNode == "END")
         {
             endDialogue();
             return;
         }
         dialogueNode = dialogueController.getDialogue(nextNode);
         drawDialogue();
     }
 }
Ejemplo n.º 17
0
        private void RunNode(DialogueNodeData nodeData) // Running dialogue node
        {
            // If the current dialogue node is different than coming dialogue node
            if (currentDialogueNodeData != nodeData)
            {
                lastDialogueNodeData    = currentDialogueNodeData; // Last dialogue node is the current node
                currentDialogueNodeData = nodeData;                // Current dialogue node is the coming node
            }

            dialogueController.SetText(nodeData.Name, nodeData.TextLanguages.Find(text => text.LanguageType == LanguageController.Instance.Language).LanguageGenericType); // Setting NPC name text and its dialogue text
            dialogueController.SetImage(nodeData.playerSprite, nodeData.npcSprite);                                                                                        // Setting NPC and Player images to show in dialogue UI

            MakeButtons(nodeData.DialogueNodePorts);                                                                                                                       // Spawning dialogue buttons based on possible dialogue options in Dialogue Node

            audioSource.clip = nodeData.AudioClips.Find(clip => clip.LanguageType == LanguageController.Instance.Language).LanguageGenericType;                            // Getting the right NPC audio clip to play
            audioSource.Play();                                                                                                                                            // Playing found clip
        }
Ejemplo n.º 18
0
        private void DisplayDialogueNode(DialogueNodeData node)
        {
            speakerNameLabel.text = ProcessExposedProperties(node.speakerName);
            dialogueLabel.text    = ProcessExposedProperties(node.dialogueText);

            ClearChoiceButtons();

            if (node.responses.Count == 0)
            {
                Button endButton = Instantiate(choiceButtonPrefab, choicesContentAreaTransform);
                endButton.GetComponentInChildren <TMP_Text>().text = closeConversationLabelText;
                endButton.onClick.AddListener(() => dialoguePanel.gameObject.SetActive(false));
            }
            else
            {
                GenerateChoiceButtons(node);
            }
        }
    public void OnPasteElementsOption(string a, string b)
    {
        if (nodeCopyCache.Count == 0)
        {
            return;
        }

        var graphContainer = GraphSaveUtility.GetInstance(targetGraphView).GetNodesContainer();

        foreach (var node in nodeCopyCache)
        {
            var baseNode = (BaseNode)node;
            var nodeData = baseNode.CopyData(false);

            // Offset pasted node
            nodeData.position.y += baseNode.GetPosition().height + nodePasteOffset;

            switch (nodeData.nodeType)
            {
            case NodeType.DialogueNode:
                var dialogueNodeOriginal      = node as DialogueNode;
                DialogueNodeData dialogueData = dialogueNodeOriginal.CopyData();
                var dialogueNode = new DialogueNode(targetGraphView, nodeData, dialogueData);
                targetGraphView.AddElement(dialogueNode);
                break;

            case NodeType.ChoiceNode:
                var            choiceNodeOriginal = node as ChoiceNode;
                ChoiceNodeData choiceData         = choiceNodeOriginal.CopyData();
                var            choicePorts        = graphContainer.nodeLinks.ToList().Where(x => x.thisNodeGuid == nodeData.guid).ToList();
                var            choiceNode         = new ChoiceNode(targetGraphView, nodeData, choiceData, choicePorts);
                targetGraphView.AddElement(choiceNode);
                break;

            case NodeType.EndNode:
                var endNode = new BaseNode(nodeData.nodeType, targetGraphView, nodeData.position, nodeData.guid);
                targetGraphView.AddElement(endNode);
                break;
            }
        }
    }
    public DialogueNode(DialogueGraphView _graphView, BaseNodeData baseData, DialogueNodeData dialogueData)
    {
        graphView = _graphView;

        Initialize(baseData.nodeName, baseData.guid);
        SetupPorts();

        var propertyIndex = _graphView.exposedProperties.FindIndex(x => x.PropertyName == dialogueData.speaker);

        SetupCharacterSelection(propertyIndex);

        SetPosition(new Rect(baseData.position, defaultNodeSize));
        RefreshExpandedState();
        RefreshPorts();


        foreach (var text in dialogueData.dialogueTexts)
        {
            AddTextField(text);
        }
    }
Ejemplo n.º 21
0
        /// <summary>
        /// Generates a new DialogueNode with pre-existing data.
        /// </summary>
        /// <param name="onClickRemovePort">An action delegate called when the remove port button is clicked.</param>
        /// <param name="nodeData">The node data to populate the node with.</param>
        public DialogueNode(Action <Node, Port> onClickRemovePort, DialogueNodeData nodeData) : base(onClickRemovePort)
        {
            type = NodeType.Dialogue;

            // Associate stylesheet
            styleSheets.Add(Resources.Load <StyleSheet>("Node"));

            // Set the properties from the passed in data.
            Guid         = nodeData.guid;
            DialogueText = nodeData.dialogueText;
            SpeakerName  = nodeData.speakerName;

            for (int i = 0; i < nodeData.responses.Count; i++)
            {
                AddDialogueNodePorts(nodeData.responses[i], nodeData.conditionsToToggle[i]);
            }

            // Add node fields
            BuildNodeControls();
            UpdateTitle();
        }
Ejemplo n.º 22
0
        private void GenerateChoiceButtons(DialogueNodeData node)
        {
            List <NodeLinkData> nodeLinks = GetLinks(node.guid);

            if (nodeLinks.Count != node.responses.Count)
            {
                Debug.LogError(
                    $"Dialogue Node {node.guid} has mismatched number of links and responses. Aborting conversation.");
                dialoguePanel.gameObject.SetActive(false);
                return;
            }

            for (var i = 0; i < node.responses.Count; i++)
            {
                NodeLinkData      link              = nodeLinks[i];
                string            currentResponse   = node.responses[i];
                DialogueCondition conditionToToggle = node.conditionsToToggle[i];
                Button            button            = Instantiate(choiceButtonPrefab, choicesContentAreaTransform);
                button.GetComponentInChildren <TMP_Text>().text = currentResponse;
                button.onClick.AddListener(() => OnButtonClick(link, conditionToToggle));
            }
        }
Ejemplo n.º 23
0
 protected override void OnClose(WindowContext context)
 {
     base.OnClose(context);
     this.NodeData = null;
     StopContentText();
 }
Ejemplo n.º 24
0
 public DialogueData()
 {
     nodes    = new DialogueNodeData[1];
     nodes[0] = new DialogueNodeData();
 }
Ejemplo n.º 25
0
 /// <summary>
 /// Creates a new DialogueNode with given values.
 /// </summary>
 /// <param name="nodeData">The values to initialize the node with.</param>
 /// <returns>A dialogue node initialized with the given values.</returns>
 public DialogueNode CreateDialogueNode(DialogueNodeData nodeData)
 {
     return(new DialogueNode(OnClickRemoveOutputPort, nodeData));
 }
Ejemplo n.º 26
0
 public void startDialogue(string nodeName)
 {
     dialogueState = DialogueState.OPEN;
     dialogueNode  = dialogueController.getDialogue(nodeName);
     drawDialogue();
 }
Ejemplo n.º 27
0
    private bool GraphDeconstruct(DialogueContainer input)
    {
        while (!string.IsNullOrEmpty(currentGUID) && !textboxWait)
        {
            //Dialogue Node
            if (input.DialogueNodeData.Any(x => x.Guid == currentGUID))
            {
                DialogueNodeData node = input.DialogueNodeData.First(x => x.Guid == currentGUID);
                textboxWait = true;

                SayDialogue dialogueCutscene = ScriptableObject.CreateInstance <SayDialogue>();
                if (!string.IsNullOrEmpty(node.TargetPlayer))
                {
                    dialogueCutscene.speakerName = node.TargetPlayer;
                }
                else
                {
                    dialogueCutscene.speakerName = speakerName;
                }
                dialogueCutscene.inputText           = new TextAsset(node.DialogueText);
                dialogueCutscene.currentLinks        = input.NodeLinks.Where(x => x.BaseNodeGuid == currentGUID).ToList();
                dialogueCutscene.deconstructerSource = this;
                CutsceneController.addCutsceneEvent(dialogueCutscene, cutsceneSource, true, GameDataTracker.cutsceneModeOptions.Cutscene);
                continue;
            }
            //Animation Trigger
            if (input.AnimationTriggerNodeData.Any(x => x.Guid == currentGUID))
            {
                AnimationTriggerNodeData node = input.AnimationTriggerNodeData.First(x => x.Guid == currentGUID);

                AnimationTriggerCutscene animationTriggerCutscene = ScriptableObject.CreateInstance <AnimationTriggerCutscene>();
                animationTriggerCutscene.TriggerName = node.TriggerName;
                animationTriggerCutscene.TargetName  = node.TargetPlayer;

                CutsceneController.addCutsceneEvent(animationTriggerCutscene, cutsceneSource, false, GameDataTracker.cutsceneModeOptions.Cutscene);
                currentGUID = FindNextNode(input, currentGUID);
                continue;
            }
            //Set Flag
            if (input.SetFlagNodeData.Any(x => x.Guid == currentGUID))
            {
                SetFlagNodeData SetFlagNode = input.SetFlagNodeData.First(x => x.Guid == currentGUID);
                string          FlagName    = SetFlagNode.FlagName;
                string          FlagTag     = SetFlagNode.FlagTag;
                if (GameDataTracker.stringFlags.ContainsKey(FlagName))
                {
                    GameDataTracker.stringFlags[FlagName] = FlagTag;
                }
                else
                {
                    GameDataTracker.stringFlags.Add(FlagName, FlagTag);
                }
                currentGUID = FindNextNode(input, currentGUID);
                continue;
            }
            //Get Flag
            if (input.GetFlagNodeData.Any(x => x.Guid == currentGUID))
            {
                GetFlagNodeData GetFlagNode = input.GetFlagNodeData.First(x => x.Guid == currentGUID);
                string          FlagName    = GetFlagNode.FlagName;
                if (GameDataTracker.stringFlags.ContainsKey(FlagName))
                {
                    string FlagTag = GameDataTracker.stringFlags[FlagName];
                    if (input.NodeLinks.Any(x => x.PortName == FlagTag))
                    {
                        currentGUID = input.NodeLinks.First(x => x.PortName == FlagTag && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                    }
                    else
                    {
                        currentGUID = input.NodeLinks.First(x => x.PortName == "Other" && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                    }
                }
                else
                {
                    currentGUID = input.NodeLinks.First(x => x.PortName == "Other" && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                }
                continue;
            }
            //Boolean Set Flag
            if (input.BooleanSetFlagNodeData.Any(x => x.Guid == currentGUID))
            {
                BooleanSetFlagNodeData BooleanSetFlagNode = input.BooleanSetFlagNodeData.First(x => x.Guid == currentGUID);
                string FlagName = BooleanSetFlagNode.FlagName;
                bool   FlagBool = BooleanSetFlagNode.FlagBool;
                if (GameDataTracker.boolFlags.ContainsKey(FlagName))
                {
                    GameDataTracker.boolFlags[FlagName] = FlagBool;
                }
                else
                {
                    GameDataTracker.boolFlags.Add(FlagName, FlagBool);
                }
                currentGUID = FindNextNode(input, currentGUID);
                continue;
            }
            //Boolean Get Flag
            if (input.BooleanGetFlagNodeData.Any(x => x.Guid == currentGUID))
            {
                BooleanGetFlagNodeData BooleanGetFlagNode = input.BooleanGetFlagNodeData.First(x => x.Guid == currentGUID);
                string FlagName = BooleanGetFlagNode.FlagName;
                if (GameDataTracker.boolFlags.ContainsKey(FlagName))
                {
                    bool FlagBool = GameDataTracker.boolFlags[FlagName];
                    if (FlagBool)
                    {
                        currentGUID = input.NodeLinks.First(x => x.PortName == "True" && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                    }
                    else
                    {
                        currentGUID = input.NodeLinks.First(x => x.PortName == "False" && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                    }
                }
                else
                {
                    currentGUID = input.NodeLinks.First(x => x.PortName == "Other" && x.BaseNodeGuid == currentGUID).TargetNodeGuid;
                }
                continue;
            }
            //Move To Position
            if (input.MoveToPosNodeData.Any(x => x.Guid == currentGUID))
            {
                MoveToPosNodeData MoveToPosNode   = input.MoveToPosNodeData.First(x => x.Guid == currentGUID);
                string            TargetObject    = MoveToPosNode.TargetObject;
                string            ReferenceObject = MoveToPosNode.ReferenceObject;
                bool    Wait   = MoveToPosNode.Wait;
                Vector3 Offset = MoveToPosNode.PosOffset;

                MoveToPosition moveToPosition = ScriptableObject.CreateInstance <MoveToPosition>();
                moveToPosition.PositionOffset  = Offset;
                moveToPosition.ReferenceObject = ReferenceObject;
                moveToPosition.TargetObject    = TargetObject;
                moveToPosition.Wait            = Wait;

                CutsceneController.addCutsceneEvent(moveToPosition, cutsceneSource, true, GameDataTracker.cutsceneModeOptions.Cutscene);
                currentGUID = FindNextNode(input, currentGUID);
                continue;
            }
        }
        if (!textboxWait && string.IsNullOrEmpty(currentGUID))
        {
            done = true;
            return(true);
        }
        return(false);
    }
Ejemplo n.º 28
0
        /// <summary>
        /// Checks Nodes validity and translates them in a saveable data (DialogueNodeData and NodeLinkData for the edges)
        /// </summary>
        private bool SaveNodes(DialogueContainer dialogueContainer)
        {
            var entryPoint = Edges.Find(x => x.output.node.title == "START");

            if (entryPoint == null)

            {
                EditorUtility.DisplayDialog("Error", "Start Node must be connected before saving.", "OK");
                if (_targetGraph.GetAutoSave())
                {
                    _targetGraph.Close();
                }

                return(false);
            }

            if (!Edges.Any())//Is there any connection made ? If not, return, that way we do not save anything
            {
                return(false);
            }


            //We get only connections in the input ports, since the output ports will be stored in another nodes' input port
            var connectedPorts = Edges.Where(x => x.input.node != null).OrderByDescending(x => ((DialogueNode)(x.output.node)).EntryPoint).ToArray();;

            for (int i = 0; i < connectedPorts.Length; i++)
            {
                var outputNode = connectedPorts[i].output.node as DialogueNode;
                var inputNode  = connectedPorts[i].input.node as DialogueNode;

                dialogueContainer.NodeLinks.Add(item: new NodeLinkData
                {
                    BaseNodeGuid   = outputNode.GUID,
                    PortName       = connectedPorts[i].output.portName,
                    TargetNodeGuid = inputNode.GUID
                });
            }

            foreach (var dialogueNode in Nodes.Where(node => !node.EntryPoint))
            {
                //If the condition is not null nor empty, and it is not a handled predicate, we say stop
                if (!Core.PredicateHelper.IsWholePredicateValid(dialogueNode.condition))
                {
                    string errorMessage = "Error, current condition for node '" + dialogueNode.name + "' isnt valid. Valid conditions are : ";
                    foreach (string type in Enum.GetNames(typeof(Core.PredicateHelper.predicateType)))
                    {
                        errorMessage += type + ", ";
                    }

                    errorMessage += "please chose one of them before saving, or set it up to nothing. You can also use boolean operators &&, ||, ! and brackets ().";

                    EditorUtility.DisplayDialog(title: "Condition not valid", message: errorMessage, ok: "OK");
                    return(false);
                }

                //We make sure that the node's data was created and updated
                DialogueNodeData data = new DialogueNodeData()
                {
                    DialogueText  = dialogueNode.DialogueText,
                    GUID          = dialogueNode.GUID,
                    Position      = new Vector2(dialogueNode.GetPosition().x, dialogueNode.GetPosition().y),
                    OnEnterAction = dialogueNode.OnEnterAction,
                    OnExitAction  = dialogueNode.OnExitAction,
                    condition     = new Core.Condition(dialogueNode.condition, null)
                };
                //Then add it to the save container
                dialogueContainer.dialogueNodeData.Add(item: data);
            }
            return(true);
        }
    public void NextDialogue()
    {
        //if node is end node, end dialogue
        if (currentNode.dialogueTxt == "End")
        {
            EndDialogue();
        }
        //if has 2 edges
        //activeDialogue.ReturnValidEdges(currentNode).Count >= 2
        else if (activeDialogue.ReturnPotentialEdges(currentNode) >= 2)
        {
            //but only has one valid edge
            if (activeDialogue.ReturnValidEdges(currentNode).Count == 1)
            {
                if (isNode)
                {
                    //display node
                    thisIsNode();
                }
                else
                {
                    normalText.enabled = false;
                    Option1.gameObject.SetActive(true);
                    Option2.gameObject.SetActive(true);

                    option1.text = activeDialogue.ReturnValidEdges(currentNode)[0].portName;
                    option2.text = "Option requires an item to unlock it.";
                }
            }
            else if (activeDialogue.ReturnValidEdges(currentNode).Count >= 2)
            {
                if (isNode)
                {
                    //display node
                    thisIsNode();
                }
                else
                {
                    normalText.enabled = false;
                    Option1.gameObject.SetActive(true);
                    Option2.gameObject.SetActive(true);

                    option1.text = activeDialogue.ReturnValidEdges(currentNode)[0].portName;
                    option2.text = activeDialogue.ReturnValidEdges(currentNode)[1].portName;
                }
            }
        }
        //if has 1 edge
        else if (activeDialogue.ReturnPotentialEdges(currentNode) == 1)
        {
            if (!isNode)
            {
                //display edge
                normalText.enabled = true;
                Option1.gameObject.SetActive(false);
                Option2.gameObject.SetActive(false);

                normalText.text = activeDialogue.ReturnValidEdges(currentNode)[0].portName;

                currentNode = activeDialogue.FindNode(activeDialogue.ReturnValidEdges(currentNode)[0].secondNodeID);
                isNode      = true;
            }
            else if (isNode)
            {
                //display node
                thisIsNode();
            }
        }
    }
 public DialogueNode(DialogueNodeData data)
     : this(data.Id, data.Title, data.Content, data.DialogueResponses.Select(o => new DialogueResponse(o)).ToList())
 {
 }