CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 22 Sep 2019 00:58

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 23 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 22 Jun 2011 14:52 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Siento ser tan pesada con el tema, pero ya he probado de muchas maneras, con varios parseCommands, etc y al final siempre termino en este:

En el objeto mundo:

Código:
void parseCommandOnContentsGeneric ( Mobile aCreature , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 )
{

    if(!equals(null,obj2)){
       Item obj1 = path1.get(0);
       Item obj2 = path2.get(0);
       aCreature.write("verb = "+verb+"\n");
       aCreature.write("obj1 = "+obj1.getTitle()+"\n");
       aCreature.write("obj2 = "+obj2.getTitle()+"\n");
       aCreature.write("path1 = "+path1.get(0).getTitle()+"\n");   
        aCreature.write("path2 = "+path2.get(0).getTitle()+"\n");
           }
     if(equals(null,path2)){
        Item obj1 = path1.get(0);
        aCreature.write("verb = "+verb+"\n");   
        aCreature.write("obj1 desde el segundo if = "+obj1.getTitle()+"\n");
        aCreature.write("path1 desde el segundo if = "+path1.get(0).getTitle()+"\n");
       }

}


Código:
Tu orden:  pon la cuchara en el plato
verb = poner
obj1 = cuchara
obj2 = plato
path1 = cuchara
path2 = plato
verb = poner
obj1 = cuchara
obj2 = plato
path1 = cuchara
path2 = plato
verb = poner
obj1 = cuchara
obj2 = plato
path1 = cuchara
path2 = plato
verb = poner
obj1 desde el segundo if = plato
path1 desde el segundo if = plato
Pones la cuchara en el plato.


Al final el resultado es el deseado , pero ¿por qué en el último caso el obj1 pasa a ser el plato?
También he probado con:
if ( !equals(null,obj2) && (equals(obj1,path1.get(0)) && equals(obj2,path2.get(0))) )
para el primer if y con:
if (equals(null,obj2) && equals(obj1,path1.get(0) ) )
para el segundo if, obteniendo los mismos resultados.

¿Son de fíar estas comprobaciones?
Queda claro que al final no siempre el obj1 acaba siendo el que yo quiero. :roll:
¿Puede darse el caso de que me llegue a fallar en alguna situación?

He probado a usar el containedItemsInScope, pero no funciona del todo bien.
Está el problema aquel que ya se comentó aquí en el foro, cuando intentas sacar un contenido de un contenedor que no es el suyo coges el contenedor, y si intentas meter algo en un contenedor que está a su vez metido en otro, no lo ve y no lo mete.
Lo he pensado y creo que no voy a terminar de controlar esta historia. :oops:

¿Qué método hace que un contenido se mueva a la par que su contenedor?
¿Se puede acceder a él desde el código'
¿Es algún tipo de relación entre objetos?
Me vendría bien que esa relación existiera porque no solo me serviría para mover contenidos y contenedores sino que también me serviría para mover objetos unidos pero no "mezclados", me refiero al tema de los objetos atados entre sí.
Con eso y mis cuatro propiedades creo que podría intentar hacer algo al respecto y si lo consigo, no más parseCommandsOncontents, y no más preguntas al respecto.
Creo que solo por eso, merece la pena intentarlo. :)

Saludos
Jenesis

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2011 15:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
jenesis escribió:
Al final el resultado es el deseado , pero ¿por qué en el último caso el obj1 pasa a ser el plato?
También he probado con:
if ( !equals(null,obj2) && (equals(obj1,path1.get(0)) && equals(obj2,path2.get(0))) )
para el primer if y con:
if (equals(null,obj2) && equals(obj1,path1.get(0) ) )
para el segundo if, obteniendo los mismos resultados.

¿Son de fiar estas comprobaciones?
Queda claro que al final no siempre el obj1 acaba siendo el que yo quiero. :roll:
¿Puede darse el caso de que me llegue a fallar en alguna situación?

He estado mirando y en este caso no es que te hayas dejado alguna comprobación, es que habemus bug.

Por lo que veo en el código, en su momento no pensé qué debería suceder si el jugador teclea un comando mencionando dos entidades, pero la ejecución del parseCommand para dos entidades se deja pasar (no se hace end()) y después se captura esa misma orden para una entidad.

Dado que simplemente no pensé en la posibilidad de ese caso, el comportamiento es "el que ha coincidido", que es el siguiente: al haber dejado pasar el parseCommand para dos entidades, se supone que sólo se ha mencionado una entidad, entonces AGE hace matching para saber cuál es esa entidad... y como realmente matchean las dos, pues con la primera que pilla (que en este caso ha coincidido que es el plato) lanza los parseCommands de una sola entidad (que incluyen el generic poniendo obj2 = null) y no lanza los de la otra.

Este bug no lo habíamos visto antes porque creo que sólo se manifiesta en los parseCommands de mundo, y sólo si uno deja pasar la acción para dos entidades pero luego se fija en el caso de una sola (sea con generic o no), con lo cual seguramente no se había dado el caso hasta ahora, es fácil programar aventuras enteras sin que aparezca nunca al requerirse que concurran varios factores.

Creo que el bug es sencillo y rápido de arreglar, lo que pasa es que hay que pensar cuál es realmente el comportamiento deseado en este caso: que no se ejecute el parseCommand con una sola entidad para ninguna de las dos (ni para la cuchara ni para el plato) al saber que hay dos entidades, o bien que se ejecute con las dos (es decir, que se ejecute con obj1=plato y obj2=null, pero también con obj1=cuchara y obj2=null).

Yo creo que seguramente sea más cómoda la primera, parece más intuitivo que si el jugador mete dos entidades sólo se ejecuten los parseCommands de dos entidades, y que el generic se ejecute sólo con las dos rellenas y no con una a null, ¿no? La segunda opción a cambio podría tener la ventaja de hacer un poco más fácil el caso en que sólo te importa una entidad pero te da igual que haya otra; pero no sé si es ventaja suficiente.

jenesis escribió:
He probado a usar el containedItemsInScope, pero no funciona del todo bien.
Está el problema aquel que ya se comentó aquí en el foro, cuando intentas sacar un contenido de un contenedor que no es el suyo coges el contenedor, y si intentas meter algo en un contenedor que está a su vez metido en otro, no lo ve y no lo mete.

Esto tendríamos que mirarlo más en detalle, es posible que sea cosa del mismo bug o es posible que sea cosa de cómo lo programaste.

jenesis escribió:
¿Qué método hace que un contenido se mueva a la par que su contenedor?
¿Se puede acceder a él desde el código'
¿Es algún tipo de relación entre objetos?
Me vendría bien que esa relación existiera porque no solo me serviría para mover contenidos y contenedores sino que también me serviría para mover objetos unidos pero no "mezclados", me refiero al tema de los objetos atados entre sí.

Los métodos normales que mueven un objeto ya mueven también su contenido, eso está incluido en el concepto de "ser un contenedor".

Por ejemplo, si tienes una caja con una perla dentro y pones

Código:
item("caja").moveTo(room("baño"));


la caja se mueve al baño con la perla que tiene dentro, no hace falta mover los dos objetos por separado.

_________________
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: 22 Jun 2011 16:42 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:

Este bug no lo habíamos visto antes porque creo que sólo se manifiesta en los parseCommands de mundo, y sólo si uno deja pasar la acción para dos entidades pero luego se fija en el caso de una sola (sea con generic o no), con lo cual seguramente no se había dado el caso hasta ahora, es fácil programar aventuras enteras sin que aparezca nunca al requerirse que concurran varios factores.


No creas... yo desde el principio estoy trabajando con este mismo parseCommand en el objeto mundo, de hecho la acción "coger" y "misacar" en 15 meses ya está capturada de forma general de ese modo en el mundo, así que cada vez que se coge algo de un contenedor, lo que se muestra aquí pasa sin remedio.
Otra cosa es que yo me enterase... :oops:

Citar:
jenesis escribió:
He probado a usar el containedItemsInScope, pero no funciona del todo bien.
Está el problema aquel que ya se comentó aquí en el foro, cuando intentas sacar un contenido de un contenedor que no es el suyo coges el contenedor, y si intentas meter algo en un contenedor que está a su vez metido en otro, no lo ve y no lo mete.

Esto tendríamos que mirarlo más en detalle, es posible que sea cosa del mismo bug o es posible que sea cosa de cómo lo programaste.


Yo he probado con un mundo base, sin usar parseCommand de ningún tipo y su comportamiento era el que digo.
Lo miraremos cuando tengas tiempo.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2011 16:50 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
jenesis escribió:
No creas... yo desde el principio estoy trabajando con este mismo parseCommand en el objeto mundo, de hecho la acción "coger" y "misacar" en 15 meses ya está capturada de forma general de ese modo en el mundo, así que cada vez que se coge algo de un contenedor, lo que se muestra aquí pasa sin remedio.
Otra cosa es que yo me enterase... :oops:

Pero en el caso de esas acciones, probablemente las capturas y haces un end(), impidiendo que las llamadas "buggeadas" se hagan. No sólo se tiene que dar el caso de usar el parseCommand del mundo, sino de que el jugador teclee dos entidades pero ese parseCommand no haga end() cuando le llegan esas dos entidades, y además que haga algo cuando le llega sólo una. De esas tres condiciones, seguramente alguna de las dos últimas no se cumplió en "Meses" (también puede que sí y que no te dieras cuenta, pero no necesariamente).

_________________
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: 22 Jun 2011 17:04 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Pero en el caso de esas acciones, probablemente las capturas y haces un end(), impidiendo que las llamadas "buggeadas" se hagan. No sólo se tiene que dar el caso de usar el parseCommand del mundo, sino de que el jugador teclee dos entidades pero ese parseCommand no haga end() cuando le llegan esas dos entidades, y además que haga algo cuando le llega sólo una. De esas tres condiciones, seguramente alguna de las dos últimas no se cumplió en "Meses" (también puede que sí y que no te dieras cuenta, pero no necesariamente).


Lo he estado mirando..
La mayoría tienen un end() no sé si por casualidad, o tal vez porque me di cuenta que de este modo no me fallaba nunca. El caso es que después de capturar la acción hago un forceCommand a "coger" que no es muy lógico, y luego pongo el end().
Hay un caso en el que no lo he hecho, el bloque que controla que al protagonista se le caiga algo al llevar varias cosas en el inventario y coger otra, ahí no hay end().

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2011 17:42 
Desconectado
Archivero
Archivero
Avatar de Usuario

Registrado: 21 Abr 2011 17:46
Mensajes: 278
Al-Khwarizmi escribió:
Creo que el bug es sencillo y rápido de arreglar, lo que pasa es que hay que pensar cuál es realmente el comportamiento deseado en este caso: que no se ejecute el parseCommand con una sola entidad para ninguna de las dos (ni para la cuchara ni para el plato) al saber que hay dos entidades, o bien que se ejecute con las dos (es decir, que se ejecute con obj1=plato y obj2=null, pero también con obj1=cuchara y obj2=null).

Yo creo que seguramente sea más cómoda la primera, parece más intuitivo que si el jugador mete dos entidades sólo se ejecuten los parseCommands de dos entidades, y que el generic se ejecute sólo con las dos rellenas y no con una a null, ¿no? La segunda opción a cambio podría tener la ventaja de hacer un poco más fácil el caso en que sólo te importa una entidad pero te da igual que haya otra; pero no sé si es ventaja suficiente.


Pues yo no lo tengo muy claro, pero creo que es mejor la segunda opción, porque si no estaría funcionando el parsecommand de una entidad con un objeto siempre que lo acompañamos de cualquier otro objeto excepto uno que "matchee", en cuyo caso no se ejecutaría, lo cual no es nada claro. Lo mejor es ejecutar el parsecommand de un objeto para las dos entidades. Así podemos capturar un objeto en el parsecommand de una entidad siempre, sin precuparnos de definir también el de dos entidades por si "matchea" otra.


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2011 18:56 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
jenesis escribió:
La mayoría tienen un end() no sé si por casualidad, o tal vez porque me di cuenta que de este modo no me fallaba nunca.

Tienen un end() porque estás redefiniendo las acciones, para lo que estabas haciendo no tendría ningún sentido no usar el end().

En realidad es normal, si te fijas los casos de uso más comunes son o bien capturar con end(), o bien no hacer nada de nada. Hacer algo pero sin end() tiene sentido cuando se quiere mantener el comportamiento por defecto pero a la vez hacer alguna otra cosa (cambiar propiedades, etc.); cosa que sucede a veces pero es menos común (y sobre todo en tus aventuras, ya que tu estilo es redefinir todo a tu gusto). No creo que hasta ahora hayas hecho nada donde se manifieste el bug, simplemente por eso no había salido.

_________________
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: 22 Jun 2011 18:59 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
mistery escribió:
Pues yo no lo tengo muy claro, pero creo que es mejor la segunda opción, porque si no estaría funcionando el parsecommand de una entidad con un objeto siempre que lo acompañamos de cualquier otro objeto excepto uno que "matchee", en cuyo caso no se ejecutaría, lo cual no es nada claro. Lo mejor es ejecutar el parsecommand de un objeto para las dos entidades. Así podemos capturar un objeto en el parsecommand de una entidad siempre, sin precuparnos de definir también el de dos entidades por si "matchea" otra.

Ya, yo tampoco lo tengo muy claro. Como en casi todos estos temas de diseño, hay ventajas e inconvenientes de cada opción.

La segunda opción tiene, efectivamente, la ventaja que dices tú.

Sin embargo, también tiene inconvenientes. Por ejemplo, en el caso de capturar sin end() para asociar algo a la acción (mensaje, cambio de propiedades o lo que sea), el código se ejecutaría para las dos entidades. Esto puede fácilmente no ser el comportamiento deseado, sobre todo cuando uno está definiendo inocentemente una acción para una sola entidad: por ejemplo, si redefinimos "abrir" y el jugador pone "abrir puerta con llave", seguramente no queremos que se ejecute el parseCommand de "abrir puerta" y el de "abrir llave".

Es un tema complejo, sigo pensando pero al final puede que la mejor solución sea dar las dos opciones y que cada palo aguante su vela.

_________________
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: 23 Jun 2011 08:39 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Es un tema complejo, sigo pensando pero al final puede que la mejor solución sea dar las dos opciones y que cada palo aguante su vela.


Si tuviera entendederas suficientes para saber cómo funciona realmente el cotarro opinaría al respecto, pero me temo que mi cabeza ya está fosilizando y no da para más. :(

Si partimos del ejemplo que yo había puesto, entiendo que con la primera opción obj1 sería siempre la cuchara y nunca el plato ¿no?
Pero con la segunda opción ¿pasaría lo mismo?

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 23 Jun 2011 09:15 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Otra pregunta más.
Aquellos problemas que tenía con "sacar" y que me obligó a crear mi propia acción "misacar" ¿podrían estar relacionados con este bug?

De todos modos voy a esperar a una nueva versión con este bug arreglado para seguir peleándome con los contenedores y todas las acciones que les conciernen.

Saludos

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 23 Jun 2011 09:29 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
jenesis escribió:
Si partimos del ejemplo que yo había puesto, entiendo que con la primera opción obj1 sería siempre la cuchara y nunca el plato ¿no?
Pero con la segunda opción ¿pasaría lo mismo?

Efectivamente, con la primera opción obj1 sería siempre la cuchara, porque sólo habría una opción (suponiendo que la cuchara y el plato no estén contenidos en nada, si no ya sabes que se complica la cosa):

- Que obj1 fuese la cuchara y obj2 el plato.

En cambio, con la segunda opción habría todas las opciones, incluso sin que nada estuviese contenido en nada:

- Que obj1 fuese la cuchara y obj2 el plato.
- Que obj1 fuese la cuchara y obj2 null.
- Que obj1 fuese el plato y obj2 null.

jenesis escribió:
Otra pregunta más.
Aquellos problemas que tenía con "sacar" y que me obligó a crear mi propia acción "misacar" ¿podrían estar relacionados con este bug?

No, para nada, aquello era un comportamiento normal que no te gustaba, no era un bug.

Ninguno de los problemas que habías tenido con los contenedores hasta este post fueron por causa de este bug. Todos tenían una explicación, que te fui dando en cada post. Si alguno hubiese sido causa del bug, lógicamente no habría podido darte una explicación que no pasara por encontrar el bug, como ha sucedido con el de este post. Así pues, estoy seguro de que nunca te encontraste con el bug antes, a no ser que fuese en alguna situación que no llegaste a comentar en el foro.

_________________
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: 23 Jun 2011 10:17 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
He cambiado el parseCommandOnContentsGeneric del objeto mundo por un parseCommandOnContentsTwoObjects y un parseCommandOnContents.

Al contrario que en el generic , el dos objetos no me permite asignar un valor a obj1 como Item, y me muestra el siguiente mensaje.

Typed variable declaration : Typed variable: obj1 was previously declared with type: class eu.irreality.age.Entity : at Line: 149 : in file: inline evaluation of: ``//objeto mundo include("lib/noaccents.bsh"); String preprocessCommand ( Player . . . '' : Item obj1 = path1 .get ( 0 )

Imagino que será cosa de las diferencias entre ambos tipos de parsecommand, pero lo señalo aquí por si acaso.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 23 Jun 2011 10:32 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
No debería tener nada que ver con el cambio de parseCommand. Es un error relacionado con declaraciones de variables y/o tipos, y ambos parseCommand usan parámetros del mismo tipo (en particular, obj1 es un Entity en los dos casos), así que no veo motivo para que te falle con uno y con el otro no.

¿Puedes poner el código completo?

_________________
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: 23 Jun 2011 10:39 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
No debería tener nada que ver con el cambio de parseCommand. Es un error relacionado con declaraciones de variables y/o tipos, y ambos parseCommand usan parámetros del mismo tipo (en particular, obj1 es un Entity en los dos casos), así que no veo motivo para que te falle con uno y con el otro no.

¿Puedes poner el código completo?


Es el mismo que encabeza este hilo, lo único que he cambiado ha sido el parserCommand y los if que distinguían los casos de uno o dos objetos.
El error me lo marca en esta línea.

Item obj1 = path1.get(0);

Si lo cambio por
Item objA = path1.get(0);

Deja de producirse.

Por cierto dado que el foro está por completo descontrolado, estoy en el irc y voy a abrir o bien un foro o bien un grupo de noticias en Google, lo que sea, para poder estar comunicados.

Un saludo.
Jenesis

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 23 Jun 2011 11:14 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Algún gazapo has tenido que meter, porque yo tenía todavía aquí un mundo que creé textualmente según tu ejemplo (bueno, añadiendo un tenedor y una cuchara pero todo lo demás igual). Y ahora he hecho exactamente eso: crear un parseCommandOnContentsTwoObjects, copypastear tal cual el código que había en el generic anterior, y me funciona.

Me temo que estoy de acuerdo en lo de buscar otro medio que no sea el foro, porque la verdad es que simplemente no es practicable. Ahora bien, en el IRC prefiero no entrar en horas laborales. Suelo estar en el IRC entrada la tarde y por la noche, como sabes.

_________________
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  [ 23 mensajes ]  Ir a página 1, 2  Siguiente

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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM