TOIL - Postmortem


The jam

TOIL was designed specifically for the Only One of Any Asset visual novel game jam (https://itch.io/jam/o2a2-2025). We knew we wanted to do this jam for a while, with Lynn having worked on an O2A2 project the previous year. O2A2’s strict limitations and short timeline are well balanced and pushes creative solutions to tell a story in a visually engaging way with very little. This is one of Lynn’s favorite game jams due to its short time commitment window, reasonable limitations, and low stakes. It’s a great jam for testing teams, new techniques, and giving folks who have never worked on a jam something easy to complete for their portfolios. 

The story

Our writer, Ramsey, is one of our go-to creatives for jam projects. They are consistent in the quality of their writing and easy to work with. They worked with us on our 2024 Spooktober visual novel – Exposure (https://www.borderbreakers.art/exposure) - so we knew they already had some experience writing visual novels. 

For this jam, we didn't have a story already in mind. We opted to ask Ramsey if they had a short story that would fit within the jam’s 1000-word limitation, and we were in luck! Ramsey happened to have a short story that had been floating around in their head for a while but had never put pen to paper for it. This jam provided the perfect opportunity to finally get the story out into the world. 

“…one where purgatory is a WWII era shipyard based around the concept of putting people to work to support this 'war' between heaven and hell for eternity and fueled by WWII type propaganda and stuff, i figured it would make for a good short story following someone going through the process of someone recently dead and going through the process of indoctrination/being put to work” – Ramsey Cotton

Ramsey was inspired by their own personal experience living on military bases while growing up, but also the Yokosuka Naval Arsenal in Japan (https://en.wikipedia.org/wiki/Yokosuka_Naval_Arsenal).

We very quickly opted for a linear story with no branching choices to keep the script from getting unwieldy. 

An important part of the game that was identified early in the outline would be the inclusion of propaganda posters that would pop up at certain points in the story. This would require posters to be created and custom coding to ensure the images work as intended.

The outline was used as a guide to inform decisions made on all the other aspects of the game to keep things feeling as cohesive as possible. 

The art

Our art team for this project included Lynn doing UI, Nynh doing the propaganda posters, Court doing the animated character, and oldestcharm on backgrounds. All team members had previously worked on at least one visual novel, with Nynh being the sprite artist for our 2024 Spooktober project - Exposure - and oldestcharm having created backgrounds for a 2024 Winter Visual Novel jam project that Lynn and Court were also team members on. We knew the strengths of each team member and worked well together, so there were little unknowns in the team composition on the art side. 

The background

In our pre-production stages before the jam, we very quickly identified the visual style we wanted for the game. The very first thing we knew we wanted to do with the game was design a background that could be used for a continually scrolling parallax effect. We looked at other parallax backgrounds for inspiration, particularly this Roku Screensaver (https://www.youtube.com/watch?v=eZ9EYgR5sSM) and created a mock-up of the UI so we could better understand what would be covered up by the UI at any given time. This helped us plan where different elements of the background would need to be given our character needed to not be covered up by the UI. 

A screenshot of a video game  AI-generated content may be incorrect.

 We pulled images for inspiration, looking specifically at shipyards that fit the implied time period of the story.  

A collage of images of ships and cranes  AI-generated content may be incorrect.

The team gravitated towards this image as inspiration for the dominant color of the game. 

A group of ships in the water  AI-generated content may be incorrect.

Oldestcharm refined the color palette of the background which was also used for the UI and complimented by the oranges and yellows used in the posters designed by Nynh. 

 

Because of how we wanted to implement the continual parallax scroll of the background, it took a fair amount of pre-planning to figure out how to make the layers work exactly how we needed. 

A whiteboard with red writing  AI-generated content may be incorrect.A drawing of a building  AI-generated content may be incorrect.A drawing of a train and a crane  AI-generated content may be incorrect.A drawing of a room  AI-generated content may be incorrect.A drawing of a building  AI-generated content may be incorrect.A screenshot of a whiteboard with blue writing  AI-generated content may be incorrect.A black and white image of a rectangular object  AI-generated content may be incorrect.

To make sure the repetition on the background wasn’t as obvious, oldestcharm made the closer layers wider and wider to fit more interesting elements in and push the feeling of perspective and scale. 

A screen shot of a computer  AI-generated content may be incorrect.A screen shot of a video  AI-generated content may be incorrect.A video game screen with a video game screen  AI-generated content may be incorrect.A cartoon of a ship  AI-generated content may be incorrect.

All the planning and above concept art was completed prior to the jam. The goal was that once the jam started, we would be able to dive headfirst into creating the assets that would appear in the final game. With such a tight deadline, it was important to ensure that our mockups were accurate, so we did not waste any time having to redo artwork.

Once the jam began, oldestcharm dove right into refining the background artwork layer by layer.

A black and white image of a building  AI-generated content may be incorrect.A video game screen with a rock on the edge of a cliff  AI-generated content may be incorrect.A video game screen shot  AI-generated content may be incorrect.

One mid-jam addition was that Lynn requested that a crane element be added to push the idea of it being a shipyard after discovering this historical crane (https://www.nps.gov/rori/learn/historyculture/the-whirley-crane.htm).

A screenshot of a video game  AI-generated content may be incorrect.

To push the sense of depth, oldestcharm added more foreground and background elements.

A video game screen with a car on the roof  AI-generated content may be incorrect.

The final parallax background ended up being 7 total layers.

  • Sky with moon (stationary)
  • Clouds
  • Back water
  • Ships
  • Warf
  • Front water
  • Floating junk

A ship in the water  AI-generated content may be incorrect.

The posters

Posters play a big part in the narrative. We knew we wanted the persistent presence of propaganda to ultimately shift the character’s attitude about the situation they have found themselves in, much like how propaganda and call-to-actions work in our everyday life.

We looked at propaganda posters from the era, knowing we wanted to go for a similar visual style with limited color palettes, bold blocks of solid color and loud text, and the lower quality printing quality of the time.

A collage of various vintage signs  AI-generated content may be incorrect.A collage of posters  AI-generated content may be incorrect.A collage of posters  AI-generated content may be incorrect.

Nynh, our poster designer, created 5 posters that pop up at different points throughout the game and are also viewable in the poster gallery.

A group of posters with text  AI-generated content may be incorrect.A hand with a hole in the ground  AI-generated content may be incorrect.  A cartoon of a person with a helmet  AI-generated content may be incorrect.  A ship with an object  AI-generated content may be incorrect.A ship with wings and butterflies  AI-generated content may be incorrect.A person wearing a mask  AI-generated content may be incorrect.

The animation

Since deciding the background would be a continuous scroll, early on we knew we wanted to make a character sprite that fit into that background while also helping to visualize the themes of the story. The biggest challenge was figuring out whether or not the character walking on a loop would be considered a single asset for the jam itself. After checking out some previously featured projects, we decided a single loop on a single character image that is rigged with bones would still be within the spirit of the jam. 

Luckily, Court had some prior experience with this technique outside of Godot’s game engine, so she understood the basics necessary to have something like this function. A few Youtube tutorials later and Godot’s process seemed similar enough with a couple of caveats: the engine needs polygons, even for a 2D character, and tying the bones to those polygons is similar to a 3D process. All we needed at that point was the character itself.

We took inspiration from various military uniforms, specifically for engineers or deckhands. An incredibly helpful resource for this ended up being usww2uniforms.com since there were extremely accurate images divided up by years.

A collage of different uniforms  AI-generated content may be incorrect.A collage of different uniforms  AI-generated content may be incorrect.

With that, we had our inspiration for our faceless nobody soldier. Court painted up a very rough version of him, something that would be fairly accurate to the final silhouette and shapes. She then broke the body into four main pieces by having them on separate layers in the art program: head/torso/foreground leg, foreground arm, and background leg. 

A screenshot of a video game  AI-generated content may be incorrect.

These pieces would then need to be separated on a texture sheet or sprite sheet which could be imported directly into Godot as a UV map. Polygons could then be drawn and assigned over this. Since the first attempt on this may very well work out well and get to move into the polish stages, Court made things about as clean as she could while still learning how to use Godot’s functions. This made it extremely easy later when it came time to fully render the character and finalize colors to match the background environment. All we had to do was import the new image and replace it anywhere it was linked to polygons. 

One of the takeaways from this process is that for certain pieces, it can be easier if they are separate to avoid strange or unnatural deformities (for example, the hands vs sleeves and the shoes vs pants). Because the process functions similarly to 3D processes with polygons, having a background knowledge in topology or following good topology practices will likely give a better result as well as having more polygons in areas that will do the most deforming to best keep their shape. Finding out that we could see how changing the weights painted across the polygons in real time by posing a limb was also extremely helpful during the animation process. 

A screenshot of a video game  AI-generated content may be incorrect.  A screenshot of a video game  AI-generated content may be incorrect.  A screenshot of a video game  AI-generated content may be incorrect.A cartoon of a person in a suit  AI-generated content may be incorrect.  A person in a garment  AI-generated content may be incorrect.

The animation process in Godot felt standard compared to other basic puppet style animation workflows in other programs. It was challenging that the default for the animation node is that it isn’t set to automatically lock onto frames, so the first pass ended up with some sloppy copy and pasting keyframes – something that came back to bite Court while trying to finalize the animation. In many cases, it turned out that pasted keyframes did not overwrite existing keyframes in the same space but often were overlaid on the old keyframes, causing weird hitches in certain parts of the animation. Once we discovered this, corrections were much more logical.

In the end, the character art and the animation turned out close to how we imagined it would be from the start, and the learning process, with all its hoops and kinks, made for an interesting problem-solving challenge. While puppet animation takes more time to set up initially, it can be a huge time and file size saver, especially over larger games. 

The UI

Very early on in the project, we knew that we wanted to center the UI around technology of the period, specifically typewriters and communications equipment.

A collage of several black radio devices  AI-generated content may be incorrect.

Since we were using the Dialogic plugin, we didn’t have to do much with the dialogue UI other than change some of the defaults like the box text color, text color, font, label visibility, size, and position to better mesh with our typewriter aesthetic.

A screenshot of a video game  AI-generated content may be incorrect.

Oldestcharm provided the font - Sense 360 – for all the text elements in the game. 

A screenshot of a video game  AI-generated content may be incorrect.

One thing that was important to get working properly was the layers of the UI to ensure that different elements, like the credit scroll and text of the game were sandwiched between the back and front sections of the typewriter. We accomplished this by taking the typewriter asset and splitting into a front part and a back part and then fiddling around with the layer and z-axis settings in the engine until we got the result we wanted while retaining the function of the in-game menu.

A screenshot of a video game  AI-generated content may be incorrect.

It was important to figure out how to set up the parallax ahead of time so we could make sure our background artist could create the assets at the appropriate size for the effects we wanted.

The options menu went through a lot of changes as we removed features, reorganized them, and replaced the default style settings with more custom UI assets.

A screenshot of a computer  AI-generated content may be incorrect.A screenshot of a computer  AI-generated content may be incorrect.

The music

The music for TOIL came together quickly. We shared inspiration tracks and not 30 minutes later Jesse had already had a practice track for us to listen to. 

Inspiration tracks

Purgatory’s Wail, as the track would eventually be named, was used to get a sense of the vibes of the game and was a placeholder for some of the prototyping of what would become the final game. Since Purgatory’s Wail was created before the jam officially started, we could not include it in the game initially, but it did give the rest of the team great inspiration to work around in the meantime. 

Early version of Purgatory’s Wail - https://www.youtube.com/watch?v=tAWJNq9CrYE 

When the jam officially started, Jesse started composing Toll of Limbo, the game’s official track. 

“TOIL was my first time composing for a visual novel, and the second time I've composed music for a game. The team requested music in the style of Darren Korb, so I tuned my acoustic guitar to DADGAD to record the foundational chord progressions. I really enjoyed trying to capture this setting with sound! Mixing is always a challenge for me, so making the song sound as lo-fi as possible without sacrificing the low end was one of my goals. I learned a lot about using ambient tracks with this song, which is something I hope to carry with me into future projects. I would gladly work with this team again; I just hope that my frequent iterations of the song weren't too annoying! All-in-all, I hope that I succeeded in creating a track that resonates with everyone who plays this game. I'm proud of the song (Toll of Limbo), as it manages to be dynamic without losing its eerie core.” - Jesse “Saint Coelacanth” Gelina

In our post-jam update, we decided to add Purgatory’s Wail into the game as a bonus track since it was very much beloved by the team and was an important part in helping set the tone for the writing and background art. In the current version of the game, you can toggle between the two tracks in the options menu.

Bonus kalimba discussion: 

A screenshot of a black screen  AI-generated content may be incorrect.

The voice acting

We knew we wanted to try adding voice acting to this game due to its size. Our previous projects haven’t had voice acting since we lacked experience with casting and handling voice files. This jam was a good opportunity to try and add managing voice acting in a project to our skillset. 

We reached out to our good friend Julienne Guilas who we knew already had voice acting experience for games and other media and had access to high quality recording resources on his end. Julienne provided us with multiple takes, including experimenting with a transatlantic accent. We had to slow down the cadence of the line reads slightly, and he adjusted accordingly. 

Overall, Julienne’s experience made it easy to add voice acting to the game, especially with how he named all the voice files. 

A screenshot of a computer screen  AI-generated content may be incorrect.

The coding

Lynn was the programmer for this project, having done a little coding in Renpy in our 2024 Spooktober project and having taken some online lessons on python beforehand. Lynn had played around with Godot casually prior, but this would be the first complete project she would be the only programmer on. 

Godot

We used Godot 4.1.1(https://godotengine.org/) for this project. Our previous visual novel had been done in Renpy, but we knew that Godot was a more versatile and powerful engine. Even though there would not be as much visual novel specific code already pre-built for us to use, we were eager to test out this engine in this game jam to see if it would work for future, more complex projects. 

Godot’s node-based structure made it easy to implement and adjust the parallax background. That was the first thing we got working using placeholder images. There were some minor adjustments needed when we finally added our final assets, including adjusting the speed of the wharf layer to mesh with the pace of the animated character as they walk.

Coding the parallax to start and stop took some trial and error but was overall not too difficult to implement using a signal from Dialogic. 

The animation players came in handy for making the UI, credit scroll, and character all function. We ended up slowing down the animation walk by half to make the parallax scroll not feel so fast. 

This project required the use of button groups and to be more conscious of what layer each visual element was on. We had to shuffle some of the layers around to make sure that each menu did not interfere with each other, so the UI elements were moved about the screen quite a few times until we finally got it working the way it needed to. 

Godot’s documentation is very helpful, and many functions in the engine itself link back to the documentation making it very accessible. Godot also has been around long enough to have a fair number of tutorials, though some specific issues can require some trial and error to implement in the way you want. The biggest hassle of using Godot is that the engine has changed a lot in a very short amount of time, so some solutions you find online may be outdated even if they were posted only a year ago. 

There are some ways that the game was built that are not as clean as they could be. In a game this scale, the code messiness isn’t too noticeable in the final product from a player’s perspective, but moving forward with bigger projects will require better implementation of scenes and organization of code functions. 

Dialogic plugin

We used the Dialogic plugin (https://github.com/dialogic-godot) for Godot which saved us a lot of time in creating a dialogue system, however it did present its own challenges. 

Dialogic provides a visual editor to code, however its built-in customization is limited. If you want full control over the look and behavior of Dialogic, you still need to dive into the code scripts themselves and hunt down where things are. 

We had to do this multiple times to get the typing sounds to continue working even with the voice lines audio playing over it. 

We were unsuccessful in parsing through the code to change the text speed with a user-controlled slider, so we cut that functionality from our menu in the end. While not ideal, given we had narration and sound effects attached to the default speed of the text, we felt this would be a minor inconvenience, if even noticeable at all. 

We also had a hard time getting the history screen to function as we needed within the short time, we had to figure it out, so we cut that feature as well. Given the length and linear structure of the story, we felt this cut would not significantly impact the player experience compared to a longer narrative with branching dialogue paths. 

We relied heavily on Dialogic’s signals to trigger transitions, start animations, and pop the posture menu up.

There are many features of the Dialogic plugin we have yet to explore, but so far it is a very useful tool for games with dialogue systems. The documentation can be a bit confusing to navigate and there are not many tutorials online for the more technical and specific issues we ran into, but the more familiar you are with Godot engine and gdscript overall, the easier it would be to troubleshoot issues within Dialogic or customize it to meet your needs. 

Future of TOIL

One of the goals of a game jam is to finish a project within the duration of the event, and we succeeded in that venture. TOIL as it exists currently is complete and we will not be pursuing any further development on it, but we will carry forward the lessons we have learned from the project to improve our future works. 

We are thrilled that TOIL is being used as a learning tool, not just for our own team members, but also as part of the Buggy Totem collection produced and distributed by Ron Jones of the Indie Cluster to inspire up-and-coming indie developers.

We cannot thank the team for dedicating their time and talents to this project, and we also want to extend thanks to our fantastic play testers and everyone who downloaded the game and everyone who (hopefully) will download the game in the future.

Visit TOIL’s homepage - https://www.borderbreakers.art/toil

Visit our website for more of our projects – https://borderbreakers.art/

Follow us on:

Join our community discord - https://discord.gg/XqJMP2de94

This document and its contents are for educational and personal use only.

© Border Breakers LLC, 2025

Get Toil

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.