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