Pizza Jam Postmortem... in Space!

30 hours is not a lot of time to make a video game, let me tell you! Technically the 2019 Pizza Jam lasted two days, but sometimes you need some of those hours to do your actual job that gives you money, and sometimes you need some of those hours to do some sleep.

Skimming through the list of Shadow the Hedgehog sequence names was a wild ride, but the name "Funeral Procession in Space" stood out immediately, and after going through the whole list, it was the only one that spoke out to me, saying "you can make a slightly tasteless game about this maybe!" So I did.

A quick skim through what's commented out in the game's code will make it clear that there were some things I wanted to do in the allocated time that just didn't make it into the final cut. Fortunately, my biggest want for the game - Banjo-Kazooie-esque voice acting - did make it into the final cut, but not without great effort (more on that later!). 

Obviously more content is what I would add, if I could freeze time. The game was made to be fun, but first and foremost it was made to be funny, and the humor found in the space encounters and conversations in church, not in the gameplay itself. More branching paths, even more endings, and more wacky characters are definitely at the top of the list.

Gameplay-wise, programming a full-on SHMUP with no combat in 2 days definitely meant many sacrifices had to be made. One of my early goals was to have the screen constantly full of action - regardless of whether or not you were a part of it. This is a space battlefield, after all, so there should be ships, laser blasts, and explosions going on constantly around you! The original plan was that tons of ships would be flying around, both in the foreground and the background, shooting at each other, crashing into each other, maybe sometimes even shooting at you. But for the most part, the intention was just that you would just be a passerby in this big battle, trying to get by without disturbing anyone.

Another goal was for there to be escorts to help you along your way. Your space-hearse doesn't have any weapons on it, but I fiddled with the idea of having AI-controlled helpers flying around with you and protecting you. In the final product, this really only manifested in cutscenes and the last ten seconds of the game. But I gotta tell ya, if I could program dozens of different spaceship AIs in 30 hours, things would be different around here!

Back to the voice acting. Sometimes there are many ways to approach a problem. I started the problem from the Programmer Perspective™ with the plan of "make a few short sound clips, then pitch-shift them dynamically in the game." Do you know how easy it is to pitch-shift sound files in JavaScript? As a matter of fact, it isn't! After wasting at least an hour and a half diving into countless articles on AudioContexts and OscillatorNodes and several JavaScript sound libraries, I gave up on that approach.

Still in the Programmer Perspective, I then thought, "I can still program for this! The audio program I use lets me compose chains of actions for individual sound files! I'll just record a few short sound clips, then write a chain that pitch shifts the sound a few times and exports each sound into a new file!" Due to limitations of the chaining logic, this was easier said than done, and once I spent another hour or so finally getting that working, the end result was properly pitch-shifted sound files, with strange clipping and delays in them. These were also unusable.

"I could just pitch-shift each file by hand!" I thought, but the goal was to have around 9 different sound files, each one at 7 different pitches. Manually going through and modifying 63 different sound files would have taken forever, and I had already wasted two forevers on this! I put the voice-acting goal off to the side and resumed work on the actual game part of the game at this point, hoping I'd have time to revisit the voice clip challenge later in the day if I had time.

Fortunately, I did have time, and I was able to think from a Programming Is For Losers Anyway perspective on the third pass! One sound file with each individual sound bite in it, with gaps of silence between them. Manually pitch-shifted and exported into 7 big files. I hard-coded how long each individual sound bite was and at what time it started in the big track. When the game wants to play sound byte X at pitch Y, it just plays allY.ogg starting at startX and plays for lengthX seconds! Not as badass as dynamically pitch-shifted sound files, but I actually got it working. And at the end of the day, how many people are going to read the game's source code? Like maybe one. And how many people are going to play the game itself? Like maybe five.

The lessons learned?

  • If there are 10 ways to do a thing, and one of them is fast and easy and another one is new and complicated and maybe kind of cool, go for the first one unless you think there's a damn good reason to do the hard one. Especially if you have a close deadline.
  • You can make a video game out of anything.
  • Decide on what you need your game to be, and prioritize that over everything else. If you decide your game is funny, and you have 10 minutes to either implement another joke or a new gameplay feature, add the joke. If your game is scary, and you have time to add either a new horror mechanic or add a new type of gun, add the horror mechanic.
  • Get good at evaluating how long implementing something will take. Try to be realistic. If you have 48 hours to make a game and think that creating complex enemy AI will take 24 hours, ask yourself if you can do everything else the game needs in the other 24 hours. If not, reconsider adding that complex enemy AI.
  • Shadow the Hedgehog is not a very good game.

Leave a comment

Log in with to leave a comment.