English | Español
Dragonfly es un motor para el desarrollo de juegos de texto interactivo o, conocidos tambien como Aventuras Conversacionales. Son juegos que se componen en su totalidad de texto (a veces imágenes y sonidos) y en ellos, el jugador podrá interactuar con la historia modificando su entorno.
Teniendo preparados los archivos necesarios como se explica en el README principal, podrás correr el index.html en un navegador mediante un servidor. Existen múltiples maneras, aquí van dos:
- Utilizando Visual Studio Code: luego de instalar el pluggin Live Server, le das click secundario a index.html y eliges: "Open with Live Server". Se abrirá tu navegador predeterminado con tu juego corriendo.
- Con el servidor de Python 3: Teniendo instalado Python 3, navega con un terminal hasta el directorio de tu juego y ejecuta:
python3 -m http.server
Si todo va bien, tendrás el siguiente resultado:
Luego de cambiar el título y el autor del libro, lo siguiente es decirle a Dragonfly quién es el jugador y dónde se encuentra. De paso podemos incluir el diccionario en español para no tener que definir los verbos, artículos, etc. de nuestro juego.
book(title: "Tutorial de Dragonfly", author: "Juan Perez") {
# El jugador:
property(name: "player", value: "-player")
# El diccionario en español (primera persona):
include(src: "https://jason80.github.io/dragonfly/templates/dict-es1.dfml")
}
# Los objetos se definen dentro del nodo 'dictionary':
dictionary {
# Define el jardin (lugar):
noun(names: "El Jardin, jardin") {
describe-place {
"Estoy parado en el medio de un colorido jardin. Mientras sus flores bañan el ambiente de perfume, el agua de una fuente produce un agradable sonido. Hay un banco de piedra en el medio del camino."
}
# Define al jugador dentro del jardin:
noun(names: "Vicente, jugador, player, -player")
}
}
Nota: puedes elegir los nombres que quieras para todos los archivos: "index.html", "mygame.js" y "mygame.dfml" siempre y cuando mantengas las referencias dentro de los mismos.
- En el nodo
bookse establecen los atributos de título y autor. Dentro del nodobookse pueden establecer propiedades, incluir diccionarios y otros archivos DFML. - En este caso se establece la propiedad
playercon el valor "-player". - Se incluye el diccionario en español para no tener que definir los verbos, artículos, etc. de nuestro juego.
Nota: El diccionario está disponible en https://jason80.github.io/dragonfly/templates/dict-es1.dfml pero lo puedes descargar y usar localmente, y hacerle modificaciones. El número 1 indica que es el diccionario está en primera persona. Si quieres el diccionario en segunda persona, cambia el 1 por un 2.
- Dentro del nodo
dictionaryse declaran todos los elementos del libro. En este caso, unnoun(sustantivo u objeto) como un lugar: El Jardin. Y dentro del lugar estará el sustantivo jugador.
Nota 1: En Dragonfly todos los objetos del juego son sustantivos (nouns): linterna, caldero, ... Incluso los lugares y hasta el jugador.
Nota 2: El funcionamiento de Dragonfly siempre se centrará en el jugador. "habitación" contiene a "jugador" por lo tanto dicha "habitación" será el lugar inicial del juego.
-
Se importa el objeto Book desde la librería de Dragonfly.
-
Se crea el objeto book con
new Book(). El parámetro "game-area" será el<div>de nuestro html donde se mostrará el contenido del juego (Consulta el README.md). El segundo parámetro es el nombre del archivo DFML que contiene el código del juego. En este caso "mygame.dfml". -
Por último se corre el libro con
run().
Estando el jugador en el jardín, puedes probar diferentes acciones como "mirar", "examinar al jugador", "x jugador", "mirarme" o "mírate".
Son verbos predefinidos en el diccionario en español. Hay muchos verbos que no tienen un efecto concreto y sirven para adornar la experiencia del juego. Ejemplo: "saltar", "gritar", etc.
Sabemos que el jugador está adentro de un lugar. Cada vez que el jugador mira se mostrará la descripción de esa estancia. Para describir el lugar, se utiliza el evento describe-place dentro del sustantivo que representa al jardín.
En Dragonfly describe-place se reemplazará por el evento. Es una forma de simplificar la escritura de eventos. La forma nativa de escribir el evento sería:
after(actions: "LookAround") {
"Texto de la descripción"
}
De igual forma, describe-object se reemplazará por el evento:
after(actions: "ExamineObject") {
"Texto de la descripción"
}
"Texto de la descripción" tambien es una abreviación. El texto solitario entre comillas que se encuentra dentro de un evento, Dragonfly lo reemplazará por una respuesta de acción "Print". Es decir, el texto se imprimirá en la pantalla. Siempre debe estar entre comillas (simples o dobles):
after(actions: "ExamineObject") {
print("Texto de la descripción")
}
Vamos a añadir una nota a continuación del jugador, de manera que la estructura quede:
- jardín
- jugador
- nota
noun(names: "nota, papel") {
describe-object {
"Una nota arrugada con un mensaje escrito a mano."
}
}
Dragonfly intentará mostrar todo lo que el jugador tiene alrededor. Por eso verás esto después de la descripción del lugar:
Puedo ver: un nota.
Claramente el motor no tiene forma de identificar el género del sustantivo nota.
La forma de corregir esto es añadiendo el atributo female a la nota:
noun(names: "nota, papel") {
set { "female" }
describe-object {
"Una nota arrugada con un mensaje escrito a mano."
}
}
Ahora prueba "recoger nota", "inventario", "dejar el papel".
El nodo clave set establece atributos. Dragonfly tiene un sistema de atributos que se pueden establecer a los sustantivos para modificar su comportamiento.
Tambien se pueden establecer atributos personalizados a modo de bandera. Mediante condiciones, el autor puede hacer que el juego se comporte de una forma u otra dependiendo de si el sustantivo tiene o no un atributo personalizado. Por ejemplo: "suelto", "encendido", "roto", etc.
Aquí hay una lista de los más usuales que Dragonfly tiene predefinidos:
| Atributo(s) | descripción |
"female" |
Se refiere al objeto como "la" o "una" |
"plural" |
Se refiere al objeto como "los" o "unos" |
"female" "plural" |
Se refiere al objeto como "las" o "unas" |
"definited" |
Suele referirse al objeto como "el" en vez de "un". |
"countless" |
El objeto se vuelve incontable: "Puedes ver: agua". |
"proper" |
El sustantivo se vuelve propio. Los sustantivos propios se describen aparte de los comunes: "Dante está aquí" o "Puedes ver a Dante". |
"scene" |
Ocultará el objeto cuando se describa el lugar. |
"container" |
Conceptualmente, el objeto se vuelve contenedor. El jugador podrá "mirar dentro ..." "sacar de ..." |
"closable" |
El objeto se podrá cerrar y abrir. En el caso de que sea "container", el jugador no podrá mirar dentro o sacar cosas dentro de él si tiene el atributo "closed". |
"closed" |
Se utiliza cuando el objeto es "closable" e indica que está cerrado. La ausencia de "closed" indica que está abierto. |
"fixed" |
El objeto estará fijo en el lugar y el jugador no podrá "recoger el objeto", "empujar" ni "tirar de". |
"heavy" |
El jugador podrá "empujar" y "tirar del" objeto. Pero no podrá llevárselo porque es muy pesado. |
Agreguemos los objetos que faltan:
noun(names: "flores, flor, perfume, aroma") {
set{ "female" "plural" }
describe-object {
"Las flores son de colores vivos y su aroma es embriagador."
}
}
noun(names: "banco de piedra, banco, silla, sillon, piedra") {
set{ "scene" }
describe-object {
"Un banco de piedra con un diseño antiguo."
}
}
... quedando la estructura de la siguiente forma:
- jardin
- jugador
- nota
- flores
- banco de piedra
Así como Dragonfly intenta describir la nota, lo hará con las flores y el banco de piedra. Por eso verás esto después de la descripción del lugar:
Puedo ver: unas flores, un banco de piedra y una nota.
Claro que no está bueno porque en la descripción ya se hace mención de estos dos sustantivos.
Para evitar esto, establece el atributo "scene" a ambos objetos para que "pertenezcan a la escena" y Dragonfly no los describa.
Prueba "recoger el banco" o "coge el banco".
Para solucionar esto rápidamente estableciendo el atributo "fixed" al banco. Tambien podríamos haberlo hecho con "heavy". La diferencia es que con "fixed" el jugador no podrá ni empujar ni tirar del banco. En cambio, con "heavy" el jugador podrá empujar y tirar del banco pero no podrá llevárselo.
En este caso, no se pretende que el jugador pueda "recoger las flores" por lo tanto vamos a cancelar la acción de la siguiente forma:
noun(names: "flores, flor, perfume, aroma, jardin") {
set{ "female" "plural" }
describe-object {
"Las flores son de colores vivos y su aroma es embriagador."
}
before(actions: "TakeObject", cancel: true) {
"Debo confesar que soy alérgico a las flores."
}
}
Cuando intentes "leer la nota" verás que no pasa nada. Esto se debe a que el verbo "leer" no tiene un efecto concreto en el juego. Para solucionarlo, vamos a escribir un evento para el verbo "leer" capturando la acción "ReadObject":
before(actions: "ReadObject", cancel: true) {
"La nota dice: '... y no logré encontrar la llave para ingresar a la cabaña. Algo me dice que está cerca.'"
}
En Dragonfly, todos los sustantivos que estén dentro del jugador se consideran parte del inventario. Puedes consultar tu inventario con: "inventario", "inv" o "i".
En la sección de Sustantivos se explicará el tema de contenedores.
