public static void CreateNewGraph(string graphName) { EngineGraph currentGraph = (EngineGraph)ScriptableObject.CreateInstance <EngineGraph>(); if (currentGraph != null) { currentGraph.graphName = graphName; currentGraph.Initialize(); string path = "Assets/Paradox Engine/Graph/Resources/Data/" + graphName + ".asset"; AssetDatabase.CreateAsset(currentGraph, path); EngineGraphCacheUtilities.SaveSessionCache(path); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EngineGraphWindow currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>(); if (currentWindow != null) { currentWindow.currentGraph = currentGraph; } CreateNode(currentWindow.currentGraph, EnumNodeType.Start, new Vector2(104, 136)); CreateNode(currentWindow.currentGraph, EnumNodeType.End, new Vector2(307, 136)); } else { EditorUtility.DisplayDialog("Paradox Engine", "Graph creation failed.", "OK"); } }
public static void LoadSession(EngineGraph graph) { var currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>(); if (currentWindow != null) { graph.selectedNode = null; currentWindow.currentGraph = graph; } }
public static void DisconnectOutput(EngineGraph graph, int nodeID) { if (graph.nodes[nodeID] != null) { if (graph.nodes[nodeID].nodeType == EnumNodeType.Branch_Question) { NQuestionBranch multiNode = (NQuestionBranch)graph.nodes[nodeID]; if (multiNode.multiOutput.hasSomething) { for (int i = 0; i < multiNode.multiOutput.outputNode.Count; i++) { multiNode.multiOutput.outputNode[i].input.inputNode.Remove(multiNode); multiNode.multiOutput.outputNode[i].input.hasSomething = multiNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false; } multiNode.multiOutput.outputNode = new List <NTemplate>(); multiNode.multiOutput.hasSomething = false; } } else if (graph.nodes[nodeID].nodeType == EnumNodeType.Branch_Condition) { NConditionalBranch multiNode = (NConditionalBranch)graph.nodes[nodeID]; if (multiNode.multiOutput.hasSomething) { for (int i = 0; i < multiNode.multiOutput.outputNode.Count; i++) { multiNode.multiOutput.outputNode[i].input.inputNode.Remove(multiNode); multiNode.multiOutput.outputNode[i].input.hasSomething = multiNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false; } multiNode.multiOutput.outputNode = new List <NTemplate>(); multiNode.multiOutput.hasSomething = false; } } else { if (graph.nodes[nodeID].output.outputNode != null) { graph.nodes[nodeID].output.outputNode.input.inputNode.Remove(graph.nodes[nodeID]); graph.nodes[nodeID].output.outputNode.input.hasSomething = graph.nodes[nodeID].output.outputNode.input.inputNode.Count > 0 ? true : false; graph.nodes[nodeID].output.outputNode = null; graph.nodes[nodeID].output.isOccupied = false; } } } }
public static void TranslateGraph(EngineGraph graph, LocalizationManager manager) { IEnumerable <NTemplate> nodes = graph.nodes.Where(x => x.nodeType == Utilities.EnumNodeType.Answer || x.nodeType == Utilities.EnumNodeType.Text); NText textTemplate; NAnswer answerTemplate; foreach (var node in nodes) { if (node.nodeType == Utilities.EnumNodeType.Text) { textTemplate = (NText)node; textTemplate.data = manager.GetTextNodeTranslation(node.GetLocalizationID()); } else { answerTemplate = (NAnswer)node; answerTemplate.answer = manager.GetAnswerNodeTranslation(node.GetLocalizationID()); } } }
public static void DisconnectInput(EngineGraph graph, int nodeID) { if (graph.nodes[nodeID] != null) { if (graph.nodes[nodeID].nodeType == EnumNodeType.Answer) { for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++) { NQuestionBranch questionNode = (NQuestionBranch)graph.nodes[nodeID].input.inputNode[i]; questionNode.multiOutput.outputNode.RemoveAt(questionNode.multiOutput.outputNode.IndexOf(graph.nodes[nodeID])); questionNode.multiOutput.hasSomething = questionNode.multiOutput.outputNode.Count == 0 ? false : true; } } else if (graph.nodes[nodeID].nodeType == EnumNodeType.Condition) { for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++) { NConditionalBranch conditionNode = (NConditionalBranch)graph.nodes[nodeID].input.inputNode[i]; conditionNode.multiOutput.outputNode.RemoveAt(conditionNode.multiOutput.outputNode.IndexOf(graph.nodes[nodeID])); conditionNode.multiOutput.hasSomething = conditionNode.multiOutput.outputNode.Count == 0 ? false : true; } } else { for (int i = 0; i < graph.nodes[nodeID].input.inputNode.Count; i++) { graph.nodes[nodeID].input.inputNode[i].output.outputNode = null; graph.nodes[nodeID].input.inputNode[i].output.isOccupied = false; } } graph.nodes[nodeID].input.inputNode = new List <NTemplate>(); graph.nodes[nodeID].input.hasSomething = false; } }
public static void LoadSession(string graphPath, bool cache = false) { EngineGraph currentGraph = null; if (graphPath != "") { string finalPath = graphPath; if (!cache) { int appPathLen = Application.dataPath.Length; finalPath = graphPath.Substring(appPathLen - 6); } currentGraph = (EngineGraph)AssetDatabase.LoadAssetAtPath(finalPath, typeof(EngineGraph)); if (currentGraph != null) { EngineGraphWindow currentWindow = (EngineGraphWindow)EditorWindow.GetWindow <EngineGraphWindow>(); if (currentWindow != null) { if (!cache) { EngineGraphCacheUtilities.SaveSessionCache(finalPath); } currentWindow.currentGraph = currentGraph; } } else { EditorUtility.DisplayDialog("Paradox Engine", "Graph load failed.", "OK"); } currentGraph.selectedNode = null; } }
public void BakeGraph() { var nodes = _graphToAdd.nodes.Where(x => x.nodeType == EnumNodeType.Answer || x.nodeType == EnumNodeType.Text); bool alreadyArchived = _objectNames.Any(x => x == _graphToAdd.graphName); if (!alreadyArchived) { _objectNames.Add(_graphToAdd.graphName); } else { Debug.Log("Paradox Engine: Added all the nodes not archived in the data."); } NText textNode; NAnswer answerNode; foreach (var node in nodes) { if (_cacheData.Any(x => new Guid(x.id).Equals(node.GetLocalizationID()))) { Debug.Log($"The node {node.name}: InstanceID: {node.GetInstanceID()} is not added, because already exist someone with the same ID."); return; } if (node.nodeType == EnumNodeType.Text) { textNode = (NText)node; var textData = new ParadoxTextNodeLocalizationData(); textData.id = textNode.GetLocalizationID().ToByteArray(); textData.data = textNode.data; EditorUtility.SetDirty(textNode); _cacheData.Add(textData); } else { answerNode = (NAnswer)node; var answerData = new ParadoxAnswerNodeLocalizationData(); answerData.id = answerNode.GetLocalizationID().ToByteArray(); answerData.data = answerNode.answer; EditorUtility.SetDirty(answerNode); _cacheData.Add(answerData); } } _graphToAdd = null; _addingGraph = false; _endElement = _cacheData.Count - (_endElement + 5) <= 0 ? _cacheData.Count : _endElement + 5; AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Repaint(); }
private void DataView() { GUILayout.Label($"Start: {_startElement}, End: {_endElement}"); EditorGUILayout.BeginVertical(); _pos = EditorGUILayout.BeginScrollView(_pos, GUILayout.Width(_width)); if (_cacheData == null || !_cacheData.Any()) { GUILayout.BeginVertical("BOX"); GUILayout.Label("The Language data don't have any data."); GUILayout.EndVertical(); } else { if (_cacheData.Count > 5) { GUILayout.BeginHorizontal(); if (_startElement > 0) { if (GUILayout.Button("<< Previous")) { _endElement = _endElement < _cacheData.Count ? _endElement - 5 : _startElement; _startElement -= 5; } } GUILayout.FlexibleSpace(); if (_endElement < _cacheData.Count) { if (GUILayout.Button("Next >>")) { _startElement += 5; _endElement = _cacheData.Count - (_endElement + 5) <= 0 ? _cacheData.Count : _endElement + 5; } } GUILayout.EndHorizontal(); } GUILayout.Space(10); string names = string.Empty; for (int i = 0; i < _objectNames.Count; i++) { names += i == _objectNames.Count ? $"{_objectNames[i]}.": $"{_objectNames[i]}, "; } GUILayout.BeginVertical("BOX"); GUILayout.Label($"Objects baked: {names}", _description); GUILayout.EndVertical(); ParadoxAnswerNodeLocalizationData answerData; ParadoxTextNodeLocalizationData textData; ParadoxDropdownLocalizationData dropdownData; ParadoxTextLocalizationData simpleData; for (int i = _startElement; i < _endElement; i++) { GUILayout.BeginVertical("BOX"); GUILayout.Label($"ID: {new Guid(_cacheData[i].id).ToString()}"); if (_cacheData[i].filterType == ELanguageGraphFilter.AnswerNode) { answerData = (ParadoxAnswerNodeLocalizationData)_cacheData[i]; answerData.data = GUILayout.TextField(answerData.data); } else if (_cacheData[i].filterType == ELanguageGraphFilter.TextNode) { textData = (ParadoxTextNodeLocalizationData)_cacheData[i]; GUILayout.BeginVertical("BOX"); ParadoxTextNodeData nodeData; for (int x = 0; x < textData.data.Count; x++) { nodeData = textData.data[x]; if (nodeData.IsDialogue) { GUILayout.Label(textData.data[x].Character.name); } nodeData.Text = GUILayout.TextArea(nodeData.Text); textData.data[x] = nodeData; GUILayout.Space(2); } GUILayout.EndVertical(); } else if (_cacheData[i].filterType == ELanguageGraphFilter.Dropdown) { dropdownData = (ParadoxDropdownLocalizationData)_cacheData[i]; for (int y = 0; y < dropdownData.data.Length; y++) { dropdownData.data[y] = GUILayout.TextField(dropdownData.data[y]); GUILayout.Space(2); } } else { simpleData = (ParadoxTextLocalizationData)_cacheData[i]; GUILayout.BeginHorizontal(); GUILayout.Label("Text:"); simpleData.data = GUILayout.TextField(simpleData.data); GUILayout.EndHorizontal(); } if (GUILayout.Button("Unsuscribe data")) { int tempI = i; OnRepaint += () => _cacheData.RemoveAt(tempI); } GUILayout.EndVertical(); GUILayout.Space(5); } } GUILayout.Space(10); if (_addingGraph) { GUILayout.Label("Graph:"); _graphToAdd = (EngineGraph)EditorGUILayout.ObjectField(_graphToAdd, typeof(EngineGraph), false); GUILayout.BeginHorizontal("BOX"); if (GUILayout.Button("Bake graph data")) { if (_graphToAdd == null) { Debug.Log("Paradox Engine: The graph field can't be null."); return; } BakeGraph(); } if (GUILayout.Button("Cancel")) { _graphToAdd = null; _addingGraph = false; } GUILayout.EndHorizontal(); } else if (_addingText) { GUILayout.Label("Text component:"); _textToAdd = (TextLocalizationSetter)EditorGUILayout.ObjectField(_textToAdd, typeof(TextLocalizationSetter), true); GUILayout.BeginHorizontal("BOX"); if (GUILayout.Button("Bake text data")) { if (_textToAdd == null) { Debug.Log("Paradox Engine: The text field can't be null."); return; } if (_cacheData.Any(x => new Guid(x.id).Equals(_textToAdd.GetLocalizationID()))) { Debug.LogError("Paradox Engine: The text is already in the data."); return; } BakeText(); } if (GUILayout.Button("Bake all")) { var temp = GameObject.FindObjectsOfType <TextLocalizationSetter>().ToList(); for (int i = 0; i < temp.Count; i++) { if (_cacheData.Any(x => new Guid(x.id).Equals(temp[i].GetLocalizationID()))) { Debug.LogError("Paradox Engine: The text is already in the data."); continue; } BakeText(temp[i]); } } if (GUILayout.Button("Cancel")) { _textToAdd = null; _addingText = false; } GUILayout.EndHorizontal(); } else if (_addingDropdown) { GUILayout.Label("Dropdown component:"); _dropwdownToAdd = (DropdownLocalizationSetter)EditorGUILayout.ObjectField(_dropwdownToAdd, typeof(DropdownLocalizationSetter), true); GUILayout.BeginHorizontal("BOX"); if (GUILayout.Button("Bake dropdown data")) { if (_dropwdownToAdd == null) { Debug.Log("Paradox Engine: The text field can't be null."); return; } if (_cacheData.Any(x => new Guid(x.id).Equals(_dropwdownToAdd.GetLocalizationID()))) { Debug.LogError("Paradox Engine: The dropdown is already in the data."); return; } BakeDropDown(); } if (GUILayout.Button("Bake all")) { var temp = GameObject.FindObjectsOfType <DropdownLocalizationSetter>().ToList(); for (int i = 0; i < temp.Count; i++) { if (_cacheData.Any(x => new Guid(x.id).Equals(temp[i].GetLocalizationID()))) { Debug.LogError("Paradox Engine: The dropdown is already in the data."); continue; } BakeDropDown(temp[i]); } } if (GUILayout.Button("Cancel")) { _dropwdownToAdd = null; _addingDropdown = false; } GUILayout.EndHorizontal(); } else { if (GUILayout.Button("Add Graph")) { _addingGraph = true; } GUILayout.Space(5); if (GUILayout.Button("Add Text component")) { _addingText = true; } GUILayout.Space(5); if (GUILayout.Button("Add Dropddown component")) { _addingDropdown = true; } } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); OnRepaint(); OnRepaint = delegate { }; }
public static void DrawGrid(Rect viewRect, float gridSpacing, float gridOpacity, Color gridColor, EngineGraph currentGraph) { int widthDivs = Mathf.CeilToInt(10000 / gridSpacing); int heightDivs = Mathf.CeilToInt(10000 / gridSpacing); Vector2 offset = Vector2.zero; if (currentGraph != null) { offset = currentGraph.offset; } Handles.BeginGUI(); Handles.color = new Color(gridColor.r, gridColor.g, gridColor.b, gridOpacity); for (int x = -widthDivs; x < widthDivs; x++) { Handles.DrawLine(new Vector3((gridSpacing * x) + offset.x, 0, 0), new Vector3((gridSpacing * x) + offset.x, viewRect.height, 0)); } for (int y = -heightDivs; y < heightDivs; y++) { Handles.DrawLine(new Vector3(0, (gridSpacing * y) + offset.y, 0), new Vector3(viewRect.width, (gridSpacing * y) + offset.y, 0)); } Handles.EndGUI(); }
public static void DisconnectAll(EngineGraph graph, int nodeID) { DisconnectInput(graph, nodeID); DisconnectOutput(graph, nodeID); }
public static void DeleteNode(EngineGraph graph, int nodeID) { if (graph.nodes.Count <= nodeID) { return; } NTemplate deleteNode = graph.nodes[nodeID]; if (deleteNode == null) { return; } if (deleteNode.nodeType == EnumNodeType.Answer) { for (int i = 0; i < deleteNode.input.inputNode.Count; i++) { NQuestionBranch questionNode = (NQuestionBranch)deleteNode.input.inputNode[i]; questionNode.multiOutput.outputNode.Remove(graph.nodes[nodeID]); questionNode.multiOutput.hasSomething = questionNode.multiOutput.outputNode.Count == 0 ? false : true; } } else { for (int i = 0; i < deleteNode.input.inputNode.Count; i++) { deleteNode.input.inputNode[i].output.outputNode = null; deleteNode.input.inputNode[i].output.isOccupied = false; } } if (deleteNode.nodeType == EnumNodeType.Branch_Question) { NQuestionBranch questionNode = (NQuestionBranch)deleteNode; for (int i = 0; i < questionNode.multiOutput.outputNode.Count; i++) { questionNode.multiOutput.outputNode[i].input.inputNode.Remove(questionNode); questionNode.multiOutput.outputNode[i].input.hasSomething = questionNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false; } } else if (deleteNode.nodeType == EnumNodeType.Branch_Condition) { NConditionalBranch conditionalNode = (NConditionalBranch)deleteNode; for (int i = 0; i < conditionalNode.multiOutput.outputNode.Count; i++) { conditionalNode.multiOutput.outputNode[i].input.inputNode.Remove(conditionalNode); conditionalNode.multiOutput.outputNode[i].input.hasSomething = conditionalNode.multiOutput.outputNode[i].input.inputNode.Count > 0 ? true : false; } } else { if (deleteNode.output.outputNode != null) { deleteNode.output.outputNode.input.inputNode.Remove(deleteNode); deleteNode.output.outputNode.input.hasSomething = deleteNode.output.outputNode.input.inputNode.Count > 0 ? true : false; } } graph.nodes.RemoveAt(nodeID); GameObject.DestroyImmediate(deleteNode, true); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public static void CreateNode(EngineGraph currentGraph, EnumNodeType nodeType, Vector2 mousePos) { if (currentGraph != null) { NTemplate currentNode = null; switch (nodeType) { case EnumNodeType.Text: currentNode = (NText)ScriptableObject.CreateInstance <NText>(); currentNode.nodeName = "Text State"; break; case EnumNodeType.Branch_Condition: currentNode = (NConditionalBranch)ScriptableObject.CreateInstance <NConditionalBranch>(); currentNode.nodeName = "Conditional Branch State"; break; case EnumNodeType.Condition: currentNode = (NCondition)ScriptableObject.CreateInstance <NCondition>(); currentNode.nodeName = "Condition State"; break; case EnumNodeType.Branch_Question: currentNode = (NQuestionBranch)ScriptableObject.CreateInstance <NQuestionBranch>(); currentNode.nodeName = "Question Branch State"; break; case EnumNodeType.Answer: currentNode = (NAnswer)ScriptableObject.CreateInstance <NAnswer>(); currentNode.nodeName = "Answer State"; break; case EnumNodeType.Delay: currentNode = (NDelay)ScriptableObject.CreateInstance <NDelay>(); currentNode.nodeName = "Delay State"; break; case EnumNodeType.Start: currentNode = (NStart)ScriptableObject.CreateInstance <NStart>(); currentNode.nodeName = "Start State"; break; case EnumNodeType.End: currentNode = (NEnd)ScriptableObject.CreateInstance <NEnd>(); currentNode.nodeName = "End State"; break; case EnumNodeType.Clear: currentNode = (NClearText)ScriptableObject.CreateInstance <NClearText>(); currentNode.nodeName = "Clear Text State"; break; case EnumNodeType.Change_Flow_Chart: currentNode = (NChangeFlowChart)ScriptableObject.CreateInstance <NChangeFlowChart>(); currentNode.nodeName = "Change Flow Chart State"; break; case EnumNodeType.Set_Param: currentNode = (NSetParam)ScriptableObject.CreateInstance <NSetParam>(); currentNode.nodeName = "Set Parameter State"; break; case EnumNodeType.Play_Music: currentNode = (NPlayMusic)ScriptableObject.CreateInstance <NPlayMusic>(); currentNode.nodeName = "Play Music State"; break; case EnumNodeType.Stop_Music: currentNode = (NStopMusic)ScriptableObject.CreateInstance <NStopMusic>(); currentNode.nodeName = "Stop Music State"; break; case EnumNodeType.Play_Sound: currentNode = (NPlaySound)ScriptableObject.CreateInstance <NPlaySound>(); currentNode.nodeName = "Play Sound FX State"; break; case EnumNodeType.Stop_Sound: currentNode = (NStopSound)ScriptableObject.CreateInstance <NStopSound>(); currentNode.nodeName = "Stop Sound FX State"; break; case EnumNodeType.Play_Voice: currentNode = (NPlayVoice)ScriptableObject.CreateInstance <NPlayVoice>(); currentNode.nodeName = "Play Voice State"; break; case EnumNodeType.Stop_Voice: currentNode = (NStopVoice)ScriptableObject.CreateInstance <NStopVoice>(); currentNode.nodeName = "Stop Voice State"; break; case EnumNodeType.Hide_Text_Container: currentNode = (NHideTextContainer)ScriptableObject.CreateInstance <NHideTextContainer>(); currentNode.nodeName = "Hide Text Container State"; break; case EnumNodeType.Show_Text_Container: currentNode = (NShowTextContainer)ScriptableObject.CreateInstance <NShowTextContainer>(); currentNode.nodeName = "Show Text Container State"; break; case EnumNodeType.Change_Background: currentNode = (NChangeBackground)ScriptableObject.CreateInstance <NChangeBackground>(); currentNode.nodeName = "Change Background State"; break; case EnumNodeType.Show_Character: currentNode = (NShowCharacter)ScriptableObject.CreateInstance <NShowCharacter>(); currentNode.nodeName = "Show Character State"; break; case EnumNodeType.Hide_Character: currentNode = (NHideCharacter)ScriptableObject.CreateInstance <NHideCharacter>(); currentNode.nodeName = "Hide Character State"; break; case EnumNodeType.Change_Character_Sprite: currentNode = (NChangeCharacterSprite)ScriptableObject.CreateInstance <NChangeCharacterSprite>(); currentNode.nodeName = "Change Character Sprite State"; break; case EnumNodeType.Move_Character: currentNode = (NMoveCharacter)ScriptableObject.CreateInstance <NMoveCharacter>(); currentNode.nodeName = "Move Character State"; break; case EnumNodeType.Trigger_Event: currentNode = (NTriggerEvent)ScriptableObject.CreateInstance <NTriggerEvent>(); currentNode.nodeName = "Trigger Event State"; break; } if (currentNode != null) { currentNode.name = currentNode.nodeName; currentNode.InitNode(); currentNode.myRect.x = mousePos.x; currentNode.myRect.y = mousePos.y; currentNode.parentGraph = currentGraph; currentGraph.nodes.Add(currentNode); if (currentGraph.wantsConnection) { currentNode.CallConnection(); } AssetDatabase.AddObjectToAsset(currentNode, currentGraph); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }