The Tale of Witchnook: Postmortem

So making this was pretty epic! I thought I'd write this to share with you some of how this came about.

Background

This is my 3rd LD. In LD38, I built "Conquer Earth" and came 154th. I wrote that whole thing with JQuery, and spent a long time drawing and scanning art. Art was never my strong point. People liked the music I made for it though and I do have a lot of design ideas. In LD40 I made "Contamination" with a team of randoms from around the world. Most of them didn't contribute much and it was hard keeping everyone on the same page. I basically did most of the programming - overall the game placed 881st. So I figured I'd go back to working on my own this time and seeing what I can do with all this LD experience behind me. Conquer Earth had a spinning WebGL globe I hacked together from a simple WebGL tutorial I read during that jam, but other than that I'd never worked with it before or since.

How it happened

When the theme was released I had the problem of too many ideas. I didn't know what I should do with everything for about 2 hours. Eventually I decided I wanted to make a builder, with the general goal being to build a magic school using cards. I thought an isometric-type display would be cool for that. I figured, given that the game would need to display a lot of tiles (I'd learnt about lagging in LD40, as that had a ton of objects at any given time the game did pathfinding for), I'd have to either use WebGL or an engine that did it for me. Because I'm old-school I went down the route of programming it from scratch.

This turned out to be a bad idea. After some hours I managed to get tiles to display. Some time later I managed to get the tiles to space my textures out across several tiles by passing in data to the shader. That alone took about 3 hours. I made some super quick ground textures and a mask texture to handle terrain transitions. I also added a water shader I came up with, and before I knew it I was already 9 hours into the competition.

I figured the next logical step would be to add basic environment art, so I drew a bunch of trees in Photoshop. To my surprise they didn't suck. I went to bed, and the next day I drew more trees. But then I noticed a problem - with all this rendering my game was running slow as hell and I hadn't even started coding gameplay yet. I'd never worked with framebuffers in my life before, so I pretty much spent most of the next day figuring that out. Even the code that's in there now is a huge hack using vaguely made-up values that seem to work because I was under so much pressure to get it to render properly, at an acceptable framerate. In an effort to prove to myself I'd made progress, I put together some UI art and recorded a few sound effects. Again, didn't suck as much as my art usually does. Still, at the end of this I was about half-way into the jam and still had zero gameplay. I spent the rest of the day making sprites for a witch, figuring out a particle effect for user interaction (and making THAT render quickly) and also adding terraforming tools.

Heading towards the last day I was totally convinced I couldn't make it. I mean, come on. I had maybe an acceptable isometric engine but certainly not a game. At some point I made a post here asking for opinions. The majority said I should try to give making my game a go anyway. OK, I'm impressionable. Now I had to write a building system, which meant converting between map coordinates and mouse coordinates ... and that's how I spent my whole night, figuring that out. Working furiously I drew three buildings, and a bunny rabbit. There was now no time for cards or anything fancy like that ... this was now an action-building game. I don't know if I've ever programmed gameplay faster. In particular, the AI for the movement of the witch character drew a lot on my experience writing AI for LD38. I spent a good hour adding a shadow to the witch's broomstick-flying sprite because the visual effect was weird without it.

When I was about 6 hours out from the deadline, I had the sudden realization that my game lacked music. I composed four original pieces for the jam, and modified another track I'd written earlier, sticking to simple riffs inspired by decades of experience playing RTS games and vaguely witch-like instrumentation. I'm good with music but under pressure you're never sure if what you're writing is total garbage - some of the pieces I didn't even listen to start-to-finish before the submission deadline as I was in such a rush. Miraculously they all turned out mostly OK. With 30 minutes to go, I rushed in the code to make the bunnies appear/disappear and wrote instructions on how to play. I finished writing pretty much exactly when submission hour began.

With the jam over I collapsed into a sleep, hoping for few serious bugs. As it turned out, my final submission was completely unplayable on Firefox (fixed now) and the rabbit spawning code could probably have been refined a lot. The game could also be faster and have more content. But I MADE IT. I wrote a fricken' isometric engine in raw WebGL, made a game, composed music and sound, drew all the art etc. It's about twice as much code as what I made for LD38 (if you include the shader code etc), 3 times the art and a longer soundtrack. In my view that's pretty awesome for me to see how much I've improved over a year - and it hasn't been an easy year for me either.

Screenshot

So you know what I'm talking about... promo5.jpg

What went well

  • I think I'm getting better with my art. I mean, I still suck, but I'm getting better.
  • I'm getting darn good at speed-composing music.
  • For the most part the engine I wrote works well.
  • I'm very comfortable with my development setup, all the problems / challenges I faced were just my own learning.
  • In the end I made the design elements and genre conventions of action and city building work together well.

Things I learnt

  • I learnt how to work with WebGL from close to zero.
  • I learnt how to make an isometric game engine.
  • I learnt a ton of shader techniques and how to use framebuffers efficiently (I think XD).
  • I learnt how to draw character sprites in Photoshop.
  • I learnt how to make isometric building graphics and draw trees better.

What I need to improve on

  • Although I've improved on this a lot, I still need to get better with scoping and time management. Time is so critical and I mean, I literally spent more than half of the jam just on rendering the background! Come on!
  • After LD38 I figured I'd add more narrative elements into my games to make them easier to learn and more fun to play. Although I called the game a "tale" there wasn't really much of a tale to it. I did do this a bit with LD40 as I scripted an interactive tutorial, but I want to do more with it.
  • As reviewers have pointed out, there's bugs. I didn't think working in a team worked for me as well (I literally did like 5 times better on my own lol) but playtesting is the hardest thing to do on your own when you're trying to approach the game as a novice player, but also you have so many other things still to do! So maybe that's something for me to think about.
  • I need to become more confident with my art! My art was ok, I need to worry less.
  • I want to refine the engine so it's usable for future web-based 2D games I write. It's definitely something that could still go faster especially if I ever did another isometric game, even with all the hacks I'm already using.

Next steps

I'm working on a post-jam version. I don't have tons of time but people have given me really useful feedback and I'm motivated to make the most of it. I'll make another post about it when it comes out. Let me know if you want me to tag you so you can play it!

Actually I think there should be a second competition, after the Ludum Dare, for people who have fixed up their games in response to feedback from the LD! That would rock lol.