Palettes

Location in the unpacked data: "textures/palette.png"

Palettes are used to recolor the many different assests in The End is Nigh. By loading different palettes for each unique area of the game, each zone is able to look drastically different whilst using many of the same assets.

The file that defines the palette information can be opened in any basic paint program to be modified, allowing for changes to be made to existing palettes as well as the ability to create entirely new ones.

The palette is made up of pixels, and these pixels are interpreted in two ways: as rows, and as a columns. The rows marks a unique palette that can be set, with its row number acting as its palette ID (0 - 63). Whereas each column the pixel is in (0 - 15) specifies what graphics the color in that particular palette row will be mapped to, whether its background tiles, water/lava, tile details, etc.

Columns
The following section describes what assets/graphics each column of the palette is mapped to:

0 - Active tiles (solids, spikes, text, etc.) and the player. 1 - The color of the retro rings used in cartridges. 2 - Decorations for active tiles (bricks, rocks, etc.). 3 - Decorations for the first background layer. 4 - First background layer. 5 - Second background layer. 6 - Skulls, seen on a veriety of enemies throughout the game. 7 - Background image, layer 1. 8 - Background image, layer 2. 9 - Background image, layer 3. 10 - Background image, layer 4. 11 - Background image, layer 5. 12 - Certain NPCs, and miscellaneous objects. 13 - Toxic/Pollution, and miscellaneous objects. 14 - Lava and water (a more desaturated version of the lava colour). 15 - Character eyes and other facial features, and the glow effect in The Hollows.

These palette columns will also impact other small features of the game’s graphics. However, these are the main uses of each of the different columns.

Rows
The following section describes each palette row, and where it is used in the game:

0 - Super Mega Cart All Stars Intro Screen and The Game Intro Screen 1 - The End and The Save Select Menu 2 - Arid Flats 3 - Overflow 4 - The Split and Wall of Sorrow 5 - Retrograde 6 - The Hollows 7 - Unused 8 - SS Exodus 9 - The Machine 10 - Golgotha and Anguish 11 - Gloom 12 - Blight 13 - Ruin 14 - The End is Nigh Cartridge + Intro Screen and Corrupted Cartridge + Intro Screen 15 - Unused 16 - Mortaman Cartridge 17 - Blaster Massacre Cartridge 18 - Nevermore/The Future 19 - River City Rancid Cartridge 20 - Ash Climber Cartridge 21 - Catastrovania Cartridge 22 - Rubble Robble Cartridge 23 - Fallen Fantasy Cartridge 24 - Morbid Gear Cartridge 25 - Dig Dead Cartridge 26 - Super Mega Cart All Stars Cartridge 27 - Spike Tales Cartridge 28 - Scab or Die Cartridge 29 - Tombs and Torture Cartridge 30 - Mortaman Intro Screen and Pus-Man Cartridge + Intro Screen 31 - Blaster Massacre Intro Screen 32 - River City Rancid Intro Screen 33 - Ash Climber Intro Screen 34 - Catastrovania Intro Screen 35 - Rubble Robble Intro Screen 36 - Fallen Fantasy Intro Screen 37 - Morbid Gear Intro Screen 38 - Dig Dead Intro Screen 39 - Unused 40 - Spike Tales Intro Screen 41 - Scab or Die Intro Screen 42 - Tombs and Torture Intro Screen 43 - Ghosts ’N Grieving Cartridge 44 - Ghosts ’N Grieving Intro Screen 45 - Depression Cartridge + Intro Screen 46 - Denial Cartridge + Intro Screen 47 - Anger Cartridge + Intro Screen 48 - Bargaining Cartridge + Intro Screen 49 - Acceptance Cartridge + Intro Screen 50 - Dead Racer Cartridge + Intro Screen

All palettes onwards are unused and will display completely white unless modified. This leaves modders with 16 palettes that can be added without needing to modify the palette to accept more colors; see the second-half of the following section for details on how to add more palettes.

Modifying Palettes
Once the "palette.png" file has been modified, or if you simply want to give an area an existing palette, the "tilesets.txt" needs to be modified for a palette to be assigned. Locate the unpacked game data and navigate to the "data/" directory, in there will be a file called "tilesets.txt", open this file. Locate the area which you would wish to modify, this can be found by looking at the area_name variable which will list the name of each area. Once the area has been found simply set the palette variable to the row number of your desired palette; remember that the top-most row in the palette.png image is palette 0 and they continue incrementing upwards in value the further down the image they are.

In the example below, the Arid Flats has been assigned the palette 10 (which is used for Golgotha and Anguish). Changing this value and relaunching the game produces the results on the right, compared to the original palette seen on the left.

For a more in-depth look at the various aspects of the "tilesets.txt" file, as well as how to modify it, click here.

Adding Palettes
In its default state, the palettes file can only store 64 unique palette entries (rows). However, this can be changed by modifying aspects of certain shader, which can be located in the "shaders/" directory of the unpacked data. Two specific shaders will need to be modified for this to work "colormapped.shader" and "colormapped_duplicatedforstupidreasons.shader", as these shaders control how colours from the palette are mapped to colours used by the game's assets.

Open both palettes in any text editor (Notepad, Notepad++, Sublime-Text, etc.) and you will see the following text:

colormapped.shader 1 #version 130 2  3 uniform mat2x4 color_xform; 4 uniform sampler2D palettetex; 5 uniform float palette; 6  7 #if COMPILING_VERTEX_PROGRAM 8  9  void vert{ 10   //gl_FrontColor = gl_Color * color_xform[0] + color_xform[1]; 11   vec4 outcolor = gl_Color * color_xform[0] + color_xform[1]; 12   gl_FrontColor = vec4(texture(palettetex, vec2((outcolor.r*15.0+.5)/ 16.0 ,(palette+.5)/ 64.0 )).rgb, outcolor.a); 13   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 14  } 15  16 #elif COMPILING_FRAGMENT_PROGRAM 17  18  void frag{ 19   gl_FragColor = gl_Color; 20  } 21  22 #endif

colormapped_duplicatedforstupidreasons.shader 1 #version 130 2  3 uniform mat2x4 color_xform; 4 uniform sampler2D palettetex; 5 uniform float palette; 6  7 #if COMPILING_VERTEX_PROGRAM 8  9  void vert{ 10   //gl_FrontColor = gl_Color * color_xform[0] + color_xform[1]; 11   vec4 outcolor = gl_Color * color_xform[0] + color_xform[1]; 12    13   gl_FrontColor = vec4(texture(palettetex, vec2((outcolor.r*15.0+.5)/ 16.0 ,(palette+.5)/ 64.0 )).rgb, outcolor.a); 14   if(outcolor.r < .1 && outcolor.g < .1 && outcolor.b > .9){ 15    gl_FrontColor = vec4(0.0,0.0,0.0, outcolor.a); 16   } 17    18   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 19  } 20  21 #elif COMPILING_FRAGMENT_PROGRAM 22  23  void frag{ 24   gl_FragColor = gl_Color; 25  } 26  27 #endif

The highlighted values are the important ones, the 16.0 is the number of columns in the palette file (width) and the 64.0 is the number of rows in the palette file (height). The height is the only value that needs to be modified, simply change this value in both shaders to the number of however many palettes you would like, make sure this matches your palette file itself. Now the new palette row number (64 onwards) needs to simply be referenced in the "tilesets.txt" file for the area that will use the new palette (see the Modifying Palettes section if you do not know how to set a palette for an area), and that is all that needs to be done to add more palette rows to the game.

For more information regarding shaders, click here.

Remarks
Expanding the "palette.png" file to add more palettes, without making the appropriate changes to the color mapping shaders, will result in incorrect colors and palettes being displayed.

Transparency/alpha is not read from the palette, so saving semi-transparent pixels will simply result in the same colour being used in-game, but with the alpha being set to full - removing the transparency. Fully transparent pixels will either be black or white, depending on how the paint program being used to modify the palette handles saving transparency.

The map screen will make use of colors from the currently loaded area palette to tint the different icons, graphics, etc. As will other graphical elements, such as the tumor counter, NPC text boxes, etc.