Beispiel #1
0
    //Muestra las opciones del dialogo
    public void DisplayNodeOptions(DialogueNode node)
    {
        dialogOptions.SetActive(true);

        //Mantiene el scroll arriba del todo al mostrar opciones
        dialogOptions.GetComponent <ScrollRect>().normalizedPosition = new Vector2(0, 1);

        dialogText.SetActive(false);

        for (int i = 0; i < options.Length; i++)
        {
            options[i].SetActive(false);
        }

        irAMensajesMenu.SetActive(false);
        exit.SetActive(false);

        dialogName.GetComponentInChildren <Text>().text = ManagerDialogo.instance.DevuelveNombre(node.DevuelveNombre());

        for (int i = 0; i < node.DevuelveNumeroOpciones() && i < 14; i++)
        {
            SetOptionButton(options[i], node.DevuelveNodoOpciones(i));
        }
    }
Beispiel #2
0
    private IEnumerator Conversacion()
    {
        //Inicializamos variables locales
        int      numDialog          = 0;
        int      numtema            = -1; //solo usado con mensajes, -1 si no hay tema, x si hay tema
        int      nodeID             = 0;
        bool     conversacionActiva = true;
        Dialogue dialogue           = new Dialogue();

        SetState(State.Intro_Texto);        //Estado inicial de la conversación

        //Si el diálogo tiene intros activas, asignamos un estado, sino otro
        if (dialogo.DevuelveNumeroIntrosActivas(ref numDialog) != 0)
        {
            dialogue = dialogo.DevuelveDialogoIntro(numDialog);
        }
        else if ((dialogo.DevuelveNumeroMensajesActivos() + dialogo.DevuelveNumeroTemaMensajesActivos()) != 0)
        {
            SetState(State.Mensajes_Menu);
        }
        //El dialogo está vacío, no contiene ningún elemento activo
        //Mostramos un mensaje por defecto
        else
        {
            dialogo  = Dialogo.LoadDialogo(Manager.rutaDialogoVacio);
            dialogue = dialogo.DevuelveDialogoIntro(0);
        }

        dialogo.SetModificado(false);

        //Bucle que controla la conversación
        while (conversacionActiva)
        {
            switch (state)
            {
            case State.Intro_Texto:             //Cuando la intro muestra el texto
                DialogueNode dialogueNode = dialogue.DevuelveNodo(nodeID);
                selectedOption = nodeID;
                DisplayNodeText(dialogueNode);                  //Muestra el texto del nodo

                while (selectedOption == nodeID)
                {
                    yield return(null);
                }

                switch (selectedOption)
                {
                case -3:                                                  //La conversación acaba
                    RecorreDialogo(ref numDialog, numtema, dialogueNode); //Dejar si el dialogo se deja como ahora
                    EliminarDialogo(ref numDialog, numtema);
                    conversacionActiva = false;
                    break;

                case -2:                                                  //Se muestran las respuestas
                    RecorreDialogo(ref numDialog, numtema, dialogueNode); //Dejar si el dialogo se deja como ahora
                    EliminarDialogo(ref numDialog, numtema);
                    SetState(State.Mensajes_Menu);
                    break;

                case -1:                 //Acaba el dialogo actual
                    RecorreDialogo(ref numDialog, numtema, dialogueNode);
                    EliminarDialogo(ref numDialog, numtema);
                    //Si hay más dialogos, vamos al siguiente dialogo
                    if (dialogo.AvanzaIntro(ref numDialog))
                    {
                        dialogue = dialogo.DevuelveDialogoIntro(numDialog);
                        nodeID   = 0;
                    }
                    //Sino, se muestran las respuestas
                    else
                    {
                        SetState(State.Mensajes_Menu);
                    }
                    break;

                default:                 //Si el nodo tiene opciones de dialogo, se muestran, sino, se pasa al siguiente texto
                    RecorreDialogo(ref numDialog, numtema, dialogueNode);

                    if (dialogueNode.DevuelveNumeroOpciones() > 0)
                    {
                        SetState(State.Intro_Opciones);
                    }
                    //Comprobamos si se puede avanzar en el dialogo
                    else if (dialogue.AvanzaDialogue(nodeID))
                    {
                        //es lo mismo que node_id++;
                        nodeID = selectedOption;
                    }
                    //Si hemos llegado al final del dialogo, acabamos el dialogo actual
                    else
                    {
                        EliminarDialogo(ref numDialog, numtema);
                        //Si hay más dialogos, vamos al siguiente dialogo
                        if (dialogo.AvanzaIntro(ref numDialog))
                        {
                            dialogue = dialogo.DevuelveDialogoIntro(numDialog);
                            nodeID   = 0;
                        }
                        //Sino, se muestran las respuestas
                        else
                        {
                            SetState(State.Mensajes_Menu);
                        }
                    }
                    break;
                }

                //Si la lista de objetos recientes tiene algún objeto, mostramos un popup de los objetos obtenidos
                if (Manager.instance.DevuelveNumeroObjetosRecientes() != 0)
                {
                    yield return(StartCoroutine(UIDialogo.instance.InterfazPopUpObjetos()));
                }

                break;

            case State.Intro_Opciones:             //Cuando la intro muestra las opciones
                DisplayNodeOptions(dialogue.DevuelveNodo(nodeID));
                selectedOption = nodeID;

                while (selectedOption == nodeID)
                {
                    yield return(null);
                }

                switch (selectedOption)
                {
                case -3:                 //La conversación acaba
                    EliminarDialogo(ref numDialog, numtema);
                    conversacionActiva = false;
                    break;

                case -2:                 //Se muestran las respuestas
                    EliminarDialogo(ref numDialog, numtema);
                    SetState(State.Mensajes_Menu);
                    break;

                case -1:                 //Acaba el dialogo actual
                    EliminarDialogo(ref numDialog, numtema);
                    //Si hay más dialogos, vamos al siguiente dialogo
                    if (dialogo.AvanzaIntro(ref numDialog))
                    {
                        dialogue = dialogo.DevuelveDialogoIntro(numDialog);
                        nodeID   = 0;
                        SetState(State.Intro_Texto);
                    }
                    //Sino, se muestran las respuestas
                    else
                    {
                        SetState(State.Mensajes_Menu);
                    }
                    break;

                default:                 //Se sigue con la conversación, donde el nodo indique
                    nodeID = selectedOption;
                    SetState(State.Intro_Texto);
                    break;
                }
                break;

            case State.Mensajes_Menu:              //Cuando se muestran el menu de mensajes
                if ((dialogo.DevuelveNumeroMensajesActivos() + dialogo.DevuelveNumeroTemaMensajesActivos()) != 0)
                {
                    DisplayMensajes();
                    selectedOption = -4;
                    while (selectedOption == -4)
                    {
                        yield return(null);
                    }

                    switch (selectedOption)
                    {
                    //Salimos del dialogo
                    case -3:
                    case -2:
                    case -1:
                        conversacionActiva = false;
                        break;

                    //Cargamos el dialogo escogido
                    default:
                        //Se ha seleccionado un mensajeTema
                        //La selected_option está en el intérvalo [0-numTemaMensajes]
                        if (selectedOption < dialogo.DevuelveNumeroTemaMensajes())
                        {
                            nodeID  = selectedOption;
                            numtema = selectedOption;
                            SetState(State.Mensajes_Tema);
                        }
                        //Se ha seleccionado un mensaje sin tema
                        //La selected_option está en el intérvalo [numTemaMensajes+1-numTemaMensajes+numMensajes(sueltos)]
                        else
                        {
                            numDialog = selectedOption - dialogo.DevuelveNumeroTemaMensajes();

                            numtema = -1;
                            Mensaje mensaje = dialogo.DevuelveMensaje(numtema, numDialog);

                            if (mensaje.GetType() == typeof(MensajeDialogo))
                            {
                                MensajeDialogo mensajeDialogo = mensaje as MensajeDialogo;
                                dialogue = mensajeDialogo.DevuelveDialogo();
                                nodeID   = 0;

                                SetState(State.Mensajes_Texto);
                            }
                            else if (mensaje.GetType() == typeof(MensajeTienda))
                            {
                                MensajeTienda mensajeTienda = mensaje as MensajeTienda;
                                mensajeTienda.MostrarTienda();
                            }
                        }
                        break;
                    }
                }
                else
                {
                    conversacionActiva = false;
                }
                break;

            case State.Mensajes_Tema:              //Cuando se muestran los mensajes de un tema
                DisplayTemaMensajes(dialogo.DevuelveTemaMensaje(nodeID));

                selectedOption = -4;
                while (selectedOption == -4)
                {
                    yield return(null);
                }

                switch (selectedOption)
                {
                //Salimos del dialogo
                case -3:
                case -1:
                    conversacionActiva = false;
                    break;

                //Vamos al menú mensajes
                case -2:
                    SetState(State.Mensajes_Menu);
                    break;

                //Cargamos el mensaje escogido
                default:
                    numDialog = selectedOption;

                    Mensaje mensaje = dialogo.DevuelveMensaje(numtema, numDialog);

                    if (mensaje.GetType() == typeof(MensajeDialogo))
                    {
                        MensajeDialogo mensajeDialogo = mensaje as MensajeDialogo;
                        dialogue = mensajeDialogo.DevuelveDialogo();
                        nodeID   = 0;

                        SetState(State.Mensajes_Texto);
                    }
                    else if (mensaje.GetType() == typeof(MensajeTienda))
                    {
                        MensajeTienda mensajeTienda = mensaje as MensajeTienda;
                        mensajeTienda.MostrarTienda();
                    }
                    break;
                }
                break;

            case State.Mensajes_Texto:              //Cuando se muestra el texto del mensaje
                DialogueNode diaNode = dialogue.DevuelveNodo(nodeID);
                selectedOption = nodeID;
                DisplayNodeText(diaNode);

                while (selectedOption == nodeID)
                {
                    yield return(null);
                }

                //Cambiar sistema de dialogo si sigue con botones
                //salir y cambiar_tema como ahora
                switch (selectedOption)
                {
                case -3:                                             //La conversación acaba
                    RecorreDialogo(ref numDialog, numtema, diaNode); //Dejar si el dialogo se deja como ahora
                    EliminarDialogo(ref numDialog, numtema);
                    conversacionActiva = false;
                    break;

                case -2:                                             //Se muestran los mensajes
                    RecorreDialogo(ref numDialog, numtema, diaNode); //Dejar si el dialogo se deja como ahora
                    EliminarDialogo(ref numDialog, numtema);
                    SetState(State.Mensajes_Menu);
                    break;

                case -1:                 //Acaba el dialogo actual
                    RecorreDialogo(ref numDialog, numtema, diaNode);
                    EliminarDialogo(ref numDialog, numtema);
                    SetState(State.Mensajes_Menu);
                    break;

                default:                 //Si el nodo tiene opciones de dialogo, se muestran, sino, se pasa al siguiente texto
                    RecorreDialogo(ref numDialog, numtema, diaNode);

                    if (diaNode.DevuelveNumeroOpciones() > 0)
                    {
                        SetState(State.Mensajes_Opciones);
                    }
                    //Comprobamos si se puede avanzar en el dialogo
                    else if (dialogue.AvanzaDialogue(nodeID))
                    {
                        //es lo mismo que node_id++;
                        nodeID = selectedOption;
                    }
                    //Si hemos llegado al final del dialogo, acabamos el dialogo actual
                    else
                    {
                        EliminarDialogo(ref numDialog, numtema);

                        if (numtema != -1)
                        {
                            nodeID = numtema;
                            SetState(State.Mensajes_Tema);
                        }
                        else
                        {
                            SetState(State.Mensajes_Menu);
                        }
                    }
                    break;
                }

                //Si la lista de objetos recientes tiene algún objeto, mostramos un popup de los objetos obtenidos
                if (Manager.instance.DevuelveNumeroObjetosRecientes() != 0)
                {
                    yield return(StartCoroutine(UIDialogo.instance.InterfazPopUpObjetos()));
                }

                break;

            case State.Mensajes_Opciones:             //Cuando se muestran las opciones del mensaje
                DisplayNodeOptions(dialogue.DevuelveNodo(nodeID));
                selectedOption = -4;

                while (selectedOption == -4)
                {
                    yield return(null);
                }

                switch (selectedOption)
                {
                case -3:                 //La conversación acaba
                    EliminarDialogo(ref numDialog, numtema);
                    conversacionActiva = false;
                    break;

                case -2:                 //Se muestran las respuestas
                    EliminarDialogo(ref numDialog, numtema);

                    if (numtema != -1)
                    {
                        nodeID = numtema;
                        SetState(State.Mensajes_Tema);
                    }
                    else
                    {
                        SetState(State.Mensajes_Menu);
                    }
                    break;

                case -1:                 //Acaba el dialogo actual
                    EliminarDialogo(ref numDialog, numtema);

                    if (numtema != -1)
                    {
                        nodeID = numtema;
                        SetState(State.Mensajes_Tema);
                    }
                    else
                    {
                        SetState(State.Mensajes_Menu);
                    }
                    break;

                default:                 //Si el nodo tiene opciones de dialogo, se muestran, sino, se pasa al siguiente texto
                    nodeID = selectedOption;

                    if (numtema != -1)
                    {
                        nodeID = numtema;
                        SetState(State.Mensajes_Tema);
                    }
                    else
                    {
                        SetState(State.Mensajes_Menu);
                    }
                    break;
                }
                break;
            }
        }

        FinDialogo();
    }