SPAC
Portada > Webzine > Sección objetiva > A. técnicos > Cursillo práctico de Inform 7 - (III)

Cursillo práctico de Inform 7 - (III)

El uso del tiempo y escenas - Nivel : Novato

Martes 19 de febrero de 2008, por Sarganar


El paso del tiempo

Para darle más emoción a esto digamos que la activación de la alarma es fatal para el jugador: si la alarma está sonando durante más de tres turnos, llegará un guardián, atrapará al jugador y se acabará el juego. Sin embargo, si el jugador detiene la alarma antes de los tres turnos, el guardián no aparecerá.

Podemos manejar este tipo de cosas usando un reloj. El paso del tiempo en Inform está dividido en turnos, y cada turno equivale a un ‘minuto’. Así que hagamos que, al sacar un objeto de la cúpula (y esta quede vacía) se arranque un reloj. Luego del transcurso de tres turnos se comprobará si la cúpula continua vacía. En caso afirmativo aparecerá el guarda y se acabó el juego. Por otra parte, el poner un objeto dentro de la cúpula hará que el guardia no aparezca, y puzzle resuelto.

Vamos a definir una variable sensor con dos posible valores: sensing y just fired. Esto nos dirá si la cúpula (provista de ese sensor) está o no vacía. Pega el siguiente código en lo que ya tienes hecho tu aventura ejemplo:


A cupula de cristal is here. The printed name is "cúpula de cristal".
   The description is "Está abierta."
   It is container, openable, closed and female.
   It is fixed in place and transparent.
   Instead of examining the closed cupula, say "Examinando con detenimiento la cúpula descubres una
       especie de juntura. Parece una tapa que podría abrirse."

A diamante is in the cupula.
   The description is "Tiene un brillo casi cegador, que no parece explicable por las leyes de la óptica."

   The sensor is a kind of value. The sensor are sensing and just fired.
   The cupula has a sensor.

   The last Check taking something inside the cupula:
      if the cupula contain less than 2 things, now the cupula is just fired.

   After taking something:
      if the cupula is just fired begin;
        now the cupula is sensing;
        say "Al coger [the noun] una alarma
         empieza a sonar en algún lugar del exterior.";
        the alarma es escuchada in 3 turns from now; [encender timer]
      otherwise;
        continue the action; [No pasa nada, continuar la accion]
      end if.

   Definition: A container is empty if it does not contain something.

   At the time when the alarma es escuchada:[expira el timer]
      if the cupula is empty begin;
        end the game saying  "Súbitamente un rayo de luz vertical
       aparece en la estancia y
       se ensancha hasta convertirse en un cilindro. Cuando el
       resplandor se apaga ves que en su lugar ha aparecido un
       guardia con equipamiento anti-disturbios. 'Hmm' dice, 'Te
       crees muy listo ¿eh? Me has sacado de la siesta con esa
       maldita alarma y eso es algo que no perdono.'";
     end if.

   After inserting something into the cupula:
        if the cupula is empty begin;
        continue the action;
        otherwise;
        say "Ufff. La alarma ha parado. Creo que nadie la ha escuchado.";
         end if.

   Instead of examining the diamante when the noun is inside the cupula, say "El diamante reposa sobre un cojín de terciopelo."

   Instead of examining the boligrafo when the noun is inside the cupula, say "¿La boli compensará todo el peso del diamante? Mmmm, esperemos que sí."

¿Compila bien? Debería.

Zip - 1.5 KB
Fuente Cursillo Tiempo

No tienes el codigo listo, Mmm. Aqui tienes la fuente completa. Luego hablaremos de ello. :-)

Observa los siguientes puntos de interés:

La cúpula tiene una nueva propiedad: sensor, cuyos valores pueden usarse como adjetivos en cosas como:


        if the cupula is just fired...

Son solo dos posibles valores (just fired/sensing), pero es lo que buscamos para la lógica de nuestro sensor. Y puedes cambiarlo con la frase:


        now the cupula is sensing;

El juego comienza con el valor por defecto del sensor, que es el primero que aparece en su definición (sensing).

El reloj se disparará cuando la cupula esté vacía, o lo que es lo mismo, cuando el sensor se dispare. Eso comienza con la acción taking (tomar). Fíjate que en su última (last) regla Check hacemos eso: cambiar el estado del sensor si se comprueba que en la cupula hay un solo objeto. ¿Por qué? Porque para cuando la regla After taking se ejecute, ya no habrá nada en la cupula (es solo objeto habrá pasado a manos del jugador en la Carry Out rule) y encendemos nuestro timer así:


        the alarma es escuchada in 3 turns from now;

        que tiene la forma:  <nombre evento> in <tiempo-referencia>

La regla que verifica el tiempo expirado será:


        At the time when the alarma es escuchada:

También hemos creado un nuevo adjetivo para contenedores: empty , definido como


        Definition: A container is empty if it does not contain something.

Esto es muy útil para abreviar código (y hacerlo más claro). Así, algo como


        if the cupula does not contain something....

Podemos hacerlo asi:


        if the cupula is empty...

Y es válido para cualquier contenedor del juego. ¿Cómo la ves? [1]

Fíjate en el mensaje cuando sacamos el diamante de la cúpula. En lugar de poner "Al coger el diamante de la cúpula" hemos puesto "Al coger [the noun] de la cúpula..." ¿Qué significa esto? La expresión the noun siempre contiene el objeto que el jugador está intentando manipular. De modo que si el jugador había escrito "coge diamante", esta expresión toma el valor del objeto Diamante. Podrías mencionar que esto es redundante, ya que dentro de la cúpula está el diamante y por tanto el jugador no puede sacar de ella otra cosa. ¡Sereno moreno! Fíjate que esto no es cierto, ya que el jugador puede meter otros objetos en la cúpula. Por ejemplo, el bolígrafo. Si más adelante lo intenta sacar, el mensaje sería "Al coger el bolígrafo de la cúpula...". Esta es por tanto la forma de generar mensajes genéricos que se amoldarán en cada caso al objeto manipulado. ¡Incluso escribirá correctamente el género! Si el jugador mete la caja en la cúpula y luego intenta sacarla el mensaje sería "Al coger la caja de la cúpula...", es decir, ha puesto "la" en lugar de (el).

Hemos cambiado la descripción de la cúpula, para que sea diferente si está abierta o cerrada. ¿Entiendes cómo? Con la adición de una regla Instead que solo se ejecuta si la cupula está cerrada.

end the game saying “bla bla bla” te permite finalizar el juego mostrando cierto texto. También puedes finalizar mostrando los textos por defecto Has ganado o Has muerto usando:


                end the game in victory.
                o
                end the game in death.

Muy bien, ¿contento? pues veamos cómo implementar el mismo puzzle, pero desde otra óptica…  [2]

Manejando escenas

Inform es un lenguaje muy versátil y como ya hemos visto cada problema de programación admite múltiples soluciones. Por ejemplo, Inform nos permite dividir el flujo de la historia en ‘escenas’. Sólo tenemos que poner nuestro ingenio en las definiciones de comienzo y finalización de cada una de ellas, para sacarle el mayor provecho. Incluso podemos definir escenas recurrentes, paralelas y con finales alternativos.

Así que organicemos nuestro puzzle. Lo dividamos en dos escenas: la escena Todo Bien, con la que comenzamos el juego y la escena Alarma, alguien se está robando el diamante. La escena Alarma tiene dos posibles finales: final Feliz puzzle resuelto, hemos reemplazado el diamante por otra cosa desactivando el sensor (y volviendo la historia a la escena Todo Bien), o final Infeliz, pasaron 3 minutos y el guardia aparece.

El siguiente código hace lo mismo que el anterior, pero ahora usando escenas.


A cupula de cristal is here. The printed name is "cúpula de cristal".
   The description is "Está abierta."
   It is container, openable, closed and female.
   It is fixed in place and transparent.
   Instead of examining the closed cupula, say "Examinando con detenimiento
         la cúpula descubres una especie de juntura. Parece una tapa que podría abrirse."

A diamante is in the cupula.
   The description is "Tiene un brillo casi cegador, que no parece explicable por las leyes de la óptica."

   Definition: A container is empty if it does not contain something.

   Instead of examining the diamante when the noun is inside the cupula, say "El diamante reposa sobre un cojín de terciopelo."

   Instead of examining the boligrafo when the noun is inside the cupula, say "¿La boli compensará todo el peso del diamante? Mmmm, esperemos que sí."

  Before examining something during Alarma, say "Neee, neee, neee... argh! Ese ruido ensordecedor!"

  Alarma is a recurring scene. Alarma begins when the cupula is empty.
  Alarma ends happily when the cupula is not empty.
  Alarma ends sadly when the time since Alarma began is 4 minutes.

 When Alarma begins:
        say "Al coger [the noun] una alarma
         empieza a sonar en algún lugar del exterior."


 When Alarma ends happily:
        say "Ufff. La alarma ha parado. Creo que nadie la ha escuchado."

 When Alarma ends sadly:
        end the game saying  "Súbitamente un rayo de luz vertical
       aparece en la estancia y
       se ensancha hasta convertirse en un cilindro. Cuando el
       resplandor se apaga ves que en su lugar ha aparecido un
       guardia con equipamiento anti-disturbios. 'Hmm' dice, 'Te
       crees muy listo ¿eh? Me has sacado de la siesta con esa
       maldita alarma y eso es algo que no perdono.'"

Luego de compilarlo, ve a Index>>Scenes y fíjate la información relacionada a la escena Alarma. Allí se listan las escenas disponibles y datos útiles de cada una.

Zip - 1.4 KB
Fuente Cursillo Escenas

La imagen de la izquierda es el acceso a la fuente completa.

Observa los siguientes puntos de interés:

* Todo juego inform ya viene por defecto con una escena llamada Entire Game, que comienza al comenzar el juego y adivina cuándo termina. Esa será nuestra escena Todo Bien (por economía vio?)

* La escena Alarma se define como recurrente. De lo contrario, Inform solo la pondría una vez y de ¿qué sirve una alarma que sólo funciona una vez?

* La definición de inicio:


        Alarma begins when.....(condicion)

La condición puede ser cualquier condición inform válida, como la de nuestro ejemplo, que expresa la idea de ‘cúpula vacía’. Lo interesante es que también existen rulebooks para las escenas, de modo que con:


        When Alarma begins:
        When Alarma ends:

Podemos incluir todas las tareas que necesitemos disparar al iniciar o finalizar la escena.

* La definición de finalización, es similar a la definición de inicio, pero vamos a aprovecharnos de la posibilidad de múltiples finales, según ciertas condiciones:


        Alarma ends happily when the cupula is not empty.
        Alarma ends sadly when the time since Alarma began is 4 minutes.

Happily y sadly son nombres inventados que describen el resultado de haber resuelto o no el puzzle, lo que primero ocurra. Fíjate: La Alarma se disparó. Si volvemos a colocar algo dentro de la cupula, la escena de Alarma finaliza happily. Pero si hacemos cualquier otra cosa por los siguientes tres turnos, será nuestro fin (en la definición debemos poner 3+1 turnos).

Si solo hablamos de un final, el asunto seria algo como:


        Alarma ends when the time since Alarma began is 4 minutes.

Podrás ver cuándo comienzan o terminan las escenas usando el comando SCENES mientras juegas.

* Cualquier acción puede condicionarse a determinada escena. Como ves en:


        Before examining something during Alarma,
                say "Neee, neee, neee... argh! Ese ruido ensordecedor!"

¿Quieres más detalles sobre escenas?, consulta el capítulo 10 Scenes del manual.

Hasta otra!

 [3]

>>Siguiente: Conectando habitaciones

>>Anterior: Complicando las cosas: sobre las acciones

Notas

[1] Puedes verlo con más detalle en “Defining new adjectives” del manual.

[2] Crédito Foto: Clock by CarbonNYC http://www.flickr.com/photos/15923063@N00/64581364/

[3] Crédito Claqueta: Corbis.com Royalty Free

1 Mensaje

  • Cursillo práctico de Inform 7 - (III)

    20 de febrero de 2008 03:25, por Jenesis
    Realmente me estoy planteando el hacer un pdf con todo el cursillo, cuando esté acabado. Gracias por esta nueva entrega Sarganar.

Seguir la vida del sitio  RSS 2.0: Artículos, Comentarios | Mapa del sitio | SPIP
CC Some rights reserved El contenido está disponible bajo los términos de Atribuir - Compartir bajo la misma licencia 3.0 ó 2.5 de Creative Commons.