Conversation Editor window (legacy)

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);
 }

 }

}

```