Vienna Β· Sprite Editor

As the game draws it

shipped
your settings

The contour, 4x β€” shipped Β· yours Β· the figure with no ring at all

Every frame in this set, as the game draws it

reading…

Outline β€” the ring the builder draws

The ring is capped at darken on dark of the lightness of the garment behind it, so light art keeps the ink exactly as it is and only a line that had stopped reading gets darker. 1.00 = one flat ink everywhere, the way it shipped before 2026-08-31.

Heavy edge β€” paint that is doing the ring's job

Some masters came back with a black band painted round the figure β€” 4 px on hero-t2, 8 px on base-m2-t2, against hero's 2 px. This erodes it back to a line. A pixel goes only if it is darker than half the paint behind it AND backed by more of the same, so a real 1–2 px cel line is never eaten.

Dark paint β€” hair painted almost black

hero-t2's hair is not outlined β€” it is painted almost black. The dark run inward from the silhouette is 1–4 px at every row of hero's head and 11–20 px down the sides of his, in (31,18,5); only the top curls kept their brown. No contour setting can reach that. only coloured keeps the lift off a neutral black costume (34,34,34); only masses keeps it off the coat's own painted ink, which is warm too but 1–2 px. 1.0 = off, and it is the one control here that rewrites the master's paint.

Sets β€” green dot = tuned

What this is. The town sprites carry no painted outline: the contour is drawn at build time by tools/tour_build_*.py β€” a few px of alpha dilation flooded with one ink and composited behind the figure. This page is that step, live, per set.

How it saves. πŸ’Ύ writes every frame of the set into web/town/_proto/ through serve.py, and the numbers into sprite-tuning.json, which tools/tour_outline.py reads β€” so a rebuild from the masters comes out the same. The ringless figure is kept beside it under sprite-cores/, so re-inking a set is always done from the same source and never compounds.