On monsters and mayhem.
My second Ludum Dare! Done! (And you can play "It Came from Beneath the Surface of the Sea!" here.) Now for the best part, which is seeing all the great creations that come out of this nutty process.
Why do we torture ourselves like this for 48 hours? No pay? No glory? I think it's simple: love of games. And the fantastic feeling of participating in a pure celebratory orgy of imagination, talent, effort, and mutual support. The Ludum Dare community has not ceased to amaze me that senseless negativity is so universally shunned and all efforts are respected. This is the internet, after all! Again, I think only the love of all that is gaming can explain it.
On to my After Action Report.
Beneath the Surface
This LD's theme (as just stated) has already yielded some magnificent fruit – and I've only so far managed to rate 60 of the nearly 2500 games.
I came up with a number of ideas that I really wanted to build, so my difficulty this LD was picking only one. Doing something inside the human body – with an infection/virus or something Fantastic Voyage style was tempting. You can't not think of sand worms, of course. (And I'm glad to see others took those routes!) But I've always loved awful monster movies (thanks MST3k), so once I got the idea of awakening a monster from under the sea and letting it seek its vengeance upon a metropolis, I was hooked. The title came naturally given that heritage.
Idea selected, I moved on to sketches and feature design. My primary improvement this LD was choosing an almost-reasonable scope from the get-go. I stuck with a simple game with few art assets, and picked a style that would not over-tax my limited art abilitites.
Doing realistic destruction and chaos and monsters takes a lot of effort and skill, neither of which I had time for. Instead I aimed towards humor with an overly cute art style to match. Being a huge fan of the webcomic Hark! A Vagrant, Fat Pony popped into my head as great inspiration. Something about Fat Pony rampaging across a city leaving destruction in its wake makes me giggle.
See the resemblance? They're third cousins.
And to up the humor quotient, you'd get to find out all the horrible, deserves-to-be-destroyed things you were destroying along the way in little floaty action-arcade messages. (All tongue in cheek of course! If I ever need a lawyer this game is going to come back to haunt me.)
Stretching my legs a bit
The game itself turned out to be pretty simple. I'm happy with how the progression and in-game instructions turned out. Some features got cut, most notably the ability to topple buildings entirely, enemy tanks, and abilities like fire breath. But really the soul of the game is all there.
I did however reach two big personal achievements:
[Achievement Unlocked] Make a Game with an Animated Character [Achievement Unlocked] Make a Game with an AI-driven Character
This is where I spent the majority of my time. I knew the monster just wouldn't work unless I could make him walk and punch (or slap, if you prefer). Because I was just kind of eyeballing this, it took me forever, but using Inkscape and drawing with shapes made it possible. Here's the slapping animation:
Of course I should have moved more than just the arm, but I will take the easy cop-out and refer back to Exhibit A: Time Limits and Programmer-Art Skills.
Naturally I needed enemies that fought back and for that I needed a simple AI for the helicopters. My approach here was really quick-and-dirty but I was surprised at the generally satisfying results. The logic the choppers follow is this:
- Sleep until the player gets within 1000 pixels, then activate Chase mode.
- Attempt to maintain a horizontal distance of 300 pixels from the player – either to the left or to the right depending on which is closer at the moment. I say "attempt" because there are acceleration and max-speed restrictions involved.
- Every 3 seconds, pick a random Y coordinate between 200 and 600 and transition to that height over the next 3 seconds using a sinusoidal tweening function.
- Every 2.5 seconds, fire a shot at the current center of the player.
That's it! Despite the simplicity of the AI, the difference in behavior between helicopters stems mainly from their starting position. For example, a helicopter starting around the same height as the player would simply approach from the front. However a helicopter starting way up in the air would activate and then swoop down probably behind the player (unless they were going slow). This gives the impression of differentiation even when there is none.
This time around I spent far more time fiddling with things like positioning and hitboxes than I should have, and some last minute hacks were required because of that. Being just a bit out of practice, and/or not taking the time to get the hang of your framework ahead of time really costs you in these short sprints. That's all on me, though.
My other problem was feature ambition leading to unweildy code. There was a very significant moment about two hours from the deadline when I was trying to get the Zungo Corp headquarter buildings to render their flag tile instead of the default building tile. I wrote the basic building code assuming I would create a set of variant graphics for each tile which would be randomly selected when they were loaded. As you can see in the finished product, I never got around to creating variants, and I really, really should have realized there was no chance I would ever get around to it. That code ultimately stood in my way at a critical juncture. Working around its unnecessary complexity cost me time I couldn't afford. Stressed and despairing that I might have to rewrite an entire block of code I never should have written in the first place, my brain just shut down for several minutes. And there were still glaring gaps to fill like "audio" and "intro sequence".
Then the Ludum Dare Twitter account re-linked this motivational video and, as silly as it sounds, it actually cheered me up and restored my focus. (Really! The timing was uncanny.) Thinking clearly again I realized I should just hack around it and not worry about the time I had wasted – my Economics 101 professor would have deemed it a "sunk cost".
So that's how I was just minutes away from hitting the delete button on the whole project. Actually I don't think I would have gone that far, but the thought definitely flitted through my consciousness, giggling with demonic glee as it went.
Ultimately I finished up to the best of my ability and submitted. Now here we are in the voting process with time to pour over many of these exciting games! I am greatly looking forward to it and to hearing your feedback on my game. My "to do" list is growing rapidly, but please Tweet me or reply below if you'd like me to try your game. It'll be be my pleasure.