Cómo extender o redefinir la libreríaEl modelo del mundoIniciar, mover, cambiar y matar al jugadorPuntuación y otras yerbas

Puntuación y otras yerbas

Constantes variadas

Algunas de las reglas del juego pueden alterarse si se definen ciertas constantes al principio del juego (antes de incluir EParser). Dos constantes que debes definir siempre son los textos Historia y Titular, como ya vimos. Por ejemplo:

Constant Historia "Monkey Island";
Constant Titular "Un plagio conversacional^
          Copyright (c) 1999 de Armando Pleitos.^";

Todas las demás constantes que veremos aquí son opcionales.

(Esp) InformATE utiliza algunas constantes más que no estaban en la librería original:
  • ADMITIR_COMANDO_SALIDAS. Si defines esta constante (no importa qué valor le des), la librería añadirá el comando "SALIDAS" (abreviado "X") al juego. La función de este comando se define en la sección sobre listado automático de salidas.
  • ADMITIR_INFINITIVOS. Normalmente se espera que las órdenes que escribe el jugador sean imperativos (es decir "MUEVE" en lugar de "MOVER"). No obstante, si defines esta constante el jugador podrá usar la forma infinitiva. El programador, no obstante, debe programar los verbos en imperativo (mediante las líneas de gramática adecuadas). La librería tratará de convertir la forma infinitiva usada por el jugador en la forma imperativa que comprende InformATE. Para más detalles sobre cómo realiza esta "traducción" ver la sección sobre verbos.
  • TIEMPO_REAL. Si esta constante está definida, entonces el tiempo transcurrirá "realmente" durante el juego (es decir, incluso aunque el jugador no escriba nada). Esta posibilidad de todas formas está aún en fase muy experimental y sin documentar apenas (véase el manual de referencia técnica de InformATE).

Las restantes constantes están relacionadas con el sistema de puntuación, por lo que las veremos en el siguiente apartado.

Puntuación

La librería proporciona dos sistemas de puntuación independientes. Puedes usar ambos, o ninguno de ellos. La librería suele ocuparse de aumentar o disminuir la puntuación automáticamente, si bien tú mismo puedes modificar la variable puntuacion como y cuando quieras (el problema es que en este caso el verbo "puntuacion total", que normalmente le explica al jugador cómo ha obtenido los puntos, puede que no supiera explicarlo todo convenientemente. Según uno de los métodos de puntuación, el jugador puede obtener puntos por coger ciertos objetos o por llegar a ciertos lugares. Según el otro método, el jugador obtiene puntos por lograr completar ciertas acciones.

Las constantes relacionadas con la puntuación son:

Si vas a usar el sistema de puntuación por "tareas", además de especificar en la constante NUMERO_TAREAS cuántas tareas tiene el juego, deberás definir otra constante llamada HAY_TAREAS y además especificar cuánto puntúa cada tarea, creando un array llamado puntuacion_tareas como este:

  Array puntuacion_tareas -> t0 t1 ... tn;

donde t0 es la puntuación de la tarea 0, t1 la de la tarea 1, y así sucesivamente (n será NUMERO_TAREAS-1). Observar que este es un array de tipo byte, por lo que cada puntuación será como máximo 255.

Una vez declarado lo anterior, cada vez que el jugador complete una tarea (por ejemplo "conseguir entrar en la tumba"), el código llamará a la función Conseguido(tarea) donde tarea es el número de la tarea conseguida. Aunque llames a esa función varias veces, los puntos sólo se sumarán realmente a la puntuación la primera vez que se llama para cada tarea.

Recuerda, no obstante, que todo este asunto de las tareas es opcional. Si no defines la constante HAY_TAREAS no necesitas tampoco definir las puntuaciones de cada tarea ni utilizar la llamada a Conseguido. Pero si lo defines, el jugador podrá usar el comando "puntuacion total" para obtener un resumen de qué tareas ha conseguido y cuántos puntos ha obtenido por cada una. En este caso deberás programar también una rutina llamada ImprimirTareas que la librería llamará cuando necesite escribir la explicación de una tarea dada. Esta rutina recibe un parámetro que es el número de la tarea y debe escribir un texto que sea la descripción de esa tarea. Por ejemplo (obtenido del juego "La juguetería"):

[ ImprimirTareas cual; switch(cual) 0: "comer una golosina"; 1: "conducir el coche"; 2: "cerrar el tragaluz"; 3: "hacer una pila de cuatro"; 4: "ver hacia donde se inclina la repisa"; ];

Otra función que puedes definir (si quieres) es la llamada ImprimirRango, cuyo cometido es escribir algún texto extra tras la puntuación (tradicionalmente el rango alcanzado). Por ejemplo podríamos añadir lo siguiente a "Ruinas":

[ ImprimirRango
  print ", lo que te otorga el rango de ";
  switch(puntuacion)
  {   0 to 9:   "humilde turista del bosque.";
      10 to 19: "Investigador.";
      20 to 29: "Recolector.";
      30 to 49: "Arqueólogo.";
      50:       "Maestro Arqueólogo.";
  }
];

Normalmente InformATE escribirá mensajes como:

  [Tu puntuación ha aumentado en tres puntos.]

Cada vez que la puntuación cambia (por la razón que sea). El jugador puede desactivar estos mensajes y activarlos de nuevo mediante el verbo notificar. Por defecto está activada (pero desde el programa puedes cambiar el valor de la variable modo_notificar para controlar esto).

Además el jugador podrá normalmente usar el comando OBJETOS para obtener un listado de todos los objetos que han estado en su poder y dónde los ha dejado, y el comando LUGARES para obtener una lista de los nombres de los lugares que ha visitado. Si no quieres que el jugador disponga de estos comandos, define la constante NO_LUGARES antes de incluir la librería.

(!)
(?) EJERCICIO 46  Supón que has utilizado un solo objeto para programar las 64 casillas de un gigantesco tablero de ajedrez, como si fueran habitaciones diferentes. Es posible hacerlo usando hábilmente la propiedad cantidad de la habitación, de modo que esta cantidad signifique la casilla concreta en la que estás, y de modo que las propiedades al_n, al_s, etc. consulten dicha cantidad para saber qué movimientos están permitidos según la casilla y que alteren adecuadamente la cantidad al viajar de una casilla a otra.

Ahora bien, si lo hacemos así cuando el jugador escriba el comando "LUGARES" la librería probablemente mostrará tan sólo la última casilla visitada. ¿Cómo arreglarías esto de modo que en vez de esa casilla diga "El tablero de ajedrez gigantesco"?
(Solución)


Zak McKraken - spinf@geocities.com

Cómo extender o redefinir la libreríaEl modelo del mundoIniciar, mover, cambiar y matar al jugadorPuntuación y otras yerbas