Colors
DDA is colorful game. You can use several foreground and background colors in various places:
- map data (terrain and furniture);
- item data;
- text data;
- etc.
Note: Map data objects can only have one color-related node defined (either color
or bgcolor
).
Color string format
Whenever color is defined in JSON it should be defined in following format: Prefix_Foreground_Background
.
Prefix
can take one of following values:
c_
- default color prefix (can be omitted);i_
- optional prefix which indicates that foreground color should be inverted (special rules will be applied to foreground and background colors);h_
- optional prefix which indicates that foreground color should be highlighted (special rules will be applied to foreground and background colors).
Foreground
- defines mandatory color of foreground/ink/font.
Background
- defines optional color of background/paper.
Note: Not all foreground + background pairs are defined by their full name. Use in-game Color manager to see all color names.
Note: If color was not found by its name, then c_unset
is used for Foreground
and i_white
for Background
.
Examples of color strings
c_white
-white
color (with default prefixc_
);black
-black
color (default prefixc_
is omitted);i_red
- invertedred
color;dark_gray_white
-dark_gray
foreground color withwhite
background color;light_gray_light_red
-light_gray
foreground color withlight_red
background color;dkgray_red
-dark_gray
foreground color withred
background color (deprecated prefixdk
instead ofdark_
);ltblue_red
-light_blue
foreground color withred
background color (deprecated prefixlt
instead oflight_
).
Color code
Color code is short string which defines color and can be used, for example, in maps notes.
Possible colors
Color (image) | Color name (dda) | Color name (curses) | Default R,G,B values | Color code | Notes |
---|---|---|---|---|---|
black | BLACK | 0,0,0 | |||
red | RED | 255,0,0 | R | ||
green | GREEN | 0,110,0 | G | ||
brown | BROWN | 92,51,23 | br | ||
blue | BLUE | 0,0,200 | B | ||
magenta | MAGENTA | 139,58,98 | P | ||
cyan | CYAN | 0,150,180 | C | ||
light_gray | GRAY | 150,150,150 | lg | deprecated lt prefix can be used instead of light_ | |
dark_gray | DGRAY | 99,99,99 | dg | deprecated dk prefix can be used instead of dark_ | |
light_red | LRED | 255,150,150 | deprecated lt prefix can be used instead of light_ | ||
light_green | LGREEN | 0,255,0 | g | deprecated lt prefix can be used instead of light_ | |
yellow | YELLOW | 255,255,0 | |||
light_blue | LBLUE | 100,100,255 | b | deprecated lt prefix can be used instead of light_ | |
pink | LMAGENTA | 254,0,254 | lm | ||
light_cyan | LCYAN | 0,240,255 | c | deprecated lt prefix can be used instead of light_ | |
white | WHITE | 255,255,255 | W |
Note: Default RGB values are taken from file \data\raw\colors.json
. Note: RGB values can be redefined in file \config\base_colors.json
.
Color rules
There are two types of special color transformation which can affect both foreground and background color:
- inversion;
- highlight.
Note: Color rules can be redefined (for example, \data\raw\color_templates\no_bright_background.json
).
Color tags
Color tags can be used in most places where strings can be displayed to the player:
"name": "[Ψ]Stop Concentrating",
"description": "End your concentration on all of your maintained powers.\n\nChanneling this power <color_green>always succeeds</color>.",
"text": [
"<color_light_blue>You see a Russian sheepdog off at the edge of your vision. It walks past some scenery and vanishes.</color>"
]
and
{ "u_message": "The <color_light_green>zombie</color> bursts in <color_red>flames!</color>", "type": "mixed" }
will be displayed respectively as:
and
Do note how the color tags override the default color for a "mixed"
dialogue message (magenta
). This is not always the case, so it requires testing to find out the intended combination.
Additionally, color tags can be combined to generate color gradients, and be nested into each other:
{ "u_message": "<color_red>H</color><color_magenta>ell</color><color_red>fire</color> and brimstone." },
{ "u_message": "<color_light_gray><color_white>This text is white</color> while this text is light_gray, <color_light_red>this is light_red</color>. This is light_gray again</color>", "type": "mixed" }
which are displayed as:
Note: Items that use relic data
automatically turn the item’s displayed name in pink
. Color tags override this, in case one wants to “hide” it from the player, or to make them look “mundane”. Similarly, if one wants, otherwise mundane items can have colored names.
User color customization
Base colors
Users can customize the color appearance by setting the color triplets in config/base_colors.json
. The default config looks like this:
[
{
"type": "colordef",
"BLACK": [ 20, 30, 38 ],
"DGRAY": [ 121, 97, 49 ],
"GRAY": [ 173, 135, 59 ],
"WHITE": [ 215, 181, 109 ],
"BROWN": [ 120, 83, 42 ],
"YELLOW": [ 231, 155, 32 ],
"RED": [ 181, 45, 26 ],
"LRED": [ 200, 105, 65 ],
"GREEN": [ 142, 140, 61 ],
"LGREEN": [ 153, 171, 79 ],
"BLUE": [ 35, 65, 86 ],
"LBLUE": [ 88, 102, 105 ],
"MAGENTA": [ 217, 131, 22 ],
"LMAGENTA": [ 218, 153, 71 ],
"CYAN": [ 77, 72, 127 ],
"LCYAN": [ 131, 109, 175 ]
}
]
The mapping values are [Red, Green, Blue] color triplets, with numbers for each ranging from 0 to 255.
If for whatever reason one wanted to make all the “red” colors appear blue on the screen, they could change the "RED": [ 181, 45, 26 ],
to something like "RED": [ 10, 10, 220 ],
.
The game provides a nice built-in color manager with several pre-defined color themes that can be easily switched between.
GUI colors
The UI menus do not (always) adhere to the base color customization, and can be customized separately, in the config/imgui_style.json
. The default config is:
{
"inherit_base_colors": false,
"colors": {
}
}
Changing inherit_base_colors
to true
would make the imgui menus follow the base colors theme with some reasonable defaults.
It is, however, also possible to tweak the specific element colors with higher fidelity and not be restricted to the 8-color pallete by specifying the respective elements and colors in the colors
object. Like so:
{
"inherit_base_colors": false,
"colors": {
"ImGuiCol_Text" : [1.00, 1.00, 1.00, 1.00],
"ImGuiCol_TextDisabled" : [0.50, 0.50, 0.50, 1.00],
"ImGuiCol_WindowBg" : [0.06, 0.06, 0.06, 0.94],
"ImGuiCol_ChildBg" : [0.00, 0.00, 0.00, 0.00],
"ImGuiCol_PopupBg" : [0.08, 0.08, 0.08, 0.94],
"ImGuiCol_Border" : [0.43, 0.43, 0.50, 0.50],
"ImGuiCol_BorderShadow" : [0.00, 0.00, 0.00, 0.00],
"ImGuiCol_FrameBg" : [0.16, 0.29, 0.48, 0.54],
"ImGuiCol_FrameBgHovered" : [0.26, 0.59, 0.98, 0.40],
"ImGuiCol_FrameBgActive" : [0.26, 0.59, 0.98, 0.67],
"ImGuiCol_TitleBg" : [0.04, 0.04, 0.04, 1.00],
"ImGuiCol_TitleBgActive" : [0.16, 0.29, 0.48, 1.00],
"ImGuiCol_TitleBgCollapsed" : [0.00, 0.00, 0.00, 0.51],
"ImGuiCol_MenuBarBg" : [0.14, 0.14, 0.14, 1.00],
"ImGuiCol_ScrollbarBg" : [0.02, 0.02, 0.02, 0.53],
"ImGuiCol_ScrollbarGrab" : [0.31, 0.31, 0.31, 1.00],
"ImGuiCol_ScrollbarGrabHovered" : [0.41, 0.41, 0.41, 1.00],
"ImGuiCol_ScrollbarGrabActive" : [0.51, 0.51, 0.51, 1.00],
"ImGuiCol_CheckMark" : [0.26, 0.59, 0.98, 1.00],
"ImGuiCol_SliderGrab" : [0.24, 0.52, 0.88, 1.00],
"ImGuiCol_SliderGrabActive" : [0.26, 0.59, 0.98, 1.00],
"ImGuiCol_Button" : [0.26, 0.59, 0.98, 0.40],
"ImGuiCol_ButtonHovered" : [0.26, 0.59, 0.98, 1.00],
"ImGuiCol_ButtonActive" : [0.06, 0.53, 0.98, 1.00],
"ImGuiCol_Header" : [0.26, 0.59, 0.98, 0.31],
"ImGuiCol_HeaderHovered" : [0.26, 0.59, 0.98, 0.80],
"ImGuiCol_HeaderActive" : [0.26, 0.59, 0.98, 1.00],
"ImGuiCol_Separator" : [0.43, 0.43, 0.50, 0.50],
"ImGuiCol_SeparatorHovered" : [0.10, 0.40, 0.75, 0.78],
"ImGuiCol_SeparatorActive" : [0.10, 0.40, 0.75, 1.00],
"ImGuiCol_ResizeGrip" : [0.26, 0.59, 0.98, 0.20],
"ImGuiCol_ResizeGripHovered" : [0.26, 0.59, 0.98, 0.67],
"ImGuiCol_ResizeGripActive" : [0.26, 0.59, 0.98, 0.95],
"ImGuiCol_Tab" : [0.18, 0.35, 0.58, 0.86],
"ImGuiCol_TabHovered" : [0.26, 0.59, 0.98, 0.80],
"ImGuiCol_TabActive" : [0.20, 0.41, 0.68, 1.00],
"ImGuiCol_TabUnfocused" : [0.07, 0.10, 0.15, 0.97],
"ImGuiCol_TabUnfocusedActive" : [0.14, 0.26, 0.42, 1.00],
"ImGuiCol_PlotLines" : [0.61, 0.61, 0.61, 1.00],
"ImGuiCol_PlotLinesHovered" : [1.00, 0.43, 0.35, 1.00],
"ImGuiCol_PlotHistogram" : [0.90, 0.70, 0.00, 1.00],
"ImGuiCol_PlotHistogramHovered" : [1.00, 0.60, 0.00, 1.00],
"ImGuiCol_TableHeaderBg" : [0.19, 0.19, 0.20, 1.00],
"ImGuiCol_TableBorderStrong" : [0.31, 0.31, 0.35, 1.00],
"ImGuiCol_TableBorderLight" : [0.23, 0.23, 0.25, 1.00],
"ImGuiCol_TableRowBg" : [0.00, 0.00, 0.00, 0.00],
"ImGuiCol_TableRowBgAlt" : [1.00, 1.00, 1.00, 0.06],
"ImGuiCol_TextSelectedBg" : [0.26, 0.59, 0.98, 0.35],
"ImGuiCol_DragDropTarget" : [1.00, 1.00, 0.00, 0.90],
"ImGuiCol_NavHighlight" : [0.26, 0.59, 0.98, 1.00],
"ImGuiCol_NavWindowingHighlight" : [1.00, 1.00, 1.00, 0.70],
"ImGuiCol_NavWindowingDimBg" : [0.80, 0.80, 0.80, 0.20],
"ImGuiCol_ModalWindowDimBg" : [0.80, 0.80, 0.80, 0.35]
}
}
The keys in the mapping are the ones provided by ImGui library, and it should be “obvious” or perhaps “intuitive” what those do (which is to say, there is no explicit documentation at the moment). Values are [red, green, blue, opacity]
quadruplets with values between 0.0
and 1.0
inclusive. However [red, green, blue]
triplets are also accepted, and in those cases opacity is assumed to be 1.0
(i.e. fully non-transparent).
The values in the above snippet are those of the default ImGui theme that the game uses, so copy-pasting that into your own config/imgui_style.json
should yield no visual difference from the empty config. They can be used as a reference.
You can play around with specific values in the imgui playground (accessible from the game main menu -> imgui Demo Screen -> Configuration -> Style -> Colors). You can then easily “Export” the chosen colors to use in imgui_style.json
config.