Fi-js

De WikiCAAD, la enciclopedia aventurera.

fi.js es un un sistema de creación de aventuras conversacionales desarrollado por Baltasar. El desarrollo se comenzó a finales de 2013 y todavía se continúa desarrollando, aunque es ya muy estable.

Está alojado en GitHub y se distribuye bajo la licencia MIT, por lo que es posible descargar y usar su código al completo sin ninguna restricción. También es posible unirse al equipo de desarrollo como comitter para participar activamente en la programación del proyecto.

Contenido

Características

La principal característica de fi.js es que se ejecuta del lado del cliente, es decir, el propio navegador web. Una vez que la se ha terminado de abrir la página del juego, no se producen más contactos con ningún servidor (a no ser que el autor lo haya querido de otra forma, claro). fi.js es un framework, es decir, se programa en JavaScript desde cualquier editor de textos, y se depura en local, no es necesario tener conexión a internet, aunque es recomendable hacer referencia al framework en GitHub, de manera que las mejoras realizadas por el autor se reflejen inmediatamente en la aventura (sin necesidad de cambiar nada).

La forma de trabajo de la librería (acciones, localidades, objetos), está claramente inspirada en Inform_6. Si se conoce JavaScript, y se ha programado anteriormente en Inform_6, no habrá problema para hacerse con fi.js. Si no se es programador, tampoco es difícil hacerse con JavaScript, ya que existen muchos cursos de aprendizaje disponibles en la web.

Al ejecutarse a través de un navegador Web, es posible usar cualquier componente HTML disponible para enriquecer la presentación de las aventuras: desde colores y tablas, CSS, javascript hasta componentes multimedia basados en flash o applets. Es posible introducir enlaces en las aventuras, de manera que podemos jugar introduciendo comandos, o haciendo clicks en enlaces para enviar ordenes.

De hecho, de manera estándar fi.js ofrece una interfaz doble, por línea de comando y por iconos. Cualquiera de las dos puede ocultarse al jugador, si se desea.

Es posible instalarlo en un ordenador sin internet, donde una persona puede instalar juegos, crearlos y jugarlos de una manera rápida, al estar todo en el mismo ordenador.

Componentes

fi.js posee un modelo de mundo, y un parser castellano.

Parser

  • Objetos con varios nombres (sinónimos).
  • Conjunto extenso de acciones, facilmente ampliable.
  • Parsing flexible, no trata de entender todas las palabras.

Modelo del mundo

  • Objetos que se abren y cierran (con o sin llave), encienden y apagan.
  • Objetos donde meter y dejar cosas encima, subirse y entrar. Estas cualidades no son excluyentes: un mismo objeto puede guardar cosas dentro y encima.
  • Personajes que realizan acciones. El propio jugador es un personaje más, y durante una partida se puede cambiar de personaje con el que jugar.
  • Acciones que invocan eventos que pueden ser capturados para modificar su comportamiento.
  • Daemons y alarmas.

Lo que fi.js no tiene

  • Deshacer la acción anterior (undo), aunque sí permite guardar y cargar (save/load).
  • Parseo libre de texto, como por ejemplo: decir que buen dia hace a manolo. Alguno parsers admiten correctamente esta frase, aceptando la parte "que buen dia hace" como una entrada de texto libre. Actualmente Kenshira no admite este tipo de acciones.
  • Multijugador. Solo se permite un jugador por partida (aunque el mismo jugador puede encarnar distintos personajes).
  • Parseo de objetos agrupados. Ejemplo: "coger toda la fruta" o "coge la pera y la manzana" no son frases admitidas.

Ejemplo

Se muestra un ejemplo muy sencillo de aventura con dos objetos, un personaje y una localidad:

// lanchoa.js
/*
 *  lAnchoa es un proyecto creado por Baltasar
 *  para valorar la complejidad de abordar un proyecto
 *  extremadamente sencillo en distintas plataformas de desarrollo
 *  de aventuras.
 *
 *  Esta es el desarrollo de lAnchoa en fi.js, un framework
 *  para JavaScript de ficc. interactiva, escrito por Baltasar.
 *
 *  Licencia MIT
 *  (c) Baltasar el arquero, julio de 2016
 */

ctrl.ponTitulo( "lAnchoa" );
ctrl.ponIntro(
    "<p><h2>lAnchoa</h2><br></p>\
    <p>Has estado esperando esto todo este tiempo... \
    ¡Por fin te vas a comer una anchoa!</p>"
);
ctrl.ponAutor( "baltasarq" );
ctrl.ponVersion( "20160729" );

var locSalon = ctrl.lugares.creaLoc(
	"Salón",
	[ "habitacion", "estancia" ],
	"El salón de tu casa, un lugar agradable con un ${sofá, ex sofa} \
	 y una ${mesa, ex mesa}."
);

var objSofa = ctrl.creaObj(
    "sofá",
    [ "sofa", "poltrona" ],
    "Un sofá. Sí, del IKEA.",
    locSalon,
    Ent.Escenario
);

var objMesa = ctrl.creaObj(
    "mesa",
    [ "mesita" ],
    "Una mesa del IKEA.",
    locSalon,
    Ent.Escenario
);
objMesa.ponContenedor( true );

var objAnchoa = ctrl.creaObj(
    "anchoa",
    [ "aperitivo" ],
    "Una apetitosa anchoa",
    objMesa,
    Ent.Portable
);

objAnchoa.aceitada = false;
objAnchoa.preExamine = function() {
    var toret = objAnchoa.desc;

    if ( objAnchoa.aceitada ) {
        toret += ", lista para comer.";
    } else {
        toret += ", de apariencia un tanto seca.";
    }

    return toret;
}

objAnchoa.preHave = function() {
    if ( objAnchoa.aceitada ) {
        ctrl.terminaJuego( "¡Está buenísima!¡Estás tan contento de haberlo \
                            conseguido!" );
    } else {
        ctrl.terminaJuego( "¡Es horrible!¡Toda seca!¡Mueres entre terribles \
                             espasmos!" );
    }

    return;
}

var objBotellaAceite = ctrl.creaObj(
    "botella",
    [ "aceite" ],
    "Una botella de aceite ",
    objMesa,
    Ent.Portable
);

objBotellaAceite.preExamine = function() {
    var toret = objBotellaAceite.desc;

    if ( objAnchoa.aceitada ) {
        toret += "vacía.";
    } else {
        toret += "de color dorado.";
    }

    return toret;
}

objBotellaAceite.preDrop = function() {
    var toret = "No veo sentido a hacer eso.";

    if ( parser.sentence.obj2 == null
      || parser.sentence.obj2 == objAnchoa
    )
    {
        objAnchoa.aceitada = true;
        toret = "Rocías la anchoa con el dorado líquido.";
    }

    return toret;
}

// Arranque ------------------------------------------------------------
var jugador = ctrl.personas.creaPersona( "McAventuras",
                    [],
                    "Eres un tío normal, que quiere comerse una anchoa.",
                    locSalon
);

ctrl.personas.cambiaJugador( jugador );
ctrl.lugares.ponInicio( locSalon );

Aventuras

Enlaces

Herramientas personales