A first-person descent through the fluorescent-lit sublevels of a building that closed hours ago
Every empty room you walk into looks a little more like the last one you tried to leave. No combat. No inventory. No chase. You move, you look, you take the elevator down.
10–20 min playthrough · built twice from one design
The whole 3D world renders into a tiny internal buffer, then stretches up with nearest-neighbor. Native UI sits on top.
Geometry jitters to a coarse grid — the classic PlayStation wobble as you move and turn.
Perspective-incorrect UVs, so textures swim and warp across surfaces exactly like 1997 hardware.
An ordered-dither pass quantizes the color depth, banding the gradients into something sickly.
Scanlines, barrel distortion, chromatic aberration, tracking noise, and roll degrade the picture further.
The deeper you descend, the worse the signal gets. The picture decaying is the building decaying.
The same game — same layout, systems, audio, anomalies, and ending — built from one design on two completely different foundations. A full measured writeup lives in GODOT_VS_RAYLIB.md.
| Godot port | raylib port | |
|---|---|---|
| Engine | Godot 4.6 (Forward+) | raylib 6.0 (from source) |
| Language | GDScript | C (C11) |
| World | scenes (.tscn) + nodes | hand-built meshes + colliders in code |
| Lighting | engine omni lights + shadows | per-room point lights in a shader |
| Audio | engine buses + reverb | hand-rolled mixer + Schroeder reverb |
| Ships as | 68 MB binary | 1.7 MB binary |
| scc code lines | 1,971 | 2,141 |
| Cyclomatic complexity | 185 | 435 |
The one-number version: the two builds are nearly the same size by line count, but the C port carries ~2.4× the cyclomatic complexity (185 → 435) — because in raylib you write the collision, lighting, audio mixing, and state machines the engine otherwise hands you for free.
| Metric | Godot | raylib | |
|---|---|---|---|
| Shipping binary | 68 MB | 1.7 MB | ~40× smaller |
| Cold start → first frame | ~0.6 s | ~0.4 s | ~1.6× faster |
| Peak memory (max RSS) | ~235 MB | ~90 MB | ~2.6× less |
| CPU per rendered frame | ~2.3 ms | ~0.35 ms | ~6–7× lighter |
| Frame rate (this scene) | 60 fps | 60 fps | tie (both locked) |
The honest read: at a desktop 60 fps lock the two are a wash on frame rate and CPU% — both hold 60 trivially. raylib's wins are all in the floor, not the ceiling: a ~40× smaller binary, ~⅓ the memory, a faster start, and ~6–7× less work per frame. That headroom is latent on a desktop but decisive on weak hardware, at high refresh, or with far more on-screen geometry.
Movement is deliberately slow (~3 m/s) — this is a game you move through carefully, listening. A distance-keyed headbob keeps footsteps in sync at any speed; footstep timbre changes with the floor surface.
After enough descents (seven, by default) the doors open not onto another sublevel but onto the original lobby — the one you started in. Except it's empty, dimmed, and lit a sickly green; one tube is dead and another flickers. The desk note has changed. The front doors — locked all night — are now unlocked.
You walk to them, push them open, and you are standing back at the elevator. The exit leads inward. There is no way out. You read the last note, the screen fades, a title holds for a moment in the dark, and that's it. No reveal, no creature, no explanation. The horror is that there's no exit.
Play it right now in your browser — no install, no download. Or build the native raylib port, which is self-bootstrapping: it fetches and builds raylib 6.0 on first run, then the game.
▶ Play in your browser Source on GitHub ▶ Watch the walkthrough