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
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?
Yes! Notably, mineflayer, a bot framework for MineCraft. Mineflayer makes
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. ;-)