Caverns of the Souleater
Father told you these caverns hold a great treasure. But all you've found are endless tunnels and venomous snakes. As your torch burns low, you wonder if the gold was ever real. And why he didn't share this with your brother?!
Gameplay
Your goal is to escape these forsaken depths without being bitten by snakes. Torch should scare the snakes but once it wanes they will crawl to you and bit you. Unfortunately there's not much fuel in the torch so hurry up or put it off.
- Use the arrow keys to move the character
- Press Z to toggle torch
- Contemplate the path you took
- There are two endings, indicated by captions
- Caverns corridors are always the same
About & Notes
Caverns of the Souleater was made for Pico-1k 2025 jam with particular requirement of game being compressed into at most 1kb. Uncompressed source along with comments is available here.
this is actually a very creative gameplay you've got going here. I just wish the snakes were a little more visible.
thx. i considered using doubled pixels but they just looked like wriggling salami.
thx. there is a slight problem with single pixel gaps that results with rendering single line thin walls. probably this could be fixed with some ground preprocessing using morphology kernel or the like. for instance slightly bigger radiuses and then erode operation to smooth this, or just close operation. but since i had only 1k i couldnt fit anything more.
This is the kind of game I've been looking for: wandering through a cave with a torch with limited visibility. Very cool! I'd ask how you did it, but I bet it's some wizardry I won't fully understand. Are you going to expand it into a full game?
There's a github gist with unshrinked source along with comments. The basic idea is that caves are just a randomized table of ovals. These are drawn on the screen and determine the walkable area. Ground and walls are rendered by iterating over precomputed lookup table that covers oval light shape around hero. This is done for speedup because typical iteration over radius and angle would either cover same pixels multiple times or leave some holes. Iterating over lookup is from center outwards, if wall is hit (again pget()==0) then I skip iterating to next angle (or lower radius). Rendering is done in couple of passes, first ground, then snakes, walls, hero and finally hissing. Should you have more questions, feel free to ask.
I don't plan to expand it as I am in the process of developing another game - Schifahren. But maybe I will return and refactor or polish this a little in the future.
[Please log in to post a comment]




