NES Sprite Tools
March 18, 2004
Note:
The Windows versions of these tools require the cygwin1.dll file. This file is available from Bob Rost's NES development resources page.
Included tools (and author):
bmp2chr
Bob Rost
bmp2level
Bob Rost
bmp2palette
Bob Rost
bmp2sprite
Bob Rost
bmp2table
Bob Rost
bmpmerge
Bob Rost
chr2bmp
Bob Rost
sprites2chrsprite
Joey Echeverria
General Usage:
These tools convert between various kinds of bitmaps images and other data formats useful in creating games for the NES. Due to the BMP image loader used in these tools, any BMP image used must be 24-bit uncompressed color. This is the standard Windows bitmap output by applications such as Photoshop. The tools themselves may impose further restrictions on size and number of colors allowed in the images. All of these tools are command line applications. If you do not understand how to use them, consult appropriate documentation for using a command line in your computer's operating system.
Source Code:
These tools are released with source code into the public domain. They come with no warranty. Each of the included tools makes use of the BMPImage class, written for public domain by Bob Rost. They have been tested under Mac OSX and should work without modification on most popular operating systems. Under standard C++ development environments, you should be able to compile all of the tools with the Makefile.
bmp2chr:
This command line application converts a BMP image file into a NES CHR file. The input image size must be 128x128 pixels, and it may contain only the following colors:
Black
000000
becomes sub-palette color 0
White
FFFFFF
becomes sub-palette color 1
Red
FF0000
becomes sub-palette color 2
Blue
0000FF
becomes sub-palette color 3
Usage: bmp2chr input.bmp output.chr
bmp2level:
This tool allows you to input bitmaps with information about your desired level, which can then be automatically converted into usable level data to draw and use the level in a game. The levels currently supported by the tool may be one or two screens wide.
Usage: bmp2level map.bmp pattern.bmp palette.bmp collision.bmp special.bmp output.dat
map.bmp
A full-color screenshot of what your level should look like. The tool supports one or two screens at a time, which means that your image should be either 256x240 pixels, or 512x240 pixels. The tool relies on 16x16 pixel major blocks to create the map, so your map data should consist of sections of that size from your pattern table.
pattern.bmp
A standard 4-color pattern table, as created by bmp2pattern or chr2bmp, or required for bmp2chr. The image should be 128x128 pixels. Colors 0, 1, 2, and 3 map to black, white, red, and blue.
palette.bmp
An image 16 pixels wide. Pixels 0, 4, 8, and 12 must all be the same color, to conform with standard Nintendo color palettes. Only the first row of 16 pixels will be used in order to load the palette.
collision.bmp
An image the same size as your map data. It should consist of 16x16 pixel squares of solid color. Black squares indicate no collision at that point, and white squares indicate collision, meaning that game characters are expected to be able to stand on the square and not go through it.
special.bmp
An image the same size as your map data. Like the collision image, it should consist of 16x16 pixel squares of solid color. The color indicates that a special object of a particular type exists at that location. Each type is simply a number, which should be interpreted by your program. The colors map to type numbers as shown below.
black
000000
no data
white
ffffff
1
red
ff0000
2
blue
0000ff
3
green
00ff00
4
yellow
ffff00
5
magenta
ff00ff
6
cyan
00ffff
7
output.dat
The output data file for your level. You may include this file directly in your rom to use in your game. The binary format is as follows:
1024 or 2048 bytes
Name and Attribute table data to draw the level. If the level is on screen wide, then the 1024 bytes may be copied directly to PPU memory at a nametable starting address, such as $2000, in order to load the nametable and attribute table correctly. If your level is two screens wide, then the first 1024 bytes will be the lefthand screen, and the next 1024 bytes will be the righthand screen.
256 or 512 bytes
Collision data corresponding to the level. Data is 256 bytes for a one-screen level, or 512 bytes for a two-screen level. Each byte represents a single major block from the collision map, and its value is 0 for passable blocks and 1 for solid blocks. Blocks are addressed in row order from far left to the far right of the map, from top to bottom.
3n +1 bytes
for n special items
Each 3 bytes represents a single special item. The first byte is the item type, the second byte is the x coordinate, and the third byte is the y coordinate. Coordinates are in major blocks from the upper left of the map, right and downward. The list is null-terminated by a single zero.
bmp2palette:
Usage: bmp2palette flag palette.bmp output.dat
flag
optional
You may optionally specify which system palette to use for designating colors. The available palettes are by Chris Covell, Loopy, and Matthew Conte. If no flag is specified, then Chris Covell's palette is used by default. The flags for each palette are as follows:
-covell
-loopy
-conte
palette.bmp
This image should by 16 pixels wide, and either 1 or 2 pixels tall. It may consist of any colors you wish, to be matched to the NES palette. However, every fourth pixel (starting with the upper left pixel) must be the same color, to conform to NES system restrictions.
output.dat
optional
If you wish, you may specify an output filename. This file will be binary data, 16 or 32 bytes, where each byte is the NES system color of the corresponding pixel, as read in standard row order. If you do not specify an output file, then the colors will output to the console as an nbasic data statement.
bmp2sprite:
This tool converts a BMP image file to a NES-style tile layout version. The program does not check for color restrictions.
Usage: bmp2sprite input.bmp output.bmp
input.bmp
An image file that is a multiple of 8x16 pixels.
output.bmp
The output file. It will be a horizontal arrangement of the input file, 8 pixels tall. The 8x8 pixel tiles will be read column order from the input and laid into the output as encountered.
bmp2table:
This tool converts a pattern table to a 4-color NES compatible pattern table, based on the provided palette. The user will be alerted of ambiguous palette matches, and it is the user's responsibility to resolve them manually.
Usage: bmp2table input.bmp palette.bmp output.bmp
input.bmp
A 128x128 pixel image in full color.
palette.bmp
An image containing multiple sub palettes, to which the full color image will be matched. The image may contain any number of sub palettes, each one 4x1 pixels. The palette image may be any multiple of 4x1 pixels.
output.bmp
A 128x128 pixel image in NES 4 color, consisting of black, white, red, and blue. This image may be fed to bmp2chr.
bmpmerge:
This tool merges two bitmaps. It compares 8x8 tiles. For each tile which is blank (solid color) in one of the input tiles and non-blank in the other, the output file will contain the non-blank tile.
Usage: bmp2table input1.bmp input2.bmp output.bmp
input1.bmp
A 128x128 pixel image.
input2.bmp
A 128x128 pixel image.
output.bmp
A 128x128 pixel image, created as a result of merging the two input pictures.
chr2bmp:
This command line application converts a NES CHR file to a BMP image. The input file must be a single-bank CHR ROM (4096 bytes), or else only the first bank will be used. The output image will be a conversion into 4-color space from the NES sub-palette entries, with a size of 128x128 pixels. Palette color 0 becomes black, 1 becomes white, 2 becomes red, and 3 becomes blue.
Usage: chr2bmp input.chr output.bmp
input.chr
output.bmp
sprites2chrsprite:
Takes a number of input bitmaps and arranges them, in the order provided, into an output pattern table. It does not attempt to alter any colors.
Usage: sprites2chrsprite input1.bmp [input2.bmp [...]] output.bmp
input1.bmp
An image 8 pixels tall, and a multiple of 8 pixels wide.
input2-n.bmp
Optional input images, also 8 pixels tall and a multiple of 8 pixels wide.
output.bmp
A 128x128 pixel pattern table. It will have the same colors as the input files. The input bitmap images will be concatenated row order into the pattern table, in rows of 16 tiles.
|