I wrote a post-mortem for my game The Language of the Gods, and I’m publishing it here as well. I hope you like it, and please play my game and tell me what you think!
> Play The Language of the Gods <
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.
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:
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:
- Make a Twine game and focus on the story.
- Make a vignette that captures the atmosphere I wanted.
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é.
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 (3×5 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.
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.
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.
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!
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!
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.
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!
What went wrong
- I chose to do the maps (not the actual drawing of art, but the building of the levels) with Pyxel Edit, instead of Tiled. This caused a delay because I then needed to minify them and write custom import code for Phaser, instead of relying of Tiled, which is the preferred format for Phaser and just works out of the box.
- Overscope. I knew from the beginning that my game was too big and that I would have to settle for a tiny fraction of it, but I was having some bad feelings on Saturday night about me not having made enough progress (this is The Wall, and I have talked about it before).
- I was not strict in terms of meal times –I was so in the zone that I would forget to eat–, and it made my stomach quite upset.
- I ended the jam after midnight, and then I was so alert that I had a rough night afterwards. Other jams that I finished before midnight I was able to sleep as usual.
What went well
- I did not give up! And I think this is my best entry for a jam ever. Although I will always have a soft spot for Metal vs Hipsters, I think that this entry is more solid and polished.
- Pyxel Edit was easy to use and a bargain for its price and features. I will keep this app as my go-to pixel art software. Bye, bye, Asesprite and Pixen!
- I was able to manage overscope. I think the resulting game is extremely short, but it definitely can be considered a proof of concept. I think that the game captures the atmosphere that I had in my mind and the mood I wanted to convey.
- I got a lot of good feedback and encouragement on Twitter! This helped me to overcome The Wall on Saturday night and not give up.
- Phaser as a game framework/library.
- Atom with vim key bindings as text editor.
- My gamejam generator to create the initial project template and automation tasks.
- Gulp as a build/tasks system.
- Github and Git for version control and online backup.
Audio and graphics:
- Pyxel Edit for pixel art and level building.
- Bxfr to generate sound effects.
- Audiotool to arrange the background music.
- A sketchbook for brainstorming and concept art.
- Twitter to post WIP screenshots / GIF’s and get feedback.