Listas de objetos y cómo agruparlosDescripciones y parsingDescripciones y parsingDescripción de objetos y lugares

Descripción de objetos y lugares

Describirle al jugador las cosas y los lugares es mucho más simple que intentar comprender sus intenciones a través de sus órdenes. Pese a todo, el asunto de las descripciones ocupará una buena parte de este capítulo, ya que el diseñador de un juego complejo puede necesitar en algunos casos llegar a conocer cada una de las reglas involucradas. (Mientras que nadie querrá conocer todos los detalles del parser.)

Artículos, género y número

Para empezar, la descripción más simple de un objeto es su "nombre corto". Por ejemplo: DocumentatE|

  print (un) candil;

puede imprimir el texto "un viejo candil". Hay cuatro formas similares para imprimir esto:

print (el) obj
Imprime el objeto precedido por el artículo definido apropiado
print (_El) obj
Como el anterior, pero el artículo sale en mayúsculas
print (un) obj
Imprime el objeto, precedido por el artículo indefinido apropiado
print (_nombre_) obj
Imprime el nombre corto del objeto sin artículo alguno.

(Esp) Los originales en Inform eran, respectivamente, print (the) obj, print (The) obj, print (a) obj y print (name) obj. Estas formas originales siguen estando disponibles y puedes usarlas si lo prefieres en lugar de las traducidas. Observarás que (the) y (a) se han traducido directamente a (el) y (un), mientras que en los otros dos casos ha sido necesario introducir un signo _. Esto es debido a que (El) habría sido equivalente a (el), ya que Inform no distingue entre mayúsculas y minúsculas (excepto en el caso particularísimo de (the) y (The). Por otro lado tampoco se puede usar (nombre) como traducción de (name) porque nombre ya es una propiedad de los objetos, por eso debemos poner (_nombre_) y evitar los conflictos.

Estas formas de imprimir pueden mezclarse con otros textos dentro de un solo print, como por ejemplo:

  print_ret "El ogro se niega a comer ", (el) uno, ".";  

(?) EJERCICIO 49  (Por Gareth Rees) Al referirte a otros personajes a veces puedes necesitar escribir un pronombre como "él". Define nuevas rutinas de imprimir de modo que puedas por ejemplo poner print "Lanzas el libro contra ", (pronombre) obj; y que salga apropiadamente él o ella.
(Solución)

(Esp) Usando print (el) obj la librería intentará deducir el género y número del objeto para lo cual usará las siguientes propiedades:
  1. Propiedad genero. Si el objeto tiene esta propiedad, su valor puede ser uno de los siguientes:
    1. G_MASCULINO Es masculino singular (como "el cofre").
    2. G_MASCULINO+G_PLURAL Es masculino plural (como "los pantalones"),
    3. G_FEMENINO Es femenino singular (como "la puerta")
    4. G_FEMENINO+G_PLURAL Es femenino plural (como "las tijeras")
  2. Si el objeto no tiene la propiedad genero, entonces se examinarán sus atributos, para ver si tiene el atributo femenino, masculino y nombreplural. Si no tiene ninguno de ellos se asume que el caso es "masculino singular".

    Observa que el caso plural se refiere a un objeto (uno solo, no varios) cuyo nombre está en plural. El castellano tiene bastantes ejemplos de esto: "las gafas", "los anteojos"... Otra cosa completamente diferente es el asunto de los grupos de objetos iguales (como "las monedas"), a los que el jugador puede referirse también individualmente ("coge una moneda"). Este tema se verá más adelante.

Una vez determinado el caso, imprimirá el artículo adecuado ("el", "la", "los" o "las" para el caso definido o bien "un", "una", "unos" o "unas" para el caso indefinido).

Existen casos especiales en los que, no obstante, el artículo apropiado no coincide con el género del objeto. Por ejemplo "un águila" tiene articulo masculino, mientras que el objeto es femenino ("un águila blanca"). O habrá otros casos en los que querríamos usar un artículo distinto de todos los anteriores, por ejemplo "tu cepillo de dientes", en vez de "un cepillo de dientes". Para manejar estos casos excepcionales, un objeto puede proporcionar sus propios artículos en la propiedad articulos. Esta propiedad se compone de tres cadenas de caracteres entre comillas. La primera cadena es la que debe usarse con print (_El) obj, la segunda es para print (el) obj y la tercera para print (un) obj. Si quieres que alguna de ellas sea nula (es decir, que el nombre nunca lleve artículo delante) debes darle el valor cero. Por ejemplo:

Object aguila "águila"
with   articulos "El" "el" "un",
       nombre 'aguila',
has femenino animado;

Object agua "agua potable"
with   articulos "El" "el" 0,
       nombre 'agua' 'potable',
has    femenino;

Object cepillo "cepillo de dientes"
with   articulos "El" "el" "tu",
       nombre 'cepillo' 'dientes';

Observa el cero como tercer artículo para el agua. Esto evita que InformatE genere un inventario como: "Llevas un agua potable.", pero no obstante sí puede usar el artículo definido como en "No observas nada especial en el agua potable."

Si el objeto tiene el atributo propio, será tratado como un nombre propio y nunca recibirá un artículo delante (ni definido ni indefinido). Por tanto se ignorará la propiedad articulos aunque el objeto la proporcionara. Para casos en los que quieras permitir artículos definidos pero no indefinidos (o viceversa) puedes usar la propiedad articulos con alguno de sus valores a cero.

(Esp) Además de los artículos previos, InformatE proporciona dos funciones más:
print (del) obj
Imprime el nombre del objeto precedido por "del", "de la", "de los" o "de las" según su género y número. Observa que no serviría poner print "de", (el) obj, ya que "de el" debe convertirse en "del". Si el obj no tiene artículos (o es nombre propio) se imprimirá "de" simplemente.
print (al) obj
Imprime el nombre del objeto precedido por "al", "a la", "a los" o "a las" (o simplemente "a" si es nombre propio).

(Esp) Además de las rutinas para imprimir el artículo InformatE proporciona rutinas para hacer concordar los adjetivos en género y número. Esto es necesario para los mensajes genéricos, por ejemplo si queremos escribir algo como "El objeto está abierto". Pero este objeto puede ser una caja o un cajón. Cambiar "El objeto" por "La caja" o "El cajón" es sencillo, basta poner print (_El) objeto, pero debería ser "abierta" o "abierto" respectivamente. Para esto se tienen las siguientes funciones:
print (o) obj
Imprime "o", "a", "os" o "as". Así, el ejemplo anterior habría que programarlo mediante print (_El) objeto, " está abiert", (o) objeto, "."
print (n) obj
Imprime una "n" si el objeto es plural, o nada si es singular. Esto está pensado para hacer concordar el número de un verbo con su sujeto. Por ejemplo: print (_El) obj, " te mira", (n) obj, "." dará lugar a algo como "Manolo te mira." si obj es manolo, o bien "Los cuervos te miran.", si el obj es un grupo de cuervos (que tendrá entonces la propiedad nombreplural.

Observa que el ejemplo anterior del objeto abierto sería más correcto poniendo: print (_El) obj, " está", (n) obj, " abiert", (o) obj, "." pues de este modo tiene en cuenta que el objeto pueda ser plural (Ej: "Las tijeras están abiertas.").

print (s) obj
Imprime una "s" si el nombre els plural o nada si es singular. Pensado para hacer concordar ciertos adjetivos que no tienen género (ej: verde). Ejemplo print (_El) obj, " ahora está", (n) obj, " verde", (s) obj, "."
print (_s) obj
Es muy similar al anterior. Imprime "es" si es plural o bien nada si es singular. Pensado para hacer concordar en número a ciertos adjetivos que terminan en consonante. Por ejemplo: print (_El) obj, " ahora está", (n) obj, " azul", (_s) obj, "."
print (es) obj
Imprime "es" o "son" según el objeto sea singular o plural. Pensado para conjugar correctamente el verbo ser. Por ejemplo: print "No ", (es) obj, " nada importante." generará el mensaje "No es nada importante." o bien "No son nada importante.", según el número de obj.
print (_Es) obj
Como el anterior pero con la inicial en mayúscula, para empezar frase.
print (lo) obj
Imprime el pronombre adecuado "lo", "la", "los", o "las". Por ejemplo: print "No puedes llevárte", (lo) obj, ".";

(Esp) Además de todo lo anterior, InformatE proporciona una serie de funciones para imprimir el verbo "Coger" de forma sensible al dialecto (cambiándolo por "Tomar" si el dialecto sudamericano está activado). El programador del juego deberá tener la precaución de no usar nunca el verbo "coger" directamente en sus mensajes, sino llamando a estas funciones para que su juego se "jugable" en países sudamericanos.
print (coge) sufijo
Imprime "coge" o "toma" y detrás el sufijo que se especifique entre comillas. Por ejemplo print (coge)"r" imprimiría "coger" o "tomar".
print (MCoge) sufijo
Como el anterior pero con la primera letra en mayúsculas.
print (MMCOGE) sufijo
Como el anterior pero con todas las letras en mayúsculas.

(!)(!)
(Esp) En realidad el género y número de un objeto puede cambiar a lo largo del juego, según la palabra que el jugador haya usado para referirse a él. Si tenemos un objeto que puede ser llamado indistintamente "pantalón" o "pantalones" o "prenda", la forma correcta de programarlo sería poner la palabra "pantalon" dentro de su lista nombre_m, la palabra "pantalones" dentro de la propiedad nombre_mp y la palabra "prenda" dentro de la propiedad nombre_f. Cuando el jugador escriba "COGE PANTALONES" el parser detectará que ha usado una palabra presente en nombre_mp y por tanto cambiará el género y número de este objeto dandole el atributo masculino y el atributo nombreplural (sólo cambia sus atributos, la propiedad genero nunca es cambiada). De este modo, cuando la librería tenga que emitir el mensaje print "Cogid", (o)obj, "." escribirá "Cogidos." (lo cual apparece ante el jugador como una respuesta coherente a su orde "COGE PANTALONES"). Si hubiera puesto "Coge prenda" la respuesta habría sido "Cogida."

No solo eso, el parser además actualiza el pronombre "-lo", o "-los", o "-la" o "-las" según cual haya sido la palabra usada. Así, si la palabra usada fue "PANTALONES" el pronombre actualizado será "-los", de modo que el jugador puede escribir "coge pantalones. Examinalos". O incluso "Coge pantalones. Coge caja. Ponlos en ella"

Resumiendo: InformatE usa los atributos masculino, femenino y nombreplural para escribir las concordancias de género y número, es decir, como parte de las funciones (o), (lo), (s), (_s), (es), (_Es), y (n) antes descritas, y también para actualizar el pronombre más adecuado. Pero estos atributos cambian de valor dependiendo de la palabra que haya usado el jugador para referirse al objeto.

Por otro lado, la propiedad genero nunca cambia de valor y es usada por InformatE como parte de las funciones (_El), (el), (un), (una), (del) y (al). Esta propiedad se refiere al género y número del "nombre corto". Por ejemplo, aunque los pantalones admitan como sinónimos "pantalon", "pantalones" y "prenda", su nombre corto será único (digamos "pantalon") y el género y número de ese nombre es el que debe reflejarse en la propiedad genero.

Como observación final, decir que las funciones mencionadas en el párrafo anterior cambian también los atributos masculino, femenino y nombreplural del objeto cuyo nombre están imprimiendo, para que se adapten a su propiedad genero y de este modo poder emitir mensajes coherentes como "El pantalon esta roto" en vez de "El pantalon están rotos" o algo similar.

Si tu objeto solo usa la propidad nombre (y no tiene sinónimos con diferente género y número) entonces puedes omitir la propiedad genero y usar en su lugar los atributos masculino, femenino o nombreplural ya que estos no cambiarán a lo largo del juego en este caso.

El nombre corto de los objetos

El nombre corto de un objeto es normalmente el texto que se pone entre comillas dobles en la cabecera de su definición. Es difícil cambiar este durante el juego, aunque podría ser necesario en algunos casos (por ejemplo imagina un "líquido rojo" que se convierte en "líquido azul" más adelante debido a una reacción química). Una forma más flexible de dar el nombre corto de un objeto es a través de su propiedad nombre_corto. Para imprimir en nombre de un objeto InformatE hace lo siguiente:

  1. Si la propiedad nombre_corto es una cadena de texto, la imprime y termina.
  2. Si es una rutina, la ejecuta y si ésta devuelve true termina (esta rutina deberá imprimir el nombre adecuado).
  3. Finalmente (si lo anterior no ha terminado ya) escribe el nombre que se dio entre comillas en la cabecera del objeto.

Por ejemplo, el líquido que mencionabamos antes podría tener una propiedad nombre_corto así:

  nombre_corto [;
      if (self.color<3) print "líquido ";
      switch(self.color) {
         1: print "rojo";
         2: print "azul";
         3: print "mejunje espantoso";
      }
      rtrue;
  ],

En este ejemplo, según el valor de la propiedad color sea 1, 2, ó 3 el nombre corto impreso será "líquido rojo", "líquido azul", o "mejunje espantoso". Utiliza siempre print y no print_ret o su abreviatura "cadena entre comillas" pues de lo contrario se añadiría un retorno de carro detrás del nombre.

(Esp) En español lo normal es que la rutina nombre_corto retorne true para impedir que la librería escriba nada más. En inglés no obstante es habitual usar nombre_corto para que escriba un adjetivo y después retorne false para que la librería escriba detrás el nombre, ya que en inglés los adjetivos van siempre delante del nombre.

(!) También puedes hacer que el objeto tenga la propiedad nombre_corto igual a "líquido rojo" y después hacer liquido.nombre_corto="líquido azul" cuando deba cambiar.

Los lugares también pueden tener una propiedad nombre_corto (el nombre corto de un lugar es el que se muestra en negrita al entrar en él, y el que aparece en la barra de estado). Esto es especialmente útil cuando tienes un objeto único en el programa que representa en términos del juego un montón de habitaciones casi idénticas, pero con diferentes nombres (Por ejemplo "Area 1", "Area 2", etc.. hasta "Area 4000").

El nombre de un objeto en el inventario

Lo habitual es que para mencionar un objeto en el inventario la librería use un print (un) obj, lo cual daría lugar a inventarios como este:

> i
Llevas:
  una hoja de menta
  un extraño libro
  tu mochila (que está abierta)
    un cubo verde

Otros objetos sin embargo, deberían llevar descripciones más complicadas en el inventario. Por ejemplo una botella podría indicar cuánto vino le queda. Para esto se usa la propiedad listarse. La forma más fácil de usar esta propiedad es asignarle una cadena de texto, por ejemplo, un "extraño libro" podría tener:

  listarse "ese inofensivo libro antiguo",

Ese texto sería el que se mostraría en la línea de inventario que menciona a ese libro, en vez de "un extraño libro". Más adelante en el juego podría cambiarse de valor la propiedad, por ejemplo:

  libro_raro.listarse="ese letal libro antiguo";

(!) Observación: Esa cadena sustituye a lo que la librería habría impreso por defecto. En particular, si el objeto era un recipiente la librería habría especificado si está abierto y tal vez sus contenidos (si son visibles). En cambio, si tiene la propiedad listarse la librería ya no hará nada de esto. En este caso sería mejor que listarse fuera una rutina, capaz de listar por sí misma los contenidos del objeto. Una rutina también es adecuada para añadir mensajes como "(medio vacío)".

(!) Para mencionar cada uno de los objetos del inventario, la librería lo hace en dos fases:
  1. Imprimir la información básica (el nombre del objeto). Para ello:
    1. La librería pone un 1 en la variable global etapa_inventario.
    2. Si el objeto tiene rutina listarse, es ejecutada y si retorna true parar aquí (no se ejecutará entonces la etapa 2). Si la propiedad es una cadena, se imprime y tampoco se hace nada más.
    3. Se imprime el nombre corto del objeto, precedido de su artículo indefinido.
  2. A continuación se imprime información adicional, como por ejemplo el mensaje "(que está abierta)", y para los recipientes abiertos o transparentes se muestra su contenido (usando estas mismas reglas). Esto tiene lugar en varios pasos:
    1. La librería pone un 2 en la variable global etapa_inventario.
    2. Si el objeto tiene rutina listarse, es ejecutada. Si retorna true, parar aquí.
    3. La librería imprime un mensaje del estilo "(cerrado, vacío y dando luz)". Este mensaje se construye atendiendo a los atributos que en ese momento estén activos en el objeto.
    4. Si se trata de un recipiente abierto, se hace un inventario de sus contenidos.

Una vez impresa la entrada con las reglas anteriores, la librería añade automáticamente texto para enlazar esta entrada con la siguiente. El texto puede ser un simple retorno de carro, o bien una coma (o la conjunción "y"), dependiendo del "estilo de inventario" activo.

Por ejemplo, he aquí la rutina listarse de la caja de cerillas del juego "La juguetería":

        listarse
        [;
            if (etapa_inventario==2)
            {
                switch(self.cantidad){
                 0: print " (vacía)";
                 1: print " (queda una cerilla)";
                 default: print " (quedan ", (numero) self.cantidad, " cerillas)";
                }
            }
        ],

(?) EJERCICIO 50  Supón que quieres hacer que, en el objeto "caja", su línea de inventario salga con un texto delante (como "una odiosa caja"). Pero no puedes usar una cadena en la propiedad listarse, ni tampoco retornar true en la etapa 1, ya que quieres que la etapa 2 ocurra normalmente (para que los contenidos del objeto sean listados). ¿Cómo lograrías esto?
(Solución)

El nombre de un objeto en la descrcipción de localidad

Los mensajes más largos y complicados que imprime la librería InformatE por iniciativa propia, son las descripciones de las localidades, las cuales se imprimen cuando se ejecuta la acción Mirar (por ejemplo, cuando al ejecutar la instrucción <Mirar>, se dispara una descripción de localidad). Lo que ocurre entonces es: el nombre corto de la localidad se imprime en una línea (normalmente en letra negrita), después se imprime la descripción de la localidad, y finalmente una lista de los objetos que hay en ella, que no estén ocultos ni sean escenario.

En el capítulo * se han mencionado ya muchas propiedades relacionadas con esta descripción: inicial, si_encendido, si_apagado, etc. que sirve para dar descripciones del aspecto de un objeto cuando está en la misma localidad que el jugaador; algunas de estas propiedades son sólo aplicables a puertas, otras a los objetos conmutables, etc. Todas ellas pueden ser rutinas para imprimir texto, en lugar de meras cadenas. Las reglas concretas se dan a después.

Pero todo el mecanismo de la librería que usa esas propiedades, puede ser eliminado y sustituido por otro usando la propiedad describir. Si un objeto tiene la propiedad describir (que ha de ser una rutina), entonces esto tiene prioridad sobre cualquier otra cosa. La rutina es ejecutada y si retorna true, la librería asume que el objeto ya se ha descrito y no imprime nada más (en particular, ignorará las propiedades inicial, si_encencido, etc.) Por ejemplo,

  describir [;
     "^La pirámide de platino captura la luz de forma hermosa.";
    ],

significa que, incluso si la pirámide ha sido movida (es decir, el jugador la ha cogido y la ha soltado de nuevo), seguirá teniendo una línea propia en las descripciones de la localidad (recordemos que, de lo contrario, el objeto iría a parar a la lista de "También puedes ver:..." que se imprime al final de la descripción de localidad)

(!) Fíjate en que hemos puesto un ^ al principio de la cadena. La librería no imprime un retorno de carro antes de llamar a describir, porque no sabe aún si esa rutina tiene pensado escribir algo o no. Una rutina describe que retorna true sin haber escrito nada, hace que el objeto sea invisible, como si llevara el atributo oculto.

(!)(!)

La acción Mirar hace tres cosas: "anota la llegada", imprime la descripción de la habitación y después "puntúa la llegada". Aquí vamos a dar sólo las reglas con las cuales imprime la descripción. Para las otras, véase sección sobre puntuación. En la explicación siguiente, la palabra "localidad" significa la habitación en que está el jugador, si hay luz para ver, o el objeto "Oscuridad" si no la hay.

Los pasos que sigue InformatE para crear la descripción de la localidad son:

  1. Crear la línea con el "título" de la localidad.
    1. Imprime un retorno de carro. Imprime el nombre corto de la localidad (en negrita).
    2. Si el jugador está subido a un soporte, entonces imprime " ( sobre <loquesea>)"; si está metido en un objeto, imprime " ( en <loquesea>)".
    3. Si se ha ejecutado recientemente CambiarJugador(lobo, 1), por ejemplo, se añade el texto " ( como un lobo)".
    4. Se imprime un retorno de carro.
  2. Imprimir la "descripción larga" de la localidad. Este paso será omitido si el jugador acaba de entrar en esta localidad (por su propio pie, es decir, con un comando de movimiento como "norte") y ésta ya había sido visitada. A menos que el juego esté en "modo largo". La descripción se obtiene de la propiedad descripcion de la localidad, o bien de la rutina describir de la localidad, si tiene una.
  3. Descripción de los objetos que hay en la localidad. Para esta etapa se dan los siguientes pasos:
    1. Listar los objetos que hay en el suelo.
    2. Si el jugador está subido en algo, listar los objetos que hay en ese algo.
  4. La librería ya ha terminado, pero le da al juego la oportunidad de añadir algo más al final del todo, para lo cual llama a la rutina RutinaMirar (si hay una). Esta rutina es global, no forma parte de ningún objeto.

(!) Después de que la descripción se haya impreso por primera vez, su atributo visitado se pone a true (esto ocurre durante la fase de "puntuar llegada"). Consultando ese atributo podemos hacer que una localidad tenga diferente descripción la primera vez.

(!) La operación de "listar objetos" (como ocurre en las últimas fases de la descripcíón), es bastante complicada. Algunos objetos son descritos en una línea o un párrafo para ellos solos, mientras que otros son agrupados en una lista común, al final. Otros objetos (aunque están en la localidad) no son mencionados para nada. En concreto, no se menciona al jugador, ni lo que el jugador lleve consigo, ni los objetos con el atributo oculto o escenario. Los demás objetos son recorridos por la librería (empezando por el más recientemente introducido en la localidad), que va haciendo lo siguiente:
  1. Si el objeto tiene una rutina describir, es ejecutada. Si retorna true, la librería da por terminado este objeto y no imprime nada sobre él.
  2. La librería prepara una descripción para este objeto, según qué tipo de objeto es. En primer lugar, decide qué propiedad va a usar del objeto:
    1. Si es un recipiente, utiliza la propiedad si_abierto o si_cerrado.
    2. Si no, si es un conmutable, utiliza la propiedad si_encendido o si_apagado.
    3. Si no, si es una puerta, utiliza la propiedad si_abierto o si_cerrado.
    4. Si no, utiliza la propiedad inicial.
  3. Comprueba si el objeto tiene esa propiedad. Si no la tiene, se deja el objeto para agrupar con otros y listarlos todos juntos al final. También se deja el objeto para el final si tiene el atributo movido (lo que ocurrirá si el jugador lo ha cogido y soltado de nuevo), a menos que la propiedad elegida en el paso previo sea si_encendido o si_apagado (estos no se dejan para el final aunque hayan sido movidos).
  4. Si, tras el test anterior, el objeto no se ha dejado para el final, entonces se imprime ahora un retorno de carro, y el valor de la propiedad elegida (se imprime si es una cadena, o se ejecuta si es una rutina).

(!) Un objeto con los atributos soporte y escenario, no será mencionado. Pero sin embargo, cualquier cosa sin el atributo oculto que esté sobre este soporte sí será mencionado. Si se quiere evitar esto, el soporte debe ser además oculto.

(!) Los objetos que acaban de ser empujados a la localidad actual, no son listados dentro de los contenidos de la habitación en este turno, aunque aparecerán listados en los turnos siguientes si se efectúa de nuevo una acción Mirar. Pero esto no se debe a ninguna regla especial sobre las descripciones de habitación, sino porque el objeto empujado se mueve a la nueva localidad después de hacer la descripción de la habitación. Esto está pensado para que, si el jugador empuja un carro durante una distancia larga, no tenga que leer "Puedes ver un carro." en cada movimiento, lo que sería para él un tanto sorprendente.

(!) La librería usa una rutina llamada Local para crear la descripción de la localidad. Si lo necesitas, puedes usar esta rutina desde tu programa con el mismo propósito. Mira la sección sobre rutinas de la librería, pero basta decir que la acción por defecto ante Mirar es equivalente a ejecutar:

  if (Local(localizacion, "Puedes ver", "También puedes ver"))
    print ".^";    

Local es útil para describir áreas de una habitación que está subdividida en localidades.

(!)
(?) EJERCICIO 51  La librería implementa los modos "superbreve" y "largo" para la descripción de localidades (el primero siempre omite las descripciones de habitación, y el otro nunca las omite). ¿Cómo podrías hacer que el modo "largo" imprima automáticamente las descripciones de las localidades en todos los turnos? (Algunos de los últimos juegos de Infocom hacían esto)
(Solución)


Zak McKraken - spinf@geocities.com

Listas de objetos y cómo agruparlosDescripciones y parsingDescripciones y parsingDescripción de objetos y lugares
1