Skip to content
LÖVE Visual Novel Engine
Lua Makefile
Failed to load latest commit information.
docs [Docs] Explain how LNVL's assert() is different from the Lua standard Jun 9, 2015
examples [Feature] Protect against dialog scripts redefining reserved keywords Jun 17, 2015
src [Test] Log an error if we try to execute a `no-op` instruction Jul 4, 2015
.gitignore Make Git ignore fonts that we use for testing purposes Jul 1, 2014
.gitmodules [Feature] Debug logging Jun 3, 2015
.luacheckrc [Test] Show Luacheck's warning and error codes Aug 6, 2015
.travis.yml [Test] Update our use of Luacheck in conjuction with Travis-CI Jul 7, 2015
LICENSE License LNVL under the GPL Oct 4, 2012
LNVL.lua [Feature] Protect against dialog scripts redefining reserved keywords Jun 17, 2015
Makefile [Refactor] Build HTML documentation using Tup Jun 9, 2015 [Docs] Describe the current state of development in the README Oct 19, 2015
Tupfile.lua [Test] Run Luacheck on all source code Jul 7, 2015
main.lua [Refactor] Use Debug.Log to replace all calls of assert() and error() Jun 3, 2015




Important: As of October 2015 I am not working too much on LNVL. The project is not dead though. But still, it is currently not a high priority for me. I still welcome any feature requests or bug reports, but if you intend to use LNVL right now please be aware that the current rate of development is extremely slow.


LNVL implements a simple visual novel component for use in games based on the LÖVE engine. LNVL provides only basic functionality and works best as an addition to another program which provides actual gameplay. The great Ren’Py engine is the main inspiration for LNVL, but this project does not attempt to be an all-encompassing visual novel engine like Ren’Py.

Installation and Configuration

In order to use LNVL you first need to unzip it wherever you intend to use that engine, i.e. where you will use require("LNVL") in your code. You must also initialize LNVL, providing (if necessary) the path to the LNVL module. For example:

local LNVL = require("LNVL")

This example assumes that LNVL is in the ./game/src/LNVL/ directory from the root of the game incorporating the engine. The documentation at the beginning of the LNVL.lua file explains this process in more detail, as does the commentary for the function LNVL.Initialize(), which is in that same file.

Within the src directory is the src/settings.lua.example file. Read through it to see how you can configure LNVL. However, do not edit that file directly. LNVL expects to find a src/settings.lua file, which is not part of the repository so that each installation can have their own configuration. If you have GNU Make then you can create this file by running make settings from the project’s top-level directory.


The docs directory contains documentation for LNVL. Users who want to write stories with LNVL will want to read the document. The rest of the documentation is useful to computer programmers who wish to extend or expand the engine. If you have the Pandoc program then you can create HTML versions of these documents for (arguably) easier browsing by running the make docs command.


The examples directory has scripts that demonstrate and test different features of LNVL. However, they currently will not run because most of them rely on images which are not included in the repository. These images are currently assets borrowed from another game project in development, but eventually they will be part of the LNVL source. My apologies until then for the inconvenience in being unable to run any of the examples.

Copyright and License

Copyright 2012, 2013, 2014, 2015 Plutono INC.

LNVL uses the GNU General Public License.

However, one file, src/rgb.txt, comes from the XFree86 project and therefore uses version 1.1 of their license.

LNVL also uses log.lua, Copyright 2014–2015 rxi, released under the MIT license.

Special Thanks

  • Yusuke Tanaka for providing compatibility with LÖVE 0.9.1.
  • The code for LNVL.Debug.TableToString() uses the work of Julio Manuel Fernandez-Diaz.
  • rxi for the log.lua library.
Something went wrong with that request. Please try again.