| Tags: game development post-mortems

This last weekend I participated in Ludum Dare #36, my favourite game jam, in which I had 48h to make a game from scratch… solo!

This is the post-mortem for my entry, The Language of the Gods. You can play the game in the Ludum Dare website or at itch.io.

Screenshot of the game



I woke up at 7AM to see the jam's theme, "Ancient tech", and went outside for a long walk to feel refreshed and let my mind wander a bit. Then I headed to a café to have breakfast and do some brainstorming. I really love doing mind maps for jams, it really helps me in finding out ramifications of the theme.

Photo of mind map

And then I had an idea I really, really loved. It was a story-driven game with the plot involving an explorer in an deserted alien planet trying to figure out how to get back home and discover the secrets of the now long lost alien civilization. Topics would include Good & Evil, the nature of reality, personhood, etc.

And to deliver all of this, I envisioned a kind of atmospheric game, with lots of exploring, some puzzles and opportunities to chill out while you go unfolding the story.

Still at the café, I doodled some concept art:

Concept art

Problem with this idea? Way huge for the scope of a game jam. But I wanted to make something with this idea, so I considered two choices:

I was reluctant to opt for Twine because I had never used it before. So I chose to make a vignette as a proof of concept and see whether people would like that kind of game or not.

As you know from previous post-mortems, I like to spend the first day of Ludum Dare coding, and leave art for Sunday. However, when I opened Pyxel Edit to draw some placeholder art, I couldn't stop myself and I ended up drawing a pixel art version of the sketch I made at the café.

Pyxel Edit in action

For the curious, I used the Dawnbringer's 32 colour palette, that comes as a preset for Pyxel Edit –having a reduced colour palette helps me a lot in drawing pixel art. And then I found out this app could export a PNG with all the tiles (a tilesheet), as well as a tile map in JSON.

So, TL;DR: no placeholder art this time.

There was a problem, though: Pyxel Edit tile map's exported files were huge. Even after minifying, they were still heavy. So I added a task to my Gulpfile to manipulate this JSON and only include the information that I needed. The result? Going from more than 500KB to 8KB, something more reasonable for a map!

After lunch I resumed programming and had a bit of trouble trying to import the data. My first strategy was to mimic Tiled's file format, since Phaser could directly import that. However, the map was not being loaded properly, so I gave up and imported the data into a Phaser.Tilemap myself. Once I had the map rendering, I included the main character and some passing clouds as decoration.

Since story was important, I decided that the next thing I should do were to display text. I drew a tiny font, using PICO-8 font measurements (3x5 pixels per character). And then implemented rendering of text of up to three lines.

Now that I think of it, I did quite a lot of stuff on Saturday, but at that time I went to bed with the feeling that it was not much, since there were many more things I would have wanted to do.

Progress before bed time


I woke up on Sunday and did the same as the day before: going out for a walk to get fresh air and clear my mind.

I was worried about gameplay. "Will my game be fun if it's just an story?", "If so, should have just made a Twine game?", "Maybe I should make big levels and allow for exploration", "Maybe I could add some puzzles to it".

I started to code events –so I could implement a story– and refine the text display.

A more advanced display

After that, I needed to include some puzzles. I knew that in the grand scheme of the game the game's beginning mistery would have to do with music, so the simplest puzzle I could come with was Simon.

Once the mini-game was created, I implemented the artifacts that would launch the puzzle when being interacted with.

Artifact animation

And then this made the first playable version of the game! I uploaded it and added a message once the puzzle was solved asking for encouragement and feedback! I really needed some cheering up –and it worked, by the way!

First playable version

It was already the evening, and I still had a lot to do. It reminded me a lot of once of my previous Ludums, where I overscoped and I submitted a really rough entry. But somehow I managed to keep my cool and not panic much. It was obvious that I wouldn't have time to do a lot (or big) levels, so I decided to cut that part without too much drama from my part.

I went to draw some simple animations for the main character and got hooked into Pyxel Edit again, and ended up doing more frames that I wanted to!

Idle animation

Walking animation

Animations in game

It was getting late and I still hadn't a story in place, so I coded bits of the story in that single level. I made a mistake and I should have hardcoded the whole thing, but I wrote some kind of semi-generic system instead.

Lastly, I drew another level, this one featuring another type of object that was not an artifact: a crashed spaceship, that will add a bit of info to the story. This level also acts a bit like a tutorial, showing the player tooltips about how to move and how to interact with objects. This has been the first time I included an in-game tutorial in a Ludum Dare and I think it worked wonders: nobody asked me how to play the game.

Tutorial level

After that it was about 11PM and I still needed to compose some background music! The game already had some sound effects, so gameplay-wise it was OK, but music adds a lot to the atmosphere and mood and that was one of the aspects I wanted to try out and get feedback about!

I used Audiotool for music. I'm still not proficient with it, but I had learned enough so I could comfortable remix some samples and even play a melody with a custom-made sound from a synth.

After integrating the music into the game, I just needed to create a title screen and run a few walk-troughs to make sure everything was OK. I ended up submitting my entry at 1AM, despite I was aiming for midnight, as usual. However, it felt amazing to finish and have something playable!

Title screen

What went wrong

What went well



Audio and graphics: