Back in the days of yore, the Desktop Dungeons alpha had a very simple generation system which more or less did its job – there was really only one kind of map, and enemies were distributed using a dumb-fire system of random placement.
This caused occasional frustration for players who ran into enemy layouts that veered wildly between extremely generous and literally impossible – most sorely felt when they arrived in a new dungeon only to be surrounded by level 9 creatures!
Fortunately, due to the low metagame investment and the earliness of the game build, this wasn’t a major problem and we smartened up the algorithm for DD’s beta. Lower-level enemies would generally spawn closer to the player’s starting position, and more challenging beasties would – on average – be created further away. Horrific map layouts were basically a thing of the past (with exceptions that we’d work on from time to time!).
As time passed, however, we realised that we needed to put some more fine-tuning into monster positions. New map generators emerged to switch up player expectations and provide variety: open terrain creators, mazes and swamplands all introduced their own sets of opportunities and challenges.
Unfortunately, for many of the more “open” maps, enemy placement quickly lost one of its most valuable functions: chokepoint placement. In the alpha, enemies doubled as physical barriers to lock off sections of the map, making conservation of exploration much more important and hiding rewards behind challenging combat encounters. Often, players could arrive at the end of a Desktop Dungeons session without exploring several chunks of the map because that pesky level 9 zombie was just too resource-intensive to take down! The beta lost that for a time, and we responded by making enemies gravitate towards meaningful chokepoints to combat this perceived problem.
The above is an example of non-choke monster placement (left) versus the full-choke placement (right) in a sample run of Venture Cave. Note how, with choke, creatures level 5 and lower are actually doing their best to bar the few narrow areas that exist. Without this bias, many more monsters just stand uselessly in the middle of nowhere, and it’s far easier for the player to just move around without engaging any of them. They aren’t forced to stop and make difficult decisions as much.
Choke bias turned out to work reasonably well for open maps, but it caused the playing experience to suffer on tighter maps, especially those which were actively *more* restricted than the classic DD layout. Too many monsters in too many chokepoints, it turned out, were harsh enough to completely shut down a lot of playthroughs. So we got to work on a more granular chokepoint system, which we could use to tweak the monster placement difficulty on individual maps.
Here’s the Labyrinth working on a full-choke algorithm (left) versus the partial choke we implemented recently. Monsters still occasionally block corridors, but they’re not packed quite as insanely and players are thrown more “mercy placements” in case they need to move around a monster they’re not yet ready for.
Several maps have been individually tweaked to get better choke results. Most of the early game is low-choke, while later maps tend to have higher choke values. Open arenas generally retain maximum choke, while labyrinths and special-case monster spawners like Grimm’s Grotto have the algorithm extremely loosened.
Special-case tweaking like this (amidst the other hidden variables that we have for monster placement, not described here) allows us to respond to individual map needs instead of using a one-size-fits-all arrangement for enemy placement.
We think it’s an improvement!