Thursday, August 28, 2014

Ludum dare 30: Post mortem


 Ludum dare 30 came and went faster than expected. Whereas previous jams I've entered have been high stress, fervent work filled events, I actually found myself having quite a bit of fun. My game, Gingerbread Odyssey, was a short hack & slash type platformer following the adventures of a lost gingerbread man.

The bad:
Code:
Time and time again I find myself not having enough experience to make the game genres I need to. Platformers seem to be no exception. I only learned the basics of platformer programming about a week before Ludum dare 30 started, so my code was unclear and hard to use. Also, it turns out, downright inefficient. My first solution to creating detectable platforms looked something like this:

 Note that each level of platform required me to define a collision entity. Looking back now, this seems like an amateur mistake... seeing as my code then had to look like this:

add(new Wall(1, 38, 4, 12));
add(new Wall(3, 36, 4, 14));
add(new Wall(4, 34, 4, 16));
add(new Wall(7, 31, 5, 19));
add(new Wall(14, 43, 3, 7));
add(new Wall(15, 30, 4, 21));
add(new Wall(18, 27, 7, 23));
add(new Wall(24, 36, 7, 14));
add(new Wall(30, 34, 4, 16));
add(new Wall(33, 35, 6, 15));
add(new Wall(38, 36, 12, 14));

That's right, I had to define each and every wall... It took some 20 minutes to define a level like #3, Jotunheim.

Later I figured out that I could use a bitmap mask for a collision box and create a level map using an image much like this:
Which took about a fiftieth of the time to create. This greatly sped up my speed in creating levels and allowed me to create massive levels like the ones you see later in the game.

Story:
The story was nigh incomprehensible. My lack of experience with haxepunk led me to a dead end when trying to create cutscenes, so i tried to keep the story complexity to a minimum-including only adding two lines of dialogue, and no animation. This caused things like the play getting pushed off a cliff to look like the player attempting to commit suicide. I'm hoping over the next few weeks to get more accustomed to creating cutscenes, dialogue and other story queues in Haxepunk, so I might avoid this problem in the future.

The theme could have also been more clearly explained. In general, i think I was able to save myself from players being completely confused with my LD description, but greater explanation from inside gameplay helps both with immersion and ratings. My original idea consisted of traveling between alternate universes through portals, each with a unique theme: (I.E, candyland, frozenland, fireland) that the player would have to traverse. Each level would have the same layout, but different mechanics and graphics. Later on, however, I opted for a climb of the great Norwegian world tree, Yggdrasil. I would've liked to have a clearer explanation and greater links to norse mythology.

I guess there's only so much you can do with 72 hours.

The Good:
Graphics:
The graphics for Gingerbread Odyssey work great, look good, and were quick to make.
A sort of cartoony, light hearted candyland theme was what I sought out to make. Some graphics, of course, looked better than others, but both the level design and the character animations looked decent and ran well. The rigs were easy to copy between characters, so i was able to quickly create armies of shamans and roamers. 
The only problems I had with levels was the small error in collision defining that caused players and enemies to 'float' sometimes, around 10 pixels above the ground. I would've also liked to create better projectile graphics, possibly more customized to each type of enemy. 

Combat
Combat, while simple, actually had a great deal more depth than I had originally anticipated. With the majority of enemies being back and forth roamers, the player has two choices: Face the enemies, and clear the platform for use in the jumping puzzles, or dodge the enemy and have to carefully judge when to jump and stay. The first option took longer and gave you a high chance of being killed, while the second, being faster, was extremely difficult in some situations. 

The fighting part of combat could have used some work. The player simply sticks out a black pole resembling a sword and spears enemies. After which, the enemy is knocked back and given invincibility for one second to prevent running it into a wall and repeatedly attack. Without an animation or any variety in the combat, it's a dull system to simply fight enemies in.

The one interesting part about this combat system, however, was how it forced you to fight ranged enemies. Instead of simply jumping behind and enemy and repeatedly stabbing it in the back, you had to kite the enemy or come up with your own sort of dodging pattern to avoid getting hit too many times. Watching friends play, I noticed some would jump into the air, causing the enemy to misfire upward; others would hide behind walls and jump out once the shot timer was on cooldown; and yet others would perform some sort of interpretive dance that involved jumping over the ranged enemies in a game of gingerbread leap-frog.

In all:
I had a ton of fun making the game, and it appears to have gotten more people playing it than any game I've created before (wow, a whole hundred page views). I also learned a bit about efficiently managing resources, art, and platforming collisions. There are little to no bugs and I'm very happy with the results.

10/10 would do again. Thanks, Ludum Dare!