Let's add Mario's SMB3 sprite as a simple custom character! First, we make a folder with the name of our character. We must also use this name as the prefix for our files! We'll use "smb3_mario", which also what you'll type in-game to switch this character. Later, we will learn how to change the display name.

First, we need to make two image files, one for the small form ([char]_0.png) and one for the large form ([char]_1.png). The fire form is just the large form with a different palette. To line everything up, we can use template_0.png and template_1.png as a reference. Notice that there is 1 pixel of empty space between each frame. The reason for this is that old versions of coopdx often had rendering issues if the different frames were too close. It's mostly fixed now, unless you have anti-aliasing enabled.

Notice that on the template, there appears to be duplicate rows. This is because there are 3 LAYERS on this character. Each layer maps to a different color. When making a character, I recommend lining up the first layer using a colored version of the sprite, then duplicating that layer to the other two.

Once you've got that, it's time to get palette support working. For each layer, pick one color to be pure white (#FFFFFF) and the others to be transparent, with each layer having one of the colors (NES sprites always have 3 colors + transparency). The layers render from top to bottom, so I recommend placing the "flesh" of your character on the first layer. The vanilla characters have parts of this layer filled in, just so you don't potentially see holes in the sprite (not as much of an issue anymore). You could also mix in some greys for some shading on the layer, but that's getting a bit advanced.

Then, all we have left to do is fill out the .ini file, named "[char]_data.ini". The headers aren't really that important, but they help keep things organized. The [Misc] header is mostly empty, because it lets us control more complicated parameters that we don't need to worry about since we're using the basic template. One thing we WOULD like to set is the name. It'll just use the folder name by default, swapping out underscores for spaces, meaning its name will be "SMB3 MAR" (names are limited to 8 characters max). That's very silly, so we can just set the display name to "Mario". Note that the name will always be displayed in upper case, and some symbols are also not available.

The main thing we need to fill out is the [Palette] section. This lets us set up which part  of your Coop palette each layer uses. pal_norm_[1-3] controls each layer of the normal form, and pal_fire_[1-3] controls each layer of the fire form. We have 3 options for what to use:
- A coop part written in all caps, like "SHIRT". Note that Overalls is referred to as "PANTS" here.
- A 6 or 3 digit RGB color code, like "B53120". The 3 digit code "B32" is equivalent to "BB3322". This just sets the layer to ALWAYS use this color, with some exceptions: The feature layer may still be automatically adjusted, and if the fire palette uses a constant, but the base palette doesn't, the fire palette may be auto-adjusted if the player is already using that color for their base palette. But don't stress over it too much.
- The ID of a coop part, like 0 for SHIRT. IDK why you would want to do that... but you can.

We also should set the baseLayer and featureLayer. The baseLayer is the "flesh" part of your character, and the featureLayer is what is over that part (typically, whatever color has the eyes). What this actually does is that if the baseLayer and featureLayer are close to the same color, the game will automatically darken the featureLayer so you can tell them apart. The baseLayer MUST have a smaller value than the featureLayer for this to work (another reason to make it the first one!).

Okay, we're ready to go... right? Not quite. You see, it's HIGHLY recommend that we create a default palette for the character. This is what pal_norm_default_[1-3] and pal_fire_default_[1-3] are for. It's formatted just like the normal palette, but you should only use color constants, that way it won't change depending on player's selected palette (that would defeat the entire point...)

And there we have it! Now all we need to do is pop the folder into our modFs. This is located in Coop's AppData directory (accessible in-game through Options->Misc) inside of the sav folder, called "so_retro.zip." If you don't see it, try playing the So Retro at least once. Then, we load it in-game using either the /load_char [char] command, or by typing its name into the mod menu. If it loads, HUZZAH! If not, you may have incorrectly named one of the files or made a typo when trying to load it (case sensitive, and make sure you don't have a trailing space). The cool thing is that this character can be used in ANY lobby, even if you're not the host! Other people will be able to see it as well! As such, have some sense and don't make any phallic-shaped sprites, or you'll likely be banned from CoopNet.

ONE LAST BONUS: SAVING CHARACTERS
If you enter the same level as another player using a custom character, it'll automatically be loaded and become accessible to you. Type /list_char to list all loaded characters (WON'T DISPLAY ONES THAT HAVEN'T BEEN LOADED YET). When using a custom character, you can use /save_char to save the character to your modFs, allowing you to use it permanently. This also works with non-modFs characters, including ones implemented through Character Select! When saving a CS character, their default palette will be set to whichever palette you currently have selected for them.

But if you, for whatever reason, don't want people to be able to do this with your character ("this is my OC, do not steal!") then you can add "private = 1" as a line in the .ini file. You'll still be able to use the character and others will see the character, but they won't be able to play as or download that character. But I'm not really a fan of "exclusive" things, so I think you should use this feature sparingly. Besides, it's probably not 100% secure.