tutoriales:conversaciones_por_menus [Superglús]
 Superglús   Sistema de autoría de aventuras conversacionales Inicio



Conversaciones por menús

Este tutorial pretende ser muy práctico, por lo que me voy a limitar a empezar con un pequeño glosario y después explicar con ejemplos. El tutorial presupone un cierto conocimiento de Superglús, siendo imposible entenderlo en caso contrario.

Glosario

  • Menú: Un menú es cada uno de los puntos donde la conversación nos muestra una serie de opciones y debemos elegir una.
  • Opción: Cada una de las frases alternativas que podemos decir en un determinado menú.

Condactos nuevos

Preliminares

Antes de nada, como en todas las conversaciones vamos a tener que leer la pulsación de una tecla (la elección en el menú), y esta tecla se nos va a devolver como un código, vamos a definir en algún lugar del código, las siguientes constantes:

##define const KEY_1 49
##define const KEY_2 50
##define const KEY_3 51

También deberemos usar un flag para guardar el código de la tecla pulsada:

#define flg fKey 99

Finalmente deberíamos hacer una entrada en la tabla de respuestas para cada conversación, y poner cada una en un proceso nuevo. Por ejemplo:

HABLAR LUIS
 PROCESS pConvLuis
 DONE

Una conversación simple

_ _
 CLEAR fKey

; Menu inicial
_ _ 
 WRITELN “1. Hola”
 WRITELN “2. Adiós”

_  _
 GETKEY fKey

_ _
 EQ fKey KEY_1
 WRITELN “Dices 'Hola'”
 WRITELN “Luis dice 'Hola'”
 RESTART

_ _
 EQ fKey KEY_2
 WRITELN “Dices 'Adiós'”
 WRITELN “Luis dice 'Adiós amigo'”
 DONE
_ _ 

 RESTART

Explicación:

Al entrar en el proceso se nos mostrarán ambas opciones gracias a los dos WRITELN, y tras ello esperaremos la pulsación de una tecla gracias a GETKEY. Obviamente es importante que en nuestras opciones del menú se indique que tecla debe pulsar el jugador para elegir cada opción, o no sabrá que hacer. En nuestro caso hemos puesto 1 y 2.

Tras pasar del GETKEY tenemos en el flag fKey el código de la tecla pulsada. Las siguientes dos entradas nos permiten contestar según la opción elegida. Se comprueba la tecla pulsada, y se escribe la contestación correspondiente.

Una de las entradas acaba con RESTART y la otra con DONE. Si acabamos con DONE se cierra el proceso, y por tanto acaba la conversación. Si acabamos con RESTART se vuelve a empezar el proceso desde el principio, con lo que nos vuelven a presentar las opciones, pedir una pulsación de tecla, etc.

Por eso el “Hola” vuelve al menú, mientras que el “Adiós” nos saca de la conversación.

Finalmente, en prevención de que alguien pulse una tecla que no sea una de las opciones, si así ocurre, volvemos a empezar el proceso forzando así que se vuelva a escribir el mismo menú.

Doble menú

#define CONST MENU_INICIAL 0
#define CONST MENU_SECUNDARIO  1

#define flg fMenu 100

_ _
 CLEAR fKey


; Menu inicial
_ _ 
 EQ fMenu MENU_INICIAL
 WRITELN “1. Hola”
 WRITELN “2. Adiós”
 WRITELN ”3. ¿Hablas inglés?”

; Otro Menu 
_ _ 
 EQ fMenu MENU_SECUNDARIO
 WRITELN “1. Hello”
 WRITELN “2. Good Bye”
 WRITELN ”3. Mejor en español por favor”


_  _
 GETKEY fKey

; Menu inicial
_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_1
 WRITELN “Dices 'Hola'”
 WRITELN “Luis dice 'Hola'”
 RESTART

_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_2
 WRITELN “Dices 'Adiós'”
 WRITELN “Luis dice 'Adiós amigo'”
 DONE


_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_3
 WRITELN “Dices '¿Hablas inglés?”
 WRITELN “Luis dice 'Yes, I do.''”
 LET fMenu MENU_SECUNDARIO
 RESTART

; Otro Menu 
_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_1
 WRITELN “Dices 'Hello'”
 WRITELN “Luis dice 'Hello'”
 RESTART

_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_2
 WRITELN “Dices 'Good Bye'”
 WRITELN “Luis dice 'Good bye my friend'”
 DONE

_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_3
 WRITELN “Dices '¿Mejor en español por favor'”
 WRITELN “Luis dice 'Vale.''”
 LET fMenu MENU_INICIAL
 RESTART


_ _ 
  RESTART

Bueno, aquí tenemos dos menús, controlados por el flag fMenu, que por defecto vale 0, por lo que la primera vez que entremos a la conversación se llegará al menú inicial. Como se puede ver, al elegir las distintas opciones, si elegimos la opción 3 del menú principal, además de contestar cambiamos el valor de fMenu. Así, al hacer el RESTART y volver al principio del proceso, no volveremos a entrar en el mismo menú, sino que entraremos en el secundario. Lo mismo ocurre con la opción 3 del menú secundario, de elegirla nos llevará de vuelta al menú principal.

Si os fijáis, al salir con la opción 2 del menú secundario, no restablecemos el valor del flag fMenu a 0 (MENU_INICIAL) por lo que salvo que lo hagamos desde fuera, la próxima vez que hablemos con este PSI, se entrará directamente en el menú secundario. De no quererlo así, antes del DONE, deberíamos hacer un LET fMenu MENU_INICIAL.

El jugador cansino

#define CONST MENU_INICIAL 0
#define CONST MENU_SECUNDARIO  1

#define flg fMenu 100
#define flg fContadorSaludos  101

_ _
 CLEAR fKey

; Menu inicial
_ _ 
 EQ fMenu MENU_INICIAL
 WRITELN “1. Hola”
 WRITELN “2. Adiós”
 WRITELN ”3. ¿Hablas inglés?”

; Otro Menu 
_ _ 
 EQ fMenu MENU_SECUNDARIO
 WRITELN “1. Hello”
 WRITELN “2. Good Bye”
 WRITELN ”3. Mejor en español por favor”
_  _
 GETKEY fKey

; Menu inicial
_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_1
 LT fContadorSaludos 5
 WRITELN “Dices 'Hola'”
 WRITELN “Luis dice 'Hola'”
 PLUS fContadorSaludos 1
 RESTART

_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_1
 GE fContadorSaludos 5
 WRITELN “Dices 'Hola'”
 WRITELN “Luis dice 'Hola tío cansino, hola otra vez'”
 RESTART


_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_2
 WRITELN “Dices 'Adiós'”
 WRITELN “Luis dice 'Adiós amigo'”
 DONE


_ _
 EQ fMenu MENU_INICIAL
 EQ fKey KEY_3
 WRITELN “Dices '¿Hablas inglés?”
 WRITELN “Luis dice 'Yes, I do.''”
 LET fMenu MENU_SECUNDARIO
 RESTART

; Otro Menu 
_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_1
 LT  fContadorSaludos 5
 WRITELN “Dices 'Hello'”
 WRITELN “Luis dice 'Hello'”
 RESTART

_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_1
 GE  fContadorSaludos 5
 WRITELN “Dices 'Hello'”
 WRITELN “Luis dice 'Hello! ¡Hola! Hallo! Ni Haw! Alo!  PE-SA-DO'”
 RESTART

_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_2
 WRITELN “Dices 'Good Bye'”
 WRITELN “Luis dice 'Good bye my friend'”
 DONE
_ _
 EQ fMenu MENU_SECUNDARIO
 EQ fKey KEY_3
 WRITELN “Dices '¿Mejor en español por favor'”
 WRITELN “Luis dice 'Vale.''”
 LET fMenu MENU_INICIAL
 RESTART

_ _ 
  RESTART

Como veis, cada vez que el jugador le dice “Hola”, aumentamos el valor de una variable, y si esta llega a 5, en lugar de entrar por la entrada que da la contestación normal, entraremos por otra en la que se ve al PSI ya cansado de tanto saludo.

El pirata

Este es un ejemplo más complejo, que viene incluido como ejemplo en el paquete de Superglús 1.0.

##define flg fMenu 100  ; Almacena el numero de menu en el que estamos
##define flg fKey 101   ; Almacena la tecla pulsada
##define flg fsabenombre 102 ; Seteado si el jugador ya sabe el nombre del interlocutor
##define flg fMosqueado 103 ; Seteado si el marinero se ha enfadado con nosotros 

##define const KEY_1 49
##define const KEY_2 50
##define const KEY_3 51
##define const key4 52
##define const key5 53
##define const key6 54

_ _
 CLEAR fKey

; ---------------- MENUS --------------------------

; MENU 0

_ _ 
 EQ fMenu 0
 WRITELN "\21. Hola que tal"
_ _ 
 EQ fMenu 0
 ZERO fsabenombre
 WRITELN "\22. ¿Como te llamas?"
_ _ 
 EQ fMenu 0
 NOTZERO fsabenombre
 WRITELN "\22. ¿Y que haces aquí?"
_ _ 
 EQ fMenu 0
 WRITELN "\23. Adiós"
 
; MENU 1
_ _
 EQ fMenu 1
 WRITELN "\21. ¿El legendario tesoro?¿Que sabes de el?" 
_ _
 EQ fMenu 1
 WRITELN "\22. Eso son solo patrañas de marineros borrachos." 
_ _
 EQ fMenu 1
 WRITELN "\23. Bueno, me voy" 

 
;---------------- ENTRADA DE TECLADO ----------------------- 
_ _ 
 GETKEY fKey
 
 ;------------------- Nuestra frase ---------------------

; MENU 0
 
_ _ 
 EQ fMenu 0
 EQ fKey KEY_1
 WRITELN "\5Hola que tal"
_ _ 
 EQ fMenu 0
 EQ fKey KEY_2
 ZERO fsabenombre
 WRITELN "\5¿Como te llamas?"
_ _ 
 EQ fMenu 0
 EQ fKey KEY_2
 NOTZERO fsabenombre
 WRITELN "\5¿Y que haces aquí?"
_ _ 
 EQ fMenu 0
 EQ fKey KEY_3
 WRITELN "\5Adiós"
 
; MENU 1
_ _
 EQ fMenu 1
 EQ fKey KEY_1
 WRITELN "\5¿El legendario tesoro?¿Que sabes de el?" 
_ _
 EQ fMenu 1
 EQ fKey KEY_2
 WRITELN "\5Eso son solo patrañas de marineros borrachos." 
_ _
 EQ fMenu 1
 EQ fKey KEY_3
 WRITELN "\5Bueno, me voy" 

 
 
;------------------- RESPUESTAS --------------------- 

_ _ 
 ZERO fsabenombre
 WRITE "El marinero dice: "
 
_ _ 
 NOTZERO fsabenombre
 WRITE "Guybrush dice: "
 

; MENU 0
_ _ 
 EQ fMenu 0
 EQ fKey KEY_1
 WRITELN "Hola amigo."
 RESTART

_ _ 
 EQ fMenu 0
 EQ fKey KEY_2
 ZERO fsabenombre
 WRITELN "Me llamo Guybush Threepwood, y soy un pirata."
 SET fsabenombre
 RESTART

_ _ 
 EQ fMenu 0
 EQ fKey KEY_2
 NOTZERO fsabenombre
 WRITELN "Estoy en busca del tesoro de Melee Island."
 LET fMenu 1
 RESTART
_ _ 
 EQ fMenu 0
 EQ fKey KEY_3
 WRITELN "Adiós."
 DONE
 
; MENU 1

_ _ 
 EQ fMenu 1
 EQ fKey KEY_1
 ISAT 1 252
 WRITELN "Solo se lo que pone en este mapa."
 WRITELN "Guybrush te da un papel arrugado."
 PLACE oMapa CARRIED
 RESTART
 
_ _ 
 EQ fMenu 1
 EQ fKey KEY_1
 ISNOTAT oMapa 252
 WRITELN "Ya te he dicho todo lo que se."
 RESTART
 
_ _ 
 EQ fMenu 1
 EQ fKey KEY_2
 LT fMosqueado 3
 WRITELN "Bueno, si eso es lo que piensas..."
 PLUS fMosqueado 1
 RESTART
 
_ _ 
 EQ fMenu 1
 EQ fKey KEY_2
 GE fMosqueado 3
 WRITELN "¡peleas como una vaca!"
 PLUS fMosqueado 1
 RESTART
 
_ _ 
 EQ fMenu 1
 EQ fKey KEY_3
 LT fMosqueado 3
 WRITELN "Hasta luego amigo..."
 LET fMenu 0
 DONE
 
_ _
 EQ fMenu 1
 EQ fKey KEY_3
 GE fMosqueado 3
 WRITELN "Adios pesado..."
 LET fMenu 0
 DONE
  
 
;------------------ REINICIAR PROCESO -------------------- 
_ _ 
 RESTART

Este proceso es diferente en que se ha separado la parte en la que escribimos lo que nosotros mismos hemos dicho, de la parte en la que se escribe a su vez la respuesta. Por lo demás simplemente tiene mas capacidades:

  • El interlocutor pregunta el nombre del PSI, a partir de ese momento en lugar de por “el marinero” nos referimos a él por su nombre.
  • El menú inicial tiene una frase variable, si no sabemos el nombre del PSI, la segunda opción es preguntárselo, en caso contrario, la segunda opción es preguntarle qué hace aquí.
  • El interlocutor también se enfada si somos pesados y nos da respuesta diferentes
  • En un momento dado, el interlocutor nos da un mapa
  • Los textos se ponen en diferentes colores, o al menos se intenta (ya sabéis, el tema de Glulx y los estilos). De ahí los \5, \2,etc., que preceden a algunos textos.

Epílogo

Como habréis visto, crear conversaciones no es trivial, aunque teniendo las cosas claras y bien organizadas no es tan difícil. Es cierto que por ejemplo, el compilador de conversaciones de NMP era más orientado a hacer conversaciones de una manera sencilla, pero también estaba más limitado, al no poder poner cualquier condacto en las mismas, por lo que no se podían hacer acciones complicadas.

Con este sistema cualquier condacto es utilizable, porque al fin y al cabo es un proceso, por lo que nada impide hacer cualquier acción, por compleja que parezca. De hecho, nada impediría hacer una conversación tipo centralita telefónica, sí, ya sabéis “Pulse 1 si desea tal, pulse 2 si desea cual.. etc.) usando sonidos ogg o aiff.

 

tutoriales/conversaciones_por_menus.txt · Última modificación: 2009/05/28 17:25 por csanchez71