indy_logo.gif (3362 bytes)

Paso 4 (bis): entrenamiento interpersonal

 

Usando el modelo previo, las conversaciones son divertidas, pero no son realmente interactivas. Una de las principales características de las aventuras de Lucas era la habilidad de explorar todo un set de respuestas cuando hablas con otros personajes en el juego.

tutorial_4b.gif (34083 bytes)

Esto también es fácil de realizar.


ROOM main
{
	IMAGE { "gr/street_2.gif" }
	WALK { "gr/street_2_bm.gif" }

	ITEM Indy
	{
		ANIMATION
		{
			// --- imágenes en reposo ---
			0  0  "gr/indy_d.gif"  1 // Mirando al Sur
			0  1  "gr/indy_r.gif"  1 // Mirando al Oeste
			0  2  "gr/indy_u.gif"  1 // Mirando al Norte
			0  3  "gr/indy_l.gif"  1 // Mirando al Este
			// --- animaciones caminando ---
			1  0  "gr/indy_wd.gif" 4 // Mirando al Sur
			1  1  "gr/indy_wr.gif" 6 // Mirando al Oeste
			1  2  "gr/indy_wu.gif" 4 // Mirando al Norte
			1  3  "gr/indy_wl.gif" 6 // Mirando al Este
			// --- animaciones hablando ---
			2  0  "gr/indy_td.gif" 7 // Mirando al Sur
			2  1  "gr/indy_tr.gif" 4 // Mirando al Oeste
			2  2  "gr/indy_tu.gif" 1 // Mirando al Norte
			2  3  "gr/indy_tl.gif" 4 // Mirando al Este
		}
		POSITION { 140 140 0 }
	}

	ITEM sophia
	{
		ANIMATION
		{
			// --- imágenes en reposo ---
			0  1  "gr/sophia_r.gif"  1 // Mirando al Oeste
			0  3  "gr/sophia_l.gif"  1 // Mirando al Este
			// --- animaciones caminando ---
			1  1  "gr/sophia_r.gif"  1 // Mirando al Oeste
			1  3  "gr/sophia_l.gif"  1 // Mirando al Este
			// --- animaciones hablando ---
			2  1  "gr/sophia_tr.gif" 4 // Mirando al Oeste
			2  3  "gr/sophia_tl.gif" 4 // Mirando al Este
		}
		INK { 3 }	// Sophia habla de color rosa  :)
		POSITION { 250 143 0 }
		ITEM medallion
		{
			ICON { "gr/medalion.gif" }
		}
		INTEGER
		{
			f	// El nivel de la conversación será guardado aquí.
			r	// Aquí se guardara la selección del usuario o jugador.
			q	// Variable de salida.
		}
		COMMAND "talk to" sophia
		{
			MOVE indy 210 142 0	// Muévelo a su izquierda.
			WAIT indy
			TURN indy sophia	// Mírala.
			TURN sophia indy	// Mírale.

			/* Nivel #0 de la conversación */
			WHILE { EQ f 0 }
			{
				CLRANSWER			// Limpia el panel de conversación.
				ADDANSWER "¡Sophia!"	 1	// Añade esto al panel, con ID=1
				ADDANSWER "¿Quien eres tu?" 2	// Añade esto al panel, con ID=2
				WAITANSWER r			// Espera a la selección del jugador y guardala en la variable "r"

				IF { EQ r 1 }
				{
					// El usuario elige la respuesta con ID = 1
					WAITSAY indy "¡Sophia! \n ¡Te perdí desde Atlantis!"
					WAITSAY sophia "¿Tu? \n ¡Pero si casi me matas allí!"
					ADD f 1		// Avanzamos al siguiente nivel de conversación.
				}
				IF { EQ r 2 }
				{
					// El usuario elige respuesta con ID = 2
					WAITSAY indy "¿Quién eres tu?"
					WAITSAY sophia "Doctor Jones! \n ¡No puedo creer que no me recuerdes!"
					// This acts as a fake branch (leads the player to nowhere)
				}
			}

			/* Nivel #1 dentro de la conversación */
			LET q 0		// Limpia la variable de salida.
			WHILE { EQ f 1  AND  EQ q 0 }
			{
				CLRANSWER			// Limpia el panel de la conversación
				ADDANSWER "Te necesito"	1	// Añade esto, con ID=1
				ADDANSWER "Adiós por ahora" 2	// Añade esto al panel, con ID=2
				WAITANSWER r			// Espera al usuario y pon el resultado en la variable "r"

				IF { EQ r 1 }
				{
					// El usuario elige respuesta con ID = 1
					WAITSAY indy "Te necesito. Dame otra oportunidad."
					WAITSAY sophia "Mmmmm... \n Toma esto, te ayudara."
					GIVE indy medallion	// Bingo!
					SOUND "snd/medal.au"
					ADD f 1		// La conversación ha acabado.
				}
				IF { EQ r 2 }
				{
					// El usuario elige la respuesta con ID = 2
					WAITSAY indy "Adiós por ahora"
					LET q 1		// Señal de salida de esta conversación
				}
			}
		}
	}
}

COMMAND "look at" *
{
	SAY indy "No tiene nada especial."
}
COMMAND * *
{
	SAY indy "No puedo hacer eso."
}
COMMAND * * *
{
	SAY indy "No puedo hacer eso."
}


Usando un esquema interno similar al previo, este ejemplo expone una conversación real donde el jugador puede seleccionar una respuesta de todo el set disponible.

Solo hay tres instrucciones para controlar el panel de conversación.
Primero, el panel será limpiado con la instrucción CLRANSWER. Entonces, cada posible respuesta será añadida al panel usando ADDANSWER con un valor en la variable ID, para poder reconocerlo mas tarde. Finalmente el jugador selección la respuesta con WAITANSWER y la pondrá dentro de una variable entera.
El árbol de preguntas y respuestas puede ser tan sofisticado como necesites. La complejidad de la conversación viene del flujo del programa con el SCRIPT, y un pequeño uso de variables.


Para acortar el SCRIPT la instrucción WAITSAY, usada para reemplazar la secuencia de SAY+WAIT utilizada en el SCRIPT del paso anterior. También observa que el carácter de nueva línea "\n" es reconocido por las instrucciones SAY y WAITSAY para evitar escribir muchas líneas WAITSAY una tras otra.

Siguiente >>

Volver a la página principal