fertig-classic-games/src/games/advancewars/sprites.md

6.4 KiB
Raw Blame History

Advance Wars — spritesheet spec

Art is split into five independent sheets, one per category, so each can be painted and dropped in separately. Until a sheet is painted, the game renders a procedural stand-in with the exact same frame map — everything is fully playable art-free, and you can drop in one sheet at a time.

Rivers and roads need NO art on the map itself: they are drawn in code (Graphics) from tile connection masks, so there are no variant frames to paint for the terrain sheet. Shoreline foam where sea meets land is also drawn in code. This exemption does not extend to the battle background sheet (§5) — that one needs a full backdrop scene for every occupiable terrain, river/road/bridge included, since it's a standalone illustration rather than a tileable ground texture.

Drop-in procedure (no code changes)

  1. Paint a sheet per the specs below.
  2. Save it under assets/images/advancewars/ (suggested names below).
  3. In data/advancewars-artwork.json, set that sheet's path.
  4. Reload. Sheets left path: null keep their procedural stand-in.

Keep source PSDs next to the PNGs. Frames are append-only — never renumber. Frame indices are pinned in data/advancewars-rules.json (terrains[].frame, units[].frame) and in UI_FRAMES in AdvanceWarsMapView.js.

Tinting rules (important!)

The building sheet and the unit sheet are painted neutral and tintable: light gray / near-white bodies (#e0e0e0-ish) with dark outlines. The engine applies each army's color with a multiply tint at runtime (orange / blue / yellow / green + gray for neutral buildings), and flips unit art horizontally for enemy armies — so paint every unit facing RIGHT. Avoid saturated colors on anything tinted; details that must stay colored (glass, smoke, tires) should be dark.

The terrain and UI sheets are painted in full color — no tinting.


1. Terrain sheet — advancewars-terrain.png

48×48 cells, 8 columns × 1 row = 384×48 px. Full color, opaque tiles.

frame content
0 Plain (grass)
1 Wood (trees — hides units in fog)
2 Mountain
3 Sea
4 Reef (rocky shallows on sea)
5 Shoal (beach/sand transition)
6 Bridge, horizontal (paint the water background into the tile)
7 Bridge, vertical (ditto)

Everything is a flat 48×48 tile — no headroom on this sheet. Rivers, roads and coastlines are code-drawn; do not paint them.

2. Building sheet — advancewars-buildings.png

48×64 cells, 5 frames in 1 row (suggest 6 columns = 288×64 px, last cell spare). Bottom 48×48 is the tile footprint; the top 16 px is headroom for roofs and flags. Bottom-aligned, transparent background (the ground tile shows through), neutral + tintable.

frame content
0 City
1 Base (land factory)
2 Airport
3 Port
4 HQ (make it grand — flag, use the headroom)

3. Unit sheet — advancewars-units.png

48×64 cells, 12 columns × 3 rows = 576×192 px. Bottom-aligned in the 48×48 footprint with 16 px headroom for heads/rotors/masts. Transparent background, neutral + tintable, facing RIGHT.

Each unit gets exactly two frames: [idle A, idle B] — a subtle 2-frame cycle (bob, tread shift, rotor spin). Frames are base and base+1, laid out row-major:

base unit base unit
0 Infantry 18 Missiles
2 Mech 20 Fighter
4 Recon 22 Bomber
6 Tank 24 B-Copter
8 Md Tank 26 T-Copter
10 APC 28 Battleship
12 Artillery 30 Cruiser
14 Rockets 32 Lander
16 Anti-Air 34 Sub

4. UI sheet — advancewars-ui.png

48×48 cells, 7 frames in 1 row (suggest 8 columns = 384×48 px, last cell spare). Full color, transparent background.

frame content
0 tile cursor (corner brackets, white)
1 explosion, small
2 explosion, big
3 capture flag icon
4 low-fuel icon (lightning bolt)
5 low-ammo icon (bullet)
6 CO power star

Icons 3–6 render at roughly 40% tile size as unit badges; keep them bold and readable when small.

5. Battle background sheet — advancewars-battlebg.png

256×256 cells, 5 columns × 3 rows = 1280×768 px (14 frames used, last cell spare). Full color, full-bleed illustration — no transparency needed, these fill the entire backdrop behind each fighter in the battle cut-in window (AdvanceWarsBattleAnim.js). Landscape/scene paintings, not tile icons: think "diorama behind the two combatants," not "48×48 ground swatch."

One frame per terrain type a unit can actually stand on, plus one per building type. A property tile's own terrain id (city/base/airport/port/hq) is its building type — there's no separate "terrain underneath the building" to paint over, since a tile only ever has one terrain value at a time. So each frame below is a straight lookup, not a layered composite.

frame content
0 Plain (grass field)
1 Wood (forest clearing)
2 Mountain
3 Sea (open water)
4 Reef (rocky shallows)
5 Shoal (beach)
6 River
7 Bridge — used for both horizontal and vertical bridge tiles; orientation doesn't matter for a static backdrop, so this one frame covers both bridgeh and bridgev
8 Road
9 City
10 Base (land factory)
11 Airport
12 Port
13 HQ

Each fighter's backdrop is picked by looking up the terrain tile they're actually standing on when the battle happens (from the engine's battle event coordinates) — so, e.g., a tank parked on a captured city shows the City background, not Plain, even though a tank could also be fought on open grass elsewhere. The defender's backdrop is horizontally mirrored (matching the mirrored defender unit sprite) — avoid art with strong left/right asymmetry (e.g. a building silhouette that visibly leans one way) unless you're fine with it flipping on the right-hand side.

Unlike the other four sheets, this one is painted in full color and is not tinted — buildings here don't need to react to owner army color the way the small map-icon building sheet does.

Also paint frame 86 of assets/images/game-icons.png (44×44, row 5 col 11 of that 15-per-row sheet). Suggested motif: a small orange tank on a green tile, AW box-art style.