CAAD
http://foro.caad.es/

Problema que no resuelvo
http://foro.caad.es/viewtopic.php?f=31&t=5687
Página 1 de 1

Autor:  victorcastanedose [ 19 Sep 2014 16:43 ]
Asunto:  Problema que no resuelvo

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.

Autor:  dddddd [ 19 Sep 2014 19:09 ]
Asunto:  Re: Problema que no resuelvo

No sé si habrá más problemas pero, para empezar, en el primer if los paréntesis están descompensados, te falta cerrar uno.

Autor:  victorcastanedose [ 19 Sep 2014 19:56 ]
Asunto:  Re: Problema que no resuelvo

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.

Autor:  dddddd [ 19 Sep 2014 20:35 ]
Asunto:  Comprobar si un objeto está en el inventario.

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")) ){}

Autor:  victorcastanedose [ 19 Sep 2014 22:08 ]
Asunto:  Re: Problema que no resuelvo

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.

Autor:  edlobez [ 20 Sep 2014 08:15 ]
Asunto:  Re: Problema que no resuelvo

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.

Autor:  Al-Khwarizmi [ 20 Sep 2014 11:15 ]
Asunto:  Re: Problema que no resuelvo

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"))

Autor:  dddddd [ 20 Sep 2014 11:30 ]
Asunto:  Re: Problema que no resuelvo

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.

Autor:  Al-Khwarizmi [ 20 Sep 2014 11:46 ]
Asunto:  Re: Problema que no resuelvo

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.

Página 1 de 1 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/