Free Slautios

Slautios is a roguelite souls-like about chaotic melee combat between crowds of monsters with a daunting total darkness as an obstacle. There exists a large variety of light sources to take advantage of, so feeling your way through the dark is something to be avoided when possible.

Through exploration you'll discover many themed locations with different monsters spread across them and a vast quantity of items and medieval weapons as you progress deeper into the dark. Besides your weaponry and dodging skills you have a handful of abilities at your disposal and even the option of growing your own personal army of monsters.

Through death almost everything is lost. The exception being your character stats which you will level up throughout the game in the pursuit of power, these stats will determine your various playstyles.
Who knows what lurks within the deepest dark. Try not to fall into despair before finding the ending!

Last edited by a moderator:
Thanks guys. The lighting was rewritten about 4 times, it might be the most complex system in the game, the procgen has 10x more code but that code's much easier to understand. Nowadays I would rewrite it a 5th time and use shaders more for even better performance. As it currently stands, the lighting hurts the performance a lot even with the optimizations I implemented.

Breaking down the lighting we have several objects:

There's just one of these objects, it uses a black surface that's drawn over the top of everything, so that things can be subtracted from it - I'm sure you're all familiar with this basic "subtraction from surface" method you've seen in tutorials. What we're subtracting is a bit more complex though, created in oLight.

Every object that emits light has one of these glued to its position, it's ultimate goal is to create an image which is then subtracted from oDarkness. It iterates over every grid position visible on the player's screen (the grid tells us which are walls and which way they're facing) and uses draw_primitive_begin(pr_trianglelist) to create "the back side of walls that cannot be seen" (on the corners of walls I draw massive triangles which point away from the player); a radial gradient subtracts this part, then the final result is subtracted from oDarkness.
It also includes a bunch of optimizations, such as the rate at which it refreshes, whether to draw it if it's too far off screen, and scaling code. I said it "iterates over every grid position on screen" but it actually checks less positions depending on its size.
oLight are only turned on upon seeing them (using a collision_line). I once had a shroud surface in addition to the darkness surface (like Warcraft/AoE shroud + fog), but at the time I didn't like how it looked, so I cut it.

This is the "shiny bloom effect" which is the simplest part, merely a draw_set_blend_mode(bm_add) using a white radial gradient (which is then coloured yellow or other colours), it moves a little, flickering its size. Its total size is also scaled by the oLight.

Makes stuff look desaturated and blue using a shader, the shader is fed the darkness surface and so the desaturation + blue are more intense based on the black level of the pixel. I think it increases contrast a little too.
Last edited:
  • Like
Reactions: Tyg


Yeah I love blue-ing the dark tones too. It can produce pretty striking effects when using lighting and gradient overlays. Areas that are sometimes dark sometimes not will be blue only some of the time, which makes things look really dynamic! I would experiment with yellow/oranging highlights in the same way too, though it might not be what you're looking for. It looks great as-is!