7DRL Postmortem


Predictably, I didn't finish the game in time for the end of this year's 7DRL.

At one point in the week, I thought there might be a chance of finishing some playable version, but the scope was just too complex to finish any permutation of the game that I could have been happy with. That's fine though! The possibility of releasing something helped me cut mercilessly at some of the features that just weren't worth the time they'd take to implement.

A week later and I have a game that is starting to feel like a game. I'll use this post to talk about some of the things that worked and some of the things that didn't. I'll also be uploading the first playable version!

Here's how things are currently looking.


The Chain

Towards the end of the week, I was struggling with the abilities that the player can use. You could hurl a fireball, plant a magma charge, cast a grappling hook, dash in a direction, and throw poison darts. Mechanically all of the abilities were implemented and they each made for interesting and unique game play, but I was having an impossible time balancing the enemies against the horde of different players that might come through the door.

The dash and the grapple were incredibly powerful in allowing you to fly through the level, stunning enemies, and escaping from their range before they could retaliate. The poison darts would allow you to kite anything from a long distance, and the fireball/magma charge just weren't that interesting to play with.

I also couldn't solve the problem of figuring out how the player comes by these abilities and whether they should have access to multiple abilities at once. I spent a while playing with each of them to try and figure out which was the most fun, in order to just pick that one for 7DRL and revisit others at a later date and decided on the grappling hook.

The grappling hook did a good job at helping the player navigate the environment tactically, whilst also working offensively to isolate and stun monsters on the receiving end of the grapple. The only problem was that it was still way too powerful. There was almost no reason to use the normal movement keys.

At some point I also added rendering for the grapple and the rope so it seemed a bit less like a magic force.


After a while of play testing the grappling hook, I decided I was less interested in designing the levels and enemies around movement, and far more interested in designing around positioning. The grapple wasn't able to damage enemies at a distance, which meant that you'd end up using your fists in almost every fight.

The final solution? Meet "the chain".


On a fresh character the chain is your primary ranged attack. You can cast it in 8 different directions (compared to 4 for fists) and as you play through the game you find links that you can add to the chain to increase its range.

The chain itself counts as "flying" so it can be used to reach over water/lava tiles to reach points that may otherwise be inaccessible.

To balance for the advantage the chain has in range and direction, its base damage is only half of the damage you can deal with fists, but there's one final trick it has to offer.

If your chain passes through a substance whilst casting it, the substance will be applied to any enemies it hits, as though they had walked onto the tile. In the example above, the chain passes through some magma above a fissure, which gives the worm the "molten" status effect (take 2x damage/deal 2x damage). This can be a great way to use the environment against enemies who won't go where you want them.

Overall, I'm pretty happy with where the chain is at the moment. In the future I think it needs an upgrade system, so that you can add modifiers that will allow you to deal different types of damage, including knockback, and possibly even a grappling attachment. Some of that stuff could be done through vestiges (the game's relic system) but other aspects need to be mutually exclusive, so I think a dedicated system will be best.

Rewards

Speaking of vestiges! The level generator now puts an entrance and exit in each level, and when you get to the exit, you'll be offered a selection of rewards.

The reward screen is fairly primitive at the moment, but depending on the decisions you made during the previous level, and the current state of your character, you can be offered vestiges, healing, cleansing (of status effects), chain links, and obsidian shards. Obsidian shards serve as the currency for the game, although I have plans to change that in the near future. You can find them in chests around the levels, and certain enemies will also drop them on death.

Levels

The final thing that took a good chunk of the time that I should have spent tuning and releasing my 7DRL was level generation. I had already made the deliberate decision to go with a pared down level size of 21x21 to help keep the focus on the combat rather than exploration. Generating levels at this size really gives you the chance to play around with the layout of a room, rather than the layout of a dungeon, so lots of generation techniques have to get chucked out immediately. My go-to for generating interesting and credible looking dungeons has been the domino placement technique, which relies on handcrafting some room shapes, then trying to place them into the map at a point where there is an open door. I tried this initially here too, even with a modification so that it was placing features inside a room, instead of rooms inside a level, but it wasn't creating the kinds of results I was interested in.

After rewriting the generator I ended up with something that struck the right balance with a blend of cellular automata (good for caves, and alien looking levels) and diggers (good for burrows/tunnels/lairs). The way I have the generator right now allows me to mix and match multiple steps of either strategy, then populate that level with the tiles and enemies that would be found there according to the level's characteristics.

I spent a lot of time generating combinations of cellular automata rules and applying them to various noise densities to find levels that had the right blend of open/closed space to be obstacle strewn chambers, or winding passageways.


I'll share more screenshots of levels as I add more to the game. Currently there are only two and neither are likely to make the final cut.

The other challenge with levels was placing enemies, rewards, and entrances/exits. The first version of the generator placed the entrance on a random open tile, then used Dijkstra's algorithm to find the longest possible path from it, and put the exit somewhere in the last 30% of that path. This worked well in terms of keeping the level length about right, but it was quite jarring going into the exit, then appearing on the next level at a completely different place on the screen.

I ended up forcing the entrance to be at the position of the previous level's exit to make it a little smoother. This meant that the level generator now had to generate (on average) more levels, because any that don't have a large accessible area from the entrance tile will be rejected, whereas before, it was free to put the entrance in whichever area seemed best.

I was also able to reuse the Dijkstra maps from the previous step to decide where to spawn enemies and treasure. I want to make sure that the rewards are never just lying around along the main path, forcing the player to fully engage with the level to find them all.

Conclusion

Anyway, I think those are the main points. There's plenty of other stuff that was added, but is less obvious/relevant/likely to stay in the game that I'll either talk about in future devlogs, or that will disappear from the game in the near future.

I'm going to upload the game in its current rough state to Itch after publishing this post, so go play it and let me know what you think!

Leave a comment

Log in with itch.io to leave a comment.