Over the past few years I haven’t been able to do much programming, but I did cobble together a new entry in the Dungeon Monkey series, Dungeon Monkey Eternal. It’s a fun tactics RPG which is played in short coffeebreaklike adventures. This was my first major project in Python, and a big motivation behind its development was to test some of the systems I plan to use in the next GearHead. Here are some of the things I’ve learned.
Know where you’re going
I dove into the development of both GearHead-1 and GearHead-2 without any clear plan. I knew that I wanted to make a mecha RPG set in a sandbox world, but I didn’t have a clear picture of what the completed state of the game would be. Instead I just kept building and building, occasionally painting myself into a corner.
With Dungeon Monkey Eternal, on the other hand, I decided what features the final game would have before I started coding. Although these plans changed several times throughout development, simply having an end state to work towards was a big help. I could anticipate the effects of things that were not finished yet. This brings me to the next point…
Finish one thing before moving on to the next
Make sure that a newly added thing works well before charging ahead and adding more stuff. A lot of GearHead’s features were added with the expectation that I’d go back and improve them later… then I never did because I kept jumping ahead to the exciting bits. It’s best to get things working well the first time. Then you can relax and forget about them, at least until conflicts with another feature start causing problems…
A little bit of beautification can go a long way
Graphics is one of those not-so-fun things I kept putting off. I kept telling myself that making GearHead look good would take too much work, or that I wasn’t very good at graphics (despite the fact that by day I’m a cartoonist; young Joe was a contradictory guy). Well, I’m happy to announce that you don’t need a million hours (or dollars) to make a game look presentable. Just a little effort can make a big difference to a game’s appearance.
Ugly memo browser from GearHead-1 and ugly console display from GearHead-2.
Compare the two GearHead examples above to the Dungeon Monkey Eternal examples below.
Dungeon Monkey Eternal popup menu and text display box.
It didn’t take very long to add a border and textured background to the Dungeon Monkey Eternal panels, but it looks far nicer than simply dropping a colored rectangle on the screen. The same goes for making sure that the size of the panel matches the content that will be placed in it. Next look at the use of terrain:
There are several different versions of each ground type and the forest tile. This breaks up the shapes and stops those areas from having an obviously repeating pattern. There is a transition between the grass and the dirt, unlike the abrupt change seen in GearHead. The walls have been decorated so you can tell at a glance which building is the library and which is the armor store. None of these features are particularly hard to implement, but they make the map look much better.
Better AI beats bigger baddies
All NPCs in GearHead use the same combat AI, and consequently they are all relatively predictable. Dungeon Monkey Eternal uses several different AI types. Individually they are still rather stupid, but the presence of types means that the player has to be ready to use different tactics.
Good AI can make a monster more dangerous than simply increasing its level or abilities. An archer who attacks at range but doesn’t flee from the player characters is kind of dangerous. An archer who attempts to stay away from the party while still maintaining line of sight is more dangerous. An archer who stays away from the party, maintaining line of sight while hiding behind cover, who specifically targets the party’s mage or other vulnerable characters, is super dangerous.
Procedurally generated text is what is good in life
Currently, the way personality traits are handled in GH1 is that for any dialogue line that should be variable, there’s a list of alternate versions corresponding to different personality traits. So for instance, the same greeting should have a default version, a shy version, a sociable version, a cheerful version, yadda yadda yadda. Writing multiple versions of every line of dialogue is extremely labor intensive, and it ignores the fact that most NPCs will have more than one personality trait.
Dungeon Monkey Eternal makes good use of procedurally generated text. Several techniques are combined: a context free grammar expander is used to expand tokens into sentences, then a phrase substitution function swaps words based on the character’s dialect. This happens for both the PCs and NPCs. Dwarves talk like dwarves, orcs talk like orcs, and fuzzies talk in LOLspeak. It works pretty well.
This technique could probably be implemented in GH1. It would require reworking much of the existing dialogue to add tokens, but even that would be less work than trying to fill out all personality trait variations in the old system.
Make the information easy to get
One of the big problems with GearHead is that a lot of information is effectively hidden from the player. More information needs to be visible, and just as importantly the ways this information can be used should be more obvious.