admoore.xyz

GMTK Game Jam 2025 Retrospective

Tags: game_dev

Another year, another game jam. Back in late July, my team and I got together for another marathon of development, where we put together a brand new game from scratch, including all of the programming, design, art, music, and sound effects, in just a few days. At this point, it’s a tradition for us to get together and do these jams, and you can see how our work has improved over the last few years.

But before I get into any of the details, you should try playing the game for yourself.

Background 🔗

The first few iterations of the jam had a time limit of 48 hours over a weekend, but this year added on two whole days at the beginning. We received the theme at noon on Wednesday, and had until noon on Sunday to complete the game. Like I said last year, I quite like the expanded schedule, it gave us time to sleep on our ideas (literally), and honestly made me more productive.

However, unlike last year, we didn’t have any dedicated artists working on our game. The team was just Terry, Kyle, and myself, so we had to scope out the number of assets accordingly. This limited us to a more simple visual style, but I don’t think this actually harmed our game that much.

Before we even received the theme, we had a quick chat about what we wanted to accomplish. We came up with two major goals we wanted to stick to, after learning our lessons from past jams.

Goal #1: Make The Connection to the Theme Obvious 🔗

In both our previous entries, we got off the rails, moving our concept further away from the theme in a game of telephone. By the time we realized just how far we strayed from the given theme, it was too late to fix our mistakes. We even got one comment for last year’s entry that basically called us out on it. For this year’s game, we wanted to make sure that we stayed on-topic, and that the connection to the theme was self-evident.

Goal #2: Finish the Core Early, Save the Juice for Afterwards 🔗

One of the other things we executed poorly on last year was our core gameplay loop. We were so caught up in trying to utilize our artists fully that we neglected to polish the core gameplay loop: the platforming and level design. We left the levels until the last day, which really killed us, since the levels were meant to be part of the theme. This year we wanted to make sure we had our core elements in place before we started trying to make them pretty.

Wednesday: Brainstorming 🔗

The theme for this year was “Loop”. With our goals, we started thinking about what the different kinds of “loop” are. We had some abstract interpretations, like time loops and gameplay loops, that we quickly decided were going to be hard to execute effectively in the short time frame. Finally, one of us said something to the effect of “What about using the mouse to draw a physical loop on the screen?”

We all agreed that drawing a loop as a core concept would be both fairly easy to implement and also very obviously connected to the theme, so we decided to go with that. After talking about it more, we hit on the fact that drawing a loop on the screen is exactly what the lasso select tool does in most image editors. What if our loop was an actual lasso?

A few minutes of brainstorming later and we came up with a complete idea. Set in the old west, the player controls a sheriff, who has to use his lasso, i.e. the player’s mouse, to round up enemies and toss them at rocks and cacti to kill them. We all agreed this was a concept that was simple enough that we could finish it in our limited time, and had potential for expansion later on if we needed it.

Thursday: Building Blocks 🔗

When we met on Thursday, we each had a clear goal in mind: Terry was going to work on the drawing mechanic, Kyle was handling enemy spawning, and I was doing some initial sprite work. I’m actually somewhat proud of the sprites I made, considering my lack of artistic talent. Feast your eyes on the world’s simplest walk cycles!

By the end of the day, we had a controllable player, infinitely spawning enemies, and a circle drawing mechanic. As a part of that, Terry implemented a check to see just how circular the drawn loop is, and that will come into play later.

Friday Morning: A Complete Prototype 🔗

Friday was a productive day for me, since I took the day off from work. I think this is best summed up in this screenshot of our chat history:

This involved a lot of work, which is why that message is at 4:00 in the afternoon. The first thing I had to do was to figure out when a loop was completed. We had discussed how this would work a little earlier on, but we never really nailed it down. Here’s what I came up with:

  1. Limit the loops drawn by the player to a certain maximum distance. That way, a player couldn’t just circle the entire screen every time there was an enemy.

  2. When the player releases the mouse, check the last drawn point to see if it’s close to another point earlier on the loop. If it is, count the loop as successful. This is to prevent people from just drawing a straight line.

  3. If the player draws a loop that intersects itself, immediately stop drawing and count that as the finished loop. This vastly simplifies the logic in checking enemy positions.

  4. If three of the four corners of an enemy are within the shape formed by the drawn loop, count that enemy as captured. The slightly relaxed constraint makes it feel more fair to the player.

Once you captured an enemy, you would have to shoot it at an obstacle before you could capture more. So on the next click after capturing an enemy, we would shoot a projectile in that direction. I added a simple score system, that incremented whenever you killed an enemy, and that was that.

Friday Afternoon: The Key Feature 🔗

When I met with the team after they finished work, we were all very excited. We had never had a game reach this level of completeness with so much time left to go. So we started working on making the game look and feel better. Terry did some magic with visual effects for the lasso, Kyle added a set number of lives and a game over screen, and I worked on the procedural generation of terrain. That sounds fancy, but really all it was was spawning a bunch of rocks and cacti in randomly, and then deleting the ones that were on top of each other.

However, I did hit on what ended up being the final piece of the fun puzzle. You see, the game in its current state wasn’t very engaging, you just did the same thing over and over again, with no changes. Lasso up a bandit, shoot him at a cactus. Lasso up another bandit, shoot him at a rock. And so on, for eternity. I thought it would be cool to add some spice, and particularly I wanted to do something with the circularity calculator Terry had implemented.

So I came up with a new idea: if the player drew the lasso in close to a perfect circle, the projectiles would turn the enemies they hit into other projectiles, like a game of bowling. This ended up not being so difficult to implement, and once it was in, the game got way more engaging. I updated the scoring system to incentivize higher chains, as well.

Saturday: The Juice 🔗

When we met on Saturday, we had a whole day entirely dedicated to presentation, or as we called it, juice. Things like sound effects, score labels, a how-to-play screen, and so forth aren’t exactly essential to a game, but they make it feel way more polished. Each little feature only took an hour or so for each person, but stack that over a 12 hour day, and you end up with a lot of things being done. I mean, just look at the number of pull requests in our github repo on that day:

As we got further in, and started playtesting, we had to consciously tell ourselves to stop to avoid getting sucked in: that’s how good the gameplay felt to us. We shared our high scores in the chat, and our best was just over 10 million. See if you can beat that!

In the end, we were all very satisfied with what we were able to accomplish. We all agreed this was one of the best games we ever made for a jam, and that we finally hit our stride when it comes to scoping things our correctly. But enough about what we thought, how did we do in the jam itself?

The Results 🔗

Well, with over 9600 total submission this year, this is how we shook out:

This scoring this year is slightly different from the previous years. The overall rating category is gone, and the Style category was split up into Audio, Artwork and Narrative. Let’s take our scores one by one:

Enjoyment, Top 8%: This is our highest ever score for enjoyment, and I think it’s very clear why. Because we got our core concept down early we had lots of time to tweak it to make it more enjoyable

Creativity, Top 20%: We were happy with this result. Our game is a very straightforward interpretation of the theme, and it’s pretty simple, but it’s executed well.

Narrative, Top 25%: This surprised us. We didn’t know about the updated categories and put zero effort into the narrative. If we had known, it’s possible we could have added some exposition or something, but in an arcade style game there’s not much you can do with a story.

Audio, Top 33%: I’m a bit bummed about this one. I think Terry did a fantastic job with the SFX, and my backing track isn’t half bad either, if I do say so myself.

Artwork, Top 50%: Hey, for a team with no dedicated artists, I’ll take this one. I just barely managed to squeak into the top half, and that’s good enough for me.

Conclusion 🔗

On Sunday, after submitting, we all went out for some Japanese barbecue, which was great. I think this year’s entry was truly worth celebrating. If all of our future ones manage to live up to this standard, I’ll be happy.

If you played the game, what were your thoughts? Were you able to beat Terry’s high score of 10 million? I’d be interested to know.

Until next time, thank you all for reading.