![]() | ![]() | ![]() | Listas de objetos y cómo agruparlos |
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:
NUEVALINEA_BIT imprime un retorno de carro después de cada
elemento.
INDENTAR_BIT añade espacios delante de cada elemento, según su
nivel (es decir, objetos que están dentro de otros, llevan más
espacios delante cuanto más profundamente estén en el árbol de
objetos).
INFOTOTAL_BIT imprime información extra sobre cada elemento,
como en los inventarios (indicando si está encendido, etc.)
ESPANOL_BIT hace que la lista quede escrita como una frase en
español, con los elementos separados por comas y una "y" delante
del último.
RECURSIVO_BIT la lista es recursiva, de modo que si uno de los
objetos listado tiene hijos (contenidos), éstos son listados
también, siempre que sean visibles.
SIEMPRE_BIT la recursión tiene lugar siempre, incluso si los
hijos no son visibles.
BREVE_BIT se usa en combinación con ESPANOL_BIT para crear
frases un poco más breves, mediante el uso de paréntesis. En lugar
de algo como "una caja en la que hay una bola", imprimirá algo
como "una caja (que contiene una bola)". Realmente no es mucho más
breve, pero sí tal vez más legible.
INFOPARCIAL_BIT añade información extra sobre cada objeto, de
forma análoga a INFOTOTAL_BIT, pero escribiendo frases ligeramente
más breves.
DEFINIDO_BIT imprime un artículo definido delante de cada
elemento (por defecto, usa el indefinido).
BANDERAUX_BIT sólo se listan los objetos que tengan el
atributo banderaux (también llamado workflag). Este atributo es
usado internamente por la librería. No suele tener utilidad para el
programador.
HAY_BIT imprime la palabra "hay" delante de la lista.
OCULTAR_BIT no mencionar a los objetos que tienen el atributo
oculto o escenario. Si además está activado BANDERAUX_BIT,
el ocultamiento no tendrá lugar en el primer nivel del árbol, pero
sí en los siguientes (si se ha especificado recursividad).
SINARTICULO_BIT no imprimir ningún tipo de artículo delante de
cada entrada.
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:
Pista: la solución involucra el atributo |
![]() |
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
en el estilo "español", o bien, en el estilo "vertical":
El texto "comestibles" sólo será usado si en el listado se
encuentran dos o más. Finalmente, la propiedad
Lo normal es asignar la propiedad Si es una rutina, El ejemplo anterior produciría una salida así:
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 Otra variable útil es
|
![]() |
|
![]() ![]() |
|
![]() ![]() |
|
![]() | ![]() | ![]() | Listas de objetos y cómo agruparlos |