technique

Adapting purchased packs

How to audit a bought asset pack, make it match your game's pixel size, palette, light, and outline rules, extend it in its own style, and keep the license paperwork straight.

Before this

This page assumes you are comfortable with:

Why you need this

Most small games do not start from a blank canvas. They start from a library of purchased packs; in the running example, side-scroller packs (layered backgrounds plus platform tiles and decor) and top-down tilesets (ground, forest, town, dungeon, some with seasonal palette variants), bought from several authors over time. None of them agree on pixel size, palette, or light, and putting two of them on one screen without work is the fastest way to make a game look cheap. This page is stage 5 of the pipeline, ship it: bringing bought art under the rules your game wrote down in stage 1.

The idea

Audit first

Before changing anything, record what each pack is. One row per pack, filled in by opening the files and looking, not by reading the store page:

Field How to measure it Example value
pixel size height of a standing character, or the smallest repeated detail 16
tile size grid spacing of the tile sheet 16
view side, top-down, three-quarter, isometric top-down
light direction which side of every cube and character is lightest upper left
palette sample every color, group by material into ramps 34 colors, 7 ramps
outline style none, black, one dark color, or selective (sel-out) sel-out
animation frame counts per action, ms per frame if given walk 6, idle 2
layers for backgrounds, how many and their intended ratios 4, ratios given
license the license file's name and where it lives a text file in the zip

To sample the palette, open a sheet in an editor that lists the colors in use, or count unique values with a script. A ramp is an ordered run of colors from dark to light for one material; group the sampled colors by which material they shade. Two packs from one author often share exact hex values. Two from different authors almost never do.

An audit of two packs from the example library might read: pack A, a side-scroller forest set, 32-pixel, side view, upper-left light, 28 colors in 6 ramps, black outlines, backgrounds in 4 layers; pack B, a top-down ground set, 16-pixel, upper-left light, 34 colors in 7 ramps, sel-out, no animation. The audit already says these two cannot share a screen: 32 against 16 is a redraw, not a recolor.

Problem one: mixed pixel sizes

A pixel size is the size of the smallest mark the artist meant as one unit. When a 32-pixel pack and a 16-pixel pack share a screen, one character has twice the detail of another standing beside it, and the eye reads the difference as two games. Never fix this by scaling the 32 down to 16: each new pixel averages four old ones, outlines turn to gray mush, and every one-pixel detail vanishes. Scaling 16 up to 32 with nearest-neighbor gives clean 2x2 blocks, but blocks next to real 32-pixel detail read as "big pixel" art in a "small pixel" game.

The fixes are: pick one pixel size per screen (backgrounds may cheat, see below), or redraw the smaller set of assets at the other size. Redrawing is a full remake, which is why the audit comes first.

Problem two: mixed palettes

Two packs lit the same way and drawn at the same size still clash if their greens are different greens. The fix is to recolor one pack onto the other's ramps: for each foreign color, find the target ramp for the same material and map the color to the step whose value (brightness) is nearest. Value, not hue, because value is what carries form (see Palettes and ramps). A quick value is 0.299R+0.587G+0.114B0.299 R + 0.587 G + 0.114 B on the 0 to 255 channels.

A four-color foreign grass ramp mapped onto a five-step target grass ramp:

Foreign color Value Nearest target step Target value
#4a6b1e 88 #2f7a3a 92
#6f9a2b 129 #58a84c 134
#9cc43c 169 #8fcf66 176
#cfe86a 210 #c6ea90 213

Target ramp, dark to light: #1e4a24 #2f7a3a #58a84c #8fcf66 #c6ea90. The darkest target step went unused; that is normal, and it is where the pack's outline pixels go if it has any. The failure case is two foreign colors landing on the same target step, which erases a shading step. When that happens, push one of them to the next step over, or accept the flatter result if the pack is a background.

With indexed color the recolor is a palette swap: replace the four entries and every sheet in the pack updates. With true-color PNGs it is a find-and-replace per color, still minutes per sheet.

Problem three: mixed light or outline styles

Light direction is the most common mismatch and the one people miss in the audit. A pack lit from the upper right puts its highlights on the wrong side of every cube, tree, and character when placed beside upper-left-lit art. For symmetric tiles the fix can be a horizontal flip. For characters and anything with a direction it is repainting the faces: swap the light face's ramp step for the dark face's and back.

Outline style is next. A black outline wraps the sprite in one dark color. Selective outlining (sel-out) draws the outline in a darker step of whichever ramp is adjacent, so it is dark green along grass and dark brown along dirt, and lightens on the side that faces the light. Side by side, black-outlined sprites look heavier and sit on the scene, while sel-out sprites sit in it.

Converting a black outline to sel-out, on the top-left corner of a grass-colored sprite:

. . k k k .   . . e e e .
. k g g g k   . e g g g x
k g l g g k   e g l g g x
k g g g g k   e g g g g x

. transparent, k black #000000, g grass #4c8a3a, l light grass #74b64a, e dark grass #2e5c2a, x deepest grass #1a3a18. Left: the pack's black outline. Right: the same pixels with the outline moved into the grass ramp, dark grass where it faces the upper-left light and the deepest step where it faces away.

Extending a pack in its own style

Sooner or later a pack lacks a tile you need: the grass-to-stone edge when it ships grass-to-dirt, or a fourth walk frame. Do not draw it in your style; draw it in the pack's. Copy three things from the audit: its ramp for that material, its outline rule, and its tile size. Then use the pack's own base tiles as the template, exactly as in Tileable textures and tilesets: bands copied from the two bases, and a boundary drawn with the pack's rim color and the same wobble as its existing edges.

Suppose the audit found the pack's grass base and stone base (8-pixel grids here) and that its grass-to-dirt edges use a rim on the fourth row with a one-pixel wobble above it. A new grass-to-stone top edge:

# # # # # # # #
# = # # # # # =
# # e # # # e #
e e e e e e e e
g g g g g g g g
g g l g g g g g
g g g g g d g g
g g g g g g g g

# stone #7c7a86 and = stone crack #4e4c5a, copied from the pack's stone base; e grass rim #2e5c2a, g grass #4c8a3a, l light grass #74b64a, d dark grass #2e5c2a, copied from its grass base. Rows 0 and 1 are the pack's stone, rows 4 to 7 are its grass, and rows 2 and 3 are the only new pixels, drawn by the rim rule read off the pack's dirt edges.

Judge the new tile with the pack's own tiles beside it, never alone. A tile that matches its neighbors is in style by definition.

Mixing packs from one author or family

Packs from the same author, or sold as one family, often share a palette to the hex value along with the same outline rule and light. Check anyway: sample both palettes and compare. If they match, the packs mix for free. If they mostly match, the recolor table has only a few rows.

Backgrounds from one pack, tiles from another

Backgrounds are the exception to the one-pixel-size rule, within reason. A background from a 32-pixel side-scroller pack can sit behind 16-pixel tiles if it is pushed back: mix its colors toward the sky color and lower its contrast, as Backgrounds and parallax describes for atmospheric perspective. A background with less contrast and less detail than the play layer reads as far away, and far away is where a different pixel size is forgiven. What does not work is a background with crisper detail than the tiles in front of it.

License bookkeeping

Every pack ships a license file. Keep it next to the exported subset of that pack in your repository, so a file's terms travel with the file. In the audit's license column, record the answers to three questions: may you modify the art, may you redistribute the modified art inside a game, and may you resell the pack itself. Many game asset licenses answer yes, yes, and no, but read each one; some forbid using the art in an asset that is itself sold, some require attribution in a credits screen, and some limit the number of projects. Do not rely on memory, and do not take any page, this one included, as a statement of a particular pack's terms.

The decision table

Finding in the audit Decision Cost
same pixel size, same or shared palette, same light, same outline reuse as-is none
same pixel size and light, different palette recolor onto target ramps minutes per sheet
same pixel size, different light or outline repaint faces or outlines hours per sheet
different pixel size, asset is a background push back, then reuse minutes
different pixel size, asset is a tile or sprite redraw at the target size, or drop a full remake
license forbids modification or use in a game drop none

Worked example

Take two top-down tilesets from the example library, both 16-pixel, both upper-left lit: a ground set with sel-out, and a dungeon set with black outlines and its own palette. The audit says same size, same light, different palette, different outline. The table says recolor, then repaint outlines.

  1. Sample the dungeon set's palette: say 26 colors in 5 ramps (stone, wood, metal, fire, cloth). The ground set already has stone and wood ramps; metal, fire, and cloth are new and can be adopted as-is, since nothing in the ground set competes with them.
  2. Build two mapping tables like the grass one above: dungeon stone onto ground stone (five foreign colors onto a six-step target) and dungeon wood onto ground wood (four onto four).
  3. Apply the palette swap. Two stone colors land on the same target step; push the lighter one up a step and check a wall tile at 3x.
  4. Replace every #000000 outline pixel with a step of the adjacent ramp: the dark step where it faces the upper-left light, the deepest step where it faces away, the same rule the ground set uses.
  5. Place a dungeon doorway tile next to a ground grass tile and look at 3x. If the doorway looks pasted on, the mismatch is almost always the outline rule, so recheck step 4.

Nothing was redrawn. Two mapping tables and one outline pass, and the packs share a screen.

In a game's art pipeline

This is stage 5, and it is the stage that catches stage 1 shortcuts. A game that wrote down its pixel size, palette, view, light, and outline rule can audit a pack quickly and knows before buying whether it fits. Recoloring reaches back to Palettes and ramps, extending a tileset reaches back to Tileable textures and tilesets, checking frame counts reaches back to Sprite animation, and the export of the adapted subset is Sprite sheets and export. The map cluster's generators read adapted tilesets exactly as they read hand-drawn ones, as long as the sheet layout is the one they expect.

Common mistakes

  • Two characters on screen, one twice as detailed. Mixed pixel sizes. Pick one per screen or redraw.
  • Blurry, gray-edged sprites. Someone scaled a 32-pixel pack down to 16. Throw the scaled files away and go back to the audit.
  • The bought tiles look pasted onto the scene. Outline mismatch, usually black outlines next to sel-out. Repaint the outlines.
  • Highlights on the wrong side of some props. A pack lit from the upper right. Flip symmetric tiles, repaint the rest.
  • A recolored pack looks flat. Two foreign ramp steps collapsed onto one target step. Redo the table with one pushed up.
  • A license surprise at release. The license file was not kept with the assets and nobody recorded whether modification was allowed. Keep the file next to the export and fill in the audit column.

Cost

Recoloring is minutes per sheet with indexed color, and most of that is building the mapping table once per pack pair. Repainting faces or outlines is hours per sheet, since every sprite is touched by hand but nothing is redesigned. Redrawing to change pixel size is a full remake, every tile and every animation frame, at the cost of drawing the pack from scratch, and the purchase bought you a reference. Audit first, so you never do the third by accident; the audit is a table with one row per pack, the cheapest artifact in the pipeline. File size is unaffected: an adapted 16-pixel sheet is the same size as the original.

Going further

  • Palettes and ramps, for building the target palette the recolor maps onto.
  • Tileable textures and tilesets, for the base-then-edges order when extending a set.
  • Sprite sheets and export, for exporting the adapted subset with the pack's frame layout preserved.

Back to Pixel art for games