I do enjoy it when a game is clearly trying to use a wildly inappropriate pre-built game engine for what it wants to do, but I don't see why RPG Maker should have all the fun. Do grid-based tactical combat in Inform. Write a rhythm game in Twine. Implement that precision puzzle platformer in Ren'Py. You know you want to.
Bunnydoll (The Amazing Digital Circus) Kinetic Visual Novel
About
This is a free fangame written by beanandberry (beanandberry.tumblr.com) and illustrated and composited by CanterburyBell (canterbury-bell.tumblr.com), created in Ren'Py between November 2024 and February 2025. It is a kinetic visual novel that takes approximately an hour to play, and it focuses on the pairing of Jax and Ragatha from The Amazing Digital Circus.
The Amazing Digital Circus is by Gooseworx and Glitch Productions. Please support the official release here.
Special thanks to PixieVenus (notnights.tumblr.com) and VeeVisions (vadoodlevee.tumblr.com) for playing through as betas and helping us catch typos! : )
Notes
It is recommended to download the game on a computer for optimized performance. However, an in-browser version has been provided for those who need it and to make it accessible by mobile device. Transitions may be more pixelated in the in-browser version. iOS may not support full-screen HTML5 on mobile devices.
I talked about it on TikTok but it's a kinetic novel where the plot is that the boys wanna go to a convention out of state, but their parents won't let them so they sneak off to go on their own.
Tutorial and tips when working with Ren'Py's layered images
I made another Ren'Py tutorial post! This time about LayeredImages because I had to find a lot of tricks to make my 1000+ image game at least somewhat efficient
It covers:
Basics of layeredimage (attributes, groups, characters, transforms)
Exporting/formatting images
Naming files
Conditional attributes & variants
Easy blinking
Showing the same image multiple times (LayeredImageProxy)
I also created a mini browser dress-up game/sprite showcase where you can go through most of the sprites (I had to cut some because, 1000+ images) and it shows what the "show" command would be in the Ren'Py editor
While we're on the subject of 3000 CWY, I want to brag about the background system I have in game. You'll notice that most environments have a "window" (Really a transparent/tinted part of the image) that allows you to see the earth beyond.
But! Since the game has mechanics relating to time, when sufficient time passes in game, the space station that the game is taking place on moves over the earths surface, giving a different view of the earth below!
This was accomplished by taking real life earth photography by nasa from this *fantastic* resource. I took frames every 2ish seconds and cut the video into 58 individual "backgrounds" which I then manually edited to reduce resolution, quantize, and dither. Resulting in images like these!
Which are then loaded in game at certain intervals in game time to create a dynamic background independent of what room you're in! (though the tint of the windows/lighting in different rooms can make the same image look a bit different in different scenarios.)
I really wanted to show off how pretty the earth from space is, and thought that using real world images would be the best way to do that :3
Anyways! I'm quite proud of it, and wanted to share my process since I haven't really gotten to do that before.
welcome to surprise nadia nova how to make a visual novel tutorial
you want to 100% use ren'py i dont make the rules
its straightforward enough that simply downloading, installing and hitting the "create new project" and spamming through the menu and then opening script.rpy to see the code which will tell you like 70% of what you need to make your first vn. there no need to be afraid just because the word 'code' was mentioned. ren'py's own language is just copy pasting stuff back and forth and inserting your own names and pictures. its nothing like C# or java or whatever languages exist cause i know jackshit about any of that and dont know how to do programming
anyway, inside the main script file, script.rpy, are commented instructions on how to name a character, place a sprite, place a background, and put in text and you can basically make a vn with these things. i can not stress it enough KEEP IT SIMPLE, especially if you're starting out. making things complicated or planning massive projects is just shooting yourself in the foot. better to make 2 minute game than get stuck trying to make a epic masterpiece
writing a story is its own thing. however anyone can write and its better to write a shit story than no story. that way you have something to build on and get more comfy with your own art process. its what me and everyone else who makes vns and any other art or skill or hobby have done too.
if you like what some other vn/manga/anime/story does copy it and smash these inspirations together to make your own thing. save pictures and lines you see that get you inspired if you need inspiration and references for your own story. everything in this world is inspired by other things someone else has made. its not stealing unless you get absurd and download someone elses game and take out half the assets and put them in your own game and pretend you didnt
if you have interest do yourself a favour and make a vn. as far as game development goes its one of the most accessible options out there . ren'py is an amazing engine having all the vn necessities already in place since that allows you to just focus on the story and not have to worry about setting things up yourself and scrambling with advanced code unless you really want to
i know the jam is just ending in the following weeks and depending on when you see this post this might be outdated as hell but my yurijam server is still going and will be going until people simmer out and something new shiny takes their attention. still, its a server an people post gay shit there occasionally even outside of jams so me and many others are helpful and like answering questions to help otehrs make stuff. so i think the best way is to join the server rn and just ask questions in the help channel. better to ask stupid questions than no questions
now go make a visual novel im holding a whip and making those scary crack sounds and aiming just close enough to your feet that youre almost convinced it hit you despite your jumping and dancing and DANCE NOW DANCE MAKE A VISUAL NOVEL DANCE GET TO IT MAKE A VISUAL NOVEL DO IT NOW OR ILL GET YOUR FACE NEXT MAKE A VISUAL NOV-
anyway but for real if you really are interested make a vn cause im holding a whip and making thOSE SCARY CR-
Lengthy discussion under the cut of how Ren'py makes it easy to get started making your own VN! TL;DR: this 100% free engine gives you a working template right out of the box; read the quickstart guide and you can have a prototype running in minutes :)
This ramble has been in the works for a while; I'd been wanting to yap about the engine since I finished DxM but it was a bit tricky to figure out a balance in detail/length/focus/etc. I've opted to simply highlight some advantages that make it easy to get started, since my goal is to show how good Ren'py is at doing what it does and that everyone should try it >:)
-
What I find particularly great about is that it does so much right out of the box. It is very conscious of what a VN needs, and does as much as it can to make that as easy as possible, even to people who are complete newbies to both the engine and programming. It: (1) gives you a fully functional template, (2) makes script-writing as dumb and easy as possible, (3) provides both relatively straightforward and immensely flexible customization options, and (4) is meticulously documented and has a well-established community/support base.
(1) The Functional Template
The way it gives basically comes with a working VN right out of the box is a great feature of Ren'py, perfect for anyone who wants to hit the ground running. You download it, run the application, click "Create New Project", pick between a small number of size/theme options, and then it spits out a package that is essentially a functional VN without any content. The default template comes pre-packaged with a fully functional UI that you can run right away, just like any other application on your computer.
[Screenshot of the default project template that gets output]
Even if you don't want your VN to look like the default GUI, rearranging things to match your vision is something that can be done later (unless you know exactly how you want it to look, like it was for me & DxM. In that case, establishing the right dimensions early on can save a lot of hassle). The nice thing about this functional template is that you can dive right into writing/drawing the actual script & images, to get that first proof of concept up and running, without having to worry about lots of setup or configuration. And Ren'py's script support is in my personal opinion, very very accessible.
(2) Easy script writing
When you think of something like a movie or play script, you might imagine something with this kind of format:
SCENE 1: A dark forest.
[Gabriel walks to the centre, holding a torch]
GABRIEL: "WHERE IS THAT DAMNED MACHINE."
[Gabriel looks around frustratedly]
GABRIEL: "I HAVE BEEN WAITING FOR TWELVE HOURS TO GIVE IT THIS BATCH OF COOKIES AND NOW THEY ARE NO LONGER FRESH."
[Gabriel walks off the right, scene fades to black]
Ren'py makes this user-friendly format as their basis for writing the VN script. This is what I would consider a second major advantage. A Ren'py script.py file that does the above would look something like this:
label start:
scene dark_forest_background
show gabriel with_torch at center
"GABRIEL" "WHERE IS THAT DAMNED MACHINE."
show gabriel looking
"GABRIEL" "I HAVE BEEN WAITING FOR TWELVE HOURS TO GIVE IT THIS BATCH OF COOKIES AND NOW THEY ARE NO LONGER FRESH."
show gabriel leaving at right
show black_background with dissolve
Writing a Ren'py script feels a lot like writing/directing a play. Each line in the script is executed sequentially, whether it's a dialogue line or a change in scene, with a click from the player required by default to move to the next line. You have the images and you have the dialogue; you decide how they show up on-screen in what order, and with what special effects/positioning they use (most of which are built-in).
In the example above, all character dialogue will automatically be shown in a dialogue box labelled with the name provided ("GABRIEL"). All changes take effect instantly, so you can see them in-game immediately. You can set something up in literal minutes if you have all the parts; the work lies only in putting them together.
[Award-winning VN in the works???]
What about offering dialogue options and diverging routes? That is also made as easy as possible via the engine. Say you want to give the player 3 options, for example - (1) Go up the hill, (2) Leave the forest; or (3) Eat the cookies yourself.
To translate this to Ren'py, all you have to do is add a menu statement at the point in the script where you want it to show up. To extend the example above:
[...]
show gabriel_leaving at right
show black_background with dissolve
menu:
"Go up the hill":
jump up_hill
"Leave the forest":
jump leave_forest
"Eat the cookies yourself":
jump eat_cookies
(As this ramble is not meant to be a syntax guide, I won't go into the depths of Renpy's syntax, but I will mention that the colons and indentations are important!)
Then once the script reaches the fade-to-black, the "menu" line is run, and Renpy will automatically show the three options on-screen as clickable buttons. When the player clicks on the appropriate button, the control flow will jump to the corresponding label, which can then be defined anywhere else in the script.
The "up_hill"/"leave_forest"/"eat_cookies" labels are names you make up, and they should correspond to landing points for those jump statements, where the script will continue from. For example:
label up_hill:
"GABRIEL" "GUESS I'LL TRY GOING UP THE HILL."
[...]
label leave_forest:
"GABRIEL" "MAYBE I SHOULDN'T BE LOOKING FOR IT HERE."
[...]
label eat_cookies:
"GABRIEL" "OKAY I'M JUST EATING THESE MYSELF THEN."
[...]
The job of the creator then becomes scripting all the routes, defining menus + options, and creating jump/label pairs that will connect in the way they want the flow to go. When the script reaches an end with no further statements to execute, it ends on its own and returns to the main menu.
For simple decision-based and dialogue-centric VNs like DxM, this was basically all that was needed to convey the story!
(3) Straightforward Customization
The third thing I really liked is how Ren'py exposes customization options extremely easily. Virtually anything you want to change or set is available in the form of a relevant property, part of Ren'py's robust, overarching "style" system. And since the sheer number of options can get overwhelming to a new user, by default Ren'py exposes - via very clearly labelled variables - a good number of properties that could be considered "frequently used", such as the system font, the dialogue text size, text colour, the size of the dialogue window, etc. If you want finer control, you can go in and set the property values for each and every UI element that you like.
Adding your own UI elements is also very easy. There's a slightly steeper learning curve because anything you want on-screen that's not a static image needs something called a "screen" that you can define (for example, the +BONUSES box in DxM was a custom screen, as was the clock in the top left corner). But screens can be ridiculously basic:
screen example_screen():
text "This is an example"
That's it that's a screen, that simply shows the text "This is an example" in the default position on-screen. Again since the lines in the script are executed sequentially, simply adding "show screen example_screen" at the right point will cause the text to appear on-screen like magic :)
DxM obviously looks nothing like the default template shown above, and that was quite easily achievable by adding & removing various UI elements, then rearranging things until they were all in the right spots.
(4) Read the docs (or don't, it works either way)
The fourth and most important advantage of Ren'py in my book is how long it's been around, resulting in the extremely well-established community/documentation/resources. I joke to myself that I brute-forced Ren'py because I skimmed the quickstart guide in their documentation, then spent the next month or so simply googling "renpy how do I do X" and trying out each result until I got what I wanted, without actually really understanding what the heck I was doing 80% of the time. And it worked! Because searching for Ren'py help for basic things like how to arrange things in a grid or add a scrollbox always yielded helpful results - there's a forum full of responsive Ren'py veterans where almost any question you can think of has been asked, and the Ren'py subreddit turned out to be a great resource as well. I also saw several dedicated tutorial websites that had posts on how to employ certain features of Ren'py, in case friendlier language than that of the docs would be a benefit.
Eventually I did read through most of the docs (I am a nerd who enjoys doing that) - they definitely get more technical and there are lots of things I still don't understand well, but they really helped expose me to new features that I wouldn't have known were possibilities (like the drop-down menus, tooltips, custom transitions, and of course browser support). Wading through the docs also led to several major overhauls of my code when I realized I was doing stuff in the stupidest way possible, brute-forcing a workaround when Ren'py already had seamless built-in handling of that (hi, using global variables for literally everything, I don't miss you). To use advanced features of Ren'py, knowledge of Python & programming principles is required, but the bare minimum can already get you really far with Ren'py.
-
If you've made it all the way down here, thanks for reading, I hope that was at least somewhat informative/interesting! I tried to keep this as a relatively brief "taster" and had to leave out a lot of detail to that end, but would be happy to expand on anything specific. For anyone interested in trying it out though, the proper place to start would be the official quickstart guide, which covers everything I mentioned here in a better level of detail for getting started.