Preamble:
So I had an entire post typed up and ready on how I’d been learning more Objective C and diving into the docs for Angband, but as things go, I’ve gotten side-tracked by yet another side project.
This new game that I started in December is actually finished, so I will be picking up my main roguelike project again soonish.
For the mean time, I’ve decided to write up sort of a hybrid postmortem on the completed project, the 2D platformer.
Anyway here’s what I’ve been working on…
The Gamejam Project:
As part of the yearly gamejam, Finally Finish Something (FFS jam), I wanted to use it as a way to complete one of the very first projects that I’d worked on circa 2008. However when I imported my old project in the latest editor version, I ran into a lot of errors and so I decided to basically start over from scratch but use a very similar engine.
Luckily the engine I had used was popular enough that it had been permutated by others and I found a version that worked on the modern editor version.
This gave me a great starting point, and I only had to fill in the blanks. However, I also ran into a snag with the assets I used, so I decided to use some freely available 1-bit sprites for the art, and SFXR for the sounds.
The gameplay loop
The main gameplay loop is a simple 2D platformer. Not really much more than a single 16x16 pixel character that can move around, jump, attack, and wall-grab. I decided against adding any other complex behaviors, but I regret not being able to work in some sort of combo attack to string together.
There’s an unused 3rd action hiding in the code that I was intending to be a dodge-roll or block/heal action, but again didn’t have time for it before the jam submission deadline. I’ll probably add this back in later.
The game framework
I’m using my old favorite, Game Maker with a heavily modified version of the Grandma Engine. However as I pointed out above, I upgraded to the latest version which required some re-learning since the docking windows and UI has changed a lot, along with some other specifics, collisions, surface drawing, audio, etc.
This might’ve been a mistake since I wanted to use a familiar engine and not waste too much time during the jam with learning the IDE and scripting language, so I’d say I was about 60% familiar with everything under the hood.
Weirdly there was no credit given in the project code to Grandma Engine, but very specifically the collision scripts and naming conventions look oddly familiar. So given the benefit of the doubt, maybe this engine was heavily influenced by or learned from the same code that Grandma was based on?
The art
To allow myself to focus mainly on the gameplay loop and writing the narrative, I chose to use a pre-made 1-bit asset set by Kenney. It’s missing a few things, but has 90% of what I need for this prototype-like jam game, so it’ll do! I’ve always wanted to try out something made by Kenney since it seems ubiquitous with game jams and quick prototypes at this point in time.
I ended up spending a few hours making some minor changes to it, and adding a couple tiles and sprites for mapping (longer/wider tiles for specific objects) and enemies with more animation frames, but otherwise it was a great base to use for the minimalist style I was going for.
The narrative
The narrative is told partially with text and partially with the environment. It’s weighted a little heavier toward the latter which is something I’ve wanted to explore in modern game design for a while, and never really had a good chance to make during a game jam.
A lot of my narratives are taken from my dreams and subconscious thoughts, and also from things that have just floating floating around in my mind. Taking some of those thoughts and fleshing them out and putting them into game form sometimes does not have the 100% representation that I had hoped, but I feel like this one managed to portray most of the look and feel that I was going for.
I’d be very interested to know what others think about the atmosphere in this sense, as I won’t spoil the exact concepts that I was hoping to work into the ludo-narrative.
Code and Content Cuts
There were quite a few things that didn’t make the cut due to the strict deadline, which always happens and are never easy to make. I did feel like during this jam (compared to other jams past) I did improve in this area and at making those decisions.
Some of the cuts made were:
- player actions (2x jump and others)
- inventory screen and other key items
- a larger narrative told through scattered notes (sort of like Bioshock audio journals)
- advanced boss AI and a 2nd transformation with another attack pattern
- a secret room that triggers a hidden ending
- screen transition effects
- animated/fancy title screen
- and more!
The endings
[Spoilers Start here- skip to section 6.]
I recommend skipping this section if you want to try out the game first.
What I really wanted to focus on in this jam was a ludo-narrative centered around a pseudo-time loop and multiple endings.
I realized early on that any more than 3 endings in a gamejam game might be a bit too ambitious, which is why I chose to have no less than 8 endings!
Many of these are just controlled by a simple combination of 2 booleans in the code, but what I ended up finding out through this process was that I had to carefully nest these bools in certain objects because I was running into an issue where checking one bool in 1 object was overriding the ending I wanted to trigger with another bool in another object.
There might’ve been an easier way to centralize the checks, but I couldn’t find one. Maybe this’ll come to me at some other time, but I think this was the most crucial piece of info that I took away from this jam.
[End of Spoilers]
Conclusion
Overall I learned a bit more about 2D platformers via this game jam. I didn’t have to wrestle with physics as much as I did with my original project, so I was able to focus more on the Juice and the narrative and adding more features.
Adding the right amount of screenshake intensity as to not disorient the player too much is fine-tuning that’s absolutely necessary in a game.
Also even if the game has very simple 2D platformer controls (literally left, right, jump, attack), there’s no harm in adding a super-short tutorial or sandbox level where the player can familiarize themselves with the controls to have a safe screen where they can experiment with physics before jumping into the main gameplay loop.
There were a few hiccups while finishing the game and I didn’t get everything I wanted implemented. The boss AI attack sequence was especially hard for me to figure out, so going forward I’ll probably focus more on this area in the future.
Displaying text on the screen in a nice readable format is also absolutely necessary. There are so many short games or jam games out there that have sub-par text legibility, and mine was no exception.
I also feel more confident using the latest Gamemaker Studio v2 IDE, which was a huge blind spot for me since the last version I’d used was GM v8 (pre-Studio) and didn’t have nearly as many quality of life features and was largely irrelevant in the current Unity-Unreal-Godot environment of current-day IDEs.
As a solo dev, having a solid understanding of all these fields and features is crucial to completing games whether that’s a full game or a jam game. And I will definitely lean into this going forward. I might even go as far as to split up some of the elements I worked on into compartmentalized bits or libraries for ease of use on later projects.