/// <summary>
    /// Creates the attack listing.
    /// </summary>
    /// <returns>The attack listing.</returns>
    /// <param name="atd">Atd.</param>
    protected AttackController.AttackData CreateAttackListing(AttackController.AttackData atd)
    {
        EditorGUILayout.BeginHorizontal ();
        atd.atk.showInEditor = EditorGUILayout.Foldout (atd.atk.showInEditor, atd.atk.attackName);
        if (GUILayout.Button ("-", GUILayout.Width (20), GUILayout.Height (14))) {
            ScriptableObject.DestroyImmediate (atd.atk);
            atd = null;
        }
        EditorGUILayout.EndHorizontal ();

        if (atd != null && atd.atk.showInEditor) {

            GUIStyle attacksStyle = new GUIStyle (GUI.skin.box);
            attacksStyle.padding = new RectOffset (12, 1, 5, 5);

            EditorGUILayout.BeginVertical (attacksStyle);

            // get all of the attack scripts
            int thisScriptIndex = 0;

            // get all of the attack scripts
            GUIContent attackScriptLabel = new GUIContent ("Attack Script",
                                                           "Attack Script\n" +
                                                           "The script the attack will be executing when the attack is used.");
            GUIContent[] attackScriptOptions = new GUIContent[AttackTypeList.Count];
            int index = 0;
            foreach (string key in AttackTypeList) {
                attackScriptOptions[index] = new GUIContent(key);
                if (atd.atk.GetType () == GetAttackType (key)) {
                    thisScriptIndex = index;
                }
                index++;
            }

            // list the attack scripts
            int tempAttackScriptIndex = EditorGUILayout.Popup (attackScriptLabel, thisScriptIndex, attackScriptOptions);
            if (tempAttackScriptIndex != thisScriptIndex) {
                Attack tempAtk = Instantiate (atd.atk);
                Attack newAtk = GetAttack (attackScriptOptions[tempAttackScriptIndex].text);
                atd.atk = Instantiate (newAtk);
                atd.atk.CopyComponents (tempAtk);
                ScriptableObject.DestroyImmediate (tempAtk);
                ScriptableObject.DestroyImmediate (newAtk);
            }

            // add the attack's components
            atd.atk.EditorGUISetup ();

            // add the attack inputs
            GUIStyle attacksInputStyle = new GUIStyle (GUI.skin.box);
            attacksInputStyle.padding = new RectOffset (12, 1, 1, 5);

            EditorGUILayout.Space ();
            EditorGUILayout.BeginHorizontal ();
            EditorGUILayout.LabelField ("Activation Parameters");
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginVertical (attacksInputStyle);
            EditorGUILayout.BeginHorizontal ();
            GUIContent triggerLabel = new GUIContent ("Trigger",
                                                      "Trigger\n" +
                                                      "The option for a trigger that needs to happen in order for this attack to start.");
            AttackController.AttackTrigger tempTrigger = (AttackController.AttackTrigger) EditorGUILayout.EnumPopup (triggerLabel, atd.atkTrig);
            if (atd.atkTrig != tempTrigger) {
                atd.atkTrig = tempTrigger;
            }
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginHorizontal ();
            GUIContent comboLabel = new GUIContent ("Combo Label",
                                                    "Combo Label\n" +
                                                    "If this attack is triggered after another attack, add it's ID here. Otherwise leave this section blank.");
            string tempComboID = EditorGUILayout.TextField (comboLabel, atd.comboStarterID);
            if (atd.comboStarterID != tempComboID) {
                atd.comboStarterID = tempComboID;
            }
            EditorGUILayout.EndHorizontal ();

            EditorGUILayout.BeginHorizontal ();

            // if there are no attack inputs
            if (atd.input.Count == 0) {
                AttackController.AttackInput ai = new AttackController.AttackInput ();
                ai.Pos = AttackController.AttackPositionState.Neutral;
                atd.input.Add (ai);
            }

            GUIContent posDirLabel = new GUIContent ("Position State and Input Directions",
                                                     "Position State\n" +
                                                     "The state the character's movement controller has to be in for this attack to activate.\n\n" +
                                                     "Input Direction\n" +
                                                     "The directional influence the attacker is using while in the selected position state.\n" +
                                                     "For a player this would be the joystick position when pressing the attack button.");
            EditorGUILayout.LabelField (posDirLabel);
            if (atd.input.Count < Enum.GetValues(typeof(AttackController.AttackPositionState)).Length) {
                if (GUILayout.Button ("+", GUILayout.Width (20), GUILayout.Height (14))) {
                    AttackController.AttackInput ai = new AttackController.AttackInput ();
                    if (atd.InputContains (AttackController.AttackPositionState.Neutral) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Neutral;
                    } else if (atd.InputContains (AttackController.AttackPositionState.Dash) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Dash;
                    } else if (atd.InputContains (AttackController.AttackPositionState.Air) == -1) {
                        ai.Pos = AttackController.AttackPositionState.Air;
                    }
                    atd.input.Add (ai);
                }
            }
            EditorGUILayout.EndHorizontal ();

            // add the attack inputs
            for (int posIndex = 0; posIndex < atd.input.Count; posIndex++) {

                EditorGUILayout.BeginHorizontal ();
                GUIContent posStateLabel = new GUIContent ("Input",
                                                           "Input\n" +
                                                           "An input necessary to perform this attack.");
                atd.input[posIndex].showData = EditorGUILayout.Foldout (atd.input[posIndex].showData, posStateLabel);
                AttackController.AttackPositionState tempAttackPosition = (AttackController.AttackPositionState) EditorGUILayout.EnumPopup (atd.input[posIndex].Pos);
                if (atd.input[posIndex].Pos != tempAttackPosition && atd.InputContains (tempAttackPosition) == -1) {
                    atd.input[posIndex].Pos = tempAttackPosition;
                }
                if (GUILayout.Button ("-", GUILayout.Width (20), GUILayout.Height (14))) {
                    atd.input.RemoveAt (posIndex);
                    break;
                }
                EditorGUILayout.EndHorizontal ();

                if (atd.input[posIndex].showData) {
                    for (int dirIndex = 0; dirIndex < Enum.GetValues(typeof(AttackController.AttackDirection)).Length; dirIndex++) {
                        EditorGUILayout.BeginHorizontal ();
                        if (atd.input[posIndex].Dir.Contains ((AttackController.AttackDirection)dirIndex)) {
                            bool tempDir = EditorGUILayout.ToggleLeft (((AttackController.AttackDirection)dirIndex).ToString (), true);
                            if (!tempDir) {
                                int dir = atd.input[posIndex].Dir.IndexOf ((AttackController.AttackDirection)dirIndex);
                                atd.input[posIndex].Dir.RemoveAt (dir);
                                break;
                            }
                        } else {
                            bool tempDir = EditorGUILayout.ToggleLeft (((AttackController.AttackDirection)dirIndex).ToString (), false);
                            if (tempDir) {
                                atd.input[posIndex].Dir.Add ((AttackController.AttackDirection)dirIndex);
                                break;
                            }
                        }
                        EditorGUILayout.EndHorizontal ();
                    }
                }

            }

            EditorGUILayout.EndVertical ();

            EditorGUILayout.EndVertical ();
        }

        return atd;
    }