CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 16 Sep 2019 15:43

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 84 mensajes ]  Ir a página Anterior  1, 2, 3, 4, 5, 6  Siguiente
Autor Mensaje
NotaPublicado: 02 Nov 2013 09:53 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Yo lo que te decía es que para imprimir las descripciones tú manualmente en onEnterRoom, puedes dejar la propiedad "describeRoomsOnArrival" siempre a false, no tienes que volver a ponerla nunca a true. Puedes ponerla a false en la inicialización del jugador (su evento onInit) y no tocarla nunca más. Y luego, en el onEnterRoom, harías:

Código:
void onEnterRoom ( Mobile aCreature )
{
   
    //mostramos la descripcion de la habitacion
    if ( get(self,"estado") == 0 )
    { 
         //mostrar descripcion larga y poner estado a 1
         aCreature.writeDescription ( self.getDescription(aCreature) );
         set( self , "estado" , 1 );
    }
    else
    {
         //mostrar descripcion corta (ejemplo que tendrás que sustituir por el código que uses tú para eso)
         aCreature.writeDescription ( get ( self , "descripcionCorta" ) );
    }

    ...

}


Ah, y sobre lo de onInit, ese evento se ejecuta sólo una vez, cuando se crea cada entidad al inicializar el mundo. O sea, es para cosas que quieras hacer al principio de la partida.

En contraste con eso, onEnterRoom se ejecuta cada vez que una criatura entra en una habitación, lo cual puede suceder muchas veces a lo largo de la partida.

También, por lo tanto, onInit siempre se ejecutará antes de cualquier onEnterRoom, ya que primero se inicializan todas las entidades antes de poner el mundo a funcionar y que las criaturas puedan moverse por ahí.

_________________
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 Nov 2013 16:30 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
bueno... :oops: otra vez yo.

Ya tengo mi habitación, con varios estados, los estados no solo los uso para descripciones largas o cortas, también para otras modificaciones del texto de la descripción. Ya lo tenía casi todo ok cuando me doy cuenta de esto...
Tengo la habitación cocina
Con el código.

Código:
/*
Método que captura el evento lanzado cuando una criatura entra en una habitación.
*/
void onEnterRoom ( Mobile aCreature )
{
    //nom_corto=self.getPropertyValueAsString ("nombreCorto");
    //aCreature: criatura que entra en la habitación.
    aCreature.writeAction(self.getPropertyValueAsString ("nombreCorto"));
    aCreature.write("\n\n");
    //self: habitación en la que entra (es decir, esta habitación).
    mobile("jugador").writeDescription(self.getDescription(mobile("jugador")));
    mobile("jugador").write("\n");     
    if (get(self, "estado")==0) {
        set(self, "estado", 1);
    }
 

   
}/*Método de análisis sintáctico de la entrada en una habitación*//*Método de análisis sintáctico de la entrada en una habitación*/
void parseCommand( Mobile aCreature , String verb , String args )
{
    if(equals(verb,"salidas")||equals(verb,"salida")) {             
              mobile("jugador").writeDenial(self.getPropertyValueAsString("salidas"));
              mobile("jugador").write("\n");
              end();
    }

}


Luego en la ejecución:

Código:
>> n

Cocina      (EL NOMBRE DE LA HABITACION)

Descripicion estado cero.    (PERFECTO, ENTRO DE PRIMERA, IMPRIME LA PRIMERA DESCRIPCION)

>> s                       (SALGO DE LA COCINA)

En el dulce hogar      (NOMBRE DE LA HABITACIÓN)

Esta es la descripcion en estado 1   (LA DESCRIPCIÓN 1 DE LA OTRA HABITACIÓN YA QUE ES LA SEGUNDA VISITA)

>> n   (ME VOY OTRA VEZ PARA LA COCINA)

Cocina        (EL NOMBRE..)

Descripcion del estado 1  (PERFECTO, ES LA SEGUNDA VISITA ASÍ QUE ESTO BIEN)

>> salidas       (A VER QUE SALIDAS),
Salida al SUR.   (MUY BIEN)

>> dkfje      (ESCRIBO UNA CHORRADA Y SE VUELVE A IMPRIMIR LAS SALIDAS)
Salida al SUR.

>> ein?
Salida al SUR.

>> pq muestra las salidas?  (IGUAL SE HA QUEDAO PILLAO)
Salida al SUR.

>> n                            (Y A PARTIR DE AQUÍ PARECE QUE SE RECUPERA)
¿Cómo? ¿Ir a dónde?

>> kerj
No entiendo...


No entiendo que le pasa, me falta algún return o algo en onEnterRoom ???? Porqué después de teclear Salidas, al teclear palabras fuera del vocabulario me vuelve a imprimir la propiedad salidas??

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


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2013 16:50 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1893
Estamos comentando por IRC que es posible que sea por el second-chance (¿se llamaba así?).

Además... garbage-in -> garbage-out :P


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2013 17:17 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1893
Sí, se llama "second chance" y está documentado en http://www.caad.es/aetheria/doc/doku.ph ... rsecommand

Bien, lo hemos solucionado ampliando la condición...
Código:
if( equals(verb,"salidas")||equals(verb,"salida") ) { 

... a algo similar a...
Código:
if( ( equals(verb,"salidas")||equals(verb,"salida") ) && equals(args, "") ) {


Para evitar que la basura en second-chance haga funcionar el verbo salidas (que ahora debe utilizarse a secas).

Al-K. Si alguien lo desease (aunque no sé si sería buena idea) ¿se podría desactivar el second-chance?

En este hilo (que no he releído ahora, pero parece hablar de poder eliminarlo para ciertos verbos) se habló largo y tendido.


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2013 22:27 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Sí, se puede desactivar el second chance.

En la documentación se dice cómo, en la sección sobre gestión de verbos: http://www.caad.es/aetheria/doc/doku.ph ... _de_verbos

Se puede desactivar para todos los verbos (pero esto no es nada recomendable, ya que es una funcionalidad útil sin la cual ciertas construcciones gramaticales no se reconocerán) haciendo:

Código:
world.getLanguage().setAllUnguessable();


Nótese que repito que esto no lo recomiendo bajo ningún concepto, ya que mutila el sistema totalmente.

Más útil es desactivarlo para un verbo en particular, cuando sabemos que es siempre intransitivo y que por lo tanto el "second chance" para ese verbo no va a a aportar nada, como es el caso de "salidas". Eso se hace haciendo:

Código:
world.getLanguage().setUnguessable("salidas");


Para eso el comando se tiene que haber dado de alta como verbo, como se especifica un poco más arriba en esa misma sección. Pero supongo que eso estará hecho ya en la aventura, ¿no? (si no lo está, debe hacerse, independientemente de que se desactive el modo second chance o no).

De todos modos, yo creo que la solución que habéis implementado (mirar que no haya argumentos) es más adecuada que desactivar el modo "second chance". Al fin y al cabo, si realmente os preocupa que el parser haga cosas al teclear asdfadfad o similares, aun desactivando el modo "second chance", el parser va a responder a "salidas asdfadfad" (a lo que no responderá es a poner "salidas" primero y "asdfadfad" después). Sin embargo, al mirar que no haya argumentos como habéis hecho, el parser tampoco admitirá 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: 02 Nov 2013 22:46 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Citar:
Bien, lo hemos solucionado ampliando la condición...
Código:
if( ( equals(verb,"salidas")||equals(verb,"salida") ) && equals(args, "") ) {



Con esta solución que me dio dddddd funciona a la perfección, no hay porqué desactivar el second chance. Yo no había tenido en cuenta el argumento args.

Gracias!

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


Arriba
 Perfil  
 
NotaPublicado: 03 Nov 2013 08:30 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
¿como hago una función pública para todas las habitaciones u objetos????

He creado una función que la usaré en casi todas las habitaciones u objetos, y para no estar copiando el código en cada uno de ellos, e intentado poner en el código BSH del mundo la función con public delante.

Código:
public void mifuncion(String arg1, int valr) {
....
...

}


Pero no la encuentra si la llamo desde cualquier habitación u objeto. Igualmente he creado un fichero externo, del tipo mifichero.bsh, donde está mi función, si incluyo el fichero en la habitación/es donde llamo a la función funciona bien.
No hay alguna manera de que la función sea pública para todo el mundo y no tener que está incluyendo el fichero o copiando el código en cada habitación/objeto?

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


Arriba
 Perfil  
 
NotaPublicado: 03 Nov 2013 13:16 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1893
No es necesario que declares la función pública, pero siempre tendrás que hacer la llamada especificando dónde está, es decir... a qué objeto/entidad pertenece la función.
Código:
entity("nombre_único_de_la_entidad").mifuncion(...);


Si vas a hacer varias llamadas seguidas desde el mismo método, puedes obtener una referencia local y usarla:
Código:
Entity mi_entidad = entity("nombre_único_de_la_entidad");
mi_entidad.mifuncion(...);
mi_entidad.mifuncion(...);
mi_entidad.mifuncion(...);

Si la creas en el mundo puedes llamarla con:
(porque la variable world siempre está disponible)
Código:
world.mifuncion(...);


Arriba
 Perfil  
 
NotaPublicado: 03 Nov 2013 13:45 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Efectivamente, no hay una manera de hacer que un método sea visible desde todas partes sin necesidad de prefijarlo con la entidad correspondiente. El scripting de BeanShell que usa AGE está basado en definir métodos en objetos individuales, no en definir clases.

De todas formas, el mismo efecto de tener un código para todas las habitaciones y sólo tener que escribirlo una vez se puede conseguir también sin problemas con esta filosofía, sólo hay que cambiar el enfoque para hacerlo. Tal como dice dddddd, si tienes un método que afecta a todas las habitaciones, siempre puedes declararlo en el mundo, o bien en una entidad abstracta, por ejemplo. Por ejemplo, si tienes un método para pintar de rojo una habitación, y quieres que funcione en todas las habitaciones, en lugar de declararlo en cada habitación, definirías el método en el mundo o en una entidad abstracta como

Código:
void pintarDeRojo ( Room r )


y lo que invocarías sobre self si lo definieses en la habitación, en su lugar lo invocarías sobre el parámetro r.

Y para usar el método harías:

Código:
world.pintarDeRojo ( habitacion1 );


o bien creas una entidad abstracta "coloreador" y haces:

Código:
entity("coloreador").pintarDeRojo ( habitacion1 );


Esta segunda opción puede ser más recomendable sobre si tienes una cantidad apreciable de código de este tipo, para compartimentalizarlo según su funcionalidad y no sobrecargar el objeto mundo con un montón de código para cosas diversas.

_________________
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: 03 Nov 2013 16:48 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Gracias!

Os comento lo que hecho, he incluido con un include un fichero en el codigo del world, donde tengo mi función:

Código:
include ("lib/milib.bsh");


Luego en cada objeto/habitación lo llamo con:

Código:
world.mifuncion( . parametros...);


Así lo haré para funciones de uso más general. Luego para no sobrecargar el world, como dice Al-k, crearé entidades abstractas dependiendo del tipo de función... (bueno que por ahora sólo he creado una para imprimir texto por pantalla)... pero manta a manta

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


Arriba
 Perfil  
 
NotaPublicado: 03 Nov 2013 17:02 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Ten en cuenta que para un fichero de código que incluyes tú junto a la aventura, la forma correcta de incluirlo es

Código:
source( world.getResource("ruta-al-fichero.bsh") );


La forma que has puesto tú sería para usar una de las librerías que vienen incluidas con AGE en un directorio genérico (sin estar asociadas a una aventura en concreto). Eso quiere decir que sólo funcionará si los usuarios copian manualmente el fichero a ese directorio, mientras que la que acabo de poner funciona sola, simplemente distribuyendo el fichero junto con el resto de ficheros de la aventura.

_________________
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: 03 Nov 2013 20:30 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
Ten en cuenta que para un fichero de código que incluyes tú junto a la aventura, la forma correcta de incluirlo es

Código:
source( world.getResource("ruta-al-fichero.bsh") );


La forma que has puesto tú sería para usar una de las librerías que vienen incluidas con AGE en un directorio genérico (sin estar asociadas a una aventura en concreto). Eso quiere decir que sólo funcionará si los usuarios copian manualmente el fichero a ese directorio, mientras que la que acabo de poner funciona sola, simplemente distribuyendo el fichero junto con el resto de ficheros de la aventura.


Ok, ya lo puse como dices.

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


Arriba
 Perfil  
 
NotaPublicado: 04 Nov 2013 10:54 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Bueno a ver si consigo explicar esto...

Tengo una entidad abstracta, llamada "varibles". Para acceder a sus funciones desde cualquier objeto/habitación, no tengo problema, lo hago como me habéis comentado:

Código:
entity("variables").mifuncion(...);


Vale pues para rizar el rizo, he creado una clase en esa entidad abstracta y ahí mismo el objeto:

Código:
class marco_acciones {

    int marco_estante=1;
    int marco_examinado=0;
    int marco_foto=0;

    // para cambiar la situación del marco
    void chn_marco_estante(int num) {
        marco_estante=num; //0 está en el estante, 1 no está en el estante
    }

    void chn_marco_examinado(int num) {
        marco_examinado=num; //0 no hemos examinado el marco, 2 lo hemos examinado
    }
    void chn_marco_foto(int num) {
        marco_foto=num; //0 el marco está cerrado y por lo tanto la foto en el marco, en el momento que abrimos el marco (4) se cae la foto
    }

    int respuestas() {
        return marco_estante+marco_examinado+marco_foto;
    }

}

//creamos el objeto
marco_acciones A;
A= new marco_acciones();

// ESTA FUNCIÓN LA HE CREADO PARA HACER PRUEBAS
int depaso () {
    return A.respuestas();
}


Si intento acceder al objeto A desde fuera de la entidad me da error, sin embargo al acceder a la función depaso desde fuera de la entidad me funciona
Es decir desde un objeto llamado cuadro:

Código:
/*Método de análisis sintáctico de la entrada referida a una cosa*/
void parseCommand( Mobile aCreature , String verb , String args )
{
        int numero;       
        if (equals(verb, "mirar")) {
            numero=entity("variables").depaso(); //ACCEDO A LA FUNCIÓN, SI QUIERO ACCEDER AL OBJETO NO ME DEJA
            //numero=entity("variables").A.respuestas();  ESTO LO COMENTO PORQUE NO ME FUNCIONA
            aCreature.write("\nValor de respuesta: "+numero+"\n");
            end();
        }//if (equals(verb, "mirar"))
   

}.


En el anterior código al descomentar la línea
Código:
numero=entity("variables").A.respuestas();


Me sale el error


Código:
**********BeanShell Syntax Error Report***********
*In code for object: [ eu.irreality.age.Item:30000003:cuadro ]
*Loaded to call method parseCommand (with arguments: [ eu.irreality.age.Player:20000000:jugador ] mirar cuadro)
*Location: inline evaluation of: ``  void onGet ( Mobile getter ) {      // si cogemos del estante el objeto y esta . . . ''
*Message: Sourced file: inline evaluation of: ``parseCommand( arg0, arg1, arg2);'' : reflection error: bsh.ReflectError: No such field: A
**************************************************

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


Arriba
 Perfil  
 
NotaPublicado: 04 Nov 2013 11:38 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Como te comentaba en el post anterior, es que simplemente el scripting de BeanShell que usa AGE no está hecho para crear clases dentro de los objetos de AGE.

No sale un error de sintaxis al poner "class" porque el lenguaje BeanShell en sí (en sus últimas versiones) sí que soporta clases, pero AGE no usa ese soporte. Sólo ejecuta métodos en los objetos, todo lo demás lo ignora. Puede que, como te ha sucedido, las clases te funcionen en alguna situación en particular, pero es por casualidad, porque al llamar al intérprete de BeanShell según cómo se invoque las estará interpretando. Pero no es funcionalidad que esté soportada, o sea, no la uses porque igual lo que te está funcionando ahora, en una versión posterior ya no lo hace.

_________________
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: 04 Nov 2013 11:53 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Vale, es que ahora que lo pienso estaba haciendo un tontería muy grande (si otra más).

He creado un entidad llamada accionesMarco, dentro con el código de la clase que había creado:

Código:
int marco_estante=1;
    int marco_examinado=0;
    int marco_foto=0;

    // para cambiar la situación del marco
    void chn_marco_estante(int num) {
        marco_estante=num; //0 está en el estante, 1 no está en el estante
    }

    void chn_marco_examinado(int num) {
        marco_examinado=num; //0 no hemos examinado el marco, 2 lo hemos examinado
    }
    void chn_marco_foto(int num) {
        marco_foto=num; //0 el marco está cerrado y por lo tanto la foto en el marco, en el momento que abrimos el marco (4) se cae la foto
    }

    int respuestas() {
        return marco_estante+marco_examinado+marco_foto;
    }


Y ya está, accedo desde los objetos de fuera simplemente:

Código:
 numero=entity("accionesMarco").respuestas();


Me estaba complicando la vida...

Gracias por tus rápidas respuestas!!!

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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 84 mensajes ]  Ir a página Anterior  1, 2, 3, 4, 5, 6  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 6 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