Hop to the Top: Bunny's Revenge and IFF ILBM files

October 30, 2023

RobSmithDev released Hop to the Top: Bunny’s Revenge and posted a video about some of the production process. I did some of the graphics for the game, as well as writing the code for the intro. For the graphics, I ended up writing some custom code to automate some of the process, and it was an opportunity to learn about a popular Amiga image format.

My typical process for making art for retro systems is:

  • draw the piece in Krita and export as true color PNG
  • use GNU Image Manipulation Program to convert it to an indexed PNG, cleaning up the pixel art as needed in GIMP
  • use some tool somewhere to turn the indexed PNG into a retro machine friendly format

In the case of the Amiga, I’ve used ArtPRO on the Amiga in the past to convert PNG images to whatever format I needed. With all the art I was making, and potentially remaking, I needed a faster process. ArtPRO is good, but clicking buttons on retro machine software to convert images was going to be too slow.

I was also running into an issue with GIMP not preserving the index order of the color map I had created for the game. I think I had Remove Unused and Duplicate Colors from Colormap enabled which was messing up the color indexes, so be sure to disable that if you’re using a similar process.

Due to this, the resulting color map on the output images was all over the place, so I needed to fix that issue.

I had two approaches I could take:

  • automate the production of a sprite sheet encompassing all of the individual pieces of art and convert it once, fixing the palette issue.
  • convert each piece separately and load them as separate images, finding some other way to speed up the conversion & palette fix.

I chose the latter since I preferred separate image banks to start, over hard-wiring in sprite sheet locations, during initial development.

I decided to write a tool in Ruby that converts indexed color PNG images directly to IFF Interleaved Bitmap (ILBM) files, enforcing the order of the palette. It uses RMagick to load the image, and then implements IFF ILBM writer code to create the Amiga-ready files. It even supports run length encoding compression.

Here’s the source code. It drew heavily from the IFF ILBM reference found here, as well as from a lot of examining IFF ILBM files in hex editors. It only supports images up to 32 colors, so no Extra Half Brite or HAM images. If you end up using it, let me know!