CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 16 Oct 2019 06:06

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 4 mensajes ] 
Autor Mensaje
NotaPublicado: 27 Mar 2010 17:07 
Desconectado
Elfito
Elfito
Avatar de Usuario

Registrado: 18 Mar 2010 11:44
Mensajes: 15
Hola a todos de nuevo. Al final me decanté por aprender I6 y estoy programando ya algunos pequeños ejemplos. No estoy encontrándome con demasiados problemas de momento, pero si que tengo una duda sobre las descripciones de localidad y me gustaría planteárosla.

Tengo programada una habitación con unos cuantos objetos en ella. Cuando se usa el comando MIRAR o cada vez que entro en la habitación, se imprime su descripción y después: "Puedes ver (listado de objetos no concealed que hay en la localidad)". Si defino un describe en alguno de los objetos, la descripción de la localidad pasa a ser: su propia descripción, texto devuelto por la propiedad describe del objeto, y "Puedes ver también (listado de otros objetos)".

El problema está en que si hay muchos objetos que tienen definida una describe, las descripciones que se imprimen al MIRAR o entrar en la localidad tienen un aspecto que no me termina de convencer:

Código:
Tu habitación
Es tu habitación; sencilla y acogedora.

Puedes ver tu gran cama de madera oscura dominando la estancia.

Una maleta de viaje yace apoyada junto al escritorio.

Hay un billete de 20 euros tirado en el suelo.

Puedes ver también un gran armario, tu ropa, un calendario de pared y una estantería llena de libros.


¿Hay alguna forma de hacer que el listado de objetos de la habitación pase a ser algo similar a lo siguiente:?

Código:
Tu habitación
Es tu habitación; sencilla y acogedora.

Una gran cama de madera oscura domina la estancia.

Puedes ver también tu maleta de viaje, que yace apoyada junto al escritorio, un billete de 20 euros tirado en el suelo, un gran armario, tu ropa, un calendario de pared y una estantería llena de libros.


Y además querría que el short_name de la maleta siga siendo "maleta de viaje", no "maleta de viaje, que yace apoyada junto al escritorio", para que por ejemplo al teclear COGE TODO se imprima: "maleta de viaje: Cogida", y no "maleta de viaje, que yace apoyada junto al escritorio: Cogida".

Gracias anticipadas por la ayuda.


Arriba
 Perfil  
 
NotaPublicado: 27 Mar 2010 20:51 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Seguramente haya una forma elegante de resolver esto, pero de momento, si te parece te explico mi forma chapucera.
Partimos de que estás describiendo situaciones iniciales, la maleta apoyada junto a la pared se listará así exclusivamente en esa localidad y antes de que el jugador la manipule y la vuelva a dejar.

Código:
!definimos los objetos de esa localidad tal que así:
object maleta "maleta de viaje"
with name 'maleta',
adjectives 'viaje',
found_in habitacion1,
descripcion_inicial "una maleta junto a la pared",
after[;
Take: if (self has concealed){ give self ~concealed;}
],
has concealed female;

object sello "sello"
with name 'sello',
found_in habitacion1,
descripcion_inicial "un sello en el suelo.",
after[;
Take: if (self has concealed){ give self ~concealed;}
],
has concealed;

!y ahora programamos la localidad
object habitacion1 "habitacion"
with
description[o n;
print "La habitación blablabla.^"
n=0;
!primero contamos cuántos objetos con descripcion_inicial no manipulados aún hay en la sala
objectloop (o in self && o provides descripcion_inicial) if(o has concealed)n++;
!Si hay alguno al menos, procedemos a listar
if (n>0){!#1
print "Observas ";
objectloop (o in self && o provides descripcion_inicial) if(o has concealed){!#2
print o.descripcion_inicial;n--;
if(n==0)print ".^";
if(n==1)print " y ";
i(n>1)print ", ";
}!#2
}!#1
rtrue;
],
has light;


Reasultado:
habitación
La habitacion blablabla
Observas una maleta junto a la pared y un sello en el suelo.
>>coger maleta
Coges la maleta
>>dejar maleta
Dejas la maleta
>>MIRAR
habitación
La habitacion blablabla
Observas un sello en el suelo.
Puedes ver la maleta.

De modo que inicialmente los objetos camuflados como concealed (y diferenciados de los demás concealed porque estos tienen la propiedad descripcion_inicial) y los listamos por nuestra cuenta usando el framento de la propiedad "descripcion_inicial" (aquí puedes poner el nombre que quieras a la propiedad), pero en el momento en el que son agarrados por el jugador desactivamos el atributo "concealed" y se listan por el método normal.

Ya avisé que era una chapucilla :)
PD: De todas formas, esto te deja dos grupos de listados: los que están concealed y los que no.
Creo que la forma más fina es integrar el listado de los concealed con la descripción, de esa forma no canta demasiado que tras ella aparezca el "Puedes ver..." con los objetos liberados ya manipulados.
Así:
Código:
object habitacion1 "habitacion"
with
description [;
print "La habitación posee un escritorio";
if(maleta in self && maleta has concealed) print " sobre el que se apoya una maleta de viaje";
print ", un camastro, cuatro paredes y un sucio suelo";
if(sello in self && sello has concealed) print " en el que distingues un sello olvidado";
".";
],
has light;

(De esta forma no necesitas usar nuevas propiedades ni objectloops, tan sólo poner en concealed inicialmente todos los objetos pertinentes)

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 28 Mar 2010 17:26 
Desconectado
Archivero
Archivero

Registrado: 08 Sep 2008 22:04
Mensajes: 274
jarel escribió:
Seguramente haya una forma elegante de resolver esto, pero...


Haberla hayla :) , Mistral puede probar a jugar con la propiedad "invent" de objetos como la maleta, que a partir de la version 6/11 de la librería de Inform afecta no sólo a los listados de "inventario" sino a los de los objetos presentes en la localidad actual. Le bastaría con una manipulación sencilla similar a:

Código:
invent
[;
   if (inventory_stage==1 && self hasnt moved)
   {
      print "una maleta de viaje, que yace apoyada en la pared";
      rtrue;
   }
],


Remito a la pag 415 del DM4 (ver aquí) para echar un vistazo rápido al funcionamiento de la propiedad "invent" y al uso de la variable "inventory_stage". Con el atributo "moved" comprobamos además que el cambio del modo de listarse por defecto sólo se hace antes de coger la maleta, con lo que nos ahorramos unas vueltas. El "rtrue" es imprescindible para que la librería no mezcle nuestro pequeño cambio con su proceso de listado habitual (y debe de ir como una orden aparte del "print" para prevenir retornos de carro no deseados).

--


Arriba
 Perfil  
 
NotaPublicado: 28 Mar 2010 23:09 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
DrVanHalenFan escribió:
Código:
invent
[;
   if (inventory_stage==1 && self hasnt moved)
   {
      print "una maleta de viaje, que yace apoyada en la pared";
      rtrue;
   }
],



Chapeau!
Me sonaba lo del invent pero ignoraba que podía emplearse también para el listado de la descripción.
-Es muy elegante ese doctor...- le confiaba la vecina del tercero a la del segundo por la ventanilla del patio.

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 4 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM