Bad Janitor Development

November 9, 2025

Curious about how Bad Janitor was developed? Here’s some background on the main aspects of development, a quite thorough list of hardware and software used and coding tidbits.

Inspiration

There are three big sources of inspiration:

1. Klass of 99

A cool pixel art game where you play as a kid in school. You have to attend classes and do some hijinks while not getting caught. The characters and environment are really nicely done. Some of the game mechanics can occasionally be a bit obscure.

Check it out on itch.io!

2. The Sims

You know how when eventually you get bored of the game loop of trying to make things better for your sim? At that point most people I know started trying out how to make life for their sim as miserable as possible. So, why not try making a game where you just skip the nice part?

3. Real Life

I’ve lived in apartment buildings for almost all my life and have seen some sh… enanigans. I’ve never had a bad experience with janitors though – on the contrary! Some of the big corporations managing the buildings I lived in didn’t really seem to care what goes on in them and some aspects of the game takes inspiration from events I experienced.

Another, perhaps odd inspiration for the game was from the strange (and horrible) stories I learned about in the Stasi Museum Berlin. I won’t go into any grim details here, but these guys sure were some bad janitors of the state.

Pop Culture References

I tried to follow Tim Cain’s wisdom regarding cultural references:

Add the reference in such a way that if the person doesn’t get the reference, they don’t even notice that a reference was made so that way they don’t feel left out

Here are some franchises that are referenced that I think fans will recognise pretty easily:

  • Bob’s Burgers
  • Earthbound
  • Naked Lunch
  • Insane Clown Posse
  • It’s Always Sunny in Philadelphia
  • Resident Evil
  • Seinfeld

Happy reference hunting!

Software Development

Bad Janitor was developed on Unity 2022.3 with I2 Localization for localisation and Rewired for input management. My IDE of choice was Visual Studio Community 2022 and code was typed with a Logitech MX KEYS S, which is silent and feels good to type on.

I started the project by writing the data structures and serialization and helper methods for them. I then wrote some tests and had a watch folder that automatically compiled and ran them when modified.

After I was confident I had a pretty OK core for the data code I created a Unity project. I took some code, like a game state controller and input wrapper, from previous prototypes and started working on movement code. The game mechanics didn’t require physics, so all the character movement is based on a custom system that defines areas where the player and NPCs can move and how. The core of the movement system was very fast to get up and running, but later on had a few tricky edge cases that were not fun to solve.

Movement areas

Writing out the data structures early helped a lot with iterating inside Unity. I had a ScriptableObject with the game data that I could edit inside the editor, so I could tweak code and values, like the the game clock, and see how things work.

GameData ScriptableObject

After the core game was somewhat playable, I wrote a menu system so I could test the flow of game states (InitMain MenuNew Game, etc.). It worked out quite well, so I kept it and the final menus still use it.

Code Stats

------------------------------------------------------------------------
Language              files          blank        comment           code
------------------------------------------------------------------------
C#                      294           3944           1448          24234
------------------------------------------------------------------------

All of the code was typed by human hands. Also, some files are only for testing purposes and are not used for builds.

Build     commits
------------------
alpha        2620 
beta         1057
GM            626
------------------
           = 4303

Note: these numbers only include commits from the Unity project repo.

Audio

Sound Effects

Most of the sound effects came from Gamemaster Audio’s Pro Sound Collection. I recorded some clips myself, like the door knocking and microwave oven sound effects. For recording, I used an Audio-Technica AT2020 microphone hooked up to a Behringer XENYX 302USB. All of the audio editing was done with Audacity.

Music

All of the music was made with Logic Pro. I’m no pro when it comes to music, so there was a lot of learning going on while making the soundtrack. A couple of the songs use Apple loops, but most tunes were recorded with an M-Audio Keystation 49 MK3. All of the beats were made with Step Sequencer and Drum Machine Designer. I used Chord Trigger a lot to help with the melodies and some songs utilize Arpeggiator. For reverb, my go-to plug-in was Space Designer.

During development I listened to a lot of HOMESHAKE, The Soft Moon, Tom Waits and Connan Mockasin. I’m not sure if any influence from these artists can be heard from the soundtrack, but I did want a chill vibe for most of the songs and HOMESHAKE was a big inspiration in that aspect.

Graphics

All 3D models were created with MagicaVoxel and renders that use dithering were processed with didder. All of the models use the same (default) color palette and exist in a 40x40x40 voxel space.

Rat poison editing in MagicaVoxel

Pyxel Edit and GIMP were used for all pixel art and everything else was edited with Pixelmator Pro, except for the character portraits, which were commissioned from Setzeri. A huge amount of the pixel art was done by Mucho Pixels and almost everything else is based on their awesome BLUE series packs. Tiled was used to create mockups of what the game environments might look like.

Testing in Tiled

The city map was generated with Procedural City Generator and the colors were edited with Notepad++, because Inkscape just couldn’t handle a file that big gracefully.