Introduction and first release

What follows is copypaste from reddit

I’ve been working on Tuonela intermittently for 4 years and it has finally reached a point where I feel like releasing a first publicly playable version alongside this write-up.

What is Tuonela?

Tuonela is a somewhat traditional roguelike inspired by many entrants of the genre, but most notably by Nethack, Sil, DCSS, Infra Arcana, Cataclysm DDA and Unreal World. The name comes from Finnish mythology and it means the realm of the dead, originally I picked it as a working name and it stuck. The content (enemies and their descriptions, some mythical weapons, flavour text) of the game is inspired by Finnish folklore, but there also influences from Stephen King’s Dark Tower series, the Cthulhu mythos and other works of popular culture.

For now I consider the game playable. But there is no real win condition, so the game could be considered infinite.

What is in Tuonela?

In addition to good old dungeon crawling (for now there is only one dungeon, but I have plans for themed and optional dungeons that the player can explore before delving into the main one.) the player can explore the hub level at the start of the game. The hub allows the player to spend their gold by purchasing items from the merchant or by upgrading items at the smithy. The hub can be returned to from every third dungeon depth.

The player gains gold by slaying monsters. More intelligent monsters are also equipped with weapons and armor they might drop when they die (right now drops are super common, in the future when I hope to get some balancing done which involves making drops and loot a lot rarer).

The player can also gain a pet who’ll fight alongside them. They can be ordered around and they can even equip some weapons and armour! You can get the pet by picking up the tuft of hair at the hub and using an altar.

Technical rambling

Tuonela was originally mainly meant to act as a testbed for srlfw, a roguelike framework I’ve been devising alongside the game. Both the game and the framework are implemented in go. The reason I’ve decided to roll my own framework instead of using an existing one is that at the time, no frameworks really existed for go. I’ve also enjoyed programming for all my adult life and writing my own framework really scratches an itch.

The game utilizes the fantastic bearlibterminal for displaying the graphics. The game was originally terminal only, but I decided to opt for the comfort of having an unified method of displaying graphics that I can trust to be somewhat consistent across platforms.

Game logic is based on the actor-action pattern talk by /u/munificent. I’ve found that this level of separation of data and logic is really comfortable to work with and also somewhat simple to roll out on your own.

On mechanics, the game draws inspiration from Dwarf Fortress and Nethack. One of the first mechanic still in the game that I implemented is the parts-system. Originally it was meant only to be used for defining the body parts for different actors so I could have targeted attacks or dismemberment, but in the end the system has grown to include handling equipped items and even inventory! (In the long run using the system for inventory might not be sustainable?) Basically how items are implemented is that both the item and the monster equipping the item have bodies. A body is basically an n-tree that defines one or more body parts. Any of the parts can be flagged with various flags, for example a handle of a sword might have a flag partFlagHandle and a monsters hands might have a flag partFlagGrabs. Now I just have to maintain a mapping between different flags and to know whether our monster can equip the sword I’ll just have to check whether the monster has any parts with the partFlagGrabs that does already not have a child node with the partFlagHandle. As mentioned, the parts-system supports dismemberment, but for now the game does not spawn any weapons capable of it as there is yet no way for the player to regrow any limbs they could lose in combat. (Though in theory the player could just dismember their enemies also and just reattach their chopped off body parts to their own torso :P)

What is not yet in Tuonela?

Advanced combat

Right now the combat follows the classic bump-to-attack formula. There are various item modifiers that can inflict special ailments (e.g. fire, freeze, blindness, confusion). What I’d like to have is some way of making the combat even more tactical. I’m currently experimenting with adding ranged attacks and other activated abilities. You can try the experimental stuff by activating the bloody altar at the hub

Quality of life features

Since menu and UI logic is homebrewn there is a lots of usability improvements to be made, for example highlighting piles of items and supporting multi-selection in menus so player can pick-up and drop multiple items without needing to open the menu over and over again. Also in game help and configurable key binds are yet to be added, for now I just ship the most important instructions in a readme file.


The game gets either super easy or super hard once you get past 75 meters depending on the luck and/or skill of the player.


In order to support the balancing, I’d like to add more “tiered” challenges to the game. I’ve been planning to create more pre-created overworld levels alongside the current hub level that would act as a way of allowing the player to travel between dungeons of different difficulties. I’ve also like that the player would have to prepare and make some journey to actually reach the entrance of Tuonela, the main dungeon.

Graphical tiles

The support for mapping ascii characters to images and toggling between tiled and ascii views is already implemented, but drawing or finding suitable graphics is tedious for me.

Open source

Neither Tuonela nor srlfw are open source for the time being. This is mainly because I feel that the code itself is not mature enough for publication :D. A major refactoring and open sourcing is one of the future goals.

Future of Tuonela?

I hope to keep working on Tuonela somewhat consistently. I’ve made major leaps in the past few weeks since I’m currently on summer vacation. I expect my pace to drop in the coming weeks as I return to work, but perhaps I’ll try to squeeze something out for Sharing Saturdays :)

Can I try it?

Be my guest! I’ve prepared x64 builds for Linux and Windows (golang makes cross-platform builds pretty easy, even though linking & bundling bearlibterm took a bit of extra work to get working.) Be wary though if you choose to venture of the depths of Tuonela, there be bugs and unbalanced content! (But also secrets and surprises I hope).

Get the test build at

If you do try it out feel free to shoot any first impressions or feedback in the comments!

Files 3 MB
Jul 17, 2022

Get Tuonela

Leave a comment

Log in with to leave a comment.