Games253

Mazing

Carry your light through the dark. A hand-rolled maze game where the player's flame burns down with every step, lit by a real-time 2D visibility polygon so light never passes through a wall. Procedurally generated with three algorithms and braiding, with a seeded Daily Maze shared by everyone, on a from-scratch canvas engine with no game dependencies at all.

Mazing is "carry your light through the maze": the player is an ember in an endless labyrinth whose flame burns down with every step. Sparks rekindle it, a red Ariadne's thread traces every corridor already dared, purple wisps patrol from the third level and devour the flame on contact, and an echo pulse — earned every three sparks — sends a wavefront down the corridors to reveal the way out. Two modes: Descent, an infinite progression of larger and more intricate mazes, and a Daily Maze that is the same for everyone and shareable.

The engine is entirely hand-rolled and self-contained, with no game dependencies at all — maze generation, lighting, rendering, audio and persistence are each written from scratch.

What I built

  • Architected a self-contained canvas engine — game, rendering, maze generation, audio, visibility and persistence each their own module — driving the full simulation and render loop by hand, with no external game dependencies.
  • Built a per-frame 2D visibility polygon from scratch, so the player's light stops at a wall rather than passing through it — the mechanic the whole game is built around.
  • Implemented three maze-generation algorithms (recursive backtracker, Prim's, Kruskal's) plus a braiding pass to remove dead ends, with seeded determinism so the Daily Maze renders identically for every player.
  • Wrote WebAudio oscillator synthesis for the game's audio from scratch, with no external sound assets.
  • Designed the flame-as-health-bar core loop — sparks, wisps, the echo pulse and the Ariadne's thread — as mechanics that emerge from one resource (light) rather than a separate health system.