Giter Club home page Giter Club logo

fi-js's Introduction

fi.js

Framework JavaScript para ficción interactiva / JavaScript framework for interactive fiction. Distribuido con licencia MIT.

Web

Construcción (build)

El directorio lib/ es el que contiene el motor y un ejemplo. Todos los trabajos de ficción interactiva tendrán un archivo index.html, fi.js y verbs.js que son el propio motor, y un último archivo JavaScript (en el ejemplo, vampiro.js), que es el juego en sí, definiendo las localidades, objetos, personajes, etc. Finalmente, por convención en el directorio res/ están los recursos que precise el juego.

The lib/ directory is the one containing the engine and a given example. Any interactive fiction pieces will have to provide the same files as provided there, i.e., index.html, fi.js and verbs.js being the engine itself, and also another JavaScript file (vampiro.js, in the example), being the game's definitions, such as rooms, objects, characters, etc. Finally, the resources for the game are by convention inside the res/ subdirectory.

Documentación

Accede a la Wiki para hojear la documentación.

fi-js's People

Contributors

baltasarq avatar paravaariar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

fi-js's Issues

Imagen grande en Intro no se escala

En una location, si pongo una imagen grande se escala muy bien al tamaño de la pantalla "locBiblioteca.pic =", pero en la intro, si uso "ctrl.ponImg(" y pongo una imagen muy grande, se escapa de la pantalla por la derecha.

Problemas al poner música ambiente general

Me gustaría una música ambiente en bucle durante todo el juego. Mirando la wiki debería de ser algo así:

let snd = {
	"src": "res/music.mp3",
	"volume": 1.0,
	"loop": true
};
ctrl.audio.setInfo( snd );
ctrl.audio.play();

Por un lado, si lo pongo en game.js o en el ctrl.ini() parece que el navegador me lo bloquea por la nueva política contra el autoplay de los navegadores que exige que tengas que interactuar primero con la página. Podría preguntar si se quiere música o no...

Sin embargo, si lo pongo en un preExamine de la primera localidad por ejemplo, me da un error más raro...
GET file:///C:/code/[object%20Object] net::ERR_FILE_NOT_FOUND como si el path al src no se haya capturado bien...

Creo que la Wiki tendría que tener un apartado solo para el Audio, ahora está un poco disperso en Loc y en Miscelánea. Así una persona que solo se encarga de la música en un juego puede verlo ahí directamente. También lo que permite el motor podría estar más claro, si he entendido bien no se puede tener por el momento una música ambiente global y fxs o sonidos rápidos en sucesos que no la paren, no?

Booleano de configuración para decir si quieres que aparezca la lista de objetos en las localizaciones o no

Por defecto, al final del texto de una localización aparece la lista sintética de objetos que hay presentes.
Creo que no hay alguna forma de desactivar esto. Lo quité añadiendo if (loc != player) { return "" }; después de está línea

fi-js/lib/fi.js

Line 2199 in 453f578

const player = ctrl.personas.getPlayer();

pero estaría bien que fuese una especie de parámetro de configuración a nivel global que por defecto esté activado pero que se pueda cambiar.

Añadir video en final del juego

La función endGame(msg, pic) permite añadir imágenes en el parámetro pic pero me interesaba que apareciese un video y no una imagen. Para solucionarlo cambié un poco el código de fi.js de esa función, mi código puede mejorarse seguro, pero me permitió el resultado esperado.

//        if ( pic != null ) {
//            const pImg = document.createElement( "p" );
//            const img = document.createElement( "img" );
//
//           pImg.align = "center";
//            pImg.style.width = "100%";
//            img.style = "width: auto; height: auto; max-width: 70%";
//            img.src = pic;
//            img.alt = img.title = "game over";
//
//            pImg.appendChild( img );
//            dvPic.appendChild( pImg );
//            dvPic.style.display = "block";
//        }
        if ( pic != null ) {
            const pImg = document.createElement( "p" );
            pImg.align = "center";
            pImg.style.width = "100%";
			
			if (pic.endsWith(".mp4")) {
				const video = document.createElement( "video" );
				video.style = "width: auto; height: auto; max-width: 70%";
				video.width = "320";
				video.height = "240";
				video.autoplay = "true";
				video.muted = "true";
				const videoSource = document.createElement( "source" );
				videoSource.src = pic;
				videoSource.type = "video/mp4";
				video.appendChild(videoSource);
				pImg.appendChild( video );
			} else {
				const img = document.createElement( "img" );
				img.style = "width: auto; height: auto; max-width: 70%";
				img.src = pic;
				img.alt = img.title = "game over";
				pImg.appendChild( img );
			}

            dvPic.appendChild( pImg );
            dvPic.style.display = "block";
        }

Comando para que un tester guarde la transcripción en un fichero de texto?

Una manera que me gusta bastante para depurar juegos es decirle al jugador o al tester que guarde una transcripción de los comandos que fue introduciendo. Creo que es también más o menos habitual que la transcripción también vaya guardando lo que aparece en la descripción y en el texto de resultado de acciones. Está disponible o sería posible un comando para guardar este histórico de las partidas y que lo descargase en un archivo de texto plano?

Bug en updateDesc

No estoy seguro si hay algo que estoy haciendo mal o si hay un bug...
Tengo una acción que pone algo en el área de resultado pero quiero también que modifique ligeramente el código de la descripción de la localidad. Uso el preLook para tener un if que me da bien el texto nuevo. Primero usando lo que comenta la wiki
ctrl.lugares.updateDesc( ctrl.lugares.getCurrentLoc().preLook() );
me daba error cuando llegaba a if ( loc.audio.src != null ) { y ya no se puede jugar.
Pero usando ctrl.lugares.updateDesc( ctrl.lugares.getCurrentLoc(), ctrl.lugares.getCurrentLoc().preLook() ); ya no me daba el error. Sin embargo, el updateDesc llama desc = ctrl.buildDescOfEntity( loc ); que directamente hace que se reescriba el parámetro desc que le he pasado a updateDesc... total, que vuelve a poner el mismo texto que tenía al principio, y no el nuevo calculado con el preLook...

Texto que solo se visualizará una vez: Parece que solo permite unas llaves por descripción

Cuando se usa el modificador ^{ } descrito en https://github.com/Baltasarq/fi-js/wiki/Loc#modificaciones-en-los-textos
parece que solo funciona si la descripción tiene unas llaves.
Si ponemos por ejemplo:
^{Mi texto solo una vez.} Más texto. ^{Otra parte del texto solo una vez.}
La primera vez que entramos pone: Mi texto solo una vez. Más texto. ^{Otra parte del texto solo una vez.}
La segunda vez que ponemos "mirar", aparece Más texto. ^{Otra parte del texto solo una vez.}

Bug al llamar a updateDesc sin los dos parámetros

Este bug está relacionado con #3 pero por lo menos no era tan bloqueante.
Si llamamos a updateDesc con un solo argumento, por ejemplo un preLook() como dice la Wiki resulta que loc tiene el valor de un String... y ahí empiezan los problemas que hace que luego falle todo. El chequeo de argumentos que hay ahora no lo soluciona.

       function updateDesc(loc, desc)
        {
            ...
            if ( arguments.length < 1
              || loc == null )
            {
                loc = ctrl.places.getCurrentLoc();
            }

            if ( arguments.length < 2
              || desc == null )
            {
                desc = loc.desc;
            }

Intro text en los mensajes no está documentado en la Wiki

No estoy 100% seguro pero creo que la Wiki no menciona lo que se puede hacer gracias al método buildDescOfEntity

* Takes a description and removes or prepends
     * the intro text, marked with ^{ and }
     *  i.e. "^{This only appears once. }This is the regular desc."
     * ```

Sinónimos para la acción predefinida wait

En verbs.js actualmente hay

const waitAction = actions.crea( "wait",
    [ "espera", "z" ]
);

creo que para seguir con el mismo estilo de otras acciones, debería valer también por lo menos "esperar" y "espero"

Sobre Guardar y Cargar

En caso de que llegado un momento se decidiera implementar esta funcionalidad, ¿Cuál sería la mejor solución técnica? Por un lado hay propiedades que se guardan en los propios elementos, por ejemplo ponAbierta(true) etc. luego está también guardar en que localidad están las personas, y también luego otras variables booleanas o de otros tipos que el desarrollador añada para controlar ciertos aspectos del juego. Lo que es propio del motor en teoría está accesible desde ctrl de una manera predefinida, y quizás para las variables relevantes podría haber alguna manera de predefinir dónde guardarlo para que una nueva funcionalidad genérica del motor permita guardar en slots y cargar las partidas... Luego entiendo que en LocalStorage del navegador se podría guardar todo eso. ¿Qué otra solución podría existir? ¿Alguna idea o desarrollo existente sobre cuál sería la mejor forma?

Logotipo para fi-js

Es una tontería, pero un logo puede hacer el framework más reconocible por la gente :)

Booleano de configuración para decir si quieres que el jugador pueda pinchar usando el ratón o no

En algunos sitios de fi.js está por defecto que aparezcan cosas en modo que puedas pinchar. Por ejemplo esta línea en list toret += "${" + obj.id + ','; o esta otra toret += examineAction.verbs[ 0 ] + ' ' + obj.id; o toret += " (${puesto,";

fi-js/lib/fi.js

Line 2229 in 453f578

toret += "${" + obj.id + ',';

Para desactivarlo modifiqué esas líneas para que ponga el obj.id directamente y no la acción pero igual hay otras maneras de desactivar las acciones y que sea texto normal.
Estaría bien una opción a nivel global para que el juego pueda ser en modo solo texto. Sería para que el jugador solo use el teclado y no esté intercambiando entre teclado y ratón. Por defecto podría ponerlo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.