Ludum Dare 44 Retrospective

Jam Entry: https://ldjam.com/events/ludum-dare/44/wu-wei
HTML5 Playable Link: https://gamejolt.com/games/wu_wei/411422

Pre-theme Prep

I had been toying with the idea of taking on a level based platformer with a twist. Because of that I had gone and played a few platformer classics; Braid, Castlevania, Thomas is Alone, Super Meat Boy. Luckily the timing of playing these games lined up with a Humble Bundle for 8bit sprites and my personal desire to play with them and make some basic demos with the asset pack; I did this on stream and was chatting with folks about modern GM platform engines. Turned out that folks on Twitch were incredibly helpful and linked me to some real cool projects that I picked apart (Sonic clone was the main inspiration since I know historically it had a lot of great physic options)
About a month before the jam I had started to think about Unity / the possibility of doing something really uncomfortable in GM and trying to do a simple 3D game (2.5D dungeon crawler). Because of that thought I had started looking into level design history + tried a few level creations in Unity. This was an undeniably painful experience from the start but I definitely got better at turning a hand drawn mock into a playable level.. something that seemed impossible before and probably gave me the confidence to go the direction I went.

Theme Ideation

Your life is currency. My first thought is that it’s vague enough to allow for whatever we want to make. I’d decided previously that making something super “on theme” would not be my goal, I’d much rather complete something than try and fail to deliver something too ambitious in the 72 hour window. Rather than fight that fight I wanted to deliver a game that would be challenging for me personally to make. The game would be a platformer where your decisions to kill / spare the NPCs in the world would have consequences to your own life / progression in the game. The unique mechanic I wanted to try was to create a typical mobile game level system (selecting 1-N levels after unlocking) but introduce the element of decision permanence; if you kill a rat early on and return with a new ability he will be dead. The idea was to allow the casual to run through the game and the folks who were paying attention would enjoy new challenges and hidden areas.

Start Building the Engine

After getting the theme and deciding that I was going to run with a platformer I went ahead and started hammering out the basic mechanics. My philosophy for getting an engine going is; I want to spend as little time testing and the majority hammering out new mechanics to make the game fun. Because of that I just create a simple test room for my new obj_player and start to get the basics going; animation, states, input handling, physics, collisions.
quick testing room (at end of jam)
During this process we get animation + input handling first and of course have to deal with physics / interactions with world objects. Doing basic fall handling + collision checking is a fun adventure (drawing collision boxes is something I almost always do to ensure things are making sense); its really handy to add a conditional to your step function so you can increment step by step to ensure collisions are handled exactly like you want. In GM I’ll add a macro DRAW_COLLISIONS + this simple draw event (modifying for different objects as needed)
if DRAW_COLLISIONS {
    draw_set_alpha(0.3);
    draw_set_color(c_red);
    draw_rectangle(bbox_left,bbox_top,bbox_right,bbox_bottom,false);
    draw_set_alpha(1);
}
After getting floors + walls implemented I got spikes + other deal obstacles implemented. It was easy enough to throw together a test level to confirm we had a base that we could make a game around.. And then bedtime felt like it was well deserved

Day 2: Starting to Level Build

Since we end up writing code really late at night I like to revisit where things left off and do a bit of code cleanup + project organization. Nothing too crazy but unfortunately I had overlooked a few minor things that would result in a delay to get to actual level building / fun design. Normally this wouldn’t be a big deal but I had wanted to go to a BBQ and had to bail on it to because implementation couldn’t be done fast enough to make me comfortable with leaving level design to drunk self later in the afternoon. That decision was probably the reason I was able to bust out the 20 levels that I had set off to accomplish. Once the engine was “stable” level building took much much longer than expected + required me to learn a tool on the fly. Fortunately, Tiled is an incredibly nice program and was a breeze to learn on the fly. I think I had 5 levels completed with the basic run jump mechanics before deciding to create the menu system + the general GUI items. Since this is such an easy process I typically feel like its a nice win to get going into the final days of the compo.
coming together..

Mid Jam Disaster Recovery

Not necessarily the end of the world but something that I did not consider / think fully about.. Going from 8bit scale to 1920×1080 doesn’t seem like a big deal but the hardware needs to make everything happen seamlessly and it turns out scaling tilemaps is less than ideal and a known problem. GM:S 2 promises that this isnt an issue… although I tried to import my project and was still seeing the exact same tile breakage issue I was seeing in 1.4.X. In the article linked above there is a solve that involves making a new tilesheet that has bleedover on each tile to make sure scaling does not create a white/black spacing line. While there is a mention of how you’d go about doing that there wasn’t a “just use this script” type solution. Instead I found a link to a really handy program in the GM Forums. The program Tileset Champion does exactly what the blog post mentions; “Tileset Champion allows you to generate buffered tilesets from your existing tilesets”. While we weren’t able to just generate a new tilesheet and use that within the existing rooms. We gladly repainted all the rooms in Tiled and manually reimported the tile data into GML (recorded 2 vim macros; (1) pull from <tiles> section from exported room.gmx file and (2) replace <tiles> section in room GM generated). This allows us to keep all the object definitions that we had in the room and just have the tiles change.

Wrap Up

The final day was just a grind of levels and play testing. I had spent at least an hour the night before writing up what I wanted each level to accomplish / how I wanted to lay out the 20 levels with the mechanics that I had to play with. Because of that pen and paper work it removed a lot of the design decision making from the process and I could just focus on making levels that were playable and accomplished the goal of introducing / complicating a mechanic. I added music as the last touch and considered digging through the sound lib to find perfect jump / movement sounds but decided against it (mistake for my jam entry). At the end of the jam its hard to think rationally and I typically just want to hit submit and walk away from a computer for a long while. I submitted Wu-Wei and am proud of the base product and excited to push it forward into a complete title.
This entry was posted in Development, GameMaker, Ludum Dare, Retrospective. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *