Herramientas de usuario

Herramientas del sitio


descripciones_y_nombres_dinamicos

Descripciones y nombres dinámicos

Un buen juego no se mantiene siempre estático a lo largo de las partidas; sino que cambia con el tiempo. AGE proporciona un sencillo mecanismo de descripciones y nombres dinámicos que facilita que las descripciones y nombres de habitaciones, cosas y personajes puedan cambiar según las circunstancias. Con esto, se pueden conseguir efectos como:

  • Que la descripción de una calle cambie según si es de día o de noche,
  • Que cambie según el humor del personaje (lo que para uno es un día alegre para otro podría ser un día horrible),
  • Que la descripción y/o nombre de una cosa cambie según su estado (la misma espada a lo largo de una aventura puede estar limpia o manchada de sangre, o tal vez oxidada),
  • Que el nombre de un personaje se muestre distinta según si un jugador lo conoce o no (el jugador podría ver a un personaje como “un hombre de mediana edad” cuando no sabe quién es, y una vez que se lo han presentado verlo como “Benito”),
  • Que el nombre o descripción de una cosa se muestre distinto según los conocimientos de un jugador (lo que para un bárbaro iletrado es “un libro muy grande”, para un mago podría ser “un tomo sobre magia de combate”).

Todo esto se consigue de forma sencilla especificando condiciones en las áreas de nombres y descripciones de PUCK.

Descripciones dinámicas

Las descripciones dinámicas se pueden definir tanto para habitaciones como para cosas y personajes. Esto se hace introduciendo una lista de condiciones y descripciones en el cuadro “Descripciones” de la ficha “General” de estas entidades. Para añadir un elemento a esta lista, introducimos una condición en el campo “Condición”, la descripción asociada en el campo “Descripción”, y pulsamos Añadir. La condición que introduzcamos en el campo “Condición” es un pedazo de código BeanShell con las siguientes características:

  • Tiene que ser una expresión booleana, es decir, un trozo de código simple (sin estructuras if, bucles ni puntos y coma; aunque sí puede tener llamadas a métodos, operaciones, etc.) y que devuelva un valor de tipo boolean (true o false). Dicho con otras palabras, la condición puede ser cualquier trozo de código que pudiese ir como condición de un if.
  • Podemos usar la variable self para referirnos al objeto en que estamos definiendo la descripción, y la variable world para referirnos al mundo, exactamente igual que en los métodos definidos mediante BeanShell.
  • Adicionalmente, en estos campos de condición tenemos una variable especial viewer que podemos utilizar para referirnos al jugador o criatura que está mirando aquello que describimos. Esto se puede usar, por ejemplo, en los ejemplos de aplicación que proponíamos antes para mostrar diferentes descripciones a un jugador según su humor o según sus conocimientos sobre la entidad.

Así, ejemplos de posibles condiciones podrían ser:

get(self,“oxidada”) → esta descripción es sólo para si la cosa que describimos (una espada, por ejemplo) está oxidada.

!get(self,“oxidada”) → lo contrario, se muestra sólo si la espada no está oxidada.

get(viewer,“conoce”,self) → descripción que se muestra sólo si el jugador que está mirando al personaje que describimos ya lo conoce (hecho descrito por una relación “conoce”).

get(viewer,“humor”) > 5 → mostrar esa descripción sólo si el humor del jugador que mira es mayor que 5 (si hemos definido el humor como una propiedad de tipo int que toma valores de 0 a 10, por ejemplo, esto sería una descripción que sólo se ve si estás de buen humor).

Cuando un jugador mire la entidad cuya descripción dinámica hemos definido de esta manera, la descripción que se mostrará al jugador será la concatenación de todas aquellas descripciones de la lista cuyas condiciones asociadas se cumplan. Nótese que esto quiere decir que podemos construir descripciones dinámicas “a trozos”, dividiéndolas en partes con distintas condiciones. Un ejemplo de esto sería el siguiente, en una habitación:

Condición: en blanco (“siempre”), descripción: Te encuentras en una habitación de hotel.

Condición: get(self,“luzEncendida”), descripción: Es una habitación pequeña y sencilla: sólo tiene una cama, un armario y una pequeña mesilla de noche.

Condición: !get(self,“luzEncendida”), descripción: La luz está apagada, y la escasa luz de las farolas que entra desde la ventana apenas te deja intuir la silueta de una cama.

Condición: ( get(self,“luzEncendida”) && get(viewer,“humor”) > 5 ), descripción: En una de las paredes hay un cuadro de dudoso gusto que muestra un hombre a caballo.

Condición: ( get(self,“luzEncendida”) && get(viewer,“humor”) ⇐ 5 ), descripción: En una de las paredes hay un cuadro de un hombre a caballo, tan horriblemente pintado que dan ganas de tirarlo por la ventana.

Así, is por ejemplo la luz estuviera encendida y el humor del jugador fuese 2, se le mostraría esta descripción de la habitación:

Te encuentras en una habitación de hotel. Es una habitación pequeña y sencilla: sólo tiene una cama, un armario y una pequeña mesilla de noche. En una de las paredes hay un cuadro de un hombre a caballo, tan horriblemente pintado que dan ganas de tirarlo por la ventana.

Mientras que si la luz estuviese apagada, se mostraría

Te encuentras en una habitación de hotel. La luz está apagada, y la escasa luz de las farolas que entra desde la ventana apenas te deja intuir la silueta de una cama.

Nombres dinámicos

El mismo mecanismo que hemos explicado para las descripciones de habitaciones, cosas y criaturas se aplica también a los nombres singulares y plurales para mostrar de las cosas y criaturas. Las características que deben cumplir las condiciones en este caso son las mismas que para las descripciones, incluida la posibilidad de utilizar la variable especial viewer.

Hay, sin embargo, una diferencia: los nombres dinámicos que se muestran a los jugadores no se construyen “a trozos” como las descripciones, ya que eso no tendría mucha utilidad, sino que simplemente se muestra el primer nombre cuya condición se cumpla. Si hay más de un nombre cuya condición se cumple, el resto se ignorarán.

También es interesante saber que si no se cumple la condición de ninguno de los nombres para mostrar de una cosa o criatura, esa cosa o criatura será “invisible” en el sentido de que no aparecerá por defecto en la descripción de la localidad o inventario en la que se encuentra. Esta característica se puede utilizar para hacer que una cosa o criatura sea invisible en estas descripciones, bien sea siempre, o bien en ciertas circunstancias. Nótese que una cosa o criatura que se encuentra en esta situación sigue pudiéndose mirar mediante “mirar cosa”, e interactuar con ella mediante comandos en general, mientras tenga algún nombre de referencia por el cual el jugador se pueda referir a ella.

descripciones_y_nombres_dinamicos.txt · Última modificación: 2011/11/21 22:54 por al-khwarizmi