I Made a Game for 7DRL: Dungeon Scoundrel

Back in March I did the Seven Day Roguelike game jam and ended up with a completed game: Dungeon Scoundrel. That's amazing to me; I entered with the intention of just making a little tech demo for the bigger roguelike I'm planning, Dog Rogue. Here are some thoughts about the design of Dungeon Scoundrel.

The Level Generator

The level generator in Dungeon Scoundrel is very simple but it does a reasonable job of making interesting spaces. When it makes a level it does the following:

  1. Do a drunkard's walk with a 60% chance of moving forward — unless doing so would move off the edge of the level, in which case it always turns. Anywhere the “drunkard” walks is open space.
  2. After the drunkard's walk is finished there's usually one or two hallways that abruptly end, where the walk terminated or turned 180 degrees. We can easily find these by looking for open tiles with exactly one adjacent open tile. To make this look more natural, it places a door there and grows a room with no other connections.
  3. Fix any tiles with a diagonal exit by filling them in. Since the game has 4-directional movement, such an exit might be confusing. This doesn't work perfectly — every so often I see a problem this should have fixed — but I haven't gone back and investigated it.
  4. Randomly draw from the open spaces to get the player's starting location, the stairs, monster spawn locations, and treasure chests. Originally I wanted to ensure every area in the level had at least 1 treasure and monster in it but I didn't have enough time to do that, so it's just random.
  5. If the either set of stairs isn't reachable from the player's starting location we reject the level and start over. This can happen when step 3 places a wall that cuts the level into two parts.

Unknown Items

A lot of roguelikes deliberately obscure what each item does. For example, an “effervescent potion” could do one of many things, and you won't know what it is until you try it. Maybe it heals you, maybe it makes you turn invisible, or maybe it explodes. And which potion is which changes from game to game, so you can't look up what effervescent potions do in advance.

In principle this sounds like an exciting mystery, but in practice it's often tedious. Every time you start a new game you have to go through the hassle of trying a bunch of stuff in a safe area just to gain a little information. Otherwise you’re essentially gambling that the potion will be the one you want when you drink it.

In Dungeon Scoundrel I still wanted to let the player have a little of this fun. My solution was to keep everything the same from game to game. So an effervescent potion's effect never changes. A beginning player can try to solve the exciting mystery, and an expert player can just cut to the chase.

Stairs

Stairs in roguelikes operate in one of three ways. Classic roguelikes (like Nethack) have stairs that connect every level, so you are free to backtrack as much as you want. In fact, backtracking all the way to the start of the dungeon, having acquired the game's macguffin, is usually required to beat the game. Newer roguelikes (Crypt of the Necrodancer or Spelunky, for example) often omit stairs backwards completely, making backtracking impossible.

There are a few older roguelikes (like Angband) that instead allow the player to backtrack, but don't save the specific geometry of each level. Thus every time the player visits a floor, even if they have visited it before, it is completely new. I took this idea for Dungeon Scoundrel for two reasons:

  1. It's really easy to implement.
  2. It gives the player infinite resources, ensuring that no game is unwinnable.

Normally this idea has an unfortunate side-effect: the player can repeatedly enter and exit until they get a lucky level (sometimes called "stairscumming"). To solve this I just moved the player's starting location away from the stairs, so they have to navigate at least part of each level. Of course I also allow the player to quickly jump between levels for a fee…

But now they aren't really "stairs" are they? If I walk down a staircase I normally expect to be able to turn around and walk back up it. So I changed them to be magic portals. Making things magic is always a good solution.

The Player's Vision

Roguelikes often have restricted vision, to prevent the whole level from being visible. But since levels are random, there's no sense of which direction is likely to be fruitful and which is likely to be a dead end. To solve this for Dungeon Scoundrel I reveal the level geometry and presence of interesting objects, but not what those interesting objects are nor where enemies are located. That way the player's exploration is directed towards what they care about while still resulting in surprises.

Since I didn't want every enemy on the level to swarm the player immediately (especially because there aren't many doors on a level to hinder their progress) I thought about making enemies "wake up" and start attacking when they become visible to the player. That had the unfortunate side-effect of making a larger vision radius a disadvantage, so instead enemies have a fixed "wake up" radius that's independent of the player's vision radius. This is similar to how Crypt of the Necrodancer works.

Leveling Up

"Tokens" are the experience points of Dungeon Scoundrel. I wanted to reward exploring the level instead of killing enemies, but it feels weird to find something abstract like "experience points" just lying on the floor. I also wanted to avoid making a fixed level-up table since that seemed boring (for both me and the player). My solution was to make a gacha machine that gives the player random stat boosts in lieu of leveling up, and they pick up tokens that let them play the machine.

The gacha machine has one big list of all the possible outcomes, and it gets depleted as you play. There are about 200 items, so it's hypothetically possible to get them all — though you’d have to play for quite a long time. Doing it that way means I can have limits on how much Speed the player can get, for example (at just 3 Speed the player is already extremely powerful, so I don't want to go much past that). It also means if the player gets an unlucky string of "nothing" rolls then getting "nothing" again becomes less likely.

The Cutting Room Floor

In any game there's lots of stuff that never gets done in the name of actually releasing something. For me a jam game is actually easier to edit, because I have a hard deadline and it forces me to focus.

Originally Dungeon Scoundrel was going to have 6 dungeon floors. It's pretty laughable in retrospect that I thought it was possible to fill out that many floors with unique enemies. As it is, the final floor only has a few new mechanics. Actually, my very first vision for the game was going to include several dungeons you could explore in any order (kind of like Hyper Light Drifter). There was definitely no time for that, which I realized very shortly after starting the jam.

Something that got closer to making it in was minibosses. Every so often a special monster with an entourage of normal monsters would spawn, providing an additional challenge and additional loot. I even coded up the whole framework for it, but again there was not enough time to design the 5-10 boss monsters that would be needed to make it interesting. Instead I spawn only the entourage, which is why occasionally there will be a big clump of enemies on a level. It gives the difficulty a little variety to keep the player on their toes. The two boss monsters I did design made it in as normal enemies in later floors, as the Oversized Slime and the Fairy Hexer.

The restricted lighting in the game gives it a nice gloomy feeling. The lighting system is fairly robust, so I wanted to do some other fun things. There was going to be permanently lit areas, maybe from environmental sources (braziers, windows, glowing mushrooms). Plus I wanted to make enemies that were mobile light sources. I even thought up a monster that emitted darkness, so it was impossible to see the squares around it. There just wasn't enough time to do any of this though.

Results

The reviews from the 7DRL judges were mixed. One of them seemed to really like the game (and posted a video of it!) but the other two seemed to be looking for something more unusual. Which is fair — it's a pretty standard classic roguelike. I'm really proud of myself for making it, which is much more important. Like I said above I was just aiming for a tech demo.

The itch.io version (which has a bunch of small changes from the jam version) has seen a steady amount of traffic. I really have no idea why. Maybe there are a few people who play it regularly. The only thing I can discern from the referrer analytics is that people look at the "roguelike," "rpg," and "HTML5" tags a lot. I'm glad I'm already working on another HTML5 rpg!

And someone bought it! They gave me $3 for it, which means I'm officially a professional game developer.

As of this writing I only have one screenshot from someone who beat the game. So give it a play and send me your screenshot if you manage it too.