GMTK Jam
Our First Game Jam as a Studio: GMTK Role Reversal
We recently participated in the GMTK Role Reversal game jam. The objective of the theme was to create games that bring players into roles that they normally would not play as. For example, instead of playing as the main spaceship in Galaga, you would control the fleet of ships. We had a feeling that a popular take on this prompt would be a twist on Vampire Survivors, where the player controls a horde of mobs in order to defeat the overpowerful main character, and a few games like this ended up making it into the top 100! We wanted to attempt something a little different, so we decided to hunker down and build Asphalt Ascendancy.
Asphalt Ascendancy:
Our vision for the next 48 hours was to build a game where the player takes on the role of the road, and has to build a path for the car to drive to get from point A to point B. The player would have a hand of road tiles to pick from, and a limited time to play the next road tile before the car runs out of road to drive on. The concept seemed simple enough with a good amount of depth of gameplay for a game jam. So we dove into development.
The Second Best Outcome:
We managed to get the second best outcome possible during a game jam: an incomplete game! When it comes to working under a tight time constraint, it doesn’t get much tighter than 48 hours to build a game from scratch, especially if life steps in the way and leaves you with only 28 hours. It was a great experience going into passion crunch mode, digging in and working non stop on a project for fun. We definitely learned a lot about our processes along the way!
A day and a half and 53 Commits:
Over the weekend of the game jam, the three of us managed 53 commits to our master branch of Asphalt Ascendancy, and it looked like things were going quite well. We managed to split up our work with Jessica building out the art and the look of the game, Brock working on level design and construction, while I took the wheel (or the road in this case), and worked on getting the road to drive the car. Walking through our commits, it’s a bit easier to see where things went right and others went slow.
The Fast and Easy:
I’ve always been amazed at Jessica’s ability to pump out high quality art, and this game jam was no exception. It seemed like as soon as Brock or I would finish describing a mechanic, we would turn around to our keyboards and Jessica would be sending over the first iteration of art. This made the dev process much more rewarding, since it’s satisfying to see things drawn on the screen as opposed to just passing unit tests. It was also surprising how two programmers working in parallel could... well... work in parallel. We would discuss what features we wanted to implement, enter focus mode for a bit, then push our changes and share. It was a nice change of pace from working on a solo project, because multiple parts of the game could be developed at once.
Having a group call open the whole time also went a long way. When working in crunch mode, being on a call together was just as good as being in the same room. If one of us got caught up on something, it was easy to just ask for help, a nudge in the right direction, or to quickly go over how to use each other's code.
The Slow:
As our first project working together from the start, there were a few stumbling blocks that would be smoothed over with a bit more time. The biggest stumbling block that can be a jam killer is getting stuck on one mechanic and not adapting and moving on. I fell victim to this with the driving logic, and it’s obvious looking back at the commit history. It was the first piece of the game that I started working on, and wasn’t finished until we only had about two hours left in the jam.
Roads: The Reversed Driver:
In Asphalt Ascendancy, roads were responsible for moving the car, and the mechanic seemed easy enough. Roads were simply a texture with a Path2D that the car would follow.
The issue arose when we allowed road tiles to be rotated. This was an issue because now the start of the Path2D could be flipped, and the direction had to be reversed.
With the Path2D, it was easy to tell if one road tile connected another. If the start or end points connected the start or end points of another block, then we knew that the roads were connected, and the direction of the road block could be determined. Rotations however, seemed to break this.
Test Driven Development:
Looking back on the issue, I’m not quite sure why this was such a difficult problem for me to solve. After loading up the project and writing one quick unit test where the rotated_scene is just a road rotated 90 degrees and positioned at (64, 64), everything worked out once I got the Path2D points in global space.
Points in Godot exist in two different coordinate systems, the local and global space. Local points are relative to the parent node, while global points are relative to the global coordinate system. Node2D’s in Godot have a great function “to_global(Vector2 local_point)” that takes a local point and returns that point in global space. I’d made an assumption that the points in the Path2D had the rotations applied to them, so I failed to account for their rotation in global space. One quick unit test against some known locations to confirm that I was getting the correct position of points would have led to less headaches and resulted in more time spent on other features. The lesson learned here is that when something stops working as expected, it’s a good idea to create quick unit tests to verify any assumptions that were made along the way.
Conclusion:
The GMTK game jam was a great experience despite not submitting the game. We’ve learned more about our processes as a studio, and we are continuing to grow our library of tools and our understanding of Godot and game development. We’re excited for the next game jam, because it’s nice to have some higher intensity projects and deadlines for fun to keep us on our toes. We will be posting more in the future about our game jams or interesting parts of our current projects!