I'm porting Incubus Realms from Ren'Py to Godot.
Hi everyone! Just came back from some short but well needed vacation. I do realise I'm not the most communicative person, so I'm doing my best to change that! Here is a new type of posts, part vtuber part podcast, video essay, whatever you call it. I wanted to have the freedom to share my thoughts and the process behind my work by talking with passion! Sit back and enjoy the show! Below the text version, which isn't an exact transcript whatsoever but whatev.
TL;DR:
I started using Ren’Py because it eased the process of creating Visual Novels. I’m now stepping away from it due to finding it constraining the evolution of the game.
Godot is free and very flexible, it has a visual interface and is better suited for the complexity I’m striving towards.
Godot doesn’t have built-in tools for VN creation like Ren’Py does, but with my now better coding skills I was able to reverse engineer how to make my own tools to do so.
To do so I’m using mainly a for-in loop and a text file, an interpreted reads it line by line, displaying what I ask it. I’m not sure this is how Ren’Py does it, but I like “to the point” accessible, intelligible code.
This all led to a custom language inspired from the way I organise my projects, screenplays and books. Its main objective is to keep it as natural as writing in human tongue. In addition, unlike Ren’Py it can now handle functionalities specific to my games, such as “🍄 Rohan got some slendershrooms”. This opens a lot of flexibility for me and the potential to write your own story for IR.
So far several objectives have been crossed off the checklist, to name a few: All aspects facilitated by Ren’Py are now working, Loading prediction works even for densely packed layered sprites, variable interpretation, etc.
I’ve made the decision to switch game engine to a more fully fledged. Until now I’ve been working with Ren’Py, it has a custom language that helps the creation of VNs. Godot doesn’t, but it offers more modern tools for game development. In addition with my current programming knowledge I’m confident I can make an even better tool specifically made for the development of my games.
Why? I’ve overgrown Ren’Py’s environment. What used to be facilitating development is now in my way. Godot offers a visual interface which would help me build my scenes, my interfaces, my databases and more way faster. I became quite depressed when I realised all the struggle I had to put myself through to make the layered sprite work, the progressive TF depended on it, clothes, etc. Declaring pictures and having them work with Ren’Py’s system is a long and repetitive process, it can take up to 500 lines to declare a single character. Not to mention the obscure syntax required to make make it dynamic, because otherwise it would become exponential. On top of that, the complexity of some sprites made them load quite slowly. Preloading them was tedious and caused them not to update as well… I think I’ve pushed Ren’Py way beyond its intended use, therefore I can’t blame the devs for it. I’m sure there are ways to make things right, but the intense research required to do so are not worth the effort.
Why now? I’ve grown as a developer and my mastery of programming now allows me to consider other game engines. Godot was always under my radar, but with their latest versions they convinced me I should make the move. I couldn’t consider leaving Ren’Py before as I was unable to create its functionalities on my own until now. After a bit of experimentation I fell in love with how I could make everything my own, my own tools to craft faster and better.
A VN in Godot: Being quite versatile, Godot doesn’t have a built-in solution for the visual novel format, therefore:
Plugins: I tested the module Dialogic V2, it brings a lot of features and I was tempted to use it until I realised not only was it an alpha, I was also constraining myself with someone else’s code. I’ve decided against it.
Reverse engineering: I’ve started studying how Ren’Py was doing its syntax and how I could reproduce it looping through a simple text document. By that point I wanted to create an interpreter that facilitates my work when writing a scene, a code that would read a screenplay and understand it like a human would.
Custom code: A “for (…) in (…)” loop would read a “.txt” document line by line, splitting them into arguments that would go into the various functions to display text, characters and more accordingly. Trying to ease the process of determining what type of line my code should expect, as some syntax would look quite similar, I first thought of using keywords.
Emoji announced type: However, it felt quickly messy. Not only did it take time, but it made it really unpleasant looking. That’s when I remember how I used emoji as icons in my project planner to make them easier to read. Announcing the line with an emoji turned out to make the whole document very pleasant and easy to read so I’ve decided to go with this solution.
Tailored for my game: Since I have full control, instead of simply reproducing the necessary functionalities for a visual novel, I’ve decided to extend it to any and all that IR-Esc. would require. Below, a few example of line types I thought of:
👤 Rohan joins at right, happy → Sprite movement
🖼 Amaïr fucks Rohan, framed → Picture
💬 Rohan: Oh… damn… that’s big! → Dialogue
🔔 Squishes → Sound
🎲 Amaïr rolls for charisma x 2 → Dice roll and Condition
—✨ Rohan got boar seeded → Status (within condition block)I’ll spare you all the details, especially what I do behind the scenes, but the idea is that it will be a one time effort, then writing the game will in fact look exactly like that.
Modding: I’ve always been very interested in modding most games, adding content, functionalities or fixing some behaviour. Creating mods can be very challenging depending on how hostile the developers have made their games to modders, that’s why I want to my game as easy to mod as possible. This language I’m creating is made to be as natural as writing English. It’s above all for internal development use (so writing stories is free of code), however, the documentation will be made public in case anyone wants to use it to create their own stories in Incubus Realms - Escapism.
Checklist: While non-exhaustive, I’ve listed below the functionalities I’m working on implementing in this custom language, crossed are those already implemented.
Progress
🟢 Easy, 🟠 Medium, 🔴 Hard, ⚫ Nightmare, ❓Unknown, ⌛Time-consuming, 📚 To learn, 🎓 Learned, 🧪 To experiment
[ ] Sprite movement 🟠
Requirements
[x] Pre-registered positions and scale.🟢
[x] Compatible with layered sprites.🟢
[x] Alternative presentation (dialogue, menu, etc.)
[x] Loading prediction 🔴
[ ] Emotions, clothes and TFs. 🟠⌛🧪
[ ] Transitions. 🟢📚
[ ] Effects 🟠📚
[x] Jumps and Calls (leaving a scene for another, coming back to where we left off if specified). 🟠
[ ] Conditions ⚫
Requirements
[x] IF, ELIF, ELSE.🔴📚
[x] Parenthesis priority. ⚫📚
[x] Nesting through indentation.🔴📚
[x] AND, OR.🟠📚
[ ] Statement evaluation. 🟠
[ ] Operands (==, <, >, in, etc.)🟠
[x] Player input 🟢
[ ] Dialogue and narration🔴
Requirements
[x] Portraits🟠📚
[x] Keywords clickable🟢📚
[x] Formatting🟢📚
[x] Overflow automatically divided.🟠
[x] Click to continue🟠📚
[x] Autoplay🟠📚
[x] Switch box style between dialogue and narration.🟢📚
[ ] Typing effects 🟢📚
[ ] Skip 🟢📚
[ ] Media🟠
Requirements
[ ] Pictures 🟢🎓
[ ] One per type allowed 🟢🎓
[ ] Pre-registered position and scaling 🟢🎓
[ ] Musics ❓📚
[ ] Loop ❓
[ ] Fade ❓
[ ] Queue 🟢
[ ] Sounds 🟢
[ ] Videos ❓📚
[ ] Controls ❓
[ ] Gallery ❓📚
[x] Variable to Text 🟢
[x] History 🟢
[ ] Vernacular expressions 🟢⌛🎓
Requirements
[ ] Linguistic quantifiers and verbal numerals 🟠⌛
[ ] Adjectives 🟢⌛
[ ] Synonym library 🟢⌛
[ ] Names
[ ] Actions
[ ] Verbs 🟢⌛
[ ] Context sensitive 🟢⌛
[ ] Items 🟠🎓
Requirements
[ ] Bartering 🟠
[ ] Trading 🟢
[ ] Shop window 🟠
[ ] Containers 🟢
[ ] Collecting 🟢
[ ] Topics 🟠🎓🧪
Requirements
[ ] Branching menus 🟠
[ ] Conditions 🟠
[ ] Cost 🟢
[ ] Bet 🟢
[ ] Advanced conversation flow 🔴🧪
Requirements
[ ] Reaction keywords 🟢🎓
[ ] Social moves 🔴📚
[ ] Confidence and Attention 🟢🎓
[ ] Relationship sensitive 🔴🎓
[ ] Spontaneous branching 🟠🎓
[ ] Mindset 🔴🎓
[ ] Feedback 🔴🎓
[ ] Replays and Memories 🔴📚
[ ] Notifications 🟢🎓
[ ] Events 🟢🎓
[ ] Status 🟢🎓
[ ] Stats 🟢🎓
Requirements
[ ] Focus limits 🟢
[ ] Level-up 🟢
[ ] Relationships🟢🎓
Requirements
[ ] Progress limits → Achievements 🟢
[ ] Level-up 🟢
[ ] Sanctuary 🟢🎓
Requirements
[ ] Companions
[ ] Captives
[ ] Guests
[ ] Intruders
[ ] Stranded
[ ] Choices 🟢🎓
[ ] Encyclopaedia entry 🟢🎓
Requirements
[ ] Category
[ ] Source type
[ ] Conflicting info
[ ] Trust or Refute
[ ] Fight, Flight or Freeze summon 🟢🎓
Requirements
[ ] Menu📚
[ ] Contextual difficulty
[ ] Encounters 🟢🎓
Requirements
[ ] Auto-roll
[ ] Send parameters
[ ] Turns and Phase 🟠🧪
Requirements
[ ] Time sensitive events🟢🎓
[ ] Routines, agenda and objectives 📚
[ ] Timers🟢🎓
[ ] Resting or staying alert🟢🎓
[ ] Locations, Bookmark 🟢🎓
[ ] Dice roll 🟢🎓
Requirements
[ ] Optional menu (if FP consumption)
[ ] Difficulty
[ ] Dice calculator
[ ] Dead-End reset🟢🎓
[ ] Exploration screen summon🟢🎓
[ ] Encyclopaedia tooltips on hover🟢🎓
[ ] Localisation ready ⚫📚
Requirements
[ ] Text tagged for swapping 🔴📚
[ ] Tool to export alternative text ⚫📚
[ ] Forbid variable and tags editing ⚫📚
[ ] Runtime translation tool (cf. Paralives) 🔴📚
