Every pixel in Væ Victis is one of 32 colours, and every one of them has a known source: a recipe in code, or a 3D figure rendered and quantised by code. There is no photograph, no painting and no generated image in the game; since 5 October 2026 a guard script fails the build if a generated image returns. This chapter is the short tour. The long one, with every sheet and the recipe in full, is the art book: How Every Pixel Is Made.
1. The palette
The palette is fixed in src/core.js (PAL_LIST): 32 entries in nine families, a game of blacks, stone, bone, blood, rust, verdigris and one cold blue, with a single violet kept for spells. A picture is a grid of numbers from 1 to 32 (0 is clear). The screen is 320 by 240, and nothing in the game draws a colour that is not on this list: the debug overlay counts what reaches the screen. This book keeps the same rule in its own stylesheet.
- 1 k#050407
- 2 n0#0d0b12
- 3 d1#1a1520
- 4 gr0#2a2630
- 5 gr1#48434f
- 6 gr2#77707d
- 7 gr3#a8a0a6
- 8 bn0#8c7d68
- 9 bn1#c4b392
- 10 w#eee4cc
- 11 r0#240408
- 12 r1#520a11
- 13 r2#8e1318
- 14 r3#c8231f
- 15 r4#ff4f3a
- 16 br0#2b1810
- 17 br1#553221
- 18 br2#875634
- 19 gd#c39535
- 20 y#f3d37a
- 21 v0#0b1c1d
- 22 v1#15332f
- 23 v2#275651
- 24 v3#468a7f
- 25 v4#8cc6b3
- 26 b0#0a1030
- 27 b1#1b2d6c
- 28 b2#3658bd
- 29 b3#86a8ff
- 30 sk0#6a5a63
- 31 sk1#b9a6a6
- 32 p1#8a4fc0
2. Figures: a model, eight directions, thirty-two colours
A figure starts as a rigged 3D model. The hero and the people are Clint Bellanger’s Flare models (CC-BY 3.0); the props are KayKit packs (CC0). They are composed on one rig, then recoloured and costumed at render time (tools/render/jobs-*.mjs: the Tower’s soldiers, the gutter’s watch, the orphanage’s sisters, the Wheel’s circus).
tools/render/render.mjs poses the model bone by bone, lights it, renders it from 8 directions at 56 pixels in a headless browser, and quantises every pixel to the 32-colour palette by material. The output is src/sprites-<name>.js: one string of palette indices per frame. The sheets below are that data drawn back out, nothing else. The character cards in The Gallery are single frames of the same sprites.


3. Pictures: a recipe, a field, a dither
A picture that is not a figure (a texture, a map, a stained-glass window) is a recipe: a short script in tools/art/paint/ that sets a pixel field (a material, a ramp of palette keys and a value per pixel) with seeded noise, signed-distance shapes and a Bayer dither, then resolves it to palette indices. tools/art/paint.mjs runs it inside the game and writes the picture as a run-length string.
A recipe is deterministic: run it twice and you get the same picture. That is the provenance. No generated image is a source, a reference or an input of any kind.


4. The dither, close up
Zoom into any picture and the dither shows. The game never blends two colours: it places them in a Bayer pattern, so a ramp of four steps reads as a smooth shade at the game’s size and as a lattice when you look closely.

5. A recipe, in one line
The haven’s floor begins with a single call: const F = T.cobbles(96, 96, { n: 3, m: 3, seed: 81, joint: 1, lo: .32, hi: .78, dome: .3, jit: .75 });. That sets stone cobbles on a 96 by 96 field with a seed. Everything after it (the dried blood in the joints, the rust spreading out in a ragged tide-line, the cracks) is a material, a value and a seed per pixel. No image is read. The full recipe is in the art book.
6. Where the pieces come from
| Source | What it makes | Licence |
|---|---|---|
| Clint Bellanger, Flare hero and heroine | The hero and every person, recoloured and costumed at render time | CC-BY 3.0 |
| Kay Lousberg, KayKit | The props of the graveyard, the dungeon and the furniture | CC0 1.0 |
| Mathers and Crowley, Goetia (1904) | The seals | Public domain |
Serifeus Studio, tools/art/paint/ | Textures, stills, windows, the map, the title lettering | Ours: code and recipes |
Full credits are in CREDITS.md in the repository and on the game’s credits screen. What is still synthetic in the game is the voices (open-source speech models), which the project’s own inventory records as placeholders until the owner and his wife re-voice them.