Cómo se interpretan los nombresDescripciones y parsingEl nombre de un objeto en la descrcipción de
  localidadListas de objetos y cómo agruparlos

Listas de objetos y cómo agruparlos

La librería necesita a menudo enumerar una lista de objetos: cuando tiene lugar la acción Inv (inventario), por ejemplo, o cuando está describiendo los contenidos de un recipiente, o cuando enumera los objetos "sosos" de una localidad. Es bastante difícil imprimir correctamente una lista "a mano", porque hay muchos casos especiales con los que hay que tener cuidado, especialmente cuando hay que tener en cuenta los plurales. Por suerte, la rutina que usa la librería para hacer las listas está disponible también para el público. La rutina que hay que llamar es:

EscribirListaDesde(objeto, estilo);

donde la lista comenzará desde el objeto dado y continuará a lo largo de sus "hermanos" (hermanos en el árbol de objetos de Inform, véase el capítulo sobre el lenguaje de los objetos para más información). Así que, si lo que queremos es mostrar todos los objetos dentro de X, habrá que empezar a listar desde el objeto child(X).

El aspecto de la lista impresa depende del "estilo" seleccionado. Este estilo es una combinación de bits que puedes obtener sumando entre sí algunas de las constantes siguientes:

La mejor forma de saber qué hacen exactamente todas esas opciones es la experimentación. Por ejemplo, un inventario "estrecho" es generado mediante:

EscribirListaDesde( child(jugador),
   INFOTOTAL_BIT + INDENTAR_BIT + NUEVALINA_BIT + RECURSIVO_BIT );

mientras que un inventario "ancho" se genera así:

EscribirListaDesde( child(jugador),
   INFOTOTAL_BIT + ESPANOL_BIT + RECURSIVO_BIT );

lo que produce los efectos siguientes:

 > INVENTARIO ESTRECHO
 Llevas:
   una bolsa (que está abierta)
     tres monedas de oro
     dos monedas de plata
     una moneda de bronce
   cuatro cubos lisos
   un buril mágico
   un libro de hechizos

 >INVENTARIO ANCHO
 Llevas una bolsa (que está abierta), dentro de la que hay tres
 monedas de oro, dos monedas de plata y una moneda de bronce, cuatro
 cubos lisos, un buril mágico y un libro de hechizos.

excepto que "Llevas" no es impreso por la rutina EscribirListaDesde, ni tampoco el punto final en el inventario ancho.

Aunque el bit banderaux es usado por la librería en algunas circunstancias, tú también puedes usarlo con cuidado para especificar un subconjunto de objetos a listar.

(!)(!) Las reglas BANDERAUX_BIT y OCULTO_BIT entran en contradicción. Si se especifican ambas, lo que ocurre es que en el primer nivel se listan todos los objetos con el atributo banderaux, pero no los que tengan oculto o escenario, y en los siguientes niveles justamente lo contrario.

(?) EJERCICIO 52  Escribe una rutina InventarioDobleSub que genere dos inventarios, en primer lugar los objetos que llevas en las manos y después los que llevas "puestos", por ejemplo:

 Llevas cuatro cubos lisos, un buril mágico y un libro de
 hechizos. Además, vas vestido con un abrigo rojo y un casco.

Pista: la solución involucra el atributo banderaux (Solución)

(!) Finalmente, hay una forma elegante de personalizar la forma en que los objetos se agrupan en las listas, que puede mejorar considerablemente la presentación del juego. Por ejemplo, si queremos que todos los comestibles aparezcan juntos en los listados, basta poner a todos ellos el mismo valor en la propiedad listar_juntos (un valor entre 1 y 1000). Entonces siempre aparecerán juntos en los listados, tanto de inventarios, como en las descripciones de habitaciones, etc.

Opcionalmente, en lugar de un número entre 1 y 1000, el valor común puede ser una cadena de texto, como "comestibles". En este caso, aparecerán listados así, por ejemplo:

 tres comestibles (un pez escarlata, un poco de mantequilla y una cebolla)

en el estilo "español", o bien, en el estilo "vertical":

 tres comestibles:
 un pez escarlata
 un poco de mantequilla
 una cebolla

El texto "comestibles" sólo será usado si en el listado se encuentran dos o más. Finalmente, la propiedad listar_juntos puede ser una rutina, como:

 listar_juntos [;
   if (etapa_inventario==1) 
     print "montones de comida, como por ejemplo ";
   else print ", que no te servirán para nada";
 ],

Lo normal es asignar la propiedad listar_juntos en la definición de una clase, y después hacer que todos los objetos en cuestión sean derivados de esa clase. De ese modo nos aseguramos de que todos estos objetos tengan exactamente el mismo valor en esa propiedad, incluso si este es una cadena o una rutina.

Si es una rutina, listar_juntos será llamada dos veces: la primera, con la variable etapa_inventario igual a 1, para que imprima un preámbilo a la lista de objetos que van a ser listados juntos; y la segunda, con etapa_inventario igual a 2, para que imprima algún texto extra detrás de ellos. Se permite incluso que listar_juntos cambie el valor de la variable estilo_ac, que es la que controla el estilo actual de la lista, sin necesidad de que guarde previamente el valor que tenía. Si listar_juntos retorna true en la etapa 1, entonces la librería no imprimirá la lista de los objetos que irían juntos.

El ejemplo anterior produciría una salida así:

  montones de comida, como por ejemplo un pez escarlata, un poco de
  mantequilla y una cebolla, que no te servirán para nada

Puede ser útil conocer desde esta rutina cuál es el nombre del primer elemento que será listado, y en qué profundidad de recursión nos hallamos (por ejemplo, para mantener una indentación adecuada). Estos valores podemos leerlos de las variables parser_uno (el primer objeto del grupo) y parser_dos (el nivel de recursión). Si tenemos en x una copia de parser_uno (el primer elemento de la lista), podemos obtener los demás elementos a listar ejecutando x = SiguienteElemento(x, parser_dos);

Otra variable útil es listando_junto, en la cual la librería pone el primer objeto del grupo que va a ser listado, o bien 0 si no está siendo listado ningún grupo. La siguiente lista de 24 cosas muestra algunos posibles efectos:

 Puedes ver un tenedor, un cuchillo y una cuchara de plástico, tres
 sombreros (un fez, un Panamá y un quepis), las letras X, Y, Z, P, Q y
 R de un juego de Scrabble, un pastel Black Forest descongelándose, la
 revista Punch, un número reciente de El Espectador, un dado y ocho
 conos (cuatro de plata, uno de bronce y tres de oro).

(!)
(?) EJERCICIO 53  Programa las piezas del Scrabble
(Solución)

(!)(!)
(?) EJERCICIO 54  Programa los tres tipos de moneda del ejemplo anterior, de modo que si en la lista todas las monedas que hay son del mismo tipo (por ejemplo, oro) diga simplemente "tres monedas de oro", pero si coinciden monedas de varios tipos, entonces aclare entre paréntesis los tipos, como en: "tres monedas (dos de oro y una de plata)". NOTA: La solución utiliza bastantes conceptos que no se han visto aún, y que pertenecen a la sección sobre nombres en plural
(Solución)

(!)(!)
(?) EJERCICIO 55  Programa el I Ching en forma de seis monedas, tres de oro (el ciervo, la gacela y el pollo), y tres de plata (el zorro, la serpiente y el bisonte) que puedan ser lanzadas para revelar trigramas de oro y plata.
(Solución aún no escrita)


Zak McKraken - spinf@geocities.com

Cómo se interpretan los nombresDescripciones y parsingEl nombre de un objeto en la descrcipción de
  localidadListas de objetos y cómo agruparlos
1