Rill v0.2

Art Vandal
a maze lit by torches.

A first-person maze written in Rill, with no C written anywhere — no shim library, no generated bindings, no build script. The whole path from main to the GPU and the sound card is extern declarations and raw buffers.

Walk it, swing an axe at what is on the walls, and find the brass bolt turning on the floor. It runs until you close it.

The title card: ART VANDAL written in blood down a torch-lit brick
                corridor, a torch burning on the left wall and an axe held at the right.
                The readout across the top reads FPS 105 and RSS 25.1 MB, and along the
                bottom, ART LEFT 20.
The title card, and the readout it keeps in the corners: 105 frames a second, 25.1 MB resident, and twenty paintings still on the walls.
DownloadmacOS · Apple Silicon · 24 MB

Two files come out of it: artvandal, 356 KB of native code, and assets.rpak, 32.5 MB — the paintings, the font sheet, the models and every recording, in one file. Nothing is installed and nothing is written anywhere; delete the folder and it is gone.

sha256  57a58305a5fb5bcbc9f444f03d24bf0fe054f639c0215572dfc0b77a4c552da1

Installing

Three commands, and the first one is the only thing that installs anything.

  1. The three libraries it links against

    OpenGL comes with macOS. These do not, and the binary is 356 KB because they stay outside it rather than being folded in.

    brew install glfw mpg123 openal-soft

    Homebrew has to be the /opt/homebrew one — the Apple Silicon default — because that is the path written into the binary.

  2. Letting macOS run it

    The download arrives quarantined, and this binary is signed only ad-hoc, not notarized. Gatekeeper will refuse it until the flag comes off:

    unzip art-vandal-macos-arm64.zip
    xattr -dr com.apple.quarantine art-vandal
  3. Playing it

    assets.rpak is the one path the program knows, and it is looked for in the working directory. So go into the folder first — running it from anywhere else will not find it.

    cd art-vandal
    ./artvandal

what it prints on the way up

GL 4.1 Metal - 90.5
assets: 35 entries, 33320 KB
maze: 2376 vertices, two generated textures
torches: 14
font: 95 glyphs, em 96
wall faces: 196, one painting every 9
paintings: 20
blood: 61 stains, 44 running down the wall, 50 dragged along the floor
remains: 13 of them, 33270 vertices from 5 models
bolt: one of them, at 5.5,5.5
walker at 1.5,13.5 — 36 cells, 36 seconds away, 20 poses
sound: 16 fires, error 0

The maze is carved fresh each time, so those numbers are that run's and not yours.

What it wants

macOS, Apple Silicon

An arm64 Mach-O, so an M-series Mac. There is no Intel build and no Rosetta path — the dylib paths inside it are the arm64 Homebrew prefix.

Homebrew at /opt/homebrew

glfw for the window and the event pump, openal-soft for positioned sound, mpg123 to decode the recordings.

35 MB on disk

And nothing else. No installer, no application support folder, no save file — a new maze every time you press r or start it again.

The controls

There is no run. What makes you quicker is the brass bolt turning on the floor somewhere in the maze — one to a maze, and it is worth a fifth for as long as that maze lasts.

KeyWhat it does
W A S Dwalk
mouselook around — the arrow keys do the same
spaceswing the axe
escapestop the engine and open the menu: the volumes, the size of the window, and a hand to work them with
ra new maze, and a new camera with it
qquit

A first aid box gives you back a tenth of your blood and there are six of them. The bolt goes out with an arc rather than a chime — half a second cut out of a ray gun, at your ear rather than out in the maze, because a chime would have been the one sound in here that came from a different game.

Worth knowing before you download

Why it exists

To find out what a language with no C escape hatch does when you ask it for a game.

Every OpenGL call, every GLFW window, every OpenAL source and every frame that libmpg123 hands back is an extern declaration in Rill and a buffer laid out by hand. There is no binding generator in this project and no .c file to compile alongside — the language reaches the system libraries directly, or it does not reach them at all.

The brick, the flagstone and the boarded ceiling are not loaded. They are written pixel by pixel at startup, which is why the pack holds paintings and recordings and no wall.

The maze is depth-first search, the torchlight is per-fragment, and the thing walking toward you is 20 poses of a 17,196-vertex model, 36 cells and 36 seconds away when you start.

← Rill, the language it is written in