private SetFunctionElem ProcessSetFunctionElem(ActorBrain actorBrain, XmlNode node)
    {
        if (node == null)
        {
            return(null);
        }

        SetFunctionElem funcElem = null;

        // Obtención de valor o función hija, genérico para todas las funciones.
        string          functionValue     = GetTextNode(node);
        SetFunctionElem functionElemChild = ProcessSetFunctionElem(actorBrain, GetChildNode(node));

        Log("SetFunctionElem. node.Name = " + node.Name);
        // Instanciación e incialización de la función específica.
        switch (node.Name.ToLower())
        {
        case "uppername":
            funcElem = ProcessSetFunctionUpperName(actorBrain, node);
            break;

        case "var":
        case "getvar":
        case "varvalue":
        case "getvarvalue":
            funcElem = ProcessSetFunctionGetVarValue(actorBrain, node);
            break;
        }

        if (funcElem != null)
        {
            // Asignación de valor y función hija, genérico para todas las funciones.
            funcElem.SetValue(functionValue);
            funcElem.SetFunction(functionElemChild);
        }
        return(funcElem);
    }
    private SetElem ProcessSetElem(ActorBrain actorBrain, Dialog dialog, XmlNode node, bool oneUse)
    {
        dynamic setElem = null;

        switch (node.Name)
        {
        case "set":
            setElem = new SetElem(actorBrain, dialog);
            break;

        case "inc":
            setElem = new SetElemIncVar(actorBrain, dialog, false);
            break;

        case "dec":
            setElem = new SetElemIncVar(actorBrain, dialog, true);
            break;
        }

        if (setElem != null)
        {
            oneUse = oneUse || ExistsChildNode(node, "oneuse");

            string name  = FindChildText(node, "name");
            string value = null;

            SetFunctionElem functionElem = null;

            XmlNode funcNode = FindChildNode(node, "value");
            if (funcNode != null)
            {
                functionElem = ProcessSetFunctionElem(actorBrain, GetChildNode(funcNode));
            }

            if (functionElem == null)
            {
                value = FindChildText(node, "value");
                if (value != null && value.Length == 0)
                {
                    value = null;
                }
            }


            if (name != null)
            {
                name = name.ToLower();
            }
            else
            {
                name = GetTextNode(node);
                if (name != null && name.Length == 0)
                {
                    name = null;
                }
            }

            setElem.SetOneUse(oneUse);
            setElem.SetName(name);
            setElem.SetValue(value);
            setElem.SetFunction(functionElem);
        }

        return(setElem);
    }