Roguelike Souls

Roguelike Souls is a Dark Souls Remastered mod I created for LobosJr’s St Jude charity stream in May 2020. It replaces the game’s adventure with a rogue-like (or yes, technically rogue-lite) setup in which you must fight through a sequence of randomized levels and bosses with a limited number of lives. If you run out of lives, you’ll return to Firelink Shrine empty-handed, except for any allies you happen to rescue along the way.

I’d mentioned the project (under the code name “Dark Souls Forever”) on the DoA Discord some time before, but found it too daunting from a programming perspective and was worried there wouldn’t be a way to make the idea fun. Fortunately, I managed to get it up and running in time for the St Jude stream. I’ve released a few updates to smooth it out since then, though I know there are still some obvious tweaks to be made and plenty of potential for new content.

Roguelike Souls is a completely different animal from Daughters of Ash. One of its biggest twists is that enemies and items can appear almost anywhere in every map, rather than simply trading positions with one another. If you’re wondering how this was done, it was nothing intelligent, like detecting plausible spots on horizontal collisions. I literally ran around the entire world map while a background program recorded my position to form a gigantic list of possible game coordinates (enforcing a minimum allowed distance between each point). The procedural generation algorithm selects the positions for enemies, items, and other entities (like Abyss portals) from these points according to various rules. Enemies are all tagged with various types (hollow, plant, demon, etc.) and a handful of tags are chosen to give each level a little bit of a coherent theme — though some enemies, like ghosts and Titanite Demons, were too difficult to get working in the time limit I had, since their AI relies heavily on hard-coded map regions. Bosses are assigned to a number of different potential arenas in each map that guard exists, and the player is often free to choose among multiple potential paths, though different keys may need to be found.

The mod also differs from other randomizers in that the randomization actually occurs as you play, with new map and event files generated at the last second before you travel to them. This meant the mod needed a separate program running in the background that was hooked into the game’s memory, Cheat Engine style, and that meant that blessed Python was not a realistic option. (I did get a limited Python game hook working for Soulstruct, but it can’t do anything except get the player’s current coordinates.) Fortunately, TKGP has a fantastic .NET library available for FromSoft modding called SoulsFormats. AinTunez also kindly supplied me with some SoulsFormats wrappers written for Nightfall. I could’ve still written the randomization algorithms with Soulstruct and integrated them with the .NET memory hook, but ultimately decided to do it all with C#, which was an enjoyable change of pace. The source code is all available on GitHub.

The mod turned out to be pretty zany and fun, though it’s rather imbalanced — find a greatsword with a dagger’s animations and you’re set for life. I plan to make some big updates to Roguelike Souls very soon (as of October 2020), so stay tuned.