REELS

Published 2026-09-18

Nine colours for the machine, and seven pits that all came out black

REELS runs on a fixed palette of nine swatches, drawn on 12 August 2026 and never repainted since. On 15 August I put the seven pits side by side and found seven shades of black. Here is the whole audit with its real hex values, what raising the floor cost the beasts, and a measurement I ran this morning that found one pair still failing.

REELS is a roguelite built on a slot machine you take down into a pit. The machine is brass, aged enamel, red bakelite and visible screws. The pit underneath it is a cold digital well where the beasts live. Those are two different materials, and the entire visual system of the game is one sentence written under a colour chart on 12 August 2026:

Cold serves only the arena. Warm serves everything else. Never the other way.

That sentence is doing more work than it looks. It is why the menus never glow, why the reels are always lit like a fairground booth no matter how deep you are, and why the machine's shell is the one thing in the game that cannot be customised. The engine file that defines the arena themes says it outright: the brass and the enamel never move, that is the identity of the game, not an option.

This is the story of the part that does move, and of the morning it turned out to be seven shades of the same black.

The board: nine swatches, and that is the whole vocabulary

The design board was drawn before the game, then implemented in one pass on 12 August 2026. Its first plate is nothing but tokens. Nine colours:

  • Well, 0F0D14. The background of the app and of the arena.
  • Aged enamel, EDE0C0, and shaded enamel, D6C69F. Every light plaque in the game.
  • Brass, B8862F, and light brass, E0B458. Every primary control.
  • Red bakelite, C4442E. Danger, hostile waves, a failed run.
  • Jade, 5EC8B0. Written on the board as the colour of mastery, for the luck gauge only.
  • Patina, 7A6A55. Borders, dead metal, secondary text on enamel.
  • Muted violet, 8B6BB8. The enemies.

Everything else in the interface is derived from those nine. The shipped file today holds 32 named tokens for 31 distinct values, which is what a real palette looks like once it has met a real screen: you need an enamel that is one notch brighter for the pressed state, an ink for text on enamel and a softer ink for the secondary line, a ghost grey for locked items.

The one duplicate is deliberate and worth a sentence. Dark patina and plaque shadow are both 6B5C48, declared twice under two names, because a plaque's drop shadow happens to be the colour of patina in shade and might one day stop being. A token is a promise about meaning, not about a hex value. Two meanings that currently agree still get two names.

There is a second rule on the same board, about type rather than colour, and it has never been broken once: a number is never set in Barlow, a paragraph is never set in Alfa. Every digit in REELS, every clock, every quota, is DM Mono. That is why the tolls read as machine output rather than as writing.

Jade did not stay in its lane, and that is fine

The colour file still says jade is for the luck gauge only. I counted this morning: jade, dark jade and jade ink appear 220 times across 31 source files.

So the note is stale, and rather than pretend otherwise it is worth saying what jade actually became. It is the colour of things going your way. The flask a dead beast drops. The day streak on the home screen. A contract you have completed. The machine's next spin when it is less than half a second out. The souls from a melee kill, which are jade, while ranged kills pay in light brass. The plus twenty five percent you earn for crossing a toll without taking a hit.

The inverse held better than the original rule did. Bakelite red is what is coming for you. In the run summary the verdict panel is jade when you survived and bakelite when you did not. In combat, an incoming wave draws its telegraph in bakelite when it is hostile and in jade when it is not. A player never has to learn that. Two colours, one meaning each, applied consistently for a few thousand lines, and the meaning installs itself.

The lesson I would keep: a palette rule that says "this colour is for this widget" ages badly. A rule that says "this colour means this thing" survives, and the widget list takes care of itself.

15 August: seven zones, seven blacks

The descent crosses zones. Every three tolls the pit changes beasts, air and floor, and the warden of the third toll becomes the door into the next one. Seven zones: the Fairground, the Common Grave, the Circus of Spectres, the Furnace, the Abyss, the Silva, the Void. That system landed at 00:40 on 15 August 2026.

Twelve hours later I put the seven arenas side by side on one board, and they were not seven places. They were three defects.

The backgrounds were black, not dark. Six of the seven had no channel above 2A on their brightest value. The seventh reached 33. Below that ceiling the eye stops reading a hue and reads black, so seven different centre colours produced seven identical pits.

Two collisions, and they were flat. The Silva was 14210F and the Common Grave was 182012: two dark greens. The Void was 120C24 and the Fairground was 191424: two dark violets. Four zones out of seven were rendering as two landscapes.

Four of the seven had no floor at all. Their ground layer was set to none, which means the arena was a radial gradient and nothing else, and one radial gradient looks like every other radial gradient. Only the Circus had structure, and it was borrowing it from its fog.

The fix raised every background and pulled the hues apart. The Silva went to golden wood, 33290F. The Void went to nearly pure blue black, 0B0820, on the argument that its identity is its star field and not one more colour. The brightest channel across all seven now reaches 4C. Three new floor patterns were drawn, one for each zone that had none: cracks for the Furnace, never aligned; swells for the Abyss, continuous arcs; roots for the Silva, each node growing two branches in a V. The Circus and the Void keep no floor on purpose, since a floor would contradict "nothing touches the ground down here". Floor opacity went from 4 to 6 percent up to 13 percent, because at 5 percent the ground existed in the source code and nowhere on the screen.

What the fix cost, measured honestly

Raising a background makes it brighter. The beasts standing on it do not get brighter by themselves, so every hue lift is a contrast loss paid by the creatures.

I recomputed the whole thing this morning from the two versions of the file, using the standard relative luminance ratio, measuring each of the four beast families against the centre of its own arena.

Before the fix, the worst pair in the game was the Porter of the Furnace, 8F2A16 on 2A1008, at 2.13 to 1. Already too low: a beast you have to dodge should be separable from the ground at a glance.

Raise the Furnace to 40170A and leave the Porter alone, and that same pair drops to 1.87 to 1. The fix, halfway through, had made the worst case worse. This is the part that never shows up in a before and after screenshot, and it is the reason a colour pass has to be measured rather than admired.

Five beast hues were lifted to pay for it, four Porters and one Hound, hue kept and luminance alone adjusted. The Furnace Porter came out at CF3D20, which is 3.23 to 1 against its new ground. Across all seven zones the worst pair went from 2.13 to 1 up to 3.16 to 1, and every family in every zone now clears 3 to 1.

Three to one is not a compliance target here, since none of this is text. It is the number at which a moving silhouette stays readable against a busy ground while you are also watching three reels. I picked it, I can defend it, and now everything in the game is measured against it.

The lamps, and why they are allowed to tint at all

The wardrobe in REELS does not sell arenas. Depth decides where you are, and that is not for sale. What it sells is lamps: a tint laid over the zone. The zone decides the shape, the lamp decides the colour, and the two systems never argue.

That would wreck everything I just described if the tint were applied evenly, and for a while it was. A lamp turned the Furnace's brown, 2a1008, into olive, 2d2c20. All seven landscapes drifted toward the colour of the bulb and depth stopped being readable.

So the composition is deliberately lopsided. A lamp lights what it touches, it does not repaint the walls. The background takes the tint at 0.3 of the lamp's strength, so roughly 5 percent. Everything lit, meaning beasts, eyes, puddles and the floor pattern, takes it at three times the strength, capped at half. The wall stays the zone's, the accents go frankly toward the lamp, and a lamp that cost you ten thousand tokens is actually visible, which was the other half of the problem: at 0.15 everywhere, players were paying and then hunting for what had changed.

The measurement I ran today, and the one pair that fails

Here is the thing that board of seven arenas could not tell me, because it only had seven images on it.

With seven zones and seven lamps, the game does not compose seven arenas. It composes 49, and with four beast families that is 196 beast on background pairs a player can actually see. I ran all 196 through the real composition maths this morning, 18 September 2026.

195 of them clear 3 to 1. One does not: the Porter of the Abyss under the forge orange lamp, at 2.82 to 1. The turquoise ground of the Abyss drifts warm under an orange bulb, the Porter drifts the same way faster because lit things take triple the tint, and the two meet closer than either does alone. Nobody found it by looking, including me, because it requires owning an 11,000 token lamp and descending to toll 13.

It is one pair out of 196 and no one has reported it. It is also below the floor I set myself, so it goes on the list, and if you ever see it before I ship the fix, that is what you are looking at.

That is the argument for writing the number down in the first place. A palette you can argue about is a matter of taste. A palette with a threshold in it is a thing you can test, and a thing that can tell you it is broken while you are asleep.

REELS is on iPhone. It is free to download with a trial that runs through toll 5, and a single purchase unlocks everything permanently, with your trial progress kept. No ads, no tokens you can buy, no second transaction anywhere.

https://apps.apple.com/app/id6801441632

All notes