01 — Unit Sprite Specification
This document specifies every piece of unit art in Every Last City: the team-colour channel contract that makes ownership rendering possible at all and the per-cell record of what each unit tints and what it does not, the cell geometry and reserved badge areas, the silhouette language that lets a player tell twenty-three units apart at speed, the state variants that get their own art and the ones that must not, a parameterised generation prompt template plus a filled, copy-pasteable prompt for every unit, the Mid, Chip and Strategic tier assets — which are not downscales of the Close tier and must not be produced as such — and a complete manifest of every file, cell and atlas. It does not specify terrain, installations, city art, overlay glyphs, badges, or the seat palette; those live in the sibling art documents.
Status: Draft v0.2 · Owner: unassigned · Depends on: docs/art/00-art-direction.md (§2 the team-colour channel — ART-120 the two-layer encoding, ART-125 delivery, ART-135 which tiers carry detail, ART-155 what detail may contain, ART-180/185 the substitution, ART-190 the value transform, ART-455 the companion page; this document defers to all of them and supplies the roster), docs/art/02-terrain.md (ART-605 delivery conventions, ART-1135 the ownership read test, ART-615 the recorded-choice precedent), docs/art/03-overlays-and-glyphs.md, docs/spec/02-units-and-industry.md (roster, classes, movement classes, capability flags), docs/spec/04-ui-ux.md (UX-390 LOD tiers, UX-430 unit state visuals, UX-440 ownership rendering, UX-1125 condition badge, UX-1310 colour)
Decisions applied: D-1 to D-7 of docs/art/04-decisions.md, as far as they reach this document —
the counting-cue exemption to the interior-mark cap (§3.4, §7.3), Infantry staying the base-only
style plate with armour as the foundation's worked example (open question 12), the ban on upscaled
512 px masters (§2 rationale, §12.1 note 1), the atlas bootstrap (§12.1 note 2), the unresolved
runtime-versus-build question for the Chip and Strategic tiers (§10, open question 17), and the split
of linear from area detail with its narrow-projection contour exception, which is what makes
this roster's four gun tubes drawable at all (ART-445, and ART-245, ART-435, ART-440, ART-580,
ART-590 and open question 11 following it).
Sibling-filename caveat. Three other documents in
docs/art/are being written concurrently. Where this document cites one it cites it by requirement range, which is stable, and by an assumed filename, which may not be. The terrain document has since landed asdocs/art/02-terrain.mdand is cited by that name and by requirement below; the foundations and overlay filenames are still assumed. See Open questions.
Requirement-ID collision caveat.
docs/art/02-terrain.mdalso numbers requirements from ART-600 upward, so ART-600 through ART-1040 currently name two different requirements each across the two documents. Nothing in either document may be renumbered unilaterally. Every cross-document citation here is written as "ART-NNN of 02-terrain.md" for that reason, and the collision needs resolving at the art-index level. See Open questions.
Roster-count caveat. The extracted ground truth heads its roster list "23 producible + 3 support/reference", which reads as 26. The enumerated tiers contain 20 manoeuvre units, and
docs/spec/02-units-and-industry.md§8 states "Twenty manoeuvre units and three auxiliaries" — 23 unit definitions in total, all of them producible in a city. This document specifies 23 units, one subsection each, covering every unit named in the ground truth. Nothing is missing; the header arithmetic is what is wrong. See Open questions.
1. What a unit sprite is — the team-colour channel contract
Everything else in this document is downstream of one requirement. UX-440 says ownership is rendered by substituting the owner's foreground and background colours into a team-colour channel — a per-pixel mask authored alongside the art — and that art outside the mask renders as authored and is free to carry shading, material and mechanical detail.
What UX-440 constrains is an outcome, not a technique and not a colour count: ownership must be unmistakable from the silhouette alone, without reference to insignia, trim, or any detail that survives only at higher zoom. A design that tints a unit's markings and leaves its mass untinted is not a stylistic variation, it is an unusable asset — at a 32 CSS px tile with a friendly and an enemy unit adjacent, a player who has to find a shoulder flash to know whose tank that is has been failed by the art. Everything in this section exists to hold that outcome while leaving the freedom UX-440 grants actually usable.
Division of labour, and this document does not own the format. docs/art/00-art-direction.md §2 owns the team-colour channel: its ART-120 fixes the two-layer encoding, ART-125 the delivery conventions, ART-135 which tiers may carry a detail layer, ART-155 what a detail layer may contain, ART-180 and ART-185 the substitution itself, and ART-190 the value transform. docs/art/02-terrain.md ART-605 defines the two conventions both documents cite and ART-1135 the verification both adopt. What is left to this document is what its open question 8 explicitly assigns here: the roster — which unit takes a detail layer, which does not, and why. That is ART-247, and it is this section's real content. ART-200 to ART-245 below restate the inherited contract only as far as a unit artist needs it at the drawing board, and where they and the foundations differ, the foundations govern.
ART-200 Every unit cell MUST deliver a tint-mask base under ART-120 of docs/art/00-art-direction.md: two tone values plus alpha, every opaque pixel masked. The mapping is ART-180's, un-inverted:
| Tone | Value in the base | Carries | Substituted with |
|---|---|---|---|
| INK | the dark value (m → 0.0) |
the closed outer contour (ART-050 of 00-art-direction.md) and every interior mark | the seat's foreground colour (UX-210) |
| FIELD | the light value (m → 1.0) |
the body mass enclosed by the contour | the seat's background colour (UX-210) |
| — | alpha 0 |
outside the silhouette | not drawn |
A cell MAY additionally deliver a detail layer (ART-205). The base alone is always a complete, valid counter: ART-155 rule 1 makes the detail layer never load-bearing, so a unit whose detail atlas is dropped under memory pressure is still fully owned and fully identifiable.
Polarity, stated because an earlier draft of this document had it backwards and the failure is silent. The dark tone is INK and takes the seat foreground; the light tone is FIELD and takes the seat background. Every generation prompt in §8 is written to that mapping — light mass, dark marks — which is also the polarity
docs/art/02-terrain.mduses for its own stencils. Get it the other way round and every asset in the game still renders, in the wrong colour of the right pair, and no check in any of the three documents catches it.
ART-205 A unit cell MUST deliver its channel by one of the two conventions of ART-605 of docs/art/02-terrain.md, in the form ART-125 of docs/art/00-art-direction.md fixes for units, and the register of ART-247 MUST record which:
| Convention | Delivery for a unit | Where used here |
|---|---|---|
| Implicit | One file, <id>.png — the tint-mask base. Every opaque pixel is masked; no companion file, no companion atlas. The default. |
21 of the 25 cells |
| Explicit | Two files at identical pixel dimensions: <id>.png, plus <id>_detail.png — a straight-alpha RGBA detail layer whose alpha is the mask complement, packed into a companion atlas at identical cell coordinates (ART-455 of 00-art-direction.md). |
4 cells — field_gun, armour, heavy_artillery, heavy_armour |
Two consequences of the inherited format that bite this roster directly, and that §8 and §12 are written to:
- There is no
<id>_mask.pngfor a unit. ART-125 folds the mask into the detail layer's alpha precisely so that two files cannot disagree about it. A unit's mask is the complement of detail coverage, by construction. - A detail layer is Close tier only (ART-135). Every Mid cell in this document ships the base alone, whatever its Close cell does — so the four explicit cells are explicit at Close and implicit at Mid, and there is no Mid companion atlas.
ART-210 Transparent pixels MUST carry the RGB of the nearest opaque pixel, never a residue left by a chroma key. In the base that value is always INK: under the closed ink contour of ART-435 every pixel at the silhouette boundary is ink, so continuing ink outward continues the artwork rather than guessing at what should be there.
Rationale, unchanged in substance: the pipeline samples the texture with linear filtering, and at any zoom below 1:1 the sampler blends across the silhouette edge into void texels. If void texels hold the far tone, every edge in the game acquires a one-pixel halo in the wrong seat colour; if they hold the colour the edge is already blending toward, the edge resolves cleanly. This is the bleed rule of §2.5 of docs/art/00-art-direction.md restated at the drawing board, and the same idea as the 2 px extrusion ring of ART-1030 applied at the silhouette rather than at the cell boundary. It is also ART-230 of docs/art/00-art-direction.md reaching the same conclusion from the same premise, which is why that document is able to call the flood exactly correct rather than a tolerable approximation — and why it stops being either if the contour is dropped.
ART-215 The mask MUST carry the mass that establishes the silhouette. In every Close-tier cell:
- Masked pixels MUST be at least 60% of opaque pixels — the floor ART-1135 of
docs/art/02-terrain.mdsets, which ART-155 rule 3 ofdocs/art/00-art-direction.mdexpresses on this encoding and ART-255 check 9 there measures. - The mask MUST be the silhouette's outer boundary, not an inset core rimmed in detail. Mechanically: in at least 50% of painted rows both the leftmost and rightmost painted pixels MUST be masked, and in at least 50% of painted columns both the topmost and bottommost MUST be. A projecting untinted feature — a gun tube reaching past the hull — passes comfortably; a sprite rimmed in detail does not.
- Every ground contact (ART-320), the waterline (ART-330) and any feature named as a counting cue (§3.4) or a weight mark (ART-400) MUST be in the base.
- Verification is ART-595.
Rationale: this is UX-440's outcome expressed as something an author can act on at the drawing board. Point 2 is belt-and-braces — ART-225 of docs/art/00-art-direction.md already keeps the detail layer off the ink contour, which makes the base the outer boundary by construction — but it costs nothing and it catches a mis-cut detail region, which ART-125 names as the expected production failure. The waterline earns its place in point 3 by being the single widest feature in any sea cell: a live-box-wide rule at a fixed row means two adjacent enemy ships differ in colour right across the tile, the strongest ownership signal a naval sprite can get, and free. Ground contacts earn theirs because at Mid tier the bottom two rows of a land cell are often all a crowded stack shows of it.
ART-220 The base's value rules are ART-190 and ART-200 of docs/art/00-art-direction.md and are not restated here: a linear normalisation of [20, 235] → [0, 255] is the only permitted value transform, anti-aliased intermediate values are permitted at the boundary where INK meets FIELD, values outside [INK, FIELD] are forbidden, and a plateau of intermediate values — a region rather than a boundary — is forbidden. The detail layer receives no value transform at all.
Rationale for pointing rather than repeating, and for the one place an earlier draft of this document was wrong: it demanded exactly 0,0,0 and exactly 255,255,255 with no intermediate value anywhere. That is stricter than the format requires and it is stricter in a way that costs something real — it forbids the boundary anti-aliasing that makes a 128 px curve legible, for a purity the normalisation of ART-190 delivers anyway. The thing that actually matters is the distinction ART-200 there draws and this document had missed: an intermediate value at a boundary is a blend the sampler was going to produce regardless, while an intermediate value across a region is a third tone masquerading as shading, and only the second is a defect.
ART-230 The alpha channel is the primary identity channel. A unit MUST be identifiable from its silhouette alone, with the entire interior filled solid and every interior mark — masked and untinted alike — discarded.
Rationale: UX-1310 forbids ownership being carried by hue alone, and a player may re-map any seat's colours to any pair they like. A design that separates Corvette from Destroyer by an interior detail is a design that stops working the moment someone picks two colours of similar luminance, or plays in the high-contrast mode UX-1310 requires be supported. The interior marking is a second, confirming channel. It is never the first one — and the new freedom to add a material value does not create an exception, because a material value is an interior mark like any other.
ART-240 INK MUST be used for the closed contour of ART-435 and for marking: wheels, track links, canopies, waterlines, cut-outs, wing engine nacelles, turret barrels that are part of the mass, weight marks. FIELD MUST carry the mass. Interior INK — every ink pixel of the base that is not part of the contour band — MUST cover between 8% and 35% of the opaque pixels lying inside that band in any Close-tier cell.
Any feature whose legibility depends on contrast rather than on shape MUST stay in the base, in INK, and MUST NOT be moved to the detail layer. This applies without exception to every counting cue in §3.4.
Rationale: two failure modes bracket the 8–35% band. Below 8% the interior reads as a solid blob and the unit loses its second channel entirely. Above 35% the mass stops reading as mass and the silhouette dissolves into speckle at Mid tier. The band is checkable and it is checked (ART-590), measured over the base, which is the only layer it can meaningfully describe.
Rationale for measuring it inside the contour band rather than over the whole cell, which is a change forced by adopting ART-435 and not a loosening. An 8 px closed contour is on its own 35–50% of a typical cell's opaque pixels, and on the Missile — 28 px across its span — it is very nearly all of them. A band that counted the contour would therefore be unreachable by every unit in the roster while saying nothing at all about the thing it was written to protect, which is the interior: a blob with no marks below 8%, speckle that dissolves at Mid above 35%. Excluding the contour keeps the number measuring exactly that. Total INK, contour included, will typically land between 40% and 60%, and this document does not bound it.
Rationale for the contrast rule, which is the load-bearing half and the thing most likely to be got wrong now that the tone count is a choice: a seat's foreground and background pair is guaranteed to contrast, because UX-210 chose it and UX-1310 constrains it. An authored material colour is guaranteed to contrast with neither, because the seat pair is player-remappable. Five INK road wheels in a FIELD track band are legible in every palette anyone can pick; five gunmetal road wheels in that band are invisible the moment somebody picks a dark seat, and the counting cue goes with them. Fine marks therefore stay in the base. The detail layer is for features large enough to read by shape, and mostly for features that read against void rather than against a seat colour.
ART-245 The detail layer's contents are governed by ART-155 of docs/art/00-art-direction.md — full sRGB colour, never load-bearing, inside the silhouette and off the ink contour, area-bounded to preserve the 60% floor, and no connected region below the minimum dimension for its kind: 12 px in the smaller dimension for an area region, and ART-157's three tests there for a linear one. Every region this roster delivers is a gun tube and is therefore linear; ART-445 is where that geometry is stated at the drawing board and where all four cells are checked against it. This document adds only what the roster needs on top of it:
- Detail colour MUST NOT vary per seat (ART-260) and MUST NOT encode any value that changes during play (ART-270).
- The four cells that carry a layer (ART-247) carry one material only — a machined steel gun tube — and MUST use the same authored colour for it in all four, so that four separately generated barrels read as four instances of one material rather than four decisions.
- That colour MUST be chosen and recorded once, against the terrain base colours of
docs/art/02-terrain.md, and MUST remain legible over the lightest and the darkest of them. A single mid-value grey will not do both; the tube needs a value break within itself — a darker body and a lighter upper edge — which is the smallest thing that can honestly be called shading and is exactly the freedom UX-440 restored.
Rationale for pinning the material rather than leaving it to each generation: a gun tube is the only untinted thing in this roster, and four of them will be authored in four sessions weeks apart. Left unpinned, the Field Gun gets a blue-grey barrel and the Heavy Armour a brown-grey one, and the map acquires a variation that carries no information — the exact ransom-note failure ART-530 exists to prevent, arriving through the one door that requirement does not cover.
ART-247 For every cell, the choice of whether it carries a detail layer is an art-direction decision recorded here with its reason — the record ART-125 of docs/art/00-art-direction.md makes mandatory, discharging the question that document's open question 8 assigns to this one, and the same thing ART-615 of docs/art/02-terrain.md records for its seventeen assets. The register is normative; §8 restates each row in its own subsection and MUST NOT diverge from it. Conventions are Close-tier; every Mid cell is base-only (ART-135 of 00-art-direction.md).
| # | Cell | Convention | Base holds | Detail layer (Close only) | Why this, for this unit |
|---|---|---|---|---|---|
| 1 | scout |
implicit | everything | — | The narrowest painted silhouette in the roster (68–80 px) and an identity resting on an 8 px antenna. Every pixel not carrying seat colour is taken from the smallest ownership target on the map. |
| 2 | infantry |
implicit | everything | — | Two 28 px figures whose cue is a 12 px void between helmet domes. It is also the style reference (ART-530), and the reference must be flat or every later generation inherits shading from it. |
| 3 | field_gun |
explicit | shield, carriage, trail, both wheel discs, all three ground contacts | the gun tube and its bore line | The tube emerges from the shield mass, and its 15° elevation is the whole cue separating artillery from anti-air (§4). As machinery it separates from the carriage at Close; it projects into void, so it reads by shape and never depends on contrast against a seat colour. |
| 4 | transport |
implicit | everything | — | A merchant hull is one slab of mass. The derricks already read against void, and nothing aboard is a different material in any way a player uses. |
| 5 | corvette |
implicit | everything | — | The shortest hull in the game at 76 px, and its cue is a count of one. There is no mass to spare. |
| 6 | militia |
implicit | everything | — | Its silhouette is a sandbag block, which is mass, and its rifle is 8 px wide — a shaded rifle is not an improvement, it is noise. The one foot unit fused to static works needs those works tinted or the fusion stops reading. |
| 7 | admin_cadre |
implicit | everything | — | Its cue is the absence of a diagonal (§4). A material break introduces exactly the edges the design exists to avoid. |
| 8 | forward_depot |
implicit | everything | — | No head, no legs, no weapon: the whole silhouette is stores. A drum is not distinguishable as a material at 128 px, only as a shape — a judgement made when the cell was half this size and worth re-testing (open question 16). |
| 8a | forward_depot__emplaced |
implicit | everything, canopy included | — | The canopy slab is the widest element and the top boundary of the wide-flat read that says emplaced. Untinting it takes the top off the mask. |
| 9 | fighter |
implicit | everything | — | 68 px span, no nacelles, and one canopy lozenge 8 × 6 px — still under the 12 px floor ART-080 of docs/art/00-art-direction.md sets for an interior shape (open question 16), and too small to read by shape, so it would fall back on contrast against a seat colour, which ART-240 forbids. |
| 10 | armour |
explicit | hull, glacis, turret, the whole track-band envelope, all five road wheels | the gun tube | The track band is the tracked-class footprint (ART-380) and must reach the baseline in seat colour, so it stays masked. The five road wheels stay masked deliberately: as seat-foreground discs in a seat-background band their contrast is guaranteed, whereas fixed gunmetal discs vanish the moment a seat picks a dark background — and the wheel count is the cue. Only the tube leaves the mask. |
| 11 | destroyer |
implicit | everything | — | Its lattice mast is thin seat-foreground lines with void between them. A third value there muddies the one feature separating it from a Corvette at Mid. |
| 12 | air_defence_battery |
implicit | everything, barrel cluster included | — | Unlike the Field Gun's, its four barrels are the dominant mass and not a projection: untinting them drops coverage below ART-215's floor and takes the top of the silhouette out of the ownership read. The radar panel alone is 12 × 16 px — a mask cell spent to say what the shape already says. |
| 13 | engineer |
implicit | everything, timber included | — | Tempting and rejected. The timber is an 80 px horizontal spanning the full painted width, so untinting it cuts the mask in half across the middle and removes the largest single contiguous feature from the ownership read. |
| 14 | landing_ship |
implicit | everything | — | The bow ramp is the same steel as the hull, it is the identity cue, and it reaches the waterline — the cell's lower boundary, which ART-215 requires the mask to hold. |
| 15 | heavy_artillery |
explicit | carriage, shield, trail, four wheels, weight mark | the gun tube, its bore line and its muzzle brake | The longest straight line in the land roster, and the muzzle brake is what separates it from the Field Gun (§4). Both are machinery, both project into void, and both gain from reading as a machined tube rather than a drawn line. |
| 16 | submarine |
implicit | everything | — | "Completely bare apart from the fin" is the design. There is nothing to untint here; the absence of detail is the silhouette. |
| 16a | submarine__submerged |
implicit | fin, periscope and the dashed hull outline | — | The one cell whose mask is deliberately discontinuous. The dashes must be tinted or a detected submarine has no owner — the most consequential ownership read in the naval game. Coverage is measured over opaque pixels only, so the gaps between dashes are void and do not count against ART-215. |
| 17 | bomber |
implicit | everything | — | Two nacelles on a straight wing are the counting cue, and ART-580 already names nacelles as the first thing reduction destroys. Any competing value on that wing competes with the count. |
| 18 | missile |
implicit | everything | — | 80 × 28 px of needle: the smallest painted area in the roster, and the one unit already exempted from ART-350's painted-height floor. It has no area to give away. |
| 19 | air_transport |
implicit | everything | — | Its two cues are fuselage width and a notch — a mass and a void. Neither is a material. |
| 20 | heavy_armour |
explicit | hull, glacis, turret, skirt plate, track-band envelope, all seven road wheels, weight mark | the gun tube and its muzzle brake | The same judgement as Armour, and the tube matters more here: at 44 px it is the length comparison that separates the two tanks, and as machinery it stops being confusable with the skirt-plate rule running above it. |
| 21 | heavy_bomber |
implicit | everything | — | The opposite reasoning from the Submarine's, arriving in the same place. This sprite has mass to spare, but its identity is a four-count of small marks on a very wide thin wing, and a second value anywhere on that wing is a competing signal on the roster's single most fragile cue. |
| 22 | cruiser |
implicit | everything | — | Nine barrels in three groups, plus a stepped tower: all fine marks whose legibility is contrast, not shape. ART-240 keeps those masked, where the seat pair guarantees contrast and a fixed material value cannot. |
| 23 | carrier |
implicit | everything | — | The deck is the silhouette, and the island is the only thing permitted to break it. Both must contrast; both stay masked. |
Three candidates the requirement explicitly frees up are declined across the whole roster, and the reasons are geometric rather than aesthetic. Wakes would have to sit below the waterline, which ART-330 forbids and which the live-box-wide rule at y = 100–103 exists to prevent. Cast shadow for airborne units is not authored art at all but a renderer transform of the sprite's own alpha (ART-480); it stays in the owner's background colour, because a second ownership signal at the tier where an aircraft is smallest is worth more than physical honesty about what colour a shadow is. Rotor discs have no subject — the roster contains no rotorcraft.
Rationale, recorded because this document previously carried the tone count as a law it had inherited rather than a choice it had made. The requirement it was following mandated two-tone art recoloured by palette substitution: a 1993 technique that exists because palette-indexed graphics gave you 256 colours and recolouring meant swapping reserved slots. On a GPU it buys nothing and discards shading, material and depth for no benefit. What it was protecting is real, and ART-215 keeps it. What it was costing was the ability to say "this is a gun tube, and it is made of steel, and the vehicle it is bolted to is painted in your colours" — which is one sentence of information the old rule could not express at any price.
Rationale for the shape of the answer, which is 21 base-only cells and 4 carrying a single untinted element. Freedom is not an instruction, and this lands where docs/art/00-art-direction.md open question 8 says it expects to land: most units should not take a layer. Nineteen of these subjects are small, sparse, or built entirely out of counting cues, and for them "base only" is the honest answer and the strongest possible response to UX-440's Chip-tier outcome, because the whole shape changes colour with the owner. The four that differ share exactly one feature — a gun tube projecting into clear space — which is why they get one rule rather than four exceptions. That element is large, it reads by shape against void rather than by contrast against a seat colour, it is load-bearing in three separate rows of §4's confusable-pair table, and it is the one place in this roster where "machinery, not livery" is a distinction a player actually uses.
Two of the three cases that document names as having "a real argument" are declined here on the evidence of the specific sprite, and the reasoning is in the register rows: a tracked hull's track band must stay in the base because it is the class footprint of ART-380 and the bottom boundary ART-215 requires, and its road wheels must stay there because their contrast is what makes the count survive an arbitrary seat palette; an aircraft canopy is 8 × 6 px on the Fighter and would read by contrast rather than shape. The third — a submarine's waterline — is declined for the whole naval family under ART-215.3, and the reason is worth stating plainly: the waterline is the widest ownership signal a sea unit has, and spending it on material is spending the asset to buy the decoration.
Whether those four tubes can be drawn with a layer at all was a live question until D-7 of docs/art/04-decisions.md, and for one revision this document's own arithmetic said they could not: an 8 px contour down both sides plus a 12 px minimum detail region between them puts the floor at a 28 px barrel. That floor applied an area test to a linear feature. ART-445 carries the geometry that replaces it and checks all four cells against it; each one clears it, and heavy_armour clears it only at the thickness ART-445 names.
The companion detail atlas those four cells cost is real and is named as such in §12. Whether four barrels justify it is a separate, still-open question — open question 11 here and open question 9 of docs/art/00-art-direction.md, which asks for the same measurement from the other side; the answer if they do not is to move those four to implicit, which costs this document one column of one table and nothing else.
ART-250 No unit sprite MAY contain text, numerals, letterforms, national markings, flags, or heraldry.
Rationale: text is the single thing image generators are worst at, it does not survive reduction to 128 pixels, it cannot be localised, and every quantity a player needs is already carried by an overlay badge composited from a real glyph atlas. The Chip tier does bear a two-letter label — and it is composited, never generated (§10).
ART-260 Unit art MUST NOT encode ownership itself: no cell, masked region or untinted region may contain a colour, a pattern, or a device that differs per seat. Ownership arrives entirely from the substitution pass.
Rationale, sharpened now that a cell may legally hold colour the substitution never touches: the detail layer is the obvious place to smuggle in a per-seat marking, and it must not become one. There is exactly one gun-tube colour (ART-245.2) and every seat's units are drawn with it.
ART-270 Unit art MUST NOT encode any value that changes during play — damage, veterancy, supply, stance, posture, dig-in depth, cargo, endurance. Those are overlays (§5).
ART-280 Idle animation at the Close tier (UX-390) MUST be produced by procedural transform, not by frame art: air units bob 4 px on a 1.6 s sine, sea units translate 2 px horizontally on a 2.4 s sine, land units do not animate. Both figures are cell pixels in the 128 px Close cell and are the amplitudes the 64 px figures they replace described. There MUST NOT be per-unit animation frames in the shipped atlas.
Rationale: twenty-three units at four frames each is ninety-two cells that an image generator cannot keep consistent frame to frame — inter-frame jitter is the thing these models are worst at after text. A 4-pixel sine costs nothing, is perfectly consistent, and reads as "alive" at exactly the zoom where the player is looking closely. Motion that carries no information does not deserve an asset budget.
2. Cell geometry, safe areas, and reserves
The Close tier tile is 32 CSS px (docs/spec/04-ui-ux.md, LOD budget table under UX-390). The delivered cell must survive the highest device pixel ratio the client re-renders for, which UX-385 puts at 3 — so 32 × 3 = 96 device pixels at zoom 1.0, and the cell must be the next power of two above that.
ART-290 The Close-tier unit cell MUST be 128 × 128 px. The Mid-tier cell MUST be 64 × 64 px. Chip and Strategic assets are specified in §10 and §11 and are not sprites.
Rationale, and a correction. An earlier draft of this requirement specified a 64 px Close cell, derived from a 1:1 device-pixel match at DPR 2. That derivation is wrong because it stops at DPR 2: on a DPR-3 phone a 64 px cell is upscaled to fill 96 device pixels and is visibly soft, and it leaves no zoom headroom at all at the tier whose whole purpose is close inspection. 128 is the next power of two above 96, which buys 1.33× zoom at DPR 3 and 2.0× at DPR 2 before the sprite is being enlarged, and it halves exactly to 64 / 32 / 16 for the four tiers of UX-390. This document now agrees with docs/art/00-art-direction.md, which derived 128 correctly; where the two disagreed, the foundation was right and this document was the error. Re-cutting a sprite generated under the old figure costs one re-derivation and no regeneration, because §12.1 keeps the accepted 1024 px take.
*A correction to that last clause, because it cited the wrong requirement and the mistake is now
expensive. This rationale used to say the 512 px master "was kept, which ART-580 already requires".
ART-580 requires no such thing — it specifies the hand pass — and §7.1's ladder does not produce a
512 px master at all: it goes 1024 → ~4× intermediate → the 88 × 80 painted box → the 128 px cell.
The requirement that governs the 512 px master is ART-280 of docs/art/00-art-direction.md, which
now also states the one thing this document's ladder makes tempting and which is forbidden: a
512 px master MUST NOT be produced by upscaling the 128 px cell. It is re-rendered from the source
that constructed the sprite, or reduced from the accepted 1024 px take that §12.1 keeps — and where
neither is available, the 128 px cell is the artwork of record and art/README.md names that sprite.
See note 1 under §12.1.*
ART-300 Every Close-tier cell MUST respect the following division of the art box, which is ART-340 of docs/art/00-art-direction.md adopted unchanged rather than re-derived at this document's grid. All coordinates are in the 128 px art box, origin top-left.
x0 x8 x44 x84 x120 x127
y0 +-----------------------------------------------------------+
| F R A M E B A N D |
y8 | +--------+ +--------+ |
| | COND | usable: masts, | STANCE | |
| | BADGE | antennas, periscopes | GLYPH | |
| | 36x36 | (no ink above y = 24) | 36x36 | |
y44 | +--------+ +---------------------+ +--------+ |
| | | |
| | IDENTITY CORE | |
| | 64 x 64 | |
| | | |
y84 | +--------+ +---------------------+ +--------+ |
| | SUPPLY | usable: dig-in berm |POSTURE | |
| | MARK | | GLYPH | |
| | 36x36 | | 36x36 | |
y120 | +--------+ +--------+ |
| F R A M E B A N D |
y127 +-----------------------------------------------------------+
naval waterline .......... y = 100-103, INK rule across x = 8-119 (ART-330)
land baseline ............ y = 104, the lowest ink pixel (ART-320)
air band ................. y = 24-80, nothing at or below y = 88 (ART-340)
tallest permitted ink .... y = 24
ground unit max width .... 88 px, centred on x = 64
naval unit max width ..... 112 px, the full live box
| Region | Extent | Rule for art |
|---|---|---|
| Frame band | outer 8 px on all four sides | Art MUST NOT enter it at all. Reserved for the encirclement bracket and the out-of-supply hatch (ART-310), the only two full-cell marks. |
| Live box | (8,8)–(120,120), 112 × 112 | Art lives here. |
| Corner reservations | four 36 × 36 squares at the corners of the live box | Art MAY extend into them — a mast, an antenna, a trail spade — but MUST NOT place anything load-bearing there. The gate is the occlusion test of ART-610, not the verifier. |
| Identity core | (32,32)–(96,96), 64 × 64 | The feature that distinguishes this unit from every other unit in the roster MUST fall inside this box. |
ART-305 Corner assignment is ART-350 of docs/art/00-art-direction.md: top-left the composite condition badge (UX-1125); top-right the Stance glyph; bottom-right the Posture glyph and Idle mark; bottom-left supply grade and whichever secondary marks of UX-430 the client surfaces on the map.
Rationale for adopting the foundation's rectangles rather than doubling this document's, which would have produced a second set of numbers that nearly agree — the worst available outcome. Doubling the old 16 × 16 reserves gives 32 × 32; the foundation says 36 × 36, and the foundation is the document the client's badge geometry is written against. Two substantive things came with adopting, and both are improvements. The condition badge and the Stance glyph swap corners: condition is now top-left, which is where UX-430's priority ordering and ordinary reading order put it. And the corners stop being a hard transparent reserve and become a "nothing load-bearing here" reserve, which is what lets a Destroyer's lattice mast and a Scout's antenna occupy the top of the cell at all. The old fully-transparent rule was affordable at 16 × 16 and is not at 36 × 36 — four 36 × 36 voids would take 41% of the live box.
ART-310 Encirclement and out-of-supply marks are full-cell overlays — a hatch and a broken ring — and therefore claim no reserve. They sit above the sprite in the priority order the ground truth fixes: encircled, out of supply, condition, Stance, Posture.
ART-320 Land units MUST place every ground-contact pixel on the land baseline, y = 104, and MUST NOT paint any pixel below it. That row is ART-340 of docs/art/00-art-direction.md's ground baseline, adopted, not this document's y = 52 doubled — the two agree, and the citation is the point.
ART-330 Sea units MUST paint a waterline: an INK rule 4 px tall at y = 100–103, running the full width of the live box, x = 8–119, with no margin inside it. The hull MUST be cut off flat at y = 100. No sea unit MAY paint below y = 103.
Rationale for the waterline stopping at the live box rather than bleeding to the cell edge, which is the one place adopting the foundation cost this document something real. ART-300's frame band is reserved for the two full-cell overlay marks and art may not enter it, so "edge to edge with no margin" is no longer available. What that was buying — a rule crossing the whole tile, so that two adjacent enemy ships differ in colour right across it — survives almost intact: the rule still runs 112 of the cell's 128 pixels, the 8 px it gives up at each end is transparent overlay reserve rather than visible terrain, and the three-footprint class cue below is unchanged.
ART-340 Air units MUST fit entirely within y = 24–80 and MUST paint nothing at or below y = 88. The upper limit is ART-340 of docs/art/00-art-direction.md's "tallest permitted body", which is 8 px lower than doubling this document's old y = 8 would have given; the lower limit is that doubling, and it leaves 40 px of clear air beneath the sprite.
Rationale for ART-320/330/340 together: this is the class cue, and it is the only one that survives a crowded stack, a bad seat palette, and a player who has been at it for four hours. A rule crossing the whole cell is a ship. Contact at the baseline with clear space above is a land unit. A shape floating with clear space below it is an aircraft. Three footprints, distinguishable in peripheral vision, before the eye resolves a single detail. Every other cue in this document is refinement on top of these three.
ART-350 The bounding box of painted pixels in any Close cell MUST be at least 68 px wide and 32 px tall, and MUST NOT exceed the maximum ART-340 of docs/art/00-art-direction.md sets for its domain:
| Domain | Max painted width | Max painted height | Where the height comes from |
|---|---|---|---|
land — foot, wheeled, tracked |
88 | 80 | y = 24 down to the baseline at y = 104 |
sea — naval |
112 | 76 | y = 24 down to the waterline at y = 100 |
| air | 112 | 56 | the air band of ART-340, y = 24–80 |
A unit that does not fill its cell reads as unimportant; a unit that overflows it collides with its neighbours in a stack.
The Missile is exempt from the 32 px painted-height floor by ART-800 — its span is 28 px —
and from nothing else; its 80 px length has always cleared the width floor. ART-590's verifier
carries that exemption as a named per-unit table, not as a loosened constant, so a conforming
Missile at 108 × 28 passes while any other unit at that height still fails.
Note, because doubling would have got this wrong in both directions. The 68 px floor is this document's old 34 px doubled — the foundation sets no floor, so there was nothing to adopt. The ceilings are not doubled: the foundation caps a ground unit at 88 px and a naval unit at 112 px, and doubling the old 60 px maximum would have given 120 px, which is wider than the live box. That matters more than it looks. The old ceiling was 94% of a 64 px cell; the adopted ground ceiling is 69% of a 128 px one, so the land units that used to run nearly cell-wide — Heavy Artillery, Heavy Armour, the emplaced Forward Depot — are proportionally narrower than they were, and the size ladders of ART-390 are compressed at the top. §8 carries the compressed figures; open question 16 carries the consequence.
3. The silhouette language
At 128 px a unit is recognised by its outline, and ART-230 makes that the first channel regardless of how many values the cell holds. The language below is deliberate and closed: a new unit joins a family, it does not invent one.
3.1 Orientation, and why nothing rotates
ART-360 Land and sea units MUST be drawn in orthographic side elevation, camera exactly level with the subject, facing screen right. Air units MUST be drawn in orthographic plan view from directly overhead, nose screen right.
Rationale: the split is not inconsistency, it is the class cue doing double duty. An aeroplane in side elevation is a thin tube with a fin — a poor 64-pixel silhouette that reads like a missile, a boat, or nothing. From above it is a wing planform, the most distinctive shape in the roster and the way aircraft are actually recognised. And because air units are the only plan-view sprites in the game, "I am looking down on this one" is itself an instant statement that the thing is in the sky.
ART-370 Unit sprites MUST NOT rotate with heading, and MUST NOT be mirrored per facing at runtime. Every unit of every player faces right, always.
Rationale: rotation destroys the footprint conventions of §2 — a rotated ship has no horizontal waterline and a rotated tank has no baseline — and it turns the badge reserves into a moving target. Direction of travel is already carried by the order path and by the intent arrow of the Command View (UX-395), which is where a player looks for it. Mirroring is worse than rotation: it makes two of the same unit in one stack look like two different units.
3.2 The five movement-class footprints
terrainClass (US-120) is the silhouette family. There are five, and they are drawn differently below the shoulder line.
| Class | Domain | Footprint rule | Reads as |
|---|---|---|---|
foot |
land | Upright figures, or a legless pile. Contact at y = 104 is two or more separated points with void between them. Taller than wide. | Legs and gaps |
wheeled |
land | Chassis carried on circular INK wheels, 12–20 px diameter, void visible between and under the axles. | Circles at the baseline |
tracked |
land | Chassis on a continuous running-gear band 16 px tall with INK road wheels inside it. No void under the vehicle at all. | An unbroken bar at the baseline |
naval |
sea | Hull cut flat at the waterline; live-box-wide foreground rule at y = 100–103. | A line across the cell |
air |
air | Plan-view planform, floating, nothing at or below y = 88. | A wing shape in clear air |
ART-380 The foot/wheeled/tracked distinction MUST be legible at the Mid tier (64 × 64), where it reduces to: gaps under the unit, circles under the unit, a solid bar under the unit. US-170 requires these three classes to behave differently on at least three terrain types; a player cannot exploit that if they cannot see which class a unit is.
3.3 Size and weight as rank cues
ART-390 Within a movement class, painted width MUST increase monotonically with the unit's Works cost band. A heavier sibling MUST be at least 12 px wider and, where the family permits, 6 px taller than its lighter counterpart.
ART-400 Units whose name begins "Heavy" MUST additionally carry a weight mark: an INK rule 4 px tall whose lower edge is inset 12 px from the lower edge of the unit's own mass, running at least half the unit's painted width. The 12 px is derived, not doubled: 8 px of closed contour (ART-435) plus the 4 px minimum clearance ART-080 of docs/art/00-art-direction.md requires between an ink shape and the contour. Heavy Artillery, Heavy Armour and Heavy Bomber carry it; nothing else does.
Rationale: size alone is a comparative cue, and comparison needs two units on screen at once — exactly what a fog-of-war game will not give you. The weight mark is absolute: one glance at one sprite says "this is the expensive version". It is also the cue that survives to the Chip tier unchanged (§10), which is where Armour and Heavy Armour are otherwise two letters apart.
3.4 Counting cues
Where a family has more than three members, it gets a counting cue — a repeated element whose number is the rank. Counting cues are the strongest device available inside a mask because they need neither comparison nor colour, only contrast, which the seat pair guarantees.
| Family | Counting cue | Values |
|---|---|---|
| Surface warships | Gun turrets | Corvette 1 · Destroyer 2 · Cruiser 3 |
| Fixed-wing strike | Engine nacelles | Fighter 0 visible · Bomber 2 · Heavy Bomber 4 |
| Tracked | Road wheels in the track band | Armour 5 · Heavy Armour 7 |
ART-410 The counting cues above MUST be exact. A Destroyer with three turrets is a defect, not a variation. Every counting cue MUST be drawn in INK and MUST NOT be moved to the untinted detail layer (ART-240): a count is read by contrast before it is read by shape, and only the seat pair guarantees contrast.
A counting cue costs one shape against the interior cap, not one per element. ART-080 of docs/art/00-art-direction.md caps a sprite's interior at four ink shapes and exempts a repeated identity group, counting the whole run as one semantic feature — so Armour's five road wheels are one mark against that cap and Heavy Armour's seven are one mark. The exemption is conditional, and the conditions are the ones this section already implies: the elements MUST be uniform in size and shape, evenly spaced, and aligned on a common axis, and the run MUST survive reduction to 8 CSS px as a band of regular repetition rather than as noise. A row that fails any of the four is not a counting cue — it is four or five separate marks and it counts as four or five. This is what closes the conflict open question 13 carried, and it closes it in this document's favour: the cue is what the cap has to make room for, not the other way round.
3.5 Non-combatant marks
ART-420 A unit with atkLand, atkSea and atkAir all zero — Transport, Administrative Cadre, Forward Depot, Air Transport, Carrier — MUST NOT carry any barrel, muzzle, turret or gun form in its silhouette. Nothing in a non-combatant's outline may read as a weapon.
Rationale: US-240 makes a zero absolute — the unit literally cannot initiate combat in that domain. A player who sees a gun on a Transport and hesitates for half a second before attacking it has been lied to by the art. This is cheap to honour and expensive to get wrong.
ART-430 A unit that can capture a city (capture: Scout, Infantry, Armour, Engineer, Heavy Armour) MAY be marked by the sibling overlay document; it MUST NOT be marked in the sprite. Rationale: capture is a rules fact, not a shape, and ART-270 forbids rules facts in sprites.
3.6 Stroke minimums
ART-435 Every silhouette MUST carry a closed ink contour around its entire outer boundary, unbroken. This is ART-050 of docs/art/00-art-direction.md adopted: 8 px in the delivered 128 px Close cell — 2 CSS px, and 32 px at the 512 px authoring master — and 4 px in the 64 px Mid cell (ART-880). The contour is INK (ART-240), it lives in the base and never in the detail layer, and no detail region MAY be authored on it or across it (ART-225 of 00-art-direction.md).
The weight is uniform with one permitted variation, and the closure has one exception. They are different things and neither implies the other.
- Weight. A narrow linear projection — a gun tube, and nothing else in this roster — MAY carry a 2 px contour on each exposed side instead of 8, under ART-158 of
docs/art/00-art-direction.mdand subject to ART-445 here. The contour there is narrower and still closed. It returns to 8 px where the projection meets the mass it projects from. - Closure. There is exactly one exception in the roster, and it is the cell that already breaks ART-330:
submarine__submerged's below-waterline hull is a deliberately dashed outline (ART-247 #16a, §8.4.5) and MUST NOT be closed into a continuous one. The fin and periscope standing above the waterline carry a normal closed 8 px contour like every other silhouette. ART-590 exempts that one file by name.
Rationale, inherited rather than re-argued: a seat's background colour can land arbitrarily close to the terrain beneath it, and a player may re-map it mid-game (UX-210, UX-1310), so a band drawn in the seat's other colour around the whole silhouette is the only thing that guarantees the unit separates from the map. It is also what makes ART-210's bleed rule exact rather than approximate — every pixel at the silhouette boundary is known to be ink, so flooding outward with INK continues the artwork instead of guessing at it. ART-210 has always assumed this; until this revision the requirement it was assuming lived only in the other document.
Note on what the contour costs the four explicit cells, rewritten because the version this document carried was arithmetically fatal and is now withdrawn. It said: a gun tube is bounded by the contour on both sides, so the untinted region inside it is the tube's thickness minus 16 px, and ART-155 rule 4 of 00-art-direction.md requires a detail region to be at least 12 px in its smaller dimension — so a tube must be at least 28 px thick to carry a detail layer at all, "which is thicker than any barrel in this roster is drawn or should be". That was correct arithmetic on the wrong test. It made all four of this roster's detail layers impossible, and it did so as a side effect rather than as anybody's judgement. D-7 of docs/art/04-decisions.md settles it: the 12 px floor is a test for an area feature, a gun tube is a linear one, and a linear feature is measured on width, length and aspect together. ART-445 below is the roster-side statement and checks all four tubes. The tube is still contoured on both sides and the contour is still the constraint that bites — it is now 2 px a side rather than 8, and the tube must be at least 8 px thick overall, which is ART-440's floor and not a new one.
ART-440 No part of a silhouette in a Close cell MAY be thinner than 8 px — the floor of ART-040 of docs/art/00-art-direction.md. Every interior ink stroke MUST be 4 to 8 px wide (ART-080 there). Antennas, periscopes, masts and missile fins are not exempt: they are 8 px wide and MUST be at least 16 px long.
An 8 px feature is normally contour and nothing else, because the contour is 8 px and there is nothing left over. The single exception is a narrow linear projection under ART-445, where the contour is 2 px a side and an 8 px projection is 2 px of contour, 4 px of authored detail, and 2 px of contour. The floor itself does not move: 8 px is 8 px, and this requirement is what ART-158 of docs/art/00-art-direction.md bounds its exception against rather than something that exception relaxes.
Rationale for withdrawing the 1 px exception this requirement used to grant, rather than doubling it to 2 px. At the 128 px cell a 2 px feature is half a CSS pixel and is not drawn at all — the exception was written when 1 px was already half a CSS pixel, so it was describing something invisible then too. 8 px is 2 CSS px, which is what a whip antenna has to be to survive ART-880's halving into the Mid cell and the minification below it that ART-595 measures. The Scout's antenna gets wider and longer and reads better for it.
ART-445 A gun tube is the only narrow linear projection in this roster, and it is the only feature here entitled to ART-158 of docs/art/00-art-direction.md's narrower contour. Every tube carrying a detail layer MUST satisfy all of:
- Total silhouette thickness at least 8 px. That is ART-440's floor, applying to a tube exactly as it applies to everything else — the exception does not reach under it.
- Contour 2 px on each exposed side (ART-435), returning to 8 px where the tube meets the shield, mantlet or turret face.
- Visible detail width at least 4 px, being the authored colour left between those contours.
- Exposed run at least 24 px, measured from the face it emerges from to the muzzle.
- Aspect at least 4 : 1, run to visible width. This is the test a thick tube fails, not a thin one, and it is the one to compute rather than assume.
The muzzle brake on Heavy Artillery and Heavy Armour is part of the same projection and takes the same 2 px contour, but it is an area feature and is measured as one: its detail region MUST clear 12 px in its smaller dimension (ART-155 rule 4 of 00-art-direction.md), so the brake block MUST be at least 16 px in its smaller dimension overall. Measure the tube run as linear and the brake as area; both must pass on their own terms.
The bore line is not a separate detail region and ART-159 of docs/art/00-art-direction.md does not reach it. It is the value break ART-245.3 requires within the tube's authored colour — a darker body and a lighter upper edge — carried in the RGB of one continuous alpha region, not a mark drawn on a surface. It is measured as part of the tube and never on its own.
Before the first explicit cell is accepted, its 2 px contour MUST be reviewed at DPR 1, DPR 2 and DPR 3, over the lightest and the darkest terrain base colours of docs/art/02-terrain.md, as an explicit item in the legibility contact sheet of ART-1170 of docs/art/02-terrain.md — the sheet that document already requires be run with the most internally detailed unit sprite the set ships, which is now by definition one of these four. This is a named risk, not a solved problem. A 2 px contour is 0.5 CSS px at Close, which is half a device pixel at DPR 1, one at DPR 2 and one and a half at DPR 3; at DPR 1 the ink edge may alias away and leave the tube's authored steel floating on the terrain with nothing separating it from it. Nobody has looked at this yet. Look at it on sprite one, not on sprite twenty-six — and if it fails, the fixes are to thicken the tube until its contour can be wider, or to let the detail atlas be dropped on that target, which ART-125 of docs/art/00-art-direction.md already provides for and which ART-200 here already says leaves a fully owned, fully identifiable unit.
The four explicit cells checked against this, because the whole point of the exercise was that they previously could not be drawn:
| Cell | Exposed run | Drawn thickness | Visible detail | Aspect | Verdict |
|---|---|---|---|---|---|
field_gun |
≥ 24 px — pinned here; §8.1.3 states no barrel length | 8 px | 4 px | ≥ 6.0 : 1 | Passes, sitting on the floor of every test. The tightest cell in the set |
armour |
36 px (§7.4 of 00-art-direction.md) |
12 px | 8 px | 4.5 : 1 | Passes with margin |
heavy_artillery |
≥ 52 px (§8.4.4) | 16 px | 12 px | ≥ 4.3 : 1 | Passes. Brake at ≥ 20 px clears the area floor |
heavy_armour |
≥ 44 px (§8.5.3) | 12 px | 8 px | ≥ 5.5 : 1 | Passes at 12 px — and would fail at 16 px, where 44 : 12 is 3.7 : 1. Brake at ≥ 16 px clears the area floor |
All four clear the 8 px thickness floor, and they clear it trivially: ART-440 already forbids any part of any silhouette from being thinner than 8 px, so no tube in this roster could have been thinner than the exception's minimum even before the exception existed. The thickness column is the first statement of tube thickness anywhere in this document — §8 gives barrel lengths and adjectives ("slim", "much thicker", "very long") and no widths at all — so those four figures are new here and are what the hand pass sets.
Two results in that table are worth reading rather than skimming.
Heavy Armour is the reason rule 5 exists. Its 44 px gun invites a 16 px thickness to match the vehicle's bulk. At 16 px the visible detail is 12 px and the aspect is 44 : 12 = 3.7 : 1, which fails rule 5 — and a region that is not linear detail is not entitled to ART-158's narrower contour either, so the tube falls all the way back to an 8 px contour a side and the 12 px area floor, which is 28 px of thickness and precisely the dead end D-7 was decided to escape. Drawn at 12 px the aspect is 5.5 : 1, it qualifies cleanly, and it is a better-looking gun. The aspect test is not decoration; it is the rule that decides this cell, and it decides it against the thickness a draughtsman would have reached for.
Field Gun is the cell to watch. At the 8 px floor its tube is 2 + 4 + 2, and the ART-245.3 value break has 4 px to live in — one pixel of lighter upper edge over three of body. That is legal and it is thin. It is also the sprite to put through ART-158's DPR check first, because it is simultaneously at the contour floor, the width floor and the value-break floor, and if the 2 px contour aliases away anywhere it will do it here. §8.1.3's silhouette concept calls the barrel "slim", which is the design and is not being argued with — but if the DPR check fails, this is the tube to thicken.
ART-450 No void gap inside a silhouette — between two figures' legs, between two helmet domes, between splayed barrels, inside a cut-out — MAY be narrower than 12 px. That is ART-060 of docs/art/00-art-direction.md: a concavity narrower than 12 px MUST be closed up, and a gap the eye is meant to count is a concavity. Separately, every gap between two ink shapes, and between an ink shape and the contour, MUST be at least 4 px (ART-080 there).
Rationale for 12 rather than the 4 that doubling this document's old 2 px would have given. The two numbers measure different things and both are needed. 4 px is an ink-to-ink clearance inside the mass, where the surrounding FIELD holds the marks apart. 12 px is a hole in the outline, and a hole has to survive the halving to Mid and then the minification toward the Chip threshold — a 4 px notch between two helmet domes is 2 px at Mid and gone below it, which is exactly the "two figures turn into one blob" failure this requirement exists to stop.
4. Confusable pairs — the cue that separates them
This table is normative, and it is also the review checklist. When a sprite comes back from the generator the question is not "is it good", it is "does it carry the cue in this row".
| Pair / set | The problem | Distinguishing cue (MUST be present) |
|---|---|---|
| Infantry / Militia | Both foot, both rifles | Infantry is two helmeted figures with no emplacement. Militia is one figure in a soft cap fused to a sandbag block filling the lower third — the only foot unit whose silhouette includes static works. |
| Infantry / Engineer | Both foot, both helmeted | Engineer carries a horizontal timber baulk spanning the full painted width at shoulder height, plus a shovel head above the shoulder. Infantry has no horizontal element above y = 60. |
| Infantry / Administrative Cadre | Both two-figure foot groups | Cadre figures are bare-headed, weaponless, in long flared coats, and the silhouette contains no straight diagonal line at all. Infantry has a diagonal rifle line on every figure. |
| Militia / Forward Depot | Both include a static mass at the base | Forward Depot has no head and no legs whatsoever — it is a pile under a canopy. Militia has exactly one head above the sandbags. |
| Scout / Infantry | Both foot with a weapon | Scout is one crouched figure with an 8 px whip antenna rising 24 px above the head, and is the narrowest foot silhouette in the game. |
| Corvette / Destroyer / Cruiser | Three warships in the same ink | Count the turrets: 1 / 2 / 3. Reinforced by hull length 76 / 96 / 108 px, funnel count 1 / 1 / 2, and mast form pole / lattice / stepped tower. |
| Transport / Landing Ship | Both blunt unarmed hulls | Landing Ship has a bow ramp lowered forward as a 30° diagonal breaking the waterline rule. Transport has a vertical blunt bow and two diagonal derrick booms from an amidships mast. |
| Destroyer / Submarine (surfaced) | Both long low hulls | Submarine has no funnel, no mast, no turret — a rounded whaleback with a single fin. If it has anything on deck but one fin, it is not a submarine. |
| Armour / Heavy Armour | Both tracked and turreted | 5 vs 7 road wheels, plus the weight mark (ART-400), plus at least 12 px extra length and a side skirt plate over the track run on Heavy Armour. |
| Field Gun / Heavy Artillery | Both wheeled towed guns | 2 vs 4 wheels; barrel elevation 15° vs 25°; Heavy Artillery has a blocky muzzle brake at the barrel tip and the weight mark. |
| Field Gun / Air Defence Battery | Both wheeled mounts | ADB's barrels are near-vertical (≈70°) and there are four of them clustered, plus a flat rectangular radar panel. A gun pointing at the sky is anti-air; a gun pointing along the ground is artillery. |
| Bomber / Heavy Bomber | Both plan-view multi-engine | 2 vs 4 nacelles; span 96 vs 112 px; plus the weight mark on Heavy Bomber. |
| Bomber / Air Transport | Both twin-nacelle straight wings | Air Transport's fuselage is at least 30% of its span in width — the fattest body in the game — and its tail is squared off with a ramp notch cut into it. Bomber's fuselage is slim and its tail comes to a point. |
| Fighter / Missile | Both small plan-view shapes | Missile is a needle: span under 32 px, no wing area, four cruciform tail fins. Fighter has a real swept wing with span 68 px. If it has a wing, it is a Fighter. |
| Carrier / Cruiser | Both large hulls | Carrier's deck is one unbroken flat plane overhanging bow and stern, with zero turrets and a small island offset right. A turret on a flight deck is a defect. |
5. State variants — art versus overlay
Art is expensive and inconsistent across separate generations. Overlays are cheap, perfectly consistent, and composited by the engine. The split is not a matter of taste.
ART-460 A state MUST receive distinct art if and only if it changes the unit's silhouette or pose. Every other state MUST be an overlay.
ART-470 A state that must remain readable at the Mid tier MUST be an overlay, not art, unless it already qualifies under ART-460.
Rationale: at the 64 px Mid cell a pose change of a few pixels is invisible, whereas a 20 px badge in a reserved corner is not. Encoding a Mid-tier-critical state as art means paying for an asset that stops working at exactly the zoom where the player most needs it.
ART-480 The state disposition MUST be exactly:
| State | Source | Disposition | Why |
|---|---|---|---|
Damaged / condition (strength, disorder) |
UX-1125, UX-430 | Overlay — the single composite condition badge, plus one shared 4-step damage decal mask applied over the sprite | UX-1125 requires one composite badge and forbids two raw numbers; per-unit damaged art would compete with it and cost 23 extra cells to say something the badge already says |
Dug in (digIn 0–4), established entrenchment |
UX-430 | Overlay — one shared berm in the owner's background colour, drawn behind and below the sprite, growing in 4 steps, land units only | The berm is the same berm for every unit; that is why ART-320's fixed baseline is normative |
| Shaken | UX-430 | Overlay | A fact, not a shape |
| Loaded (carrier showing cargo aboard) | UX-430 | Overlay — cargo pips | The cargo itself is never drawn: US-320 says only the carrier occupies the tile, US-330 says cargo cannot be attacked independently |
| Embarked (the cargo unit itself) | US-320, US-330 | Not rendered at all | It is inside the hold |
| Submerged (Submarine) | US-1530, submerged |
DISTINCT ART — submarine__submerged |
The silhouette changes almost completely: a whaleback hull becomes a fin and a periscope. It is also the most consequential state in the naval game, and it is a state of the unit, not a fact about it |
| Emplaced (Forward Depot) | US-1440, emplace |
DISTINCT ART — forward_depot__emplaced |
emplace costs a turn; the player is buying a visibly different object. Packed bundle becomes spread stores under a raised canopy behind a revetment |
| Grounded vs airborne (air units) | UX-390, UX-430 | Overlay + transform — airborne draws the sprite offset −6 px in y with its own alpha redrawn at y+6 in the owner's background colour at 40% as a shadow; grounded draws at the baseline with no shadow | The aeroplane looks identical from above whether parked or flying. What changes is altitude — a translation and a shadow, both derivable from the sprite itself for zero extra cells. The shadow stays in the owner's colour rather than a neutral grey, which UX-440 would now permit: a second ownership signal at the tier where an aircraft is smallest beats physical honesty about what colour a shadow is (ART-247) |
| Out of supply | Ground-truth overlay list | Overlay — full-cell mark, second in priority | Applies to every unit identically |
| Encircled | UX-1135 | Overlay — full-cell mark, first in priority | Applies to every unit identically |
| Grade / veterancy | UX-430 | Overlay — rank mark | A fact |
| Forming Up (age 0–3) | UX-430 | Overlay — expiring mark | A fact |
| Reaction armed / spent | UX-430 | Overlay | A fact |
| Air endurance remaining | UX-430 | Overlay — countdown mark | A fact |
| Banked movement | UX-430 | Overlay | A fact |
| Stance, Posture | UX-430 | Overlay — glyphs in the TL and BR reserves | A fact |
ART-490 The unit art set therefore contains 25 Close-tier cells: 23 base units plus submarine__submerged and forward_depot__emplaced. Any proposal for a 26th MUST be justified against ART-460 in writing.
Rationale for the whole split: the naive version of this spec has damaged art, entrenched art, loaded art and grounded art for every unit — 23 × 5 = 115 cells that an image generator cannot keep stylistically consistent across five separate sessions, that cost five times the review effort, and that produce a muddier picture than a badge does, because at 128 px "slightly more dented" is not a readable difference and "there is a mark in the corner" is. Two variants earn their place because in both cases the object genuinely became a different object.
6. The prompt template
This is the mechanism that keeps twenty-five separately generated images looking like one game. Everything above the SUBJECT line and everything below UNTINTED DETAIL is invariant and MUST be pasted unchanged.
The generator still never shades anything. State that flatly, because UX-440 changed and this did not. A cell may now hold a material value the substitution pass leaves alone (ART-245) — but that value is chosen by the artist in the hand pass, from a palette of two, against a known set of terrain grounds. It is not a value an image model may invent, and every anti-shading clause in the NEGATIVE stanza below therefore stays exactly as it was. What the model is asked for is flat regions with hard edges; the untinted region is asked for as a third flat reserved ink precisely so that it can be separated mechanically (ART-565) and coloured deliberately afterwards. The freedom UX-440 restored is a freedom the artist exercises, not the generator.
ART-500 Every per-unit prompt in §8 MUST be the template below with only SUBJECT, SILHOUETTE, INTERIOR MARKS and UNTINTED DETAIL substituted, and with the COLOUR stanza in whichever of ART-515's two forms the cell's convention requires. A prompt that alters the VIEW, LIGHTING, FRAMING, STYLE, NEGATIVE or OUTPUT stanza is out of contract and its output MUST be rejected.
ART-510 There are three template variants, selected by movement class: LAND (foot, wheeled, tracked), SEA (naval), AIR (air). They differ only in the VIEW and FRAMING stanzas.
ART-515 The COLOUR stanza and the UNTINTED DETAIL line MUST agree with the cell's row in ART-247:
| Convention | COLOUR stanza | UNTINTED DETAIL: line |
|---|---|---|
| Implicit — 21 cells | COLOUR-FLAT |
none. Every part of the subject is one of the two inks. |
| Explicit — 4 cells | COLOUR-DETAIL |
the features from ART-247's Untinted column, named exactly and named nowhere else in the prompt |
COLOUR-FLAT: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
COLOUR-DETAIL: exactly three ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named in INTERIOR MARKS. Solid pure cyan (#00FFFF) for the shapes named in UNTINTED DETAIL and for nothing else at all. Flat pure magenta (#FF00FF) everywhere else. Each ink is one flat solid area of one single colour with a hard edge. No fourth colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
The cyan is a placeholder and never ships: ART-565 keys it out to derive the mask, and the hand pass fills that region with ART-245's two values.
Rationale for cyan specifically, and it is the same argument that picked magenta in ART-560 but stronger. Cyan is the only one of the three inks whose red channel is low while green and blue are high. Every grey an image model leaks along a black-to-white edge has R = G = B. No leaked grey can therefore be mistaken for cyan, and no cyan pixel can be mistaken for a leaked grey, so the separation is exact rather than fuzzy — which matters far more here than at the chroma key, because this one decides which pixels take a player's colours.
6.1 LAND template
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: {{SUBJECT}}
SILHOUETTE: {{SILHOUETTE}}
INTERIOR MARKS: {{INTERIOR_MARKS}}
UNTINTED DETAIL: {{UNTINTED_DETAIL}}
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
{{COLOUR}}
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
6.2 SEA template
Identical to LAND except for these two stanzas:
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
6.3 AIR template
Identical to LAND except for these two stanzas:
VIEW: orthographic plan view seen from directly overhead, aircraft nose pointing right, wings flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
FRAMING: one aircraft only, centred, wingspan filling about {{SPAN}}% of the frame width, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
ART-520 {{SPAN}} MUST be taken from the per-unit subsection and MUST NOT be improvised. The span ladder — Missile 24, Fighter 55, Bomber 75, Air Transport 80, Heavy Bomber 90 — is a counting cue in the sense of §3.4 and is the only thing separating some of these silhouettes at Mid tier.
ART-530 The style-reference pass MUST be run before any other unit is generated. Generate infantry first, iterate until it satisfies §7's acceptance checks, then supply the accepted image as an image prompt / style reference alongside every subsequent text prompt.
A second reference MUST be accepted before the other three explicit-mask cells are generated: armour, the first cell to use COLOUR-DETAIL. It MUST be supplied alongside infantry for field_gun, heavy_artillery and heavy_armour, and MUST NOT be supplied for any implicit-mask cell.
Rationale: text prompts alone will not hold a style across twenty-five sessions. This is the single most reliable failure of multi-asset image generation, and it produces an asset set where every sprite is individually fine and the screen looks like a ransom note. One accepted reference image, fed back in every time, does more for consistency than any amount of prompt wording. Infantry is the right first reference: it anchors the foot family, it is the hardest silhouette to keep clean, and every other unit is judged against how solid it looks.
The second reference exists because a flat reference cannot teach the three-ink form, and the failure it prevents is specific and expensive: shown only a two-ink reference, a model handed a cyan instruction tends either to ignore the cyan or to spread it into the nearest large shape — which on these four subjects is the carriage or the track band, exactly the mass ART-215 requires to stay masked. Withholding the second reference from flat cells matters just as much, for the mirror-image reason: a reference containing cyan invites cyan into cells that have no untinted element at all.
7. Production pipeline, and what image generators will actually do
Be clear about this before spending a day on it: an image generator will not produce a shippable 128 × 128 cell. It will produce a large, nearly-flat illustration with soft edges, stray greys, an invented ground shadow, and about 15% more detail than survives reduction. That image is the design, and it is genuinely valuable — silhouette exploration is the expensive part and the model is good at it. The sprite is made from it by a deterministic reduction plus a hand pass. Budget for the hand pass; it is 10–25 minutes per unit and it is not optional.
ART-540 Each unit MUST be generated in its own image, one subject per generation. Grid sheets, turnarounds and multi-unit contact sheets MUST NOT be requested.
Rationale: asking for a 4×4 sheet looks like a sixteen-fold saving and is a total loss. Models do not hold a consistent grid, cells drift in scale and baseline, and one bad cell means regenerating all sixteen. One subject per image also means one prompt per unit, which is what §8 is.
ART-550 Generation MUST be at 1024 × 1024 and MUST NOT be attempted at or near the target size.
Rationale: models have no concept of a pixel grid. A request for a 128 px image returns a 128 px blurry photograph of a small illustration, not pixel art. Generate large, reduce deterministically.
ART-560 The chroma key MUST be pure magenta #FF00FF, never white, black or green.
Rationale: the mass inks are black and white, so a white or black background cannot be keyed without eating the subject. Green collides with nothing here, but it is close enough to the mid-greys models leak into edges to cause fringing. Magenta shares no channel behaviour with a black-and-white subject, so the key is exact.
ART-565 In an explicit cell (ART-205) the untinted region MUST arrive from the generator as pure cyan #00FFFF (ART-515), and the layer split MUST be derived from it rather than cut by hand:
detail.a = 1 where the take is cyan, 0 elsewhere # ART-125: alpha is the mask complement
detail.rgb = the material colour of ART-245
base = the take with the cyan region filled to FIELD
No cyan pixel may survive into any delivered file. Cyan here is a generation-time alpha-extraction aid and nothing else, exactly as ART-170 of docs/art/00-art-direction.md requires of a chroma key: no delivered asset reserves any pixel value to mean anything, because the split has already been resolved into the detail layer's alpha before the master is written.
Rationale: the alternative is cutting the detail region by hand against finished art, which ART-125 already identifies as the expected failure of this feature and which §7.2 of docs/art/00-art-direction.md is honest about — hand-work is the norm and takes are imperfect. Deriving the split from a region the model was asked to paint means a barrel that moves takes its layer boundary with it. Cyan is chosen for the same reason magenta was, only more exactly: every grey a model leaks along an INK-to-FIELD edge has R = G = B, and cyan is the one ink whose red channel is low while green and blue are high, so no leaked grey can be misread as detail and no detail pixel as leakage. That exactness matters more here than at the chroma key, because this split decides which pixels take a player's colours.
Note the failure mode this encoding makes benign, which is why it is worth the step: under ART-185's over, a mis-cut detail region leaves a correct, fully-owned two-tone counter showing through. The base was filled to FIELD under the cyan, so there is no hole — only a barrel that is the wrong colour.
7.1 The reduction
ART-570 The reduction from generated image to master cell MUST follow these steps in order. Steps 1a and 5 apply to explicit-mask cells only:
# 1. Key the magenta, force the remaining ink to two levels, trim to the subject.
magick src/units/infantry.png \
-fuzz 18% -transparent '#FF00FF' \
-channel RGB -threshold 55% +channel \
-background none -trim +repage \
work/infantry_keyed.png
# 1a. EXPLICIT CELLS ONLY. Lift the cyan region BEFORE any thresholding, because step 1's
# RGB threshold would flatten #00FFFF toward a tone value and lose it silently.
magick src/units/armour.png -fuzz 12% -fill white -opaque '#00FFFF' \
-fill black +opaque white work/armour_region.png # detail coverage, white on black
# ...and fill the hole it leaves with FIELD, so the base stays a complete counter
# underneath the layer (ART-125). The base is never a hole.
magick src/units/armour.png -fuzz 12% -fill white -opaque '#00FFFF' \
-fuzz 18% -transparent '#FF00FF' \
-channel RGB -threshold 55% +channel \
-background none -trim +repage work/armour_keyed.png # base only
# 2. Reduce to an intermediate at ~4x target. Re-threshold after every resample.
magick work/infantry_keyed.png \
-filter Lanczos -resize 352x320 \
-channel A -threshold 50% +channel \
-channel RGB -threshold 50% +channel \
work/infantry_4x.png
# 3. Reduce to the cell content box, then pad to the 128x128 cell on the land baseline.
# 88x80 is ART-350's maximum painted box for a land unit; -resize fits inside it and
# keeps the aspect, so a tall foot subject lands 80 px tall and proportionally narrow.
# The 105-row extent puts the lowest painted row on y = 104 exactly (ART-320).
magick work/infantry_4x.png \
-filter Box -resize 88x80 \
-channel A -threshold 50% +channel \
-channel RGB -threshold 50% +channel \
-background none -gravity South -extent 128x105 \
-background none -gravity North -extent 128x128 \
master/units/close/infantry.png
# 4. Hand pass in a pixel editor. Always. See ART-580.
# 5. EXPLICIT CELLS ONLY, CLOSE TIER ONLY (ART-135). Reduce the detail coverage through
# the SAME ladder, then emit the layer: material colour in RGB, coverage in alpha.
# One derivation, so the layer and the base cannot drift apart.
magick work/armour_region.png -filter Box -resize 88x80 -threshold 50% \
-gravity South -extent 128x105 -gravity North -extent 128x128 work/armour_cov128.png
magick -size 128x128 xc:'<ART-245 tube colour>' work/armour_cov128.png \
-alpha off -compose CopyOpacity -composite \
master/units/close/armour_detail.png
ART-580 The hand pass MUST, at minimum: close the ink contour all the way round at 8 px — 2 px along a gun tube, and nowhere else (ART-435, ART-445) — which is the step the reduction most reliably breaks; re-cut the silhouette so no part is thinner than 8 px (ART-440) and no void gap narrower than 12 px (ART-450); snap ground contact to exactly y = 104 (ART-320) or the waterline to exactly y = 100–103 across x = 8–119 (ART-330); clear the 8 px frame band and check that nothing load-bearing has landed in a corner reserve (ART-300); delete any invented ground shadow; and restore the counting cue (§3.4) if reduction merged two turrets, two nacelles or two road wheels into one.
On an explicit cell it MUST additionally: confirm no cyan survived into the base and no tone value strayed into the detail coverage; set the tube's contour to 2 px on each exposed side and confirm it is closed, which the reduction will not do for you and which is the one place in the roster the contour weight is not 8 px (ART-435, ART-445); confirm the detail coverage nowhere touches or crosses that contour (ART-225 of docs/art/00-art-direction.md); measure the tube against ART-445's five tests before believing it — run, visible width and aspect, computed rather than eyeballed, because a tube two pixels thicker than intended fails the 4 : 1 test silently and nothing downstream catches it; lay the tube's value break (ART-245.3); and re-run step 5 after the hand pass, not before, so the layer matches the art as finished rather than as reduced.
Rationale: step 3 will merge adjacent features almost every time — that is what a box filter does to a five-road-wheel track band. The counting cues are exactly the features most likely to be destroyed and most load-bearing when they survive, so they are named here rather than left to be noticed.
Rationale for regenerating the layer after the hand pass: the hand pass moves things. A barrel nudged two pixels up to clear the condition reserve, with its coverage left where the barrel used to be, produces a tinted sliver of tube and an untinted sliver of turret — invisible at authoring time, invisible in one seat's colours, and glaring in another's.
7.2 Verification — proving a cell conforms
Three checks, and they answer three different questions. ART-590 asks whether the file is built correctly. ART-595 asks the only question UX-440 actually poses — whether a player can tell whose unit this is. ART-610 asks whether the unit is identifiable at all. A cell must pass all three, and passing the first two proves nothing about the third.
ART-585 A cell that relies on ART-158 of docs/art/00-art-direction.md's narrower contour MUST
declare each qualifying projection in a sibling <asset>.gen.json. The declaration is the only
way the exception is available: an undeclared projection is measured at the general 8 px weight and
will fail, and there is no inference path — art-verify MUST NOT attempt to recognise a gun tube, or
any other semantic feature, from the raster.
{
"contour_exceptions": [
{
"feature": "gun_tube",
"reason": "Main gun tube; thinness is constitutive, per ART-445 and D-7.",
"region": [60, 60, 109, 67]
}
]
}
Each entry MUST carry all three fields. feature MUST be one of the kinds ART-445 admits — for
this roster that set is exactly gun_tube, and any other value is rejected rather than trusted.
reason MUST be a non-empty sentence: the exception is a claim on the record that a reader can
weigh, not a switch. region MUST be [x0, y0, x1, y1] in cell coordinates, bounding the
projection and nothing else; an exception without bounds is not bounded.
A declaration is a claim, and art-verify checks the claim. It MUST measure the declared region
against every test of ART-445 — total silhouette thickness, visible detail width, exposed run, aspect
ratio, and that the region is a projection at all, meaning void on the far side of its contour
across the majority of its run. A region failing any of them is not honoured: the cell is then
measured at the general 8 px weight, so a wrong declaration cannot buy a thinner contour by being
wrong. A declaration MUST NOT suppress validation. It relocates the burden from "find the feature"
to "justify the feature", which is the only division of labour a raster can actually support.
The measurement is made on the detail layer, and a declaration requires one. ART-157 measures
visible width on the detail region itself, so art-verify MUST read that width from the detail
layer's alpha — ART-125 makes it the mask complement, which is exactly that region — and MUST NOT
infer it from silhouette depth. Depth says only how far a pixel sits from the outside, so a tube
whose authored colour stopped short of its own contour, or was never drawn at all, would measure as a
full-width tube and pass on geometry the artwork does not have. A cell that declares a contour
exception and ships no _detail.png MUST fail: the exception buys a thinner contour for authored
colour, and there is no authored colour here to buy it for.
ART-225's second half MUST be checked too. That requirement has always read "inside the silhouette and off the ink contour", and only the first half was enforced — detail leaving the silhouette was caught, detail sitting on the contour was not, so a detail region could overlap the contour or replace it and nothing said so. It is measured at the weight that applies where the detail sits: 2 px inside a validated projection, 8 px everywhere else. The contour lives in the base (ART-435) and the detail layer never carries one.
Measuring a tube that is not aligned to the pixel grid. No barrel in this roster is horizontal — the Field Gun sits at 10–20° of elevation and Heavy Artillery at 20–30° — so every one of these measurements runs on a rotated raster, where two artefacts will otherwise reject conforming art.
- The ends ramp. The axial buckets at each tip of a rotated rectangle catch only a corner of it and measure 1–3 px. The thickness floor MUST therefore be applied to the central run, trimming from each end a ramp bounded by the tube's own thickness times its offset from the nearest grid axis. The absolute minimum across the whole run MUST NOT be used: a geometrically perfect 8 px tube at 15° reports 1 px thick under it.
- One bucket cannot see a whole cross-section. Neighbouring pixels across a rotated band land in adjacent buckets, so a single bucket samples part of the span and a true 8 px tube measures 7. The cross-section MUST be taken over a three-bucket window.
Both figures are then rounded to whole pixels before meeting an integer floor, because extents are measured on projected pixel centres and an off-grid 4 px core reads 3.92.
None of this is slack, and it was checked rather than asserted: a 6 px tube still measures 6, a 2 px core still measures 2, and a tube pinched mid-run still fails on the pinch — a tube would have to narrow and recover inside three pixels for the window to miss it. Do not straighten a barrel, and do not thicken one, to satisfy a measurement. The elevation is an identity cue §8's Accept lines require, and thickening is the road back to the 28 px barrel D-7 exists to escape.
Rationale for making the author name the region rather than having the verifier find it. Inferring "this is a gun tube" from pixels is the problem ART-159 already refused to solve by measurement: a bore line, a panel seam and a tube are separable by what they are and not by what they measure, and a checker that guessed would either admit every rivet run that happened to measure 4 × 24 or reject a legitimate tube for being 23 px long. Naming the region moves the semantic judgement to the only place it can be made — the author — and leaves the verifier the part it can do rigorously, which is measuring whether what was named has the geometry the exception exists for. The failure mode this closes is the one where an exception becomes a way of turning a check off.
ART-590 Every master cell MUST pass the verifier below before it enters an atlas. The check MUST
run in CI over master/units/**.
#!/usr/bin/env python3
"""verify_cell.py - the ROSTER-side gate: ART-205, ART-215, ART-240, ART-300, ART-350, ART-435,
ART-445, ART-585, and the base/detail relationship this document's register commits each cell to.
The base's own value rules (ART-190, ART-200) and the full seven checks live in
docs/art/00-art-direction.md ART-255 and are that document's `art-verify`, not this.
Whether a player can tell WHOSE unit it is, is ART-595, not this either."""
import json, math, os, sys
from PIL import Image
# ART-300's four 36x36 corner reserves are NOT checked here: art may enter them and only
# load-bearing art may not, which is the human occlusion test of ART-610. The frame band is
# absolute, so it is. All figures are 128 px Close-cell coordinates and scale with the cell.
FRAME_BAND, CONTOUR, CONTOUR_EXC = 8, 8, 2 # ART-300 band, ART-050 weight, ART-158 weight
CONTOUR_MIN = 0.97 # allow the anti-aliased outer ring (ART-220)
DASHED = ("submarine__submerged",) # ART-435's one exception: a dashed hull outline
FEATURES = {"gun_tube"} # ART-445: the only kind this roster admits
# ART-800 exempts the Missile from ART-350's 32 px painted-height FLOOR and from nothing
# else -- its span is 28 px, while its 80 px length has always cleared the width floor.
# A named table rather than a loosened constant: an exemption is a per-unit decision on
# the record, and this is where the others belong too (open question 9).
HEIGHT_FLOOR_EXEMPT = {"missile"}
COVERAGE_MIN, RIM_MIN = 0.60, 0.50 # ART-215.1, ART-215.2
INK_MAX, FIELD_MIN = 51, 204 # [20,235] pre-normalisation, generous both ends
def load(p):
im = Image.open(p).convert("RGBA")
raw = im.tobytes()
return im.size, [tuple(raw[i:i + 4]) for i in range(0, len(raw), 4)]
def depth_to_background(op, w, h):
"""L1 distance from every opaque pixel to the nearest background pixel, by the standard
two-pass chamfer. depth(p) <= n is exactly what n rounds of 4-connected erosion remove --
so this reproduces the old band wherever it was right -- but it also says HOW FAR each
pixel is, which is what lets the band be measured at a per-segment weight (ART-158)."""
INF = 1 << 30
d = [INF if op[i] else 0 for i in range(w * h)]
for y in range(h):
for x in range(w):
i = y * w + x
if d[i] == 0:
continue
if x == 0 or y == 0: # off-image is background; ART-300 means this
d[i] = 1 # should never fire
continue
d[i] = min(d[i], d[i - 1] + 1, d[i - w] + 1)
for y in range(h - 1, -1, -1):
for x in range(w - 1, -1, -1):
i = y * w + x
if d[i] == 0:
continue
if x == w - 1 or y == h - 1:
d[i] = min(d[i], 1)
continue
d[i] = min(d[i], d[i + 1] + 1, d[i + w] + 1)
return d
def measure_region(reg, op, cover, w, h, s):
"""ART-445's five tests, measured inside the region the author declared (ART-585).
This does not look for a tube; it checks that what was named has a tube's geometry."""
x0, y0, x1, y1 = reg["region"]
pts = [(x, y) for y in range(max(0, y0), min(h - 1, y1) + 1)
for x in range(max(0, x0), min(w - 1, x1) + 1) if op[y * w + x]]
if not pts:
return ["the declared region contains no silhouette"]
n = len(pts)
mx = sum(p[0] for p in pts) / n
my = sum(p[1] for p in pts) / n
sxx = sum((p[0] - mx) ** 2 for p in pts) / n
syy = sum((p[1] - my) ** 2 for p in pts) / n
sxy = sum((p[0] - mx) * (p[1] - my) for p in pts) / n
t = 0.5 * math.atan2(2 * sxy, sxx - syy) # principal axis: an elevated barrel
ux, uy = math.cos(t), math.sin(t) # is still one measurement
vx, vy = -uy, ux
axial = {}
for x, y in pts:
a = round((x - mx) * ux + (y - my) * uy)
p = (x - mx) * vx + (y - my) * vy
c = axial.setdefault(a, [math.inf, -math.inf, math.inf, -math.inf])
c[0], c[1] = min(c[0], p), max(c[1], p)
if cover[y * w + x]: # ART-157 measures visible width ON the
c[2], c[3] = min(c[2], p), max(c[3], p) # detail region, so read the mask itself
keys = sorted(axial)
run = len(keys)
# A single axial bucket cannot see a whole cross-section of a tube that is off the
# pixel grid: neighbouring pixels across a rotated band land in adjacent buckets, so
# one bucket samples only part of the span and a true 8 px tube measures 7. Take the
# cross-section over a three-bucket window, which restores the span. A tube would
# have to narrow and recover inside three pixels for this to hide a taper.
thick = []
for i in range(run):
lo = min(axial[keys[j]][0] for j in range(max(0, i - 1), min(run, i + 2)))
hi = max(axial[keys[j]][1] for j in range(max(0, i - 1), min(run, i + 2)))
thick.append(hi - lo + 1)
# Both figures are rounded to whole pixels before meeting an integer floor: extents
# are measured on projected pixel CENTRES, so an off-grid 4 px core reads 3.92. This
# is not slack -- a real 3 px core reads ~2.9 and still rounds to 3.
vis = sorted(axial[k][3] - axial[k][2] + 1 for k in keys if axial[k][3] >= axial[k][2])
med = round(vis[len(vis) // 2]) if vis else 0
aspect = run / med if med else 0
# Rasterising an off-grid tube RAMPS its ends: the buckets at each tip catch only a
# corner of the rectangle and measure 1-3 px on a perfect 8 px tube, so the absolute
# minimum cannot be used. The ramp is bounded by the tube's own thickness times its
# offset from the nearest grid axis; trim that many buckets from each end and apply
# the floor to what remains. The central tube still carries the full 8 px.
med_thick = sorted(thick)[len(thick) // 2] if thick else 0
ramp = math.ceil(med_thick * min(abs(ux), abs(uy))) + 1
centre = thick[ramp:run - ramp] if run - 2 * ramp >= 1 else thick
min_thick = round(min(centre)) if centre else 0
# ART-158's definition of a projection: void on the FAR side of its contour. A stripe
# inside the mass has material on both sides and is ART-159 surface marking.
proj = 0
for k in keys:
clear = 0
for sgn, edge in ((-1, axial[k][0]), (1, axial[k][1])):
p = edge + sgn * 2
x = round(mx + k * ux + p * vx)
y = round(my + k * uy + p * vy)
if not (0 <= x < w and 0 <= y < h) or not op[y * w + x]:
clear += 1
proj += clear == 2
f = []
if min_thick < CONTOUR * s:
f.append(f"ART-445.1: thickness {min_thick} px, must be >= {CONTOUR * s}")
if med < 4 * s:
f.append(f"ART-445.3: visible detail width {med} px, must be >= {4 * s}")
if run < 24 * s:
f.append(f"ART-445.4: exposed run {run} px, must be >= {24 * s}")
if aspect < 4:
f.append(f"ART-445.5: aspect {aspect:.2f}:1, must be >= 4:1")
if proj / run < 0.5:
f.append(f"ART-159: {proj / run:.0%} of the run has void on both far sides - this is a "
f"surface marking, not a projection, and takes no exception")
return f
def declarations(path):
"""ART-585. A malformed declaration is a failure, not an absence."""
p = path[:-4] + ".gen.json"
if not os.path.exists(p):
return [], []
try:
doc = json.load(open(p, encoding="utf-8"))
except Exception as e:
return [], [f"{os.path.basename(p)}: not valid JSON - {e}"]
ok, f = [], []
for i, r in enumerate(doc.get("contour_exceptions", [])):
w = f"gen.json contour_exceptions[{i}]"
if r.get("feature") not in FEATURES:
f.append(f"{w}: feature {r.get('feature')!r} is not one ART-445 admits")
elif len((r.get("reason") or "").strip()) < 12:
f.append(f"{w}: a declaration MUST carry a reason, not a switch")
elif (not isinstance(r.get("region"), list) or len(r["region"]) != 4
or not all(isinstance(v, int) and v >= 0 for v in r["region"])):
f.append(f"{w}: region MUST be [x0,y0,x1,y1] - an exception without bounds")
else:
ok.append(r)
return ok, f
def check(path):
(w, h), px = load(path)
f = []
if (w, h) not in ((128, 128), (64, 64)):
f.append(f"size {w}x{h}, expected 128x128 or 64x64")
dpath = path[:-4] + "_detail.png"
explicit = os.path.exists(dpath)
if explicit and h == 64:
f.append("ART-135 of 00-art-direction.md: a Mid cell must not ship a detail layer")
if explicit:
(dw, dh), dpx = load(dpath)
if (dw, dh) != (w, h):
return [f"{path}: ART-205: detail layer is {dw}x{dh}, base is {w}x{h}"]
cover = [p[3] for p in dpx] # ART-125: detail alpha IS the mask complement
else:
cover = [0] * (w * h)
opaque = [i for i, p in enumerate(px) if p[3] != 0]
if not opaque:
return [f"{path}: empty cell"]
if any(px[i][3] != 255 for i in opaque):
f.append("base alpha is neither 0 nor 255")
if any(cover[i] and px[i][3] == 0 for i in range(w * h)):
f.append("ART-225 of 00-art-direction.md: detail extends past the base silhouette")
# The base is a tone map: R == G == B everywhere opaque, including under the detail,
# because ART-565 fills the lifted region to FIELD rather than leaving a hole.
chroma = {px[i] for i in opaque if not px[i][0] == px[i][1] == px[i][2]}
if chroma:
f.append(f"ART-200: {len(chroma)} non-tone values in the base, e.g. {sorted(chroma)[:3]}")
mid = sum(1 for i in opaque if INK_MAX < px[i][0] < FIELD_MIN)
if mid > 0.12 * len(opaque):
f.append(f"ART-200 of 00-art-direction.md: {mid / len(opaque):.0%} of the base is "
f"between INK and FIELD - a plateau, not a boundary")
# ART-435, ART-158 and ART-240. The band is derived from the BOUNDARY and each stretch is
# measured at the weight that applies there: 8 px in general, 2 px along a declared and
# validated projection. The widths scale with the cell, so a 64 px Mid cell is 4 and 1.
s = w / 128
cw, ew = max(1, round(CONTOUR * s)), max(1, round(CONTOUR_EXC * s))
op = [p[3] != 0 for p in px]
dep = depth_to_background(op, w, h)
regs, derr = declarations(path)
f += derr
if regs and not explicit:
f.append("ART-585: a contour exception is declared but the cell ships no _detail.png - "
"the exception is for a projection carrying authored colour, and there is none")
# Validate before honouring: a region that fails ART-445 is not applied, so a wrong
# declaration cannot buy a thinner contour by being wrong (ART-585).
honoured = [False] * (w * h)
for r in regs:
bad = measure_region(r, op, cover, w, h, s)
if bad:
f += [f"{r['feature']}: {m}" for m in bad]
continue
x0, y0, x1, y1 = r["region"]
for y in range(max(0, y0), min(h - 1, y1) + 1):
for x in range(max(0, x0), min(w - 1, x1) + 1):
honoured[y * w + x] = True
# ART-225's second half, previously unchecked: detail may sit inside the silhouette and
# still be authored ON the contour, or replace it. Measured at the weight that applies
# where the detail sits, so a validated projection is judged against its 2 px contour.
on_contour = sum(1 for i in opaque if cover[i] and dep[i] <= (ew if honoured[i] else cw))
if on_contour:
f.append(f"ART-225: {on_contour} detail px lie on the contour band - detail is authored "
f"inside the silhouette and off the contour, which lives in the base")
if not any(k in os.path.basename(path) for k in DASHED):
# Three bands, each measured over the pixels its own rule reaches and each carrying
# CONTOUR_MIN separately. The old check applied one tolerance to one uniform erosion,
# which is what made a narrow projection's FIELD core read as a broken contour.
n8 = i8 = n2 = i2 = nf = i_f = 0
for i in opaque:
d, dark = dep[i], px[i][0] <= INK_MAX
if d <= ew:
nf += 1
i_f += dark
if honoured[i]:
if d <= ew:
n2 += 1
i2 += dark
elif d <= cw:
n8 += 1
i8 += dark
if nf and i_f / nf < CONTOUR_MIN:
f.append(f"ART-050: the {ew} px contour floor is {i_f / nf:.0%} INK, must be >= "
f"{CONTOUR_MIN:.0%} - no boundary falls below this, exception or not")
if n8 and i8 / n8 < CONTOUR_MIN:
f.append(f"ART-435: the {cw} px contour band is {i8 / n8:.0%} INK, must be >= "
f"{CONTOUR_MIN:.0%} - the closed contour is broken or missing")
if regs and n2 and i2 / n2 < CONTOUR_MIN:
f.append(f"ART-158: the {ew} px contour along a declared projection is "
f"{i2 / n2:.0%} INK, must be >= {CONTOUR_MIN:.0%} - the exception "
f"narrows the contour, it does not remove it")
# ART-240 is measured over what the band leaves, at each pixel's own required weight.
inner = [i for i in opaque if dep[i] > (ew if honoured[i] else cw)]
if not inner:
f.append(f"ART-435: nothing survives the contour band - the cell is all contour")
else:
ink = sum(1 for i in inner if px[i][0] <= INK_MAX)
if not 0.08 <= ink / len(inner) <= 0.35:
f.append(f"ART-240: interior INK share {ink / len(inner):.1%}, must be 8%-35% "
f"(measured inside the contour band, not over the whole cell)")
masked = [px[i][3] == 255 and cover[i] == 0 for i in range(w * h)]
inside = [i for i in opaque if masked[i]]
cov = len(inside) / len(opaque) # ART-215.1
if cov < COVERAGE_MIN:
f.append(f"ART-215: mask coverage {cov:.0%}, must be >= {COVERAGE_MIN:.0%}")
if not explicit and cov < 1.0:
f.append("ART-205: implicit cell has unmasked pixels but ships no detail layer")
def rim(rows): # ART-215.2 - is the base the outer boundary, or an inset core?
ends = {}
for i in opaque:
k, v = (i // w, i % w) if rows else (i % w, i // w)
lo, hi = ends.get(k, (v, v))
ends[k] = (min(lo, v), max(hi, v))
ok = 0
for k, (lo, hi) in ends.items():
a, b = ((k * w + lo, k * w + hi) if rows else (lo * w + k, hi * w + k))
ok += masked[a] and masked[b]
return ok / len(ends)
for rows, name in ((True, "rows"), (False, "columns")):
r = rim(rows)
if r < RIM_MIN:
f.append(f"ART-215: base is the outer edge in only {r:.0%} of painted {name}"
f", must be >= {RIM_MIN:.0%}")
xs, ys = [i % w for i in opaque], [i // w for i in opaque]
bw, bh = max(xs) - min(xs) + 1, max(ys) - min(ys) + 1
if w == 128:
# ART-350's per-domain ceilings are read by a person; these are the loosest bounds.
unit = os.path.basename(path)[:-4].split("__")[0]
h_lo = 0 if unit in HEIGHT_FLOOR_EXEMPT else 32
if not (68 <= bw <= 112 and h_lo <= bh <= 80):
f.append(f"ART-350: bbox {bw}x{bh} outside 68-112 x {h_lo}-80")
fb = max(1, FRAME_BAND * w // 128)
if any(px[i][3] != 0 for i in range(w * h)
if i % w < fb or i % w >= w - fb or i // w < fb or i // w >= h - fb):
f.append(f"ART-300: art enters the {fb} px frame band")
return [f"{path}: {m}" for m in f]
bad = [msg for p in sys.argv[1:] for msg in check(p)]
print("\n".join(bad) if bad else f"OK: {len(sys.argv) - 1} cells pass")
sys.exit(1 if bad else 0)
The uniform-erosion defect this verifier used to carry is fixed, and the "known false positive" recorded here was wrong about the artwork. Both halves are stated because the second was asserted as fact in three documents and is not true.
The defect was real as a design flaw. Finding the band by eroding the whole silhouette to one depth is correct only while the contour weight is one number. On a cell carrying a qualifying projection it is not: an 8 px erosion consumes an 8 px tube entirely, the tube's FIELD core counts as band, and a sound contour reads as broken. The band is now derived from the boundary and each stretch measured at the weight that applies there, which also checks the 2 px contour is present — previously checked by nobody. This is the fix D-7 called correct, and it is written.
The predicted failure never occurred. Measured against the shipped bundle, all four cells named —
field_gun,armour,heavy_artillery,heavy_armour— pass the old uniform-erosion contour check at 100.0% INK, and pass the new one. The prediction assumed their gun tubes were authored as narrow linear projections. They were not. Every one is drawn as an interior marking: the detail regions sit at depth 8–20 from the nearest background, entirely clear of both the 8 px band and the 2 px floor, with FIELD on both sides and the silhouette's real contour a long way outside them. No cell in the currently delivered bundle exercises ART-158, and none carries an ART-585 declaration. The normative roster requires all four to: the Tube geometry paragraph in each of §8's four explicit subsections already states the thickness, visible width and run, and those figures are unchanged by any of this.What that leaves open is a question about the artwork, not the checker. A tube that does not project is ART-159's "bore line drawn as a mark on a surface", which is denied the exception and governed by ART-155 rule 4's 12 cell px floor for area detail. The four detail regions measure 4–5 cell px across. They are conforming to neither rule, and this is recorded rather than resolved: the fix is an art decision, and thickening a tube to satisfy a checker is how the 28 px barrel comes back. Open question 4 of
docs/art/04-decisions.mdcarries it.
ART-595 Every unit cell MUST pass the ownership read test — ART-1135 of docs/art/02-terrain.md, which is the mechanical form of UX-440's outcome requirement, adopted here unchanged for unit cells. The measurement MUST be made on the Mid cell reduced to 8 CSS px (24 device px at DPR 3), and the RMSE between two seat pairs MUST exceed 0.25. The reduction is to 8 × 8, matching ART-255 check 8 of docs/art/00-art-direction.md exactly rather than carrying a second figure derived from DPR 2.
# Polarity is ART-200's, which is ART-180's: INK is the DARK value and takes the seat
# FOREGROUND; FIELD is the light value and takes the seat BACKGROUND. Measured on the Mid
# cell, which is base-only (ART-135), so this is the whole sprite -- no detail layer to
# composite, and the test sees exactly what the smallest rendered sprite shows.
tint () { # $1 base.png $2 seat foreground $3 seat background $4 out.png
magick "$1" -alpha on \
-fuzz 0% -fill "$2" -opaque black \
-fuzz 0% -fill "$3" -opaque white \
-filter Lanczos -resize 8x8 "$4"
}
tint master/units/mid/armour.png "#B3372E" "#F2E4CE" own_a.png # real seat pairs
tint master/units/mid/armour.png "#2E5FB3" "#E8EDF2" own_b.png
# Composite each over a Chip-tier terrain colour and measure how far apart the two owners
# land at 8 CSS px. RMSE MUST exceed 0.25; below that, the mask is too small.
magick compare -metric RMSE \
\( -size 8x8 xc:"#7E9C5E" own_a.png -composite \) \
\( -size 8x8 xc:"#7E9C5E" own_b.png -composite \) null:
Then confirm it with a person, in the fixture this roster actually needs and a terrain tile does not: two units side by side in different seats, over one terrain, at the Mid tier. Print the pair shuffled and ask a reader who has never seen the sheet to say which is which. The number is a screen; this is the requirement.
Rationale for measuring at 8 CSS px when a unit sprite is never drawn at 8 CSS px. Below the Chip threshold this document replaces the sprite entirely with a procedural chip (ART-900), and the chip discharges UX-440's Chip-tier guarantee about as completely as it can be discharged: ART-910's plate is filled in the owner's background, keylined in the owner's foreground, and carries the seat pattern, so the whole marker is the owner's colours. The sprite's own obligation therefore lives at Close and Mid — but UX-390 requires the tiers to transition smoothly, which means the Mid sprite is continuously minified toward the Chip threshold and is on screen at sizes approaching 8 CSS px before it is swapped out. Testing at the bottom of that range tests the worst case that actually renders, and it keeps this document's gate numerically identical to the sibling's rather than inventing a second threshold that would drift from it.
ART-600 A quick visual proof, and it takes ten seconds: flood-fill the INK with any colour and the FIELD with any other, then composite the detail layer over it. If the result is a clean recolour with no fringes, halos or leftover speckle — and, on an explicit cell, with the tube untouched and still reading as a tube — the cell conforms. A broad grey band means ART-200 of docs/art/00-art-direction.md was violated by a plateau and the sprite will render in a colour belonging to no seat. A tube that recoloured with the hull means the detail layer's alpha is empty where the tube is; a hull that stayed put means the layer's alpha covers more than the tube.
ART-610 The hardest proof — the silhouette test for ART-230: fill the entire non-void area with a single colour, masked and untinted alike, and view the 25 cells side by side at 128 px. If any two units are indistinguishable, the failure is in the design, not the reduction, and the prompt must change. Filling both regions is the point: a pair that separates only once the tube is a different colour has not passed, it has borrowed the second channel to do the first channel's work.
7.3 What a correct and an incorrect result look like
| Correct | Incorrect | |
|---|---|---|
| Values | A base that is a tone map — INK, FIELD, and boundary blends between them; authored colour only in the detail layer | A plateau of intermediate value; chroma in the base; a coloured fringe; surviving cyan or magenta anywhere |
| Mask | Coverage ≥ 60%, and the base is the outer boundary in most rows and columns (ART-215) | A base that stops at the hull and leaves tracks, barrels and shield to the detail layer — the failure UX-440 names by name |
| Background | Fully keyed, RGB matching the adjacent edge under alpha 0 | Magenta residue at the edges; the far tone under alpha 0 |
| Silhouette | Reads as the right unit when filled solid, mask and detail together | Reads as "a vehicle"; distinguishable only by interior detail or only by tube colour |
| Contour | Closed all the way round and untouched by the detail layer: 8 px everywhere, 2 px along a gun tube and nowhere else (ART-435, ART-445) | Thinned to nothing at the top, opened where two forms meet, overpainted by a detail region, or thinned to 2 px on something that is not a tube |
| Detail level | At most four interior ink shapes (ART-080 of docs/art/00-art-direction.md), counting each repeated identity group of §3.4 as one: Armour's five road wheels are one shape, not five, and Corvette / Destroyer / Cruiser's turret rows are one, not one-per-turret. That typically lands at 6–14 discrete objects resolving to three or four shapes |
A fifth unrelated mark, over the cap. An irregular scatter of similar marks claiming the group exemption — the elements must be uniform, evenly spaced, on a common axis, and still read as a band of repetition at 8 CSS px, or they count separately. Rivets, panel lines, hatch handles, tread pattern — all lost at 128 px, all noise before then |
| Lighting | None | A model-invented top light, a dark underside, a ground-shadow ellipse |
| Framing | On the baseline, in the safe area, reserves clear | Floating; touching the cell edge; a mast intruding into the condition reserve |
| Style | Same weight and reduction as the accepted Infantry reference | Individually attractive, visibly a different artist from the sprite next to it |
8. The units
ART-620 Every unit below MUST be produced from the prompt given in its subsection, reduced per §7, hand-finished per ART-580, and verified per ART-590 before it is atlased. Where a subsection's Accept/Reject line conflicts with a generated image, the subsection wins.
Every subsection carries: taxonomy and role from docs/spec/02-units-and-industry.md §8; the silhouette concept; the Close cell and its atlas coordinate; its team-colour record — which mask convention, what is tinted, what is not, and why (ART-247); state variants; and the literal prompt.
8.1 Tier 1 — Depot (Industry 1)
8.1.1 Scout — scout
ART-630
| Class · movement · domain | recon · foot · land |
| Role (US-1360) | Reveals the map and punishes an undefended flank |
| Close cell | 128 × 128 · atlas units-close · cell (0,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #1) — narrowest silhouette in the roster; no pixel to spare |
| Variants | none |
| Template | LAND |
Silhouette concept. The narrowest foot silhouette in the game: a single soldier crouched forward at the waist, made unmistakable by an 8 px whip antenna rising twenty-four pixels clear above the helmet. Nothing else in the roster has a thin vertical spike above head height, so the Scout is identifiable in a stack from the antenna alone.
Accept / reject. Accept: one crouched figure, antenna clearly separated from the body against void, painted width 68–80 px. Reject: an upright figure (that is Infantry); two figures; an antenna shorter than 16 px or touching the head silhouette; any pack detail that widens the body past 80 px.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a single lightly-equipped scout soldier, crouched low and leaning forward as if moving cautiously, a short carbine held across the chest angled down toward the right, a compact backpack radio on the back with one long thin whip aerial rising straight up far above the helmet.
SILHOUETTE: one narrow human figure, clearly bent forward at the waist, much narrower than it is tall; legs separated with a clear gap between them; a single very thin vertical line rising from the pack to well above the head, taller than the head itself.
INTERIOR MARKS: the carbine, the aerial, the helmet brim line, and the gap between the legs, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.1.2 Infantry — infantry
ART-640
| Class · movement · domain | infantry · foot · land |
| Role (US-1370) | Takes cities and holds them; nothing on land defends one more cheaply |
| Close cell | 128 × 128 · atlas units-close · cell (1,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #2) — two 14 px figures, and the flat style reference |
| Variants | none |
| Template | LAND |
Silhouette concept. Two helmeted riflemen standing shoulder to shoulder, upright, packs on their backs, rifles slung on a strong diagonal. Two domed heads side by side is the game's most repeated shape and the anchor of the whole foot family. This is the style-reference sprite (ART-530) and MUST be produced and accepted first.
Accept / reject. Accept: exactly two upright figures, two clearly separated helmet domes with 12 px of void between them, a visible diagonal rifle line on each, four ground-contact points. Reject: one figure; three figures; heads merged into one mass; any sandbag, wall or emplacement (that is Militia); any horizontal element at shoulder height (that is Engineer).
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: two infantry soldiers standing upright shoulder to shoulder facing right, both wearing rounded domed steel helmets and back packs, each with a rifle slung on a strong diagonal across the chest.
SILHOUETTE: two upright human figures side by side, taller than the pair is wide; two distinct rounded helmet domes clearly separated at the top with a visible gap between them; four legs with clear gaps between them meeting the baseline.
INTERIOR MARKS: the two diagonal rifle lines, the helmet brim under each dome, the pack outlines, and the gaps between the legs, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.1.3 Field Gun — field_gun
ART-650
| Class · movement · domain | artillery · wheeled · land |
| Role (US-1380) | Grinds down a dug-in defender so infantry can finish it; cannot take ground itself |
| Close cell | 128 × 128 · atlas units-close · cell (2,0) |
| Team colour (ART-205) | Explicit (ART-247 #3) — field_gun_detail.png; the gun tube and bore line are untinted (ART-245) |
| Variants | none |
| Template | LAND |
Silhouette concept. A towed gun on two large spoked wheels: barrel out to the right at a shallow 15°, split trail legs running back and down to the ground behind. The three ground contacts — two wheels and a trail spade — plus a barrel that points along the ground rather than at the sky, are what separate artillery from anti-air.
Untinted detail. The barrel is the roster's one untinted element (ART-247 #3): a machined tube in ART-245's two values, emerging from a carriage in the owner's colours. It reads against void along its whole length, so it never depends on contrast with a seat colour, and separating tube from shield is what makes the 15° elevation legible at Close — the cue that separates artillery from anti-air.
Tube geometry (ART-445). 8 px thick — 2 px contour, 4 px of authored steel, 2 px contour — with an exposed run of at least 24 px from the shield face to the muzzle. That run is stated here because the prompt below does not carry a barrel length, and 24 px is ART-445's floor rather than a target: draw it longer where the take allows, and shorter is not a slim barrel, it is a barrel that cannot hold a layer. This is the tightest tube in the roster on every axis at once and it is the one to put through ART-158's DPR check first.
Accept / reject. Accept: exactly two wheels, both circular with visible white spokes or hub, barrel elevation 10–20°, trail reaching the baseline behind the wheels; cyan on the barrel and nowhere else; mask coverage ≥ 60% with all three ground contacts masked (ART-215, verified by ART-595). Reject: four wheels (that is Heavy Artillery); a barrel above 40° (that is Air Defence Battery); a muzzle brake block at the barrel tip; a self-propelled chassis or a track band; any cyan on the shield, wheels, carriage or trail.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a towed field artillery piece, side on, facing right: two large spoked road wheels, a straight slim barrel projecting to the right and elevated about fifteen degrees above horizontal, a small flat rectangular gun shield above the axle, and split trail legs sloping down and back to rest on the ground behind the wheels.
SILHOUETTE: a low wide angular assembly, wider than it is tall; two circular wheels sitting on the baseline; a long straight barrel line going up and right; a long straight trail line going down and left to a third ground contact point.
INTERIOR MARKS: the two wheel rims and their spokes as black circles, and the edge of the gun shield, all in solid black against the white mass.
UNTINTED DETAIL: the gun barrel only — the whole tube from where it leaves the shield out to the muzzle, and the bore line along it — in solid cyan. The wheels, the shield, the carriage and the trail are NOT cyan.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly three ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named in INTERIOR MARKS. Solid pure cyan (#00FFFF) for the shapes named in UNTINTED DETAIL and for nothing else at all. Flat pure magenta (#FF00FF) everywhere else. Each ink is one flat solid area of one single colour with a hard edge. No fourth colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.1.4 Transport — transport
ART-660
| Class · movement · domain | transport_sea · naval · sea |
| Role (US-1390) | The only tier-1 way to move an army across water, and helpless while doing it |
| Close cell | 128 × 128 · atlas units-close · cell (3,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #4) — a merchant hull is one slab of mass |
| Variants | none (loaded state is an overlay — ART-480) |
| Template | SEA |
Silhouette concept. A tall slab-sided merchant hull with a blunt vertical bow, one boxy deckhouse aft of centre, and a single mast carrying two diagonal cargo derricks. The highest freeboard of any hull in the game and no gun of any kind (ART-420): the derricks are the cue, and their diagonals are what stop it being read as a warship.
Accept / reject. Accept: blunt vertical bow, unbroken flat deck line, two clear derrick diagonals from one mast, hull length 92–104 px, zero turrets. Reject: any turret, gun or barrel; a raked bow; a lowered bow ramp (that is Landing Ship); a superstructure spanning more than one third of the hull.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a plain blunt-bowed merchant cargo ship, side on, facing right: a tall slab-sided hull with high freeboard, one flat unbroken main deck, a single boxy deckhouse set aft of amidships, and one upright mast amidships carrying two straight cargo derrick booms angled out diagonally. The vessel is completely unarmed.
SILHOUETTE: a long low rectangle of hull cut off flat at the waterline, with a small box on top toward the stern and one vertical mast with two diagonal booms; blunt near-vertical bow at the right end, blunt square stern at the left end.
INTERIOR MARKS: the deck line, the two derrick boom lines, the deckhouse window band, and a row of small square cargo hatches along the deck, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.1.5 Corvette — corvette
ART-670
| Class · movement · domain | escort · naval · sea |
| Role (US-1400) | Escorts convoys and contests coastal water; the cheapest thing that can sink a transport |
| Close cell | 128 × 128 · atlas units-close · cell (4,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #5) — shortest hull in the game; the cue is a count of one |
| Variants | none |
| Template | SEA |
Silhouette concept. The shortest, lowest warship hull in the game — about 76 px of the 128 px cell — with exactly one small gun turret forward, one squat funnel, and a plain pole mast. First rung of the warship counting ladder (§3.4): one gun.
Accept / reject. Accept: hull 72–80 px, exactly one turret forward of the funnel, one funnel, a plain thin pole mast, hull height above waterline no more than 20 px. Reject: two or more turrets; a lattice or tower mast; a hull longer than 84 px; a torpedo tube block.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a small coastal escort warship, side on, facing right: a short low hull, one single small gun turret on the forecastle with a short barrel pointing right, one squat funnel amidships, a low bridge house, and one plain thin vertical pole mast.
SILHOUETTE: a short low sliver of hull cut off flat at the waterline, noticeably shorter than every other warship; one small box with a short barrel near the bow, one small stubby funnel, one thin vertical pole line; the whole profile very flat and close to the waterline.
INTERIOR MARKS: the deck line, the gun barrel, the funnel cap band, the bridge window band, and the pole mast, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.2 Tier 1 auxiliaries
The three units in this group are the hardest silhouette problem in the document, because two of them are foot figures with no weapon and the third is a foot unit with no figure. §4 fixes the cues; they are restated in each subsection because they are the whole design.
8.2.1 Militia — militia
ART-680
| Class · movement · domain | garrison · foot · land |
| Role (US-1420) | Pays for occupation in a cheap dedicated currency so occupation never strands good infantry |
| Close cell | 128 × 128 · atlas units-close · cell (5,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #6) — the sandbag block is mass and must tint with the figure |
| Variants | none |
| Template | LAND |
Silhouette concept. One figure in a soft cap, rifle held upright and vertical at rest, standing behind a low stacked sandbag wall that is part of the sprite and fills the lower third of the painted area. Militia is the only foot unit fused to a static emplacement — which is exactly what garrisonOnly means, and it is the cue that carries it.
Accept / reject. Accept: one head above a solid horizontal sandbag mass; the sandbag block is 12–18 px tall and at least 64 px wide; rifle vertical, not diagonal; the cap is flat-topped, not a dome. Reject: a helmet dome (that reads as Infantry); a diagonal rifle; two figures; no sandbags; sandbags so tall the head disappears.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: one militia rifleman in a soft flat-topped forage cap, no steel helmet, standing at rest behind a low wall of stacked sandbags, holding a rifle vertically upright beside the body with the butt on the ground. The sandbag wall is wide and low and is part of the subject.
SILHOUETTE: a solid low horizontal block of stacked bags forming the bottom third of the shape, wide and flat-topped, with a single upright figure rising behind it from the waist up; one thin vertical line beside the figure for the rifle; the cap is a flat slab, not a rounded dome.
INTERIOR MARKS: the horizontal courses between the sandbag rows, the vertical rifle line, and the band under the cap, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.2.2 Administrative Cadre — admin_cadre
ART-690
| Class · movement · domain | administration · foot · land |
| Role (US-1430) | The visible convoy of bureaucrats that caps how fast an empire can digest what it conquers |
| Close cell | 128 × 128 · atlas units-close · cell (6,0) |
| Team colour (ART-205) | Implicit — base only (ART-247 #7) — its cue is the absence of a diagonal; a material break adds one |
| Variants | none |
| Template | LAND |
Silhouette concept. Two bare-headed figures in long, flared, knee-length coats, one carrying a wide flat document case held horizontally at hip height. The rule that makes it work: no straight diagonal line anywhere in the silhouette. Every armed foot unit in the game has a diagonal weapon line, so the absence of one, plus the flared hem, is the Cadre.
Accept / reject. Accept: two bare heads, both rounded and small, hems visibly wider than the shoulders, one horizontal case shape, zero diagonals, zero weapons. Reject: any helmet; any rifle or diagonal line; a sandbag or emplacement; a briefcase carried vertically; anything that could be read as a barrel.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: two civilian administrators walking to the right, bare-headed with no helmets and no weapons of any kind, both wearing long heavy knee-length overcoats that flare out widely at the hem; the leading figure carries a wide flat document case held horizontally at hip height.
SILHOUETTE: two upright figures side by side whose outline is a smooth bell shape, narrow at the small round heads and shoulders and much wider at the flared coat hems; one horizontal bar at hip height for the case; there is no straight diagonal line anywhere in the outline.
INTERIOR MARKS: the horizontal document case, the coat's front opening line, the collar line, and the gap between the two figures, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no helmets; no weapons; no rifles; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.2.3 Forward Depot — forward_depot
ART-700
| Class · movement · domain | logistics · foot · land |
| Role (US-1440) | Pushes supply beyond your integrated territory, and is exactly as strong as its link home |
| Close cell | 128 × 128 · atlas units-close · cells (7,0) limbered, (0,3) emplaced |
| Team colour (ART-205) | Implicit — base only, both variants (ART-247 #8, #8a) — the whole silhouette is stores |
| Variants | limbered (base) and emplaced — distinct art, ART-480 |
| Template | LAND |
Silhouette concept. The only foot unit with no head and no legs. Limbered, it is a compact tall bundle of crates lashed with carrying poles. Emplaced, it spreads: crates and drums laid out low and wide under a raised canopy on four thin poles, behind a short revetment. The pair must read as the same stores, packed and unpacked — narrow and tall versus wide and flat.
Accept / reject. Accept (both): no human figure, no head, no legs, no weapon; limbered painted width 68–80 px and taller than wide; emplaced painted width 80–88 px and wider than tall, with a clear void gap between the canopy and the stores. Reject: a wheeled cart (that reads as wheeled); a tent that reads as a building; a figure of any kind; the two variants having the same aspect ratio.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a compact packed field supply bundle ready to be carried: wooden crates and fuel drums stacked and lashed together into one tall tight block, with two long straight carrying poles pushed through the lashings and projecting at each side. There is no cart, no wheels, no animal and no person.
SILHOUETTE: one solid stacked block, taller than it is wide, with stepped square shoulders where crate edges meet; two thin straight poles crossing the block horizontally and sticking out past both sides; the base sits flat and square on the baseline.
INTERIOR MARKS: the horizontal and vertical joints between the crates, the elliptical rims of two drums, the lashing straps, and the two carrying poles, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no wheels; no cart; no vehicle; no animals; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
Variant forward_depot__emplaced — same template, same COLOUR-FLAT stanza, these four lines replaced:
SUBJECT: an unpacked forward supply dump laid out on the ground: wooden crates and fuel drums spread out low and wide in two rows, sheltered under a wide flat tarpaulin canopy raised on four thin straight poles, with a short low revetment of stacked bags along the front. There is no cart, no wheels and no person.
SILHOUETTE: a wide flat arrangement, much wider than it is tall; a long straight horizontal canopy slab across the top held up by four thin vertical poles, with a clear open gap of empty space between the canopy and the stores below it; a low broken row of boxes and drums along the baseline with a squat bag wall in front.
INTERIOR MARKS: the four canopy poles, the joints between crates, two drum rims, the courses of the bag wall, and the open gap under the canopy, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
8.3 Tier 2 — Workshop (Industry 2)
8.3.1 Fighter — fighter
ART-710
| Class · movement · domain | fighter · air · air |
| Role (US-1460) | Owns the sky over your own ground; short-legged and near-useless against anything dug in |
| Close cell | 128 × 128 · atlas units-close · cell (0,1) |
| Team colour (ART-205) | Implicit — base only (ART-247 #9) — the 8 x 6 px canopy is too small to read by shape |
| Variants | none (grounded/airborne is transform + shadow — ART-480) |
| Template | AIR, {{SPAN}} = 55 |
| Painted span | 68 px |
Silhouette concept. The smallest real aeroplane in the game: one slim fuselage, sharply swept wings, a small tailplane, no visible engine nacelles. Sharp sweep plus small span is the cue — the Fighter is the only aircraft whose wing leading edge is steeply raked.
Accept / reject. Accept: span 64–72 px, wing sweep 35–50°, exactly one fuselage, zero nacelles, nothing at or below y = 88. Reject: any nacelle (that is a Bomber); a straight unswept wing; a span over 80 px; a side view; a banked or three-quarter view.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a single-seat jet fighter aircraft seen from directly above, nose to the right: one slim pointed fuselage, sharply swept-back wings, a small swept tailplane at the rear, no external engine pods and no propellers.
SILHOUETTE: a compact arrowhead; a narrow spindle of fuselage with two strongly raked triangular wings sweeping back from it and a much smaller pair of tail surfaces behind; the whole shape is small, sharp and pointed, with no bumps on the wings.
INTERIOR MARKS: the canopy as a small black lozenge on the fuselage, the wing root lines, and the tailplane leading edge, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic plan view seen from directly overhead, aircraft nose pointing right, wings flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one aircraft only, centred, wingspan filling about 55% of the frame width, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no clouds; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no roundels; no flags; no national markings; no contrails; no missiles; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.3.2 Armour — armour
ART-720
| Class · movement · domain | armour · tracked · land |
| Role (US-1470) | Breaks a line and exploits the gap; badly punished by rough ground |
| Close cell | 128 × 128 · atlas units-close · cell (1,1) |
| Team colour (ART-205) | Explicit (ART-247 #10) — armour_detail.png; the gun tube is untinted. Track band and all five road wheels stay masked |
| Variants | none |
| Template | LAND |
Silhouette concept. A medium tank in pure side elevation: a continuous track band with exactly five road wheels, a sloped glacis at the front, and a single centrally-mounted turret with one gun forward. The unbroken bar of track along the baseline is the tracked-class cue and must not be interrupted.
Untinted detail. The gun tube only (ART-247 #10). The track band stays masked — it is the tracked-class footprint of ART-380 and the bottom boundary ART-215 requires the mask to hold — and the five road wheels stay masked too, which is the judgement most worth stating: as seat-foreground discs in a seat-background band their contrast is guaranteed in every palette a player can pick, whereas fixed gunmetal discs disappear the moment somebody chooses a dark seat, taking the counting cue with them.
Tube geometry (ART-445). 12 px thick — 2 px contour, 8 px of authored steel, 2 px contour — over a 36 px exposed run from the turret face to the muzzle, which is 4.5 : 1 and clears all three linear tests with margin. This is the sprite §7 of docs/art/00-art-direction.md works end to end, and its figures are that section's.
Accept / reject. Accept: exactly five road wheels, track band continuous from the front idler to the rear sprocket with zero void beneath it, turret centred on the hull, one gun, painted width 70–78 px; cyan on the gun tube and nowhere else; mask coverage ≥ 60% with the full track band masked (ART-215, verified by ART-595). Reject: seven road wheels (that is Heavy Armour); a weight mark (ART-400 — Armour does not carry one); visible void under the hull; wheels instead of tracks; a turret set back behind the hull midpoint; any cyan on the road wheels, the track band, the hull or the turret.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a medium battle tank in side view facing right: a continuous track run with exactly five evenly spaced road wheels plus a front idler and a rear drive sprocket, a hull with a sloped front glacis plate, and one turret mounted centrally on the hull with a single straight gun barrel pointing right and level.
SILHOUETTE: a long low solid mass sitting on an unbroken horizontal track band that touches the baseline along its whole length with no gap underneath; a squat turret box on top at the middle; one straight barrel line out to the right.
INTERIOR MARKS: exactly five black circular road wheels inside the track band, the track link line along the top run, and the join between hull and turret, all in solid black against the white mass.
UNTINTED DETAIL: the gun barrel only — the tube from the turret face out to the muzzle — in solid cyan. The five road wheels are NOT cyan; they stay solid black. The track band, the hull and the turret are NOT cyan.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly three ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named in INTERIOR MARKS. Solid pure cyan (#00FFFF) for the shapes named in UNTINTED DETAIL and for nothing else at all. Flat pure magenta (#FF00FF) everywhere else. Each ink is one flat solid area of one single colour with a hard edge. No fourth colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.3.3 Destroyer — destroyer
ART-730
| Class · movement · domain | escort · naval · sea |
| Role (US-1480) | The fleet's general-purpose escort; the only mid-tier hull that shoots at submarines and aircraft |
| Close cell | 128 × 128 · atlas units-close · cell (2,1) |
| Team colour (ART-205) | Implicit — base only (ART-247 #11) — the lattice mast is thin lines that need guaranteed contrast |
| Variants | none |
| Template | SEA |
Silhouette concept. A long low hull with a raked bow, exactly two gun turrets — one forward, one aft — one funnel, a distinctive open lattice mast, and a torpedo tube block amidships. Second rung of the warship ladder: two guns. The lattice mast is the secondary cue that separates it from a Corvette at Mid tier where turret count starts to blur.
Accept / reject. Accept: hull 92–100 px, exactly two turrets fore and aft, one funnel, an open latticed mast reading as a triangle of thin white lines, a small block amidships for the tubes. Reject: one or three turrets; a solid pole mast; a tower bridge (that is Cruiser); two funnels.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a fleet destroyer, side on, facing right: a long low hull with a raked bow, exactly two gun turrets, one on the forecastle and one aft, a single funnel amidships, an open latticework mast above the bridge, and a squat torpedo tube mounting amidships between the funnel and the aft turret.
SILHOUETTE: a long low sliver of hull cut off flat at the waterline; two small boxes with short barrels at opposite ends of the deck; one funnel; one open triangular lattice tower rising above the bridge; the whole profile long, lean and low.
INTERIOR MARKS: the deck line, the two gun barrels, the open triangular lattice of the mast drawn as thin black lines with visible gaps, the funnel cap band, and the torpedo tube mounting, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.4 Tier 3 — Foundry (Industry 3)
8.4.1 Air Defence Battery — air_defence_battery
ART-740
| Class · movement · domain | air_defence · wheeled · land |
| Role (US-1490) | Makes a stretch of sky expensive; useless against anything on the ground |
| Close cell | 128 × 128 · atlas units-close · cell (3,1) |
| Team colour (ART-205) | Implicit — base only (ART-247 #12) — unlike the Field Gun's, this barrel cluster is the dominant mass |
| Variants | none |
| Template | LAND |
Silhouette concept. A four-wheeled towed mount carrying a tight cluster of four thin barrels elevated to about 70° — nearly vertical — with a small flat rectangular radar panel behind the mount. The near-vertical barrel cluster is the whole design: a gun pointing at the sky is anti-air, a gun pointing along the ground is artillery, and a player must never have to work out which.
Accept / reject. Accept: barrel elevation 60–80°, exactly four barrels visible as separate thin white lines with 12 px void between them (ART-450), a flat panel behind, four wheels. That cluster is 68 px across at the floor of ART-440 and ART-450 against an 88 px land maximum — see open question 16. Reject: one barrel; barrels below 45°; a muzzle brake; a tracked chassis; a shield that hides the barrel cluster.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a towed anti-aircraft gun battery, side on, facing right: a low four-wheeled carriage carrying a rotating mount with a tight cluster of four long thin gun barrels elevated steeply to about seventy degrees, almost straight up, and a small flat rectangular radar panel standing on a short post behind the mount.
SILHOUETTE: a low wide carriage on four circular wheels, from which four long thin near-vertical lines rise steeply up and slightly right, splayed very slightly apart; a small upright rectangular slab behind them; the overall shape is dominated by the tall near-vertical barrels.
INTERIOR MARKS: the four wheel rims as black circles, the four separated barrel lines with clear gaps between them, and the face of the radar panel, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.4.2 Engineer — engineer
ART-750
| Class · movement · domain | engineer · foot · land |
| Role (US-1500) | Turns terrain into infrastructure; the only way to make a large map traversable and a captured city defensible |
| Close cell | 128 × 128 · atlas units-close · cell (4,1) |
| Team colour (ART-205) | Implicit — base only (ART-247 #13) — untinting the timber would cut the mask across the full painted width |
| Variants | none |
| Template | LAND |
Silhouette concept. One helmeted figure carrying a long timber baulk horizontally on the shoulder, spanning the full painted width, with a shovel blade standing up behind the shoulder. The horizontal bar at shoulder height is the cue: no other foot unit has a strong horizontal above y = 30.
Accept / reject. Accept: one figure; a horizontal timber at shoulder height at least 80 px long extending past the body on both sides; a shovel blade clearly above the shoulder line; no weapon. Reject: two figures; a diagonal timber; a rifle; the timber ending at the body outline instead of projecting past it.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: one combat engineer in a domed steel helmet, walking right, carrying a long heavy timber baulk balanced horizontally across one shoulder so that it projects well past the body at both ends, with a broad shovel blade strapped to the back and standing up above the shoulder.
SILHOUETTE: a single upright figure crossed by one strong horizontal bar at shoulder height that sticks out beyond the body on both left and right; a small flat blade shape rising above the shoulder behind the head; legs separated with a clear gap.
INTERIOR MARKS: the long horizontal timber, the shovel blade, the helmet brim line, and the gap between the legs, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no rifle; no weapons; no crew; no people other than those named in SUBJECT; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.4.3 Landing Ship — landing_ship
ART-760
| Class · movement · domain | transport_sea · naval · sea |
| Role (US-1510) | Puts an assault ashore against a defended beach instead of needing an empty one |
| Close cell | 128 × 128 · atlas units-close · cell (5,1) |
| Team colour (ART-205) | Implicit — base only (ART-247 #14) — the ramp is the same steel as the hull and reaches the waterline |
| Variants | none |
| Template | SEA |
Silhouette concept. A low flat-decked hull whose bow ramp is down — a 30° diagonal running forward and below the deck line to touch the waterline — with a square stern and a small wheelhouse right aft. The lowered ramp is the only diagonal that breaks a hull's front profile anywhere in the roster.
Accept / reject. Accept: a clear 25–35° ramp diagonal at the bow reaching the waterline; a low unbroken tank deck; wheelhouse in the aftmost quarter; no gun forward. Reject: a vertical blunt bow (that is Transport); a raked warship bow; a turret; a mast with derricks; a superstructure amidships.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a tank landing ship, side on, facing right, with its bow ramp lowered: a long low boxy hull with a flat open tank deck, a large flat ramp hinged at the bow and dropped forward on a shallow diagonal down to the waterline, a square blunt stern, and one small wheelhouse right at the aft end. The vessel carries no guns.
SILHOUETTE: a long low slab of hull cut off flat at the waterline, with one straight diagonal plane running down and to the right from the bow to touch the waterline; a small box at the far left end; the deck line is otherwise flat and completely unbroken.
INTERIOR MARKS: the lowered ramp's edge, the deck line, the hinge joint at the bow, the wheelhouse window band, and the vehicle-deck floor line, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no beach; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no guns; no turrets; no vehicles on the deck; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.4.4 Heavy Artillery — heavy_artillery
ART-770
| Class · movement · domain | artillery · wheeled · land |
| Role (US-1520) | Reduces fortified cities; nearly immobile and defenceless without a screen |
| Close cell | 128 × 128 · atlas units-close · cell (6,1) |
| Team colour (ART-205) | Explicit (ART-247 #15) — heavy_artillery_detail.png; the gun tube, bore line and muzzle brake are untinted |
| Variants | none |
| Template | LAND |
| Weight mark | required (ART-400) |
Silhouette concept. The Field Gun made enormous: four wheels on a long carriage, a much thicker barrel elevated to about 25° ending in a blocky muzzle brake, a tall gun shield, and a long trail. Carries the weight mark. The barrel should be the longest single straight line in the land roster.
Untinted detail. Tube, bore line and muzzle brake (ART-247 #15) — the longest straight line in the land roster and the block that separates it from the Field Gun. The weight mark stays masked: ART-400 makes it seat foreground, and ART-240's contrast rule keeps it there.
Tube geometry (ART-445). 16 px thick — 2 px contour, 12 px of authored steel, 2 px contour — over the ≥ 52 px run the Accept line already requires, which is ≥ 4.3 : 1 and clears the linear tests. This is the thickest tube in the roster and it is deliberately the one nearest the 4 : 1 line: do not thicken it further to sell "heavy", because 52 : 16 is 3.25 : 1 and stops qualifying. Length is what sells heavy here, and length is what §8.4.4 already asks for. The muzzle brake is measured as an area region, not part of the linear one: ART-445 floors it at 16 px in its smaller dimension, which is what its detail needs to clear the 12 px area floor inside a 2 px contour — but on this cell it MUST be at least 20 px, because a 16 px block on a 16 px tube is not a block, and §4 makes the brake the cue that separates this unit from the Field Gun.
Accept / reject. Accept: four wheels, barrel length at least 52 px, elevation 20–30°, a distinct rectangular muzzle brake block at the tip, weight mark present, painted width 80–88 px; cyan on the tube and muzzle brake and nowhere else; mask coverage ≥ 60% (ART-215, verified by ART-595). Reject: two wheels; no muzzle brake; near-vertical barrels; missing weight mark; a barrel shorter than the Field Gun's; any cyan on the wheels, shield, carriage, trail or weight mark.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a heavy siege artillery piece, side on, facing right: a long four-wheeled carriage, a very long and thick gun barrel elevated about twenty-five degrees with a blocky rectangular muzzle brake at its tip, a tall flat gun shield, and a long heavy trail running back to a spade resting on the ground.
SILHOUETTE: a long massive low assembly, much wider than it is tall, sitting on four circular wheels; one very long thick straight barrel line rising to the right and ending in a distinct square block; one long trail line running down and left to a third ground contact.
INTERIOR MARKS: the four wheel rims as black circles, the edge of the gun shield, and one horizontal black rule inset just above the bottom of the carriage running at least half the vehicle's width, all in solid black against the white mass.
UNTINTED DETAIL: the gun barrel only — the whole tube from where it leaves the shield out to the muzzle, the bore line along it, and the blocky rectangular muzzle brake at its tip — in solid cyan. The four wheels, the shield, the carriage, the trail and the horizontal rule are NOT cyan.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly three ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named in INTERIOR MARKS. Solid pure cyan (#00FFFF) for the shapes named in UNTINTED DETAIL and for nothing else at all. Flat pure magenta (#FF00FF) everywhere else. Each ink is one flat solid area of one single colour with a hard edge. No fourth colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.4.5 Submarine — submarine
ART-780
| Class · movement · domain | submarine · naval · sea |
| Role (US-1530) | Kills shipping and heavy hulls from concealment; helpless once found |
| Close cell | 128 × 128 · atlas units-close · cells (7,1) surfaced, (0,2) submerged |
| Team colour (ART-205) | Implicit — base only, both variants (ART-247 #16, #16a) — bareness is the design; the submerged dashes must tint |
| Variants | surfaced (base) and submerged — distinct art, ART-480 |
| Template | SEA |
Silhouette concept. Surfaced: a smooth rounded whaleback hull awash with one conning tower fin and a single thin periscope, and absolutely nothing else on deck. Submerged: the hull drops below the waterline and is drawn as a 12 px broken (dashed) outline in INK under the rule — the roster's one exception to the closed contour of ART-435, with only the fin and periscope above it.
Rationale for the dashed hull: the submerged Submarine is the one case where the game must draw something the enemy cannot properly see, and the dash is the vocabulary the whole client already uses for uncertain information (UX-420 fidelity rendering). A solid hull under the waterline would say "you can see this"; a dash says "this is here and it is not really visible", which is what submerged means.
Accept / reject. Accept (surfaced): zero funnels, zero masts, zero turrets, one fin, one 8 px periscope at least 16 px long, a rounded hull top with no hard corners. Accept (submerged): fin and periscope above the waterline only; hull below drawn as a broken outline with 12 px dashes and 12 px gaps; hull interior empty. Reject: a deck gun; a superstructure; a solid filled hull in the submerged variant; a submerged variant whose fin is a different shape from the surfaced one's.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a submarine running on the surface, side on, facing right: a long smooth rounded whale-backed hull awash with the waterline part-way up it, one single conning tower fin amidships, and one thin periscope rising from the fin. There is no deck gun, no funnel, no mast and no other deck structure of any kind.
SILHOUETTE: one long smooth cigar shape with a gently curved top and no hard corners, cut off flat at the waterline; a single small vertical fin rising from the middle of it; one very thin straight line rising above the fin. The profile is completely bare apart from the fin.
INTERIOR MARKS: the periscope line, the fin's leading edge, and a single long horizontal deck line along the top of the hull, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no bubbles; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no deck gun; no funnel; no mast; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
Variant submarine__submerged — same template, same COLOUR-FLAT stanza, these stanzas replaced. Note that this variant deliberately breaks ART-330's "nothing below the waterline" rule; it is the single exception in the roster and it MUST be hand-drawn rather than generated if the model will not produce a clean broken outline.
The dashed hull outline is masked, not untinted (ART-247 #16a), and this is the most important thing about the cell: a detected submarine whose hull dashes do not carry the owner's colour is a contact with no owner, at the one moment in the naval game when knowing the owner decides what happens next. Coverage under ART-215 is measured over opaque pixels only, so the gaps between dashes are void and cost the cell nothing — a fully-masked dashed outline scores 100%.
SUBJECT: a submerged submarine seen from the side: only a single conning tower fin and one thin periscope stand above the waterline; the long rounded hull below the water is shown only as a broken dashed outline with nothing inside it, like a symbol on a chart.
SILHOUETTE: above the line, one small fin and one thin vertical periscope, nothing else. Below the line, an empty long cigar-shaped outline drawn as a dashed broken line of short even segments with clear gaps between them; the interior of that outline is completely empty.
INTERIOR MARKS: the periscope line, the fin edge, and the dashed hull outline, all in solid black against the white mass; the dashes are even, at least as long as the gaps between them.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. Only the small fin and periscope stand above it. The dashed empty hull outline hangs just below it. Clear magenta margin above and to the sides.
8.4.6 Bomber — bomber
ART-790
| Class · movement · domain | bomber · air · air |
| Role (US-1540) | Projects force anywhere inside a wide radius; the only tier-3 unit that can knock a city's works offline |
| Close cell | 128 × 128 · atlas units-close · cell (1,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #17) — nothing may compete with the nacelle count on that wing |
| Variants | none |
| Template | AIR, {{SPAN}} = 75 |
| Painted span | 96 px |
Silhouette concept. A straight-winged twin-engine aeroplane seen from above with exactly two engine nacelles as rounded rectangles on the wings, a slim fuselage, a blunt nose and a pointed tail. Second rung of the nacelle ladder (§3.4).
Accept / reject. Accept: exactly two nacelles, each a separate white shape with 6 px of black between it and the fuselage; straight or barely-tapered wings; span 92–100 px; fuselage width no more than 20% of span. Reject: four nacelles (that is Heavy Bomber); zero nacelles (that is a Fighter); a fat fuselage (that is Air Transport); swept wings; a weight mark.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a twin-engined medium bomber aircraft seen from directly above, nose to the right: a slim fuselage with a blunt rounded nose, long straight tapered wings, exactly two engine nacelles mounted on the wings as rounded rectangular pods, and a tail that comes to a point behind a straight tailplane.
SILHOUETTE: a long slim cross; a narrow fuselage spine with two long straight wings out to each side, each wing carrying one clear rounded rectangular bump partway along it; the rear of the fuselage tapers to a point.
INTERIOR MARKS: the two engine nacelles as separate black rounded rectangles, each clearly separated from the fuselage by white; the cockpit as a small black lozenge near the nose; the wing root lines; and the tailplane leading edge, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic plan view seen from directly overhead, aircraft nose pointing right, wings flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one aircraft only, centred, wingspan filling about 75% of the frame width, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no clouds; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no roundels; no flags; no national markings; no bombs; no contrails; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5 Tier 4 — Arsenal (Industry 4)
8.5.1 Missile — missile
ART-800
| Class · movement · domain | missile · air · air |
| Role (US-1550) | Deletes one undefended high-value target twenty-four tiles away, at no risk to anyone you would miss |
| Close cell | 128 × 128 · atlas units-close · cell (2,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #18) — smallest painted area in the roster |
| Variants | none |
| Template | AIR, {{SPAN}} = 24 |
| Painted span | 28 px (fin tip to fin tip); painted length 80 px |
Silhouette concept. Not an aeroplane. A needle: a long thin body with four small cruciform tail fins and one pair of stub mid-body fins. It is the only air unit whose length is more than twice its span, and the only one with no wing area at all. This is the one unit permitted to break ART-350's 32 px minimum painted height, because its length supplies its presence — the body runs 80 px along the cell against a 28 px span. (The requirement used to describe this as a width exemption. That was wrong even at 64 px: the Missile's length has always been its painted width and has always cleared the floor. See open question 9.)
Accept / reject. Accept: body length 76–84 px, total span under 32 px, four visible tail fins, no cockpit, no wing. Reject: anything with a recognisable wing (that is a Fighter); a span over 40 px; a fuselage that tapers like an aeroplane rather than running parallel-sided; an exhaust plume.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a cruise missile seen from directly above, nose to the right: a long slender parallel-sided body with a pointed nose, one pair of very small straight stub fins partway along the body, and four small cruciform fins in a cross at the tail. It has no cockpit, no canopy and no proper wing.
SILHOUETTE: a long thin needle, several times longer than it is wide, with two tiny stubs partway along and a small cross of four fins at the left end. There is almost no wing area at all. It must not read as an aeroplane.
INTERIOR MARKS: the four tail fins as separate thin black lines, the two stub fins, and one thin black centre line along the body, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic plan view seen from directly overhead, missile nose pointing right, fins flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one missile only, centred, its body length filling about 62% of the frame width and its fin span filling only about 24% of the frame height, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no clouds; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no exhaust; no flame; no smoke trail; no contrail; no launch rail; no cockpit; no wings; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5.2 Air Transport — air_transport
ART-810
| Class · movement · domain | transport_air · air · air |
| Role (US-1560) | Drops infantry behind the line; the only unit that can put troops on a rear city with no ground approach |
| Close cell | 128 × 128 · atlas units-close · cell (3,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #19) — its cues are a width and a notch; neither is a material |
| Variants | none (loaded state is an overlay — ART-480) |
| Template | AIR, {{SPAN}} = 80 |
| Painted span | 104 px |
Silhouette concept. The fattest body in the game. A high straight wing over a deep slab fuselage at least 30% of the span in width, two nacelles, and a squared-off tail with a rectangular ramp notch cut into its trailing edge. Unarmed (ART-420). The notch plus the fuselage width is what separates it from the Bomber, whose fuselage is slim and whose tail comes to a point.
Accept / reject. Accept: fuselage width at least 32 px against a 104 px span; a square tail end with a visible rectangular notch cut into it; two nacelles; no gun, no bomb, no turret. Reject: a slim fuselage; a pointed tail; four nacelles; any weapon; a span over 112 px.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a twin-engined military cargo transport aircraft seen from directly above, nose to the right: a very fat deep slab-sided fuselage, long straight high-mounted wings carrying exactly two engine nacelles, a wide square tailplane, and a squared-off blunt tail end with a rectangular loading-ramp notch cut into its trailing edge. It carries no weapons.
SILHOUETTE: a broad blunt cross; the fuselage is unusually wide and boxy, close to a third of the wingspan in width, with parallel sides; the tail end is cut off square and has a clear rectangular notch bitten out of it; the wings are straight and unswept, each with one rounded rectangular bump.
INTERIOR MARKS: the two engine nacelles as separate black rounded rectangles, the rectangular ramp notch in the tail, the flight-deck window band near the nose, and the wing root lines, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic plan view seen from directly overhead, aircraft nose pointing right, wings flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one aircraft only, centred, wingspan filling about 80% of the frame width, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no clouds; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no roundels; no flags; no national markings; no guns; no turrets; no bombs; no parachutes; no cargo; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5.3 Heavy Armour — heavy_armour
ART-820
| Class · movement · domain | armour · tracked · land |
| Role (US-1570) | The hammer that cracks a dug-in line at one point; expensive enough that losing one is a campaign event |
| Close cell | 128 × 128 · atlas units-close · cell (4,2) |
| Team colour (ART-205) | Explicit (ART-247 #20) — heavy_armour_detail.png; the gun tube and muzzle brake are untinted. Seven road wheels stay masked |
| Variants | none |
| Template | LAND |
| Weight mark | required (ART-400) |
Silhouette concept. Armour, but longer, lower and heavier: seven road wheels in the track band, a steeply sloped glacis, a big turret set back behind the hull midpoint carrying a very long gun with a muzzle brake, and a side skirt plate over the upper track run. Carries the weight mark.
Untinted detail. Tube and muzzle brake (ART-247 #20). It matters more here than on Armour: at 44 px the tube is the length comparison that separates the two tanks, and as machinery it stops being confusable with the skirt-plate rule running just above it. Wheels, skirt plate and weight mark all stay masked, for the same contrast reason as Armour's.
Tube geometry (ART-445), and this cell is the one the geometry actually constrains. 12 px thick — 2 px contour, 8 px of authored steel, 2 px contour — over the ≥ 44 px run the Accept line requires, which is ≥ 5.5 : 1. Draw it 12 px and not 16. The vehicle's bulk invites a 16 px tube, and at 16 the aspect is 44 : 12 = 3.7 : 1, which fails ART-445 rule 5 — a region that is not linear detail is not entitled to the 2 px contour either, so the tube falls back to 8 px contours and the 12 px area floor, needing 28 px of thickness, which is the dead end D-7 exists to escape. The gun reads heavy through length, which is the cue §4 assigns it anyway. The muzzle brake is an area region and MUST be at least 16 px in its smaller dimension (ART-445).
Accept / reject. Accept: exactly seven road wheels; turret centre aft of the hull midpoint; gun length at least 44 px with a muzzle brake block; a skirt plate as a long horizontal white line over the track; weight mark present; painted width 84–88 px; cyan on the tube and muzzle brake and nowhere else; mask coverage ≥ 60% with the full track band masked (ART-215, verified by ART-595). Reject: five road wheels; a centrally-mounted turret; no muzzle brake; missing weight mark; a width equal to or below Armour's; any cyan on the road wheels, skirt plate, weight mark, track band, hull or turret.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a heavy battle tank in side view facing right: a long low hull on a continuous track run with exactly seven evenly spaced road wheels, a steeply sloped front glacis plate, a long side skirt plate covering the top of the track run, and a large turret set back behind the middle of the hull carrying a very long gun barrel with a blocky muzzle brake at its tip.
SILHOUETTE: a long, low, massive mass sitting on an unbroken track band that touches the baseline along its whole length with no gap underneath; the front glacis is a strong diagonal; a big turret box sits toward the rear; one very long barrel line runs out to the right ending in a small square block.
INTERIOR MARKS: exactly seven black circular road wheels inside the track band, the long horizontal skirt plate line above them, and one horizontal black rule inset just above the bottom of the hull running at least half the vehicle's width, all in solid black against the white mass.
UNTINTED DETAIL: the gun barrel only — the tube from the turret face out to the muzzle — and its square muzzle brake, in solid cyan. The seven road wheels, the skirt plate line and the horizontal rule are NOT cyan; they stay solid black. The track band, the hull and the turret are NOT cyan.
VIEW: orthographic side elevation, camera exactly level with the subject, subject facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly three ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named in INTERIOR MARKS. Solid pure cyan (#00FFFF) for the shapes named in UNTINTED DETAIL and for nothing else at all. Flat pure magenta (#FF00FF) everywhere else. Each ink is one flat solid area of one single colour with a hard edge. No fourth colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one subject only, centred, filling about 85% of the frame width. Its ground contact points rest on an invisible horizontal baseline at 80% of the frame height. Nothing below that baseline. Clear magenta margin on all four sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5.4 Heavy Bomber — heavy_bomber
ART-830
| Class · movement · domain | bomber · air · air |
| Role (US-1580) | Wrecks an enemy's industry from beyond the front; cannot be touched by an army that did not climb |
| Close cell | 128 × 128 · atlas units-close · cell (5,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #21) — a four-count of small marks on a wide thin wing tolerates no second value |
| Variants | none |
| Template | AIR, {{SPAN}} = 90 |
| Painted span | 112 px |
| Weight mark | required (ART-400) — carried as a rule across the fuselage spine |
Silhouette concept. The widest silhouette in the game: long thin straight wings carrying four nacelles, a long slim fuselage, and a wide tailplane. The nacelle count is the cue and it is the feature most likely to be destroyed by reduction — ART-580 exists mostly for this sprite.
Accept / reject. Accept: exactly four nacelles, two per wing, each separated by at least 6 px of black from its neighbour; span 108–112 px — the top of the range is the full live box, so this sprite has no headroom left; a wide straight tailplane; weight mark present as a rule along the fuselage. Reject: two nacelles; nacelles merged into a single bar; span under 104 px; swept wings; missing weight mark.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a four-engined heavy strategic bomber seen from directly above, nose to the right: a long slim fuselage, very long straight thin wings carrying exactly four engine nacelles, two on each wing and clearly separated from one another, and a wide straight tailplane at the rear.
SILHOUETTE: a very wide slim cross, wider than any other aircraft; a narrow fuselage spine with two long straight thin wings, each wing carrying two distinct rounded rectangular bumps with a clear gap between them; a broad tailplane at the back.
INTERIOR MARKS: the four engine nacelles as four separate black rounded rectangles with clear white gaps between them, the flight-deck window band near the nose, the wing root lines, and one straight black rule running along the lower edge of the fuselage spine, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic plan view seen from directly overhead, aircraft nose pointing right, wings flat and level in the picture plane. No perspective, no foreshortening, no banking, no tilt, no three-quarter view, no side view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one aircraft only, centred, wingspan filling about 90% of the frame width, floating free with clear magenta on all four sides and a wide clear band across the bottom quarter of the frame.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no ground plane; no scenery; no sky; no clouds; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no roundels; no flags; no national markings; no bombs; no contrails; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5.5 Cruiser — cruiser
ART-840
| Class · movement · domain | capital_ship · naval · sea |
| Role (US-1590) | The strongest thing afloat gun for gun; slow, expensive, a magnet for submarines and bombers |
| Close cell | 128 × 128 · atlas units-close · cell (6,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #22) — nine barrels and a stepped tower are all contrast-legible, not shape-legible |
| Variants | none |
| Template | SEA |
Silhouette concept. The longest, tallest hull in the game short of the Carrier: three triple turrets — two forward, one aft — a stepped tower bridge, and two funnels. Top rung of the warship counting ladder. The stepped tower is the secondary cue: no other hull has a superstructure that climbs in visible steps.
Accept / reject. Accept: exactly three turrets, each showing three barrels as separate white lines; two funnels; a stepped tower bridge of at least three visible steps; hull 104–112 px. Reject: two or four turrets; single-barrel turrets; a flight deck (that is Carrier); a lattice mast (that is Destroyer); one funnel.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: a heavy gun cruiser, side on, facing right: a long high-freeboard hull with a raked bow, exactly three gun turrets each carrying three barrels, two turrets forward and one aft, a tall stepped tower bridge structure that climbs in clear rectangular steps, and two funnels amidships.
SILHOUETTE: a long tall powerful hull cut off flat at the waterline; three squat turret boxes with clusters of barrels; a tall stepped block of superstructure forward that steps up in stages; two funnels behind it; the profile is the heaviest and tallest of any warship.
INTERIOR MARKS: the deck line, three groups of three black barrel lines with clear gaps between the barrels, the steps of the tower drawn as horizontal lines, the two funnel cap bands, and the bridge window bands, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no aircraft; no flight deck; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
8.5.6 Carrier — carrier
ART-850
| Class · movement · domain | carrier · naval · sea |
| Role (US-1600) | Moves your air force's home and projects air power beyond your borders |
| Close cell | 128 × 128 · atlas units-close · cell (7,2) |
| Team colour (ART-205) | Implicit — base only (ART-247 #23) — the deck is the silhouette and the island is the only break in it |
| Variants | none (embarked aircraft are never drawn — US-330, ART-480) |
| Template | SEA |
Silhouette concept. One long unbroken flat plane overhanging both bow and stern, with a single small island superstructure offset to the right of centre and zero turrets (ART-420). The flat-topped rectangle is the most distinctive naval silhouette in the game and must not be broken by anything except the island.
Accept / reject. Accept: an unbroken deck line 112 px long overhanging the hull at both ends — the full live box, which ART-350 permits a naval unit; exactly one island, 16–24 px wide, positioned right of centre; zero turrets and zero barrels; hull visibly narrower than the deck. Reject: any turret or gun barrel; aircraft parked on the deck; a broken or stepped deck line; an island on the centreline or to the left.
Flat hard-edged stencil sprite for a turn-based strategy wargame counter.
SUBJECT: an aircraft carrier, side on, facing right: one long flat unbroken flight deck running the whole length of the ship and overhanging the hull at both the bow and the stern, a hull below it that is clearly narrower than the deck, and one small island superstructure standing on the deck to the right of centre with a short mast. The ship has no gun turrets and no gun barrels at all.
SILHOUETTE: a long flat slab across the top, perfectly straight and unbroken from end to end, overhanging at both ends; a shallower hull beneath it cut off flat at the waterline; one small upright box standing on the deck right of centre. Nothing else breaks the deck line.
INTERIOR MARKS: the long straight deck edge line, the underside of the deck overhang at bow and stern, the island's window band, its short mast, and a single long deck centre line, all in solid black against the white mass.
UNTINTED DETAIL: none. Every part of the subject is one of the two inks.
VIEW: orthographic side elevation, camera exactly level with the waterline, vessel facing right. No perspective, no vanishing point, no foreshortening, no tilt, no three-quarter view, no isometric view.
COLOUR: exactly two ink colours and nothing else. Solid pure white (#FFFFFF) for the mass of the subject. Solid pure black (#000000) for the closed outline running all the way around the silhouette and for the marking shapes named above. Flat pure magenta (#FF00FF) everywhere else. No third colour anywhere, no grey, no gradient, no shading, no highlight, no ambient occlusion, no texture, no anti-aliasing, no soft edges.
LIGHTING: none. This is a printed stencil, not a rendering of a lit object.
FRAMING: one vessel only, centred, filling about 90% of the frame width. A single straight black horizontal rule runs edge to edge across the frame at 72% of the frame height: this is the waterline. The hull is cut off flat where it meets that rule. Nothing at all below the rule. Clear magenta margin above and to the sides.
STYLE: printed wargame counter; silkscreen stencil; military map symbol; bold chunky simplified forms; one heavy unbroken solid black outline running all the way around the whole silhouette, about 8% of the frame width (which lands near 8 px in the delivered cell; the hand pass sets it exactly), the same weight everywhere and closed with no breaks; every other stroke at least 1/32 of the frame wide; the shape must still be recognisable when the whole image is reduced to a 128 pixel thumbnail.
NEGATIVE: no colour beyond the inks named in COLOUR; no grey; no gradient; no shading; no shadow; no reflection; no water; no waves; no wake; no scenery; no sky; no horizon; no terrain; no text; no numbers; no letters; no logos; no insignia; no flags; no national markings; no guns; no turrets; no aircraft; no aeroplanes on the deck; no deck markings; no crew; no people; no UI frame; no border; no drop shadow; no bevel; no emboss; no glow; no outline glow; no grid; no multiple views; no turnaround sheet; no sprite sheet; no contact sheet; no photorealism; no 3D render; no painterly rendering; no watermark; no signature.
OUTPUT: one single 1024x1024 PNG image.
9. The Mid tier — a redraw, not a downscale
ART-860 Mid-tier cells (64 × 64) MUST be hand-redrawn from the Close cell, not produced by resampling it.
Rationale, and it is specific to flat masked art: a box filter reduces a five-road-wheel track band to a smear of intermediate values, and ART-220 permits no intermediate value anywhere. Thresholding that smear back produces either a solid bar (the wheels are gone) or noise (the wheels became four wheels, or six).
Rationale, additionally, for why the Mid tier carries no detail layer at all — ART-135 of docs/art/00-art-direction.md settles it, and this document's own reduction gives the same answer from the other end. A resampled layer boundary is a partial tint, which renders as a blend belonging to no seat and which the pre-tinted Canvas path cannot bake; ART-1145 of docs/art/02-terrain.md makes the same finding for its own mid variants. At 64 px a gun tube is three or four pixels thick, so there is nothing left to say about its material anyway. The four explicit cells are therefore explicit at Close and base-only at Mid, and nothing about that needs redrawing twice.
And the reason that has not changed at all: what happens to the road wheels happens equally to three turrets, four nacelles and two figures' heads. Every counting cue in §3.4 is destroyed by the reduction that would save the work. Twenty-five cells at 64 px is roughly a day; the alternative is a tier at which Armour and Heavy Armour are the same sprite.
ART-870 At the Mid tier the Close figures of ART-435, ART-440 and ART-450 are halved: the closed contour is 4 px, no part of the silhouette is thinner than 4 px, an interior ink stroke is 2 to 4 px, an ink-to-ink gap is at least 2 px and a void gap at least 6 px. The counting cues of §3.4 MUST survive: 5 and 7 road wheels as 2 px dots at 2 px spacing; 1, 2 and 3 turrets as 4 px bumps on the deck line at 2 px spacing; 2 and 4 nacelles as 4 px marks on the wing.
ART-880 Mid-tier geometry MUST be the Close geometry of ART-300 halved: a 4 px frame band, a live box of (4,4)–(60,60), four 18 × 18 corner reserves at its corners assigned as ART-305 assigns them, an identity core of (16,16)–(48,48), land baseline y = 52, waterline y = 50–51 spanning x = 4–59, air confined to y = 12–40 with nothing at or below y = 44, no ink above y = 12, and painted-box maxima of 44 px wide for a land unit and 56 px for a naval or air one.
ART-890 The following MUST be dropped at the Mid tier, in this order, until the cell is legible: window bands, deck centre lines, wheel spokes (keep the wheel as a filled disc), track link lines, lashing straps, hatch rows, cockpit lozenges, sandbag courses. The following MUST NOT be dropped at any point: the waterline, the counting cue, the weight mark, the ramp diagonal, the antenna, the Engineer's timber, the Militia sandbag block's outline, the Cadre's flared hem, the Air Transport's tail notch.
A gun tube that is untinted at Close MUST be redrawn into the base at Mid, in INK, because ART-135 gives the Mid cell no layer to put it in. It is the one element that changes channel between tiers, and forgetting it leaves a hole in four sprites.
10. The Chip tier
At the Chip tier (~0.25×) a 32 CSS px tile is 8 CSS px, which is 24 device px at DPR 3 and a 32 px cell (ART-300 of docs/art/00-art-direction.md). A 128 px sprite reduced to 32 px is not a small sprite, it is four grey blobs and there is no grey. The ground truth is explicit about what replaces it: flat chips in owner colours bearing the unit's short class label.
ART-900 Chips MUST be 32 × 32 px — the Chip cell of ART-300 of docs/art/00-art-direction.md, not the 16 px this document used to derive from DPR 2 — and MUST be generated procedurally by the build, never by an image generator and never by hand.
Rationale: a chip is a plate, a label and at most two modifier marks. It is a hundred lines of drawing code that is exactly right twenty-three times, versus twenty-three generations of two-letter text — the single thing image models are worst at, at the single size where being wrong by one pixel is fatal. There is no version of this where generating chips is the cheaper path.
Where this code runs is not settled. ART-140 of
docs/art/00-art-direction.mdnow requires the Chip and Strategic tiers to be drawn at runtime, with no Chip or Strategic raster in the shipped art set, because a pre-baked page cannot carry a label from the active locale and MOD-430 requires that it can. This section and §11 describe the same construction as a build step emitting an atlas page, and §12's cell coordinates, atlas geometry (ART-1030) and frame-table check (ART-1040) are written to that shape. The construction below is the drawing code either way — the plate shapes, the label table, the modifier marks and the marker shapes are unchanged by the question. Only where it executes is open, and it is open question 17. Any Chip or Strategic raster currently committed is bootstrap under ART-415 of that document and is deleted in the same change that lands the drawing code (ART-145 there), not before it and not afterwards.
ART-910 A chip MUST be composed of exactly four elements:
- A plate filled in the owner's background colour, carrying the seat's pattern overlay (UX-1310, defined in the foundations document).
- A 2 px keyline around the plate in the owner's foreground colour.
- A two-letter label in the owner's text colour (UX-210), composited from a 10 × 14 bitmap glyph atlas.
- Zero or more modifier marks (ART-940, ART-950).
This is where UX-440's Chip-tier ownership guarantee is actually discharged for units, and it is discharged about as completely as it can be: every element of a chip is in the owner's colours, so the entire 8 CSS px marker changes with its owner. The sprite's own obligation therefore sits at Close and Mid, and ART-595 measures it at the bottom of the Mid range rather than here.
ART-920 The plate shape MUST be determined by movement class, so that ownership and identity are both carried by shape and not by hue alone (UX-1310):
| Movement class | Plate shape (32 × 32) | Label box |
|---|---|---|
foot |
Plain square, x2–29, y2–29, square corners | x4–27, y10–23 |
wheeled |
Square with both lower corners chamfered 6 px | x4–27, y8–21 |
tracked |
Square with a solid 4 px foreground bar along the full lower edge | x4–27, y6–19 |
naval |
Pennant: square body x2–23 with a pointed right end reaching x30 | x4–21, y10–23 |
air |
Lozenge: pointed at both left and right ends, body x6–25 | x6–25, y10–23 |
Rationale: this is the cue that does the heavy lifting once the sprite is gone. AR, AT, AC and AD are four labels that differ in one glyph at 10 px — but Armour is on a tracked plate, Air Transport on a lozenge, Cadre on a plain square and Air Defence Battery on a chamfered one. The player is reading a shape and confirming with a letter, not squinting at a letter.
ART-930 The two-letter labels MUST be exactly these twenty-three, and no two MAY collide:
| Unit | Label | Plate | Unit | Label | Plate |
|---|---|---|---|---|---|
| Scout | SC |
foot | Landing Ship | LS |
naval + carrier notch |
| Infantry | IN |
foot | Heavy Artillery | HA |
wheeled + weight rule |
| Field Gun | FG |
wheeled | Submarine | SU |
naval |
| Transport | TR |
naval + carrier notch | Bomber | BM |
air |
| Corvette | CT |
naval | Missile | MS |
air |
| Militia | MI |
foot | Air Transport | AT |
air + carrier notch |
| Administrative Cadre | AC |
foot | Heavy Armour | HR |
tracked + weight rule |
| Forward Depot | FD |
foot | Heavy Bomber | HB |
air + weight rule |
| Fighter | FI |
air | Cruiser | CR |
naval |
| Armour | AR |
tracked | Carrier | CV |
naval + carrier notch |
| Destroyer | DD |
naval | |||
| Air Defence Battery | AD |
wheeled | |||
| Engineer | EN |
foot |
ART-940 A unit whose capacity is greater than zero — Transport, Landing Ship, Air Transport, Carrier — MUST carry the carrier notch: an 8 × 4 px rectangle of the plate removed from the centre of its upper edge.
ART-950 A unit whose name begins "Heavy" — Heavy Artillery, Heavy Armour, Heavy Bomber — MUST carry the weight rule: a 2 px foreground line inset 4 px from the lower edge of the plate, running the plate's inner width. This is the Chip-tier continuation of ART-400.
Rationale for both modifiers: they are the two distinctions the two-letter labels handle worst. AR/HR differ in one glyph and share a plate, so the weight rule separates them by an unmistakable horizontal. TR/CR differ in one glyph and share a plate, so the notch separates the thing that carries from the thing that shoots — which is also the more consequential mistake to make.
ART-960 The label MUST be drawn from a 10 × 14 uppercase bitmap glyph atlas, letter-spaced 2 px, centred in the label box of ART-920, snapped to integer pixels. It MUST NOT be rendered from a vector font at runtime, and MUST NOT be anti-aliased.
Rationale: a hinted vector font at 14 px on a fractional-zoom canvas produces sub-pixel positioning and grey fringes — a third tone at the tier that can least afford one. A bitmap atlas is exact, and the client already needs a canvas glyph atlas for its other on-map labels.
ART-970 The chip build MUST be deterministic and MUST be regenerated from the label table on every build, so that renaming a unit or adding one cannot leave a stale chip in the atlas. Reference implementation shape:
for unit in roster: # ascending id order, per US-050
plate = PLATE[unit.terrainClass] # ART-920
chip = fill(plate, BACKGROUND) + keyline(plate, FOREGROUND)
if unit.capacity > 0: chip = notch(chip) # ART-940
if unit.name.startswith("Heavy"): chip = rule(chip) # ART-950
chip = blit_label(chip, LABEL[unit.id], glyphs10x14, box=LABELBOX[unit.terrainClass])
emit(chip, cell=CHIP_CELL[unit.id])
11. The Strategic tier
At ≤ 0.125× a tile is 4 CSS px, 12 device px at DPR 3, and the cell is 16 px (ART-300 of docs/art/00-art-direction.md). Nothing survives but a shape and a count. The ground truth is again explicit: owner-coloured markers only, one per location with a count.
ART-980 Strategic markers MUST be 16 × 16 px, procedurally generated, and there MUST be exactly four of them — one per aggregate domain of the location, not one per unit:
| Marker | Shape at 16 × 16 | Meaning |
|---|---|---|
mk_land |
Filled square, 12 × 12, centred | The location's units are all land |
mk_sea |
Filled diamond, 14 × 14 across the points | All sea |
mk_air |
Filled triangle, apex up, 14 wide × 12 tall | All air |
mk_mixed |
Filled octagon, 14 × 14 (a square with 2 px corners cut) | More than one domain present |
Rationale: square, diamond, triangle and octagon are the four shapes that remain mutually distinguishable at 16 px in a single flat colour. Anything more elaborate collapses; anything more numerous stops being counted at a glance. Per-unit markers are not merely unaffordable at this zoom, they are illegible — the UX budget table calls forty thousand dots "not a picture of anything", and it is right.
ART-990 Each marker MUST carry a 2 px foreground keyline and the seat pattern overlay, so that ownership at this tier is not hue alone (UX-1310).
ART-1000 The count MUST be encoded primarily by marker size band, and only secondarily by a numeral:
| Count | Marker size |
|---|---|
| 1 | 10 × 10 |
| 2–4 | 12 × 12 |
| 5–9 | 14 × 14 |
| 10+ | 16 × 16 |
ART-1010 Where the numeral is drawn it MUST come from the same 10 × 14 bitmap glyph atlas as the chip labels, placed to the right of the marker, and it MUST be suppressed when the adjacent tile is also occupied.
Honest note: a 10 × 14 numeral at this zoom is at the edge of legibility and will be unreadable to some players on some displays. That is why the size band is normative and the numeral is not the primary channel — and why the exact count belongs on hover and in the Command View (UX-395) rather than on the map at 0.125×.
ART-1020 Fidelity-graded contact markers — the unattributed Trace, the Sighting with a count band and no identity (UX-420, UX-425) — are not unit art and are specified by the sibling overlay document. This document supplies only the four owned-unit domain markers above.
12. Manifest
12.1 Directory layout
art/
src/units/<id>[__<variant>].png 1024x1024 generator output, magenta key (+ cyan on
the four explicit cells), kept for re-derivation
master/units/close/<id>[__<variant>].png 128x128 RGBA tint-mask base, hand-finished
master/units/close/<id>_detail.png 128x128 RGBA straight-alpha detail layer
-- EXPLICIT CELLS ONLY, and Close only (ART-135):
field_gun, armour, heavy_artillery, heavy_armour
master/units/mid/<id>[__<variant>].png 64x64 RGBA tint-mask base, hand-redrawn
-- base only, every cell, no detail layer at Mid
build/atlas/units-close.png 2048x1024 8 x 4 grid, cell 128, stride 136, padded to pow2
build/atlas/units-close-detail.png 2048x1024 companion, IDENTICAL geometry (ART-455)
build/atlas/units-mid.png 1024x512 8 x 4 grid, cell 64, stride 72, padded to pow2
build/atlas/units-chip.png 512x128 8 x 3 grid, cell 32, stride 40 (generated, ART-970)
build/atlas/markers-strategic.png 128x32 4 x 1 grid, cell 16, stride 24 (generated, ART-980)
build/atlas/*.json frame table: id -> {x, y, w, h}
tools/verify_cell.py ART-590
tools/ownership_read.sh ART-595
tools/build_chips.py ART-970
Three notes on that tree, because two words in it mean something different in the foundations document and the third path does not exist yet.
master/units/**here is the hand-finished delivered cell — 128 px at Close, 64 px at Mid — which isart/src/<tier>/indocs/art/00-art-direction.md. That document'sart/master/is a different thing: the 512 px artwork of record of its ART-280. Do not conflate them, and in particular do not satisfy ART-280 by enlarging a file from this tree. A 512 px master MUST be re-rendered from the source that constructed the sprite, or kept from generation; it MUST NOT be produced by upscaling a 128 px raster, because an upscaled master has the size, name and location of an artwork of record while carrying no information the delivered cell did not. Where no 512 px master exists for a sprite, the 128 px file is the artwork of record andart/README.mdnames that sprite (ART-280).build/atlas/is where these pages belong;art/atlas/is where they currently are. Untilelc-atlaspackexists the packed pages are committed as a labelled bootstrap under ART-415 ofdocs/art/00-art-direction.md— generated output, not to be hand-edited, not a source of truth, withart/atlas/README.mdsaying so — and they move to thebuild/atlas/paths above, derived and gitignored, in the change that lands the packer. The filenames and geometry do not change; only the directory does.units-chip.pngandmarkers-strategic.pngare the disputed pair. They are listed here as build output; ART-140 of the foundations document says both tiers are drawn at runtime and ship no raster at all. See §10's note and open question 17. Whichever way that resolves, the copies currently committed are bootstrap under note 2 and are removed under ART-145 there.
ART-1025 Exactly one companion page ships: units-close-detail.png. It MUST have identical slot geometry, stride and assignment to units-close.png (ART-455 of docs/art/00-art-direction.md), and cells whose frame declares no detail — all 21 of them — MUST be fully transparent on it. There MUST be no Mid companion page, because ART-135 forbids a Mid detail layer.
Rationale for one page rather than the pair an earlier draft of this document specified: under ART-185's over, a cell with no detail needs d.a = 0, which a transparent cell already gives. There is nothing to materialise and no branch to avoid — the shader samples the companion unconditionally and gets zero. The earlier draft reached for a second, Mid-tier page and for writing every implicit cell as solid white, both of which were solving a problem the inherited encoding does not have. Note the consequence worth keeping in view: because the whole page is droppable (ART-125), the 21 transparent cells cost nothing at runtime and the four that matter cost one page — which is the measurement open question 11 asks for.
ART-1030 Slot geometry is ART-310 of docs/art/00-art-direction.md, adopted unchanged rather than re-derived: each cell occupies a square slot of cell + 8 px and, from the outside in, a 2 px fully transparent gutter, then a 2 px extrusion ring carrying a copy of the art box's outermost row and column, then the art box itself. Cell pixel origin is therefore x = col × stride + 4, y = row × stride + 4, with stride 136 at Close, 72 at Mid, 40 at Chip and 24 at Strategic. The detail page MUST be extruded the same way, in RGB and in alpha, or a tube acquires a fringe of the wrong seat colour at fractional zoom. Atlas canvases MUST be padded to the power-of-two sizes listed above so that the WebGL1 fallback path of UX-385 can sample them without restriction.
ART-1040 Atlas frame tables MUST be emitted as JSON keyed by <id> or <id>__<variant>, and the build MUST fail if any roster id has no Close cell, no Mid cell and no chip, or if the elc.detail.frames list (ART-455) does not name exactly the four cells ART-247 records as explicit.
12.2 Every sprite
Close and Mid share the same cell coordinates. Chip coordinates are separate because chips have no variants.
| # | Unit | id |
Tier | Class | Move | Close & Mid cell | Chip cell | Label | Variants | Mask (ART-205) | Atlases |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Scout | scout |
1 | recon |
foot | (0,0) | (0,0) | SC |
— | implicit | close, mid, chip |
| 2 | Infantry | infantry |
1 | infantry |
foot | (1,0) | (1,0) | IN |
— | implicit | close, mid, chip |
| 3 | Field Gun | field_gun |
1 | artillery |
wheeled | (2,0) | (2,0) | FG |
— | explicit | close, mid, chip, close-detail |
| 4 | Transport | transport |
1 | transport_sea |
naval | (3,0) | (3,0) | TR |
— | implicit | close, mid, chip |
| 5 | Corvette | corvette |
1 | escort |
naval | (4,0) | (4,0) | CT |
— | implicit | close, mid, chip |
| 6 | Militia | militia |
aux | garrison |
foot | (5,0) | (5,0) | MI |
— | implicit | close, mid, chip |
| 7 | Administrative Cadre | admin_cadre |
aux | administration |
foot | (6,0) | (6,0) | AC |
— | implicit | close, mid, chip |
| 8 | Forward Depot | forward_depot |
aux | logistics |
foot | (7,0) | (7,0) | FD |
__emplaced at (0,3) |
implicit | close, mid, chip |
| 9 | Fighter | fighter |
2 | fighter |
air | (0,1) | (0,1) | FI |
— | implicit | close, mid, chip |
| 10 | Armour | armour |
2 | armour |
tracked | (1,1) | (1,1) | AR |
— | explicit | close, mid, chip, close-detail |
| 11 | Destroyer | destroyer |
2 | escort |
naval | (2,1) | (2,1) | DD |
— | implicit | close, mid, chip |
| 12 | Air Defence Battery | air_defence_battery |
3 | air_defence |
wheeled | (3,1) | (3,1) | AD |
— | implicit | close, mid, chip |
| 13 | Engineer | engineer |
3 | engineer |
foot | (4,1) | (4,1) | EN |
— | implicit | close, mid, chip |
| 14 | Landing Ship | landing_ship |
3 | transport_sea |
naval | (5,1) | (5,1) | LS |
— | implicit | close, mid, chip |
| 15 | Heavy Artillery | heavy_artillery |
3 | artillery |
wheeled | (6,1) | (6,1) | HA |
— | explicit | close, mid, chip, close-detail |
| 16 | Submarine | submarine |
3 | submarine |
naval | (7,1) | (7,1) | SU |
__submerged at (0,2) |
implicit | close, mid, chip |
| 17 | Bomber | bomber |
3 | bomber |
air | (1,2) | (0,2) | BM |
— | implicit | close, mid, chip |
| 18 | Missile | missile |
4 | missile |
air | (2,2) | (1,2) | MS |
— | implicit | close, mid, chip |
| 19 | Air Transport | air_transport |
4 | transport_air |
air | (3,2) | (2,2) | AT |
— | implicit | close, mid, chip |
| 20 | Heavy Armour | heavy_armour |
4 | armour |
tracked | (4,2) | (3,2) | HR |
— | explicit | close, mid, chip, close-detail |
| 21 | Heavy Bomber | heavy_bomber |
4 | bomber |
air | (5,2) | (4,2) | HB |
— | implicit | close, mid, chip |
| 22 | Cruiser | cruiser |
4 | capital_ship |
naval | (6,2) | (5,2) | CR |
— | implicit | close, mid, chip |
| 23 | Carrier | carrier |
4 | carrier |
naval | (7,2) | (6,2) | CV |
— | implicit | close, mid, chip |
| — | Submarine (submerged) | submarine__submerged |
3 | — | naval | (0,2) | — | — | variant of 16 | implicit | close, mid |
| — | Forward Depot (emplaced) | forward_depot__emplaced |
aux | — | foot | (0,3) | — | — | variant of 8 | implicit | close, mid |
Totals: 25 Close cells · 25 Mid cells · 23 chips · 4 strategic markers = 77 individual sprite cells, plus 4 detail layers — field_gun, armour, heavy_artillery, heavy_armour, at the Close tier only (ART-135) — on one companion page whose other 21 cells are transparent (ART-1025). Every other cell in the roster is a base-only implicit cell and ships one file.
12.3 Non-assets — states carried by overlay, for the record
These appear in no atlas in this document. They are listed so that a reader working top to bottom does not go looking for art that was deliberately not made: damaged, dug in (four steps), shaken, loaded, embarked, out of supply, encircled, grade, Forming Up, reaction armed, endurance remaining, banked movement, Stance, Posture, grounded-versus-airborne. Their art lives in the sibling overlay and glyph document; the reasoning for each is in ART-480.
Open questions
Sibling filenames. Mostly resolved: the terrain document landed as
docs/art/02-terrain.mdand the foundations document asdocs/art/00-art-direction.md; both are now cited by name and by requirement.docs/art/03-overlays-and-glyphs.mdis still an assumed name and must be reconciled against the art index. Note that00-art-direction.mdwas still being written when this revision was made, so every citation of it here should be re-checked against its final text before this leaves draft — questions 12, 13 and 14 below are the places that matters most.The roster count. The extracted ground truth heads its list "23 producible + 3 support/reference" (26), the enumerated tiers contain 20 manoeuvre units, and
docs/spec/02-units-and-industry.md§8 says 20 + 3 = 23. This document specifies 23 and covers every named unit. Someone should fix the header rather than leaving two counts in circulation.Unit
idstrings.docs/spec/02-units-and-industry.mdrequires every unit to carry a stableidmatching^[a-z][a-z0-9_]{1,31}$(US-070) that must never change once shipped (US-080), but §8 lists display names only. The twenty-three ids in §12.2 are this document's proposal; every file name and atlas key derives from them, so they need ratifying in the unit document before art files are named.The short labels are a proposal, not a ratification. UX-1480 states that
02-units-and-industry.mdowes a short display label per unit for the Chip tier and that the current schema does not carry one. ART-930 proposes twenty-three. The tightest pairs areAR/HRandTR/CR/CT/CV; both are mitigated by plate shape and modifier marks, but a playtest at 0.25× zoom is the only real evidence.The 10 × 14 glyph atlas. ART-960 and ART-1010 both depend on an uppercase-and-digits bitmap glyph atlas at 10 × 14 — doubled with the Chip cell in this revision, so it is a different atlas from the one the earlier draft asked for. The UI document already requires a canvas glyph atlas for on-map labels; whether it covers this size, and who owns it, is unresolved.
DPR 3.Closed by ART-290 and by question 14 below. This asked whether to ship a 96 px tier, accept a 1.5× upscale, or snap DPR-3 devices to a 2× backing store, all of which followed from a 64 px Close cell. None of them: the cell is 128 px, the next power of two above the 96 device pixels DPR 3 demands, so there is nothing to upscale and 1.33× of zoom headroom is left over at DPR 3 and 2.0× at DPR 2.The submerged Submarine breaks ART-330 — and, since this revision, ART-435 as well. It is the only sea sprite that paints below the waterline row, and it is now also the only silhouette whose outline is deliberately not a closed contour: its hull is a dashed line and must stay one, or a detected submarine loses its owner. ART-435 states that exception and ART-590 exempts the file by name. Confirm the renderer, the dig-in berm compositor and the verifier tolerate both exceptions rather than treating either as a defect.
The damage decal. ART-480 assigns damage to a shared four-step decal mask. Whether that mask is authored here (it is unit-shaped) or in the overlay document (it is an overlay) is unsettled; it is currently in neither manifest.
The Missile's height exemption — and, since D-7, three other things the verifier gets wrong. ART-800 exempts the Missile from ART-350's floor, and this revision corrected which floor: it is the 32 px minimum painted height — the Missile's span is 28 px — and not the minimum painted width, which its 80 px length has always cleared. That exemption is now written:
ART-590carriesHEIGHT_FLOOR_EXEMPTas a named per-unit set rather than a loosened constant, and a conforming Missile at 108 x 28 passes while a Scout at the same height still fails. What remains open here issubmarine__submerged's two exceptions (question 7), which belong in that same table and are not in it yet.The four explicit cells now belong in the same conversation.Struck as superseded: the boundary-derived contour band is written. This question used to addfield_gun,armour,heavy_artilleryandheavy_armourhere, on the grounds that ART-590's uniform 8 px erosion would report them as having a broken contour while they conformed to ART-445. ART-590 no longer erodes — it derives the band from the boundary and measures each stretch at the weight that applies there — so that failure mode is gone. It also never occurred: all four measure 100.0% INK, and none of them contains a narrow linear projection to begin with, so none was ever relying on ART-445. See open question 4 ofdocs/art/04-decisions.md, which owns what is actually wrong with those four cells. What remains in this question is the Missile and the submerged Submarine — the smaller thing it started as.Custom unit sets. The unit document treats modded rosters as a shipped feature. A modder adding a unit needs the prompt template, the verifier and the chip builder as public tooling, plus a rule for what happens when their unit's label collides with a shipped one. None of that is specified here — and a modder now also needs the delivery conventions of ART-205 and the detail-layer rules of ART-245, or their unit will be the one sprite on the map that does not change colour with its owner.
Whether four gun tubes can carry a detail layer at all.Closed by D-7 of04-decisions.md, in favour of the tubes. Struck rather than deleted, because the previous draft of this question had all but decided the opposite and a reader of it needs to see that the reasoning was withdrawn rather than forgotten.What this question used to say, and why it was wrong. ART-435's closed 8 px contour runs down both sides of a gun tube, and ART-155 rule 4 of
docs/art/00-art-direction.mdrequired any detail region to be at least 12 px in its smaller dimension — so a tube had to be 28 px thick before it could carry a layer at all. No barrel in this roster is drawn that thick and none should be, so this question concluded: "move the four cells to implicit, ship no companion page". The arithmetic was right and the test was wrong. 12 px in the smaller dimension is a test for an area feature; a gun tube is a linear one, and its thinness is the point rather than a corner being cut. Applied to a linear feature the area test does not measure conservatively, it measures the wrong quantity — and it returned "forbidden" for every instance of the class, which is the signature of a category error and not of a strict rule.- The geometry is now ART-445, from ART-157 and ART-158 of
docs/art/00-art-direction.md: 4 px of visible detail width, a 24 px run, 4 : 1 aspect, and a 2 px contour a side inside a minimum 8 px total thickness — which is ART-440's silhouette floor, so the exception meets the general rule rather than carving under it. - All four cells clear it, and ART-445 shows the working.
field_gunsits on the floor of every test at 8 px;armouris 12 px over a 36 px run;heavy_artilleryis 16 px over ≥ 52;heavy_armouris 12 px over ≥ 44 and is the cell the aspect test actually decides, because at the 16 px its bulk invites it stops qualifying. - The DPR-1 risk is real and is not solved here. A 2 px contour is 0.5 CSS px, which is half
a device pixel at DPR 1. ART-158 records it and §8 of that document checks it by name on the
first qualifying sprite.
field_gunis that sprite.
What is not closed, and is a different question. Whether four barrels justify a Close-tier companion atlas page (ART-1025) is a budget question, not a draughtsmanship one, and it stands exactly as it did: it is open question 9 of
docs/art/00-art-direction.md, which wants to know what the page costs on the tightest target and whether dropping it is visually acceptable. Moving the four cells to implicit remains available and still costs this document one column of one table. Recommendation, unchanged: buildarmourboth ways at Close and look at the pair over four terrains. An hour of work against a decision that touches the build — and it is now an hour spent on the question that was actually being asked, rather than on confirming a conclusion the arithmetic had already forced.- The geometry is now ART-445, from ART-157 and ART-158 of
Infantry as the style plate, and whether it should carry a detail layer.Closed by D-2 of04-decisions.md, in this document's favour on the substance and the other document's on the plate. Struck rather than deleted so a reader of the previous draft can see it was answered. The conflict was real: that document made Infantry both the style plate and its detail-layer exemplar, while ART-247 #2 here records Infantry as base-only and ART-530 makes it the flat reference precisely so later generations do not inherit a layer they should not have. Both could not stand, and the resolution is to stop asking one sprite to do two jobs.- Infantry stays the style plate, and is base-only. ART-247 #2 and ART-530 are unchanged.
There is no
style-plate_detail.png. armouris the worked example.docs/art/00-art-direction.md§7 is now written end to end around it, which is what this question asked for. It remains this document's second style reference under ART-530 — accepted before the other three explicit cells, supplied alongside the plate for them, and withheld from every implicit cell.- The layer split in that worked example is ART-247 #10's, not a second opinion: the gun tube only. D-2's own reasoning described Armour's detail layer as its tracks and road wheels, "articulation rather than identity". That is the one reading this roster cannot support — the track band is the movement-class footprint of ART-380 and the bottom of the ownership read (ART-215.3), and the five road wheels are the counting cue of §3.4, which ART-240 and ART-410 require to stay in the base in INK because a count is read by contrast and only the seat pair guarantees contrast. §7.3 of that document now works the case through as its instructive negative. If the intent really was to untint the running gear, it reopens ART-247 #10, ART-215.3, ART-240 and ART-410 together and needs arguing there, not in a worked example.
- Infantry stays the style plate, and is base-only. ART-247 #2 and ART-530 are unchanged.
There is no
Interior mark budget.Closed by D-1 of04-decisions.md, in favour of the exemption this question recommended. ART-080 ofdocs/art/00-art-direction.mdstill caps a sprite's interior at four ink shapes, and now counts a repeated identity group as one semantic feature rather than one shape per element — so Armour's five road wheels are one mark, Heavy Armour's seven are one mark, and the turret rows that separate Corvette, Destroyer and Cruiser are one mark. §3.4 here carries the same rule at the drawing board, and §7.3's review row has stopped contradicting the cap.The exemption is guarded, and the guard is what makes it a rule rather than a loophole: the elements MUST be uniform in size and shape, evenly spaced and aligned on a common axis, and the run MUST survive reduction to 8 CSS px as a band of regular repetition. An irregular scatter of similar marks counts separately, at full price.
What is not closed, and is now a design question rather than a document conflict. The cap is still four, and the exemption only stops a group from being counted element by element. Two silhouettes should be counted again against it rather than assumed safe: Heavy Armour (seven wheels as one, plus track link line, hull/turret join, weight mark and skirt-plate rule — which is five shapes if the last two are both kept), and the Cruiser (three turrets as one, plus the stepped tower, plus funnels). If either is over, the answer is now to simplify that sprite, not to argue with the cap. The 128 px rescale did not help: each mark is easier to draw, but the cap is a count, not a size.
Master authoring size, and the closed ink contour.Closed — reconciled in one pass, in favour ofdocs/art/00-art-direction.mdon both counts. The question is struck rather than deleted so that a reader of the previous draft can see it was answered and not forgotten, and so that its last clause — "nothing else should be generated until it is" — is visibly withdrawn. That instruction no longer applies. The geometry below is settled and generation can start.- Cell size. ART-290 specifies a 128 px Close cell and a 64 px Mid cell, adopted
from ART-280 and the tier table of ART-300 in
00-art-direction.md. The 64 px figure this document used to carry came from a 1:1 device-pixel match at DPR 2, and that derivation stops one step early: UX-385 requires DPR 3, where a 64 px cell is stretched over 96 device pixels and is visibly soft on hard-edged flat art, and it leaves no zoom headroom at all at the tier whose whole purpose is close inspection. The Chip and Strategic tiers moved with it, to 32 px and 16 px, off the same table and for the same reason. - The closed ink contour. Adopted as ART-435, citing ART-050 of
00-art-direction.md: 8 px in the delivered 128 px cell — 2 CSS px, 32 px at the 512 authoring master — and 4 px at Mid, with one named exception forsubmarine__submerged's dashed hull. Since D-7 there is also one permitted variation in its weight, which is a different thing from an exception to its closure: a gun tube carries 2 px a side under ART-445. ART-435 now states the two separately, because conflating them is how somebody talks themselves into an open contour. This question's claim that this document "requires no contour at all" was never quite true, and that matters: ART-210 has always defined the bleed value as "INK wherever the contour reaches the edge", which is only meaningful if there is a contour, and the bleed rule is correct rather than merely different only because every boundary pixel is known to be ink. The document was contradicting itself, not disagreeing with the foundation. ART-210, ART-240, ART-580, ART-590, §6's prompt template and §7.3's review table are now all written to it. - Rescaled by doubling, because the foundation has no equivalent figure: ART-350's painted floor, ART-390's size steps, ART-400's weight mark (derived, not doubled — see the requirement), §3.2's wheel diameters and track-band height, ART-870 and ART-880's Mid geometry, ART-280's idle amplitudes, ART-570's reduction ladder, every px figure in ART-247's register, every cue in §4's confusable-pair table, and every accept/reject threshold in §8.
- Adopted from the foundation rather than doubled, because it covers the same ground: the 8 px frame band, the four 36 × 36 corner reserves and the 64 × 64 identity core (ART-300, from its ART-340); the corner assignment, which swaps the condition badge and the Stance glyph (ART-305, from its ART-350); ground baseline y = 104 and waterline y = 100; the 88 px ground and 112 px naval width ceilings (ART-350); the 8 px silhouette floor and the 4–8 px ink-stroke band (ART-440, from its ART-040 and ART-080); the 12 px concavity floor (ART-450, from its ART-060); slot stride, gutter and the 2 px extrusion ring (ART-1030, from its ART-310); the Chip and Strategic cell sizes (§10, §11); and the 8 × 8 reduction in ART-595's ownership read, which now matches its ART-255 check 8 exactly instead of carrying a second figure derived from DPR 2.
- What it cost. Three things did not survive unchanged and are recorded rather than smoothed over. The waterline is no longer full-bleed — the frame band forbids art in the outer 8 px, so it spans the live box, x = 8–119 (ART-330). The corner reserves are no longer required to be fully transparent — at 36 × 36 that would empty 41% of the live box — so art may enter them and only load-bearing art may not, which moves enforcement from the verifier to the occlusion test of ART-610. And the foundation's 88 px ground ceiling is proportionally much tighter than the 60-of-64 this document used to allow, which compresses the land and naval size ladders at the top end.
- What is still open. The silhouette concepts the new grid strains are collected in question 16. Question 11 is now close to answering itself against the detail layer, for a reason that did not exist before the contour. Question 13's interior-mark conflict is untouched by any of this and remains the largest one left between the two documents.
- Cell size. ART-290 specifies a 128 px Close cell and a 64 px Mid cell, adopted
from ART-280 and the tier table of ART-300 in
Requirement-ID collision across the art set. All three art documents number requirements into overlapping ranges: this one runs ART-200 to ART-1040,
docs/art/02-terrain.mdruns ART-600 upward, anddocs/art/00-art-direction.mdruns from ART-010 to ART-1145 — so a bare "ART-605" or "ART-1135" names two or three different requirements depending on the file. Every cross-document citation here is disambiguated in prose, which works and does not scale. The art index needs to assign non-overlapping ranges; this document's new requirements were all taken below ART-600 for that reason, and the renumbering, when it happens, must be one pass across all four documents rather than a unilateral one. ART-305 and ART-435, added by this revision, were taken below ART-600 for the same reason.Silhouette concepts the 128 px grid strains — flagged, not redesigned. Rescaling §2, §3 and §8 surfaced a handful of per-unit designs whose reasoning was written against a 64 px cell, or against ceilings this document no longer sets. None is fixed here: §8's prompts are deliberately unchanged apart from their numbers and the contour clause in the invariant STYLE stanza. All of them want one deliberate pass with a contact sheet.
- Fighter canopy. 4 × 3 px became 8 × 6 px, which is still under ART-080's 12 px floor for an interior shape. Drop the mark or enlarge it — and if it is enlarged, ART-247 #9's stated reason for keeping the Fighter implicit ("too small to read by shape") stops applying and the choice has to be re-argued.
- Air Defence Battery. Four barrels at ART-440's 8 px floor with ART-450's 12 px voids between them is a 68 px cluster inside an 88 px land maximum. It fits, and only just. The radar panel, conversely, is now 12 × 16 px and clears the interior-shape floor it used to fail, so ART-247 #12's size argument no longer holds — only its coverage argument does.
- Cruiser. Nine barrel lines in three groups need roughly 60 px of the 112 px live box at the stroke and gap floors. See question 13.
- Forward Depot, emplaced. Doubling wanted 104–116 px; the ground ceiling is 88, so the variant is 80–88 px against the limbered variant's 68–80. The packed-versus-unpacked aspect contrast that carries the pair is weaker than it was and should be looked at.
- Armour, Heavy Armour, Heavy Artillery. Same cause: the land ladder is compressed into 70–88 px where doubling wanted 88–120. ART-390's 12 px separation is met and no more.
- The naval length ladder. Corvette 72–80, Destroyer 92–100, Cruiser 104–112, Carrier
- The top two are clamped by the live box rather than derived from the ladder, and the Carrier's deck is now exactly the live box with nothing spare.
- Heavy Bomber. Span 108–112 px against a 112 px live box. The widest silhouette in the game has no headroom left, which makes ART-580's "restore the counting cue" harder rather than easier — four nacelles have to fit without the wing being allowed to grow.
- Forward Depot drums (ART-247 #8). "Not distinguishable as a material" was a judgement made when the cell was half this size. Worth re-testing.
- The four gun tubes. No longer strained by the grid, and no longer decided by the contour:
question 11 is closed and ART-445 carries the geometry. What the contact sheet is now for on
these four is ART-158's DPR check — a 2 px contour at DPR 1, 2 and 3 over the lightest and
the darkest terrain — and a look at whether
heavy_armour's 12 px tube still reads as the heavier gun besidearmour's 12 px one, since the length is now carrying that comparison on its own.
Where the Chip and Strategic drawing code runs. ART-140 of
docs/art/00-art-direction.md, following D-5 of04-decisions.md, now requires both tiers to be drawn at runtime, with no Chip or Strategic raster in the shipped art set — because a pre-baked page cannot carry a label from the active locale, and MOD-430 requires that it can for a translated or modded roster. This document specifies the same construction as a build step: ART-900 and ART-970 emit chips into an atlas page, ART-980 emits the four markers, §12.1 lists both pages as build output, §12.2 gives every unit a Chip cell coordinate, ART-1030 gives the Chip and Strategic strides, and ART-1040 fails the build on a missing chip.Nothing about the drawing is in dispute — the plate shapes of ART-920, the label table of ART-930, the modifier marks of ART-940 and ART-950 and the marker shapes of ART-980 are the code either way. What is in dispute is whether the output is a texture page or a canvas draw, and that decides whether roughly a page of this document (the Chip cell column, the chip strides, the frame-table check) describes anything real. D-5's own open question 2 assigns the ownership to
docs/spec/04-ui-ux.md, since it is client rendering, while noting that the 10 × 14 glyph atlas it needs is an art asset — which is question 5 here, and the two should be answered together.In the meantime: any Chip or Strategic raster already committed is bootstrap under ART-415 of the foundations document, labelled as such, and is removed in the same change that lands the drawing code (ART-145 there) — not before it, which would leave a hole, and not in a later tidy-up, which would leave two sources for one tier.