CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 28 Sep 2020 20:53

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 21 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
 Asunto: parsercommands
NotaPublicado: 11 May 2009 16:23 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Creo que con un poco de suerte terminaré mi aventura cuando Al-* termine la documentación. :lol:

A ver...
Me he dado cuenta que los parsecommand de dos objetos, sólo "saltan" cuando en el comando se incluyen dos objetos.
Sí, sé que me lo habías explicado, pero como en todo, hasta que no lo he experimentado por mi misma nohe terminado de comprenderlo.

En la aventura hay sillón en la sala principal del castillo, y dado que Age no contempla la posibilidad de que el jugador se pueda subir encima de otro objeto, he creado una localidad "sala_arriba", para que las reglas de la sala sean distintas según esté el jugador, encima o no, del sillón.

Ese sillón, tiene pues dos estados principales, dependiendo de si está en una u otra localidad.
Las cosas que se pueden hacer con el sillón son más bien pocas porque sólo lo utilizo como medio de acceso y alcance de otros objetos. Así pues se puede "empujar" , "subir a él " y "bajar de él".

Mi idea ha sido iniciar la estructura de ifs, con esta primera premisa.

Código:
SI  sillón en sala
   empujar
      empujas el sillón
    subir
       te subes al sillón.

SI NO
   bajar
       te bajas del sillón


Esto es lenguaje natural y lo demás son tonterías. :roll:

Bueno, pues "empujar" lo tengo que capturar con el parsercommand de dos objetos, porque el jugador puede indicar una dirección concreta. pero tengo que poner otro parsecommand para el caso en el que el jugador no la indique y por lo pronto una sentencia que en principio parecía muy simple se empieza a complicar bastante. :roll:

¿Sería muy difícil crear un parseCommand de dos objetos, que reconozca también los comandos con un único objeto y los casos de acciones reversibles?
Algo así:

Código:
void parseCommandAll_In_One ( Mobile aPlayer , String verb , String args1 , String args,  String args2 , Entity obj1, Entity obj2, Entity otherObj)


Chulo eh! :lol:
Total cada argumento guardaría el mismo valor que en los originales parsecommands, y no pasa nada si un argumento se queda sin valor... ¿no?

¿Sería posible?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 11 May 2009 16:38 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Sí, se podría hacer eso. Sería cosa de crear un parseCommand que se ejecutara siempre que el jugador introdujese un comando referido a un objeto y *opcionalmente* a otro, y que te diese el otro objeto en un argumento si existe, o null si no existe. Si te parece interesante, puedo crearlo.

También puedes conseguir tú misma ese efecto, mientras no haya ese parseCommand, llamando a uno desde el otro. O sea, creando el de un solo objeto, y haciendo que simplemente llame al de dos objetos.

Y de todos modos, que conste que en el problema que tú planteas las direcciones no son entidades. Es decir, si quieres algo como

"empuja el sillón hacia el norte",

el parseCommand que se lanzaría sería de un solo objeto, ya que "norte" no se refiere a una entidad (a no ser que hayas definido una puerta que tenga como nombre de referencia "norte", en cuyo caso sí, se ejecutaría el de dos objetos ya que sería como si dijeras "empuja el sillón hacia la puerta").

_________________
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  
 
 Asunto:
NotaPublicado: 11 May 2009 16:51 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Si te parece interesante, puedo crearlo.


Todo lo que sea simplificar la labor del programador es interesante. :D


Citar:
También puedes conseguir tú misma ese efecto, mientras no haya ese parseCommand, llamando a uno desde el otro. O sea, creando el de un solo objeto, y haciendo que simplemente llame al de dos objetos.


Hmm....
¿Desde el objeto, o desde el mundo?
Bueno, si puedes hacer lo otro mejor, pero me gustaría ver un ejemplo aplicado de lo que dices.



Citar:
Y de todos modos, que conste que en el problema que tú planteas las direcciones no son entidades. Es decir, si quieres algo como

"empuja el sillón hacia el norte",


No, esa era la historia del baúl. :D
Pero como te he dicho, se trata de que el jugador alcance objetos que no puede coger o ver desde el suelo, así que los comandos son tipo :
"empuja sillón hacia el armario"
"empuja sillón hacia la librería"


Muchas gracias y espero impaciente, esos cambios. :)
Jenesis


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 11 May 2009 17:24 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
jenesis escribió:
Todo lo que sea simplificar la labor del programador es interesante. :D


Bueno, pero es que todo depende de lo que entendamos por "simplificar". Para ti, simplificar suele ser tener que escribir menos código. Para mí, es más bien tener que recordar menos cosas. Un sistema que me da un puñado pequeño de operaciones muy sencillitas, de forma que combinándolas se puede hacer de todo, a mí me parece más simple que uno que me da un montón de opciones distintas que me permitirían hacer un montón de cosas en una línea de código en lugar de diez, pero que no voy a recordar :D

Supongo que ni una cosa es más simple ni la otra, sino que depende del tipo de programador (de hecho hay lenguajes que tienden más hacia cada una de esas dos "tendencias"). En todo caso, como añadir un parseCommand nuevo no me cuesta nada, y no afecta en nada a los que ya hay, pues lo dicho... no tengo inconveniente en crearlo, luego ya quien quiera lo usará y quien no no, según la situación y las preferencias de cada cual.


Citar:
Hmm....
¿Desde el objeto, o desde el mundo?
Bueno, si puedes hacer lo otro mejor, pero me gustaría ver un ejemplo aplicado de lo que dices.


Desde el objeto. Sería así:

Código:
void parseCommand ( Mobile aCreature , String verb , String args )
{
  if ( verb.equalsIgnoreCase("empujar") )
  {
      parseCommandObj1 ( aCreature , verb , args1 , "" , null );
  }
}


Con esto, si te mandan un parseCommand de un solo objeto, llamas al de dos objetos, pasándole como primer objeto aquél al que se refería el jugador en el comando, y como segundo objeto null (valor que significa "ningún objeto").



Citar:
No, esa era la historia del baúl. :D
Pero como te he dicho, se trata de que el jugador alcance objetos que no puede coger o ver desde el suelo, así que los comandos son tipo :
"empuja sillón hacia el armario"
"empuja sillón hacia la librería"


OK, entonces efectivamente necesitas el parseCommand de dos objetos, o ese parseCommand "múltiple" en cuanto lo cree.


Citar:
Muchas gracias y espero impaciente, esos cambios. :)


Yeah, los tendrás enseguida. Siento ir un poco lento con los cambios estos días, pero ando bastante liado. Espero tener tiempo esta noche o la de mañana para implementar varias de las cosas pendientes.

_________________
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  
 
 Asunto:
NotaPublicado: 13 May 2009 08:22 
Desconectado
xyzzy

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

Desde el objeto. Sería así:

Código:
void parseCommand ( Mobile aCreature , String verb , String args )
{
  if ( verb.equalsIgnoreCase("empujar") )
  {
      parseCommandObj1 ( aCreature , verb , args1 , "" , null );
  }
}




Lo he intentado de esta manera:

Código:
      if(verb.equalsIgnoreCase("empujar"))
      {
      parseCommandObj1 ( aPlayer , verb , args1 , "" , null );

         if(obj2==world.getItem("aparador"))
         {


No sé, si es que lo he aplicado mal o es que algo falla.

Código:
self: [ eu.irreality.age.Item:30000037:la silla ]
verb: empujar
args: silla
Error de sintaxis en el código BeanShell.
En concreto: Sourced file: inline evaluation of: ``parseCommand( arg0, arg1, arg2);'' : Command not found: parseCommandObj1( eu.irreality.age.Player, java.lang.String, java.lang.String, java.lang.String, null ) : at Line: 23 : in file: .../sala_silla.bsh : parseCommandObj1 ( aPlayer , verb , arg1 , "" , null )
Información adicional BSH:Rutina: parseCommand
Llamador: [ eu.irreality.age.Item:30000037:la silla ]
Argumentos: [ eu.irreality.age.Player:20000005:el guerrero  ] empujar silla



No puedo esperar, así que lo voy a hacer con los dos parseCommands.

Un saludo
Jenesis


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 13 May 2009 08:37 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
En el error dice que no has definido el parseCommandObj1.

La idea que yo decía es definir los dos, pero en uno de ellos sólo llamas al otro, mientras que en el otro haces el procesamiento "de verdad", por así decirlo. Lo que te ahorraría es repetir el código que procesa la acción de empujar; pero no te ahorra declarar los dos métodos (para poder declarar un solo método tendría que hacer yo este cambio).

Lo que parece que has hecho es definir un parseCommand y llamar a otro pero que no existe, eso no funciona porque llamar a un método que no existe no es correcto, claro.

_________________
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  
 
 Asunto:
NotaPublicado: 13 May 2009 09:23 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
En el error dice que no has definido el parseCommandObj1.

La idea que yo decía es definir los dos, pero en uno de ellos sólo llamas al otro, mientras que en el otro haces el procesamiento "de verdad", por así decirlo. Lo que te ahorraría es repetir el código que procesa la acción de empujar; pero no te ahorra declarar los dos métodos .


Entiendo.
Bueno, lo dejo tal cual lo tengo, no me merece la pena intentar nuevas formas siendo que vas a hacer el otro parseCommand.

Un saludo y gracias
Jenesis


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 20 May 2009 09:26 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Sólo quería decir que el nuevo parseCommand parece no dar problemas por ahora.
De todos modos, como de ahora en adelante no voy a usar otro para los objetos de la clase item, si algo falla me enteraré enseguida. :)

Un saludo y gracias.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 20 May 2009 12:02 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
El nuevo parseCommand no es reversible ¿verdad?

Bueno, tengo un problema cuando invierto el orden de los objetos, tal vez es que no lo estoy haciendo del todo bien.

Este código está implementado en el objeto escudo.

Código:
void parseCommandGeneric ( Mobile aPlayer , String verb , String args1 , String args2, Entity obj1 , Entity obj2 , boolean goesFirst )
{
aPlayer.write("\nverbo_escudo  " + verb + "\nargs1 " + args1 + "\nargs2 "+  args2 + "\nobj1 " + obj1 + "\n" + "\nobj2 " + obj2 + "\n"+ "\ngoesFirst " + goesFirst + "\n"  );

   if(verb.equalsIgnoreCase("limpiar") && obj2.equals(world.getItem("algodon")))
   {
   aPlayer.write("limpias el escudo  con el algodon\n");
   end();
    }
}



La salida desde el juego es la que sigue.

Código:
COMANDO>>  limpia escudo  algodon

verbo_escudo  limpiar
args1 escudo
args2 algodon
obj1 [ eu.irreality.age.Item:30000059:el escudo  ]

obj2 [ eu.irreality.age.Item:30000058:el algodón ]

goesFirst true
Limpias el escudo  con el algodon


Código:
COMANDO>>  limpia algodon escudo

verbo_escudo limpiar
args1 algodon
args2 escudo
obj1 [ eu.irreality.age.Item:30000058:el algodón ]

obj2 [ eu.irreality.age.Item:30000059:el escudo ]

goesFirst false

verbo_escudo limpiar
args1 algodon escudo
args2
obj1 [ eu.irreality.age.Item:30000059:el escudo ]

obj2 null

goesFirst true
bsh.TargetError found at parseCommandGeneric(), command was limpiaralgodon escudo , entity number [ eu.irreality.age.Item:30000059:el escudo ], second object was [ eu.irreality.age.Item:30000059:el escudo ], error was Sourced file: inline evaluation of: ``parseCommandGeneric( arg0, arg1, arg2, arg3, arg4, arg5, arg6);'' : at Line: 5 : in file: /salon_escudo .bsh : obj2 .equals ( world .getItem ( "algodon" ) )

Called from method: parseCommandGeneric : at Line: 1 : in file: inline evaluation of: ``parseCommandGeneric( arg0, arg1, arg2, arg3, arg4, arg5, arg6);'' : parseCommandGeneric ( arg0 , arg1 , arg2 , arg3 , arg4 , arg5 , arg6 )
Target exception: java.lang.NullPointerException: Null Pointer in Method Invocation

verbo_mundo: eu.irreality.age.World@1427e6e
verb: limpiar
args: algodon escudo
No eres la chacha del castillo.


Ocurre lo mismo con cualquier otro objeto o argumento, siempre que se incluya como segundo objeto el escudo.

Un saludo y gracias.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 20 May 2009 12:12 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
La cosa es que es reversible, en el sentido de que coge tanto acciones en las que el escudo vaya primero como en las que vaya después. Pero obj1 siempre es el primer objeto que ha tecleado el jugador, y obj2 es el segundo.

O sea que en "limpiar algodón escudo", obj1 es el algodón y obj2 es el escudo, aunque lo estés implementando en el escudo.

De todas formas, viendo cómo lo has intentado usar, no sé... ¿crees que sería más intuitivo que obj1 siempre sea el objeto en el que defines el método, independientemente del orden en el que haya tecleado el comando el jugador?

Si lo crees, no me cuesta nada cambiarlo para que funcione así. Yo veo ambas soluciones parecidas, con sus ventajas e inconvenientes, no prefiero ni una ni la otra.

En todo caso, para que te funcione tal y como está ahora, simplemente tendrías que poner:

(obj2.equals(world.getItem("algodon")) || obj1.equals(world.getItem("algodon")))

y si no me equivoco ya funcionaría.

_________________
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  
 
 Asunto:
NotaPublicado: 20 May 2009 12:24 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
En todo caso, para que te funcione tal y como está ahora, simplemente tendrías que poner:

(obj2.equals(world.getItem("algodon")) || obj1.equals(world.getItem("algodon")))

y si no me equivoco ya funcionaría.


No te equivocas, y funciona perfectamente, sea cual sea el orden y los argumentos u objetos que se usen con el escudo. :)


Creo que es mejor que el obj1 sea siempre aquél en el que se captura la acción porque hacerlo de otro modo podría causar algún conflicto en el caso de que ambos objetos tuvieran su propio parseCommand ¿no?

Muchas gracias Al-K*


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 20 May 2009 12:29 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
jenesis escribió:
Creo que es mejor que el obj1 sea siempre aquél en el que se captura la acción porque hacerlo de otro modo podría causar algún conflicto en el caso de que ambos objetos tuvieran su propio parseCommand ¿no?



Bueno... la verdad es que no estoy muy segura ... :roll:
En los args, queda claro que el orden ha de ser el mismo de la frase, pero en lo otro... chico, como funciona bien tal como lo has hecho déjalo estar.

Gracias


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 09 Sep 2009 14:39 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Tengo un problema con el parseCommandGeneric o igual es que debería usar el parseOnContents, o es mi cabeza que se ha oxidado en las vacaciones, no sé.

Código:
COMANDO>>  coge la espada del barril

verbo_espada  coger
args1 la espada
args2 del barril
obj1 [ eu.irreality.age.Item:30000052:la espada ]

obj2 [ eu.irreality.age.Item:30000050:el barril ]

goesFirst true

verbo_barril  coger
args1 la espada
args2 del barril
obj1 [ eu.irreality.age.Item:30000052:la espada ]

obj2 [ eu.irreality.age.Item:30000050:el barril ]

goesFirst false

verbo_barril  coger
args1 la espada del barril
args2
obj1 [ eu.irreality.age.Item:30000050:el barril ]

obj2 null

goesFirst true
No tiene mucho sentido intentar coger el barril.


¿Tiene arreglo?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 14 Sep 2009 22:04 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
¿Te habrás olvidado de un end()?

De todas formas, ahora mismo estoy terminando de probar los parseCommandOnContents sobre dos objetos, en cuanto los tenga bien probados te los mando y serán la mejor solución para interactuar con dos objetos que pueden o no estar dentro de otros (en este caso uno está dentro de otro, y el otro no).

_________________
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  
 
 Asunto:
NotaPublicado: 14 Sep 2009 22:35 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
De todas formas, "coger X de Y" es un verbo predeterminado del AGE, así que no te debería hacer falta redefinir nada de nada (a no ser que lo que quieras hacer es capturar esa acción y que suceda algo si la haces).

_________________
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  [ 21 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