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.
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.
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
Three commands, and the first one is the only thing that installs anything.
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.
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
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.
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.
glfw for the window and the event pump, openal-soft
for positioned sound, mpg123 to decode the recordings.
And nothing else. No installer, no application support folder, no save
file — a new maze every time you press r or start it again.
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.
| Key | What it does |
|---|---|
| W A S D | walk |
| mouse | look around — the arrow keys do the same |
| space | swing the axe |
| escape | stop the engine and open the menu: the volumes, the size of the window, and a hand to work them with |
| r | a new maze, and a new camera with it |
| q | quit |
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.
assets.rpak.q, and escape only pauses it.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.