CAAD
http://foro.caad.es/

Empezando con AGE
http://foro.caad.es/viewtopic.php?f=31&t=5272
Página 2 de 6

Autor:  Al-Khwarizmi [ 30 Oct 2013 11:08 ]
Asunto:  Re: Empezando con AGE

Ah, y si en vez de sólo el frutero tienes varios personajes que pueden responder a (los mismos o distintos) temas, lo que harías sería, en vez de redefinir el parseCommand del frutero, redefinir el del jugador. Detectar que se refiere a un personaje, y obtener sus temas. Y luego todo lo demás, igual (en vez de self, llamarías a métodos sobre ese personaje). De esa forma tienes un sistema genérico y sin duplicar código.

Si tienes dudas sobre cómo llevar a cabo esto, pregunta, por supuesto.

Autor:  edlobez [ 30 Oct 2013 12:07 ]
Asunto:  Re: Empezando con AGE

Al-Khwarizmi escribió:
Ah, y si en vez de sólo el frutero tienes varios personajes que pueden responder a (los mismos o distintos) temas, lo que harías sería, en vez de redefinir el parseCommand del frutero, redefinir el del jugador. Detectar que se refiere a un personaje, y obtener sus temas. Y luego todo lo demás, igual (en vez de self, llamarías a métodos sobre ese personaje). De esa forma tienes un sistema genérico y sin duplicar código.

Si tienes dudas sobre cómo llevar a cabo esto, pregunta, por supuesto.


Gracias!
Estoy practicando con habitaciones, objetos... etc, me pondré con todo lo que me has comentado, si me sale alguna duda te pregunto, pero con todo lo que tengo hay para un buen rato.
En cuanto tenga el primer resultado te comento.

Gracias!

Autor:  edlobez [ 30 Oct 2013 14:21 ]
Asunto:  Re: Empezando con AGE

Una pregunta rápida, tengo un objeto, "paquete"

Al que le creo el siguiente método:
Código:
/*Método de análisis sintáctico de la entrada referida a una cosa*/
void parseCommand( Mobile aCreature , String verb , String args )
{
   
    if (equals(verb, "examinar") || equals(verb, "coger")) normal;
    else {
        aCreature.write("No puedes hacer eso con el paquete.\n");
        end();
        }
}
/*Método de análisis sintáctico de la entrada referida a una cosa*/



Para el verbo coger me funcionaba pero no para el verbo examinar. Cambié examinar por mirar y ok, funciona como yo quiero.
Hay algún documento con el listado de verbos... como decirlo patrón... (no sé si llamarlo así).
En el menú Herramientas -> Lista de Verbos, hay un listado de verbos, que creo que son los que reconoce el parser. ¿Pero como sé que en lugar de examinar, debía poner mirar? ¿hay algún documento donde aparezca?.

Autor:  Al-Khwarizmi [ 30 Oct 2013 15:31 ]
Asunto:  Re: Empezando con AGE

Si abres el fichero AgeCore.jar con tu descompresor de zip favorito, dentro de él, en el fichero lang/es/alias.lan tienes una lista de todos esos alias.

O, más directamente, en este enlace los tienes: http://code.google.com/p/aetheria/sourc ... .lan?r=422

A ver si los añado o bien a la documentación (en la documentación se comenta alguno pero no hay una lista sistemática), o bien a PUCK en una ventana de visualización de la lista de alias similar a la de la lista de verbos que has visto, ya que es un dato importante para nuevos autores y debería estar más a mano.

Autor:  edlobez [ 30 Oct 2013 15:41 ]
Asunto:  Re: Empezando con AGE

Al-Khwarizmi escribió:
Si abres el fichero AgeCore.jar con tu descompresor de zip favorito, dentro de él, en el fichero lang/es/alias.lan tienes una lista de todos esos alias.

O, más directamente, en este enlace los tienes: http://code.google.com/p/aetheria/sourc ... .lan?r=422

A ver si los añado o bien a la documentación (en la documentación se comenta alguno pero no hay una lista sistemática), o bien a PUCK en una ventana de visualización de la lista de alias similar a la de la lista de verbos que has visto, ya que es un dato importante para nuevos autores y debería estar más a mano.


Ok, lo tengo. Gracias!

Autor:  edlobez [ 30 Oct 2013 18:42 ]
Asunto:  Re: Empezando con AGE

Perdona pero no sé si te voy a dar mucho la paliza....
Estoy en mis primeros pasos y hasta que no arranque pues me pierdo un poco, estoy configurando o preparando como quiero que se presenten mis descripciones de las estancias.
Algo que me ha chocado un poco es que al iniciar una partida no se muestre la descripción de la estancia donde se inicia la partida. La forma que he pensado es esta;

Código:
/*Introducción del juego para un jugador*/
void intro( Player aPlayer )
{
    String desc;
    String Nom_corto;
    //aPlayer: jugador al que le hacemos la introducción.
    aPlayer.waitKeyPress();
    aPlayer.borrarPantalla();
    // el promt de eco de pantalla
    aPlayer.getIO().setEchoText(">> ");
    // el promt de entrada del jugador
    aPlayer.getIO().setPrompts(">> ","");
    //En esta propiedad de la habitación del inicio he guardado una descripción inicial de la estancia de inicio y el nombre corto de la habitacion
    Nom_corto=room("tu.casa").getPropertyValueAsString ("Nombre_corto");
    desc=room("tu.casa").getPropertyValueAsString("InitDescripcion");
    aPlayer.write(Nom_corto);aPlayer.write("\n");aPlayer.write("\n");
    aPlayer.write(desc);
    aPlayer.write("\n");
   
}


Te la enseño ya que no sé si es la más correcta.
A parte quiero que siempre que se entre en una estancia se muestre:
Nombre de la estancia
Descripción
Salidas Posibles.

Por ahora tengo en siguiente código en la habitación:
Código:
/*
Método que captura el evento lanzado cuando una criatura entra en una habitación.
*/
void onEnterRoom ( Mobile aCreature )
{
    String Nombre_corto;
    //aCreature: criatura que entra en la habitación.
    Nombre_corto=self.getPropertyValueAsString ("Nombre_corto");
    mobile("jugador").write(Nombre_corto);aCreature.write("\n\n");
    //self: habitación en la que entra (es decir, esta habitación).

}//código a ejecutar cuando se inicializa la habitación



Tengo una propiedad en la habitación llamada Salidas, donde guardo las salidas posibles de la habitación. La quiero imprimir después de la descripción. Y es aquí donde no sé cuando lanzarlo...
He visto de algunos autores que lo introducen en el mismo texto de la descripción, pero mi intención es crear una habitación "esqueleto" que cortaré y copiaré... los nombre de las propiedades serán iguales y así sabre siempre como acceder a cada una de ellas, nombre_corto, salidas... etc. además estás salidas y por lo tanto esta propiedad puede variar a lo largo del juego.

No sé si me he explicado bien...

Autor:  Al-Khwarizmi [ 30 Oct 2013 19:42 ]
Asunto:  Re: Empezando con AGE

Sobre mostrar la descripción de la primera localidad nada más empezar, que no se haga por defecto es una simple cuestión de genericidad. En algunas aventuras puede estar bien mostrar esa descripción al principio, en otras no (por ejemplo, porque tienen una intro propia que no tiene que ver con la descripción de la localidad). Entonces el sistema no fuerza nada para que cada uno pueda hacer lo que más le convenga. Si se quiere mostrar el texto de la primera localidad, se puede, si no, no.

Una forma más sencilla de mostrar ese texto (en términos de código escrito) es usar forceCommand("mirar") para hacer que el personaje jugador mire al final del método intro del jugador. Tienes más información sobre forceCommand aquí: http://www.caad.es/aetheria/doc/doku.ph ... de_ordenes

Sobre configurar cómo se muestran las habitaciones, creo que Jenesis había hecho algo parecido en alguna de sus aventuras, tal vez puedas mirar cómo lo hizo. Pero se trata de hacer lo siguiente:

- Redefinir el comando "mirar" (usando el parseCommand del jugador) para que haga lo que tú quieras.
- Redefinir también el evento onEnterRoom del jugador (creo que no sale en los menús, pero es void onEnterRoom( Player p )) para que también haga eso, en lugar de llamar al código actual de mostrar la habitación.

Por cierto, dejando a un lado el aspecto técnico, permíteme que intente convencerte de que no lo hagas... pocas cosas me tiran más atrás en una aventura que las "plantillas" tipo:
Citar:
La Cocina

Una cocina moderna, muy bonita, de silestone y todo eso.

Salidas: norte, sur

No me digas que no es mucho más bonito (y mejor de cara a la inmersión) algo como:
Citar:
Te encuentras en una cocina moderna, muy bonita, de silestone y todo eso.
Sendas puertas blancas la comunican con otras estancias al norte y al sur.

Pero bueno, si realmente quieres hacer la descripción tipo "plantilla", pues se hace como he dicho.

Y no das la paliza, hombre, yo encantado de que uses AGE.

Autor:  edlobez [ 30 Oct 2013 19:57 ]
Asunto:  Re: Empezando con AGE

estoy un poco intoxicado de informaTE... jejeje
lo digo por la forma de presentar las localidades.

Autor:  Al-Khwarizmi [ 30 Oct 2013 20:09 ]
Asunto:  Re: Empezando con AGE

Sí, es típico, venir de otro sistema y querer que las cosas se comporten como en él. Si realmente se quiere hacer esto, no hay problema, AGE se puede comportar de muchas maneras ya que es muy configurable. Eso sí, la configuración por defecto es distinta, y para "imitar" a otro sistema, a veces hay que tocar cosas.

Por cierto, esto me ha hecho pensar que un buen cambio para la siguiente versión de AGE puede ser hacer redefinible desde el mundo el método que muestra una localidad, de forma que no habría que redefinir dos cosas para hacer este tipo de configuración, sino sólo una. Me lo apunto para hacerlo.

Autor:  edlobez [ 31 Oct 2013 22:06 ]
Asunto:  Re: Empezando con AGE

Citar:
Nótese que puedes hacer en cualquier momento cosas como

Código:
set(self,"hablaDe",item("Pera"),"Ah, la pera. Una fruta jugosa y rica, sin duda.");


Es decir para cambiar la opinión del frutero, si primero le gusta mucho y luego por cualquier otra condición no le gusta nada:

Código:
boolean INVIERNO
...
...
if (INVIERNO) {
 set(self,"hablaDe",item("Pera"),"Ah, la pera. Una fruta jugosa y rica, sin duda.");
}
else
 set(self,"hablaDe",item("Pera"),"En estos meses prefiero los melones y las sandías.");


¿No existe una forma?:

Código:
string VARIABLE_CADENA
boolean INVIERNO
.....

if (INVIERNO)
 VARIABLE_CADENA="Ah, la pera. Una fruta jugosa y rica, sin duda.";
else
 VARIABLE_CADENA="En estos meses prefiero los melones y las sandías.";

set(self,"hablaDe",item("Pera"),VARIABLE_CADENA);

.....

Autor:  Al-Khwarizmi [ 31 Oct 2013 22:31 ]
Asunto:  Re: Empezando con AGE

Sí, claro, lo que has puesto se puede hacer tal cual. Sólo que el tipo String es con la S mayúscula, y después de declarar las variables hay que poner un punto y coma (por ejemplo, boolean invierno;). Pero por lo demás, lo que has puesto funcionará. En cualquier sitio donde puedas poner un valor, también puedes poner una variable que contenga ese valor (o una llamada a función/método que devuelva un valor de ese tipo).

Autor:  edlobez [ 31 Oct 2013 22:51 ]
Asunto:  Re: Empezando con AGE

Perfecto y si puede ser el resultado de una función, me va como lo tenía planeado.

A ver si en pocos día hago un ejemplo con lo que pretendo y te lo envío.

Gracias!

Autor:  edlobez [ 01 Nov 2013 21:48 ]
Asunto:  Re: Empezando con AGE

Buenas de nuevo...otra vez yo, es lo que tiene, unos se dedican a "...sentarte en el sillón de la sala de control, levantar las patitas y ponerte a dormir..." o otros se ponen a escribir en el foro de AGE...
A lo que iba, tengo el siguiente código:

Código:
/*
Método que captura el evento lanzado cuando una criatura entra en una habitación.
*/
void onEnterRoom ( Mobile aCreature )
{
     //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).
    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")) {             
              aCreature.writeDenial(self.getPropertyValueAsString("salidas"));
              aCreature.write("\n");
              end();
    }

    if (equals(verb, "mirar")) {
        set(self, "estado", 0);
       
    }
}



Es decir, cuando entro en la habitación, imprimo la propiedad nombre corto, luego se imprime la descripción (que le tengo puesto la condición en función del valor de estado), y luego cambio el valor de estado. Lo hago para imprimir la descripción inicial largan (estado==0) y para el resto de visitas la descripción corta (estado==1) . Menos cuando tecleemos mirar, que se vuelve al estado 0 y se imprime la larga.
Mi duda es si con este código no puede existir el problema que primero se cambie el estado, de 0 pase a 1 y luego se imprima la descripción. Daría el bug que en la primera visita se imprimiría la descripción corta. ¿Como podría saber que se ha presentado ya la descripción de la habitación?
Pondría una condición del tipo, para asegurarme de cambiar el estado siempre y cuando se haya impreso la descripción de la habitación:

Código:
if (DESCRIPCION_HABITACION_IMPRESA) {
     if (get(self, "estado")==0) {
              set(self, "estado", 1);
    }
}


o siempre la descripción de la habitación se imprime después de ejecutarse el código
Código:
 void onEnterRoom ( Mobile aCreature )

Autor:  Al-Khwarizmi [ 01 Nov 2013 23:30 ]
Asunto:  Re: Empezando con AGE

juas, me hace gracia porque haces justo todas las cosas que no me gustan. Cuando una aventura no me muestra la descripción completa de una habitación al volver a ella, suelo cerrarla :D

Respondiendo a tu pregunta, el orden en el que se ejecutan esas cosas siempre es el mismo, la descripción siempre se imprime después de onEnterRoom. Lo que pasa es que eso si no me equivoco es justo lo que no quieres, ¿no? Porque para cuando se imprima la descripción, el estado ya estará a 1, así que el código no hará lo que buscas.

Pero siempre puedes hacer una cosa: si pones la propiedad "describeRoomsOnArrival" del jugador a false, AGE no imprimirá por defecto las descripciones de las habitaciones cuando llega a ellas. De esa forma, puedes mostrar la descripción tú mismo en el propio evento onEnterRoom, y tú decides cuándo lo haces, antes o después de cambiar el estado (y en este caso te interesaría antes).

Código:
jugador.setProperty ( "describeRoomsOnArrival" , false );


Al final creo que lo que haré para la siguiente versión de AGE será hacer que se pueda redefinir en un sólo método (en el mundo) el código que muestra las habitaciones, porque así hacer este tipo de cosas será más sencillo (habrá que tocar un solo método, y no dos, como en este caso que tienes que tocar el onEnterRoom y el mirar). Pero en todo caso, sin necesidad de esperar a ese cambio en AGE, con el código que ya tienes y usando esta propiedad que digo ya tendrás el comportamiento deseado.

Autor:  edlobez [ 02 Nov 2013 08:02 ]
Asunto:  Re: Empezando con AGE

Bueno el tema es que el código tal y como te lo puse me funciona bien, pero no lo veía muy claro que siempre lo haga bien.

He puesto en el mundo:

Código:
/*Introducción del juego para un jugador*/
void intro( Player aPlayer ) {
 ...
    //forzamos que la descripción de las localidades se muestren cuando yo quiera.
    jugador.setProperty ( "describeRoomsOnArrival" , false );
...
}


Luego en la habitación

Código:
void onEnterRoom ( Mobile aCreature )
{
...   
    //mostramos la descripcion de la habitacion
    mobile("jugador").setProperty ( "describeRoomsOnArrival" , true );
    if (get(self, "estado")==0) {
              set(self, "estado", 1);
    }
   //ES NECESARIO PONER ESTA LÍNEA??????
   mobile("jugador").setProperty ( "describeRoomsOnArrival" , false );
...
}/


Es necesario después de cambiar el estado de la habitación volver a poner a false la propiedad "describeRoomsOnArrival"??? Si la volvemos a poner a false y la descripción se imprime después de onEnterRoom, teóricamente no se imprimiría la descripción, sin embargo se imprime.
O la pongo a false mejor al salir de la habitación, beforeExit???
La última pregunta cual es el orden de eventos en la habitación, que se ejecuta primero void onInit() ó void onEnterRoom
Coloqué la siguiente línea en onInit y no se imprime nada de nada

Código:
//código a ejecutar cuando se inicializa la habitación
void onInit()
{
    mobile("jugador").write("\n\nEstoy en onInit\n\n");   
}


Gracias!!

Página 2 de 6 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/