Fling a cat fairy around the sea of dreams, enter dream portals and collect bubbles.

Made in 48 Hours for Global Game Jam 2025 using gficl my graphics library built in Common Lisp using OpenGL.

download from itch

source code

Thoughts

I used the ‘framework’ library I am writing for my dissertation project as a starting point, which makes setting up render pipelines very easy. This library and gficl are very low level, so it was difficult to do the initial setup. For example I needed to add mouse support to gficl, as well as setting up a post processing pass for blitting the game’s native resolution to whatever the game window is sized to. This led to not making as much progress as I would have hoped, and so the resulting game lacks any clear objective or win conditions.

This was my first game jam using lisp, and overall it was a delight. Interactive development with live recompiling code makes iterating on and experimenting easy. This fits a fast paced development that you have in game jams very well. The main downside is a larger binary that my other games as lisp packs the whole language runtime into the compiled executables.

Ripple Effect

I had lots of fun with the post processing. I am planning to write about a technique called ‘metatextures’ which can be used for papery edges in 3d rendering (the paper on it is here). I took the noise texturing part of the technique and used it for a warping effect on the dream portals and the dream world.

Final Render

Noise Buffer

It works by displacing the pixels based on the value of the pixel in the noise buffer. The scene is rendered to a framebuffer with two colour attachments. By default the second attachment has the colour (0.5, 0.5, 0.5, 1), which means a displacement of 0.

Any game objects that are of type noise sample their textures when rendered, and if the alpha value is 0, the fragment is discarded. Otherwise we use their uv coordinates to sample a noise texture, which is given an offset based on time for a ripple effect. This means any noise objects are drawn to the noise buffer with the same shape as their base texture.

In the post processing step the uv used to sample the colour buffer is offset by the value of the noise buffer (rescaled to the range [-1, 1]).