‹ Back to homepage

Marquis Kurt

Python, Swift, indie game, and Web developer

A fancy avatar of me, Marquis Kurt.

Unscripted: A Post-mortem

Written on 05 September 2021

devlog post-mortem unscripted indie indie game visual novel renpy

Good writing is difficult; between getting the occasional writer’s block and articulating everything in just the right way, it can be tricky to write a story that captivates readers. Taking that piece of writing and pushing it to the next level by making it a video game? In some ways, it’s liberating, since you don’t need to write a lot of details that the game itself could present; in others, it’s just as restrictive given technical limitations, reformatting the story, and other things to consider.

I ended up discovering all of this when I set out to create my first commercial game and visual novel, Unscripted. What started out as a simple game that aimed to recreate ideas that have been floating in my head turned into a massive project that felt very similar to writing a screenplay. As a programmer, I felt ready to tackle on a project like this, but I was not ready for the breadth of content I’d have to generate to make the story work. Nonetheless, I’m still proud of what I have produced.

An inkling becomes a prototype

Before I worked on Unscripted, I tried my best to make interesting mods for the Doki Doki Literature Club! (DDLC) visual novel with interesting stories that bridged games together. Modding DDLC provided a lot of the experience I needed to make a full game in the Ren’Py visual novel engine, and I couldn’t have been more excited to create something of my own.

Taking inspiration from DDLC, I had an idea for a game where the player’s character gained sentience and could physically manipulate the world around them to interact with their world and the game in a new light. While I didn’t have much planned in terms of plot, I figured that this would be an interesting concept to explore, taking some of the ideas DDLC brought and flipping them on their head. I began making a prototype of the game by writing the first day in the game, trying to provide enough exposition to set the tone. I didn’t have any sprites on hand, so I decided to draft up my own, which turned out alright (though I do need to work on drawing human anatomy). Within a couple of days, I had a prototype of the game up and running that I somewhat enjoyed.

Initially, the game took place during a week-long software development conference akin to Apple’s WWDC; you and your friend (likely love interest, too) Christina were heading together when, after the first keynote presentation, you encounter Zen’no and gain sentience. The original also was to contain a new character, Erica, who, in a way, resembled the Ren’Py mascot, Eileen. The game retained a somewhat psychological horror approach borrowed from DDLC but meant to serve as the entry point for the game. Sadly, I did not have any screenshots of the original prototype to present here.

Writing, rewriting, and art commissioning

While I enjoyed the first prototype when I made it, there were quite a few issues with it that made it feel too unpolished to continue as is. Although prototypes are always unpolished, this prototype felt really rough and not something I’d want to pursue without changes. First, the backgrounds and sprite artwork didn’t feel right; using a combination of my own custom artwork with backgrounds from Unsplash made it feel extremely cheesy and half-baked. Second, as interesting as the story idea was, I couldn’t really think of where I could take the idea after that first day. I may revisit that idea later and try again, but it didn’t feel right for a visual novel. Finally, I felt that Christina and Zen’no in these versions were hyper-personalized in terms of their personality, and it wasn’t going to work the way I had anticipated it to.

I decided that I would scrap the storyline and start over, this time trying to focus on the characters themselves instead of the overarching concept. By that time, I had read through Anne Lamott’s Bird by Bird and wanted to focus more on character development rather than the plot. For providing exposition and setting up the first couple of days, this worked really well; I got to understand the characters I wanted to write about better and give them personalities that weren’t unrealistic.

With the new approach I was taking to writing the game, I managed to write new character-specific routes for a short demo that let players explore these characters a bit more. As for the plot, it remained largely unchanged; it was polished and revised to make it feel more cohesive. Rather than having the game take place in a large building, it would instead take place across multiple buildings; this worked out well since I had also purchased new backgrounds from Minikle designed for visual novels at that time.

Another part of the game that really bugged me that I wanted to fix was the artwork for the characters. While I could practice drawing more and eventually craft the perfect characters, I eventually settled on the fact that it would take too long for my liking and that I should stick to my current strengths. Realizing this, I began searching around the internet for artists that I could commission to draw these sprites for me; eventually, I came across the sprite artist that I commissioned throughout the entire project, Raseruuu, on Discord. He had been looking for someone to commission him while working on SoftWar, a visual novel and RPG hybrid focusing on software and malware. After some discussion, I opted to commission him for the character artwork because his unique art style stands out from most character artwork I’ve seen in visual novels.

Tangentially, I didn’t enjoy one of the characters in the game that I had written: Erica. She felt very static and boring to write. After some further experimentation and conversation with the sprite artist, I decided to take an unusual approach for creating a new character to replace her. Given that the game’s plot and characters center around software development (and game development, to an extent at that time), I figured that I would create a character that felt like a natural extension of a programming language. Since some of the design at that time was inspired by JetBrains products, I settled on creating a character heavily inspired by the Kotlin programming language: Katorin Trenda. Instead of the static and cheesy-feeling Erica that existed in the game at the time, Katorin would be more fun, playful, and incredibly nerdy, and sometimes pretty naive.

At this time, I also wanted to look into so music to add to the game. I decided to contact Stray Objects to get a license for use of their music in the game. I was able to add the music tracks I felt were appropriate for the game with little effort, and it worked out. Surprisingly, those tracks stayed in the developer betas for the longest time.

Overall, I felt more confident in the version of Unscripted from this overhaul compared to the original prototype. Things felt much more cohesive, and the artwork made it feel more polished and pleasing to read.

The private playtesting sessions and a call for rewriting

Of course, that feeling would subside over time. I wanted to get an impression of what people felt of my particular prototype and where I should take the story going forward; I quickly got to work on polishing the game up for playtesting as a developer beta for the demo version of the game. Within a couple of weeks, I got the game into a very playable state that I wanted to share with others and began assembling a private playtesting team that would review the game and give me feedback. At this time, I also set up the official Twitter account for the game so I could start teasing the demo in hopes of garnering more attention to the game; this decision turned out to be really effective for the game in the long term.

I uploaded the game to a private Itch.io page for playtesters to try out. At first, I didn’t get a lot of feedback given the nature of Discord and the internet. However, that changed when my fellow friends and classmates in my sophomore year of college wanted to try out the game. We decided to gather in my tiny dorm room that I shared with my roommate, huddle up in front of my MacBook Pro and external monitor, and play it. Besides being some of the best moments in college I’ve had thanks to our unique world-building and inside jokes, it was a great way of getting the feedback I needed. Since my friends had never seen the game before, I was able to get important critical feedback that helped improve the story.

I shortly got to work on rewriting the storyline to make it feel much more realistic, taking into account the feedback I received. Eventually, I settled on rewriting the entire story, scrapping the original prototype ideas with a plot that felt much more realistic: a new resident of a city trying to publish their video game. Although I felt a bit dismayed to see the original concept go, this new storyline felt so much better and easier to write. For the next couple of months, I would keep cycling between rewriting (or adding to) the storyline and the feedback game nights while also adding in smaller features and improvements such as a fake email inbox.

A milestone worth celebrating for, and other things

Before I could distribute the game, however, I needed to make sure the game would work across devices. While it took little effort for me to make binaries for Windows and Linux, I needed to take extra steps for macOS, given the notarization requirements. Within a couple of weeks, I was able to publish my first Python library to PyPI that handled most of the commands needed to make the signing and notarization process work easily and quickly. By the time Christmas Eve of 2019 rolled around, I was able finally release the demo I had long hoped to release. There were some bugs here and there that I did eventually make hotfixes for, but I was proud to make my first release of the game, even if a demo, to the public.

Once the demo came out, I continued to work on the game by adding some new features to the demo that would help in creating the full version of the game. Besides the usual round of bug fixes, I worked on adding a new build system for the game that would intelligently separate the scripts for the full version of the game from that of the demo, contributing to a cut in file size and assuring that clever hackers couldn’t try accessing the full game from the demo. This build system also paved the way for experiments that could be enabled or disabled with flags and arguments. This system was improved upon down the line to include other things.

An extended demo amidst a global crisis

Shortly after upgrading the build system for Unscripted, I began working on adding more story to the game. I had some extra chapters written since the demo release at that time, but they weren’t visible because they were still unpolished. Additionally, the demo release only came with three chapters, which is a bit short for the game. I began focusing on writing more chapters of the story, heavily focusing on progressing the plot and emphasizing character development.

Around this time, I also encountered a problem: writer’s block. Given the way the story was currently going, I did not have a slight idea as to where I wanted to take the story, even though I knew the endings for the different possible routes at the time. Eventually, I came to the conclusion that the game had too few characters to make the story come to life and be dynamic enough to be playable. I decided that I would create a new character and add them to the game, spicing things up a little and opening the door to more possibilities.

After digging around in some old prototypes and projects, I came across a character from a short novel I worked on with a partner in my junior year of high school during National Novel Writing Month (NaNoWriMo). After re-reading through the old project, I realized just how lively this character was and how she’d be a perfect fit for the game, given that some details were changed to match Unscripted’s setting (and effectively expunging/pardoning her from any crimes committed in that old novel). This character later became the Fira “Meredith” Sans that we have all come to know and love (and also one of my favorite characters for this game by far).

Another thing I accomplished to give the story some complexity while also providing just the right amount of flair was to change Christina’s personality entirely. This was more or less inspired by some events that took place in my personal life, but this shift in personality definitely made the game feel a lot less like a dating simulator and a lot more like a complex novel.

Around this time, I also began working on a prototype version of the minigame that could be played in the game. The purpose of the minigame was to give players an interactive experience that closely resembled to what software developers go through on a regular basis in terms of writing and debugging code while abstracting it to where player would be able to do this without prior knowledge. This became its own set of challenges, since I also wanted to provide a version of the minigame where, if enabled, players can write their own custom Python scripts that the game would interpret and execute accordingly. This took a lot of effort. Between the parsing and sandboxing of Python code, I also needed to make sure I had a system that would work between different modes of the minigame. As I was taking a class on programming languages, I made the decision of introducing an intermediary pseudo-virtual machine language that the game would write and execute on its own. This took some time while I was writing the story.

Then, the unthinkable happened: COVID-19 struck, causing wreak and havoc that set the game’s development back severely. As classes moved to the online realm with asynchronous counterparts and extra work added, the game’s development was temporarily halted. It took a couple of weeks before I finally got acclimated to online classes during the pandemic enough to where I could continue working on the game. I was able to publish the updated version of the demo with three new chapters, a beta version of the minigame, and some other minor improvements such as pronoun selection.

I later launched a playtesting program that effectively acted as a public beta program where players could get access to the builds and test the game for feedback. I gained a few more playtesters this way, and the system worked well, perhaps a bit too well… it didn’t take long before playtesters were looking into the code and suggesting changes. Eventually, I settled on writing playtesting guidelines and encouraging playtesters to focus more on the story, since that was where my major concerns were. Thankfully, I ended up getting a playtester that gave me exactly that; they critically analyzed the story and pointed out many inconsistencies and red flags that weren’t really realistic. I was able to fix up major parts of the story this way, and it certainly made some of the characters seem less creepy.

Heading home and wading through molasses

As COVID-19 cases dropped in the summer, I continued working on the game, focusing solely on the full version with a complete story. In that time, I was able to write more of the individual routes for each of the character, with Fira’s route nearly complete. Around this time, the game was garnering a lot of attention, and I was soon getting messages and emails with offers from voice actors/actresses, composers, etc. One of those offers came from composer Marek Domagała with an offer to make the soundtrack for the game that would be new and unique. Although I was hesitant at first, I accepted and worked with him on coming up with the music. In due time, Unscripted had a new main menu theme. Voice actress Anjali Kunapaneni had also reached out to me, and after hearing her samples, I knew that she would make a perfect fit for Fira. I accepted, and we worked together on picking which lines from the game could be voiced over for an upcoming trailer.

In late July/August, I finally decided to make the Steam page for the game since I had enough money to pay the $99 fee to publish it there. While working on the page, I was also busy in creating the trailer with new music and voice-over lines, as well as updating the game’s website with a new domain. In mid-August, I was able to announce the trailer, unveil the new website with the domain unscriptedvn.dev, and launch the Steam page to garner wishlists. It was truly a wonderful feeling to get that off the ground as I continued the game. Later on, Steam became the platform I’d use to publish test builds of the game for easy access, which worked really well.

I had anticipated returning to campus in the fall of 2020 (albeit with some adjustment) where I would have more time to work on the game alongside my schoolwork. Unfortunately, that situation changed quickly, and I had to instead head to my home in Georgia at the time for the semester online. Progress on the game came to a trickle since I had to juggle between schoolwork that included a major AI project (which later became The Costumemaster), housework, and burnout from classes.

The homestretch

By the time the workload lightened up in around November, I was able to dedicate more time to the game by fixing up the minigame and writing the rest of the story. Around this time, the soundtrack for the game was finalized with a new music layering system similar to the approach Portal 2 takes (though not exactly as unique). I had reached out to Anjali again to record some final voice lines for one of the endings in the game, which worked out really well. The game was nearly ready for the full release, just before Christmas. I was getting excited. I made a release candidate in early December to finalize everything and catch any stray bugs. During this time, I also quickly added Steam achievements to make gameplay a little more interesting from the Steam side of things.

With a couple of bugs caught and fixed, it was time to finally release the game; I took the leap of changing the beta flag to the stable one, exported, notarized, and uploaded the game to Itch.io, GameJolt, and Steam. And, just like that, my game was finally ready for the world to play.

Or so I thought. It turned out that, for whatever reason, the CHANGELOG file was causing a game-breaking issue in the game. Since the changelog for the latest release is displayed when the player starts the game, it ended up preventing people from playing it on macOS or the build on Steam. The culprit? A misconfigured path to the changelog, which tried to load from a child directory called game instead of the root. I quickly hobbled a hotfix, which also added some needed audio files, and released that build just a few hours after the initial release. How I managed to miss this is still beyond me. Following that hotfix build were a series of bug fixes that were issued throughout December; thankfully, this only happened in two builds, and they were patched relatively quickly. As I had quickly discovered, the reason why all of these bugs were being found now and not during the release candidate phase was due to the fact that the playtesters in the playtesting program didn’t playtest that particular build until weeks later. Whoops.

Initial reception and sales

The game had launched with a launch party sale on all platforms, which helped sell several copies right off the bat. However, over the course of time, the purchase numbers dwindled, and, sooner or later, no more purchases were made in the following months. Whenever a sale occurred that I participated in, the numbers did rise up again, but only slightly. Although I had anticipated this given that this was my first commercial project, it was a little disheartening to see.

I don’t have a full grasp as to why the sales are like this, but I am hypothesizing a couple of things, some of which may correlate to each other:

On a somewhat unrelated note, I did end up getting quite a few press requests to get a copy of the game for review. I did end up getting to see the review from one particular curator, but I haven’t heard much from others. I’m not super concerned with this, even though I am aware of press request scams.

What went well

I’m pretty proud of what I’ve accomplished with this game, considering it’s my first commercial entry into the indie game space. There’s definitely some things that helped make this game possible.

I feel that offloading some of the work to people I could commission helped me tremendously. Although a bit costly, this approach worked well for me because it meant I could focus on the parts of the game that I knew I could accomplish myself without worry about the parts I had no experience in. It also allowed me to establish a network of people in various fields, which is helpful if I ever need to do it again.

I also think that starting the Twitter account for marketing purposes and trying to capture my audience’s interest as I was building it, even before the demo, worked out really well. There’s a good handful of followers on that Twitter account, and it helped contribute to wishlists and sales. This naturally expanded to posting on various social media platforms to spreading the message, which seems to have paid off.

The heavy focus on character development with the story definitely made it worthwhile and content-filled without feeling completely rushed into the plot with static characters. Taking the time to give the characters personality and focusing on the dynamics in various situations helped to make the game feel more lively.

Finally, the continuous loop of getting feedback from playtesters with new builds helped make the game more polished and bug-free over time. It gave me a sense of direction and allowed me to make sure the game was as good as it could be.

What went wrong

Likewise, there were some mistakes I that I made along the way and are still present in the game. Besides the first-timer mistakes game developers will make with distribution and marketing, there were some issues I noticed specifically with Unscripted that I came across. I’d likely rectify them if I had the chance to do the game over again.

I recognize that Unscripted is a pretty niche game in a niche genre, which doesn’t necessarily make for the bestselling game. There’s a very small audience that I’ve unintentionally targeted merely by the plot and story decisions I’ve made. It certainly didn’t help that the minigame was more programming-centric, no matter how easy I made it for the player. Thankfully, I’ve rectified this a little by making a feature update in July of 2021 that changed the basic mode to regular buttons the player can push, as well as removing the advanced mode with Python scripting, which was still incredibly buggy. The initial release of the game also had a switch to disable the minigame entirely so that players could enjoy the game as a traditional visual novel, though some reviewers failed to find said setting.

For those wondering about the game’s scope, I did feel that I over-scoped a little bit. It certainly did not help that I didn’t set a timeframe for when the game was to be completed, instead opting for a release schedule of “it’ll be ready when it’s ready”, or by the end of 2021 (whichever came first). If I wanted to redo the entire game, I’d probably opt to remove the fancy programming features from the minigame and just try to make a regular platforming game of some kind with glitches and intentional bugs.

While the playtesting program was a great way of getting feedback, I wish I could’ve gotten more feedback to make the game feel even more polished than before. I did do some marketing for it on Twitter in the past, but I got very little interaction from there. If I were to do this all over again, I would probably have marketed this more aggressively and maybe even provide more incentives to do so, besides a free copy of the full game and a wallpaper.

In conclusion

It’s been just over two years since Unscripted was first developed, and I’ve had such a great time working on the game. It was a great way to get into game development and learn about the game development process, as well as what it takes to run a sole proprietorship (effectively). I’m grateful for everyone whose helped make the game what it is today. I’m hoping to make more commercial indie games in the future, and I certainly wouldn’t mind revisiting some of the characters in the game for another project. A “(Games by Marquis Kurt/Unscripted) Game Universe”, perhaps.