Behind the Scenes of Bad Ref (GMTK 2023)

Drew Conley

Drew Conley

Posted on November 1st, 2023

We built a game in a single weekend! While it’s been a few months since we created this project, I wanted to take you on a journey of the development of our GMTK Game Jam submission: Bad Ref.

Bad Ref

Bad Ref is all about being a corrupt soccer referee. You do whatever it takes to help the Blue team to win. You can play the game in your Desktop browser here:

Matt, Glenn, and I built Bad Ref for the GMTK 2023 Game Jam. It’s an annual jam that runs every year in July. In short, we had one weekend to come up with a game idea and build a prototype from scratch.

I’m not big on hackathon-type things, but I’ve always been curious to try this particular jam. One weekend is so tight on time, yet semi-reasonable to fit in to real life.

We established three major guardrails as a team:

  • Let’s make a game we were excited about playing. (Make this worth doing.)
  • Let’s actually finish and submit something to the jam. (Control our scope.)
  • Let’s not destroy ourselves in the process. (No pressure to stay up all night and crunch.)

We agreed ahead of time to build the game with Excalibur JS. Matt and I have both used it a bit and felt like we could quickly spin something up. Excalibur ships with a ton of great features to get you working on a game quickly. (Especially things like Physics, which is a lot to roll on your own.)

This will be important later, but we took the time to figure out our “value delivery” pipeline before the jam started. I learned this from working at agency… too often, we get to the end of building something and have to scramble to get it “live” on production later. The agency always set up a value delivery system first, so there is a clear path to pushing the final work to production. I didn’t want to waste any time during the jam hours to thinking about how to get the production build right, etc, so we practiced pushing up a quick “Hello World” build to the game’s Itch page before the jam started.

Day 1 - Friday

On the first day of the jam, the theme was announced as “Roles Reversed”. It’s a broad idea on purpose, but was backed up with examples of Pong, but you are the ball! Or a sidescrolling platformer, but you are the ground elements instead of the jumping character.

We hopped into a Discord call and started throwing ideas on a Figma board. Most of our early ideas were other takes on the “Genre A, but you are B”. Like: Call of Duty, but you are the scoreboard. Or… The Sims, but you are the toilet. In hindsight, why on earth didn’t we pursue that one?

Anyway, we are on this call for like 12 hours straight. At some point we had gone down the path of a sports game, but you are the referee. Perhaps a corrupt one that is incentive to tamper with the outcome of the match. We talked about being able to mess with the players, or straight up stop the flow of play whenever you wanted.

We talked for a long time about the character’s motivation… like checks and balances to keep you from freely doing whatever you wanted to the players with no consequences. We circled around those ideas for a couple of hours, including building up a reputation system where the crowd would boo you off the field if you made too many “bad calls”. It got too complicated, though, and it was hard to validate up front if it was even going to be fun to play.

We went a hard other direction after that, like more ways you could mess with the players. Maybe more kinds of items you could use? Bear traps, fishing rods, an ice cream truck that would pull up and distract the goalies.

Before you know it, it’s 2 AM and we haven’t really started anything yet. We agreed to get some sleep, start again early the next morning.

Day 2: Saturday

We signed on early the next day and start chipping away at our individual roles.

Matt started putting broad strokes in the code. He added moving colored boxes for the soccer players, basic hero controls, and AI for getting the different positions to patrol their zones (Impressive as heck to get this all in on one morning, by the way). The ball would bounce around as players kicked it, too, which was pretty neat.

I was the main artist for this project, so I started pixeling some soccer players in Aseprite. I made one base character, then swapped out the head for a couple different variations. I also recolored everybody in a few different jersey options. I don’t have many hot takes in the soccer space except this one: Mega Man Soccer (SNES) is the best soccer game of all time, so I referenced those characters for rough sizes and general silliness.

We needed a field, ball, and goal nets too. I spent a stupid amount of time on the soccer ball rolling animation - I’d never tried anything like that before, so I had to reference games like Kirby pinball to wrap my head around the rolling motion.

Matt set up a really nice flow with Excalibur’s support for Aseprite files. I could export animation data and images from Aseprite (.json and .png), simply drop them in the project and they were ready to use.

At some point I shifted over to work on sound effects. I’ve always found sound effects tedious to work on, but gosh they add a lot of life. I found some free base samples of whistles, soccer kicks, and crowd cheers. I modified those quite a bit in Audacity to SNES-ify them as best I could. It’s a tough call to burn too much time on, but those little moves tend to add up in the final game.

By late afternoon, we had a fairly convincing soccer scene prototype. The movement, sounds, and graphics were gelling together pretty well. The players (and ref) could patrol and kick the ball around, but the game didn’t have a lot of purpose. It was a good sign that it was fun to just bop around in, but we needed some kind of winning/losing loop to give the player something to work on.

Matt wired up the collision zones within the nets for the ball, I threw some big scoreboard numbers up on the top left and top right of the screen to keep track of a score. We leveraged Excalibur’s event system to power the score counters upticking when the ball entered the net.

Somehow it’s 2 AM again on Saturday night (Sunday morning, I guess). We’ve come a long way, but the game is not quite anything submittable. We still needed a lot of polish and tuning to make it feel player-ready.

Day 3: Sunday

We get another handful of hours of sleep, then hop on early again for the final push. I think I signed on around 6 AM… the deadline was 12 noon in my timezone.

I shifted into music-creation mode, trying to quickly create a few tracks with the little time we had left. We were trying to inject a lot of humor in the game, so I started with something light and fun to emphasize this isn’t a super serious gaming experience. I freaked out halfway through that track, thinking I wasn’t getting anywhere, and switched over to a more “SNES action sports” drum and bassline. I didn’t know which one was the right call, so we used both. One for the menu, one for the soccer gameplay. I called the tracks “Overtime 1” and “Overtime 2” as an homage to being totally out of time to create anything better.

Matt was implementing the last bits of final polish we had time for. We even got the Ice Cream truck feature in!

Bad Ref Ice Cream Truck

Glenn was play testing everything, calling out bugs and tweaks we should consider. He also helped us prioritize everything we had to get in - it’s easy to lose track of the bigger picture when you are in the trudges of implementing details.

Eventually the deadline had arrived. We threw some intro text on the screen and pushed up one last build to our Itch page. Thankfully, that value delivery system was set up and ready to go so we could work up until the last second.

Bad Ref Players


We finished the weekend true to our guardrails!

  • ✅ Let’s make a game we were excited about playing. (We are proud of the result.)

  • ✅ Let’s actually finish and submit something to the jam. (We cut features appropriately to finish on time.)

  • ✅ Let’s not destroy ourselves in the process. (We generally did not overwork in an unhealthy way.)

Despite the third guardrail, we were totally exhausted for a week after the jam. On top of our respective usual work weeks, marathoning over the weekend pushed us a little bit over the edge. Thankfully our families were very supportive the entire time.

Here’s a video with some more concepts and details of our GMTK 2023 Game Jam weekend.

We’ll see how life goes, but hopefully we’ll be able to participate again next year!


Back to all Articles