private void SaveNodes(DialogueContainerSO _dialogueContainerSO) { _dialogueContainerSO.DialogueNodeDatas.Clear(); _dialogueContainerSO.EventNodeDatas.Clear(); _dialogueContainerSO.EndNodeDatas.Clear(); _dialogueContainerSO.StartNodeDatas.Clear(); nodes.ForEach(node => { switch (node) { case DialogueNode dialogueNode: _dialogueContainerSO.DialogueNodeDatas.Add(SaveNodeData(dialogueNode)); break; case StartNode startNode: _dialogueContainerSO.StartNodeDatas.Add(SaveNodeData(startNode)); break; case EndNode endNode: _dialogueContainerSO.EndNodeDatas.Add(SaveNodeData(endNode)); break; case EventNode eventNode: _dialogueContainerSO.EventNodeDatas.Add(SaveNodeData(eventNode)); break; default: break; } }); }
private void ConnectNodes(DialogueContainerSO _dialogueContainer) { for (int i = 0; i < nodes.Count; i++) { List <NodeLinkData> connections = _dialogueContainer.NodeLinkData.Where(edge => edge.BaseNodeGuid == nodes[i].NodeGuid).ToList(); for (int j = 0; j < connections.Count; j++) { var targetNodeGuid = connections[j].TargetNodeGuid; BaseNode targetNode = nodes.First(node => node.NodeGuid == targetNodeGuid); if (nodes[i] is DialogueNode == false) { Debug.Log("Подключаю Ноды"); LinkNodesTogether(nodes[i].outputContainer[j].Q <Port>(), (Port)targetNode.inputContainer[0]); } } } List <DialogueNode> dialogueNodes = nodes.FindAll(node => node is DialogueNode).Cast <DialogueNode>().ToList(); foreach (DialogueNode dialogueNode in dialogueNodes) { foreach (DialogueNodePort nodePort in dialogueNode.DialogueNodePorts) { if (nodePort.InputGuid != string.Empty) { BaseNode targetNode = nodes.First(Node => Node.NodeGuid == nodePort.InputGuid); LinkNodesTogether(nodePort.MyPort, (Port)targetNode.inputContainer[0]); } ; } } }
public void Load(DialogueContainerSO _dialogueContainerSO) { ClearGraph(); GenerateNodes(_dialogueContainerSO); ConnectNodes(_dialogueContainerSO); GenerateMiniMap(); }
public void Save(DialogueContainerSO _dialogueContainerSO) { SaveEdges(_dialogueContainerSO); SaveNodes(_dialogueContainerSO); EditorUtility.SetDirty(_dialogueContainerSO); AssetDatabase.SaveAssets(); }
// Saving our dialgoue public void Save(DialogueContainerSO dialogueContainerSO) { SaveEdges(dialogueContainerSO); SaveNodes(dialogueContainerSO); EditorUtility.SetDirty(dialogueContainerSO); // Setting editor dirty to accept our changes AssetDatabase.SaveAssets(); }
public void StartDialogue(DialogueContainerSO dialogueContainer) // Starting the dialogue on interaction with NPC { currentDialogue = dialogueContainer; // Current dialogue is the one passed in interaction if (isTalking != true) // If player isn't talking already we can run dialogue { isTalking = true; // Setting the bool to true because player is talking now CheckNodeType(GetNextNode(currentDialogue.StartNodeDatas[0])); // Every dialogue starts with Start Node so we're getting the first item in StartNodeData to properly run the dialogue sequence dialogueController.ShowDialogueUI(true); // Showing the dialogue UI } }
private void GenerateNodes(DialogueContainerSO _dialogueContainer) { // Start foreach (StartNodeData node in _dialogueContainer.StartNodeDatas) { StartNode tempNode = graphView.CreateStartNode(node.Position); tempNode.NodeGuid = node.NodeGuid; graphView.AddElement(tempNode); } // End Node foreach (EndNodeData node in _dialogueContainer.EndNodeDatas) { EndNode tempNode = graphView.CreateEndNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.EndNodeType = node.EndNodeType; tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // Event Node foreach (EventNodeData node in _dialogueContainer.EventNodeDatas) { EventNode tempNode = graphView.CreateEventNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.DialogueEvent = node.DialogueEventSO; tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // Dialogue Node foreach (DialogueNodeData node in _dialogueContainer.DialogueNodeDatas) { DialogueNode tempNode = graphView.CreateDialogueNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.Name = node.Name; tempNode.Texts = node.TextType; tempNode.BackgroundImage = node.Sprite; tempNode.BackgroundImageType = node.DialogueBackgroundImageType; tempNode.AudioClips = node.AudioClips; foreach (DialogueNodePort nodePort in node.DialogueNodePorts) { tempNode.AddChoicePort(tempNode, nodePort); } tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } }
private void SaveEdges(DialogueContainerSO _dialogueContainerSO) { _dialogueContainerSO.NodeLinkData.Clear(); Edge[] connectedEdges = edges.Where(edge => edge.input != null).ToArray(); for (int i = 0; i < connectedEdges.Count(); i++) { BaseNode outputNode = (BaseNode)connectedEdges[i].output.node; BaseNode inputNode = connectedEdges[i].input.node as BaseNode; _dialogueContainerSO.NodeLinkData.Add(new NodeLinkData { BaseNodeGuid = outputNode.NodeGuid, TargetNodeGuid = inputNode.NodeGuid }); } }
// Saving all nodes private void SaveNodes(DialogueContainerSO dialogueContainerSO) { // Clearing all data before saving dialogueContainerSO.DialogueNodeDatas.Clear(); dialogueContainerSO.EventNodeDatas.Clear(); dialogueContainerSO.StatCheckNodeDatas.Clear(); dialogueContainerSO.ItemCheckNodeDatas.Clear(); dialogueContainerSO.EndNodeDatas.Clear(); dialogueContainerSO.StartNodeDatas.Clear(); // Each node is saved to different list nodes.ForEach(node => { switch (node) { case StartNode startNode: dialogueContainerSO.StartNodeDatas.Add(SaveNodeData(startNode)); break; case EndNode endNode: dialogueContainerSO.EndNodeDatas.Add(SaveNodeData(endNode)); break; case EventNode eventNode: dialogueContainerSO.EventNodeDatas.Add(SaveNodeData(eventNode)); break; case DialogueNode dialogueNode: dialogueContainerSO.DialogueNodeDatas.Add(SaveNodeData(dialogueNode)); break; case StatCheckNode statCheckNode: dialogueContainerSO.StatCheckNodeDatas.Add(SaveNodeData(statCheckNode)); break; case ItemCheckNode itemCheckNode: dialogueContainerSO.ItemCheckNodeDatas.Add(SaveNodeData(itemCheckNode)); break; default: break; } }); }
// Saving nodes edges private void SaveEdges(DialogueContainerSO dialogueContainerSO) { // Clearing all links before saving new ones dialogueContainerSO.NodeLinkDatas.Clear(); Edge[] connectedEdges = edges.Where(edge => edge.input.node != null).ToArray(); // Connecting edges by finding matching ones for (int i = 0; i < connectedEdges.Count(); i++) { BaseNode outputNode = (BaseNode)connectedEdges[i].output.node; BaseNode inputNode = connectedEdges[i].input.node as BaseNode; // Adding edges to list dialogueContainerSO.NodeLinkDatas.Add(new NodeLinkData { BaseNodeGuid = outputNode.NodeGuid, TargetNodeGuid = inputNode.NodeGuid }); } }
// Connecting nodes private void ConnectNodes(DialogueContainerSO dialogueContainer) { // Looping through every node for (int i = 0; i < nodes.Count; i++) { List <NodeLinkData> connections = dialogueContainer.NodeLinkDatas.Where(edge => edge.BaseNodeGuid == nodes[i].NodeGuid).ToList(); for (int j = 0; j < connections.Count; j++) { string targetNodeGuid = connections[j].TargetNodeGuid; BaseNode targetNode = nodes.First(node => node.NodeGuid == targetNodeGuid); if ((nodes[i] is DialogueNode) == false) { // Connecting every nodes (besides DialogueNode) based on their input and output from ScriptableObject LinkNodesTogether(nodes[i].outputContainer[j].Q <Port>(), (Port)targetNode.inputContainer[0]); } } } List <DialogueNode> dialogueNodes = nodes.FindAll(node => node is DialogueNode).Cast <DialogueNode>().ToList(); // Looping through every DialogueNode foreach (DialogueNode dialogueNode in dialogueNodes) { foreach (DialogueNodePort nodePort in dialogueNode.DialogueNodePorts) { if (nodePort.InputGuid != string.Empty) { // Connecting DialogueNodes and every other nodes to DialogueNode choices BaseNode targetNode = nodes.First(Node => Node.NodeGuid == nodePort.InputGuid); LinkNodesTogether(nodePort.MyPort, (Port)targetNode.inputContainer[0]); } } } }
private void GenerateNodes(DialogueContainerSO _dialogueContainer) { // Start Node foreach (StartNodeData node in _dialogueContainer.StartNodeData) { StartNode tempNode = graphView.CreateStartNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.DialogueID = node.dialogueID; graphView.AddElement(tempNode); } // End Node foreach (EndNodeData node in _dialogueContainer.EndNodeData) { EndNode tempNode = graphView.CreateEndNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.EndNodeType = node.EndNodeType; graphView.AddElement(tempNode); } // Event Node foreach (EventNodeData node in _dialogueContainer.EventNodeData) { EventNode tempNode = graphView.CreateEventNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.DialogueEvent = node.DialogueEventSO; graphView.AddElement(tempNode); } // Dialogue Node foreach (DialogueNodeData node in _dialogueContainer.DialogueNodeData) { DialogueNode tempNode = graphView.CreateDialogueNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.Name = node.Name; //tempNode.Texts = node.TextType; tempNode.FaceImage = node.Sprite; tempNode.BackGround = node.Background; tempNode.FaceImageType = node.DialogueFaceImageType; //tempNode.AudioClips = node.AudioClips; foreach (LanguageGeneric <string> languageGeneric in node.TextType) { tempNode.Texts.Find(language => language.LanguageType == languageGeneric.LanguageType).LanguageGenericType = languageGeneric.LanguageGenericType; } foreach (LanguageGeneric <AudioClip> languageGeneric in node.AudioClips) { tempNode.AudioClips.Find(language => language.LanguageType == languageGeneric.LanguageType).LanguageGenericType = languageGeneric.LanguageGenericType; } foreach (DialogueNodePort nodePort in node.DialogueNodePorts) { tempNode.AddChoicePort(tempNode, nodePort); } tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // Script Node foreach (ScriptNodeData node in _dialogueContainer.ScriptNodeData) { ScriptNode tempNode = graphView.CreateScriptNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.scriptType = node.scriptNodeType; tempNode.reqScriptType = node.reqNodeType; foreach (ScriptNodePort scriptNodePort in node.scriptNodePorts) { tempNode.AddRequirement(tempNode, scriptNodePort); tempNode.ScriptText = node.scriptTexts; tempNode.ResultText = node.resultTexts; } tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } }
// Loading dialogue public void Load(DialogueContainerSO dialogueContainerSO) { ClearGraph(); GenerateNodes(dialogueContainerSO); ConnectNodes(dialogueContainerSO); }
// Spawning nodes based on ScriptableObject data private void GenerateNodes(DialogueContainerSO dialogueContainer) { // StartNode foreach (StartNodeData node in dialogueContainer.StartNodeDatas) { StartNode tempNode = graphView.CreateStartNode(node.Position); tempNode.NodeGuid = node.NodeGuid; graphView.AddElement(tempNode); } // EndNode foreach (EndNodeData node in dialogueContainer.EndNodeDatas) { EndNode tempNode = graphView.CreateEndNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.EndNodeType = node.EndNodeType; tempNode.LoadValueInToField(); // Loading values into node fields graphView.AddElement(tempNode); // Adding node to graph view } // EventNode foreach (EventNodeData node in dialogueContainer.EventNodeDatas) { EventNode tempNode = graphView.CreateEventNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.DialogueEvent = node.DialogueEventSO; tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // DialogueNode foreach (DialogueNodeData node in dialogueContainer.DialogueNodeDatas) { DialogueNode tempNode = graphView.CreateDialogueNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.NameText = node.Name; tempNode.NpcFaceImage = node.npcSprite; tempNode.PlayerFaceImage = node.playerSprite; // Matching language dialogue is set to foreach (LanguageGeneric <string> languageGeneric in node.TextLanguages) { tempNode.Texts.Find(language => language.LanguageType == languageGeneric.LanguageType).LanguageGenericType = languageGeneric.LanguageGenericType; } // Matching voice clips language dialogue is set to foreach (LanguageGeneric <AudioClip> languageGeneric in node.AudioClips) { tempNode.AudioClips.Find(language => language.LanguageType == languageGeneric.LanguageType).LanguageGenericType = languageGeneric.LanguageGenericType; } // Matching dialogue choice ports foreach (DialogueNodePort nodePort in node.DialogueNodePorts) { tempNode.AddChoicePort(tempNode, nodePort); } tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // StatCheckNode foreach (StatCheckNodeData node in dialogueContainer.StatCheckNodeDatas) { StatCheckNode tempNode = graphView.CreateStatCheckNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.StatCheckValue = node.StatCheckValue.ToString(); tempNode.CheckType = node.StatCheckType; tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } // ItemCheckNode foreach (ItemCheckNodeData node in dialogueContainer.ItemCheckNodeDatas) { ItemCheckNode tempNode = graphView.CreateItemCheckNode(node.Position); tempNode.NodeGuid = node.NodeGuid; tempNode.ItemCheckValue = node.ItemCheckValue.ToString(); tempNode.ItemCheckNodeType = node.ItemCheckType; tempNode.NodeItem = node.NodeItem; tempNode.LoadValueInToField(); graphView.AddElement(tempNode); } }