Museum City Boat – Post Mortem

Posted by (twitter: @geckojsc)
September 11th, 2015 7:40 pm

Hi! It’s slightly late but I figured I’d finish up the post mortem for my entry, Museum City Boat.

gameplay gif
It’s a small, charming side-scroller where you get to go on a rampage as a monster, smash some lamps, flip some cars and generally do monster things.

The main tools used were Lua/LOVE, GraphicsGale, Fireworks, Renoise, and a Zoom H1 Handy Recorder.

Shout outs to the friendly participants on the #love channel (irc.oftc.net) who were really supportive and helpful as usual :)

 

What went well

Pre-compo planning

ideas
It was my 5th time entering, and I’ve noticed that the theme always catches me by surprise. This time, I wanted to be ready! So during the voting, I tried to make notes on possible game ideas for every single theme. Because thinking up game ideas is much easier when you are not dealing with jam stress.

This took up a lot of time and creative thinking, and I gave up on it half way through Round 3. It still paid off though: the theme ‘You Are The Monster’ did not give me any good ideas when it was announced, so I simply looked back at my notes and chose my favourite idea from there.

Style and Gameplay

This is possibly the first time I tried to make a game that evokes simple, classic arcade vibes rather than focusing on ambience and emotion. Sometimes I feel like there is a fine line between ‘silly’ and ‘amateur’. I wanted to make something cute, fun and silly, but still high quality. It was only in the later stages of development that I realised what I was making might achieve those goals and not be garbage.

Friends and participants commented on the smooth camera movement, simple mouse controls, cute graphics and satisfying sound effects, so I feel like I succeeded here!

Another interesting thing I managed was to add replay value through score categories (number of structures destroyed, number of times seen, etc.) and just writing some challenges in the game’s description. Like ‘hey, can you beat the game without being seen by cameras or people?’ – If the game was bigger or I had more time, this kind of thing would be put in an achievements system of some kind, but people will make their own fun if you tell them how!

Coding

The last time I made a game in Lua, I was using cmd and a general text editor, which meant I was missing out on some important workflow aspects such as quick-launch, error checking, rename variables etc. This time I used ZeroBrane Studio, which is a truly excellent Lua IDE that comes with love2d support built in. It made my life so much easier!

My code turned out clean, for a jam at least. I spent very little time tracking down bugs, even though I had plenty of globals that the other classes in the game depended on. I think this is because I stuck to some simple rules: initialise globals early, put them where they make sense (e.g. main or assets), be aware that their value might not be what you expect… and also because I was able to assume I didn’t need to do any dangerous things like removing the player from the world (which could be disastrous because so many things access the player directly for AI or collision checking).

I had to throw in some rendering hacks to make sure things like water and game-over text displayed correctly (just stick them in the global drawing function), but this was OK because it was added quite late in development, so didn’t get a chance to turn into spaghetti code.

Music and Audio

Electronic music is a passion of mine, so this part is always fun and usually turns out well! However, I spent the majority of my time drawing and coding, so audio was quite a rushed thing in the end.

I spent about 4 hours on the last day of the Jam to write a cheery 80s/90s track. I have a Korg M1 plugin which is perfect for this kind of stuff, combined with some great virtual analogue synths like FXPansion Strobe. The main challenge I had to overcome was my tendency to write really emotional chords and melodies which don’t fit the vibe I was going for. It took a couple of attempts but eventually I came up with something that fit just right.

My two main inspirations here were Mitch Murder and Bacalao. I was listening to them almost all weekend, their music is so great!

The sound effects were pretty much done in the last 2 hours! Most of them came from the kitchen. I was literally standing there at 1AM with a mic, knocking glasses together and making growling noises. They were all trimmed, pitched and normalised in Renoise and Audacity.

Some sounds were more creative, for example the explosion was made by taking the muffled ‘thud’ of a cupboard closing, then pitching it down further, adding white noise and running it through a distortion plugin. The water hiss and camera beeps were generated with SunVox.

 

What could have gone better

Design Process, Confidence

'design doc'
The picture above was the closest thing I had to a ‘design doc’. Not really a huge problem, because I never churn out pages for any of my small projects, I’m kinda used to improvising as I go along.

The main issue was settling on a graphical style. I never made a game with vector or high-res graphics before, so I figured given that I have Fireworks (hybrid vector/bitmap editing) and there are easy skeletal animation tools out there such as Spriter – how hard could it be to make a game using those? Or perhaps I could draw the monster with code, since the love2d splashes seem to have these delicious vector graphics? Though, how would I relate the vector graphics to the physics engine?

So I spent all afternoon contemplating and trying different ways to draw my monster and animate him, and the results were awful! At this point I just felt like giving up, or maybe switching to a different system altogether like PICO-8. It wasn’t until Saturday night that I went back to GraphicsGale, drew some pixels and actually got the monster running around the screen. I eventually realised that if I wanted to make a game I was happy with, I’d have to enter the Jam to make up for all that lost time.

One good decision I made was to use Arne’s 16-colour Palette. If I’d had more skill and time to put towards pixel-art, I could have chosen a more detailed style and really made the palette shine, but anyway it served me really well! In my previous entry I spent far too much time worrying about clashing colours, but this time I could forget all that and get on with pixelling. I settled on a clean flat style with 1px outlines and no shading.

Level Creation

When I was getting started, I drew the whole level as a huge image in Fireworks, and hard-coded the player and other entity spawns. I was planning on switching to a proper editor like Tiled, but I didn’t feel like setting up and traversing all that exported data, so it never really happened.

I can’t say whether or not I lost much time to this, but it was certainly inconvenient sometimes, and the fact that I chose to work this way makes my game much less scalable in its current state.

What next?

I’d love to take this game further and turn it into a deeper, longer and more interesting adventure (with boss battles!). Right now I’m experimenting with development for the Gameboy Advance, so maybe I’ll ditch the rigid body physics and port the game to GBA? It will make it a far bigger technical challenge but it’s a really rewarding platform to develop for.

At the same time I have some commitment to older projects that I want to get finished, but I’m worried that if I work on those then I will lose my motivation to work on this game? So in the long term I’m not quite sure what will happen.

As long as I’m doing GBA development I’d like to try blogging about it, because it’s an interesting field but most of the reading material is from 2007 and earlier. Maybe it would help people to have some modern articles on the subject from someone who is still learning.

This has become quite a wall of text, so if you’ve made it this far, thanks for reading, and best of luck to all those awaiting LD33 results!

Until next time,

Gecko


Leave a Reply

You must be logged in to post a comment.

[cache: storing page]