
HELLO
Welcome to the first post-mortem for the Titanfist effort in gm(48) for April 18th — 20th. As usual we had a pretty great time putting together a game for the jam, and walked away with a lot more knowledge of how GameMaker works and ideas for how to better manage our time. One of these days we’ll actually fit in a bug fixing schedule…
I should also note that we were unaware of the rule that you could use code and engines that you had worked on before the gm(48) as long as you listed them. It’s clearly stated in the rules, so obviously it’s our fault for not reading them properly. But we were under the impression you needed to write every bit of code fresh for the jam. So maybe take that into consideration when you rate our game? We’d appreciate it. :)
THE GAME
Our team made Gravitas, vote for it here!
Play the latest version of the game (updated with fixes and extra content) here!
And you can also listen to the excellent soundtrack:
Without further ado, kick back and read how our gm(48) went from my perspective!
AIMS
For this gm(48) we had a few aims from our previous efforts that we wanted to hit:
- Keep it simple: our entry to the ‘You are the enemy’ game jam, Evil Fist, was full of a lot of pretty complicated systems. Far more so than a lot of people probably realised! Reinventing pokemon isn’t easy. For this gamejam, we wanted to have a base mechanic that was simple and easy to iterate on.
- Easy Content generation potential: one thing we wanted to have in spades was content, and from the beginning we wanted to make it so that any team member could sit down and code up some levels quickly and easily. As you’ll read, we kind of hit this one, but then failed to follow through.
- Sound effects: Our last effort had practically zero sound, so this time we wanted to have a bangin’ soundtrack and crunchy fx. For that reason (and because he has wonderful hair*) we brought on a new team member to be the sound guy. And he delivered!
- More coherent art assets: This was a personal goal of mine, as I had a feeling I was going to be most suited to dealing with art assets due to some time commitments meaning I wasn’t going to really be able to be around when the engine was being developed. So I really wanted to nail my art assets and develop a constant, coherent theme. Did I nail it? Let me know!
DAY 1
Morning: Breakfast of champions
As is tradition, we travelled to the fabled Northbridge McDonalds to eat a hearty breakfast of bacon, sort-of eggs, and the most perfectly average coffee known to man. Armed with enough paper to start a reasonable bonfire, we waited patiently with full and slightly upset stomachs for the theme to be announced. Five minutes until the reveal. Four, three, two, one…zero! The theme for the 14th gm(48) is…”Top Down ____”? Groans from around the table. This was not one of the themes that we had wanted to go through. The argument could be made that it should’ve been tossed out as not actually being a theme as much as it’s a prescriptive design suggestion.

But you’ve got to work with what you have, and the people had voted. We immediately began to think of ways to avoid having to look at a character’s head and shoulders, starting with James’ suggesting we should make a game taking ‘top down’ literally…by making a game about yanking people’s tops (that’s shirts for non-Aus people) down and off. Unfortunately that one contravened the gm(48) rules about explicit content. James kept riffing off the idea of not doing an actual top-down perspective and soon came up with another, not completely terrible idea: a game where you fall from the top of the screen to the bottom. A top-down scroller. We started imagining the kind of gameplay you could have from it, and pretty soon we had all gotten that excited glow which comes from talking about grandiose ideas that you have yet to try and implement. With that glow of optimism still firmly on our cheeks (or perhaps the McDonald’s blocking our hearts) we set off to make the best top-down scroller we could.
Mid-morning to late afternoon: Speed bumps
We started work while co-located at Zac’s place, which actually turned out to be the only time when we’d all be in the same place at the same time. If there was one defining characteristic of this gm(48) for me, it was the fact that I couldn’t get into a full rhythm until the final evening. Unfortunately, being old, I had a lot of commitments that weekend, including a 30th birthday party, a 1st birthday party for a friend’s daughter, and a soccer game. They were all spread out like speed bumps to prevent me from fully getting in the zone until we only had 10 hours left. Super frustrating for me and, no doubt**, the others.

Anyway, enough about me. That morning we put together a list of art influences, things we wanted to do and could do, and felt out our role in the team. James got stuck in to coding the engine and…well, he basically didn’t stop doing that until the end of the jam. The term ‘workhorse’ comes to mind. So while I can’t really describe his actions much, I can say that his system was really intuitive, very clean, and included checking the box for one of our aims of making content generation of levels easy to distribute. Everyone could jump in from the second day and program up a level if they felt like it. I think he’s writing a post as well, so I’ll leave it to him to explain in a bit more detail, but it was really freakin’ cool to jump in at different points and see it come together.
Anyway, still at Zac’s place, Zac got started defining the collision and death conditions, as well as putting together some sprites that we could use to play with level design as it was being put together. Tim was away from his main audio desktop but started working on sketching out some basic sound exploration, as well as putting up some images for inspiration. I began working on animating some explosions, but soon stopped as I realised that a particle system would probably be faster. Pixel explosions are some of the hardest things to get exactly right, and when they don’t look perfect, they look terrible. So I abandoned that just in time for Tim and I to need to leave to head to our friend’s daughter’s 1st birthday party.
Afternoon and evening: Rollerama
After Tim and I returned from our friend’s daughter’s 1st birthday (including an amazing patchwork sponge cake made by another friend of ours that gave me a sugar high for several hours) we found that James and Zac had gotten the engine into a workable state. I began filling in some of the animations and character sprites, as well as sketching out a list of assets that would make the game feel varied enough to warrant repeated play-throughs. Tim, now seated at his audio-making battle station, immediately jumped into drumming up some awesome beats for the title screen and main game, and also the sound effects. In the few hours I had before I had to leave (again, I know, I’m a pretty shitty team member) I managed to sprite up some of the wall variations and import them into GM so that we could see what the art style we had decided on would look like when rushing past the player. For me it was important to have enough variation in the wall sprites that the player wouldn’t be able to notice that they were repeating that often. I shouldn’t have worried since our end product ended up being frantic enough that most people aren’t going to be looking at walls. But hey, every little bit of juice helps.

With the walls complete and rushing by the player, I headed out to my friends’ 30th birthday party, where I would stay sober the entire night so that I could do more work when I got back, and still play soccer the following day‡. When we eventually got back from the party I kept working on the sprites and helped Tim out with a few particle systems issues, introducing him to the excellent particle design tool: Particle Designer! Not going to lie, he was kind of upset that he’d spent a lot of time working out how to manually put together a particle system only to find out there’s a program that can do it for you interactively. He may or may not have almost started crying. We finished up a couple more assets and then hit the hay to get an early start the next morning.

DAY 2
Morning and afternoon: Sprites and soccer
On the dawn of the second day I decided to take stock of the sprites I had done:
- Player sprite including spin animation;
- 5 level themes consisting of between 5 and 8 wall sprites each, with narrowing and widening connecting sprites.
And the sprites I still had to do:
- Title screen;
- Middle obstacle sprites and background sprites (Tim eventually did the backgrounds while I was fiddling with particles);
- Enemy sprites and bullet sprites for any enemies and the player.

That doesn’t look like that much, but at the end of the jam I had made over 125 sprites total. That’s a lot of sprites for someone who doesn’t really identify as an artist! The morning basically went towards making a dent in that number, before I was forced (once again) to leave the jam and go play soccer for a couple of hours. If we had lost the game I’d have been seriously salty, but despite a few tense moments we defeated our opponents 5-3 and I could return to the game jam victorious. From around that time onwards I was working alternately between art (and importing art, which was seriously beginning to be a pain in the arse) and level design with James.
Evening and morning: Last-minute mindf*ckery
As mentioned earlier, level design consisted of writing lines of letters and numbers that had been mapped to wall and obstacle objects. Unfortunately we ended up creating all the levels essentially as the last thing before the game shipped which was around 4:00 am, the morning before a work day. Picture us trying to write these lines of ascii, where there were five themes’ worth of wall objects, each with with different legends due to me not having sprited the same number of wall sprites. Rather than being able to say that, say, the number ‘1’ always represented the left-hand wall, it was sometimes randomly the letter ‘q’, or ‘5’. I felt really bad for not having the foresight to have made a common number of sprites across the themes. And it was a bit of a mind f*ck at the worst possible time. But you live and learn!
Close to the submission time we were trying to get an end state into the game where the player would essentially loop back to the start of the game, but with an indication that you had beaten it. Unfortunately when we tried to put this into the end condition we ended up complicating it to the point where random crashes were happening. By this stage it was around 5:00 am, so we all desperately needed some sleep. Despite it not being ideal, the decision was made to cut it and let the players play essentially forever if they wanted to (or could). Last-minute changes to collision were made, the executable was compiled, and Gravitas was uploaded to the gm48. Big sighs all around, and time for bed.
LESSONS
There were a few lessons that we learned during this gm(48):
- Assign roles early: We decided relatively early that James would be coding the engine, Zac would be handling modular bits of coding, Tim would be doing sound, and I would be main artist. This helped us to be able to focus on our areas and not run around trying to do some of everything and overlap.
- Generate levels early: We left our level generation a little bit late, which meant we couldn’t really do much in the way of iteration. If your game relies on making levels,maybe place a priority on that.
- Juice counts for a lot: Our base game mechanic is very simple, but one of our aims was to juice the hell out of this entry, and I think that does a lot to make it a lot more enjoyable than it would be without it. Out of all our achievements, I think the way it looks and feels is probably what I feel most proud about.
- Leave time for testing: Even though James is an epic coder and managed to put everything together such that there weren’t that many bugs, we still found a few situations after the submissions where players could reach an unsatisfactory game state. If we’d had a bit of time planned for testing, we might have been able to fix those up.
WRAP-UP
Thanks for reading, please feel free to comment with feedback on Gravitas, we’re always trying to learn and improve with each game we release.
—
*It’s glorious.
**No really, there’s no doubt. They gave me shit for my absences for the entirety of the jam.
‡Playing a full game of soccer in the harsh Australian sun when you have a hangover is not advised.