Tell me if you’ve been here before: You’ve collected the necessary runes, opened the gate to zot, stolen the precious artifact, and dodged the swarming forces of pandemonium, only to get to the dungeon entrance and… You can't go down here!.
I love this interaction! No game is complete without me trying to go down the upstairs after mastering the dungeon. It happens to me all the time and each time I feel like I am watching this video again.
I’m serious too - I am, genuinely, tickled every time this happens. I am curious how many times I’ve failed to comprehend stairs direction so I implemented a counter.

It uses persistent storage so the counter is shared with all games! It won’t count past failures of course but the counter will persist between games. It works offline for all games and online for all games with the same account and server.
To use it, add this to your settings file.
{
function getOrDefault(table, key, default)
if table[key] ~= nil then return table[key]
else return default end
end
stairs_updated = false
function c_message(text, channel)
if string.find(text, "can't go up here!") or string.find(text, "can't go down here!") then
c_persist["stairs failures"] = getOrDefault(c_persist, "stairs failures", 0) + 1
stairs_updated = true
end
end
function print_stairs_failures()
if stairs_updated then
crawl.mpr("Stair failure counter: " .. c_persist["stairs failures"])
stairs_updated = false
end
end
function ready()
print_stairs_failures()
end
}
If you already have c_message or ready hooks in your rc, don’t add those functions again. Instead, add the content of these functions to your existing functions. They can be added to the top of existing functions without issue, if you’re not sure.
