Making your own set of palettes is a lot of data entry and a lot of work.
First and foremost, you'll need a blank "support" pk3; I've got one Trillster prepared for me here:
The MENUDEF portion of Fighting Palettes has two sections for every single class you define a palette for. Here's Windman's from the Gondola Support file. I've highlighted anything you'll need to change in
RED.
OptionMenu "FPOptions_Windman"
{
Title "FIGHTING PALETTES"
StaticText " "
StaticText "Notification Option", 1
Option "Show Options Notification", "fp_notification", "OnOff"
StaticText " "
StaticText "Fighting Palette", 1
Option "Which Palette?", "fp_palette", "FPPalettes_Windman"
Command "Apply", "apply_fp"
StaticText " "
}
OptionValue "FPPalettes_Windman"
{
0, "(1) - Player 1"
1, "(2) - Player 2"
2, "(3) - Wind Storm"
3, "(4) - Spring Breeze"
4, "(5) - Dust Devil"
5, "(6) - Net Warrior"
}
As shown here, there's two blocks you have to modify when defining a class.
The first block you shouldn't change too much; You want to change the class name in the
OptionMenu definition to
whatever the actor name for the class is. For example, Roll's is FPOptions_RollClass.
From there, you want to modify the
Option line to refer to the name of your second block. If you don't do this, you won't open the correct menu when switching your palettes!
The second block you're changing just about everything! This is where you get to name your Palettes if you want. The first color will
always be the default color scheme for the class. Gondola Support lists the first two as "Player 1" and "Player 2" but you don't have to name them that if you don't want to.
Remember, when changing the name of the
OptionValue menu, you have to use
whatever the actor name for the class is. For example, Roll's is FPPalettes_RollClass.
The DECORATE portion of Fighting Palettes is fairly simple, and just a lot of data entry.
Not a lot of explanation is required here, so here's an example using Original Duo.
actor OriginalDuo_10868_FightingPalettes { args 40856, 40860, 40864, 40868, 40872}
actor OriginalDuo_10870_FightingPalettes { args 40857, 40861, 40865, 40869, 40873}
actor OriginalDuo_10871_FightingPalettes { args 40858, 40862, 40866, 40870, 40874}
actor OriginalDuo_10872_FightingPalettes { args 40859, 40863, 40867, 40871, 40875}
Okay, so, this is easily broken down into three editable segments.
First and foremost is the
name of the class you're defining here. This is specifically
whatever the actor name for the class is. For example, Roll's is RollClass.
After you've changed that, you can move on to the
Translation Number you're attempting to modify. You'll have to trudge around in ACS for these; for Original Duo, the translation numbers
10868, 10870, 10871, and 10872 correspond to his default color palette and his charging palettes.
You will have to make sure that you define an actor for every palette a class could conceivably be, or your palettes will fail.
Finally, you can modify the
Palette Translation Numbers. These are the five consecutive numbers at the end. These can be pre-existing
Translation Numbers or ones you've defined in ACS. You'll notice there's only five numbers here; this is because a class's first palette is
always their default color scheme. The first option here corresponds to their second palette, then their third, fourth, fifth, and finally sixth.
To put it all together, let's say we're modifying your Ball Man class, with an actor name of
BallManSuperClass. The ACS Translation code for his default palette is
69420, and the ACS Translation codes for his palettes are
3000, 3001, 3002, 3003, and 3004.
That would give us this:
actor BallManSuperClass_69420_FightingPalettes { args 3000, 3001, 3002, 3003, 3004 }
The ACS portion of Fighting Palettes is even more data entry, and there's two primary things to pay attention to here.
First up is your
Translation Numbers.
//Protoman Player 2 (Purple)
#define CLR_PROTOMAN_1 40026
#define CLR_PROTOMAN_1_MIDCHARGE 40027
#define CLR_PROTOMAN_1_FULLCHARGE 40028
//Protoman 01
#define CLR_PROTOMAN_2 40029
#define CLR_PROTOMAN_2_MIDCHARGE 40030
#define CLR_PROTOMAN_2_FULLCHARGE 40031
//Protoman Blood Falcon
#define CLR_PROTOMAN_3 40032
#define CLR_PROTOMAN_3_MIDCHARGE 40033
#define CLR_PROTOMAN_3_FULLCHARGE 40034
//Protoman Green Ranger
#define CLR_PROTOMAN_4 40035
#define CLR_PROTOMAN_4_MIDCHARGE 40036
#define CLR_PROTOMAN_4_FULLCHARGE 40037
//Protoman Shadowed
#define CLR_PROTOMAN_5 40038
#define CLR_PROTOMAN_5_MIDCHARGE 40039
#define CLR_PROTOMAN_5_FULLCHARGE 40040
At the top of your file, you'll have a constantly growing block of translation numbers. You'll have to define one for each palette you're defining, and any translation that your class will feasibly shift to. As shown in the block above for Protoman, every single palette has defined numbers for his charging translations.
From here, you'll want to have a
Definition Name to make things more organized; you can name these however you please but CLR_CLASS_# was very easy to keep track of for me.
Then, you have to define a
Translation Number unique from anything else used in all of MM8BDM for every single definition you make.
The Mod List on the Wiki can help you keep track of what's being used and what is not to avoid any incompatibility issues!
You can also use
core_logtranslations and
core_checktranslations to help you ensure what you can and can't use!
After all of that, you now have a second block to worry about!
Inside your script, you'll have an ever expanding list of created translations that look something like this:
CreatePlayerTranslation(CLR_PROTOMAN_1, 87, 60);
CreatePlayerTranslationGlow(CLR_PROTOMAN_1_MIDCHARGE, 87, 60, 253);
CreatePlayerTranslationGlow(CLR_PROTOMAN_1_FULLCHARGE, 138, 229, 230);
CreatePlayerTranslation(CLR_PROTOMAN_2, 70, 3);
CreatePlayerTranslationGlow(CLR_PROTOMAN_2_MIDCHARGE, 70, 3, 253);
CreatePlayerTranslationGlow(CLR_PROTOMAN_2_FULLCHARGE, 138, 229, 230);
CreatePlayerTranslation(CLR_PROTOMAN_3, 177, 246);
CreatePlayerTranslationGlow(CLR_PROTOMAN_3_MIDCHARGE, 177, 246, 253);
CreatePlayerTranslationGlow(CLR_PROTOMAN_3_FULLCHARGE, 138, 229, 230);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_4), 192:192=228:228, 198:198=110:110,210:210=86:86);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_4_MIDCHARGE), 192:192=228:228, 198:198=110:110,210:210=86:86, 0:2=253:253, 5:8=253:253, 243:247=253:253);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_4_FULLCHARGE), 192:192=138:138, 198:198=229:229, 0:2=230:230, 5:8=230:230, 243:247=230:230);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_5), 192:192=75:75,168:168=75:75, 198:198=241:241, 210:210=241:241);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_5_MIDCHARGE), 192:192=75:75, 168:168=75:75, 198:198=241:241, 210:210=241:241, 0:2=253:253, 5:8=253:253, 243:247=253:253);
CreateTranslation(DefineTranslation(CLR_PROTOMAN_5_FULLCHARGE), 192:192=138:138, 168:168=138:138, 198:198=229:229, 210:210=229:229, 0:2=230:230, 5:8=230:230, 243:247=230:230);
This is the REAL meat of the mod; this is where you pick the colors every palette will be! You have three options for definitions here,
CreatePlayerTranslation(),
CreatePlayerTranslationGlow() and
CreateTranslation(DefineTranslation()). These all have their advantages that we'll go into.
CreatePlayerTranslation() is defined here on the wiki but put simply, it allows you to only enter your
Definition Name followed by your
Secondary ("Cyan") and Primary ("Blue") colors for a very compact definition. By default, these use colors from
The MM8BDM Palette but you can use an RGB Triplet as well; this is explained in further detail on the wiki page.
CreatePlayerTranslationGlow(), defined here on the wiki, acts the exact same as CreatePlayerTranslation() but also recolors any of the myriad of choices you have for
Black ("Black") on
The MM8BDM Palette.
CreateTranslation(DefineTranslation()) is wrapping the DefineTranslation() function (defined here on the wiki) inside of CreateTranslation to allow us to have more control over more colors. You can still use this to define only your
Secondary ("Cyan") and Primary ("Blue") colors but you can do much more than that. You can define any color used on the sprites for your class and modify them here; For example, Protoman's fifth palette in Gondola Support, "Oliver", changes the light tan color used for Protoman's Scarf and Skin.
CreateTranslation(DefineTranslation(CLR_PROTOMAN_4), 192:192=228:228, 198:198=110:110,210:210=86:86);
Here you can see that this translates 192 (The default "Cyan"), 198 (The default "Blue"), and 210 (The color used for Protoman's Scarf and Skin) into new colors.
If you want to learn more about how Translation works, you can visit this ZDoom Wiki page!
If we were to use our Ball Man class example from the DECORATE section, our file would probably look something like this:
#define CLR_BALLMAN_1 3000
#define CLR_BALLMAN_2 3001
#define CLR_BALLMAN_3 3002
#define CLR_BALLMAN_4 3003
#define CLR_BALLMAN_5 3004
Here we define our
Definition Names for Ball Man, and our
Palette Translation Numbers.
Then, inside of our script, we've got this:
CreatePlayerTranslation(CLR_BALLMAN_1, 172, 183);
CreatePlayerTranslation(CLR_BALLMAN_2, 110, 132);
CreatePlayerTranslation(CLR_BALLMAN_3, 93, 3);
CreatePlayerTranslationGlow(CLR_BALLMAN_4, 199, 136, 176);
CreateTranslation(DefineTranslation(CLR_BALLMAN_5), 192:192=79:79, 198:198=16:16, 210:210=176:176, 168:168=160:160, 247:247=199:199);
We've successfully defined 5 unique palettes for Ball Man by selecting colors from
The MM8BDM Palette, defined a special palette that changes the color of
Black into something else, and defined a special palette that changes both
Tan (210) (used for "skin", typically) and
Eye Whites (168) (this is a good color to remember, because all core skins use 168 as the White for the Eyes exclusively!) as well as
Black (247).
Make sure to compile your ACS!
And that's it! If you've completed all of these steps, you should be good to head into game and see if it all worked out! Remember, test
The amount of work this takes balloons quickly, so it's good practice to test as you go.