CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 13 Ago 2020 07:04

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 252 mensajes ]  Ir a página 1, 2, 3, 4, 5 ... 17  Siguiente
Autor Mensaje
NotaPublicado: 24 Ene 2007 12:22 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Cómo algunos sabéis, llevo un tiempo desarrollando un nuevo parser que ya estoy a punto de acabar. Como se que hay gente que le interesa, me quedo con este hilo para postear información sobre el mismo.
La idea es hacer una serie de posts sobre como lo he hecho, por lo que hablaré bastante de Java y programación. También utilizaré este hilo para haceros preguntas sobre el desarrollo del mismo y ofreceré cuentas a los interesados en probarlo, ya que es un parser online y para utilizarlo hace falta usuario. Todavía no está abierto al público porque está en fase pre-alpha semi beta y no está acabado, por lo que la sintaxis del mismo puede cambiar y me gustaría tener la definición del lenguaje cerrada con los beta-testers antes de sacarlo a la luz.
Bueno, el primer mensaje de introducción al parser lo he puesto en mi blog: http://albertovilches.com/como-hacer-un-parser-de-aventuras-conversacionales-i, ya que es un poco largo y lo mismo aquí pues no interesa. Los siguientes posts si que los pegaré directamente aquí, por si alguien busca información sobre como crear un parser de aventuras. Bueno, seguiré informando.

Por cierto, la primera versión del parser saldrá a la luz (en cerrado) en cuanto acabe la seguridad del portal (usuarios, cuentas y permisos), que espero sea dentro de poco y cree una aventura completa de demo (como no, vampiro).


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 24 Ene 2007 13:40 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 04 Sep 2006 13:08
Mensajes: 37
Ubicación: Cambrils (Tarragona)
Leo en tu pagina:

Citar:
"Hasta ahora, las aventuras se crean en un ordenador, se compilan, se distribuyen y se juegan en el ordenador de cada jugador. Si son autónomas, se ejecutarán directamente, sino, deben utilizar una máquina virtual, intérprete, kit de jugador o similar para arrancarlas. Demasiados pasos para una persona que nunca ha jugado una aventura.
Sin embargo, ¿qué pasaría si con hacer click en una dirección te llevara a una página donde pudieras jugar a una aventura? No lo sé, pero voy a intentar comprobarlo."


Citar:
"Sí, ya sé lo que estáis pensando: existen intérpretes de máquina Z en formato Applet Java, lo que permite jugar aventuras hechas con Inform en una página web. Pero no es lo mismo, yo pretendo ir más allá: el interfaz es html puro con todo lo que ello conlleva: css, texto, imágenes, javascript, flash, lo que sea."


No es por ser quisquilloso, pero esto ya lo lleva haciendo el Yasmina's Quest y su motor (el cual sirve para hacer otras aventuras tambien y nisiquiera precisa de JavaScript, solo se ayuda de el) desde el 2005, del cual parece olvidarse tu post :)

Citar:
"Hablaré de parseo de frases, diccionarios de palabras, ejecución de eventos, mundos virtuales con objetos contenedores donde meter o poner encima otros objetos, conversación con personajess, desarrollo de puzzles, interacción Ajax con Json para el envío de peticiones sin refrescar el navegador, software de Wikis para acometer la monolítica tarea de documentar el parser y, como no, sobre los problemas al crear tu propio lenguaje."


Esto es muy interesante, en serio. Sobretodo lo de crear tu propio lenguaje. Tiene que ser bastante complicado crear un lenguaje propio para el parser pero muy util para facilitar las tareas a los que lo utilicen. No se me ocurre como hacerlo (¿expresiones regulares tal vez?). Aun asi, creo que es una buena idea.

Yo tambien quiero, desde hace tiempo, volver a crear un motor similar al Yasmina's Quest pero otra vez desde cero y utilizando, entre otras mejoras, Ajax para no tener que recargar la pagina (aunque tampoco seria muy dificil implementar Ajax en el motor antiguo). Lo del lenguaje propio mejor no ya que no me veo muy capaz, al menos de momento ;) o quiza si, pero uno muy sencillo.

Suerte con tu proyecto. No se casi nada de Java (ni JSP) pero es un lenguaje que me gustaria aprender. Aun asi, si vas posteando aqui, siempre que pueda y lo vea conveniente, ire comentando cosillas.

Saludos.

_________________
------
Juan Alba Maldonado


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 24 Ene 2007 14:29 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Jeje, conozco Yasmina's Quest, pero te diré porque no lo he mencionado: hasta donde yo sé, no es un parser o motor directamente utilizable para desarrollar juegos (corrígeme si me equivoco por favor), sino un juego muy bien desarrollado que utiliza una librería en php con la cual se pueden hacer otros juegos similares, pero requiere programar en php.
De todas formas, te puedo asegurar que tu aventura fue una precursora de mi idea final (de hecho, ¿no las sacaste en septiembre del 2006?)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 24 Ene 2007 16:47 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 04 Sep 2006 13:08
Mensajes: 37
Ubicación: Cambrils (Tarragona)
Bueno, depende de lo que entendamos por parser... se trata de un motor en PHP y JavaScript que se forma por un conjunto de funciones y demás codigo que leen los archivos que componen la aventura en si (objetos.php y paisajes.php, creo no olvidarme de ninguno) y los interpretan.

Este motor es independiente del codigo que forma la aventura, aunque es cierto que este tiene que ser programado en PHP (el creador de la aventura no necesita aprender ningun lenguaje nuevo que solo sirva para crear la aventura, esa es la ventaja... ademas, el PHP es muy potente). Por lo tanto, tenemos un codigo que es la aventura en si y un "interprete" o "motor" (un parser).

El aspecto visual se configura mas que nada en index.php, pudiendo utilizar si se prefiere CSS. Tambien tiene otros aparatados como el mapa (mapa.php) o la ayuda (ayuda.php).

Las aventuras salieron en el 2006. La villa del seis es del 2006, pero el Yasmina's Quest y su motor fueron finalizados (que no publicados) en el 2005.

_________________
------
Juan Alba Maldonado


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 29 Ene 2007 23:57 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Bueno, aprovechando este hilo, a ver si alguien lo lee, voy a lanzar unas preguntas al aire que me gustaría que respondierais.
Se trata del comportamiento por defecto de los objetos con el jugador, accesibilidad o alcance y visibilidad.
En mi parser existen 3 tipos de relaciones entre los objetos: que estén encima (si es soporte), que estén dentro (si es recipiente) y que formen parte de el (cualquier objeto).
De manera que un mismo objeto puede ser recipiente y soporte a la vez para tener cosas encima y dentro. Además, cualquier objeto puede estar formado por otros objetos.
Por otro lado, si un objeto es "recipiente" y, además, "entrable", el jugador se puede meter dentro. Y si un objeto es "soporte" y "subible", el jugador se puede subir encima. Pensemos también que un objeto puede ser "soporte subible recipiente entrable" y ya tenemos la fiesta montada.
Si los recipientes son abribles, se pueden abrir y cerrar. Si no lo son, siempre están abiertos. Por otro lado, pueden ser transparentes.

Visualicemos estos objetos en un árbol, en el que la rama principal es la localidad y el jugador es hijo de esta localidad. Los objetos que están en el suelo de la localidad son también hijos de la misma, como el jugador. Si un objeto está encima de otro, es un hijo del mismo (solo que tiene una "marca" que indica que relacion tiene: dentro, encima o componente).

Explicado el asunto (como veis, es igual que Inform, solo que añade las relaciones. Además, creo que Inform7 ya soporta este tipo de relaciones y otras nuevas) vayamos con algunas afirmaciones que he tomado como correctas, pero que pueden ser erróneas:

- Visibilidad: el jugador de una localidad puede ver (examinar) cualquier objeto, salvo los que estén dentro de un objeto cerrado no transparente.

- Accesibilidad: el jugador de una localidad puede acceder (coger, empujar, etc, cualquier acción que requiera contacto físico, que son todas salvo examinar, incluido registrar) a cualquier objeto, salvo los que estén dentro de un objeto cerrado, sin importar si éste es transparente o no.

- Existen 2 comandos: ponAlcance y quitaAlcance que sirven para añadir o quitar objetos accesibles al jugador. La duración de este comando puede ser solo la orden actual o para siempre (es decir, hasta que el autor de la aventura lo deje como estaba). ¿Es útil que la duración de este comando dure más que la petición actual? ¿Debería de añadir tambien ponVisible y quitaVisible?

- Los componentes de un objeto se comportan como objetos estáticos o decorado, los cuales se pueden manipular (abrir, empujar) pero no se pueden mover de su sitio (coger).

- Si el jugador entra en un objeto cerrado (es decir, lo abre, entra y lo cierra desde dentro), entonces solo puede ver y acceder a todos los objetos hijos que estén dentro del objeto en el que se encuentra dentro. (Así, si el jugador entre en un armario y lo cierra, no podrá acceder a los objetos que estén encima o formen parte del armario, pero si a los que estén dentro). Si el objeto en el que se encuentra es transparente, puede ver lo que vería antes de entrar, pero solo podrá acceder a los objetos de dentro.

- Si el jugador entra en un objeto abierto o se sube a un objeto, no se modifica la accesibilidad o visibilidad del resto de objetos antes de subirse o meterse.

- Si el jugador está dentro o encima de un objeto e intenta salir o bajar de el (con la orden salir/bajar, que son sinónimas en este caso), el parser buscará el siguiente objeto entrable o subible entre el parentesco del nodo de su rama cuyo relacion con su padre sea compatible con el jugador, hasta llegar a la localidad (la raiz) y lo situará en este objeto (o la localidad si no encuentra ninguno).
Por ejemplo, el jugador está dentro de una caja grande que es "entrable". Esta caja está encima de en una mesa que es "soporte" pero no es "subible". Esto puede parecer un tanto extraño pero es posible: la mesa es un soporte donde hay una caja, podemos entrar dentro de la caja, pero no podemos subirnos a la mesa! La mesa también es un recipiente entrable que puede contener dentro cosas (y el jugador se podría meter), y además, es es un componente de un gran mueble que hay en la localidad actual. Si el jugador sale de la caja, dado que la caja está "encima" de la mesa, el jugador intentará subirse a la mesa. Como la mesa no es "subible", es incompatible con el jugador, así que se busca su siguiente padre. El siguiente padre es el mueble, pero como la mesa es un componente de dicho mueble, no es compatible (para que lo fuera, el jugador debería poder ser un componente de un objeto, y esto no se admite... ¿o podría ser?). Se busca el siguiente padre que es la localidad, así que el jugador se baja directamente de la caja a la localidad, sin pasar por la mesa y el mueble por ser incompatibles.

- El jugador puede subir y entrar en cualquier objeto subible y entrable que sea accesible desde donde está. Esta parte es la que más dudo, ya que permite pegar "saltos" entre objetos. Quizá lo cambie por que el jugador solo puede subir o entrar en objetos hijos del objeto actual donde se encuentra, pero no de su parentesco (la rama de padres que va desde el objeto jugador directamente hasta la raíz).

Bueno, ¿qué os parece? ¿está incompleto? ¿alguna afirmación es errónea? O la respuesta más interesante: si pudiérais elegir un parser ideal ¿como os gustaría que se comportaran los objetos con el jugador?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 30 Ene 2007 01:43 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 03 Nov 2004 17:15
Mensajes: 300
Ubicación: ... muy lejos de todo lo que se hace llamar social...
betopica escribió:
... Si el jugador sale de la caja, dado que la caja está "encima" de la mesa, el jugador intentará subirse a la mesa. Como la mesa no es "subible", es incompatible con el jugador, así que se busca su siguiente padre. El siguiente padre es el mueble, pero como la mesa es un componente de dicho mueble, no es compatible (para que lo fuera, el jugador debería poder ser un componente de un objeto, y esto no se admite... ¿o podría ser?). Se busca el siguiente padre que es la localidad, así que el jugador se baja directamente de la caja a la localidad, sin pasar por la mesa y el mueble por ser incompatibles.


Todo tu analisis me parece correcto y completo. Como sabes, yo también estoy desarrollando un parser, y de verdad ni sueño en implementar todas esas propiedades y atributos. En la primera versión solo tendré implementado la relación de contenido y continente.

Por otro lado, lo que he pensado sobre la relación de encimade es tan simple como que un objeto admite otro objeto encima o no, y que un objeto puede estar encima de otro o no. Pero debe haber otra propiedad que es si es escalable o no. De esto depende si el jugador puede montarse encima de un objeto. Yo puedo colocar un sobrero sobre una mesa, y puedo montarme sobre una mesa, pero no puedo montarme sobre un escapararate, pero si puedo montar un sombrero sobre él. Pero adicionalmente una mesa admite a una silla encima, pero una silla no admite a una mesa encima, así que hay que implementar adicionalmente si se puede montar o no dependiendo del tipo de objeto. Es muy complicado y de verdad te felicito si ya tienes implementado todo esto.

Yo solamente he implementando la relación de continente y contenido y me tomé bastante tiempo haciéndolo.

_________________
Slds,

/\+++++/\
< agnas >
\/+++++\/
http://www.micronosis.com/


Arriba
 Perfil  
 
NotaPublicado: 07 Feb 2007 01:02 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Una de las funcionalidades del interprete de aventuras es registrar en ficheros de log las partidas de los usuarios.
De esta manera, al entrar en la cuenta de cada autor de aventuras, aparecerá un listado de aventuras publicadas, cuantos jugadores hay activos (sesiones abiertas que están utilizando tu aventura, esto puede ser muy interesante, imaginate "anda, hay 6 tios jugando ahora mismo a mi aventura!") y podemos ver los logs de los jugadores actuales (y pasados). Estos logs guardan todo lo que ha tecleado el jugador (las ordenes) y sus respuestas. Una de las utilidades de esto podria ser testear nuestra aventura para poder saber si los jugadores se desenvuelven facilmente o por el contrario permanecen siempre atascados (por poner un ejemplo).

Sin embargo, esto ¿atenta contra la privacidad del jugador? ¿O mientras no se muestren sus datos personales y demas (cosa que nunca se hace, mas que nada porque no se pide: para entrar solo hace falta login y password) podemos "indagar" todo lo que queramos en su historial de partidas?

Es decir: si vosotros jugarais una aventura via web y supierais que vuestras partidas estan siendo registradas, ¿os molestaria?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 07 Feb 2007 10:47 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 04 Sep 2006 13:08
Mensajes: 37
Ubicación: Cambrils (Tarragona)
Hola, buenas.

Para los objetos que sean "subibles" o que se pueda poner algunos objetos encima de ellos yo lo resolveria de tal forma: siempre que quieras que un objeto tenga una propiedad, aplicasela (algo asi como objeto->propiedad = si). Y si quieres que tenga una propiedad con segun que objetos, por ejemplo que se le pueda poner encima segun que otros objetos, aplicasela tambien (objeto->es_subible_por = objetos). Necesitaras un motor que funcione al aplicarle estas propiedades y demas.

Para entrar en un objeto, yo haria que el objeto fuese una estancia (o salida, como prefieras llamarlo) pero con propiedades particulares. No se si me estoy dejando algo.

Quiza sea una tonteria y no coincida con todo lo que quieras hacer.

Sobretodo no te olvides de publicar explicaciones de como has resuelto segun que cosas, entre mas mejor. Asi podemos aprender de todos :) igual que he dicho en el otro hilo del remake de la aventura original, es muy interesante lo del desarrollo lexico, entre otras cosas.

En cuanto a lo de si es etico o no guardar estadisticas de los comandos que han enviado las personas a la aventura, yo opino que no es problema. De hecho, yo cada dia miro esos datos en el Yasmina's Quest y en La villa del seis gracias al programa de estadisticas Urchin que tengo en el servidor. Puedo ver todos los comandos que han enviado los usuarios, hacer mas estadisticas o calculos con ellos, ver si es dificil resolver las aventuras, los puzzles que mas fastidian a la gente, los fallos mas comunes al escribir, etc. Me ayudaran a crear mejores aventuras o eso espero :) En cuanto a la privacidad e intimidad del aventurero, es una forma totalmente anonima para el: solo interesan las consultas y no sus datos personales (bueno, esto no es cierto del todo porque puede ser interesante saber si en determinado pais es mas frecuente utilizar unas ordenes que otras, por ejemplo... pero no supone una invasion de la intimidad a mi entender). Google y otros buscadores tambien hacen estadisticas de busqueda para saber cuales son los terminos mas buscados, etc.

Saludos.

_________________
------
Juan Alba Maldonado


Arriba
 Perfil  
 
NotaPublicado: 07 Feb 2007 12:09 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 03 Nov 2004 17:15
Mensajes: 300
Ubicación: ... muy lejos de todo lo que se hace llamar social...
betopica escribió:

Es decir: si vosotros jugarais una aventura via web y supierais que vuestras partidas estan siendo registradas, ¿os molestaria?


Yo creo que esto se podría colocar como una opción. Aquellos jugadores que no les importe que sus partidas se hagan púplicas, lo indican con alguna opción la configuración de la cuenta. Aunque como dice Alba esto va a quedar totalmente diluido en el anonimato.

_________________
Slds,

/\+++++/\
< agnas >
\/+++++\/
http://www.micronosis.com/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 12 Feb 2007 08:50 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
jalbam escribió:
Hola, buenas.

Para los objetos que sean "subibles" o que se pueda poner algunos objetos encima de ellos yo lo resolveria de tal forma: siempre que quieras que un objeto tenga una propiedad, aplicasela (algo asi como objeto->propiedad = si). Y si quieres que tenga una propiedad con segun que objetos, por ejemplo que se le pueda poner encima segun que otros objetos, aplicasela tambien (objeto->es_subible_por = objetos). Necesitaras un motor que funcione al aplicarle estas propiedades y demas.


La definicion de los objet
jalbam escribió:
Hola, buenas.

Para los objetos que sean "subibles" o que se pueda poner algunos objetos encima de ellos yo lo resolveria de tal forma: siempre que quieras que un objeto tenga una propiedad, aplicasela (algo asi como objeto->propiedad = si). Y si quieres que tenga una propiedad con segun que objetos, por ejemplo que se le pueda poner encima segun que otros objetos, aplicasela tambien (objeto->es_subible_por = objetos). Necesitaras un motor que funcione al aplicarle estas propiedades y demas.


La definicion de los objetos se hace de esta forma:

objeto idlib estaen X
nombre Libreria
flags subible,recipiente
finobjeto

Y despues, para modificar los flags, basta con poner

idlib.subible=false

Lo que sucede es que los flags subible,entrable,recipiente y soporte son inmutables: una vez que el objeto tiene ese flag no se puede cambiar, de esta manera se evita que un objeto no deje cosas dentro de si mismas "atrapadas"...

jalbam escribió:
Para entrar en un objeto, yo haria que el objeto fuese una estancia (o salida, como prefieras llamarlo) pero con propiedades particulares. No se si me estoy dejando algo.

Quiza sea una tonteria y no coincida con todo lo que quieras hacer.


La implementación del "movimiento" o la capacidad de que el jugador este dentro de un objeto o encima ya esta hecha. El problema (aunque esta ya todo casi resuelto) es la relación, condiciones o restricciones que se debe poner al jugador cuando coge o deja objetos o cuando entra y sale (o sube) de otros objetos. Estas condiciones deben ser lo más parecidas al mundo real posible, de ahí que os posteara todas las que yo he tenido en cuenta por si hubiera alguna discrepancia. Supongo que al desarrollar juegos saldrán errores al jugar a las aventuras que estarán relacionados con el motor (y no con la aventura en sí).

jalbam escribió:
Sobretodo no te olvides de publicar explicaciones de como has resuelto segun que cosas, entre mas mejor. Asi podemos aprender de todos :) igual que he dicho en el otro hilo del remake de la aventura original, es muy interesante lo del desarrollo lexico, entre otras cosas.


La documentación es una de las partes más importantes en cualquier desarrollo de este estilo, pero es una tarea titánica que requiere tieeeeeeempo. Pero si, hay que hacer buenos ejemplos![/quote]

jalbam escribió:
En cuanto a lo de si es etico o no guardar estadisticas de los comandos que han enviado las personas a la aventura, yo opino que no es problema. De hecho, yo cada dia miro esos datos en el Yasmina's Quest y en La villa del seis gracias al programa de estadisticas Urchin que tengo en el servidor. Puedo ver todos los comandos que han enviado los usuarios, hacer mas estadisticas o calculos con ellos, ver si es dificil resolver las aventuras, los puzzles que mas fastidian a la gente, los fallos mas comunes al escribir, etc. Me ayudaran a crear mejores aventuras o eso espero :) En cuanto a la privacidad e intimidad del aventurero, es una forma totalmente anonima para el: solo interesan las consultas y no sus datos personales (bueno, esto no es cierto del todo porque puede ser interesante saber si en determinado pais es mas frecuente utilizar unas ordenes que otras, por ejemplo... pero no supone una invasion de la intimidad a mi entender). Google y otros buscadores tambien hacen estadisticas de busqueda para saber cuales son los terminos mas buscados, etc.


Al final las he dejado configurables a petición del autor de cada aventura. El que quiera grabar los logs de sus aventuras, que lo active y ya está. Creo que como depuración es una utilidad bastante interesante.os se hace de esta forma:

objeto idlib estaen X
nombre Libreria
flags subible,recipiente
finobjeto

Y despues, para modificar los flags, basta con poner

idlib.subible=false

Lo que sucede es que los flags subible,entrable,recipiente y soporte son inmutables: una vez que el objeto tiene ese flag no se puede cambiar.

jalbam escribió:
Para entrar en un objeto, yo haria que el objeto fuese una estancia (o salida, como prefieras llamarlo) pero con propiedades particulares. No se si me estoy dejando algo.

Quiza sea una tonteria y no coincida con todo lo que quieras hacer.


La implementación del "movimiento" o la capacidad de que el jugador este dentro de un objeto o encima ya esta hecha. El problema (aunque esta ya todo casi resuelto) es la relación, condiciones o restricciones que se debe poner al jugador cuando coge o deja objetos o cuando entra y sale (o sube) de otros objetos. Estas condiciones deben ser lo más parecidas al mundo real posible, de ahí que os posteara todas las que yo he tenido en cuenta por si hubiera alguna discrepancia. Supongo que al desarrollar juegos saldrán errores al jugar a las aventuras que estarán relacionados con el motor (y no con la aventura en sí).

jalbam escribió:
Sobretodo no te olvides de publicar explicaciones de como has resuelto segun que cosas, entre mas mejor. Asi podemos aprender de todos :) igual que he dicho en el otro hilo del remake de la aventura original, es muy interesante lo del desarrollo lexico, entre otras cosas.


La documentación es una de las partes más importantes en cualquier desarrollo de este estilo, pero es una tarea titánica que requiere tieeeeeeempo. Pero si, hay que hacer buenos ejemplos![/quote]

jalbam escribió:
En cuanto a lo de si es etico o no guardar estadisticas de los comandos que han enviado las personas a la aventura, yo opino que no es problema. De hecho, yo cada dia miro esos datos en el Yasmina's Quest y en La villa del seis gracias al programa de estadisticas Urchin que tengo en el servidor. Puedo ver todos los comandos que han enviado los usuarios, hacer mas estadisticas o calculos con ellos, ver si es dificil resolver las aventuras, los puzzles que mas fastidian a la gente, los fallos mas comunes al escribir, etc. Me ayudaran a crear mejores aventuras o eso espero :) En cuanto a la privacidad e intimidad del aventurero, es una forma totalmente anonima para el: solo interesan las consultas y no sus datos personales (bueno, esto no es cierto del todo porque puede ser interesante saber si en determinado pais es mas frecuente utilizar unas ordenes que otras, por ejemplo... pero no supone una invasion de la intimidad a mi entender). Google y otros buscadores tambien hacen estadisticas de busqueda para saber cuales son los terminos mas buscados, etc.


Al final las he dejado configurables a petición del autor de cada aventura. El que quiera grabar los logs de sus aventuras, que lo active y ya está. Creo que como depuración es una utilidad bastante interesante.


Arriba
 Perfil  
 
 Asunto: Avances
NotaPublicado: 05 Mar 2007 19:28 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Tras una maratón de picar para acabar el portal donde permitir a los usuarios registrarse y poder crear y jugar aventuras, estos son lo últimos avances que se he implementado:
- Registro y login de usuarios, crear y editar proyectos (tira de MySql)
- Jugar aventuras, registrar log de la partida en servidor (opcional)
- Salvar estado de la aventura en servidor. Falta salvar descargándote la partida en un fichero (para los usuarios que no quieran registrarse) y cargar partidas. El formato de las partidas es en XML, comprimido con zip y cifrado. El autor de la aventura podrá abrir las partidas y modificarlas (bajo petición de los jugadores. esto es útil para, por ejemplo, corregir una partida guardada mal o ver fallos, etc).

Y la primera prueba de fuego pasada con éxito: el desarrollo de la aventura Vampiro. En realidad es un port directo de la versión de Vampiro en Informate, aunque al jugarla, hay algunos comportamientos distintos a la hora de abrir/cerrar objetos, o subirse a los mismos. Voy a ver si puedo subir el código de la misma en un adjunto o copio y pego en el próximo mensaje, a ver si me deja.
Como veréis, es un código muy parecido a Inform y, como dijo alguien que ahora no recuerdo: "sin tanto punto y coma".


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 05 Mar 2007 19:34 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Código:
define include system/default
define global objetosposeidos
Inicio:
   #global.objetosposeidos = 0

   println "(c) 1998 Jaume Alcazo Castellarnau"
   println "^Esta es la versión programada en XXX del juego \
      Vampiro original de Aventuras ALCAZO. Para más información \
      teclea HISTORIA en el juego.^^Muchas gracias por jugar^"

   #global.jugadorA(Hall,2)

gramatica
   Afilar (accesible,!localidad) (accesible,!localidad):
      afila *
      afila * con *
      -i afila con * *
      -p afila
      -p afila con *

   Ayuda:
      ayuda

fingramatica

localidad plantilla Habitacion
   reaccionPreExaminarDireccion:
      if #uno == arriba
         println "El techo está muy alto y es de piedras."
         stop
      elseif #uno == abajo
         println "El suelo es de piedras y está muy frío."
         stop
      endif
finobjeto

objeto plantilla Elemento
   alCoger:
      #global.objetosposeidos = #global.objetosposeidos+1
      debug "Has cogido algo que puede matar al vampiro. Ya tienes "+#global.objetosposeidos

   alDejar:
      #global.objetosposeidos = #global.objetosposeidos-1
      debug "Has dejado algo que puede matar al vampiro. Te quedan "+#global.objetosposeidos
finobjeto

localidad Hall tipo Habitacion
   nombre vestíbulo
   salidas [
      al_n:Pasillo
   ]

   DescLarga:
       println "Estás en el vestíbulo del castillo. El ambiente es muy\
       húmedo y frío. Estás en un pasillo que se extiende hacia\
       el norte. Al sur queda la puerta de entrada al castillo."

   DescInicial:
      print "Despiertas aturdido. Después de unos segundos te incorporas\
      en el frío suelo de piedra y ves que estás en un\
      castillo. ¡Ahora recuerdas! Eres reXXe y tu misión es la de\
      matar al vampiro. TIENES que matar al vampiro que vive en la\
      parte superior del castillo...^^"
finobjeto

objeto LaPuerta espartede Hall
   nombre FS:puerta
    sinonimos puerta de? salida, puerta de? entrada
    flags abrible,!abierto
   DescLarga:
      println "Es muy grande y está cerrada. No la vas a poder abrir"
   preAbrir:
      println "¡Te he dicho que no la puedes abrir, ¡Melón!"
      stop
finobjeto

objeto PasilloDesdeVestibulo espartede Hall
    nombre MS:pasillo principal
    sinonimos MS:pasillo
   DescLarga:
      println "Es el pasillo principal, se extiende hacia el norte."
finobjeto

localidad Pasillo tipo Habitacion
   nombre pasillo
   salidas [
      al_s:Hall
      al_n:Escalera
      al_e:Biblioteca
      al_o:Cocina
   ]
   DescLarga:
      println "Te encuentras en medio del pasillo principal de este\
       piso. Al oeste está la cocina y al este la biblioteca. El\
       pasillo sigue hacia el norte."

finobjeto

localidad Biblioteca tipo Habitacion
   nombre Biblioteca
   salidas [
      al_o:Pasillo
   ]
    DescLarga:
       println "Te hallas en la biblioteca del castillo. Obviamente está\
       llena de libros interesantes, pero desgraciadamente no\
       tienes tiempo para leerlos."
finobjeto

objeto Crucifijo tipo Elemento estaen Biblioteca
   nombre MS:crucifijo plateado
   sinonimos MS:crucifijo, cruz de? plata
   sinonimos FS:cruz, cruz de? plata

   DescLarga:
       println "Es un pequeño crucifijo plateado. Es uno de los cuatro\
       elementos que nos servirán para derrotar al vampiro."
finobjeto

objeto Palanca estaen Biblioteca
   nombre FS:palanca
    sinonimos palanca de? acero toledano?
   DescLarga:
       println "Es una palanca de acero toledano. Sirve para forzar cosas."
finobjeto

objeto Libros estaen Biblioteca
   nombre MP:libros
    sinonimos MS:libro
    flags nodescribe
    DescLarga:
       println "Montones de libros, pero no tengo tiempo para leer ahora."

   preCoger:
       println "No quiero cargar con los libros, no hay tiempo para leerlos."
       stop
finobjeto

localidad Cocina tipo Habitacion
   nombre Cocina
   salidas [
      al_e:Pasillo
   ]
    DescLarga:
       println "Estás en la cocina del castillo. Esto está lleno de\
       cacerolas y de cacharros para cocinar. Hay un horno, un\
       fregadero y un armario pequeño."
finobjeto

objeto Horno espartede Cocina
   nombre MS:horno
   DescLarga:
       println "Un simple horno, no tiene ninguna importancia."
finobjeto

objeto Cacharros estaen Cocina
    nombre MS:cacharro
    sinonimos MP:cacharros,FS:cacerola,FP:cacerolas
   flags estatico,nodescribe
   DescLarga:
      println "Simples cacerolas y cacharros de cocina."
finobjeto


objeto Cuchillo estaen Cocina
   nombre MS:cuchillo
   DescLarga:
      println "Un simple cuchillo de cocina. Pincha."
finobjeto

objeto Fregadero estaen Cocina
    nombre MS:fregadero
   flags estatico,nodescribe,recipiente
   DescLarga:
       println "Es un fregadero de piedra."
       #system.accion("BuscarEn",#uno)
finobjeto

objeto Armario espartede Cocina
    nombre MS:armario
    flags recipiente,abrible,!abierto,cerrojo,cerrojoechado
    atributos [
      conllave:Llavecita
   ]
   DescLarga:
       if #self.cerrojoechado
          println "Está cerrado con llave."
       elseif (#self.abierto && Ajos.oculto)
          // Si no hemos encontrado los ajos
         Ajos.oculto = false
         // Los hacemos aparecer
         println "Al examinarlo se te cae al suelo una ristra de ajos \
            que estaba en su interior."
       else
          /* Si los ajos ya habían sido encontrados, nos
         limitaremos a listar los contenidos del armario (que
         estará vacío a menos que el jugador meta algo) */
         #system.accion("BuscarEn",#self)
      endif
   postQuitarCerrojo, postAbrirCon:
      startprint
      #system.accion("Abrir",#self)
      rollbackprint


finobjeto

localidad Escalera tipo Habitacion
   nombre Escaleras
   salidas [
      al_s Pasillo
      al_e Sala
      al_o Dormitorio
      abajo Sotano
      arriba Rellano
   ]
    DescLarga:
       println "Te hallas en el final del pasillo. Delante de tí ves unas\
       escaleras que suben y otras que bajan. Al oeste está el\
       dormitorio y al este la sala de estar."
finobjeto

objeto Escalones_escalera espartede Escalera
   nombre FS:escalera
    sinonimos MS:escalon,MP:escalones,FP:escaleras
    DescLarga:
       println "Unas polvorientas escaleras. Unas suben y otras bajan"
finobjeto


localidad Dormitorio tipo Habitacion
   nombre Dormitorio
   salidas[
      al_e Escalera
   ]
    DescLarga:
       println "Estás en un dormitorio no muy grande ni tampoco muy\
          pequeño. Es bastante austero. Sólo hay una cama y un\
          armario."
finobjeto


objeto Armario_dormitorio espartede Dormitorio
   nombre MS:armario
    flags recipiente,abrible,!abierto,entrable
finobjeto

objeto Cama espartede Dormitorio
    nombre FS:cama
   DescLarga:
      println "Está cubierta de sábanas."
finobjeto

objeto Sabanas espartede Cama
    nombre FS:sabana
    sinonimos FP:sabanas
    DescLarga:
       if Llavecita.oculto
          Llavecita.oculto = false
          println "Entre ellas encuentras una pequeña llavecita."
       endif
       println "Sábanas corrientes y molientes."
finobjeto

localidad Sala tipo Habitacion
   nombre Sala de estar
   salidas [
      al_o Escalera
   ]
   DescLarga:
       println "Es la sala más acogedora de todo el castillo. En la\
       chimenea los últimos restos de algún fuego chisporrotean\
       alegremente. Hay una mesa grande con una silla al lado. De\
       la pared cuelgan bastantes trofeos de caza y adornos\
       varios."
finobjeto


objeto Trofeos espartede Sala
    nombre MS:trofeo
    sinonimos MP:trofeos
   DescLarga:
      println "Insignificante"+#uno.s()+" trofeo"+#uno.s()+"."
 finobjeto

objeto Adornos espartede Sala
    nombre MS:adorno
    sinonimos MP:adornos
   DescLarga:
      println "Adorna"+#uno.n()+"."
 finobjeto

objeto Chimenea espartede Sala
    nombre FS:chimenea
    sinonimos MS:ladrillos,FP:ladrillos
   DescLarga:
       println "Es una chimenea hecha de ladrillos y muy elegante."

   preMeterse:
      println "No he venido aquí a hacer de Santa Claus."

   preBuscarEn:
      #system.accion("Examinar",Restos)
      stop
finobjeto

objeto Restos espartede Sala
   nombre MP:restos de un fuego
   sinonimos MP:restos de? fuego,MP:restos,MS:fuego
   DescLarga:
       if Madero.oculto
         Madero.oculto = false
         println "Entre los restos del fuego encuentras un trozo de\
         madera."
       else
          println "Son los restos de algún fuego reciente."
       endif
finobjeto

objeto Mesa estaen Sala
    nombre FS:mesa
    sinonimos MS:gran? mesa de? caoba
    flags estatico,nodescribe,subible
   DescLarga:
       println "Una mesa de caoba, bastante grande."
finobjeto

objeto Silla estaen Sala
    nombre FS:silla
    sinonimos silla comoda?
    flags estatico,nodescribe,subible
   DescLarga:
       println "Una cómoda silla."
   preSubirse:
      println "Te sientas en la silla, y después del breve descanso\
       te levantas otra vez."
       stop
finobjeto

objeto Sotano tipo Habitacion
   nombre sótano
   salidas [
      arriba Escalera
   ]
   DescLarga:

       println "En este pequeño sótano hace mucho calor, sientes una\
       sensación de recogimiento. Está todo muy sucio. Hay un\
       barril aquí, también hay unas escaleras que suben."
finobjeto

objeto Escalones_Sotano espartede Sotano
   nombre FS:escalera del sotano
   sinonimos FP:escaleras,MP:escalones
   sinonimos FP:escaleras del? sotano,MP:escalones del? sotano
    DescLarga:
       println "Estos escalones conducen al piso superior"
finobjeto

objeto Barril estaen Sotano
   nombre MS:barril
   flags estatico,abrible,!abierto,nodescribe,recipiente
   validaAbrir, validaAbrirCon:

       if #self.abierto
          println "El barril ya está abierto."
       elseif (#otro != Palanca)
          println "Intentas abrirlo, pero no tienes la suficiente fuerza."
      else
          #self.abierto = true
          println "-¡Clack!- Haciendo palanca logras abrir el barril."
       endif
       stop
finobjeto

objeto Martillo tipo Elemento estaen Barril
    nombre MS:martillo
    sinonimos MS:martillo grande?
   DescLarga:
      println "Un martillo grande. Es uno de los elementos que\
       me permitirán acabar con el vampiro."
finobjeto

localidad Rellano tipo Habitacion
   nombre Rellano
   salidas [
      abajo Escalera
      al_o Vampiro
   ]
    DescLarga:
       println "Estás en el piso superior del castillo. Aquí hace aún más\
       frío que abajo. Detrás de tí están las escaleras que bajan\
       y hacia el oeste está la habitación del vampiro."
finobjeto


objeto Escalones_arriba espartede Sotano
   nombre FS:escalera del sotano
   sinonimos FP:escaleras,MS:escalon,MP:escalones
   DescLarga:
        println "Conduce"+#self.n()+" al piso inferior."
finobjeto


localidad Vampiro tipo Habitacion
   nombre El Final
   salidas [
      al_e Rellano
   ]
    DescLarga:
       println "Estás en una habitación desnuda. Unicamente hay un altar\
       en el centro. Encima del altar puedes ver un ataud."
finobjeto

objeto Altar estaen Vampiro
    nombre MS:altar
    flags estatico, nodescribe, subible
   DescLarga:
       println "Es un altar de dura piedra. Encima de éste está el\
       ataud."
   preSubirse:
       println "No parece lo más apropiado ahora mismo."
       stop
finobjeto

objeto Ataud estaen Vampiro
   nombre MS:ataud
    sinonimos feretro, ataud|feretro de? pino
    sinonimos FS:caja, FS:caja de? pino
    flags estatico,nodescribe,abrible,!abierto
   DescLarga:
       println "Una sencilla caja de pino."

   preAbrir:
      if #global.objetosposeidos < 4
           println "Necesito cuatro cosas antes de poner fin a la ~vida~ del\
           vampiro. A saber: un crucifijo, una ristra de ajos, una\
           estaca afilada y un martillo."
      else

          #global.finjuego=true

          println "Abres el ataud. Dentro contemplas la horrible cara del\
             vampiro. Protegido por los ajos y el crucifijo empiezas tu\
             horrible tarea. Le clavas la estaca en el pecho y de un\
             terrible golpe de martillo la hundes en lo más profundo de\
             su ser. Con un grito de agonía se deshace en polvo y tú\
             acabas tu misión aquí.^^Por ahora...^^"

          println "Finis."
      endif
      stop
finobjeto

objeto Estaca tipo Elemento estaen jugador
   nombre FS:estaca afilada
    sinonimos estaca
    flags oculto
    DescLarga:
      println "Un cacho de madera rectangular y alargado, uno \
          de sus extremos esta afilado cuidadosamente."
   preAfilar:
      println "Ya está bastante afilada."
      stop
finobjeto

objeto Madero estaen Sala
   nombre MS:trozo de madera
    sinonimos FS:madera,MS:madero,MS:trozo|cacho de? madera|madero
    flags oculto
    DescLarga:
      println "Un trozo de madera, rectangular y alargado"

   preAfilar:
      if #otro==null
         println "Necesitas algo para filar "+#uno.el()
      elseif #otro==Cuchillo
         Madero.oculto = true
         Estaca.oculto = false
         #global.objetosposeidos = #global.objetosposeidos+1
         println "Afilas la madera con el cuchillo ¡y obtienes una\
         estaca!"
      else
          println "No puedes afilar el madero con eso.";
      endif
      stop
finobjeto

objeto Ajos tipo Elemento estaen Cocina
   nombre FS:ristra de ajos
    sinonimos FS:ristra,FS:ristra de? ajos
    sinonimos MS:ajo,MP:ajos
    flags oculto
   DescLarga:
      println "Es una ristra entera de ajos que expelen un olor\
          un tanto asqueroso. Es uno de los cuatro elementos que me\
          servirán para derrotar al vampiro."
   preOler:
       println "Puagh."
   preComer:
      println "Ni hablar, me daría halitosis."
finobjeto

objeto Llavecita estaen Dormitorio
   nombre FS:pequeña llavecita
    sinonimos llave,llavecita pequeña?
    flags oculto
   DescLarga:
      println "Esta pequeña llavecita tiene la pinta de abrir un\
          armario o algo así."
 finobjeto

objeto traje encimade jugador
   nombre MS:traje barato
   sinonimos traje
   flags prenda
    DescLarga:
       println "Es un traje barato comprado en las rebajas."
finobjeto

/*
!-----------------------------------------------
! Objetos flotantes (aparecen en varios lugares)
!-----------------------------------------------

Object paredes "paredes"
 with    nombre_f 'pared',
    nombre_fp 'paredes',
   genero G_FEMENINO+G_PLURAL,
   descripcion "Las paredes son muy gruesas, humedas y frias al
       contacto."
   antes [;
    Tocar: <<Examinar self>>;
   ],
   esta_en [;
       rtrue;  ! Aparecen en TODOS los lugares del juego
   ],
 has    escenario;
*/

accionAyuda:
   args o1,o2
   println "Ja, ¡Te lo has creído! :-))) No; piensa un poco, amigo, es la\
       aventura más sencilla del mundo, si no puedes con esto, no podrás\
       con ninguna."

accionAfilar:
   args o1,o2
   if o2 == null
      println "Pero ¿con qué quieres afilar "+o1.el()+"?"
   else
      if o2 == Cuchillo
          println "No creo que sirva de nada afilar "+o1.el()+"."
       else
         println o2.El()+" no sirve para   afilar."
      endif
    endif
    stop


No he podido añadir un attach al correo, así que copio y pego el código de la aventura aquí.
Con respecto a la versión de InformATE, falta el objeto flotante paredes, el cual tendré que implementar.
Si ocupa demasiado, lo elimino y lo subo a algún ftp.

Estoy abierto a cualquier sugerencia en cuanto a código. Seguiremos informando, un saludo a todos!


Arriba
 Perfil  
 
 Asunto: XXX
NotaPublicado: 06 Mar 2007 09:51 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2973
Ubicación: España (Galicia)
Hola !

<modo malvado>
Pues parece inform en español, traducido. ¿Tanto curro pa'esto?
</modo malvado>

Ahora en serio, sería mejor que nos comentaras que ventajas tiene tu parser respecto a inform. El código fuente está bien, pero a primera vista parece casi todo igual.

Salud !

Baltasar

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 07 Mar 2007 16:25 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
agnas escribió:
betopica escribió:
Por otro lado, lo que he pensado sobre la relación de encimade es tan simple como que un objeto admite otro objeto encima o no, y que un objeto puede estar encima de otro o no. Pero debe haber otra propiedad que es si es escalable o no. De esto depende si el jugador puede montarse encima de un objeto. Yo puedo colocar un sobrero sobre una mesa, y puedo montarme sobre una mesa, pero no puedo montarme sobre un escapararate, pero si puedo montar un sombrero sobre él. Pero adicionalmente una mesa admite a una silla encima, pero una silla no admite a una mesa encima, así que hay que implementar adicionalmente si se puede montar o no dependiendo del tipo de objeto. Es muy complicado y de verdad te felicito si ya tienes implementado todo esto.

Esto se podría hacer programando algo de física al juego. Todos los objetos que se puedan mover de su sitio deben tener un volumen y un peso (no en litros y kilos necesariamente), y todas las superficies y recipientes, un peso y capacidad máxima tanto para dentro como para encima. Si la suma del contenido supera la capacidad disponible, saltaría un error. También podríamos filtrar por número de objetos y por tipo, así, una botella solo podria tener en su interior objetos del tipo "liquido"... Mas realismo a costa de mayor programación está claro. ¿Están dispuestos los autores a meterse a ese nivel con tal de ganar inmersión en el juego? Creo que llegados a este punto, la necesidad de un buen IDE es casi obligatoria..
Gracias por tu comentario, se me había pasado responderlo agnas!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 07 Mar 2007 17:07 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
baltasarq escribió:
Hola !
<modo malvado>
Pues parece inform en español, traducido. ¿Tanto curro pa'esto?
</modo malvado>
Ahora en serio, sería mejor que nos comentaras que ventajas tiene tu parser respecto a inform. El código fuente está bien, pero a primera vista parece casi todo igual.
Baltasar


Jeje, una pregunta chunga, ¡bien! Veamos, tiene muchas similitudes con Inform, pero también algunas diferencias.
Se parece a Inform en español, ¡claro! es orientado a objetos y eventos, y el modelo del mundo virtual de Inform es tan óptimo que ¿para qué hacerlo distinto? Digamos que le he dado un buen repaso (te puedo asegurar que ahora soy casi un experto en Inform ;)), me he quedado con lo bueno (en mi opinión) y lo he hecho a mi manera para hacerlo más sencillo y fácil. Así por encima, Inform es más como C, y este parser (es que todavía no le he puesto nombre) es una mezcla entre Basic y Java. No hay puntos y comas, llaves ni corchetes: eso seguro que a más de uno le supondrá una liberación. Algunas partes he estado tentado de cambiarles el nombre, como "recipiente" por "contenedor", "soporte" por "superficie", "cerrojo" por "conllave", pero he pensado en los posibles Informitas y he respetado (o copiado) la misma nomenclatura que InformATE para no tener que hacer una tabla de equivalencias.
Diferencias hay muchas, pero decir cuales de ellas son ventajas o no, creo que no me corresponde a mí decirlo (no sería objetivo). Lo que si me atrevo a decir es que programar con este parser es más sencillo, más claro (legible) y como consecuencia de ello, más rápido (a no ser que domines completamente Inform y programes casi sin mirar).
Por otro lado, creo que es más potente en un sentido: al estar basado en Java permite la utilización de todos sus tipos primitivos y compuestos (arrays multidimensionales, colecciones como listas, mapas y conjuntos) que ayudan bastante y es de tipado débil, es decir, cualquier variable puede contener cualquier valor, incluidas las colecciones anteriores.
Por ejemplo, pintar una frase distinta cada vez que examines un objeto podrías ser así:
Código:
objeto Cosa estaen Aqui
   nombre cosa
   atributos [
      n:0
   ]
   DescLarga:
      println {"Me gusta","No esta mal","Mola!"}[#self.n%3]
      #self.n = #self.n+1
finobjeto

Una de las grandes diferencias es en la gramática, que aquí no se ve. Es totalmente ampliable, tu mismo puedes definir nuevos generos y números (aunque con masculino, femenino, plural y singular serían suficientes), y nuevas terminaciones (el(), un(), n(), os()) de una manera muy simple.
La librería por defecto empieza así:
Código:
   gennum MS,MP,FS,FP

   pronombre MS:lo
   pronombre FS:la
   pronombre MP:los
   pronombre FP:las

   articulo MS:EL    el
   articulo MS:UN    un
   articulo MS:AL    al
   articulo MS:DEL del
   articulo MS:EL:propio
   articulo MS:UN:propio   a
   articulo MS:AL:propio    a
   articulo MS:DEL:propio   de

   propiedad    MS:PRONOMBRE él
   propiedad    MS:ELLO ello
   propiedad    MS:LO    lo
   propiedad    MS:SER    es
   propiedad    MS:N
   propiedad    MS:S
   propiedad    MS:ES
   propiedad    MS:O    o

Inform mapea cada verbo por separado a una acción, cuando con el mio se mapea cada acción con todos sus verbos (o frases) posibles de manera atómica. Inform realiza un filtrado inicial basado en pesos y tiene los tokens con los que modificar la desambiguacion y comportamiento. En el mio, no hay filtro, cada acción contiene todos los tokens necesarios que sirven para dos cosas: desambiguar durante la fase de parseo y validar la acción durante la fase de ejecución. Un ejemplo:
Código:
   Abrir (accesible,!localidad,!jugador,*:o.validaAbrir,abrible,!abierto,!cerrojoechado):
      abre|destapa|descubre|desabrocha|desbloquea *

   AbrirCon (accesible,!localidad,!jugador,*:o.validaAbrirCon,conllave,cerrojoechado) objetoPoseido:
      abre|destapa|descubre|desabrocha|desbloquea * con *
      quita el? cerrojo|pestillo|cierre * con *

   QuitarCerrojo (accesible,!localidad,!jugador,*:o.validaQuitarCerrojo,cerrojo,!conllave,cerrojoechado):
      -l quita el? cerrojo|pestillo|cierre *

   CambiarCerrojo (accesible,!localidad,!jugador,*:o.validaCambiarCerrojo,cerrojo,!conllave,!abierto):
      cambia|mueve|empuja|pulsa el? cerrojo|pestillo|cierre *
      tira de|del cerrojo|pestillo|cierre *

   Examinar (visible,!localidad):
      mira|inspecciona|observa|describe|examina|lee *
      -n ex|m *
      mira hacia *

   BuscarEn (accesible,!localidad,!jugador):
      registra|rebusca *
      mira|inspecciona|observa|examina|registra|rebusca|busca por|en|sobre *
      mira|inspecciona|observa|examina|registra|rebusca|busca por? dentro de|del *
      mira|inspecciona|observa|examina|registra|rebusca|busca a? traves de|del *
      mira|inspecciona|observa|examina|registra|rebusca|busca atraves de|del *

de esta manera, cualquier acción de cerrar o abrir necesita que los dos objetos implicados sean accesibles, que no sea una localidad (el simbolo "!" es una negación), que no sea un jugador, el siguiente paso es ejecutar la función validaX en el objeto implicado, si no existe, sigue validando abrible, abierto, etc.
Estos tokens se utilizan para desambiguar también, de manera que si tenemos un objeto llamado "cosa" que no es abrible y otro que si lo es, al intentar hacer "abrir cosa", abriremos directamente el objeto "abrible" descartando el que no lo es. Si hubiera dos objetos llamados "cosa" que fueran "abribles" los dos, intentaría primero desambiguar entre ellos utilizando el siguiente token, que podría ser el objeto que no estuviera "abierto" (!abierto=cerrado) en el caso de Abrir, y el que si estuviera "abierto" en el caso de Cerrar.
Dado que todas las validaciones necesarias se definen en la gramatica, la programación de las acciones de sistema son realmente sencillas, por ejemplo, para las acciones de antes, estas serían sus implementaciones:
Código:
accionAbrir:
   args o1,o2
   o1.abierto = true
   println "Abres "+o1.el()+"."

accionAbrirCon:
   args o1,o2
   if o1.conllave == o2
      println "Abres "+o1.el()+" con "+o2.el()+"."
      o1.cerrojoechado=false
   else
      println o2.El()+" no sirve para "+#frase.verbo+" "+o1.el()+"."
      stop
   endif

accionQuitarCerrojo:
   args o1,o2
   o1.cerrojoechado=false
   println "Quitas el cierre "+o1.al()+"."

accionCambiarCerrojo:
   args o1,o2
   if o1.cerrojoechado
      #system.accion("QuitarCerrojo",o1)
   else
      #system.accion("EcharCerrojo",o1)
   endif

accionExaminar:
   args o1,o2
   if o1 == #jugador
      #system.accion("Examiname")
   else
      if o1.tieneFuncion("DescLarga")
         o1.DescLarga()
      else
   endif

Por otro lado, se contemplan varias relaciones entre objetos: estar encima, estar dentro y formar parte, todas ellas a la vez. Es decir, podemos hacer que un mueble tenga un mantel encima, tenga objetos dentro y este formado por 4 patas, por ejemplo. Aunque creo que esto INFSP 7 ya lo hace.

También he intentado solventar desde el inicio problemas que han ocurrido en Inform, como por ejemplo, que examinar la localidad actual implique Mirar, que se puedan examinar direcciones, que que se puedan abrir y cerrar cosas con objetos sin necesidad de que tengan cerrojo, cambiar los pestillos de posición y algunas cosas más que ahora no me acuerdo.

En general, por lo menos para mí ya que no puedo ser objetivo del todo, creo que programar con este parser es más sencillo y por tanto, requiere menos código. Como ejemplo, todas las librería de Inform son bastantes ficheros de código y en este solo hace falta uno de 70ks comentarios incluidos. Aunque no está todo implementado todavía, creo que es significativo. Y que si hay alguna cosa que no me gusta de Inform, la puedo cambiar al momento. Eso me da una libertad para llevar el parser a donde quiera que no tengo con Inform, aunque esto es solo un beneficio personal, lo comparto ya que estoy abierto siempre a mejoras. El objetivo es picar lo menos posible.

Más cosas: es un proyecto íntegramente castellano y está abierto a mejoras, así que supongo que si lo utilizas y algo no te gusta, pues lo cambio, cosa que en Inform para hacerlo supongo que sería mas dificil. ¿es esto una ventaja? no lo sé tampoco. Y que el cambio más importante y que ahora no se ve, es que es completamente online y que la salida es Html, por lo que puedes sacar textos con colores, css, imagenes, javascript, flash con sonidos, musica o videos, lo que te de la gana. La distribución de tus juegos es inmediata, tan solo tienes que enviar la url, no requiere interprete ni compilador, tan solo un navegador, en fin, es un modelo de jugar completamente distinto. No mejor ni peor, tan solo distinto. ¿se puede hacer esto con Inform? pues también, utilizando applets. Qué es mejor o peor, eso lo decidirá cada uno, pero tiene una ventaja clave: si hay un bug en el parser, se corrige automáticamente, pues la aventura corre en el servidor (aunque siempre puedes actualizar el applet...)

Pero tampoco te lo quiero vender: si eres un enamorado de Inform (como sé que lo eres ;)), entonces no vas a tragar con este en la vida, ya que siempre te parecerá peor (aunque tengan enfoques distintos) cosa que es bastante comprensible y no te voy a poder reprochar nunca, pues a mi me pasa con otros lenguajes (por ejemplo, cuando comparo C# con Java pues lo tengo muy claro: jamas utilizaré C#, ¡nunca! ¡nunca! ¡nunca!! x'DD)

Pero ¿tanto curro pa'esto? pues ¡siiiiiiii! Espero que haya nuevos aventureros creadores de aventuras potenciales que se animen a probarlo, puede ser muy divertido. Te puedo asegurar que es el proyecto más interesante que he realizado hasta ahora, y llevo muchos años programando (siempre aplicaciones de gestión y para otros), pero el reto que ha supuesto crear semejante "engendro" es bastante gratificante: desarrollar un pseudolenguaje propio, que sea capaz de tragarse lo que he enviado antes y que como resultado te dé "algo" que puedas jugar es algo que no se puede explicar, (aunque sea clavado a Inform).

Además es gratis (requiere un hosting con java, pero eso ya lo pongo yo) y, cuando la acabe, liberaré su código para que lo instales donde quieras o lo modifiques. Personalmente, con que haya alguien (solo una sola persona) que se entusiasme con este parser y que cree una buena aventura que el y sus amigos (y todo el mundo) puedan jugar, ya es recompensa suficiente para mi. :-)

PD.: de todas formas, criticas constructivas y destructivas (siempre con fundamente claro) son bien recibidas. Si hay algo que no te gusta, ¡¡dispara donde duelo y dilo!! :twisted: :twisted:


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