Adventure Creator Wikia

AC's Conversation Editor window was deprecated in v1.71.0. It can be restored, however, by placing the code below into a C# script named ConvEditorWindow.cs, placed inside an asset folder named Editor.

Once installed, it will then be available in the top toolbar under "Adventure Creator -> Editors -> Conversation Editor".

using UnityEngine;
using UnityEditor;

namespace AC
{

	public class ConvEditorWindow : EditorWindow
	{
		
		private Vector2 scrollPosition = Vector2.zero;

		private Conversation lastConversation;
		private Conversation conversation;
		
		private Rect convRect = new Rect (20, 150, 150, 50);
		private Rect lastRect = new Rect (20, 150, 150, 50);
		private Rect optionRect = new Rect (20, 150, 150, 50);
		private Rect interactionRect = new Rect (20, 150, 150, 50);
		private Rect finishRect = new Rect (20, 150, 150, 50);
		private Rect newRect = new Rect (20, 150, 150, 50);


		[MenuItem ("Adventure Creator/Editors/Conversation Editor", false, 2)]
		static void Init ()
		{
			ConvEditorWindow window = (ConvEditorWindow) EditorWindow.GetWindow (typeof (ConvEditorWindow));
			window.Repaint ();
			window.titleContent.text = "Conversation Editor";
		}

		
		public void OnInspectorUpdate()
		{
			Repaint();
		}
		
		
		private void OnGUI ()
		{
			if (Selection.activeGameObject && Selection.activeGameObject.GetComponent <Conversation>() && (conversation == null || Selection.activeGameObject != conversation.gameObject))
			{
				if (conversation != null)
				{
					lastConversation = conversation;
				}
				conversation = Selection.activeGameObject.GetComponent<Conversation>();
			}

			if (lastConversation != null && lastConversation == conversation)
			{
				lastConversation = null;
			}
			
			if (conversation != null)
			{
				OptionsGUI ();
			}
			else if (lastConversation != null)
			{
				conversation = lastConversation;
			}
			else
			{
				GUILayout.Label ("Please select a Conversation in your scene");
			}
			
			UnityVersionHandler.CustomSetDirty (conversation);
		}
		
		
		private void OptionsGUI ()
		{
			if (conversation == null)
			{
				return;
			}

			scrollPosition = GUI.BeginScrollView (new Rect (0, 0, position.width, position.height), scrollPosition, new Rect (0, 0, 1100, 77 * (conversation.options.Count + 2)), false, false);
			BeginWindows ();
			
			convRect = new Rect (20, 100, 150, 50);
			convRect = GUI.Window(-1, convRect, NodeWindow, "Conversation");

			if (GUI.Button (convRect, ""))
			{
				Selection.activeGameObject = conversation.gameObject;
				conversation.selectedOption = null;
			}

			if (lastConversation != null)
			{
				lastRect = new Rect (20, 20, 150, 50);
				lastRect = GUI.Window(-2, lastRect, NodeWindow, "Previous conversation");

				if (GUI.Button (lastRect, ""))
				{
					Selection.activeGameObject = lastConversation.gameObject;
				}
			}
			
			for (int i=0; i<conversation.options.Count; i++)
			{
				optionRect = new Rect (220, 20 + (i*80), 200, 50);
				optionRect = GUI.Window(i, optionRect, NodeWindow, "Dialogue option");
				
				if (conversation.options[i].label == "")
				{
					DrawNodeCurve (convRect, optionRect, Color.red);
				}
				else
				{
					DrawNodeCurve (convRect, optionRect, Color.blue);
				}
				
				if (GUI.Button (optionRect, ""))
				{
					Selection.activeGameObject = conversation.gameObject;
					conversation.selectedOption = conversation.options[i];
				}
				
				interactionRect = new Rect (440, 20 + (i*80), 200, 50);
				interactionRect = GUI.Window(i + conversation.options.Count, interactionRect, NodeWindow, "Interaction");
				
				if (conversation.options[i].dialogueOption == null)
				{
					DrawNodeCurve (optionRect, interactionRect, Color.red);
				}
				else
				{
					DrawNodeCurve (optionRect, interactionRect, Color.blue);
				}
				
				if (conversation.options[i].dialogueOption != null)
				{
					finishRect = new Rect (660, 20 + (i*80), 200, 50);
					finishRect = GUI.Window(i + (conversation.options.Count*2), finishRect, NodeWindow, "When finished");
					DrawNodeCurve (interactionRect, finishRect, Color.blue);

					if (GUI.Button (finishRect, ""))
					{
						Selection.activeGameObject = conversation.gameObject;
						conversation.selectedOption = conversation.options[i];
					}
					
					if (conversation.options[i].conversationAction == AC.ConversationAction.RunOtherConversation)
					{
						newRect = new Rect (880, 20 + (i*80), 200, 50);
						newRect = GUI.Window(i + (conversation.options.Count*3), newRect, NodeWindow, "Conversation");

						if (conversation.options[i].newConversation == null)
						{
							DrawNodeCurve (finishRect, newRect, Color.red);
						}
						else
						{
							DrawNodeCurve (finishRect, newRect, Color.blue);
						}

						if (conversation.options[i].newConversation != null)
						{
							if (GUI.Button (newRect, ""))
							{
								lastConversation = conversation;
								Selection.activeGameObject = conversation.options[i].newConversation.gameObject;
							}
						}
					}
				}

			}
			
			EndWindows ();

			if (GUI.Button (new Rect (260, 10 + (conversation.options.Count*80), 120, 20), "Add new option"))
			{
				Undo.RecordObject (conversation, "Create dialogue option");
				ButtonDialog newOption = new ButtonDialog (conversation.GetIDArray ());
				conversation.options.Add (newOption);

				Selection.activeGameObject = conversation.gameObject;
				conversation.selectedOption = newOption;
			}

			GUI.EndScrollView ();
		}
		
		
		private void NodeWindow (int ID)
		{
			if (ID == -2)
			{
				GUILayout.Label (lastConversation.gameObject.name);
			}
			else if (ID == -1)
			{
				GUILayout.Label (conversation.gameObject.name);
			}
			else if (ID < conversation.options.Count)
			{
				GUILayout.BeginHorizontal ();
				conversation.options[ID].label = GUILayout.TextField (conversation.options[ID].label);
				if (GUILayout.Button ("-", GUILayout.Width (20f)))
				{
					Undo.RecordObject (this, "Delete dialogue option");
					
					conversation.selectedOption = null;
					conversation.options.RemoveAt (ID);
				}
				GUILayout.EndHorizontal ();
			}
			else if (ID < conversation.options.Count * 2)
			{
				int i = ID - conversation.options.Count;
				if (conversation.interactionSource == InteractionSource.AssetFile)
				{
					conversation.options[i].assetFile = (ActionListAsset) EditorGUILayout.ObjectField (conversation.options[i].assetFile, typeof (ActionListAsset), false);
				}
				else if (conversation.interactionSource == InteractionSource.CustomScript)
				{
					GUILayout.Label ("(Set in Inspector)");
				}
				else if (conversation.interactionSource == InteractionSource.InScene)
				{
					if (conversation.options[i].dialogueOption != null)
					{
						GUILayout.BeginHorizontal ();

						string label = conversation.options[i].dialogueOption.gameObject.name;
						if (label.Length > 22)
						{
							label = label.Substring (0,22);
						}

						if (GUILayout.Button (label))
						{
							if (conversation.interactionSource == InteractionSource.InScene)
							{
								Selection.activeGameObject = conversation.options[i].dialogueOption.gameObject;
							}
						}

						if (GUILayout.Button ("", CustomStyles.IconNodes))
						{
							if (conversation.interactionSource == InteractionSource.InScene)
							{
								ActionListEditorWindow.Init (conversation.options[i].dialogueOption);
							}
							else
							{
								ActionListEditorWindow.Init (conversation.options[i].dialogueOption.assetFile);
							}
						}
						GUILayout.EndHorizontal ();
					}
					else
					{
						GUILayout.BeginHorizontal ();
						GUILayout.Label ("(Not set)");
						if (GUILayout.Button ("Create"))
						{
							Undo.RecordObject (conversation, "Auto-create dialogue option");
							DialogueOption newDialogueOption = SceneManager.AddPrefab ("Logic", "DialogueOption", true, false, true).GetComponent <DialogueOption>();
							
							newDialogueOption.gameObject.name = AdvGame.UniqueName (conversation.gameObject.name + "_Option");
							newDialogueOption.Initialise ();
							EditorUtility.SetDirty (newDialogueOption);
							conversation.options[i].dialogueOption = newDialogueOption;
						}
						GUILayout.EndHorizontal ();
					}
				}
			}
			else if (ID < conversation.options.Count * 3)
			{
				int i = ID - (conversation.options.Count*2);
				conversation.options[i].conversationAction = (ConversationAction) EditorGUILayout.EnumPopup (conversation.options[i].conversationAction);
			}
			else
			{
				int i = ID - (conversation.options.Count*3);
				if (conversation.options[i].newConversation != null)
				{
					conversation.options[i].newConversation = (Conversation) EditorGUILayout.ObjectField (conversation.options[i].newConversation, typeof (Conversation), true);
				}
				else
				{
					GUILayout.BeginHorizontal ();
					conversation.options[i].newConversation = (Conversation) EditorGUILayout.ObjectField (conversation.options[i].newConversation, typeof (Conversation), true);

					if (GUILayout.Button ("Create"))
					{
						Undo.RecordObject (conversation, "Auto-create conversation");
						Conversation newConversation = SceneManager.AddPrefab ("Logic", "Conversation", true, false, true).GetComponent <Conversation>();
						conversation.options[i].newConversation = newConversation;
					}
					GUILayout.EndHorizontal ();
				}
			}
		}
		
		
		private void DrawNodeCurve (Rect start, Rect end, Color color)
		{
			Vector3 startPos = new Vector3(start.x + start.width, start.y + start.height / 2, 0);
			Vector3 endPos = new Vector3(end.x, end.y + end.height / 2, 0);
			Vector3 startTan = startPos + Vector3.right * 20;
			Vector3 endTan = endPos + Vector3.left * 20;
			
			Handles.DrawBezier(startPos, endPos, startTan, endTan, color, null, 3);
		}
		
	}

}