The Pixel Maze: a Pico-8 game

I have been doing software development for over 15 years, and I thought that I could apply some of my skills in another dev domain for fun. This time I wanted to try something different, and I started working on a tiny 1-bit retro game.

I heard many horror stories that gamedev is hard, and I wanted to get the heartfelt first-hand experience. While it is certainly true that prior experience helps, but gamedev requires a multidisciplinary approach. One has to compose music, create sound effects, draw tiles and sprites, think carefully about game mechanics and many many other things.

On top of that, I am a solo-developer, and I have to prioritize ruthlessly, i.e. whether a new idea adds something meaningful to a game, or it is nice to have but will drain my energy, and I will abandon a game quickly. I am lucky to meet great people in gamedev groups. Also, I find gamedev community very friendly and supportive. I am still miles away from the first playable build, but it is a rewarding experience.

Ironically, it surprisingly well aligns with my startup journey.

If anyone is curious, here is what it looks like:

The Pixel Maze Demo

The Pixel Maze Demo

It is a Pico-8 game. I will publish source code and assets when it is done to this repository: https://github.com/oneearedrabbit/maze/. Until that, a source code could be provided upon a request.

1-bit lighting is based on a marching square algorithm where a 2D field is “stretched over” a list with 17 dithering patterns with transparency. I use a custom polygon fill function to clip sprites based on the case from the algo.

A clip function renders a partially rendered tile and paints black the remaining part. Something like fillp(dither[bright]) rectfill(box, 0x70) fillp() customfill(15 - case, 0) where customfill handles 16 cases based on a contour lines lookup table, and 15 - case mirrors contours.

If case is 15 then you can draw the whole sprite and render a rectangle with a pattern fill based on the brightness. Case 0 is a black rectangle.

← Run Python in a sandbox with nsjail

Diggy: a zero-setup development environment →