We’ve got a blank window with correct palette, so what’s the next step? Backgrounds!
It’s not as simple as a plain background, like a single image. Or even a single layer of tiles! no, this is a multilayer system. The first step is converting the output of the room-dumper script into something that’s easy to load with C++ code.
-50: x=90, y=38: 0, 0:bg_tiles1 -50: x=90, y=39: 1,16:bg_tiles1 8999: x=50, y=32: 2,20:bg_tiles1 8999: x=50, y=33: 6,20:bg_tiles1
This means “layer at priority -50, coordinates 90,38, draw tile at 0,0 from the bg_tiles1 set”. But thankfully the background tiles are all the same size (16×16 pixels), so we don’t have to encode that.
The scheme I ended up using, for tiles:
a 16bit integer, with the first 4 bits indicating which of the 5 tilesets are used. The next 4 bits indicate the x-coordinate (The tilesheets are 8-12 tiles across), and the next 8 are used for the y-coordinate. Naturally these are tile coordinates (so they’re interpreted as times 16) instead of pixel coordinates.
Then those raw blocks are grouped into rectangles, which have a width/height and an x&y offset. This will be more efficient than having all the layers be the same size, as most layers will only encompass a small subset of the map, and we don’t want to waste time processing empty tiles. We just need to sort the layers so that they render
So here’s a display of level 1-1, with the layers outlined:
It’s as simple as that! we go through the layers, blitting out of the selected tiles to the screen (eventually backbuffer).
The only problem so far is that those colors are completely and totally wrong. And some layers seem to be missing. More investigation is needed!
Leave a Reply