CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 12 Dic 2017 20:50

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 19 Sep 2014 16:43 
Desconectado
Aventurero
Aventurero

Registrado: 18 Sep 2014 13:25
Mensajes: 5
Hola a todos de nuevo:

Tengo un problema ( me imagino que mío) a la hora de hacer que alguien no salga de una habitación a otra si no tiene un Item en específico.

el caso es que poniendo un código, parecido a el de la bebida, dentro de la habitación de donde no quiero que salga sin un Item (yo utilizo otro Item al del ejemplo) http://www.caad.es/aetheria/doc/doku.php?id=manejo_de_arrays_y_listas

pues no me funciona, para empezar tengo problemas con:
Código:
 if ( equals( verb, "ir") && equals ( args, "este"){}


ya que mirando los args son todo lo que escribes, en este caso, "ir este" no solo "este" con lo cual parece que no es lo mismo. Y si lo dejo asi no me entra la condición.
Lo mas raro es que si escribo solo "este" si me entra lo de la condición if pero me da otro error en esta parte.

Código:
if(get (cosa, "piedra")){}


me pone en el ERROR :

Citar:
*Offending text: get (cosa, "piedra")
*Message: Sourced file: inline evaluation of:
parseCommand( args0, args1, args2 ); : Condition must evaluate to a Boolean or boolean.


Creo que todo lo he escrito como el ejemplo exceptuando el ITEM que es una "piedra" (nombre único) y uno se desmotiva al ver que no puede resolver solo el problema.

Espero que me ayuden. Gracias de antemano.


Arriba
 Perfil  
 
NotaPublicado: 19 Sep 2014 19:09 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1855
No sé si habrá más problemas pero, para empezar, en el primer if los paréntesis están descompensados, te falta cerrar uno.


Arriba
 Perfil  
 
NotaPublicado: 19 Sep 2014 19:56 
Desconectado
Aventurero
Aventurero

Registrado: 18 Sep 2014 13:25
Mensajes: 5
Gracias por contestar pero eso solo a sido una errata mía al escribirlo aquí.

¿A nadie le ha sucedido lo mismo que a mí, no?

Trasteare con un mundo de 0 utilizando esos comandos a ver si doy con ello.
Si diera con el por qué os aviso.


Arriba
 Perfil  
 
NotaPublicado: 19 Sep 2014 20:35 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1855
Para el problema con capturar el "ir este" no tengo una respuesta ahora mismo, pero creo que sé lo que pasa con la piedra.

El ejemplo no busca un único objeto, sino cualquiera que tenga una determinada propiedad con valor verdadero (de tipo bool, que el autor se ha encargado de asignar a los objetos que sean de tipo bebida). Por eso usa un bucle y tal...
documentacion del ejemplo escribió:
usamos una propiedad “bebida” para marcar esos objetos

Dentro del bucle:
Código:
Item cosa = inv.get(i);
if ( get ( cosa , "bebida" ) )

Este get() obtiene, del primer argumento, la propiedad indicada en el segundo argumento. Es decir, la propiedad "bebida" de lo que haya en cosa en ese momento del bucle.

En tu caso, estás comprobando el valor de la propiedad "piedra". Entiendo que no es lo que quieres y que no existe una propiedad "piedra" en tus objetos.

victorcastanedose escribió:
no salga de una habitación a otra si no tiene un Item en específico

Te puedes ahorra el bucle y simplemente...
Código:
Inventory inv = jugador.getInventory();
if(inv.contains( item("piedra") )){}


Dicho esto, aunque el contains ya se encarga de todo y es lo recomendable en este caso, por completar la respuesta... lo que creo que querías poner en el segundo if es:
Código:
if( equals(cosa, item("piedra")) ){}


Arriba
 Perfil  
 
NotaPublicado: 19 Sep 2014 22:08 
Desconectado
Aventurero
Aventurero

Registrado: 18 Sep 2014 13:25
Mensajes: 5
Muchas gracias dddddd, creo que sin querer me has contestado las dos cosas.

este codigo nose si es el adecuado pero por lo que veo funciona

Código:
if (equals(verb, "ir") && args.contains(" este"))


dejo un espacio en " este" porque sino me daba problemas con "oeste" ya que contiene este tambien.

¿Es la mejor forma de hacerlo? de momento me da resultado si alguien sabe algo mejor que me comente.

Saludos y gracias.


Arriba
 Perfil  
 
NotaPublicado: 20 Sep 2014 08:15 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Para manejar las salidas de una estancia, en este hilo hice una consulta similar.


viewtopic.php?f=31&t=5573

Te pondria un ejemplo, pero no estoy en casa y el wifi de donde estoy tiembla.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 20 Sep 2014 11:15 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
La forma mejor de hacerlo (en el sentido de que no tienes que andar comparando cadenas y preocupándote de espacios y cosas así) probablemente sea con un evento, como en el ejemplo que enlaza edlobez. Algo como:

Código:
void beforeExit ( Mobile aCreature , Path path )
{
    if ( path.equals( self.getExitMatchingArguments("oeste") ) )
    {
        if ( !aCreature.hasItem( item("piedra") )
        {
            aCreature.write("No se puede salir de aquí sin tener la piedra.\n");
            end();
        }
     }
}


Pero tampoco hay nada malo en lo que has hecho tú, debería funcionar perfectamente. Siempre hay más de una forma de hacer las cosas. Eso sí, ten en cuenta que los argumentos podrían ser "oeste" a secas, sin un espacio delante. Eso lo puedes arreglar con una expresión regular, o bien con un workaround como:

Código:
if (equals(verb, "ir") && (" "+args).contains(" este"))

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 20 Sep 2014 11:30 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1855
La técnica del args.contains puede ser peligrosa. Por ejemplo, "ir estercolero" se daría por equivalente a "ir este".

Sí, es un ejemplo rebuscado, pero mejor evitar sorpresas. Si hay herramientas que permiten trabajar con los conceptos exactos (en este caso, habitaciones y caminos), mejor usarlas que parsear a mano.


Arriba
 Perfil  
 
NotaPublicado: 20 Sep 2014 11:46 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Sí, es cierto. Lo que pasa es que la documentación va introduciendo ejemplos paso a paso. Y claro, en el momento en el que aparece ese ejemplo, no se ha hablado todavía de eventos, ni de cómo acceder a los caminos de las habitaciones, ni nada de eso.

Pero una vez conocido todo lo que hay en AGE, lo ideal es no tener que parsear a mano nunca. En una aventura que no haga cosas muy específicas con el parsing (combinaciones para una caja fuerte o cosas del estilo) normalmente no debería hacer falta hacerlo.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 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 4 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