Andrew Kelley graduated with a degree in Computer Science from Arizona State University last Thursday. He loves programming, game development, and composing electronic music. In two months, he's starting work for Amazon in Seattle. Oh, and his entry, Lemming, was voted the winning solo entry in the latest Pyweek competition.
Congratulations on your PyWeek win - and with your first PyWeek entry too! Did it come as a surprise or were you feeling fairly confident?
I knew I would rank at least up in the top few games, simply because I was in that beautiful stage of freelancing where you have just finished a job, have plenty of money in the bank, and don't have to work for a while. With only 2 classes and no girlfriend I was able to spend upwards of 90 hours on the game. I think that's probably a bit more time than most other contestants had.
Have you written many Python games before?
This was my first Python (and Pyglet) game. I have a few really old Flash games online though. First game ever was in VB6, and the platform I've written the most games for is probably TI-83 (I had a long bus ride home back in high school).
Writing a game in Python was interesting. It's perfect for a rapid development competition like this - Python is fantastic with the arbitrary data structures you often need to solve one-off quick problems in game programming. On the other hand, I did experience some loss in CPU efficiency in my physics loop that writing it in C or C++ probably would have improved.
What would you say are most important lessons you learned through developing Lemming?
Do not write a level editor during PyWeek. I did this the first day, and then scrapped pretty much all my day 1 code on day 2 in favor of Tiled and DR0ID's tiledtmxloader. I'm very happy that I made that decision.
Reserve a non-trivial chunk of time for playtesting on friends and family - people who aren't a part of the development effort. You'll get a sneak peak of what everyone is going to complain about when they judge your game, and hence a chance to prevent that. Or even better, you'll get a preview of how judges will praise your game, and you can use that knowledge to expand upon that aspect.
Start 'em off really easy. The way your gameplay works to you is obvious, since you conceptualized and coded it. Not so for someone who hasn't seen your game yet. You don't want judges to get stuck on level 2 and give up, never to see all the cool stuff in levels 3 and above. There's a time and a place for really hard, difficult gameplay, and that is after the player has proven that they are ready for it. I think Loopback executed this perfectly with their difficulty modes. After playing on easy and getting the hang of it, you can move on to challenging for the really interesting gameplay.
Find good tools and practice before PyWeek. It shouldn't be a pain in the butt to create art, animations, and levels for your game. If it is, keep looking. You need good tools that stay out of your way so you can have more time developing and less time fighting with tools.
Was your original idea anything like the final submission or did it change a lot in the making?
According to my theme brainstorming document, my original idea was for the Fry Cook on Venus possible theme, "You're a french fry leading a stampede of lemming french fries. When you die control transfers to the next one behind you. Your death affects the environment."
When it came time to think of ideas for Nine Times, I thought, "The french fry game but with only 9 of you. And let's use lemmings instead of french fries."
So I pretty much implemented my original idea exactly, but the idea was purposefully vague enough to expand into the different possibilities that came out of it.
What in the world is that main character supposed to be, anyway?
I have no idea. Guesses people have made include "CigarMan", "Dog Poo on Fire ...Man", "The Sausage King from one of the other PyWeek theme proposals" and "The Peperami Guy". I'm no artist. To me he's just a really happy brown rectangle with a death wish.
How did you design the gameplay elements?
The process for inventing gameplay went something like this:
- Roughly sketch a level idea on paper, with gameplay concepts that I haven't programmed yet.
- Simultaneously create the art and code for the gameplay elements I had sketched out - make them work.
- Use Tiled to actually build the level I had sketched, utilizing the new art and code.
- Repeat. I only ended up going through 2 iterations.
In the reviews, your level design was praised - and cursed! ;-) - in equal measure. Was the level design something you put a lot of effort into?
Level design is really important to me. I think it can make or break a game. This is why doing most of the level design in crunch time was my biggest mistake. With half of the last day left, I only had 1 really hard grassy-hill themed level, and 1 really hard factory themed level.
I actually split the original level 1 into what is now levels 1, 2, and 3, in order to make them easier. Level 1 is fine, but everybody still gets stuck on levels 2 and 3. What this means is that my concept of difficulty was way off. I should have had more people playtest the game so that they could tell me it was too hard and so that I could make the difficulty ramp up more slowly, while still introducing cool gameplay concepts.
One of the pieces of feedback on the levels that really struck home for me was this: "The later levels of your walkthrough remind me of a Rube Goldberg device with the player getting flung hither and thither with no idea of what to expect next. That's not something it's really feasible to master." This comment is spot-on. I fell into a trap - I wanted to show off how capable and bug-free my physics engine was by making levels as complicated as possible. There is a time and a place for that, but in the case of Lemming the commenter is right, it happened far too much.
I think that as is, the current 9 levels only expose about 10% of the cool gameplay and puzzle levels you could achieve, with already existing code. Since time is a zero-sum game during PyWeek, this means I should have spent less time developing gameplay elements and more time level designing. Fractured Soul pulled off this balance beautifully. They have a pretty simple gameplay - there's not much more to it than jumping and placing 9 statues in each level. Yet they have a ton of wonderfully crafted puzzles that keep the game fresh.
What would you have added or changed if you'd had another week to work on Lemming?
Well, I have had another few weeks to work on Lemming, and I've done absolutely nothing, so I guess that's the honest answer. But hypothetically, the next few things I would add would be more levels, a better victory sound, more level themes and gameplay elements, more ways to die. I'd improve the level design, tweak various physics variables, like turning friction down, and fix some bugs!
Do you have any other projects you're working on?
I'm in the middle of refactoring it into a library so that we can kind of merge projects with Charged Miners, an OpenGL MineCraft viewer. Together this will provide an alternate client for people to play MineCraft with.
We hang out in #mcdevs on freenode. It's a pretty fun channel.
What aspects attract you about MineCraft?
I think the idea of starting out weak and vulnerable, but by slowly working your way up, you can become strong and powerful, is a big part of it. It's interesting how none of that is by "leveling up" but actually by moving, placing, and/or physically acquiring certain objects is what makes you strong and powerful. It's nothing inherent.
The Zero Punctuation video pretty much sums it all up.
Nowadays, I think the #mcdevs aspect of it is more fun than the actual game - that is, the community of people who are making MineCraft-related projects. Another example is bravo, an alternate server written in Python. One of our favorite pastimes is to gather in the IRC channel after a big MineCraft update and complain loudly together about how bad a programmer Notch is. ;-)