CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Ago 2017 12:19

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 10 mensajes ] 
Autor Mensaje
NotaPublicado: 01 Jul 2014 14:34 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
¡Buenas!

¿Existe alguna forma de capturar la respuesta del juego para guardarlo en un String?

Por ejemplo:

Código:
Tu orden:  ex mesita
Una pequeña mesilla de noche, sencilla y algo envejecida. Encima puedes ver un teléfono fijo y un teléfono móvil.


Aquí al examinar la mesita me ha respondido:

Una pequeña mesita de noche, sencilla...

Pues esta respuesta poder guardarla en un String.

Gracias!

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 01 Jul 2014 15:05 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Bueno, y me diréis, ¿pero si ésta respuesta es la que se ha escrito el creador del juego?, ¡ya está en String que ha creado el programador!

mmm, me explico entonces un poco mejor. Ese es un ejemplo que puse, mi intención es que capturase también las respuestas cuando no hay nada programado:

Código:
Tu orden:  quemar mesita
¿Cómo? ¿quemar mesita?

Tu orden:  mover mesita
¿Cómo? ¿mover mesita?

Tu orden:  subir en la mesita
¿Cómo? ¿Ir a dónde?

Tu orden:  romper mesita
¿Cómo? ¿Qué quieres arrancar?
Tu orden:  coger mesita
Llevas demasiado peso para coger la mesilla de noche.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 01 Jul 2014 15:11 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Hmm, pues así en general y de forma sencilla, no hay forma de hacerlo. Las cosas que se le muestran al jugador por pantalla vienen de llamadas al método write sobre ese jugador (o sobre su cliente), y el método write escribe, no hace otra cosa. En algún momento pensé en incluir la posibilidad de inyectar cosas en el método write, pero no llegué a hacerlo porque en aquel momento ni yo ni nadie lo estaba demandando, y supondría hacer más lento el método write que se ejecuta muy a menudo. Pero aún se puede añadir algo así si hace falta.

¿Para qué quieres hacer esto exactamente? En caso de incluir esta funcionalidad, habría que pensar cómo exactamente. Por ejemplo, no existe un concepto de "la respuesta del juego": lo que el juego saca entre una entrada del jugador y otra puede ser una combinación de respuestas provocadas por órdenes del propio jugador, respuestas provocadas por eventos externos, reacciones de otros personajes, cosas del servidor como que alguien desconecte, etc... por supuesto se podría agrupar todo, pero habría que ver cosas como en tiempo real, ¿dónde termina una "respuesta" y empieza la siguiente? ¿En cada unidad de tiempo? Etc. Dependiendo de qué funcionalidad concreta quieras implementar con esto, puede que sea mejor hacer una cosa u otra.

_________________
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: 01 Jul 2014 15:16 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
Había escrito una respuesta, pero mientras ha habido dos respuestas que básicamente dicen todo lo que yo decía.

En todo caso, mi duda principal persiste: ¿para qué?


Arriba
 Perfil  
 
NotaPublicado: 01 Jul 2014 15:57 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
No sé si recordaréis o si habéis jugado a Sherlock Holmes, ahora solo recuerdo la del escalpelo mellado.
En ella había una opción en que podías leer un diario del detective en el que estaban reflejados todos sus movimientos y conversaciones.
Mi intención es capturarlas, crear el diario y guardarlo en un fichero de texto que se pueda consultar. La forma de leer y escribir en ficheros ya la tengo solventada.
Para capturar la orden del jugador también, capturo el inputText del preprocessCommand, sólo me faltaría el mensaje que se muestra al jugador.
Sería una forma en el que el detective tenga anotado también las conversaciones con los sospechosos.

Por cierto, pego aquí el código que tengo para leer fichero, por si tendría que corregir algo y que quede para la comunidad, por si ha alguien le resulta de utilidad.

Código:
void leerFichero ()
{
    try {
        FileReader in = new FileReader("ficheros/borrar.txt");
        BufferedReader br = new BufferedReader(in);
       
        while ((Line = br.readLine()) != null){ 
            mobile("jugador").write(Line + "\n");
        //br.close();
        }
    }
    catch (Exception e)
    {
        mobile("jugador").write ("\nError lectura I/O: " + e + "\n");
    }
   
   
}

void escribirFichero(String args)
{
    file = new File ("ficheros/borrar.txt");
    longitud = file.length();
    mobile("jugador").write ("" + longitud + "\n");
   /* files = file.listFiles();
    for (i=0; i<20; i++)
        mobile("jugador").write ("\n" + files[i]);*/

try {
    FileWriter Fout = new FileWriter("ficheros/borrar.txt", true);
    BufferedWriter out = new BufferedWriter(Fout);
    out.write("Linea de prueba " + args + "\n"); 
    out.close(); 
}
catch (Exception e)
{
    mobile("jugador").write ("\nError escritura I/o: " + e + "\n");
}

    file = new File ("ficheros/borrar.txt");
    mobile("jugador").write ("" + file.length() + "\n");

}

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 01 Jul 2014 22:44 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
El código de leer y escribir el fichero lo veo bien, aunque realmente, en este caso ¿no es un poco complicarse la vida? Si metes el diario en un String que sea una propiedad de una entidad, ya se recreará solo al cargar log y se guardará y cargará con los estados. Y tendrás menos problemas si el jugador quiere pasar el salvado a otro ordenador o cosas así.

Sobre el contenido del diario, ¿realmente las respuestas por defecto y cosas así son relevantes? A mí me parecerían un poco anticlimáticas, o sea, ¿por qué usar el diario para mostrarle al jugador exactamente lo mismo que ya puede ver haciendo scroll?

_________________
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: 01 Jul 2014 23:35 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Creo que posiblemente se pueda hacer un apaño con proxies dinámicos, sin cambiar nada en el propio AGE. Añadiendo al principio del beanshell del mundo import java.lang.reflect.*, puedes poner en la intro algo como:

Código:
InputOutputClient io = pl.getIO();

    java.lang.reflect.InvocationHandler ih = new java.lang.reflect.InvocationHandler()
    {
        Object invoke ( Object proxy , Method method , Object[] args )
        {
            if ( method.getName().equalsIgnoreCase("write") )
            {
                System.err.println("Se ha llamado a write para escribir: " + args[0]);
            }
            method.invoke(io,args);
        }
    };

    InputOutputClient newClient = (InputOutputClient) Proxy.newProxyInstance( io.getClass().getClassLoader() , new Class[] { InputOutputClient.class }, ih );

    pl.setIO(newClient);


Aquí lo que estás haciendo es darle al jugador el cambiazo de su cliente por un proxy dinámico que ejecuta un código en el método write (código que tendrías que cambiar para que haga lo que tú quieres, es decir, meter la cadena en el diario).

De todas formas, he estado pensando y creo con un código como ése tendrías algunos problemas, porque las cadenas que se escriben son personalizadas para cada cliente. O sea, si el jugador juega parte de la partida en el cliente de ventanas de AGE, las cadenas van a tener códigos de color para indicar qué color tiene cada parte del texto. Si luego carga la partida (y el fichero) en cheapAGE, dichos códigos no se mostrarán bien.

También es algo que podrías arreglar, claro: puedes tirar código para "limpiar" el texto de códigos de color (si no te importa que no se muestren en el diario), o incluso hacer un código condicional para que se limpien al mostrar el texto sólo si el cliente actual es cheapAGE... pero no dejan de ser chapucillas (¿qué pasa si dentro de dos años sale un cliente de AGE con códigos de color diferentes, o si cambian los del propio cliente actual?).

_________________
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: 02 Jul 2014 01:15 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Buenas, he estado dándole más vueltas al asunto y tienes razón en lo que dices. Sólo incluiré en el diario las respuestas que me interesen, así como las conversas con los sospechosos.
No tenía sentido guardar ¿cómo? ¿ir dónde?... ni ese tipo de respuestas que no aportan nada, sólo lo ensuciaría.

En ese caso no me haría falta capturar la respuesta del juego, ya que como he comentado, sólo guardaría las respuestas que me interesara y que tendría programada.

El tema del fichero, es para tener una versión para imprimir. Lo de la propiedad que me comentas para guardarla lo pensé en un principio, y luego me vino la idea de tener una versión para imprimir. Un buen detective siempre debe analizar bien sus interrogatorios. Ejem... es una pijadilla lo sé, pero bueno... me gusta indagar estas cosas.

He probado el código que me has pasado pero me da el siguiente error;

Código:
**********BeanShell Syntax Error Report***********
*In code for object: [World: Una de dragones, internal handle eu.irreality.age.World@b8a8f6]
*Loaded to call method intro (with arguments: [ eu.irreality.age.Player:20000002:jugador ])
*Location: inline evaluation of: ``import java.lang.reflect.*;  /* *  * Redefinimos ciertos mensajes por defecto.   . . . ''
*Line: 101
*Offending text: pl .getIO ( )
*Message: Sourced file: inline evaluation of: ``intro( arg0);'' : Typed variable declaration : Attempt to resolve method: getIO() on undefined variable or class name: pl
**************************************************


Coloqué al inicio del mundo el import java.lang.reflect.*; y luego en la intro copié y pegué el código tal y como me los has puesto.
Quería probar una cosa, en la línea de código que has puesto;

Código:
if ( method.getName().equalsIgnoreCase("write") )


si coloco;

Código:
if ( method.getName().equalsIgnoreCase("say") )


¿me capturaría todo lo que dicen los personajes?

Gracias!

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 02 Jul 2014 08:30 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
De cara a lo que dices de imprimir, yo creo que sería más elegante usar la propiedad, y que el juego dé la opción de guardar el diario en un fichero sólo si el jugador quiere. De esta manera tendrías lo mejor de los dos mundos: implementarías esa funcionalidad, pero sin ninguna complicación para quien no quiera usarla.

En el código que te pasé del proxy dinámico, estaba suponiendo que el método intro estaba definido con el parámetro ( Player pl ), o sea, pl es el jugador. Para que funcione tienes que hacer que la variable pl apunte al jugador, si no el código no tiene sentido.

Sobre lo de say, en ese caso no funcionaría porque say no es un método del cliente del jugador (que es sobre lo que estamos actuando aquí), es un método del jugador en sí. Pero si lo que quieres es grabar conversaciones, lo puedes resolver con un evento onRoomText que detecte los mensajes de habitación que contengan las palabras "dice" o "dices", poniendo en el jugador algo como:

Código:
void onRoomText ( String text )
{
    if ( text != null && text.toLowerCase().indexOf("dice") >= 0 )
    {
          hacer lo que quieras con text.
    }
}

Esto además es una solución a nivel de servidor así que no tendría ninguno de los problemas que mencionaba antes al salvar/cargar partidas entre distintos clientes, etc.

Eso sí, cuidado si en la aventura tienes algún mensaje o texto que diga "dice" sin ser una conversación (sería bastante raro pero podría ocurrir), en cuyo caso tendrías que refinar el código para no incluirlo.

_________________
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: 02 Jul 2014 09:26 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
De cara a lo que dices de imprimir, yo creo que sería más elegante usar la propiedad, y que el juego dé la opción de guardar el diario en un fichero sólo si el jugador quiere. De esta manera tendrías lo mejor de los dos mundos: implementarías esa funcionalidad, pero sin ninguna complicación para quien no quiera usarla.

Es una de las posibilidades que estaba barajando. Lo haré así, usar la propiedad para guardar el diario y dar la opción de sacarlo a fichero de texto si quiere el jugador.

Me pondré a practicar con todo esto a ver que tal el resultado.

Gracias!

_________________
Te quiero... lo siento Yoda sólo tenemos café.


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