It's a demake of Super Smash Bros. for the NES. The character roster is all Smash Bros characters who had NES games:
- Mario, as seen in Super Mario Bros. 3
Green MarioLuigi, as seen in Super Mario Bros. 3
- Peach, as seen in Super Mario Bros. 2
- Kirby, as seen in Kirby's Adventure
- Link, as seen in Zelda II, Link's Awakening
- Samus, as seen in Metroid
- Mega Man, as seen in Mega Man 1-6
- Marth, as seen in Fire Emblem: Ankoku Ryuu to Hikari no Tsurugi
I want to stay true to the style of the original games as much as possible. However, Samus and Marth were designed for pure black backgrounds, so I had to modify their sprites quite a bit. Working around the NES limitations, I came up with this scheme:
The palettes are allocated like this:
- Palette 0: Player 1 colors
- Palette 1: Player 2 colors
- Palette 2: Player 1 accent color, Player 2 accent color, white
- Palette 3: Black, item accent color, white
The MMC3 can bankswitch 4 separate banks of the sprite tileset. Each player gets one, the interface elements get one, and the current item gets one. The stage can also bankswitch its halves to have animated backgrounds.
There are a lot of graphics that need to go into the game. I manually created metasprites for all of Peach's frames with a tool I created, but that's a difficult process. I draw the characters in a graphics program, so I need to separate each frame into sprites, eliminate duplicates, define the position and attributes of each sprite, etc.
I have automated a few things: every image I want to convert to NES format has an extra row along the top for palette information. The first 4 pixels define a palette. I automatically map the RGB color to the nearest NES color in a LAB color space.
I use Aseprite to create the animations. This lets me use layers and assign tags to frames. Aseprite converts the .ase file into a sprite sheet png and JSON file with information about each frame, layer, and tag. Certain names are special: the layer name "Accent" will have the accent palette, for example, and the frame tag "Common" can contain projectiles which should appear in each of the player's banks.
I'm working on turning that information into metasprites and image data. Each frame can have multiple layers, and I need to find a good decomposition of them into 8x16 sprites which minimizes the number of sprites total and number per scanline. I don't even care about getting an optimal solution, but getting a good one is hard.