02-terrain.md · 80 requirements

Terrain and Map Art — Production Specification

This document specifies every piece of art that is part of the board: the eleven terrain types of GR-260, the boundaries between them, the three tile Installations (Road, Fort, Airfield), the three edge features (River, Ford, Bridge), the City in all the states UX-450 requires it to show, the flat terrain palettes the Chip and Strategic tiers of UX-390 draw with, and the fog and map-memory treatments that sit over all of it. For each asset it gives the pixel dimensions, the grid, the file name, a literal generation prompt written to be pasted into an image model, and the test that decides whether the result is usable. It does not specify unit sprites, seat colour palettes, badge systems shared with units, or any DOM chrome; those belong to the sibling documents named in §1.2.

Status: Draft v0.1 · Owner: unassigned · Depends on: docs/spec/01-game-rules.md (GR — terrain set, terrain attributes, installations, edge features, cities, map generation, fog), docs/spec/04-ui-ux.md (UX — LOD tiers, ownership rendering, city rendering, terrain legibility), docs/spec/12-economy.md (EC — city classes, traits, Unsettled), docs/spec/14-victory.md (VC — Landmark, Seat, Bellwether), docs/spec/02-units-and-industry.md (US — Industry, Stalled), and the sibling art documents docs/art/00-* (art direction and shared technical standards), docs/art/01-* (unit sprites and the team-colour channel contract), docs/art/03-* (UI chrome, overlays and shared badges).


1. Scope and the one thing to read first

1.1 Terrain has no owner and takes no team colour

ART-600 Terrain art — the eleven terrain bases of GR-260, their decals, transition feathers, coastline treatment, road surface, river and ford art, and the fog treatments — MUST be authored in full colour and MUST NOT carry a team-colour channel (UX-440). Terrain is never recoloured per seat, because terrain has no owner.

Rationale: the division that matters in this project is between art the renderer recolours for a seat and art it does not, and terrain is the whole of the second category. This is worth stating in the first requirement of the document because getting it backwards wastes an entire generation pass: an eleven-terrain map rendered in an owner's two colours is unreadable, and no amount of decal work recovers it. Note also what this requirement is not saying. It is not a licence to load the board up with contrast — §3 spends a whole section taking that away again, for reasons that have nothing to do with ownership rendering.

ART-605 An asset that carries a team-colour channel — in this document, exactly the seventeen listed in ART-610 — MUST deliver that channel by one of exactly two conventions, and the register of §13 MUST record which:

Convention Delivery Renderer behaviour
Implicit mask The asset is authored as a flat two-value stencil — one dark value, one light value, plus transparency — and every opaque pixel is masked. No mask file ships; the packer derives the channel by thresholding at pack time. The dark value takes the seat foreground, the light value the seat background.
Explicit mask The asset ships <name>_mask.png alongside it: single channel, identical pixel dimensions, white = takes seat colour, black = renders as authored. It MUST pack into a companion atlas with identical cell coordinates, so one UV samples both. Masked pixels are substituted per UX-440; unmasked pixels render as authored.

Every asset in the shipped register of §13 uses the implicit mask. The explicit convention is specified anyway, so that an asset which later earns untinted detail has a defined way to ship it instead of a second atlas convention being invented ad hoc; no companion atlas ships today. Both conventions are equally conforming under either renderer path UX-440 permits — a WebGL shader reading the mask, or atlases pre-tinted per seat at load time under the Canvas fallback of UX-385.

ART-610 These map assets are the exception, because each carries an owner or is drawn in an owner's colours: the Fort, the Airfield, the City base art at every tier, and the five city badges (Seat, Landmark, Bellwether, Unsettled, Stalled). Each MUST carry a team-colour channel under UX-440, MUST conform to the channel contract in docs/art/01-* exactly as unit sprites do — the same mask convention, the same alpha convention, the same atlas rules — and MUST NOT be delivered in the same texture atlas as untinted terrain art (ART-650).

The mask on each of these assets MUST satisfy UX-440's outcome test: ownership unmistakable from the silhouette alone at the Chip tier, an 8 CSS px sprite, without reference to a badge, an outline or any detail that survives only at higher zoom. A design that team-colours a fort's gateway or a city's roofline and leaves the rest of the mass untinted fails that test and MUST be rejected (verification: ART-1135).

Rationale: GR-500 makes Installations capturable, and UX-420 requires a remembered installation and its ownership to be rendered distinctly. A Fort that cannot take a seat colour cannot discharge either. The Road is deliberately not on this list: GR-420 makes road contiguity ownership-blind, so a road's owner is not a fact the player needs off the map, and a neutral road reads better across a contested frontier than a two-colour one. Whether the Road should nonetheless carry a faint owner mark is open question 4.

ART-615 The number of tones in an asset under ART-610 is an art-direction choice per asset (UX-440), not a rule. For all seventeen assets this document owns, that choice is recorded here as two values, fully masked, and every generation prompt in §7 and §9 is written to produce exactly that.

Rationale, recorded because this document previously carried the choice as if it were a law it had inherited. UX-440 no longer mandates a tone count, and art that sits outside a mask is explicitly free to carry shading, material and mechanical detail. That freedom is real and this document declines it for these particular assets, on the merits: the Fort and Airfield render at 28 CSS px and are redrawn again for 16, the badges are 12 CSS px, and the City must stay distinguishable from both at every tier while carrying up to five badges and a garrison bar on top of it. At those sizes a material break is one or two pixels of mud, and every pixel spent on it is a pixel not spent on the silhouette that ART-1135 tests. Two values fully masked is also the strongest possible answer to UX-440's Chip-tier test, because the whole shape changes colour with the owner. It is a choice, it is recorded as one, and a future asset that wants the third tone has ART-605's explicit mask waiting for it — see open question 7 for the one asset where that argument is genuinely open.

ART-620 Where this document assigns work to the renderer rather than to an image generator — flat base fills, road strokes, garrison bars, Integration and Unrest bands, fog darkening, the Chip and Strategic tiers — that work MUST be procedural and MUST NOT be delivered as generated raster art. An asset that can be produced exactly and seamlessly by three lines of shader code MUST NOT be produced approximately and with seams by an image model.

1.2 Sibling documents

This is one of four art documents and it cites the other three by role rather than by exact filename, because they are being written concurrently:

Role Path prefix What this document takes from it
Art direction and shared technical standards docs/art/00-* House style, the ownership-rendering doctrine, seat palettes, the shared style reference image
Unit sprites docs/art/01-* The team-colour channel contract, alpha convention, unit silhouette weights that terrain must not out-contrast
Terrain and map (this file) docs/art/02-terrain.md
UI chrome, overlays and shared badges docs/art/03-* Overlay visual language (UX-460), the condition/stance/posture badge system, city trait pips (EC-450)

ART-625 Where this document and a sibling both describe an asset, the sibling that owns it governs. This document owns every asset in the register of §13 and no other.


2. Technical parameters

2.1 Grid and authoring sizes

ART-630 The map is a square grid (GR-120, GR-130) with eight-way adjacency (GR-180). All terrain art MUST be authored against these sizes:

Quantity Value Source
Tile edge, Close tier 32 CSS px UX-390
Tile edge, Mid tier 16 CSS px (0.5×) UX-390
Tile edge, Chip tier 8 CSS px (0.25×) UX-390
Tile edge, Strategic tier 4 CSS px (0.125×) UX-390
Shipped atlas resolution @2x — 64 device px per tile ART-635
Generation resolution 1024 × 1024 per image ART-730
Downsample ratio, generation → atlas 16 : 1 for a full-tile asset

ART-635 Exactly one raster resolution MUST ship: @2x, at 64 device pixels per tile. The @1x, Mid and Chip presentations MUST be produced by GPU minification from the @2x atlas with mipmaps enabled and a mip bias of −0.5. A separate @1x atlas MUST NOT be authored.

Rationale: two hand-tuned resolutions is two asset sets to keep in sync and the smaller one is the one that rots. Minifying from @2x costs a small amount of softness at exactly 1.0× zoom and removes an entire class of "the 32px version has a different tree in it" defect. The mip bias exists because Phaser's default trilinear selection at 0.5× (the Mid tier) picks a mip level that reads mushy; −0.5 pulls it back toward the sharper level.

ART-640 Every delivered file MUST be PNG, RGBA8, sRGB, non-interlaced, with straight (non-premultiplied) alpha in the file; premultiplication MUST happen at atlas-pack time, not in the source. No file MAY carry an embedded ICC profile other than sRGB, and no file MAY carry an alpha channel that is uniformly 255 where transparency was intended — see ART-1130 for the check that catches a chroma-key that was never removed.

Rationale on transparency, stated plainly because it is the second most common way this asset set fails: image generators do not produce true alpha. A model asked for "transparent background" will return an opaque image, a checkerboard painted into the pixels, or a soft white halo. Every prompt in this document therefore asks for a flat magenta #FF00FF background and every asset goes through a key-and-despill step (ART-1130). Do not skip the despill; the halo it removes is invisible against magenta and glaringly visible against Woods.

2.2 Atlases

ART-650 Assets MUST be packed into exactly these four atlases, and untinted art MUST NOT share an atlas with team-coloured art:

Atlas Contents Cells Tint pipeline
terrain.atlas Terrain decals, shared grain, transition feathers, coast foam 80 none — full colour
edges.atlas Road surface pieces, bridge, river, ford 11 none — full colour
structures.atlas Team-coloured: Fort, Airfield, City base and Mid sets, the five city badges 17 UX-440 mask substitution, implicit mask (ART-605)
overlay.atlas City plinths, quay, production plume frames, fog and polar treatments 13 none — the readouts drawn on the plinth take the owner's colours (ART-1020), the art does not

ART-660 Each atlas MUST be a single power-of-two texture no larger than 2048 × 2048 at @2x, MUST use 2 px of extruded (edge-clamped, not transparent) padding around every cell, and MUST NOT rely on texture wrapping. Exceeding 2048 MUST be resolved by splitting the atlas, never by shrinking cells.

Rationale: the padding must be extruded rather than transparent because at non-integer zoom — which is every zoom between the four tiers of UX-390 — bilinear sampling reaches outside the cell, and transparent padding produces a dark fringe on every sprite. The 2048 cap is UX-400's mobile WebView budget, which the specification names as the tightest of the six targets.

2.3 Naming and layout

ART-670 Files MUST be named lowercase_snake_case and MUST follow <group>_<subject>[_<variant NN>].png. Variant numbers MUST be two digits and MUST start at 01. The directory layout MUST be:

packages/client/assets/art/
  style/
    ref_master.png                  # production artefact, not shipped (ART-1170)
  terrain/
    palette.json                    # ART-790 and ART-1070, the single source of colour truth
    grain_shared.png                # ART-760
    decals/
      plains/plains_decal_01.png … plains_decal_08.png
      cropland/…  desert/…  woods/…  marsh/…  hills/…
      mountains/…  icefield/…  shallows/…  coastal_sea/…  open_ocean/…
    transition/
      feather_edge.png  feather_corner_out.png  feather_corner_in.png
      foam_edge.png     foam_corner_out.png     foam_corner_in.png
  edges/
    road_surface.png  road_junction.png  road_cap.png
    bridge_deck.png
    river_edge_01.png river_edge_02.png river_edge_03.png
    river_joint_01.png river_joint_02.png
    ford_band_01.png  ford_band_02.png
  structures/                       # TEAM-COLOURED ONLY — separate atlas, ART-650
    fort.png            fort_mid.png
    airfield.png        airfield_mid.png
    city_ind1.png  city_ind2.png  city_ind3.png  city_ind4.png
    city_mid_ind1.png … city_mid_ind4.png
    badge_seat.png  badge_landmark.png  badge_bellwether.png
    badge_unsettled.png  badge_stalled.png
  overlay/
    plinth_town.png  plinth_city.png  plinth_metropolis.png
    quay.png
    plume_01.png … plume_06.png
    unexplored_fill.png  memory_grain.png  polar_hatch.png

ART-680 terrain/palette.json MUST be the only place terrain colours are written down. The renderer MUST read the Close base colours and the Chip flat colours from it, and no colour in this document's tables MAY be duplicated into shader source, CSS, or a TypeScript constant.


3. The value discipline

This section is the reason a beautiful tile set can make the game unplayable, and it is the section to enforce hardest when reviewing generated output.

3.1 The band

ART-690 Every pixel of terrain art at the Close and Mid tiers — base colour, decal, transition feather, road, river — MUST fall within CIE L* 44 to 72. Nothing on the terrain layer MAY be darker than L* 44 or lighter than L* 72.

ART-700 The internal contrast of any single tile — the difference between its lightest and darkest pixel after the base and decal layers are composited — MUST NOT exceed ΔL* 14. A tile that exceeds it MUST be corrected by flattening the decal, not by darkening the base.

ART-710 Terrain chroma MUST NOT exceed C* 34 for land and C* 22 for water in the Close base palette. Decals MUST NOT exceed the chroma of the base they sit on by more than C* 10.

ART-720 Any team-coloured asset composited over terrain MUST clear ΔL* ≥ 25 against the terrain beneath it on at least one of the seat's two tones. Because ART-690 confines terrain to [44, 72], this is satisfied for every seat palette whose foreground and background tones lie outside [19, 97] — which the seat palettes in docs/art/00-* MUST guarantee. Terrain art MUST NOT be adjusted to fix a failing seat colour; the seat colour MUST be adjusted.

Rationale, and this is the whole argument of the section: the map is a board and the units are the pieces. A player at the Close tier is looking for a counter standing on a tile, and every unit of contrast the tile spends is contrast the counter cannot use. Terrain that is gorgeous in isolation — a woodland tile with sunlit crowns and black shadow between them, spanning L* 20 to L* 85 — destroys the read of every unit standing in it, and the player's response is to stop trusting the map and start hovering every tile. A 28-point band with a 14-point per-tile cap looks, in isolation, flat and slightly washed out. That is correct. It is supposed to look flat in isolation and correct in play, and the review that matters is the one in §12.5 where a unit is composited onto every terrain and the sheet is judged as a whole. There is no version of this trade in which the tile wins.

This band is a legibility requirement and it never depended on how ownership is rendered, so nothing about it changes when the tinting mechanism does. If anything it now matters slightly more. Under UX-440 the art outside a unit's team-colour mask is free to carry shading, material and mechanical detail — tracks, a gun barrel, a canopy, a rotor disc, a wake, a cast shadow — and a unit sprite with internal structure competes with a busy tile in a way a flat counter did not. A flat counter loses to noisy terrain only at its outline; a unit whose detail is doing work loses that detail first and its outline second. Terrain that spends its contrast takes both. Every number in §3 stands unchanged, and the contact sheet of ART-1170 MUST be run with the most internally detailed unit sprite the unit set ships, not the simplest.

3.2 Which channel carries identity, by tier

ART-730 Terrain identity MUST be carried by different channels at different tiers, and the art MUST be built for both:

Tier Primary identity channel Secondary
Close (32 px) Decal shape and pattern Base hue
Mid (16 px) Base hue Decal mass and density
Chip (8 px) Base value (L*) Hue
Strategic (4 px) Base value (L*)

Rationale, with the arithmetic that forces it. The Close base palette of ART-790 is compressed into a 25-point value band by ART-690, and eleven colours inside a 25-point band cannot be pairwise distinct. Measured on the shipped palette, the closest pairs at Close are Woods|Marsh at ΔE 17.6, Plains|Woods at ΔE 10.6 and Desert|Hills at ΔE 10.8, and under a deuteranope simulation Woods|Marsh falls to ΔE 6.0 and Cropland|Hills to ΔE 7.2. Those are not distinguishable colours. The decal layer is therefore not decoration — at Close and Mid it is the only thing separating four of the eleven terrains, and a decal set that gets trimmed for schedule takes UX-495 down with it. The Chip palette of ART-1070 solves the same problem the opposite way: it abandons the value band, because at 8 px there are no units standing on tiles to protect, and spreads the eleven types across L* 32 to 82 where value alone separates them.


4. Tiling: the method, and why the obvious ones are wrong

Seamless tiling is the single thing image generators are worst at that this document needs. A model asked for a tileable grass texture will return an image that is nearly tileable, with a visible discontinuity on at least one edge and usually a compositional centre — a bright patch, a hero rock — that becomes a polka dot the instant it repeats. Nothing in the prompt fixes this; it is a property of how the models are trained.

4.1 The four candidates

Method Assets per terrain Seam risk Repetition risk Verdict
A — Cut tiles from a large generated field 1 generation → 9 tiles High: tiles are seamless only against the neighbours they were cut beside, not against arbitrary copies Medium Rejected as primary
B — Generate non-seamless art, fix with offset-and-heal 1 generation + manual pass per tile Low after the pass High — one motif, repeated Rejected as primary; retained as ART-780
C — Many variants + randomised placement 8–16 full tiles per terrain High per tile; multiplied by variant count Low Rejected — cost is 100+ full-tile generations, each needing its own heal pass, with style drift across all of them
D — Procedural flat base + generated scatter decals 0 base + 3–10 decals None — by construction Low Recommended

ART-740 Terrain MUST be rendered as two layers: a base layer produced entirely procedurally, and a decal layer of generated sprites scattered in world space. No terrain type MAY ship a full-tile generated texture.

Rationale for D over the others, in four parts. The seam problem disappears rather than being solved. A flat or near-flat base has no edge to match — it is the same colour on both sides of every tile boundary, at every zoom, forever — so there is no offset-and-heal pass, no per-variant seam audit, and no class of bug where a tile that passed review fails against a variant it was never tested beside. The value band becomes enforceable. ART-690 and ART-700 are trivially satisfiable by a base the renderer computes and nearly impossible to hold across a hundred generated full-tile textures, each of which the model will quietly push toward richer contrast. Style consistency stops being a problem. The hardest thing about generating eleven terrain sets separately is that they do not look like each other; with D, the thing shared across all eleven is the base palette and the single grain sheet of ART-760, both of which are exactly controlled, and the generated content is reduced to small isolated objects where drift is invisible. Variety is multiplicative rather than additive. Eight decals with four rotations, two mirrors, jittered position and a small scale range give a Plains field that does not visibly repeat, from eight generations rather than sixteen.

The honest cost: the map will read as an illustrated board rather than a photographic landscape. Given ART-690 already forbids the contrast a photographic landscape needs, that cost was already paid.

4.2 The base layer

ART-750 The base layer MUST be computed in the fragment shader as: the terrain's Close base colour from palette.json (ART-790), multiplied by a per-tile value jitter of ±2 L* derived from hash(tileX, tileY, terrainId), multiplied by the shared grain of ART-760 sampled in world space at 1/4 tile scale and at 6 % opacity. It MUST NOT be sampled in tile space, because tile-space sampling reintroduces exactly the repetition this method exists to avoid.

ART-760 One shared grain sheet MUST ship — terrain/grain_shared.png, 256 × 256, greyscale, tileable — and MUST be used by all eleven terrains. It MUST be the only tileable texture in the asset set, and it is the one asset for which the offset-and-heal procedure of ART-780 is mandatory.

Rationale: a single grain used everywhere is what makes eleven separately-generated decal sets look like one game. It also confines the entire seamless-tiling problem to one 256 × 256 greyscale image that one person heals once, rather than to a hundred colour tiles.

A seamless tileable subtle paper grain texture, greyscale, very low contrast, fine even
noise with faint irregular fibre structure, like the surface of heavy cartridge paper or
a lithographic printing plate. Uniform density across the whole image with no bright
patch, no dark patch, no focal point, no composition, no visible motif, no directionality.
Mid grey overall, roughly 45 to 55 percent luminance everywhere.
No colour, no text, no border, no vignette, no drop shadow, no object, no illustration.
Flat 2D texture only. Seamless tileable. 1024x1024.

Downsample the result to 256 × 256, desaturate hard, then run the heal pass of ART-780 and the flatness check: after healing, the histogram MUST lie within 40–60 % luminance with no bin above 3 % of total. A grain sheet with a bright patch becomes a bright patch every 64 pixels across the whole map.

4.3 The decal layer

ART-770 Decals MUST be placed by the renderer in world space, not tile space, with position, rotation (0/90/180/270), mirror and scale (0.85–1.15) derived from hash(tileX, tileY, slotIndex). A decal MUST be permitted to overhang the tile boundary by up to 25 % of the tile edge and MUST be drawn clipped only by the terrain-type mask of its own tile plus that overhang. Decals MUST NOT be composited into the base texture.

Rationale: overhang is what makes a block of Woods read as one forest instead of nine polka dots, and it is what removes the last reason a tile needs matching edges. Because a decal is clipped by its own terrain's mask plus a margin, a canopy clump straddling two Woods tiles is continuous and the same clump at the edge of the wood stops at the wood's boundary. Deriving everything from a hash of the tile coordinate rather than from a random number generator keeps the map identical on every client and across every reload, which matters for replays and for the screenshot fixtures of §12.

ART-775 Each terrain's decal budget MUST be as follows, and the slot count is the number of decal draws attempted per tile before the hash rejects them:

Terrain Distinct decals Slots/tile Coverage target Why this budget
Plains 8 2 12 % Most common land type on three of four mixes (GR-1520); repetition shows here first
Cropland 6 2 45 % Field pattern is the identity; must not be mistaken for Plains
Desert 7 2 15 % 28 % of land on Arid — large contiguous fields
Woods 10 4 70 % 24–30 % of land on Temperate/Northern; densest coverage; carries concealment 1
Marsh 6 3 55 % Must not read as Woods — the two closest colours in the palette
Hills 8 3 40 % 16–30 % of land; the view 1 terrain, needs a legible relief mark
Mountains 10 3 80 % Impassable to everything but foot; must read as a wall at a glance
Icefield 6 2 25 % ≤ 4 % of land, but appears as the polar strip of GR-220
Shallows 5 2 20 % One-tile band round every coast (GR-1540); seen constantly, in short runs
Coastal Sea 3 1 8 % One-tile band; nearly plain by design
Open Ocean 4 1 6 % Vast contiguous area; must stay quiet or it strobes when panning
Total 73

ART-777 Decals MUST be authored inside these footprints, at @2x, on a transparent field with at least 4 px of empty margin on every side:

Class @2x cell Rendered at Close Used by
S 24 × 24 12 px tufts, stones, ice cracks, wave marks
M 40 × 40 20 px scrub clumps, dune ridges, reed beds
L 64 × 64 32 px tree clumps, rock spurs, field patches
XL 88 × 88 44 px canopy masses, mountain ridges (overhang decals)

ART-779 A decal MUST contain no more than three distinct shapes and MUST have no internal contrast above ΔL* 12. It MUST NOT carry an outline, a drop shadow, or a highlight rim.

Rationale: at the Close tier an L-class decal is 32 CSS px and at Mid it is 16. Anything with four or more internal shapes resolves to mud at Mid and to noise at Close. The outline prohibition matters more than it sounds: an image model will add a dark contour to almost everything, and a contoured decal blows ART-700's contrast cap on its own.

4.4 The offset-and-heal procedure (grain sheet, and the optional textured base)

ART-780 Where a tileable texture is genuinely required — the shared grain of ART-760, and any future textured base a project decides to add — it MUST be produced by this procedure and MUST NOT be accepted on the model's claim that the output is "seamless":

1. Generate at 1024x1024 with "seamless tileable" in the prompt. Do not trust it.
2. Discard a 96 px border from all four sides; keep the 832x832 interior.
   (Models put vignettes, framing and their best composition at the image edge.)
3. Downsample the interior to the target size (256x256 for the grain sheet).
4. Offset the image by exactly 50% in both axes (GIMP: Layer > Transform > Offset,
   "offset by x/2, y/2"; Photoshop: Filter > Other > Offset, wrap around).
   The former edges are now a cross through the middle. Every discontinuity is visible.
5. Heal the cross with the clone/heal tool ONLY in the interior. Never touch the
   outer 8 px, which are now the real tile edges and are already matched.
6. Offset by 50% again to return to the original framing. Verify no seam remains.
7. Flatness check: histogram must sit inside 40-60% luminance with no bin above 3%.
8. Tile 4x4 in a viewer at 100% and look for a repeating motif. If you can find one,
   the texture failed and no amount of healing fixes it - regenerate with more
   "no focal point, no composition, uniform density" in the prompt.

Step 8 is the one that gets skipped and the one that matters. A seam is a defect a reviewer will catch; a repeating motif is a defect that only becomes obvious after the map is full of it.


5. The eleven terrains

5.1 Close base palette

ART-790 The Close and Mid tier base colours MUST be exactly these. They are the Chip palette of ART-1070 compressed toward L* 58 by a factor of 0.50 in lightness and 0.80 in chroma, so that the two tiers are the same eleven hues at two different value spreads.

# Terrain Close base L* C* GR-350 attributes the art must express
0 Plains #7F9765 59.5 29.5 The reference terrain. Nothing distinctive; everything else is read against it.
1 Cropland #A0985B 62.2 33.6 Identical to Plains in movement and defence — the art carries the entire difference.
2 Desert #B4A47E 67.8 21.9 sight +1, open, long lines of view.
3 Woods #65815B 50.9 24.9 block 1, concealment 1, sight −1. Closed and dense.
4 Marsh #6F6B57 45.1 12.0 defence 850 — the only slow and bad-to-defend terrain. Must look like a trap.
5 Hills #968865 57.1 20.7 block 1, view 1 — you see over things from here.
6 Mountains #81838A 54.8 4.1 block 2, view 2, foot only. Must read as a wall.
7 Icefield #A8ACAF 70.1 2.2 sight +1, exposed. Also the polar strip of GR-220.
8 Shallows #7EA1AE 64.1 13.9 depth 1. Draft-1 hulls only; also navigable rivers (GR-600).
9 Coastal Sea #618BA4 55.8 19.4 depth 2.
10 Open Ocean #56708E 46.3 19.5 depth 3, sight +1.

ART-795 The three water depths MUST be rendered as a monotonically darkening ladder in exactly this order, because GR-1540 assigns depth by distance from land and therefore hands the renderer a free, always-correct bathymetric gradient round every coastline. That gradient MUST NOT be flattened, decorated, or overridden by a decal.

Rationale: this is the cheapest legibility win in the whole document. A draft-3 hull cannot enter Shallows and a draft-1 hull is safe there; the player needs to see the two-tile approach band round every landmass, and GR-1540's generation rule means it is already there in the data. Three values in the right order is all it takes.

ART-798 Icefield MUST be rendered at #A8ACAF — a light neutral grey, not white. Snow at its true value is L* 95 and breaks ART-690 by twenty-three points, and an Icefield field with units standing on it at true value is the single worst legibility case on the board.

5.2 Decal prompts

Each prompt below asks for a scattered arrangement of separated items on a chroma-key ground. Generators are unreliable at producing an exact count; ask for more than you need and cut the best. Cut each item into its own file — do not ship the sheet.

ART-800 Each terrain MUST ship the decal count of ART-775 as individual files under terrain/decals/<terrain>/. A decal sheet MUST NOT be shipped as a sheet, because a sheet cannot be jittered, rotated or mirrored independently per slot.

Plains — 8 decals, #7F9765 base

Twelve separate small top-down map illustrations of open grassland ground detail,
scattered across the image with wide empty space between them, each item fully isolated
and not touching any other: a small clump of grass tufts, a patch of low scrub, three
scattered pale stones, a bare earth patch, a short hedgerow line, a single small bush,
a dry rut or cart track fragment, a shallow depression of paler grass.
Muted olive green and soft khaki only, close in tone to a mid olive #7F9765,
very low contrast within each item, no dark outlines, no highlights, no rim light.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no grid lines, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 8. Class sizes: 4 × S (tufts, stones, bush, rut), 3 × M (scrub, bare patch, depression), 1 × L (hedgerow).

Cropland — 6 decals, #A0985B base

Eight separate small top-down map illustrations of cultivated farmland detail, scattered
with wide empty space between them, each item fully isolated: a rectangular patch of
parallel ploughed furrow lines, a rectangular patch of crop stubble rows at right angles
to the first, a small orchard block of evenly spaced round tree dots, a field boundary
hedge with a gate gap, a haystack cluster, a small irregular fallow patch,
a straight irrigation ditch, a farm track between two field edges.
Muted golden khaki, dull straw and soft olive only, close in tone to #A0985B,
very low contrast, no dark outlines, no highlights, no shadow between furrows.
Furrow lines must be a subtle tonal difference, not black lines.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 6, of which at least three MUST be L-class rectangular field patches — the rectilinear field grid is the entire visual difference between Cropland and Plains, which GR-260 makes mechanically identical, so it MUST be unmistakable. Rotation is restricted for this terrain: field-patch decals MUST be placed at 0° or 90° only, never 45°, so fields read as fields.

Desert — 7 decals, #B4A47E base

Ten separate small top-down map illustrations of arid desert ground detail, scattered
with wide empty space between them, each item fully isolated: a crescent dune ridge,
a long low sand ripple band, a dry wadi channel, a scatter of dark gravel, a cracked
hardpan patch, two small desert scrub bushes, an exposed rock shelf, a salt pan patch.
Muted sand, pale khaki and dull ochre only, close in tone to #B4A47E,
very low contrast within each item, no dark outlines, no bright highlights.
Dune ridges must be shown as a soft tonal band, not a hard shadowed crest.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 7: 3 × M dune/ripple, 2 × S gravel/scrub, 2 × L wadi and rock shelf.

Woods — 10 decals, #65815B base

Twelve separate top-down map illustrations of forest canopy clumps, scattered with wide
empty space between them, each clump fully isolated and not touching any other:
clumps of five to twenty round and slightly irregular tree crowns packed together,
in varied outline shapes - a round clump, a long ragged clump, an L-shaped clump,
a sparse scatter of individual crowns, a dense solid mass, a clump with a clearing hole.
Two of the clumps should read as conifers with slightly pointed crowns.
Muted forest green and dull sage only, close in tone to #65815B, very low contrast
between one crown and the next, no dark gaps between crowns, no black shadow,
no dark outlines, no sunlit highlights, no rim light.
Flat orthographic top-down view straight down onto the canopy, no perspective,
no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same clump.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 10: 4 × XL canopy masses (these are the overhang decals of ART-770 that make a wood continuous), 4 × L clumps, 2 × M sparse scatters for the wood's edge. The most common failure here is dark gaps between crowns, which blows ART-700 by itself; if the generator will not stop, flatten the gaps in a pixel editor with a 4 px median filter before keying.

Marsh — 6 decals, #6F6B57 base

Eight separate top-down map illustrations of marsh and wetland ground detail, scattered
with wide empty space between them, each item fully isolated: a bed of thin vertical reed
strokes, a patch of standing water with an irregular soft outline, a hummock of tussock
grass, a bank of dull mud, a dead bare tree with a few bare branches seen from above,
a braided channel of shallow water, a patch of sedge, a peat cut.
Dull olive brown, grey green and flat muddy grey only, close in tone to #6F6B57.
The standing water patches should be very slightly cooler and darker than the mud,
by a small amount only. Very low contrast, no dark outlines, no specular water
highlights, no reflections, no blue.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 6, and at least two MUST be the vertical reed-stroke bed and the standing-water patch. Marsh and Woods are the closest pair in the palette (ΔE 17.6, ΔE 6.0 under deuteranopia — ART-730); the reed strokes and water patches are what separate them, and Marsh decals MUST NOT be round or crown-like in outline.

Hills — 8 decals, #968865 base

Ten separate top-down map illustrations of rolling hill relief, scattered with wide empty
space between them, each item fully isolated: a rounded hill crest shown as a soft closed
contour band, a pair of overlapping rounded crests, a long low ridge, a shallow valley
between two crests, a scree patch, a scatter of small rocks, a bracken patch,
a single windbent tree.
Muted tan brown and dull olive only, close in tone to #968865. Relief must be shown as
a very soft tonal band on the crest, slightly lighter, with a very soft slightly darker
band below it - a gentle two step tone at most. Very low contrast, no hard shading,
no cast shadow, no black outlines, no contour lines, no cross hatching.
Flat orthographic top-down view, no perspective, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 8: 4 × L crests and ridges, 2 × M valley and scree, 2 × S rocks and tree. Hills decals MUST always be placed with the lighter tone toward the top of the screen so relief reads consistently across the map — specify a fixed rotation of 0° for crest decals in the placement table.

Mountains — 10 decals, #81838A base

Twelve separate top-down map illustrations of mountain relief, scattered with wide empty
space between them, each item fully isolated: a sharp ridge line with angular facets,
a peak shown as a small angular star of facets, a long jagged spine, a saddle between
two peaks, a cliff band, a talus fan, a cluster of angular boulders, a snow patch
in a north facing hollow, a narrow gorge, a rock buttress.
Cool neutral grey and faint blue grey only, close in tone to #81838A, almost no colour.
Facets must be shown as a very gentle two step tone, slightly lighter on one side and
slightly darker on the other, with no black, no deep shadow and no white highlight.
Angular and hard edged in SHAPE but soft and low contrast in TONE.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 10, including 3 × XL spines — Mountains is the terrain that must read as a barrier at a glance, because it is the only terrain tracked and wheeled cannot enter at all, and the 80 % coverage target of ART-775 is what does it. Angular shapes against Hills' rounded ones is the shape-channel distinction UX-1310 asks for and is why the two survive the deuteranope test that their colours alone would not.

Icefield — 6 decals, #A8ACAF base

Eight separate top-down map illustrations of ice sheet surface detail, scattered with wide
empty space between them, each item fully isolated: a branching crevasse crack, a pressure
ridge shown as a soft raised band, a wind scoured sastrugi patch of parallel low ridges,
a patch of bare blue grey ice, a snow drift with a soft rounded outline,
a scatter of small ice blocks, a meltwater pool, a thin fracture line.
Very pale neutral grey with a faint cool cast only, close in tone to #A8ACAF.
NOT white and NOT bright - keep everything close to a light-mid grey.
Cracks must be a soft slightly darker grey line, never black.
Very low contrast, no dark outlines, no sparkle, no specular highlights, no blue glow.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 6. This is the prompt that fights the model hardest — "ice" pulls white and sparkle out of every model that has ever seen a photograph — so expect to reject two or three batches and to flatten the result with a levels adjustment clamping to L* 62–74 before keying.

Shallows — 5 decals, #7EA1AE base

Seven separate top-down map illustrations of shallow coastal water detail, scattered with
wide empty space between them, each item fully isolated: a pale sandbar with a soft
irregular outline, a submerged reef patch shown as a slightly darker mottle,
a band of small parallel wave ripples, a scatter of rocks just under the surface,
a seagrass bed, a tidal channel, a shoal of pale sediment.
Muted blue grey and soft teal only, close in tone to #7EA1AE, very low contrast,
no white foam, no specular sparkle, no sun glint, no dark outlines, no deep blue.
Flat orthographic top-down view straight down through calm water, no perspective,
no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 5: 2 × M sandbar and reef, 2 × S rocks and ripple band, 1 × L tidal channel.

Coastal Sea — 3 decals, #618BA4 base

Five separate top-down map illustrations of open sea surface detail, scattered with wide
empty space between them, each item fully isolated: a band of small soft wave marks,
a very faint current swirl, a slightly darker patch of deeper water, a scatter of small
chop marks, a faint slick.
Muted mid blue only, close in tone to #618BA4, extremely low contrast - each item should
be only just visible against its own background. No white foam, no crests, no sparkle,
no sun glint, no dark outlines.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 3, all S or M, and keep them fainter than any land decal. The 8 % coverage target of ART-775 is deliberate: Coastal Sea is a one-tile band round every coast and anything busy there fights the coastline itself.

Open Ocean — 4 decals, #56708E base

Six separate top-down map illustrations of deep ocean surface detail, scattered with wide
empty space between them, each item fully isolated: a long soft swell band, a very faint
large current swirl, a slightly lighter patch of upwelling, a scatter of very small chop
marks, a faint wind streak, a barely visible eddy.
Muted deep slate blue only, close in tone to #56708E, extremely low contrast - almost
invisible. No white foam, no crests, no whitecaps, no sparkle, no sun glint, no reflection,
no dark outlines, no waves in profile.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no letters, no watermark, no logo, no UI, no drop shadow, no glow,
no outline stroke, no border box, no repetition of the same item.
Single flat 2D map-symbol illustration style. 1024x1024.

Cut 4, all L or XL and all at 6 % coverage. Large low-frequency shapes, not small high-frequency ones: Open Ocean is the largest contiguous area on an Islands map and small marks at 1 slot per tile strobe unpleasantly when the camera pans.


6. Transitions between terrains

6.1 The combinatorics, honestly

Eleven terrain types give 55 unordered pairs. The approaches and what each costs:

Approach Asset count Notes
Hard edges — no transition art at all 0 Truthful to the rules (movement cost is per tile) but reads as graph paper
Full blob/Wang tileset per pair 55 × 47 = 2,585 Not a real option
Blob tileset per terrain family (open/closed/high/water) 6 × 47 = 282 Still 282 hand-checked tiles and every one needs seam work
Priority-ordered feather, tinted at runtime 3 Recommended
Priority-ordered feather + dedicated coast set 6 Recommended — this is the specification

ART-810 Terrain boundaries MUST be rendered by a priority-ordered runtime-tinted feather, not by transition tiles. Three feather sprites — a straight edge, an outer corner and an inner corner — MUST cover all 55 pairs at all eight neighbour orientations, by rotation and by tinting the sprite to the overlapping terrain's base colour.

Rationale: the feather approach costs six assets instead of 282 and it degrades correctly. Where two terrains are close in value — Plains against Hills, Coastal Sea against Open Ocean — the feather is almost invisible, which is the right answer, because those boundaries are not tactically interesting. Where they are far apart — Mountains against Plains, any land against Shallows — the feather does real work. A transition tileset spends its whole budget making every boundary equally elaborate, including the fifty that nobody looks at, and it makes adding a twelfth terrain in a mod (GR-370 permits up to 256) an impossibility rather than a data edit. The feather approach makes a modded terrain set work on day one with no new art at all, which is worth more than the extra polish on the boundaries a player never studies.

ART-820 The overlapping side MUST be chosen by this transition rank, higher rank drawn over lower. Where two terrains share a rank the boundary MUST be drawn hard, with no feather.

Rank Terrain Reads as
10 Mountains overlaps everything — a range spills onto its foothills
9 Hills
8 Woods a wood's edge grows onto the field, not the reverse
7 Icefield
6 Marsh a marsh bleeds outward
5 Desert
4 Cropland
3 Plains the reference terrain yields to everything
2 Shallows water never overlaps land — see ART-830
1 Coastal Sea
0 Open Ocean

ART-825 The feather MUST be drawn at 6 px @2x (3 CSS px at Close) and MUST fade to zero alpha across that distance. It MUST NOT exceed 8 px @2x, because a wider feather starts to misrepresent which tile a unit is standing on, and tile identity is load-bearing for movement cost (GR-290) and defence (GR-380).

Three separate flat 2D alpha masks on one image, widely separated, for a soft terrain
edge blend in a tile based map. Each is pure white fading to nothing:
(1) a straight horizontal band, solid white along the top edge, fading smoothly to fully
    transparent over its height, with a slightly irregular ragged white boundary,
(2) a quarter circle convex corner, solid white in the corner, fading outward,
    same ragged boundary,
(3) a quarter circle concave corner, solid white on the outside, fading inward,
    same ragged boundary.
The ragged boundary must be a fine natural irregularity, like a torn paper edge or a dry
brush stroke, not a zigzag and not a scallop pattern.
White shapes on a solid flat magenta #FF00FF background, no gradient in the background.
No colour other than white, no text, no numbers, no border, no frame, no drop shadow,
no glow, no outline, no perspective, no 3D. Flat 2D. 1024x1024.

Cut into feather_edge.png, feather_corner_out.png, feather_corner_in.png, each 72 × 72 @2x, and convert to a single-channel alpha mask. These sprites carry no colour of their own; the renderer tints each to the overlapping terrain's base colour.

6.2 The coastline

ART-830 Every land | water boundary MUST additionally receive a dedicated coast treatment, drawn on the water side, and water MUST NOT feather onto land. The coast set is three sprites with the same geometry as the feather set.

Rationale: the land/water boundary is the only boundary in the game that changes what is legal rather than what is expensive — naval cannot enter land and no land class can enter water (GR-290) — and it is the boundary a player traces when planning an amphibious operation. It earns three assets of its own. Drawing it on the water side rather than the land side keeps the land tile's own colour intact right up to its boundary, which is what makes the coastline legible as a line rather than as a smear.

Three separate flat 2D map illustrations on one image, widely separated, of a stylised
shoreline foam and wet sand band for a top down map:
(1) a straight horizontal band: a narrow pale line hugging the top edge, with a slightly
    wider soft paler band below it, fading downward into nothing,
(2) the same treatment following a convex quarter circle corner,
(3) the same treatment following a concave quarter circle corner.
The pale line must be a soft off white with a faint warm sand tone, never pure white and
never bright. The boundary should be finely irregular, like a real tideline.
Extremely low contrast overall. No individual waves, no crests, no spray, no sparkle,
no rocks, no beach objects, no shells, no footprints.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no watermark, no drop shadow, no glow, no outline stroke, no 3D.
Flat 2D map illustration. 1024x1024.

Cut into foam_edge.png, foam_corner_out.png, foam_corner_in.png at 72 × 72 @2x. The pale line MUST NOT exceed L* 72 (ART-690); check it, because "foam" pulls white out of every model.

ART-835 The coast treatment MUST be drawn identically for all three water depths. The depth ladder of ART-795 already tells the player how deep it is; a per-depth coast set would be three times the assets to say the same thing twice.


7. Installations

7.1 How structures are drawn at all

ART-840 Every structure on the map — Fort, Airfield, Bridge, City — MUST be drawn in elevation-on-plan: the footprint is orthographic top-down, consistent with the terrain beneath it, but vertical elements (walls, towers, chimneys, hangar roofs, bridge parapets) are drawn as upright silhouettes rising toward the top of the sprite, as a map symbol does. A three-quarter or isometric projection MUST NOT be used anywhere in this asset set.

Rationale: this is the convention that makes the rest of the document producible. A consistent 3/4 oblique across twenty separately generated structures is something image models cannot hold — the horizon drifts, the vanishing point wanders, and half the batch comes back at a different angle from the other half. Elevation-on-plan is a flat, angle-free convention that a model can hit repeatedly, it composites correctly over a strictly top-down terrain layer without a projection mismatch, and at 32 CSS px it is the only thing that actually reads: a chimney seen from directly overhead is a dot, and a dot cannot be counted.

7.2 Road

ART-850 The Road surface MUST be rendered as a procedurally generated stroke, not as a connecting tile set. For each tile carrying a Road, the renderer MUST draw a stroke from the tile centre to the boundary midpoint of every neighbour that also carries a Road, over all eight neighbours (GR-180, GR-420 — road contiguity is eight-way because movement is), and MUST draw a junction cap at the centre where the connection count is not exactly 2.

Rationale, and this is where the sprite approach loses outright. Eight-way connectivity means 2^8 = 256 connection states. Even factored into an orthogonal 4-bit set plus diagonal spurs it is twenty sprites that must join exactly at every tile boundary at every rotation, and joining exactly is precisely the thing image generators cannot do — the road width drifts by two pixels between generations and every junction shows it. A stroke is width-exact by construction, it is trivially correct at all 256 states, it scales continuously between the LOD tiers instead of stepping, and UX-390 already asks for "roads and rivers as lines" at the Chip tier, which a stroke gives for free by reducing its width.

ART-855 Where a project nonetheless wants sprite roads, the fallback set MUST be 20 sprites: sixteen orthogonal pieces keyed by the bitmask N=1, E=2, S=4, W=8, plus four additive diagonal spurs NE, SE, SW, NW. This is recorded so the count is known; it is not the shipped path and the register of §13 does not include it.

ART-860 Road stroke widths MUST be: Close 5 px @2x (2.5 CSS px), Mid 3 px @2x, Chip 1 CSS px line, Strategic not drawn (UX-390 gives the Strategic tier flat terrain colours only). The stroke MUST be filled with the tiling road_surface.png sampled in world space, MUST be a fixed neutral colour independent of owner (ART-610), and MUST sit at L* 66 ± 3 — lighter than every land terrain except Desert and Icefield, which is what makes a road legible across the map without breaking ART-690.

A seamless tileable strip of unpaved compacted road surface seen from directly overhead,
running horizontally across the whole image, filling it edge to edge with no verge and no
edge of the road visible. Fine gravel and packed dirt texture with faint wheel rut lines
running along the length of the strip. Pale warm grey, close in tone to a light stone
grey, very low contrast, no dark stones, no potholes, no puddles, no vegetation.
Uniform density across the whole image, no bright patch, no dark patch, no focal point.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Seamless and tileable left to right. No text, no numbers, no border, no frame, no
vignette, no drop shadow, no glow, no outline, no vehicles, no markings, no centre line.
Flat 2D texture. 1024x1024.

Deliver as road_surface.png at 64 x 64 @2x, tileable horizontally only (the stroke samples along its length). Run ART-780 steps 4–6 on the horizontal axis alone.

Two separate flat 2D top-down map symbols on one image, widely separated:
(1) a small irregular patch of pale grey compacted gravel, roughly circular with a
    slightly ragged edge, for the centre of a road junction,
(2) a short rounded stub of the same gravel surface, flat at one end and rounded at the
    other, for the end of a road.
Pale warm grey, same tone as a light stone grey, very low contrast, fine gravel texture,
no dark stones, no potholes, no vegetation, no kerb, no edge line.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no watermark, no drop shadow, no glow, no outline stroke, no 3D.
Flat 2D map symbol. 1024x1024.

Cut into road_junction.png (20 x 20 @2x) and road_cap.png (12 x 12 @2x).

7.3 Bridge

ART-865 A Bridge is an edge feature (GR-450), not a tile installation, and MUST be drawn as a deck spanning the river edge perpendicular to it, with the road stroke continuing across it. It MUST be neutral-coloured like the Road, MUST be visually distinct from a Ford at a glance, and its destruction (GR-500) MUST be rendered by removing the sprite and reverting to the underlying River or Ford art — there is no damaged state, because the rules define none.

A flat 2D top-down map symbol of a small stone bridge deck seen from directly overhead,
oriented so the deck runs from the bottom edge of the image to the top edge.
A straight pale stone roadway with a low parapet wall drawn as a slightly lighter narrow
band along each side, and two short abutments where the deck meets the bank.
Pale warm stone grey, matching a light stone grey road, very low contrast, no dark
shadow under the arch, no water visible, no railings in perspective, no vehicles.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background, no gradient, no vignette, no border, no frame.
No text, no numbers, no watermark, no drop shadow, no glow, no outline stroke, no 3D.
Flat 2D map symbol. 1024x1024.

Deliver bridge_deck.png at 24 x 40 @2x, authored for a horizontal (north/south) edge and rotated 90 degrees for a vertical one.

7.4 Fort — team-coloured

ART-870 The Fort MUST carry a team-colour channel (ART-610), MUST be authored as a fully-masked two-value stencil (ART-605, ART-615), and MUST read as a closed, angular enclosure with a visible interior, because GR-1280 caps external observation of its garrison at fidelity 1 — the player can see that it is held and not by what. Its silhouette MUST be distinct from the City's at every tier: angular bastioned outline, no chimneys, no roof mass, wider than tall.

A flat two colour map symbol of a small star fort seen from directly overhead:
an angular bastioned enclosure with four pointed corner bastions and a clear open
courtyard in the middle, and a small gateway gap in the lower wall.
EXACTLY TWO COLOURS ONLY plus background: pure black #000000 for the walls and pure
white #FFFFFF for the courtyard and the ground inside.
No greys, no anti-aliasing, no gradients, no shading, no texture, no midtones, no
hatching, no stipple. Hard-edged stencil, silkscreen, printed wargame counter style -
one flat black shape and one flat white shape with nothing in between them.
Thick heavy walls, bold simple silhouette that survives being shrunk to 30 pixels.
Solid flat magenta #FF00FF background.
No text, no numbers, no flag, no banner, no watermark, no border, no frame, no drop
shadow, no glow, no perspective, no 3D, no isometric view, no people, no cannon.
Straight-on orthographic map symbol. 1024x1024.

Deliver fort.png at 56 x 56 @2x. Then produce fort_mid.png at 32 x 32 @2x by redrawing, not downsampling — reduce to the outer bastioned outline and a single interior void, remove the gateway. A downsampled stencil acquires grey pixels, which the mask derivation of ART-605 cannot classify and the tint pipeline renders as a blend belonging to no seat; see ART-1145.

7.5 Airfield — team-coloured

ART-880 The Airfield MUST carry a team-colour channel (ART-610), MUST be authored as a fully-masked two-value stencil (ART-605, ART-615), and MUST read as a runway — a long straight bar with a hardstanding — because it is the only installation whose meaning is directional. Its silhouette MUST be distinct from both Fort and City: open, linear, no enclosure.

A flat two colour map symbol of a small airfield seen from directly overhead:
one long straight runway strip running from lower left to upper right, with a short
perpendicular taxiway and a rounded apron at one end, and two small rectangular hangar
blocks beside the apron.
EXACTLY TWO COLOURS ONLY plus background: pure white #FFFFFF for the runway, taxiway
and apron surfaces, and pure black #000000 for the hangar blocks and a bold outline
band along both long sides of the runway.
No greys, no anti-aliasing, no gradients, no shading, no texture, no midtones, no
hatching, no stipple. Hard-edged stencil, silkscreen, printed wargame counter style.
Bold simple silhouette that survives being shrunk to 30 pixels.
Solid flat magenta #FF00FF background.
No text, no numbers, no runway markings, no numerals on the runway, no aircraft, no
windsock, no watermark, no border, no frame, no drop shadow, no glow, no perspective,
no 3D, no isometric view.
Straight-on orthographic map symbol. 1024x1024.

Deliver airfield.png at 56 x 56 @2x and redraw airfield_mid.png at 32 x 32 @2x as the bare runway bar plus one hangar block. Runway numerals are forbidden: the model will add them unasked, they are illegible below 64 px, and small text is one of the things image generators reliably get wrong.

7.6 Composition

ART-885 GR-430 permits Road, Fort and Airfield on one tile simultaneously and requires them to compose. The art MUST therefore be drawn to fixed non-overlapping zones within the tile:

Layer Zone z-order
Road stroke full tile, through the centre 1 (lowest)
Airfield occupies the tile, runway offset so it does not cross the tile centre 2
Fort centred, 56 x 56 of the 64 px tile 3
City centred (a City tile MAY also carry all three) 4
Badges fixed corners (ART-1000) 5 (highest)

A fortified airfield on a road is a legal and intended thing to build (GR-430) and MUST be reviewed as a specific fixture in the contact sheet of ART-1170.


8. Edge features: River, Ford, Bridge

8.1 An edge is a different shape of asset

ART-890 River, Ford and Bridge sit on the boundary between two tiles (GR-450), not on a tile. They MUST be authored and stored under a half-edge convention: each tile owns its north and west edges only, so every edge in the map has exactly one owner and is drawn exactly once. Edge art MUST be authored for a horizontal (north) edge and rotated 90 degrees for a west edge; because the rotation is a multiple of 90 degrees it is lossless and no second asset is needed.

ART-895 An edge sprite MUST be 64 px along the edge x 32 px across it at @2x — that is, one tile edge long and half a tile wide — and MUST be drawn centred on the boundary line, straddling both tiles by 16 px @2x (8 CSS px) each. Its alpha MUST fall to zero at both ends across the outer 6 px so that two collinear river edges join without a visible butt.

Rationale: a river drawn wholly inside one of its two tiles reads as a feature of that tile and misstates the rule — GR-460 charges the crossing to the move, not to either tile — and it makes the two banks asymmetric, which looks wrong at every bend. Straddling also means a single asset serves both tiles, which halves the count and removes the class of bug where the north side of a river was authored against Woods and the south against Marsh.

8.2 River

ART-900 Three river-edge variants MUST ship, plus two corner joints. The joint MUST be drawn wherever two or more river edges meet at a shared tile corner, and covers the overlap that two straddling strips leave at a right-angle bend.

Three separate flat 2D top-down map illustrations on one image, stacked with wide empty
space between them, each a horizontal band running the full width of the image:
each band is a narrow winding river seen from directly overhead, entering at the left
edge and leaving at the right edge, with a soft irregular meander,
(1) a gently winding river of even width,
(2) a wider slower river with one small sandbank in it,
(3) a narrow fast river with a slightly braided middle section.
Each river must touch the left and right edges of its band at the same vertical height,
in the middle of the band, so the bands can be joined end to end.
Muted blue grey water, close in tone to a soft slate blue, with a very narrow slightly
paler bank of pale sand on each side. Extremely low contrast, no white foam, no sparkle,
no sun glint, no reflection, no dark outline, no deep blue, no rapids, no bridges,
no boats, no trees, no vegetation on the banks.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background between and around the bands.
No text, no numbers, no watermark, no border, no frame, no drop shadow, no glow, no 3D.
Flat 2D map illustration. 1024x1024.

Cut into river_edge_01..03.png at 64 x 32 @2x. Check the entry and exit heights: if the river does not leave at the same height it entered, adjacent river edges will step, and this is the most common defect in the batch. Nudge in a pixel editor rather than regenerating.

Two separate flat 2D top-down map illustrations on one image, widely separated, each a
small right-angle bend of a narrow winding river seen from directly overhead: the water
enters at the bottom edge of its square and leaves at the right edge, turning through
ninety degrees with a soft natural curve and a slightly wider pool on the outside of the
bend. Muted blue grey water with a very narrow pale sand bank on each side.
Extremely low contrast, no white foam, no sparkle, no reflection, no dark outline.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background. No text, no numbers, no watermark, no border,
no frame, no drop shadow, no glow, no 3D. Flat 2D map illustration. 1024x1024.

Cut into river_joint_01.png and river_joint_02.png at 32 x 32 @2x, placed on the shared corner.

ART-905 River art MUST sit at L* 50 ± 4 — darker than every land terrain except Marsh — so a river reads as a line across open country. This is the one place terrain art may approach the floor of ART-690, and it is permitted because a river is a barrier a player must be able to trace at a glance across a whole theatre (GR-460, GR-480).

8.3 Ford

ART-910 A Ford MUST be drawn as a paler, shallower, visibly crossable band interrupting the river, and MUST be distinguishable from a Bridge without reading a tooltip: a Ford has no deck and no parapet, and the water is continuous through it.

Rationale: GR-1550 guarantees at least one Ford per four tiles of river, so every river a player meets has a crossing in it and finding that crossing is a real tactical act. A Ford that looks like a slightly different river is a Ford the player will not find, and the whole "a river is a defensive line with a decision in it" design collapses into "a river is a wall".

Two separate flat 2D top-down map illustrations on one image, widely separated, each a
horizontal band showing a short shallow crossing point in a small river seen from
directly overhead: the river runs left to right and in the middle of the band it becomes
visibly shallower and paler, with a scatter of pale stepping stones and gravel showing
through the water, and a pale worn track approaching the water from above and below.
Muted blue grey water becoming pale sandy grey at the crossing. Extremely low contrast,
no white foam, no sparkle, no reflection, no dark outline, no bridge, no deck, no
parapet, no railing, no posts, no people, no animals.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background. No text, no numbers, no watermark, no border,
no frame, no drop shadow, no glow, no 3D. Flat 2D map illustration. 1024x1024.

Cut into ford_band_01.png and ford_band_02.png at 64 x 32 @2x. A Ford sprite REPLACES the river-edge sprite on that edge; it is not drawn over it.

8.4 The thing that will be got wrong

ART-920 A navigable river is a chain of Shallows tiles (GR-600), not an edge feature, and MUST be rendered with the Shallows base and decals like any other water tile. River edges and navigable rivers are distinct map objects that never interact — GR-600 forbids a River edge where either tile is water. Art or a shader that tries to blend the two, or that draws river-edge banks against a Shallows tile, is a defect.

Rationale: this catches an assumption almost everyone makes on first reading — that the blue line on the map and the blue tiles on the map are the same feature at different scales. They are not. One is an edge that costs +6 MP to cross and multiplies the defender by 1200 per mille; the other is water that a draft-1 hull sails down. They look different because they are different, and the coast treatment of ART-830 applies to the second and never to the first.


9. The City

The City is the most complex asset in the game and the one most likely to be attempted as a single sprite per state. It MUST NOT be. UX-450 requires a city to show owner colours, occupancy, Industry 1–4 with observation age, Integration and Unrest bands for own cities, Seat, Landmark and Bellwether badges, the Unsettled state and a Stalled production order. Enumerated as sprites that is 4 Industry x 3 classes x 5 badge combinations x 2 states x N owners, which is thousands. Decomposed, it is 23 cells.

9.1 Decomposition

ART-930 City rendering MUST be decomposed exactly as follows, and no state in the right-hand column MAY be baked into base art:

Component Kind Cells Notes
Industry silhouette, Close team-coloured base art 4 city_ind1..4
Industry silhouette, Mid team-coloured base art 4 city_mid_ind1..4, redrawn not downsampled
Class plinth (Town / City / Metropolis) full-colour overlay art 3 EC-310, EC-320
Port quay full-colour overlay art 1 drawn toward the water side (GR-890)
Production plume full-colour overlay art 6 frames Close tier only (UX-390)
Seat / Landmark / Bellwether badges team-coloured overlay art 3 VC-1080, VC-950
Unsettled / Stalled badges team-coloured overlay art 2 EC-630, US-1040
Owner colours procedural — mask substitution (UX-440) 0
Occupancy procedural — garrison bar 0
Industry pip track procedural 0 ART-940
Integration and Unrest bands procedural — arcs with hatch 0 own cities only, EC-1000
Traits deferred to docs/art/03-* trait pips 0 EC-450 requires them on the map
Observation age, remembered state procedural — shader plus DOM 0 UX-420
Chip and Strategic markers procedural 0 ART-1040
Total cells 23

9.2 Industry, and how a player actually counts it

ART-940 Industry level (US-810, range [1, 4]) MUST be encoded twice, by two independent channels:

  1. Diegetically, in the silhouette: the number of chimneys/stacks on the city MUST equal the Industry level, and the built mass and footprint MUST grow monotonically with it.
  2. Abstractly, as a procedural pip track: a fixed four-slot track drawn on the plinth in the owner's foreground colour, with industry slots filled and 4 − industry slots drawn as empty outlines.

Both MUST be drawn at the Close tier. At Mid the pip track MUST be drawn and the chimneys MAY be lost to resolution. At Chip the pip track SHOULD be drawn as a 1 px row and MUST be dropped if it cannot be drawn legibly. At Strategic Industry MUST NOT be drawn; the Industry overlay of UX-460 is the answer at that zoom.

Rationale for doing it twice: the silhouette is what makes the map look like a world and it is what a player reads without trying, but four chimneys at 16 CSS px is four pixels and nobody counts that. The pip track is ugly and precise and it is the one the player uses when it matters. The fixed four-slot track — rather than N pips — is worth the extra pixels because it shows headroom against the Industry cap of US-900 in the same glyph, so "Industry 2" and "Industry 2, two levels of growth left" are the same reading. Encoding the level by count and by mass, rather than by colour, is also what discharges UX-1310 here: Industry is never carried by hue.

9.3 Close-tier city base art — team-coloured

ART-950 Four Close-tier city sprites MUST ship at 64 x 64 @2x, authored as fully-masked two-value stencils (ART-605, ART-615), with monotonically growing mass and chimney count. The silhouette MUST be distinguishable from the Fort (angular enclosure, no roofs) and the Airfield (linear, open).

Four separate flat two colour map symbols on one image, arranged in a row with wide empty
space between them, each a small town or industrial city seen from directly overhead but
with its buildings drawn as upright silhouettes standing up toward the top of the image,
like a symbol on an old printed map. Left to right they grow:
(1) a small village: three low blocks with pitched roofs, ONE tall thin chimney,
(2) a larger town: five blocks plus one long workshop shed, TWO tall thin chimneys,
(3) a factory town: eight blocks, a long foundry hall with a saw tooth roof,
    THREE tall thin chimneys,
(4) an arsenal city: a dense block of twelve buildings, a large hall, a gantry frame,
    a low wall around part of it, FOUR tall thin chimneys.
The chimneys must be clearly separated, clearly countable, and obviously the tallest
thing in each symbol.
EXACTLY TWO COLOURS ONLY plus background: pure black #000000 and pure white #FFFFFF.
No greys, no anti-aliasing, no gradients, no shading, no texture, no midtones, no
hatching, no stipple, no windows drawn as small dots. Hard-edged stencil, silkscreen,
printed wargame counter style - flat black shapes and flat white shapes only.
Bold simple silhouettes that survive being shrunk to 30 pixels.
Solid flat magenta #FF00FF background between and around the four symbols.
No text, no numbers, no flags, no banners, no smoke, no watermark, no border, no frame,
no drop shadow, no glow, no perspective, no 3D, no isometric view, no people, no roads.
1024x1024.

Cut into city_ind1.pngcity_ind4.png at 64 x 64 @2x. Verify the chimney counts by eye before keying — the count is the requirement and the model will get it wrong roughly half the time. Fix a miscount in a pixel editor by cloning or deleting a chimney; this is a two-minute repair and it is far cheaper than regenerating four consistent silhouettes.

9.4 Mid-tier city base art — team-coloured

ART-960 Four Mid-tier city sprites MUST ship at 32 x 32 @2x, produced by redrawing (ART-1145), not by downsampling. At Mid the encoding changes: a stepped roofline of 1 to 4 ascending blocks replaces countable chimneys, because a 4-step skyline survives 16 CSS px and four separate chimneys do not.

Four separate flat two colour map symbols on one image, arranged in a row with wide empty
space between them, each an extremely simplified town symbol seen straight on, drawn as a
solid block silhouette on a baseline: a skyline of rectangular blocks of increasing
height, ascending from left to right within each symbol.
(1) one block, (2) two blocks in a rising step, (3) three blocks in a rising step,
(4) four blocks in a rising step, with the fourth symbol also being the widest overall.
EXACTLY TWO COLOURS ONLY plus background: pure black #000000 for the block silhouette
and pure white #FFFFFF for a solid baseline bar beneath it.
No greys, no anti-aliasing, no gradients, no shading, no texture, no midtones, no
outlines, no windows, no doors, no roof detail, no chimneys.
Hard-edged stencil, silkscreen, printed wargame counter style. Extremely bold and simple,
must survive being shrunk to 16 pixels.
Solid flat magenta #FF00FF background between and around the four symbols.
No text, no numbers, no watermark, no border, no frame, no drop shadow, no glow,
no perspective, no 3D. 1024x1024.

Cut into city_mid_ind1.pngcity_mid_ind4.png at 32 x 32 @2x.

9.5 Class plinth

ART-970 Three plinths MUST ship — Town, City, Metropolis (EC-310, EC-320) — as full-colour overlay art drawn under the city silhouette, sized 40 / 52 / 64 px @2x. The plinth carries the Industry pip track (ART-940), the garrison bar and the Integration/Unrest arcs (ART-1020), and it is what makes a city legible against every one of the eleven terrains without the terrain needing a special case.

Rationale: EC-310's own rationale says a player must be able to read a city's rough worth from its map icon without opening a tooltip, and three plinth sizes is the cheapest way to say Town / City / Metropolis. Giving the procedural readouts a fixed ground to sit on is the second reason and the more important one — without it, the pip track sits on Marsh in one place and Icefield in another and its contrast is different every time.

Three separate flat 2D top-down map symbols on one image, widely separated: three
rounded-corner rectangular ground plates of increasing size, small, medium and large,
each showing bare cleared ground - packed pale earth with a few faint track marks and a
slightly darker soft edge where the cleared ground meets nothing.
Pale neutral warm grey, close in tone to a light stone grey, very low contrast,
no buildings, no walls, no vegetation, no roads leading off, no border line.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background. No text, no numbers, no watermark, no border,
no frame, no drop shadow, no glow, no 3D. Flat 2D map symbol. 1024x1024.

Cut into plinth_town.png (40 x 40), plinth_city.png (52 x 52), plinth_metropolis.png (64 x 64), all @2x.

9.6 Port quay

ART-980 A city whose tile is adjacent to water (a Port, GR-890) MUST additionally draw a quay decal, rotated to face the water. One asset serves all eight orientations by 45-degree rotation; where the city is adjacent to water on several sides the quay MUST be drawn once only, toward the lowest-indexed water neighbour in GR-160's fixed order.

A flat 2D top-down map symbol of a small stone harbour quay seen from directly overhead:
a short straight stone jetty projecting from a straight shoreline, with a small L shaped
mole beside it and two tiny moored boat shapes drawn as simple pale slivers.
Pale warm stone grey, very low contrast, no water, no waves, no foam, no dark outline,
no bollards, no cranes, no people, no ropes.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background. No text, no numbers, no watermark, no border,
no frame, no drop shadow, no glow, no 3D. Flat 2D map symbol. 1024x1024.

Deliver quay.png at 32 x 32 @2x, authored pointing north (toward the top).

9.7 Production plume

ART-990 A six-frame plume MUST ship and MUST be drawn only at the Close tier (UX-390 forbids idle animation at Mid and below) and only while the city is producing. Absence of the plume is one of the two signals that a city is Unsettled or Stalled; the badges of ART-1010 are the other and are the authoritative one, because absence is ambiguous between the two states.

ART-995 The plume MUST respect the global animation-speed setting including instant (UX-480); at instant it MUST render as a single static frame, not as a stopped animation.

Six separate flat 2D illustrations on one image, arranged in a row with wide empty space
between them, forming a loop of rising smoke seen straight on: a thin soft column of pale
grey smoke rising from a point at the bottom centre of each frame and drifting slightly
to the right as it rises, growing wider and fainter toward the top, in six successive
stages of the same drifting motion so the sixth frame flows back into the first.
Very pale neutral grey, extremely low contrast, soft edged, semi transparent in feel,
no black, no white, no dark outline, no fire, no sparks, no chimney, no building.
Flat 2D illustration, no perspective, no cast shadow, even ambient light.
Solid flat magenta #FF00FF background between and around the six frames.
No text, no numbers, no watermark, no border, no frame, no drop shadow, no glow, no 3D.
1024x1024.

Cut into plume_01.pngplume_06.png at 24 x 40 @2x. Cap the plume's opacity at 35 % in the renderer; a plume that reads as strongly as the city does will be mistaken for a state change.

9.8 Badges — team-coloured

ART-1000 Five city badges MUST ship at 24 x 24 @2x (12 CSS px), authored as fully-masked two-value stencils (ART-605, ART-615), and MUST be assigned fixed corners so that they never collide and never need a priority order:

Badge Slot Silhouette (MUST be distinct without colour, UX-1310) Source
Seat top-left tall narrow pointed keystone/arch, flat top VC-510, VC-570
Landmark top-right five-point radial star VC-1080
Bellwether bottom-right bell outline with two radiating arcs VC-950
Stalled bottom-left circle crossed by one diagonal bar US-1040
Unsettled centre, over the city square of three horizontal shutter bars EC-630

Rationale for fixed slots rather than a priority queue: UX-430 defines a priority order for unit marks because a unit can carry a dozen of them and the tile is 32 px. A city can carry at most five and it has four unused corners, so the cheaper answer is to give each badge an address. It also means a player learns "top-right is Landmark" as a position rather than as a picture, which is the faster read. The Unsettled badge takes the centre deliberately: it is a temporary, one-Ledger-phase state (EC-630) that overrides the reading of everything else on the tile, and it should sit on top of the city rather than beside it.

Five separate flat two colour map badge symbols on one image, arranged in a row with wide
empty space between them, each inside an implied circle of the same size:
(1) a tall narrow pointed arch keystone shape with a flat top, like a capital marker,
(2) a bold five pointed star,
(3) a simple bell outline with two short curved arcs radiating from each side of it,
(4) a bold circle crossed by a single thick diagonal bar,
(5) a square divided into three thick horizontal bars like a closed window shutter.
EXACTLY TWO COLOURS ONLY plus background: pure black #000000 for the symbol and pure
white #FFFFFF for a solid filled disc behind each symbol.
No greys, no anti-aliasing, no gradients, no shading, no texture, no midtones, no
hatching. Hard-edged stencil, silkscreen, printed wargame counter style.
Extremely bold and simple - each must survive being shrunk to 12 pixels.
Solid flat magenta #FF00FF background between and around the five badges.
No text, no numbers, no letters, no watermark, no border, no frame, no drop shadow,
no glow, no perspective, no 3D. 1024x1024.

Cut into badge_seat.png, badge_landmark.png, badge_bellwether.png, badge_stalled.png, badge_unsettled.png at 24 x 24 @2x.

ART-1005 Each badge MUST be drawn with the white disc behind the black symbol so that it is legible over every terrain and over the city itself without an outline. The disc lies inside the badge's team-colour mask and MUST take the owner's background colour under UX-440, so a badge is always in the owner's colours and never in a fixed hue — which is what keeps ownership readable when a Landmark changes hands. A badge MUST NOT be delivered with the disc left outside the mask; a fixed-hue disc reintroduces exactly the "ownership carried by a small mark" failure UX-440 rejects.

9.9 Unsettled and Stalled

ART-1010 A city in the Unsettled state (EC-630 — one Ledger phase after capture, accruing nothing, completing nothing) MUST show the Unsettled badge in the centre slot, MUST suppress the production plume, and MUST have its silhouette rendered at 65 % foreground/background separation — the substitution pass pulls the seat's two tones toward each other inside the masked region, so the city reads as dimmed while staying entirely in the owner's colours.

Rationale for dimming this way rather than by desaturating the sprite: desaturation and a lift toward #2B2E33 is the memory treatment of ART-1100, and an Unsettled city is being observed right now. Two states that both wash the colour out of a city are two states a player will confuse, and UX-420's first clause is that remembered is never mistakable for observed. Compressing the seat pair keeps ownership at full strength and says "not working yet" in a channel the memory treatment does not use.

A city holding a Stalled production order (US-1040) MUST show the Stalled badge in the bottom-left slot and MUST suppress the plume, but MUST NOT be dimmed — a Stalled city is fully yours and fully productive in every other respect (US-1050 funds the next order in the queue), and dimming it would misstate that.

9.10 Procedural readouts

ART-1020 These MUST be drawn by the renderer on the plinth and MUST NOT be delivered as art:

Readout Geometry Non-colour encoding (UX-1310)
Industry pip track 4 slots, 3 x 3 px @2x each, plinth top edge filled vs outlined slots — a count
Occupancy / garrison bar along plinth bottom edge, one tick per occupying unit tick count
Integration band left arc round the plinth, filled clockwise 0–100 arc length, plus a 3-step hatch: none / diagonal / cross
Unrest band right arc round the plinth, filled anticlockwise 0–100 arc length, plus the same 3-step hatch

Integration and Unrest arcs MUST be drawn only on the viewing player's own cities (UX-450, EC-1000), and MUST NOT be drawn on a remembered or enemy city under any circumstance.

ART-1030 A neutral city (no owner) MUST use the neutral seat pair from docs/art/00-* and MUST use identical art; there is no separate neutral city sprite. A remembered city — explored but not currently observed (GR-1130, UX-420) — MUST be rendered from the same art with the memory treatment of ART-1110, and its Industry pip track MUST show the last observed value (US-970) alongside the observation age rendered by the DOM layer. Ownership of a remembered city MUST still be rendered at full strength, because GR-1290 and GR-1430 make city ownership a public fact that fidelity never withholds.

9.11 Chip and Strategic

ART-1040 At Chip the city MUST be a 6 x 6 CSS px rounded square in the owner's background colour with a 1 px border in the owner's foreground colour, with the Industry pip row beneath it where it fits (ART-940). At Strategic it MUST be a 3 x 3 CSS px square in the owner's foreground colour with no border and no Industry. Both are procedural; neither is art.

ART-1050 The city asset register is exactly the 23 cells of the table in ART-930. Any state UX-450 requires that is not in that table is procedural, and any proposal to add a cell MUST first be shown not to be expressible as a tint, a pip, a bar or an arc.


10. The Chip and Strategic tiers

At Chip (8 CSS px per tile) and Strategic (4 px) there is no room for a decal and no unit sprite standing on a tile to protect — UX-390 gives these tiers flat terrain colours, with roads and rivers as lines at Chip and nothing at all at Strategic. The value band of ART-690 is therefore lifted here, and value becomes the identity channel (ART-730).

ART-1060 At the Chip tier the renderer MUST draw: the flat terrain colour of ART-1070, roads as a 1 CSS px line, rivers as a 1 CSS px line, city markers per ART-1040, and nothing else. Decals, transition feathers, coast foam, the shared grain and the production plume MUST all be suppressed. At the Strategic tier the renderer MUST draw the flat terrain colour and the 3 px city marker only; roads and rivers MUST NOT be drawn.

Rationale: this is a legibility requirement, not a performance one, and UX-390 states it as such. A Vast map at Strategic is 2,048 tiles across; a road line at that zoom is a grey haze over the whole map and a decal is a single dithered pixel. Suppression is what makes the tier worth having. The performance win — no decal draws, no feather passes, one quad per chunk — is a bonus that happens to answer UX-400's fixed memory budget at exactly the zoom where the visible tile count is largest.

ART-1070 The Chip and Strategic flat terrain colours MUST be exactly these. They are the source values; the Close base palette of ART-790 is derived from them by compression, not the other way round.

# Terrain Chip flat L* C* Position in the value ladder
7 Icefield #C9CED1 82.5 2.4 lightest — neutral, no hue
2 Desert #D2BF8E 77.8 27.2 lightest warm
8 Shallows #86B3C4 70.4 17.3 lightest water
1 Cropland #ADA455 66.6 42.5 highest chroma in the set — "worth money"
0 Plains #7E9C5E 60.8 36.3 the reference terrain
5 Hills #96865A 56.4 25.9
9 Coastal Sea #4E86A6 53.4 24.4 middle water
6 Mountains #797B84 51.7 5.3 neutral, no hue — reads as rock at any zoom
3 Woods #4E7042 43.7 30.8
10 Open Ocean #2E5578 34.9 24.1 darkest water
4 Marsh #4F4B33 31.7 15.2 darkest — a trap should look like one

Measured separation of this palette, so the numbers are on the record rather than asserted:

Measure Value Closest pair
Minimum pairwise ΔE (CIE76, normal vision) 18.7 Plains | Woods
Minimum pairwise ΔE under deuteranope simulation 9.5 Woods | Marsh
Second closest under deuteranope 11.4 Plains | Hills
Third closest under deuteranope 11.9 Cropland | Hills
Overall L* span 31.7 – 82.5

ART-1080 Because the two weakest pairs — Woods | Marsh and Plains | Hills — fall below ΔE 12 under a deuteranope simulation, each MUST additionally carry a pattern fill at the Chip and Strategic tiers whenever the client's high-contrast or colourblind-safe mode is active, which UX-1310 requires the client to enable by default when a platform high-contrast preference is detected. The patterns MUST be procedural, MUST be drawn at 1 px, and MUST be:

Terrain Pattern
Marsh horizontal dashes, 2 px on / 2 px off, every 3rd row
Woods none (Woods is the base against which Marsh is read)
Hills single diagonal pixel run, every 4th row
Plains none

Rationale for patterning only two of eleven: UX-1310 forbids ownership being carried by hue alone and requires every graded encoding to be distinguishable without colour vision, but it does not require eleven distinct patterns, and eleven patterns at 8 px would be a moiré field rather than a map. Measuring the palette and patterning only the pairs that actually fail is both cheaper and better, and it is checkable — the measurement in ART-1070 is the evidence, and a change to the palette obliges a re-measurement.

ART-1085 palette.json MUST carry both palettes keyed by terrain id, in this shape, and MUST be the artefact the measurement of ART-1070 is re-run against whenever it changes:

{
  "version": 1,
  "terrain": [
    { "id": 0,  "name": "plains",      "close": "#7F9765", "chip": "#7E9C5E", "pattern": null },
    { "id": 1,  "name": "cropland",    "close": "#A0985B", "chip": "#ADA455", "pattern": null },
    { "id": 2,  "name": "desert",      "close": "#B4A47E", "chip": "#D2BF8E", "pattern": null },
    { "id": 3,  "name": "woods",       "close": "#65815B", "chip": "#4E7042", "pattern": null },
    { "id": 4,  "name": "marsh",       "close": "#6F6B57", "chip": "#4F4B33", "pattern": "dash_h" },
    { "id": 5,  "name": "hills",       "close": "#968865", "chip": "#96865A", "pattern": "diag" },
    { "id": 6,  "name": "mountains",   "close": "#81838A", "chip": "#797B84", "pattern": null },
    { "id": 7,  "name": "icefield",    "close": "#A8ACAF", "chip": "#C9CED1", "pattern": null },
    { "id": 8,  "name": "shallows",    "close": "#7EA1AE", "chip": "#86B3C4", "pattern": null },
    { "id": 9,  "name": "coastal_sea", "close": "#618BA4", "chip": "#4E86A6", "pattern": null },
    { "id": 10, "name": "open_ocean",  "close": "#56708E", "chip": "#2E5578", "pattern": null }
  ]
}

11. Fog, memory, and the polar strip

GR-1120 gives three tile states and UX-420 requires the client to distinguish them. Two of the three are shader work over existing art; only the first needs an asset.

ART-1090 Unexplored tiles MUST be drawn as an opaque fill — no terrain art of any kind may show through, because an unexplored tile's terrain is not in the Terrain Record (GR-1140) and must not leak. The fill MUST be #2B2E33 with unexplored_fill.png tiled over it at 20 % opacity, and MUST carry a 6 px @2x soft inner edge where it meets an explored tile so the frontier of a player's knowledge reads as a shape rather than as a staircase.

A seamless tileable dark neutral texture of heavy unbleached paper or coarse dark cloth,
very dark cool grey, extremely low contrast, fine even fibre grain with no pattern,
no motif, no focal point, no bright patch, no dark patch, uniform density everywhere.
No colour, no text, no border, no vignette, no drop shadow, no illustration, no object.
Flat 2D texture. Seamless tileable. 1024x1024.

Downsample to 128 x 128, desaturate, run ART-780. Deliver unexplored_fill.png.

ART-1100 Explored but not observed — the remembered state — MUST be produced by a shader over the ordinary terrain art, never by a second art set: desaturate by 55 %, lift toward #2B2E33 by 30 %, reduce contrast by 40 %, draw decals at 60 % opacity, and overlay memory_grain.png at 12 %. Observed tiles MUST receive none of these.

Rationale: UX-420's first clause is that remembered is never mistakable for observed, and it is the one fog requirement that a shader discharges better than art can. Doing it in the shader means the treatment is applied uniformly to terrain, installations, edge features and remembered cities at once, and it means a change to the strength of the effect is a uniform, not a re-export of a hundred files. It also keeps the Terrain Record honest: what the player sees dimmed is exactly the art of the terrain they recorded, and terrain never changes (GR-270), so there is nothing to go stale.

A seamless tileable texture of faded printed map paper, greyish and slightly mottled,
with very faint irregular blotches like age spots and a fine dry fibre grain,
extremely low contrast, uniform density, no pattern, no motif, no focal point,
no bright patch, no dark patch, no folds, no creases, no torn edges.
No colour, no text, no border, no vignette, no drop shadow, no illustration.
Flat 2D texture. Seamless tileable. 1024x1024.

Downsample to 128 x 128, desaturate, run ART-780. Deliver memory_grain.png.

ART-1110 The polar impassable strip a cylinder map carries (GR-220 — at least two tiles of Icefield or Mountains along both non-wrapping edges) MUST be visually distinct from ordinary terrain of the same type (UX-410), and MUST be drawn as a procedurally-placed hatch overlay from polar_hatch.png at 25 % opacity over the terrain art, not as a separate terrain.

Rationale: UX-410 asks for this because a player who plans a march into the polar strip has planned a march into a wall the generator built, and the tiles look exactly like the Icefield and Mountains they will meet elsewhere on the map. A hatch says "the map ends here" without inventing a twelfth terrain type, which GR-260 forbids.

A seamless tileable pattern of widely spaced thin diagonal hatching lines running from
lower left to upper right, evenly spaced, uniform thickness, on a plain background.
The lines must be a soft mid grey, thin, and clearly separated with generous empty space
between them. Regular, even and mechanical, like engraving hatch on an old chart.
No cross hatching, no varying spacing, no varying thickness, no texture, no noise.
No colour, no text, no border, no vignette, no drop shadow, no illustration, no object.
Flat 2D pattern. Seamless tileable. 1024x1024.

Downsample to 64 x 64, threshold to a clean two-value mask, run ART-780. Deliver polar_hatch.png.


12. Acceptance and quality assurance

Every command below is ImageMagick 7 (magick). Run them; do not eyeball these particular properties, because most of them are invisible to the eye at the moment they matter and glaring later. The two checks a person must nonetheless make — the ownership read of ART-1135 and the contact sheet of ART-1170 — say so in their own text, and neither has a number that can stand in for the judgement.

12.1 Chroma key and despill

ART-1130 Every generated asset MUST pass through this procedure before it is committed. The despill step MUST NOT be skipped.

# 1. Key out the magenta ground.
magick in.png -fuzz 15% -transparent "#FF00FF" keyed.png

# 2. Erode the alpha by one pixel. This removes the spill ring that the key leaves
#    behind, which is invisible against magenta and obvious against Woods.
magick keyed.png -channel A -morphology Erode Diamond:1 +channel eroded.png

# 3. Despill: pull R and B down toward G wherever the magenta has bled into the subject.
#    Tune the 0.12 constant per batch and check the result by eye.
magick eroded.png \
  -channel R -fx "min(u, (u.g + u.b)/2 + 0.12)" \
  -channel B -fx "min(u, (u.r + u.g)/2 + 0.12)" +channel despilled.png

# 4. Proof against a mid grey. Any magenta or pink ring here is a failure:
#    go back to step 1 with a higher fuzz, or erode a second pixel.
magick despilled.png -background gray50 -alpha remove -alpha off proof.png

12.2 Team-colour verification — the one that will catch the most defects

ART-1135 Every asset under ART-610 MUST pass the ownership read test, which is the mechanical form of UX-440's outcome requirement. An explicit-mask asset (ART-605) MUST additionally show a mask coverage of ≥ 60 % of its opaque pixels, and its mask MUST reach the outer boundary of the silhouette on all four sides; an implicit-mask asset satisfies coverage by construction and is checked by ART-1140 instead.

# Substitute a seat pair into the stencil (implicit mask: dark value -> seat foreground,
# light value -> seat background) and reduce to the Chip tier: 16 device px @2x = 8 CSS px.
tint () {   # $1 in.png  $2 foreground  $3 background  $4 out.png
  magick "$1" -alpha on \
    -fuzz 0% -fill "$2" -opaque black \
    -fuzz 0% -fill "$3" -opaque white \
    -filter Lanczos -resize 16x16 "$4"
}
tint city_ind3.png "#B3372E" "#F2E4CE" chip_a.png     # substitute real seat pairs
tint city_ind3.png "#2E5FB3" "#E8EDF2" chip_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, ownership is not
# unmistakable from the silhouette and the mask is too small.
magick compare -metric RMSE \
  \( -size 16x16 xc:"#7E9C5E" chip_a.png -composite \) \
  \( -size 16x16 xc:"#7E9C5E" chip_b.png -composite \) null:

# Explicit-mask assets only: coverage of the opaque area, and a boundary check by eye.
magick name_mask.png -alpha off -format "coverage %[fx:round(100*mean)]%%\n" info:

Then confirm it with a person: print the asset at 8 CSS px in four seat pairs, shuffled, and ask a reader who has never seen the sheet which piece belongs to which player. The number is a screen; this is the requirement.

Rationale: UX-440 states the constraint as an outcome — ownership unmistakable from the silhouette alone at the Chip tier — and an outcome is only enforceable if somebody measures it. The old two-tone rule was self-verifying in the worst way: counting colours proved a file conformed while proving nothing about whether a player could tell whose fort it was. This test proves the thing that actually matters, and it is the test that would reject a beautifully shaded city whose only team colour is a pennant.

ART-1140 Every asset delivered under the implicit mask of ART-605 — which is every asset in the register of §13 — MUST contain exactly two opaque RGB values and one fully transparent value, and nothing else. A file that does not MUST be rejected, not corrected by quantising, because quantising a shaded sprite produces a two-value image whose shapes were never designed to work in two values. An explicit-mask asset is exempt from this requirement and is verified by ART-1135 alone.

# Canonicalise: hard alpha, hard black/white, transparent pixels forced to black.
magick in.png -channel A -threshold 50% +channel \
              -channel RGB -threshold 50% +channel \
              -background black -alpha background two_tone.png

# Verify: this MUST print exactly 3 (black, white, transparent).
magick two_tone.png -format "%k\n" info:

# If it prints more than 3, list what is in there and look at what the model added:
magick two_tone.png -format "%c" histogram:info: | sort -rn | head -12

ART-1145 A team-coloured asset MUST NOT be produced by downsampling a larger one. Downsampling interpolates, and an interpolated pixel is a pixel the mask cannot classify. Every smaller variant — fort_mid, airfield_mid, city_mid_ind1..4 — MUST be redrawn at its target size and MUST pass ART-1135 and ART-1140 independently.

Rationale: this is the single most likely way this asset set ships broken, because downsampling looks completely fine in a file browser. Under the implicit mask the packer derives the channel by thresholding the two authored values; a grey pixel between them lands on whichever side of the threshold it happens to fall on, and the edge of every shape acquires a ragged one-pixel fringe of the wrong seat colour. Under an explicit mask the same interpolation produces partial mask values, which come out as an arbitrary blend of the seat pair that changes with every seat colour — on a red player it looks like a highlight; on a blue player it looks like a defect. Redrawing at the target size is also the better art: city_mid_ind1..4 swap countable chimneys for a stepped roofline (ART-960) precisely because the Close encoding does not survive the reduction, and no resampling filter was ever going to discover that.

12.3 Value band verification

ART-1150 Every terrain decal MUST be measured composited over its own base colour, because ART-700 is a property of the finished tile and not of the decal in isolation.

# One decal over its terrain base. Prints the L* range of the composited tile.
magick -size 64x64 xc:"#7F9765" plains_decal_01.png -gravity center -composite \
       -colorspace LAB -channel R -separate \
       -format "L* min %[fx:round(100*minima)] max %[fx:round(100*maxima)]\n" info:

Accept only if min >= 44, max <= 72 (ART-690) and max - min <= 14 (ART-700). Run it over the whole decal set with the base colour taken from palette.json; a decal that fails MUST be flattened with a levels adjustment, not darkened at the base.

12.4 Seam and repetition verification

ART-1160 Every tileable texture — grain_shared.png, road_surface.png, unexplored_fill.png, memory_grain.png, polar_hatch.png — MUST pass both of these before it is committed:

# Seam check: tile it 8x8 and look along every internal boundary.
magick grain_shared.png -write mpr:t +delete -size 2048x2048 tile:mpr:t seamcheck.png

# Repetition check: the same sheet at 1:1 with a grid drawn on. If you can pick out
# the same feature twice by eye in under five seconds, the texture failed ART-780 step 8.
magick seamcheck.png -fill none -stroke red -strokewidth 1 \
       \( -size 2048x2048 xc:none -draw "line 256,0 256,2048" \) -composite grid.png

12.5 The legibility contact sheet — the review that decides everything

ART-1170 Before any terrain art is accepted, a contact sheet MUST be produced and reviewed as a whole, at 100 % and at 50 %, containing:

  1. All eleven terrains as 5 x 5 tile blocks with decals placed by the shipped hash, so repetition is visible.
  2. Each terrain with a unit sprite from docs/art/01-* composited on the centre tile, in each shipped seat colour pair, plus the neutral pair. The sprite chosen MUST be the most internally detailed one the unit set ships — one whose untinted art carries tracks, a barrel, a canopy, a rotor disc or a wake under UX-440 — because that is the sprite busy terrain damages first and the simplest counter is the case this review is least able to fail.
  3. Every terrain adjacency that occurs on the four terrainMix presets of GR-1520, with the feather of ART-810 applied.
  4. A coastline running through all three water depths (GR-1540).
  5. A river with a Ford, a Bridge, and a right-angle bend.
  6. A road network with a four-way junction, a diagonal spur and a dead end.
  7. A fortified airfield on a road (GR-430), which is the densest legal tile.
  8. Cities at Industry 1, 2, 3 and 4, in all three classes, each carrying every badge combination, and one each of Unsettled, Stalled, neutral and remembered.
  9. The whole sheet again at the Chip and Strategic flat colours.

The sheet MUST be judged on one question and not on any other: can you find the pieces? A terrain that is beautiful in its own block and swallows a unit in item 2 has failed and MUST be flattened. This review MUST happen before any decal set is expanded, because expanding a decal set that is already too contrasty multiplies the problem.

12.6 Style consistency across separate generations

ART-1180 A single style reference MUST be generated first, before any asset, and MUST be supplied as an image prompt alongside every subsequent generation in this document. It MUST be stored as style/ref_master.png and MUST NOT be shipped.

A single flat 2D illustration in the style of a printed strategic board wargame map from
the 1970s: a small square of terrain showing muted olive grassland meeting a patch of
muted forest green woodland, with a narrow pale road crossing it and a small pale stone
building beside the road, seen from directly overhead.
Restrained, desaturated, low contrast printed colour - as if printed in four flat inks on
matte paper. Everything sits in a narrow mid tone range with no black, no white, no deep
shadow and no bright highlight. Slightly grainy paper texture over the whole image.
Flat orthographic top-down view, no perspective, no cast shadow, even ambient light.
No text, no numbers, no legend, no compass rose, no scale bar, no grid lines, no border,
no frame, no vignette, no drop shadow, no glow, no 3D, no photorealism, no painterly
brushwork, no dramatic lighting. Flat 2D map illustration. 1024x1024.

Be honest about what this buys and what it does not. Feeding a style reference back as an image prompt meaningfully reduces drift in palette, contrast and mark-making across a batch. It does not eliminate it, and it does not survive a model version change, a provider change, or a gap of several weeks. The mitigations that actually work are structural rather than prompt-side, and this document has already taken all three: the base layer is procedural so it cannot drift; a single grain sheet is shared by all eleven terrains so the surface treatment is identical everywhere; and generated content is confined to small isolated decals where a two-point shift in hue is invisible. Generate all of one terrain's decals in a single batch, and if a terrain has to be regenerated later, regenerate all of its decals rather than the missing one.


13. The asset register

ART-1190 The complete shipped asset set is 121 sprite cells across four atlases. This register is normative; §13 and the register of ART-1050 together enumerate every file this document owns.

Group Files Cells Atlas Colour and tint
Terrain decals (11 types, ART-775) terrain/decals/<terrain>/*.png 73 terrain full
Shared grain grain_shared.png 1 terrain greyscale
Transition feathers feather_edge, feather_corner_out, feather_corner_in 3 terrain alpha mask
Coast foam foam_edge, foam_corner_out, foam_corner_in 3 terrain full
Road road_surface, road_junction, road_cap 3 edges full
Bridge bridge_deck 1 edges full
River river_edge_01..03, river_joint_01..02 5 edges full
Ford ford_band_01..02 2 edges full
Fort fort, fort_mid 2 structures team-coloured
Airfield airfield, airfield_mid 2 structures team-coloured
City, Close city_ind1..4 4 structures team-coloured
City, Mid city_mid_ind1..4 4 structures team-coloured
City badges badge_seat, badge_landmark, badge_bellwether, badge_stalled, badge_unsettled 5 structures team-coloured
City plinths plinth_town, plinth_city, plinth_metropolis 3 overlay full
Port quay quay 1 overlay full
Production plume plume_01..06 6 overlay full
Fog and polar unexplored_fill, memory_grain, polar_hatch 3 overlay greyscale
Total 121

Atlas totals: terrain 80, edges 11, structures 17, overlay 13.

All 17 team-coloured cells use the implicit mask of ART-605 — a fully-masked two-value stencil, no mask file, no companion atlas — as ART-615 records. The other 104 cells carry no team-colour channel at all. Adopting the explicit-mask convention for any asset adds a companion atlas and changes this register, and MUST be proposed as such rather than slipped in as a file.

Not shipped, but produced: style/ref_master.png (ART-1180), and terrain/palette.json (ART-1085), which is data rather than a sprite cell.

Production order

The order matters, because three of these steps constrain everything after them.

1.  Generate style/ref_master.png (ART-1180). Judge it hard. Everything inherits from it.
2.  Write terrain/palette.json from ART-790 and ART-1070. Re-run the ART-1070 measurement
    if you change a value; do not change a value without re-running it.
3.  Generate and heal grain_shared.png (ART-760, ART-780). One image, done once, used by
    all eleven terrains. This is what makes them look like one game.
4.  Stand up the procedural base layer (ART-750) and look at eleven flat terrains with
    grain and nothing else. Fix the palette here, before any decal exists.
5.  Generate the Woods, Mountains and Plains decal sets first - the three that carry the
    most map area and the hardest legibility cases - and run ART-1170 on those alone.
    If the method is wrong, it is wrong here, at 26 decals rather than 73.
6.  Remaining eight decal sets, one terrain per batch.
7.  Transitions and coast (ART-810, ART-830).
8.  Edges: river and ford (ART-890 to ART-920); the bridge deck (ART-865).
9.  Road (ART-850 to ART-860).
10. Team-colour pass: fort, airfield, city sets, badges. Different prompt tail, different
    atlas, different verification (ART-1135, ART-1140). Do them together, not scattered,
    and run ART-1135 on the first one finished before generating the other sixteen.
11. Fog, memory and polar (ART-1090 to ART-1110).
12. Full contact sheet (ART-1170) at every tier, with real seat colours.

Open questions

  1. @3x for high-DPR mobile. ART-635 ships @2x only and minifies. On a 3× device the Close tier is 96 device px per tile and the atlas has 64, so it magnifies. Whether that is acceptable on the mobile WebView target — which UX-400 names as the tightest of the six — or whether a @3x terrain atlas is worth the texture memory, is unresolved and needs measuring on a real device rather than arguing.

  2. Whether the Chip palette should be used at Mid under a high-contrast preference. UX-1310 requires the client to enable the colourblind-safe palettes and pattern overlays by default when a platform high-contrast preference is detected. The obvious extension is to swap the Close base palette for the wider Chip palette at Mid and Close as well, at the cost of ART-690's protection of unit legibility. That is a real trade between two accessibility requirements and it should be decided with a user, not by this document.

  3. Whether Woods | Marsh needs a mandatory pattern at Close, not just at Chip. ART-1080 patterns that pair at the Chip tier only. At Close the pair measures ΔE 6.0 under a deuteranope simulation and relies entirely on the decal shape distinction of ART-800 (reed strokes and water patches versus round crowns) to separate them. That distinction is real but it has not been tested with a colourblind player, and Marsh is the terrain where being wrong is most expensive — defence 850 and 12 MP for foot make it the worst tile in the game to mistake for cover.

  4. Whether the Road should carry an owner mark. ART-610 makes the Road ownership-blind on the argument that GR-420's contiguity rule is ownership-blind. But GR-500 makes Roads capturable and GR-1160 makes an enemy's newly-built road network a genuine intelligence discovery — "a road network laid across an enemy's rear ... is invisible until somebody goes and looks". A faint team-colour mask on the road surface would make that discovery legible at the moment it happens. It would also make every contested frontier a patchwork, and UX-440's Chip-tier test is hard to satisfy for a 1 px line, which argues that if the Road ever takes an owner it should be by a mark at the junction rather than along the stroke. Undecided.

  5. City traits (EC-450) have no owner. EC-450 requires all nine traits to be visible on the map to any player who has ever observed the city, and to persist in the knowledge view. ART-930 defers them to docs/art/03-* as a trait pip strip, but that document may reasonably consider them city art and defer them back. Someone must claim them, and nine glyphs that read at 12 CSS px alongside five badges on a 32 px tile is not obviously possible — a trait count pip with the detail on the city panel may be the only workable answer.

  6. The polar strip treatment. ART-1110 hatches it. An alternative is to darken it and drop its decals entirely, which reads more strongly as "the map ends here" but makes two of the eleven terrains look different in one place, which is its own confusion. GR-220 gives no guidance and UX-410 asks only that it be distinct.

  7. Whether the City Close set should take untinted detail. ART-615 records a deliberate art-direction choice — two values, fully masked — for all seventeen owner-coloured assets, and for sixteen of them it is not close: at 28 CSS px and below there is nothing to spend a third tone on. city_ind1..4 is the one asset where it is arguable. It renders at 32 CSS px, it is the most complex silhouette in the document, and UX-440 now explicitly permits a material break — dark stack mouths, a distinct foundry roof, a shadow under the gantry — to sit outside the mask. Against it: the city already carries up to five badges, a garrison bar, a pip track and two arcs on top of it (ART-1020), and it is the asset most likely to be looked at while three other things are drawn over it. This needs the contact sheet of ART-1170 with both versions side by side, not an argument. If it is taken, it ships under ART-605's explicit mask, adds a companion atlas, and changes the register of ART-1190.

  8. Whether the production plume earns its draw calls. ART-990 animates six frames per producing city at the Close tier. On a Vast map with 400 cities (GR-1530's clamp) most are off-screen and culled, but a late-game empire with fifty visible cities is fifty animated overlays against UX-400's fixed budget on the tightest target. The signal it carries — "this city is producing" — is also carried by the absence of two badges, so the plume may be pure decoration that a low-end preset should drop first.


Built from source 7f764a6c1ff9 · VERSION.json