by Justin Tolmar White » Sat Apr 04, 2009 4:54 pm
On gameplay design:
Maximize the amount of depth-per-complexity you can get. This means you should make sure there's potential for an interesting interaction between every element in your game before you add a new element. Interactions don't need to be complicated or even specifically coded: for example, an enemy that chases the player and an element that slows the player down are already interacting. Hand-coded interactions are alright too, of course - it's always fun to have an enemy that eats another enemy - but keep these to a minimum because they're not only less intuitive, but also a major sink in your development time.
Pick one, maybe two emotions and nail that. Make a goal of having the player experience a sense of flow, or be in a constant state of terror, or feel the wonder of exploration. Make the player feel these through gameplay, not writing. An RPG with fantastic writing could make a player laugh, cry, and fall in love, but that still doesn't count: your gameplay is acting as an accent to the story at best.
On enemy design:
Code each enemy's AI by hand whenever you can. For each enemy, pick one thing and make the enemy do that thing as aggressively as possible. In most games, enemies last a very short amount of time, so they need to show up and do their thing as soon as possible. The longer you expect a specific enemy to last, the more effort you can spend giving it multiple behaviors. But even boss enemies don't need more than a handful of tricks. Unless your game is entirely about the player's conflict with a single AI opponent, you don't have room for detailed approaches.
You don't need to pull out heavy AI tools like predictive pathfinding, learning, need-based AI, or decision trees unless you have a very specific and very good reason to use it. Even relatively basic AI tools like regular pathfinding are frequently unneeded. Melee monsters using A*, for example, are usually more boring than enemies that just seek x/y.
For games aiming at being frightening (hey, it's my specialty), there's a shortcut to coming up with an interesting focus for an enemy. Pick an apparent rule of the game and break it. Try an enemy that gets bigger as it's damaged, or an enemy that goes through walls, or one that can't be damaged.
On level design:
With hand-coded levels, introduce one of those interesting interactions we talked about at a time. At any given point in time, the player should be either looking at something entirely new or a new combination of elements they've seen earlier. Making a few exceptions to this rule is of course a good idea, but you should have a specific reason in mind every time you do this. One good way to break the rule would be throwing in the occasional easy situation from early in the game so the player can blow through it and feel good about their progress. Another is repeating an older challenge on a much larger scale to show the player they can handle things they wouldn't have been able to go through earlier in the game. A great example of the latter of these is in World of Goo, which repeats the basic bridge-building puzzle at bigger sizes a few times.
With procedural levels, don't worry about introducing those interesting things one at a time. Instead, do what you can to make your generator conducive to as many of your interactions as you can. If possible, make it so the number of elements the player has to consider increases with each level, but don't tailor the specific interactions. Using our old examples of a chasing enemy, an enemy that the chaser eats, and terrain that slows you down, an ideal level generator will sometimes start you on a level with the chaser and the prey, sometimes on a level with the chaser and the slower, but never on a level with all three: it saves that for later.