Hempuli: thanks! Yes, that map was procedurally-generated. It happened to turn out rather nicely, which is why it ended up on the front page.
If you're curious, here's broadly how map generation works:
* The universe is partitioned into different Zones (like a jungle, a hot zone, a lab, etc.), each of which is further divided up into Regions (like grassy hills, or a boiler room) which map directly to tilesets. Zones and Regions have configurable entries for how high they should be placed vertically and how strongly they should be weighted (thus, the jungle zone tends to have a higher altitude than the hot zone, and within the hot zone, technological tiles are slightly more common than rocky caves). You can see the partitioning in the fill tiles of the map.
* A tree is overlaid on the universe, generated breadth-first and ensuring that no limbs come too close to other limbs. Once its generation is complete, a few loop branches are added to connect nodes that are spatially close but have a large node-node distance in the graph. Each branch in the tree is associated with a different tunnel type (with different regions having different available tunnel types, like straight, staircase, zigzag, maze, room, etc.).
* To generate tunnels, the branches of the tree are used as the basis of a spacefilling cellular automaton. This automaton expands cells outwards until they run out of life or encounter a cell owned by a different branch of the tree. This breaks the map up into a bunch of disconnected rooms that looks like
this. Non-leaf nodes in the tree then create open space around them to connect the rooms together.
* The different tunnel types kick in to personalize each tunnel. Staircase tunnels fill themselves in, mazes are generated, etc. Note that some tunnel types also have different behavior when seeding the spacefilling automaton (for example, the room type uses unusually large seed values so that its cells can expand further before naturally expiring).
* A Marching Squares algorithm walks along the walls, looking for places where it can fit in platforms. This is intended to ensure that the map is fully accessible. A variety of different platform placement systems are used depending on the topography and the tunnel type (for example, a patterned platform placement is used for straight vertical tunnels).
* Finally, each cell in the map is examined to determine which kind of tile should be placed on it. Placement is based on the occupancy of its neighbors, with up to
twenty different tile types being available. At this time, background scenery objects can attach themselves to the terrain (e.g. trees in the jungle, which can attach to any flat-topped tile, have a chance of being placed each time they find appropriate terrain).
Nihilocrat: I agree with you that procedurally-generated maps will give more replayability than handmade maps. That's why I started out with procedural generation, and made a lot of progress in that area, I might add. However, it's looking like it'll be a fairly long time before I can get an interesting playable game with procedural map generation, hence the shift, for now, towards handmade maps. I'd always intended to support handmade maps, anyway; they lend themselves to an "artistic vision" more readily, in my opinion. My thinking is that by doing this I can find out what items are missing in my overall engine (e.g. I know I'm missing support for background images; currently all I have is a black background over which are overlaid various scenery items. My support for creature placement is also very crude right now, and there's no respawning). Those items can then later be integrated into the procedural mapmaker.
Additionally, I figure that if I can get a small, but complete, game out there, then that will create more interest in the game, and maybe I'll get some people interested in contributing.
I've thought about having set pieces that act as locked doors, like you suggested; my difficulty there is that I don't really want the game to be a bunch of corridors linking various set pieces together. There's also the difficulty of orientation: you can't put the same lock into a horizontal corridor that you can into a vertical corridor. The problem of course if that if I reject set pieces as locks, then I have to come up with a way, for each key item, to write a function to procedurally generate locks for that item. This is decidedly nontrivial.