SuperSakura: The Blog

SuperSakura front end with some games ready to play

My little engine's turning 15 this year. It's actually one of the older Western non-commercial still active VN engines, although you might not know it, but that's because I suck at marketing. (SuperSakura isn't geared toward new original works in any case, so Ren'Py deservedly holds the top position.) Still, with 11 completable games, another 12 at least playable, and a further 201 with some level of conversion support, I'm a little bit proud of how far SuperSakura has doggedly dragged itself. A perfect time to build a blog, therefore, before the dangerous school girls and tentacle monsters take on an AI-powered life and reach out through the monitor!

Actually, none of that in this blog – this is strictly family-friendly and spoiler-free. This will have reviews of SuperSakura-supported games and engine development dramatisations. I won't publish on any regular schedule; as with the engine itself, it'll be ready when it's ready. I would encourage you to make use of this blog's Atom feed, so your RSS reader/e-mail client will automatically fetch a copy for easy reading when it notices a new blog post. I'll also noot on Mastodon when there's a new blog post, so follow me there if that's more comfortable. Like and subscribe, as the cool kids used to say a few years ago!

Old screenshot from Season of the Sakura with a reverse-dither filter The oldest screenshot I have

Origin story digression! Old games, you see, had a limited color palette, but could use dithering to give an impression of greater color depth. If the pixels are small enough, or the display technology fuzzy enough, dithering can blend adjacent pixels together – a checkerboard pattern becomes a somewhat flat color, a halftone between the two colors used in the pattern. Western games tended to run at a fairly low resolution of 320x200, with fairly large pixels, so you only really see simple 2x2 checkerboard dithering in those. Japanese games ran at the relatively high 640x400 resolution to accommodate their more complex written characters, which allowed for nice-looking larger dithering patterns. Most commonly you see a classic Bayerian 4x4 pixel ordered dither in Japanese games.

While re-playing Season of the Sakura back in 2005, in all its dithered glory, it occurred to me the pixel patterns might be flattenable with a bit of effort, automatically giving any such old game smooth, 24-bit true color gradients. So I developed a reverse-dithering algorithm that works on any indexed-color images that use ordered dithering. ("Bunnylin's Brilliant Beautifier", to respect the old D&D spell naming scheme.) The algorithm tries to identify lines, then looks for dithering patterns and smooths them out without messing the sharp lines. It works better than you might expect, but there are always some small pixel details that get smudged, so I suspect the only way to get a really polished result is to give the algorithm manual hints for every image.

Old screenshot from The Three Sisters' Story with a reverse-dither filter Emi is the original tsundere for me

Not to worry! I like reinventing wheels and coming up with something hexagonal; I have plenty more weird things to try: bloom filter, hi-fi dithering, software synthesizer with novel waveforms and an unusual lowpass filter, an extended PNG image format, a context-aware autotranslation tool, a custom blogging platform for statically-generated websites...

The SuperSakura engine itself started as a fun random idea. I had thought up the reverse-dithering algorithm, but I could hardly test it without deciphering the game's graphics format first. When I eventually got the graphics, well, why not decipher the music and scripting too and stick it all in a modern engine? And if I can do that for one game, why not for a whole bunch of games? Ohohoho, how hard could it be!

Anyway, that was 2008 me. The engine's still not at 1.00.

Visual novels are probably the simplest genre of games to program, aside from little arcade-action games. All you need is some static graphics, transparent sprites, blinking eye animations, nice-looking textboxes, and a scripting language. The graphical stuff isn't very hard, even if you add free resizing to any output resolution, and most games just target a single fixed resolution anyway.

Kimono-clad mistress of the mansion welcomes the protagonist Amy to Yobanaide runs quite well in SuperSakura

Textboxes are a rabbit hole: you need font management, special text effects, justifying, kerning, linespacing, linewrapping, indentation, maybe scrolling, and box decoration placement. The smart thing to do would be to use an existing rich text generating library.

And as for the scripting language, most visual novels can get away with a very simple line-based imperative schema that only needs to handle printing text, asking for multiple choices, checking numeric flags, and jumping to new script sections.

Every game has its own implementation quirks. Making an engine to run one game is easy; making an engine compatible with dozens or hundreds of quirky engines is mayhem.

Furthermore, the old games being converted use custom engines whose file formats have rarely been documented, so it takes a lot of puzzling over hexadecimals before game data even gets anywhere near the new engine. Fortunately, that's something I don't have to do alone – a few heroic individuals have reached out and shared their research, and occasional specification notes can be found on the internet for some of these old formats. I'm very grateful for both, as that has allowed SuperSakura to extend its support to maybe twice as many games as it would have otherwise had so far.

An expectant full-body VR chair Enter the VN-verse

I expect once the automatic game text translation hook is fully implemented, SuperSakura will become a bit more famous. I'll need that hook myself, since I still don't understand Japanese very well. I know, automatic translation sucks; it can never understand pop culture references or puns, or convey unusual mannerisms, and frequently misinterprets context, but it's the best we've got for most of these old games, and it's the only solution that allows access by a wider English-speaking userbase at scale. I have a possible idea to improve the context failures, at least...

Meanwhile, thank you for your support; stay tuned for updates and an occasional blog post! The next engine release should be sometime this year. SuperSakura is a non-commercial project; I can't accept any donations. But if you'd like to assist, I'm happy for any reverse-engineering notes, and some supported games could still use custom textbox and title screen graphics.