CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Jul 2018 08:32

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 49 mensajes ]  Ir a página Anterior  1, 2, 3, 4  Siguiente
Autor Mensaje
NotaPublicado: 22 Dic 2010 12:34 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
El before y el after en AGE existen... son el parseCommand y los eventos.


Lo último que ejecuta la acción "poner", es imprimir la frase "pones objeto en objeto".
Si el objeto es un container y en uno de esos eventos se te ocurre describir que lo cierras, hagas lo que hagas lo último que se imprime sigue siendo "Pones el objeto en el containeer" y da lo mismo que el objeto sea una granada y que el dichoso container vuele por los aires, lo último que se imprime es "Pones el objeto dentro del container".
En mi caso me ha bastado con editar esa frase y dejarla en "Ahora el objeto está dentro del container", pero si en vez de meter un sombrero de mujer, hubiera metido una granada la única forma de arreglarlo hubiera sido enmudeciendo al parser.
Me gustaría tener un ejemplo de before, para este caso.

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 12:37 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Si en esa acción pones un end(), no se debería imprimir ningún mensaje... si pones un end() y aun así sale el mensaje después del código que tú has definido, es que hay un bug. ¿Sucede eso?

_________________
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 Dic 2010 13:12 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Si en esa acción pones un end(), no se debería imprimir ningún mensaje... si pones un end() y aun así sale el mensaje después del código que tú has definido, es que hay un bug. ¿Sucede eso?


Bueno, realmente debería haber dicho "after", pero de todos modos si lo hago tal como dices, la acción no se ejecuta, me quedo con la granada en la mano.
Bueno, en el caso de la granada no importa, pero en el caso de que yo quiera que la caja se cierre y que el sombrero se quede dentro, seguimos en las mismas, el mensaje se imprime después, o lo edito, o lo borro. Yo lo que quiero es un after que se ejecute después de la acción no antes, y la acción se cumple cuando se imprime ese mensaje.
Yo querría algo como esto:

>mete el sombrero en el baul
Metes el sombrero en el bául.
Al meter el sombrero la tapa cede y cae pillándote los dedos.. Ouch!

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 13:27 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Eso es un evento:

Código:
void onPutInside ( Mobile aCreature , Item thing , Item container )
{
   aCreature.write("Metes el sombrero en el baúl.\n");
   aCreature.write("Al meter el sombrero la tapa cede y cae pillándote los dedos.. Ouch!\n");
   end();
}


La única diferencia con lo que entiendo que es el after de inform es que el evento va antes de la impresión del mensaje, así que si quieres que se imprima el mensaje por defecto y después el mensaje del evento, tienes que poner tú el mensaje por defecto en el código. Pero esto si te acuerdas es porque me lo pediste en su momento (al principio estaba de la otra manera, o sea, como entiendo que dices que era el after de inform... :D) pero querías que el evento pudiese "enmudecer" totalmente al parser (afectando pues al mensaje por defecto) y por eso me pediste ese cambio y a mí me pareció razonable.

_________________
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 Dic 2010 13:32 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Eso es un evento:

Código:
void onPutInside ( Mobile aCreature , Item thing , Item container )
{
   aCreature.write("Metes el sombrero en el baúl.\n");
   aCreature.write("Al meter el sombrero la tapa cede y cae pillándote los dedos.. Ouch!\n");
   end();
}


La única diferencia con lo que entiendo que es el after de inform es que el evento va antes de la impresión del mensaje, así que si quieres que se imprima el mensaje por defecto y después el mensaje del evento, tienes que poner tú el mensaje por defecto en el código. Pero esto si te acuerdas es porque me lo pediste en su momento (al principio estaba de la otra manera, o sea, como entiendo que dices que era el after de inform... :D) pero querías que el evento pudiese "enmudecer" totalmente al parser (afectando pues al mensaje por defecto) y por eso me pediste ese cambio y a mí me pareció razonable.


O no me entiendes o seguramente no me explico... vaya dos días que llevamos. :lol:
Mejor lo dejamos para cuando se de un caso "real" que hoy no estoy muy inspirada para poner ejemplos. :lol:

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 13:35 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
A ver, tú quieres que

1. la acción se ejecute de forma normal (o sea, que en el modelo de mundo, el sombrero pase a estar en el baúl)
2. se imprima el mensaje normal ("metes el sombrero en el baúl")
3. se imprima un mensaje personalizado (y tal vez se haga algo más, como que se cierre el baúl).

El código que he puesto hace eso (no le he puesto lo de cerrar el baúl, pero se le podría añadir antes del end()).

¿No era eso a lo que te referías?

_________________
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 Dic 2010 13:37 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
A ver, tú quieres que

1. la acción se ejecute de forma normal (o sea, que en el modelo de mundo, el sombrero pase a estar en el baúl)
2. se imprima el mensaje normal ("metes el sombrero en el baúl")
3. se imprima un mensaje personalizado (y tal vez se haga algo más, como que se cierre el baúl).

El código que he puesto hace eso (no le he puesto lo de cerrar el baúl, pero se le podría añadir antes del end()).

¿No era eso a lo que te referías?


Pero si pongo un end() en la accion poner, el sombrero no se introduce en el bául.
Me quedo con él en la mano. ¿es que no funciona así?

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 13:39 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
jenesis escribió:
Pero si pongo un end() en la accion poner, el sombrero no se introduce en el bául.
Me quedo con él en la mano. ¿es que no funciona así?


Funciona como dices si lo que redefines es el parseCommand. Si redefines el evento, no. Fíjate que el nombre del método que he puesto es onPutInside y no parseCommand. El evento va después de que se produzca la acción, es decir, de que el sombrero se meta en el baúl.

Los parseCommand corresponden a lo que serían (si no entiendo mal lo de inform) los "before", mientras que los eventos corresponden a grosso modo a los "after".

_________________
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 Dic 2010 13:44 
Desconectado
xyzzy

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

Funciona como dices si lo que redefines es el parseCommand. Si redefines el evento, no. Fíjate que el nombre del método que he puesto es onPutInside y no parseCommand. El evento va después de que se produzca la acción, es decir, de que el sombrero se meta en el baúl.

Los parseCommand corresponden a lo que serían (si no entiendo mal lo de inform) los "before", mientras que los eventos corresponden a grosso modo a los "after".


Vale, pues era yo la que no te entendía.
Ya veo... hay eventos no solo para contenedores sino también para coger las cosas.
Ok, ahora no me queda más remedio que darte la razón. :lol:

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 13:47 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Y después de darte la razón... (tardaré dos días en recuperarme del esfuerzo).

Al-Khwarizmi escribió:

> abrir puerta (y se abre la puerta): vale, esto es un éxito claro.
> saltar: se imprime un mensaje tipo "saltas arriba y abajo en el sitio". ¿Es un éxito?
> abrir puerta (y la puerta era sólo un dibujo en la pared, no es una puerta de verdad). Se imprime un mensaje tipo "¡te das cuenta de que la puerta era una ilusión!" ¿Es un éxito?
> abrir puerta (y abres la puerta, pero inmediatamente viene una racha de viento y la cierra). ¿Es un éxito?
> abrir puerta (y está cerrada con llave, se te muestra un mensaje al efecto). ¿Es un éxito?


Yo no sé si esto que voy a decir es muy complejo de programar, igual lo es tanto que no merece la pena ni pensar en ello.

Bien, hay dos tipos de acciones, las que tienen consecuencias y las que no.
Se trataría que para este caso en concreto, todas las acciones tuvieran al menos una consecuencia, poner la variable "verbable" a true. La idea es que si el objeto ha capturado esa acción, se aplica, si no la ha capturado, no se aplica.
Y lo de menos es si la acción al final se lleva a cabo o no. Estamos hablando de acciones que aún no se han ejecutado, solo se estudia si se pueden llevar acabo.
Claro, esa es otra dificultad a tener en cuenta, que no estoy diciendo que se ejecuten las acciones sino que se comprueben si el objeto las ha capturado.
En el caso de que las hayan capturado los dos, imprimir el mensaje de desambigüación, en el caso de que la haya capturado uno, ejecutar la acción sobre él sin preguntar.

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 14:06 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
jenesis escribió:
Yo no sé si esto que voy a decir es muy complejo de programar, igual lo es tanto que no merece la pena ni pensar en ello.

Bien, hay dos tipos de acciones, las que tienen consecuencias y las que no.
Se trataría que para este caso en concreto, todas las acciones tuvieran al menos una consecuencia, poner la variable "verbable" a true. La idea es que si el objeto ha capturado esa acción, se aplica, si no la ha capturado, no se aplica.
Y lo de menos es si la acción al final se lleva a cabo o no. Estamos hablando de acciones que aún no se han ejecutado, solo se estudia si se pueden llevar acabo.
Claro, esa es otra dificultad a tener en cuenta, que no estoy diciendo que se ejecuten las acciones sino que se comprueben si el objeto las ha capturado.
En el caso de que las hayan capturado los dos, imprimir el mensaje de desambigüación, en el caso de que la haya capturado uno, ejecutar la acción sobre él sin preguntar.


Supongo que en este contexto por que un objeto capture una acción estamos entendiendo que ejecute un método parseCommand de ese objeto (haya end() o no). Eso no sería excesivamente difícil de comprobar; pero creo que tampoco resuelve el problema (estos días digo mucho eso, ¿verdad? Es que la mayoría de estas cosas son posibilidades que ya fui considerando cuando diseñé el parser... :D)

El motivo por el que no lo resuelve es que tú puedes capturar una acción para hacer algo (sea una consecuencia en el mundo, o sea simplemente un mensaje, como "no puedes abrir la puerta porque está cerrada con llave")... pero también la puedes capturar para no hacer nada de nada. De hecho, eso lo haces todo el tiempo. Cuando pones

Código:
void parseCommand ( Mobile aCreature , String verb , String args )
{
  if ( equals ( verb , "encender" ) ) { ... ; end(); }
  else if ( equals ( verb , "apagar" ) ) { ... ; end(); }
}


para definir un televisor que se enciende y se apaga, en realidad el método parseCommand se está ejecutando para todos los verbos. Si pones "abrir televisor", también se ejecuta. Sólo que la ejecución consiste en comprobar el primer if, ver que no se cumple, comprobar el segundo if, ver que tampoco se cumple, y entonces no hacer nada y continuar. Pero capturarse, se ha capturado.

Así pues, el hecho de que se capture una acción (ejecutar un parseCommand) tampoco es indicativo de que la acción tenga sentido lingüísticamente (que es lo que se busca para desambiguar).

_________________
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 Dic 2010 14:53 
Desconectado
xyzzy

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

Así pues, el hecho de que se capture una acción (ejecutar un parseCommand) tampoco es indicativo de que la acción tenga sentido lingüísticamente (que es lo que se busca para desambiguar).


Es que no me sé explicar, o igual sigo sin entenderte, no sé.

El usuario introduce el comando que hace mención a los dos objetos.
>pon el huevo en el plato y batelo
El parser "pone el huevo en el plato" y después intenta aplicar la acción batir sobre uno de los dos objetos. ¿no?
Ahora por defecto se ejecuta sobre el último, a no ser que el género facilite la desambigüación.

Pues en vez de eso, lo que haría sería lo siguiente, que ya digo que no sé si será fácil de aplicar.
El parser primero comprueba si esa acción ha sido capturada por el personaje.
Luego comprueba si esa acción ha sido capturada por el huevo y pone huevo.verbable a true
Luego comprueba si la acción ha sido capturada por el plato, y pone plato.verbable a false.
Si al terminar la comprobación ambos objetos son verbables, hay ambiguación, si ninguno de los dos lo es, también la hay, así que se imprime el mensaje para el usuario, y se añade un end() para que el parser no llegue hasta el mundo.
En el caso de que uno de los objetos sea verbable, se ejecuta la acción sobre el mismo.

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


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 15:56 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Ya, si yo te entendí (o eso creo); pero lo que te estoy diciendo es que es normal que un objeto ejecute código para todas las acciones, sin necesidad de que sean relevantes para ese objeto.

Imagínate que el plato tiene algo así:

Código:
public void parseCommand ( Mobile aCreature , String verb , String args )
{
   if ( equals ( verb , "romper" ) ) { aCreature.write("Rompes el plato violentamente contra el suelo.\n"; aCreature.removeItem(self); end(); }
}


Pues bien, si tú ahora pones

> pon el huevo en el plato y bátelo

y te preguntas "¿el plato está capturando la acción batir?", la respuesta en realidad es que sí. Poner "batir plato" ejecuta un código, que es el código de arriba, aunque no entre por el if porque no cumple la condición (el verbo no es romper). O sea, está ejecutando un código que no hace nada. Pero capturarse, se captura (con el concepto de capturar que dije arriba, o sea, "ejecutar algún código").

_________________
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 Dic 2010 16:06 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Al-Khwarizmi escribió:
y te preguntas "¿el plato está capturando la acción batir?", la respuesta en realidad es que sí. Poner "batir plato" ejecuta un código, que es el código de arriba, aunque no entre por el if porque no cumple la condición (el verbo no es romper). O sea, está ejecutando un código que no hace nada. Pero capturarse, se captura (con el concepto de capturar que dije arriba, o sea, "ejecutar algún código").


No se puede, pero si en lugar de parseCommand hubiera métodos de acción por objeto, sí que se podría y además te ahorrarías los if.

Ojo que en Inform tampoco los hay, el método es "antes" y las acciones una estructura tipo switch en lugar de ifs.


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2010 16:12 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
presi escribió:
Al-Khwarizmi escribió:
No se puede, pero si en lugar de parseCommand hubiera métodos de acción por objeto, sí que se podría y además te ahorrarías los if.

Ojo que en Inform tampoco los hay, el método es "antes" y las acciones una estructura tipo switch en lugar de ifs.


Pero si hubiera métodos de acción, todo sería mucho menos general. Tal como está ahora, te da la posibilidad de:

- Definir código para una acción concreta (como con los métodos de acción).
- Definir el mismo código para varias acciones (con los métodos de acción tendrías que hacer que unos llamaran a otros, y sería más complejo).
- Definir un código común para todas las acciones (esto puede ser útil para varias cosas: definir algo que pasa antes de cualquier cosa que hagas, tener un estado del jugador en el que no puede hacer nada y se le da un mensaje de error con todo lo que haga, hacer meta-procesado como contar el número de comandos o cosas similares, etc.)
- Definir un "else" con un código común para "las acciones no capturadas por los métodos anteriores".
- Definir un código para todas las acciones "menos" una o dos (por ejemplo, la librería de oscuridad hace eso, por defecto para cualquier verbo que no sea unos pocos que tienen sentido en la oscuridad, te da un mensaje de que no puedes hacer eso porque está muy oscuro).
- Etc.

Estas cosas añaden mucha flexibilidad. Por eso no he puesto esos métodos de acción, y supongo que también por eso inform no los pondría en su momento.

_________________
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  [ 49 mensajes ]  Ir a página Anterior  1, 2, 3, 4  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 1 invitado


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