I just finished my 6th Ludum Dare! Crazy how time flies. This time last year, I had finished LD on Sunday night and rushed to propose my thesis the next morning. Seems like so long ago. Anyways…
I made a 2D platformer this time (surprise, surprise). The core mechanic involves shooting a cannon that can be used to push yourself in mid-jump. Mostly it involves platforming and shooting some bad guys. Pretty standard, but I had a lot of fun making it, and it still manages to feel relatively unique.
The theme was “Entire Game on One Screen”. I'll be the first to admit that my game's use of the theme is on the weak side. The game essentially takes place inside a theater. Each time you walk to the right or left of the stage, the curtains close and then are reopened. This reveals a “scene change”. When I started out, I wanted to be able to go above the stage, explore the catwalk and everything, even go behind the stage and whatnot. I ended up not really having time to do all of that, so a narrowing of scope had to occur.
Day 1
The competition started at 9:00pm Friday night.
I figured out within an hour what kind of game I was going to make. I knew I wanted to do this theater thing with a pirate setting, and that the curtain close transition was going to be really important. I decided to do a cloth sim in Maya. The sim worked pretty well. Unfortunately I didn't know that importing that mesh to Unity was going to prove next to impossible in the timeframe that I had. So about 2 hours into it, I had to make a pretty big compromise. Instead of curtains opening and closing as a mesh in Unity, I ended up rendering out a video of them moving instead, and put that video as a moving texture on a plane in front of the camera.
I made a quick camera transition script that paused time while the camera moves and the video plays, and then resumes the game when the video is over.
I also did some additional programming while the curtain video was being processed (it takes quite a while). Mostly, getting the movement on the character right. Also, I worked on the cannonball shooting with the mouse. By the time I had all of this figured out, it was 4am on Saturday. Time for bed.
Day 2
Woke up at about 11am on Saturday. This is the last time I'd sleep til the compo was over.
I was refreshed and ready, so the first thing I decided to do was get my character animations finished. I opted for a character design very similar to a previous game that I had made.
I wanted more than just running and jumping, so I decided to have ropes in the game. (At this point in time, I hadn't considered cannon-jumping would be in the game). Luckily the 2D controller that I use has rope functionality built in, so it was just some quick tweaks to make it work (controller made by jnamobile, it's the best 2D controller for Unity hands down).
I moved on to the final aspect of the character's movement – the cannonball shooting. I wanted to make the player REALLY feel the full force of the cannon shooting, so I decided to do 2 things:
- Have the cannon make a puff of smoke
- Have the cannon push the player back a little
A really cool side effect of the second point was that in midair, you could actually push yourself up for more jump height, or over for a further jump. I decided after playing around that it was really fun to do. Immediately that became something that I focused on implementing. It just feels so fun! It's the feature that I'm most happy with overall else for this game.
Ok. The character was more or less finished. Time to make the level assets. A flat floor isn't going to be any fun, so we need platforms. I decided on:
- Crate: A normal box to walk on
- Breakable crate: A box that could be broken with an explosive cannonball
- Palm Tree: A “floating platform” that could be stood on form the top, but passed through from the bottom or sides
- Raft: A moving platform that goes left/right and up/down. This is actually in the game, but never made it into the level.
- Rope: Something to climb/swing on.
- Door: A door that would open if you bring enough keys.
- Key: To open the door, obviously
Here is the planning sheet that I made while deciding on all the level assets / enemies / bosses. Yeah, I know I can't draw.
And here is everything that made it into the game on one screen:
Getting the keys and doors to work took longer than I thought it might, because I had to program an inventory system. Anywhere from 1-9 keys is supported for the doors.
After the level stuff is done, I decided to finish the different cannonball types that the player will use. First up is the bomb.
Lastly I made the grapeshot. It was going to fire several cannonballs in a spread, but the code I had in place only supported firing speed and knockback force as customizable settings, and I didn't know if I wanted to spend the time getting it to work right. So I opted for a more rapid-fire type of cannon.
Pretty sure it's around midnight or so at this point. I've gotten all art assets done for the game except enemies. Time to do that I guess. If you look at my little sketch sheet above, you'll notice that there's a shark. I ended up cutting that for time's sake. Water was initially going to be lethal, and the shark would jump between platforms as you crossed the water. Still, having 2 ghost pirates and a parrot was variety enough for the game length I think.
The way I decided to work was to finish all the art for 1 enemy, and then do the programming for it. That way, even if I just finish 1 enemy AI for whatever reason, I haven't wasted any time drawing things that didn't make it into the game. Luckily, all this AI is pretty straightforward. I think it took about 1-2 hours to do an enemy (art+programming).
The first ghost pirate will slash at you with his sword:
The second ghost pirate throws bottles of rum:
At the rate I'm going, I decided to drop the shark and just call it done after the parrot. I immediately realized it's a terrible decision to color this bird with 3 different colors. I wonder if 2 frames of animation is enough…
Nope, it's really not. I begrudgingly draw 2 more frames. It's like 5 am at this point, and I'm really tired.
Even though he was a pain to draw, the parrot was still my favorite enemy.
Day 3
Ok, so now it's like 7-8am-ish on Sunday. I'll consider this the start of Day 3. The enemies are all finished. I'm pretty much finished. All I have left to do is:
- 2 Bosses (art and AI)
- Make level
- Music
- Sound effects
- Bug fixing
- Play testing
Ah... That's not looking good. I only have about 12 hours left, and I'm so tired that I'm not feeling too well. I take a quick shower and grab some food. I decided that I'd just do 1 boss and then make the level.
It's actually quite a lot of animation to do to shade all of those tentacles. The line work is terrible. And I'm pretty unhappy with the dithering on his head. But I'm in a rush at this point, so there's no time to be picky. I think he took about 1 to 1.5 hours to draw, and about 2 hours to program the AI.
At this point It was maybe noon or so. Which meant I had about 9 hours to finish the game completely, and I had no level, music, or sound. I was in a big hurry, so I stopped taking videos.
I finished making a level in a couple of hours and then spent probably 3 or 4 hours doing rather boring stuff. UI, cannonball ammo switching, hints for the player, spawning/despawning rooms, fixing the camera bugs. All that good stuff.
I used abundant-music.com to make the music. I took the first song it randomly generated and threw it into my game. Is it the best song? No, but it's arguably better than having no song at all. It's passable at least.
I spend a little time making sounds with bfxr and incorporating them into my game. Not everything needs a sound, but the things that the player spends 99% of their in-game time doing really needs sounds. Jumping, damage, shooting, collecting items. These all require sound. I do the bare minimum and call it good enough.
9pm comes. I finish packaging up my game and submit it. I forgot to think of a name. Joe suggests naming it after a famous play. I pick “Much Ado About Pirates” because I can't think of anything punnier than that. Breathe a huge sigh of relief when it's over and swear that I'm never, ever, ever doing this again like I always do. Proceed to sleep for over 13 hours. Friends and loved ones wonder if I'm alive.
Final thoughts
What went well
- Character movement. I specifically wanted to make a cool movement scheme in LD29. For this one, it just happened. I'm thinking that might be one of my strong points, so I'll probably focus on this harder for games to come.
- Relatively good pixel art aesthetic. The more I do pixel art the better I get at keeping everything more or less consistent.
- Best enemies I've ever made. Making simple enemy behaviors AI for my last LD (and more recently for Postal Slime) has made me much quicker at it.
- Boss fight. I've said "I'm doing a boss fight!" in every game jam. Only once before have I truly accomplished that (LD28). This is the best boss I've made hands down.
What didn't go so well
- The 3D integration. By the time I realized it wouldn't work as well as I wanted it to, it was kinda too late to go change anything. I'll likely stick to simpler styles in the future. I was using a trial of Unity Pro and hadn't really played with the more advanced capabilities.
- Annoying camera. If anything's going to kill my game, it's this. Luckily you can turn it off in game. Sadly, turning it off completely removes the “Entire Game on One Screen” theme. And speaking of which…
- The theme integration. I always try my best to make the theme permeate every aspect of my game. Most notably, I want it to be present in the game mechanics. I found it very difficult to get inspired by the theme, but I suppose that's the way things go. I tried not to dwell on it too much and just make a good game in spite of that fact.