First, I needed to figure out a level format. The NES native background tiles are 8x8. But levels stored at that resolution end up being huge in ROM space, so most people use something else. Sometimes some sort of compression (gzip? run length encoding?) but that works best with games that either only scroll one direction, or that have a big ram buffer on the cartridge to decompress the data into. The cheap cartridge mapper/board I'm planning to use, GT-ROM (which has some awesome features) doesn't have extra ram. So that's out. Instead, I'm going to try doing 32x32 pixel metatiles. Where each "tile" of my level data represents 4x4 hardware tiles. The convenient thing about this is that the NES tracks palette data for backgrounds in 32x32 chunks, so this will simplify that calculation.
So first, I had to build the system for defining and accessing metatiles. And figure out tooling for having a UI to work with them. Luckily a guy on the nesdev forums made a cool editor that does just that. I don't particularly like the level editor piece of that tool, but it's perfect for a metatile editor, and it can spit out the definition in JSON format, which made it really easy to write a python script that gets run as part of my build process to transform the JSON format into the necessary source code data format.
Then, for actual level editing, I decided to stick with Tiled, which I used with Robo-Ninja, and is super flexible. It can save levels in a nice textual format, so again, I wrote a python script to be run as part of the build process to convert these levels into the format the game needs.
Next up was drawing a level to the screen, and then scrolling. It's late and the baby finally fell asleep, so I'll talk about that later. Until then, here's an ugly picture of my test level data. Frankengraphics gave me some beautiful background tiles to work with, and I turned them into a horrible ugly mess for now. But at least it's starting to look something like a game....