A short (approx. 10 minutes long) visual novel I made a while ago to show off some NVList features. It’s especially heavy on background pans and other easy-to-do special effects. More information and downloads (Windows/Mac/Linux) can be found on the Cottage on the Moor project page.
Added a new texture manipulation function
ImageFx.applyColorMatrix that takes a 4×4 matrix as input and multiplies it with each pixel in the texture (a 4-vector, RGBA). This lets you do some fancy image manipulation effects at runtime (grayscaling, boosting contrast, etc). There’s a new "Image FX" tutorial that demonstrates some basic usage of several
2012/07/06 — 2.6 (r27) enhancements: – Added a matrix color tint function to ImageFX. Can be used for grayscale effects, changing saturation, etc. – Added an Image FX tutorial demonstrating blur, brighten, color matrix. – Improved runtime performance of the debug window’s image tab. It would cause lag when viewed during heavy particle effects. – Changed some code related to tweens, removing anything that changed the texture anchor (image alignment) without explicit action from the user. bugfixes: – Fixed a bug in customTextBox that could cause a crash when not passing explicit bounds
This release adds some additional animation functions. It’s now possible to chain animations together either back-to-back using
seq, or running them in parallel with
par. An optional loop count parameter was also added to
An integrated bug/typo reporting tool can be activated with the
vn.enableProofreaderTools preference. There’s a video of the proofreader tools in action.
A new image gallery tutorial was also added. It’s fairly basic, but it does everything you need and should be easy to use/extend.
2012/06/18 — 2.5 (r26) enhancements: – F5 can now be used as a hotkey to restart when debug mode is turned on. – Replaced IDrawable.getColor with getColorRGB/getColorARGB to work better with Anim.* functions. – Added an example usage of sprite tinting using IDrawable.setColor() to the image/basics tutorial. – Moved Anim.* functions to a separate module (vn.anim) – Added Anim.seq(), Anim.par() for sequential/parallel chaining of Animators. – Added Anim.createWait() for adding pauses to chained Animators. – Added Anim.waitFor() that blocks until the Animators passed as arguments have finished. – Added loops parameter to Animator.start() to let the animation loop a specific number of times (or infinitely by using -1). – Added example usage for Anim.* functions to the image/animations tutorial. – Added vn.enableProofreaderTools preference that, when enabled, adds a report bug/typo button to the menu bar. This button automatically adds info about the current script location and merges bug reports into a single file. – Changed the interfaces of the Camera object to be compatible with the new Anim.* functions. See camera tutorial for details. – Added the ability to customize the text continue cursor image using the customTextBox function. – Added a second parameter to TextDrawable.setCursor() to be able to turn off the automatic positioning. This makes a fixed position cursor possible. – Added a textbox customization tutorial demonstrating setCustomTextBox – Added vn.engineTargetVersion preference to allow you to specify which NVList version your VN was created for. This allows built-in functions to change their implementation but continue to function the same way for VNs targeting the old NVList version. – Added an example image gallery script as a GUI tutorial. bugfixes: – JNG images were erroneously saved with premultiplied alpha by the optimizer. – Fixed resource optimizer stripping start/end attributes from snd.xml
Build.jar now finally has a create project button. The old method of copying Build.jar to a new folder and running it from there has some minor advantages, but it’s very unintuitive and there’s no chance of figuring it out unless you read the manual.
I’ve added some animation-related utility functions for this release. These Anim.* functions provide a generalized form of functions like
translateRelative that gradually change a property’s value of the course of multiple frames. Example code using these functions has been added to the image/animation tutorial.
2012/05/25 — 2.4 (r25) enhancements: – Made fog effect much more customizable. – Added documentation to stdlib.lua and vn/gui.lua – Added a changeVolume function to (gradually) change the volume of sound or music after they’ve started playing. – Moved code related to the default titlescreen into its own file (titlescreen.lua), added a lot of code comments to it and main.lua – Screenshot menu item now has the ability to save screenshots as JPEG – Create new project button added to Build.jar, creating a new project now triggers an automatic rebuild. – Added Anim.* function for easily interpolating (animating) between two property values (for example color, or scale). Background animations also benefit; the new system saves a bit of typing. bugfixes: – Wipe tween ignored sprite transform (position, scale and rotation). – Changes to the color or alpha of a name box would disappear after switching back and forth between ADV and NVL text modes – Fixed a runtime exception when loading a 16-bit RGB image without alpha. – Paragraphs longer than a few hundred characters could, under specific conditions, trigger a program crash on ATI graphics cards. – Setting texture parameters on a GLSL object didn’t force their initialization, making the textures appear transparent. – Resource optimizer was broken, gave an error message when attempting to use. – The return to title menu item accidentally reset the window size/position. – Text (sub)lines consisting of only whitespace were eaten by the parser.
Just realized I never made a post for the 2.2 release of NVList. The changelog may look a bit intimidating, but most of the changes are pretty small fixes. The biggest improvement is a large increase in performance on singlecore processors. NVList by default tries to load images in the background, but on slow singlecore processors the image loading doesn’t get enough processor time to finish withing a reasonable time frame. Because of this, image loading is now synchronous for systems with only one logical processor.
There were also some compatibility problems when using a VIA/S3 UniChrome GPU (as reported by a Nanolife user). UniChrome is a low-end DirectX7/OpenGL1.2 integrated graphics chip from 2004. The problem was not performance (seemed to hover around 30-40 fps on my test system), but rather a bug in the graphics driver. It crashed when calling
GL_UNSIGNED_INT_8_8_8_8_REV. There’s now an explicit workaround in the code when your renderer contains the words "via" and "chrome" :V
2012/05/01 — 2.3 (r23) enhancements: – Implemented a basic auto-updater menu item (experimental, see game.ini) JVM running NVList must be closed before library files can be overwritten. – Added a menu for setting the window size to a XX pct of the preferred size – Camera.add() now returns an ICameraImage which can be used to change the image’s depth after adding it to the Camera. bugfixes: – Generated installer splash screen was corrupted for images with alpha – Launch4j PPC binaries (windres/ld) replaced with PPC/x64 universal binaries This should fix builds on Mac OS X Lion – getPlayTime() function was broken. 2012/04/16 — 2.2 (r21) enchancements: – Script errors printed on-screen now try to include a filename+line. – Clicking to instantly display the entire paragraph now works properly for text with [bracketed] Lua code in it. – When using the img/imgf functions with a sprite slot, the y parameter can now be used to change the baseline y. – The OSD (toggle with F7), now displays much more information. – Added a quickload(slot) function – text/appendText functions now support StyledText objects as their text args. – waitForTextVisible function now takes an optional TextDrawable to wait for. – The createStyledText function can now be called with a StyledText arg. – Added a createLayer(name) function that calls imageState.createLayer() – Image cache size can now be specified in pages. A page is the amount of memory required to store a full screen RGBA8 texture. – Debug window got a line in the VRAM graph indicating the image cache limit. – Added a vn.system module with lua wrappers for SystemLib functions. – Added a website() function that opens a webpage in an external browser. – Tuned the scale factor at which the main FBO starts mipmapping. – The Lua tab in the debug window now contains a print stack trace button. – Parse errors related to img.xml are now displayed on screen. – Added BlurGS class that provides a scalable blur. – Preferences starting with vn. can now be accessed through the prefs Lua table – Implemented depth-of-field/perspective for the Camera object. – Reduces mach banding of wipe tween (WipeGS). – Changing the text layer constructor now triggers text layer recreation. – quicksave/quickload now display a success message on screen. – Added support for reading precomputed mipmaps from KTX files. – Added prefs for readTextStyle, textLogStyle, choiceStyle, selectedChoiceStyle – Added registerJavaClass() function for importing Java code from Lua. – No longer requires separate executables for 32/64 bit Java. – Building a release now creates a .exe version of the generated installer. – Improved perceived startup time by showing an empty window early during init. – Significantly improved image load times on slow singlecore processors. – Reduced processor usage for sound playback, especially on slow singlecores. – Game update stops when the window is minimized. – Video capture function (F8) now forces continuous repainting to reduce video stuttering. – Added mouse wheel down as a text continue key. – Changed Build.jar to automatically do a rebuild when necessary. – Changed main.lua to act as a template for a standard VN titlescreen. bugfixes: – Rewrote the way OpenGL resources are managed internally. This should fix a memory leak occurring when the texture cache becomes full. – Fixed mapping of linear volume dB gain. Previous implementation could raise output levels over their natural maximum. – Text style property editor used by Build.jar now applies any pending edits when closing the popup dialog. – Editing a preference in Build.jar now also updates save/prefs.ini – Silently crashed if gluegen-rt was not in the library path. – Keyconfig only read the first key specified for each line. – Increased default minimum heap size to improve performance in situations with high garbage generation (like particle effects). – When running on hardware incapable of NPOT textures that also doesn’t support large textures, the just-in-time resize could cause a data alignment error. – ARGB screenshots were shifted up by 1 pixel in some instances. – Improved support for escaped \$, \[ in text lines for syntax highlighters. – Events enqueued with edt.addEvent() now wait while the main thread is blocked – Saving could change the result of == for Lua userdata objects. – Using alt+enter to return to windows mode from full screen advanced the text. – Up key accidentally opened the text log even during a choice. – Show text log menu item was broken. – On some graphics cards, the menu bar popups were overlapped by the screen. – Crash on UniChrome GPU for glReadPixels(type=GL_UNSIGNED_INT_8_8_8_8_REV) – Drawing blended quads used wrong UV coords when NPOT textures unsupported. – screen2image aspect ratio was wrong when FBOs turned off and the physical window didn’t match the aspect ratio of the VN’s virtual resolution. – Setting the FBO preference to true, now really always forces the FBO on. – Updated JOGL to 2012-02-28 build to fix compatibility with Mac OS X 10.5
NVList is a cross-platform (Windows/Mac/Linux) visual novel engine. It uses Lua for scripting (with a simple preprocessor to reduce the amount of typing required for text lines). Built-in scripts implement the basic functionality you’d expect in a visual novel (source code is included with the download).
The script interpreter running the Lua code supports coroutines and serialization. Coroutines are Lua’s way of multithreading (running multiple tasks at once). Serialization works like the savestate functionality often found in emulators, letting you save the exact state of the script engine at any time. Every Lua construct is automatically saveable, no extra effort required.
Hardware accelerated graphics are also an important aspect of NVList. The rendering system scales up nicely to 1280×720 or even 1920×1080. Of course 1920×1080 is a bit heavy for netbooks (2005-era integrated graphics, hooray!). However, NVList can switch between multiple pre-scaled graphics sets at runtime. This gives you nice performance on a netbook at 1024×576, and crisp 1920×1080 images on a normal PC within a single download.