private IEnumerator ProcessDialogueNode(BaseDialogueNode node)
        {
            if (node == null)
            {
                yield break;
            }

            switch (node)
            {
            case DialogueLineNode lineNode:
                yield return(Talk(lineNode.Character, lineNode.Text));

                break;

            case DecisionNode decisionNode:
                m_Decisions.SetData(decisionNode.Decisions);
                m_Decisions.SetActive(true);

                while (m_SelectedDecision < 0)
                {
                    yield return(null);
                }

                m_Decisions.SetActive(false);

                var decOutput = decisionNode.GetOutputPort($"{nameof(DecisionNode.Decisions)} {m_SelectedDecision}");
                m_SelectedDecision = -1;

                if (decOutput != null && decOutput.Connection != null)
                {
                    yield return(ProcessDialogueNode(decOutput.Connection.node as BaseDialogueNode));

                    yield break;
                }
                break;

            case ChangeAtractivityNode changeAtractivityNode:
                StartCoroutine(m_GirlCharacter.ChangeAttractivity(changeAtractivityNode.ChangedValue));
                break;

            case AtractivityConditionNode conditionNode:
                var selectedIndex = -1;

                for (int idx = 0, count = conditionNode.Conditions.Length; idx < count; idx++)
                {
                    var condition = conditionNode.Conditions[idx];
                    switch (condition.Type)
                    {
                    case EConditionType.Equals when m_GirlCharacter.Atractivity == condition.Atractivity:
                        selectedIndex = idx;
                        break;

                    case EConditionType.Greater when m_GirlCharacter.Atractivity > condition.Atractivity:
                        selectedIndex = idx;
                        break;

                    case EConditionType.GreaterEquals when m_GirlCharacter.Atractivity >= condition.Atractivity:
                        selectedIndex = idx;
                        break;

                    case EConditionType.Less when m_GirlCharacter.Atractivity < condition.Atractivity:
                        selectedIndex = idx;
                        break;

                    case EConditionType.LessEquals when m_GirlCharacter.Atractivity <= condition.Atractivity:
                        selectedIndex = idx;
                        break;
                    }

                    if (selectedIndex >= 0)
                    {
                        break;
                    }
                }

                if (selectedIndex >= 0)
                {
                    var conditionOutput = conditionNode.GetOutputPort($"{nameof(AtractivityConditionNode.Conditions)} {selectedIndex}");
                    if (conditionOutput != null && conditionOutput.Connection != null)
                    {
                        yield return(ProcessDialogueNode(conditionOutput.Connection.node as BaseDialogueNode));

                        yield break;
                    }
                }

                break;
            }

            var output = node.GetPort(nameof(DialogueLineNode.OutputNode))?.Connection;

            if (output == null)
            {
                yield break;
            }

            yield return(ProcessDialogueNode(output.node as BaseDialogueNode));
        }
        // HANDLERS

        public void OnAddAtractivity()
        {
            StartCoroutine(m_GirlCharacter.ChangeAttractivity(m_Change));
        }