For the 4-color limitation, I coded a dumb post processing shader that converts everything to a 4-color palette :)
Its useful to make sure to stick to the rules, here's the core section:
uniform sampler2D u_image; // final image as tex
uniform vec3 u_palette[4]; // color palette
in vec2 v_texcoord; // text coords
out vec4 fragColor; // final color
void main() {
// Since its a PostProcessing shader, I have access to the final image as texture
vec4 tex = texture(u_image, v_texcoord);
// Than I compute the lumimance (color => grey-scale conversion)
// This is optional, you can even do normal weighted average
// by adding each channel and dividing by 3.
float avg = 0.2126 * tex.r + 0.7152 * tex.g + 0.0722 * tex.b;
// Than I divide the color spectrum in 4 sections (0.25, 0.50, 0.75, 1.0)
// and assign an index for each of them, going from black-ish to white-ish
// x < 0.25 => #0
// 0.25 <= x < 0.50 => #1
// 0.50 <= x < 0.75 => #2
// 0.75 <= x => #3
int index = (avg < 0.25) ? 0 : (avg < 0.5) ? 1 : (avg < 0.75) ? 2 : 3;
// Than the index access a palette (uniform of 4 vec3)
fragColor = vec4(u_palette[index], 1.0);
}For palettes, you can access sites like this:
https://lospec.com/palette-list
For Godot, PostProcessing shaders can be integrated easily, try following this guide:
https://docs.godotengine.org/en/stable/tutorials/shaders/custom_postprocessing.h...