CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 26 Sep 2018 01:08

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: 30 Oct 2013 11:08 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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.

_________________
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: 30 Oct 2013 12:07 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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!

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


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 14:21 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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?.

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


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 15:31 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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.

_________________
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: 30 Oct 2013 15:41 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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!

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


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 18:42 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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...

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


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 19:42 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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.

_________________
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: 30 Oct 2013 19:57 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
estoy un poco intoxicado de informaTE... jejeje
lo digo por la forma de presentar las localidades.

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


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 20:09 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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.

_________________
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: 31 Oct 2013 22:06 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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);

.....

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


Arriba
 Perfil  
 
NotaPublicado: 31 Oct 2013 22:31 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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).

_________________
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: 31 Oct 2013 22:51 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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!

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


Arriba
 Perfil  
 
NotaPublicado: 01 Nov 2013 21:48 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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 )

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


Arriba
 Perfil  
 
NotaPublicado: 01 Nov 2013 23:30 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
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.

_________________
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 08:02 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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!!

_________________
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 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