Steering code-generated pixel art toward a target style (Diablo II and Witchbrook as the two targets)

Scope note: Dead Cells’ 3D-to-pixel pipeline, PixelLab and Retro Diffusion features, and runtime SDF sprites are already covered in the sibling notes (sprites_characters_items.md, animation.md, styles_resolution_perspective.md). This file cites them briefly and spends its budget on the two targets, on example-based and statistical methods, on what an agent needs as input, and on IP. Sources fetched in this session are marked as fetched. Claims that come only from search-result summaries are marked “(snippet)”.

On the user’s premise (“code can put any pixel anywhere, so anything can be generated”): a 320x180 frame in 8 inks has 8^57,600 possible states, so the premise is true in principle. In practice the whole problem is specifying and checking which tiny corner of that space is “Diablo II” or “Witchbrook”. Every method below is a way to supply that specification: as geometry plus a renderer (3D, then quantize), as examples (synthesis), as numbers (statistics), as a learned prior (diffusion), or as a human’s judgment (critique loops). This framing is inference, not a cited claim.


1. Diablo II’s art pipeline (pre-rendered 3D, directions, palettes, colormaps, composite layers, lighting, tiles, the gothic look)

Takeaway

Diablo II is the textbook “model in 3D, render many angles, quantize to one 8-bit palette, recolor and light by lookup table” pipeline. 3D Studio Max rendered characters at 8 angles (monsters) or 16 (players), with armor rendered as separate parts and layered at runtime. Backgrounds were rendered rooms, lit from one fixed direction and cut into 160x80 isometric tiles. All lighting, transparency and monster recolors are 256-entry index remap tables applied to one 256-color palette per act. Almost every piece of this maps directly onto an indexed-color engine like Tycho/Ink.

Cited Findings

Primary source: Erich Schaefer’s postmortem (Game Developer, October 2000; fetched)

Artist recollections (Shacknews oral history; fetched)

Palettes and lookup tables (modding docs)

Composite sprites (DCC/DC6/COF)

Tiles, walls, light radius

Diablo II: Resurrected (old versus new)

Inferences

Gaps


2. Witchbrook’s art style (resolution, perspective, palette, lighting, proportions, Chucklefish statements)

Takeaway

Witchbrook is not 3/4 top-down any more: Chucklefish switched it to an isometric view in April 2020. It is hand-painted 2D pixel art (characters included) at small sprite sizes (about 40 px tall per its senior artist), animated in 8 directions (5 drawn, 3 mirrored), with layered recolorable clothing, and modern shaders, lighting and camera moves on top. Chucklefish has said nothing public about its internal resolution or palette. The release date is January 28, 2027.

Cited Findings

Inferences

Gaps


3. Generic methods for reaching a target style from code

Takeaway

There are five levers, and they combine: (a) render from geometry and quantize (the D2 and Dead Cells route: best for volume, rotation and many directions); (b) synthesize from examples (WFC overlapping model, Efros-Leung, quilting: best for textures, tiles and terrain that must “look like” a reference); (c) measure the reference and turn the numbers into constraints and tests (cheap, deterministic, and what makes the other levers checkable); (d) diffusion models with palette constraints (the fastest route to a plausible sprite offline, but they need cleanup and raise licensing questions); (e) a human-curated style bible plus screenshot critique loops (what actually closes the gap).

Cited Findings

(a) Pre-rendered 3D, then quantize

(b) Example-based synthesis

(c) Statistical style analysis (sources for the rules being measured)

(d) AI image models

Copyright and IP (plainly)

(e) Human-in-the-loop

Inferences

Gaps


4. What an AI coding agent needs as input to hit a style

Takeaway

An agent can render and check anything it can measure, so the input that matters most is checkable specification: exact palettes in hex grouped as ramps, exact pixel sizes, one light direction, explicit outline rules, a few hand-made anchor sprites at final size, and a numeric acceptance test that compares statistics of its output to the anchors. Reference images it can view help with intent, but cannot by themselves stop drift.

Cited Findings

Inferences

A proposed “style pack” per target, kept in the repo beside the world (a sketch for the Tycho roadmap):

  1. palette: hex values grouped into named ramps, dark to light, with each ramp’s role (skin, foliage, stone, light, shadow). For Elsewhere, 8 inks per frame; for a D2-like world, a darker, browner sheet; for a Witchbrook-like world, warm mid-values with hue-shifted shadows toward violet. Write your own values; do not copy extracted game palettes into a shipped game.
  2. scale: frame size (320x180), tile size (e.g., 32x16 for a 2:1 grid; D2 used 160x80 at 640x480), character height (D2 about 75 px at 640x480, roughly 37 px at 320x180; Witchbrook about 40 px), head-to-body ratio, directions (8 = 5 drawn plus 3 mirrored).
  3. light: one direction vector (e.g., from upper left), number of light levels in the light table, light radius rule, time-of-day tints as index remaps.
  4. line: outline on or off, color rule (black, darkest ramp color, or selective), weight (1 px), interior lines allowed or not, convex-edge highlights or not.
  5. anchors: 3 to 10 hand-made (or hand-finished) sprites and tiles at final size, as Ink index data and as PNGs the agent can view. These are what WFC and the pattern-overlap metric learn from, and what the agent imitates.
  6. board: reference screenshots for mood only, viewable by the agent, kept out of the shipped build and out of any training set.
  7. accept: thresholds on the section 3 metrics (e.g., orphan ratio below the anchors’ value plus a margin; all colors within the sheet; light vector within 20 degrees of spec; local pattern overlap above some fraction; sprite height exact), plus a golden screenshot the human signs off.
  8. The loop: generate, render a contact sheet (all directions, all variants, on the real ground), compute the metrics, view the sheet, critique against the anchors in words, change the generator, repeat; commit only when the metrics pass and a human approves. The agent should research by reading (postmortems, modding docs, artist tutorials) and by measuring references, then write its findings into the style pack so later sessions inherit them.

Gaps


5. What is still hard: anatomy and animation of complex characters, faces at low resolution, perspective consistency

Takeaway

Hard cases are the ones where correctness is global and semantic, not local: a body must stay the same body across 8 directions and many frames, a face of a few pixels must read as an expression, and every object must agree on one projection and one light. Local statistics (WFC, palettes, cluster rules) cannot see those. Every production example solves them with structure the generator owns: a 3D model or skeleton (D2, Dead Cells), drawn masks and layers with mirroring (Witchbrook), or a human drawing the hard frames.

Cited Findings

Inferences

Gaps