CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 16 Jul 2020 05:12

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 6 mensajes ] 
Autor Mensaje
NotaPublicado: 24 Dic 2010 19:11 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Estoy trabajando en el tema de que el parser no "adivine" verbos cuando son intransitivos. Estoy pensando en la mejor forma de hacerlo.

Como habíamos hablado en otros hilos, un posible problema es que la transitividad tiene grados. Hay muy pocos verbos puramente intransitivos ("inventario"), unos cuantos (bastantes) que se podrían considerar intransitivos en la práctica aunque en alguna situación poco común pueden llegar a ser transitivos ("estornudar", "gritar", "llorar", "dormir", "esperar", etc.); algunos que pueden ser comúnmente tanto transitivos como intransitivos ("mirar", "escuchar", "cantar", etc.) y por último la mayoría que son transitivos puros y duros ("coger", "dejar", "atacar", "blandir", etc.).

Así que lo que tenía planeado era incluir los de las dos primeras categorías en una lista de verbos intransitivos que serían los que harían que no saltara el modo "second chance" del parsing robusto.

Pero pensándolo mejor, la segunda categoría es algo subjetiva y depende de cómo se usen esos verbos en la aventura, y además hay verbos de la tercera categoría que según qué aventura sea podrían entrar en la segunda también (por ejemplo en tu aventura creo que se podía "cantar", y a lo mejor no se puede "cantar una de Bustamante").

Así pues, estoy pensando que creo que lo mejor es que sea el autor de la aventura quien decida qué verbos van a ser intransitivos (y, por lo tanto, no activar este modo del parsing robusto) en *su* aventura. Así, sería cosa de hacer algo como:

world.getLanguage().addIntransitive("gritar");
world.getLanguage().addIntransitive("llorar");
world.getLanguage().addIntransitive("cantar");
...

O bien puedo hacer una función que cargue un fichero con una lista de intransitivos para la aventura.

Nótese que el autor sólo tendría que incluir los verbos que realmente ha usado como intransitivos en la aventura, no otros verbos que sean intransitivos pero que no haya usado, porque si para un verbo no está definida una acción, ese verbo no afecta al parsing para nada.

Es un poco más trabajoso para el autor que tener una lista fija, pero creo que es la opción que da más flexibilidad para que el autor perfeccionista pueda aclarar que "cantar" en su aventura es intransitivo. Además, siempre se podría hacer que por defecto sí que hubiese una lista fija si se da el caso de que el autor no define nada.

¿Qué te parece la idea, jenesis?

_________________
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: 24 Dic 2010 19:32 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Por cierto que me acabo de dar cuenta de que con los verbos intransitivos por defecto (como "inventario" o "mirar") tampoco existe ningún problema respecto al parsing robusto...

Código:
> inventario
Tienes tal cosa y tal otra.
> jarl
No entiendo...


Código:
Tu orden:  mirar
Te encuentras en la entrada a la guarida del malvado Morluck. Se trata de una caverna natural. Hacia el norte puedes ver la luz que proviene de la salida al exterior. Hacia el sur, un estrecho y sombrío túnel.

Tu orden:  bastón
Un bastón recto de madera dura, con los extremos revestidos de metal. Arma típica de magos, es muy versátil: permite asestar buenos golpes; pero también bloquear si se utiliza con destreza.

Tu orden:  jarl
No entiendo...


¿Y por qué es esto? Pues porque están definidos de forma que "inventario jarl" no hace nada, y "mirar jarl" no hace nada. Ésos son los comandos que prueba el sistema :D

En realidad, si cuando definiste "cantar" lo hubieras hecho de forma que no hiciese nada si hay argumentos (o sea, que pasara de todo y saliera del parseCommand sin imprimir nada ni ejecutar end(), haciendo que saltase el "No entiendo"), tampoco te daría ningún problema con el adivinador del parser. Con esto no digo que tengas que hacerlo así (te puede interesar que se pueda "cantar finamente" o "cantar lentamente" y que la restante entrada se ignore, es totalmente legítimo). Pero lo que quiero decir es que, en realidad, ni siquiera es muy necesaria una lista fija porque me estoy dando cuenta de que, si no me equivoco, no hay verbos por defecto que den problema. Los problemas sólo surgen con verbos definidos por el usuario y en el caso de que se definan para aceptar cualquier entrada.

Me explico:

Código:
if ( equals ( verb , "cantar" ) )
{
  jugador.write("Cantas una de Bisbal, desafinando horriblemente.\n");
  end();
}


Produce:

Código:
> cantar
Cantas una de Bisbal, desafinando horriblemente.
> ewragfafd
Cantas una de Bisbal, desafinando horriblemente. <- éste es el comportamiento no deseado.
> mirar
Descripción
> cantar suavemente
Cantas una de Bisbal, desafinando horriblemente.


Mientras que:

Código:
if ( equals ( verb , "cantar" ) && equals ( args , "" ) )
{
  jugador.write("Cantas una de Bisbal, desafinando horriblemente.\n");
  end();
}


Produce:

Código:
> cantar
Cantas una de Bisbal, desafinando horriblemente.
> ewragfafd
No entiendo...
> mirar
Descripción
> cantar suavemente
¿Cómo? ¿cantar suavemente?


Así pues, el problema que nos ocupa no es exactamente cosa de "verbos que se usan en la aventura como intransitivos" sino más bien, concretamente, cosa de "verbos que se usan en la entrada como intransitivos y que además aceptan argumentos arbitrarios".

Por lo tanto, yo creo que lo que voy a hacer es llamarle a tales verbos "no adivinables" o algo así (porque ni siquiera tienen por qué ser todos los intransitivos), y dejar que el programador de aventuras pueda añadir cuáles son los verbos no adivinables en su aventura; que vendrían a ser ni más ni menos que todos los que acepten entradas arbitrarias, como sería el caso del primer "cantar" del ejemplo, pero no del segundo.

_________________
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: 24 Dic 2010 19:50 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Es un poco más trabajoso para el autor que tener una lista fija, pero creo que es la opción que da más flexibilidad para que el autor perfeccionista pueda aclarar que "cantar" en su aventura es intransitivo. Además, siempre se podría hacer que por defecto sí que hubiese una lista fija si se da el caso de que el autor no define nada.

¿Qué te parece la idea, jenesis?


Ya sabes que me encantan las cosas personalizables.
A mí me parece genial :) una gran idea

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


Arriba
 Perfil  
 
NotaPublicado: 24 Dic 2010 20:01 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Además, esta forma de hacerlo es buena de cara a la reutilización. Si tienes una librería o un fichero que incluyas con verbos personalizados, puedes incluir la información de cuáles son "no adivinables" (intransitivos con entrada arbitraria) en ese mismo fichero, dentro de cada verbo:

Código:
if ( equals ( verb , "cantar" ) )
{
  world.getLanguage().setUnguessable("cantar");
  jugador.write("Cantas una de Bisbal, desafinando horriblemente.\n");
  end();
}


Aunque desde el punto de vista de la eficiencia esto no es lo más óptimo porque llamas al método setUnguessable cada vez que se ejecuta el verbo cantar, y llegaría con hacerlo sólo una vez, tampoco pasa nada porque ese método no hace nada si ya habías marcado ese verbo, así que el tiempo que se pierde es insignificante. Y de esta forma la definición de si un verbo no es adivinable está dentro del código del propio verbo, cosa que favorece la reutilización.

_________________
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: 25 Dic 2010 19:15 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
He actualizado el AGE para incluir este cambio que he dicho.

Te lo puedes bajar aquí:

http://dl.dropbox.com/u/1941813/AgePlay ... 251852.zip
http://dl.dropbox.com/u/1941813/AgeDeve ... 251852.zip

Para añadir un verbo a la lista de "no adivinables" se hace así:

world.getLanguage().setUnguessable("cantar");

Para quitarlo,

world.getLanguage().setGuessable("cantar");

Y así de fácil. Coser y cantar. Simplemente tienes que añadir tus verbos intransitivos que acepten entradas arbitrarias a la lista, puedes hacerlo en un método init o bien dentro del propio verbo como he puesto en el post inmediatamente anterior.

También he estado probando lo del fade out pero lo he dado por imposible por los motivos que doy en otro hilo... en sucesivas aventuras te recomiendo que uses música en formatos de audio si quieres hacer fade outs :/

_________________
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: 25 Dic 2010 19:47 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
He actualizado el AGE para incluir este cambio que he dicho.

Te lo puedes bajar aquí:

http://dl.dropbox.com/u/1941813/AgePlay ... 251852.zip
http://dl.dropbox.com/u/1941813/AgeDeve ... 251852.zip



Genial!
Gracias, y no te preocupes por el midi, aún estoy a tiempo de cambiar esos archivos por otros de audio. Miraré de hacerlo si no es para ésta, sí para una futura release. :)

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


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