Creando juegos de aventura con Adventure Game Studio (VI)

AGS Blue Cup Logo Adventure Game Studio es un programa creado por Chris Jones para que amateurs de la creación de videojuegos puedan hacer sus juegos de aventura al estilo de los juegos que hacía Sierra y/o LucasArts a mediados de los 90. En particular, AGS permite concentrar a la persona o al equipo en la creación de contenido del juego y facilitar la programación de los guiones que conformarán la historia. AGS se ha convertido a lo largo de estos años en un programa muy poderoso, con una gran gama de características, un lenguaje de scripting muy flexible, y una excelente comunidad dispuesta a ayudar y con gente bien simpática. En la parte anterior habíamos comenzado a crear habitaciones en AGS, la unidad fundamental de un juego de aventura.

En esta parte haremos scripts que definirán las interacciones que puede hacer el jugador con los objetos y los hotspots de una habitación. Dejaremos de lado el asistente de interacciones que trae AGS. Sin embargo, este asistente es muy intuitivo, y el lector bien puede hacer cosas simples con éste. Esta parte fue escrita en su totalidad por Nathan23, usuario latinoamericano de AGS, y frecuente miembro del foro de AGS. Por mi parte se hicieron ediciones de redacción y organización de la información.

En la siguiente parte veremos cómo agregar diálogos y conversaciones a los personajes del juego.


Parte VI: Programación de scripts en AGS

Los scripts son instrucciones sencillas que siguen un orden secuencial. Los scripts tienen un formato estructurado, el cual parecerá complicado al principio, pero que exploraremos por partes y descubriremos que no es tan complicado una vez entendido.

Los scripts son instrucciones que AGS ejecuta, realizando acciones que deseamos que el personaje o el juego haga dependiendo de la interacción que lleve a cabo con los objetos u otros personajes dentro de una habitación. En esta parte del tutorial pasearemos por la escritura de 4 scripts, cada uno representando una interacción que puede hacer el jugador. Cada script será más complejo, y cada uno se relacionará con un concepto visto en anteriores partes, o enseñará nuevos conceptos.

Primero mostraremos un mensaje cuando se observa un objeto. Luego haremos una interacción donde moveremos un objeto dentro de la habitación. Después de eso, haremos que el personaje tome un objeto y lo ponga en su inventario. Finalmente, haremos una interacción de un objeto con un hotspot.

Comenzaremos ubicando los objetos dentro de una habitación con arte previamente creado, y describir la información que lleva cada objeto. Luego escribiremos los scripts correspondientes a las interacciones de dos objetos, y una interacción de un objeto con un hotspot de la habitación.

Abriendo la fuente de nuestro juego en AGS

Para esta parte requeriremos bajar y descomprimir el paquete de gráficos [ZIP, 3,5MB] de la parte IV. Una vez hecho eso, abriremos la fuente del juego en AGS incluida allí. El resultado de esta parte se puede bajar en esta versión de la fuente del juego [ZIP, 3MB].
Ubicando objetos dentro de una habitación

Lo primero que haremos será ubicar la habitación en la que vamos a trabajar, para esto nos ubicamos en el Room Editor del panel de la izquierda y seleccionamos en el panel de la derecha la habitación con la que vamos a trabajar. Seleccionaremos la habitación 1 haciendo doble clic sobre él.

SubirTutorial AGS, Parte VI: Seleccionando la habitación

Ahora ubicaremos los objetos que estarán en la habitación. Para esto seleccionamos la opción Objects del Room Editor. Tenemos muchas opciones nuevas pero sólo vamos a mencionar las más importantes y que siempre se deben tomar en consideración:

Tutorial AGS, Parte VI: Información de cada objeto en una habitación

  1. La cantidad de objetos en la habitación. Esto lo vemos marcado con el recuadro rojo de la figura. Aquí mismo es posible ver con cuál objeto estamos trabajando en la figura se muestra una llave.
  2. Cada objeto tiene asignado un número único que lo identifica. Para desplazarnos entre los diferentes objetos en la habitación nos ubicamos en la parte que está marcada con el recuadro morado. En este caso estamos editando el objeto 0, la llave. Si hacemos clic sobre el selector al lado de Editing object: 0 podemos ver cómo cambia el número y la imagen del objeto. Para nuestro ejemplo dejemos seleccionado el objeto 1, la almohada.
  3. Así mismo podemos ver que cambiando las flechas cambia también el nombre del objeto y su nombre para el script. Esto lo indicamos en el recuadro verde de la figura. Dentro de ese mismo recuadro se encuentra el Script-O-Name. Esta es la forma de identificar a cada objeto de manera única en el script. Es una práctica recomendable colocar siempre nombres a los objetos porque de esta manera son más fáciles de ubicar y recordar. Para establecer un nombre se escribe dentro del campo Script Name.
  4. Necesitamos que el objeto esté visible inicialmente en la habitación, Para esto nos aseguraremos de que la casilla Object is initially visible (objeto es inicialmente visible) esté marcada. Esta es una opción marcada por defecto, por lo que si el objeto no debiera aparecer visible en la habitación, desmarcaremos esta caja.
  5. El botón Set BaseLine cumple una función similar a los Walk Behind que revisamos en la parte anterior. Si un objeto debe tapar parcialmente al personaje, el baseline indica la altura que determina si el objeto se dibuja encima o debajo de él. Si el objeto está siempre detrás del personaje colocaremos el baseline en el tope de la habitación.
  6. Por último tenemos el botón Interaction…, el cual nos abrirá el Interaction Editor, o Editor de Interacciones, que es el lugar donde construiremos los scripts.

Conociendo el editor de interacciones

Una vez seleccionado el objeto Pillow (el objeto 1), haremos clic en el botón Interaction…. En la nueva ventana (Interaction Editor) veremos una lista de interacciones que se pueden hacer con este objeto. El tipo de interacción que se haga en el juego depende del modo que esté el cursor. Si has probado el ejecutable que viene con la fuente del juego, habrás notado que el cursor puede adquirir varias formas, como un ojo, la mano. Cada forma indica la interacción que se realizará con un objeto o hotspot cuando se hace clic.

Cada interacción es representada con un item acompañado de una bandera azul que que se desprende del objeto Pillow. La interacción que nos interesa para este ejercicio es Look at Object, por lo que haremos doble clic sobre ella.

Tutorial AGS, Parte VI: Listador de interacciones en el editor de interacciones

AGS ofrece dos maneras de construir scripts: escribiendo directamente las instrucciones, o utilizando el asistente de AGS, que humaniza un poco esta tarea permitiendo al usuario hacer una lista de instrucciones legibles por él. La ventana “Configure Action” permite utilizar ambos métodos, aunque en esta parte nos concentraremos en escribir directamente las instrucciones. Haremos clic sobre la flecha en la lista, lo cual desplegará todas las acciones posibles. Escogeremos la que dice “Run script“. En este momento aparecerá un botón que dice “Edit script“, sobre el que haremos clic. Con esto entraremos al editor de scripts de AGS.

Tutorial AGS, Parte VI: Editor de scripts de AGS

La ventana se parece a un editor de texto sencillo, pero tiene funcionalidades poderosas, como un asistente de código. El cursor debería estar titilando sobre el área blanca.

La primera interacción

Vamos a escribir el código para mostrar un mensaje una vez que se hace click para ver el objeto:

Display("Es la almohada de Joe");

Habremos notado que aparece una lista con varios nombres a medida que escribimos los 3 primeros caracteres. Estas instrucciones se asemejan a la palabra que estamos escribiendo. Este es el asistente de código del editor de scripts de AGS que facilita la programación, y minimiza la cantidad de errores por escribir mal los nombres de las instrucciones. Es posible revisar los nombres de la lista, y una vez que ubicada la palabra que necesitamos, en este caso Display, se selecciona y se presiona Enter.

Las instrucciones de AGS son sensibles a las mayúsculas, por lo que es necesario revisar que las funciones estén escritas correctamente. Todas las instrucciones de AGS comienzan con mayúscula. Un script deberá estar correctamente escrito, o de otra manera, AGS no permitirá guardarlo. Una vez escrita la palabra Display, ahora abrimos el paréntesis. Veremos que AGS nos vuelve a dar una ayuda diciéndonos que es lo que debemos poner dentro del paréntesis, esta guía aparece debajo de donde escribimos escrito en rojo.

Tutorial AGS, Parte VI: Asistente de código de AGS

Lo que nos sugiere la ayuda es que debemos introducir una cadena de caracteres. En general, cada vez que en una instrucción pida un const string message quiere decir que necesitamos colocar una cadena de caracteres. Una cadena de caracteres es una o varias palabras u oraciones encerradas entre comillas dobles. Por ejemplo, "Creativo" es una cadena de caracteres válida.

Una vez completado el argumento cerramos el paréntesis y colocamos un punto y coma. El punto y coma es obligatorio, y es una de las primeras cosas que hay que revisar si un script no se guarda. AGS reconoce el punto y coma como el fin de una instrucción. De no colocarse, AGS dará un error de sintaxis.

Guardando y probando el script

Ahora probaremos que nuestro script está correcto. Escogeremos en esta ventana la opción Exit and save changes del menú File, haremos clic en OK en la ventana Configure Action. En la ventana Interaction Editor veremos que se agregó a nuestro ítem “Look at object” el subítem “Run script“. Cada vez que queramos modificar ese script daremos doble clic sobre este subítem. Eventualmente nos cansaremos de buscar la opción de Exit and Save Changes, por lo que el atajo CTRL-W nos ahorrará este trabajo.

Por ahora presionaremos el botón Close y grabaremos nuestro juego. AGS preguntará si se quiere guardar la habitación que estamos editando y si se quiere guardar el juego entero. A continuación probamos el juego con la opción Test (CTRL-T). Si escogen el icono del ojo del menú del juego y dan clic sobre la almohada se mostrara el mensaje colocado en el script.

Tutorial AGS, Parte VI: Probando la interaccion de ver la almohada

La segunda interacción, un poco más compleja

Ahora vamos a realizar algo más movido con Joe. Haremos que cuando Joe toque la almohada con el icono de la mano la mueva y descubra las llaves que se encuentran debajo de ella. Para realizar esto utilizaremos una segunda interacción de la lista de interacciones de la almohada, “Usar el objeto“.

Antes tenemos que saber a dónde vamos a mover la almohada. Para esto moveremos la almohada haciendo clic sobre ella y arrastrándola. ¿Cómo sabemos las coordenadas donde se ubica el objeto? Con las coordenadas del mouse y del objeto. El recuadro marrón de la siguiente figura nos muestra la ubicación de estos números:

Tutorial AGS, Parte VI: Coordenadas de la habitación

La posición de la almohada es 70 en el eje X y 195 en el eje Y. Anotaremos por ahora estos números porque los utilizaremos pronto. Lo que viene a continuación es una repetición de los pasos anteriores, por lo que iremos más rápido esta vez.

Introduciendo las instrucciones en el script

Ya seleccionada la almohada, hacemos clic en el botón “Interaction“. Escogemos del Interaction Editor la bandera azul que dice Interact Object y hacemos doble clic sobre ella.

Una vez más, tenemos el diálogo Configure Action. Escogemos de la lista desplegable la opción Run Script, y hacemos clic en el boton “Edit Script“. En la ventana del AGS Script Editor vamos a introducir los siguientes comandos:

oPillow.Move(91,195,4,eBlock,eAnywhere);
Display("Hey,son las llaves de la puerta");

Casi todos los elementos de AGS son considerados objetos, y estas funciones modifican el estado de estos objetos. Es importante distinguir el concepto de objeto de una habitación, y el objeto dentro de un script. Los objetos de un script pueden referirse a los de la habitación, pero también puede referirse a los personajes, hotspots u objetos del inventario. Esta diferencia es práctica y a medida que nos sumerjamos en la programación de AGS aprenderemos a notarla.

Explicación línea a línea del script

En el script que acabamos de escribir tenemos dos funciones. La primera función se aplica al objeto de la almohada, y acepta 5 parámetros: posiciones x e y nuevas del objeto, la velocidad con la que ocurre esta acción, y dos parámetros más que explicaremos más adelante. Notemos que hemos movido el objeto en el eje x, es decir que se mueve horizontalmente de 70 que estaba inicialmente a 91, si hubiéramos querido moverlo diagonalmente debíamos cambiar los valores en ambos ejes.

La segunda función es la misma utilizada anteriormente para mostrar un mensaje de aviso, como esto es una secuencia de comandos entonces una vez que se termine de mover la almohada se mostrará el mensaje inmediatamente.

Tercera interacción. Conociendo los objetos del inventario

Vamos a hacer la tercera interacción. Haremos que Joe pueda recoger sus llaves y agregarlas a su inventario. El inventario es el espacio donde un personaje guarda las cosas que tiene. Vale la pena hacer la distinción de los objetos de una habitación, y los objetos del inventario. Cuando un personaje recoge un objeto de una habitación para ponerla en su inventario, la técnica usual es desaparecer ese objeto de la habitación e introducir el objeto correspondiente en el inventario.

Entonces repetiremos los pasos que conocemos para crear una interacción y llegar a la ventana de edición de código. Escogemos el objeto Keys que corresponde al número 0, y realizamos los mismos pasos para el objeto Pillow hasta tener abierta la ventana del AGS Script Editor, siendo la interacción a editar Interact Object. Ahora escribiremos los siguientes comandos:

Display("Tomo las llaves");
cJoe.AddInventory(iKey);
GiveScore(2);
oKeys.Visible = false;
Display("Tengo las llaves");

Este código es un poco más complicado y un poco más largo, pero con un conocimiento básico de inglés podemos notar que las instrucciones son bastante comprensibles. Veremos ahora, línea por línea, qué hace este código:

  1. Empecemos por las líneas del comando Display. Como un ejercicio hemos puesto esta función al principio y al final del script para que podamos ver claramente el orden de ejecución de estas instrucciones. Podremos notar claramente entonces cuándo las llaves desaparecen.
  2. Como hemos dicho, la forma de trabajar en los scripts de AGS es que todos los elementos del juego son objetos en el código. En este caso nuestro personaje Joe también es un objeto y en el código lo llamamos por el nombre cJoe. Para que el personaje Joe aparezca como el objeto cJoe debemos asegurarnos de que tiene colocado su Script Name correctamente en la ventana Characters. Cada nombre de objeto tiene al principio una letra que identifica qué tipo de objeto es: si el objeto de código corresponde a un objeto de habitación, entonces la letra correspondiente es la o. Para los personajes, es la letra c (de carácter). Para los vobjetos del inventario, la letra i. Para las interfaces, la letra g.

Tutorial AGS, Parte VI: El campo donde se coloca el nombre de objeto de un elemento de AGS.

  1. La segunda línea del script introduce el objeto iKey, correspondiente a la llave en el inventario, al objeto cJoe.
  2. La tercera línea es una función propia de AGS que es GiveScore. Esta función agrega puntos por acciones realizadas por el personaje y se le coloca un número entero que puede ser positivo o negativo (en este caso no agrega puntos, sino que los quita). En AGS se puede tener un indicador de puntaje para el jugador, que le indique al mismo tiempo cuánto le falta del juego y cuándo hace algo bien, aunque bien puede no utilizarse. A diferencia de las funciones que se aplican sobre objetos, GiveScore, Display y otras funciones no se aplican sobre éstos.
  3. La cuarta línea utiliza una propiedad del objeto oKeys llamada Visible, le asignamos el valor False. Lo que hace es desaparecer el objeto de la pantalla para que no pueda realizarse ninguna otra interacción con él, y dando a entender que el objeto fue tomado por Joe y colocado en su inventario. Como nota aparte, es en ésta y en la segunda línea donde podemos apreciar la diferencia entre el objeto de la habitación (oKeys) y el objeto del inventario (iKeys).

Cuarta interacción. Interacción de un objeto con un hotspot.

Como siguiente paso debemos hacer que Joe pueda utilizar la llave que tomamos en la puerta, para esto escogemos la opción Areas dentro del Room Editor, y hacemos clic en el botón Interaction… Nos aseguramos antes de seleccionar el hotspot 1, de color azul, como aparece en la figura:

Tutorial AGS, Parte VI: Seleccionando el hotspot 1 en la habitación

Ahora en el Interaction Editor hacemos doble clic en la opción Use Inventory on Hotspot y seleccionamos la opción Run script en la ventana Configure Action. Presionamos el botón Edit Script… y escribamos el siguiente código:

if (cJoe.ActiveInventory == iKey) {
Display("veamos si sirve esta llave en la puerta");
cJoe.ChangeRoom(2, 245, 200);
Display ("Funciona,estoy en la otra habitación");
}

Aquí tenemos una nueva estructura de código, que es la instrucción if. Se utiliza para realizar comparaciones, y acepta una expresión, que está entre paréntesis, que evalúe a verdadero o falso (los valores True o False de AGS). El código que está entre las llaves se le llama bloque, y sólo se ejecuta si la expresión cJoe.ActiveInventory == iKey evalúa a True.

Noten que la condición va después del if y entre paréntesis. La condición por lo general hace comparaciones con operadores relacionales, que son : >, <, <= , == (igual que), != (diferente de) y otros operadores. En este caso estamos comparando si Joe está utilizando el objeto iKey (la llave) de su inventario. Sólo si la respuesta es cierta se ejecutan los comandos que vienen después de la apertura de la llave.

Pasemos a la siguiente línea del código después de la instrucción Display. Aquí utilizamos el método ChangeRoom sobre cJoe. Este método cambia al personaje a otra habitación del juego. Los parámetros que recibe son: el número de la habitación, y la posición donde estará en la nueva habitación. Es importante que esta posición esté dentro de un área caminable en la nueva habitación, o el personaje no podrá caminar allí.

Probando nuevamente el juego

Ahora probaremos el juego. Dentro del juego moveremos la almohada, recogemos la llave, y la utilizamos sobre la puerta. Voilá, Joe pasará a la siguiente habitación.

Puede que algunas cosas salgan mal. En tal caso, debemos asegurarnos en primer lugar que los nombres de scripts de cada objeto estén correctamente escritos, dentro del script los nombres deben corresponder a los nombres dados en las diferentes pantallas de AGS. Debemos asegurarnos luego de que la nueva posición de la almohada sea la correcta, que la llave del inventario debe aparecer cuando se recoge la llame, y que el personaje esté en un área caminable en la nueva habitación.

Conclusión

Hemos terminado con está introducción a los scripts de AGS, que pretendía ser pequeña pero lo cierto es que resultó gigantesca. También es cierto que los scripts ofrecen la flexibilidad necesaria para hacer una gigantesca cantidad de cosas en un juego de aventura. Por ejemplo, las escenas cutscenes son hechas exclusivamente con estas funciones.

Dejamos para el lector algunas tareas, como crear una interacción con la cajita roja que se encuentra en la habitación Joe debería poder tocarla y al hacerlo obtener una pequeña clave que se la guardaría en su inventario; así mismo en la otra habitación debe implementar la funcionalidad de la puerta: cuando Joe toque la puerta que vuelva a la otra habitación. Estas dos cosas se hacen utilizando solamente las funciones que describimos en esta parte.

En la siguiente parte veremos cómo se hace el diálogo entre personajes. Hasta entonces hay mucho qué hacer y aprender.

Navegar la seriePost anterior en la serie

8 comentarios en “Creando juegos de aventura con Adventure Game Studio (VI)”

  1. Probablemente requieras el uso de SetTimer e IsTimerExpired, ambas funciones de AGS. Con SetTimer estableces un temporizador para un tiempo determinado (medido en ciclos de juego), y luego en la función global execute_repeteadly deberías comprobar a cada momento si el temporizador expiró (retorna 0 si todavía está activo y 1 si expiró, pero retorna 1 solamente una vez). Avísame si necesitas instrucciones más específicas.

    1. Hola después de releer la función de set timer en el manual no me queda claro como debo implementarla. Lo que quiero es que después de un tiempo memande a otra habitación, pero no se donde doben ir definidas ambas funciones.

      Saludos.

Deja un comentario