visnov  visnov

visnov is a lightweight visual-novel authoring toolchain intended as an (eventual) alternative to the bulky & overcomplicated ren'py. visnov does not involve any scripting languages or DSLs: it's just a binary library with some tooling, and the user can choose to implement her visual novel in whatever language she likes. want to make a line of dialogue conditional on the weather? link in tenki and query the Dark Sky API.

this repository also includes a low-level binding to ocaml, intended to be used by user-defined functions that operate on native ocaml data structures appropriate to the specific game. those bindings are defined in visnov.ml

build process

visnov has very few external dependencies. the only thing you should need to worry about is libglfw3, though the visnov library itself does not require glfw to build.

glfw may be installed through your distribution's package manager or may be compiled from source. the latter is recommended if you wish to create a portable binary (which you probably should when you're ready to release your game.) when you compile your source code and link against glfw, you can do it either by specifying -lglfw to dynamically link or by adding libglfw3.a to the source list on the command line. (if you using a language other than C, you may need to specify the libraries differently. if your language comes with a default binding see bind/$lang/build.md)

once you have built the library and compiled your binary against you, you will need to store your assets in the binary. this is currently done with the build/visnarc tool.

visnarc generates a flat binary archive from a list of files on the command like. if you run, for instance, visnarc font/reg.ttf font/bold.ttf player.png it will print to standard output an archive containing those three files, using the entered paths as keys to access the data with. therefore, to archive a whole directory, you currently must cd to that directory, and then run visnarc ** (if your shell, unlike zsh or fish, does not support recursive glob expansion, you may need to use the find command with xargs - this is best done from a shell script or makefile). in the future, visnarc should support a -r flag to set a directory as the archive root and then recurse into it; this is not currently a priority since it's already minimally functional.

the compiled binary will try to resolve files references from a visnarc archive appended to the end of the binary. the >> redirection operator is sufficient for these purposes; however, if you wish to keep a fileless copy (for instance, if you want to be able to update the assets without generating a new binary) you may instead wish to use a process like

cc $files $flags -o novel-empty
(cd assets; visnarc ** > ../assets.arc)
cat novel-empty assets.arc > novel

this will provide greater flexibility, at the cost of disk space and build system complexity.

license

visnov is licensed under the AGPL (see LICENSE). the external libraries in ext/ are not my intellectual property and have their own licenses. per the AGPL, visnov binaries may be sold for profit, but only if the source code (to both the visnov engine and the game built with it) is made freely available. closed-source development with visnov is not permitted, though i might be convinced to grant commercial licenses on a case-by-case basis to low-income folks who genuinely need the money.

note that you are bound by the licenses of ALL code you compile statically into your binary.