拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Cataclysm-DDA 颜色系统完全指南:从 JSON 颜色字符串到玩家自定义主题

Cataclysm-DDA 颜色系统完全指南从 JSON 颜色字符串到玩家自定义主题【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA本指南以 doc/user-guides/COLOR.md 为核心系统讲解 Cataclysm-DDACDDA中颜色的定义格式、可用色板、特殊变换规则反色/高亮、文本颜色标签以及玩家侧的基础颜色与 ImGui 界面颜色自定义。读完本文你将能在 JSON 数据文件中正确编写颜色字符串、在对话与描述文本中嵌入color_标签并通过base_colors.json与imgui_style.json定制属于自己的游戏配色。颜色在游戏中的使用范围CDDA 是一款五颜六色的游戏前景色与背景色可以出现在大量位置包括但不限于地图数据terrain 地形与 furniture 家具物品数据item文本数据对话、描述、消息等其他各类 UI 元素。注意地图数据对象terrain/furniture只能定义一个与颜色相关的节点——要么color要么bgcolor二者不可同时使用。颜色字符串格式只要在 JSON 中定义颜色就必须遵循以下格式Prefix_Foreground_Background其中Prefix前缀可选值c_—— 默认颜色前缀可以省略i_—— 可选前缀表示前景色应被**反色inverted**处理会对前景与背景色应用特殊规则h_—— 可选前缀表示前景色应被**高亮highlighted**处理会对前景与背景色应用特殊规则。Foreground前景—— 必填定义前景/墨迹/字体的颜色。Background背景—— 可选定义背景/纸张的颜色。注意并非所有前景 背景组合都有完整名称。请在游戏内的 Color manager颜色管理器中查看全部颜色名称。注意容错规则如果按名称找不到某个颜色则Foreground会被回退为c_unsetBackground会被回退为i_white。这一点在源码 src/color.cpp 中可以得到印证color_from_string()在未匹配时返回c_unset而bgcolor_from_string()在未匹配时返回i_white参见 src/color.cpp。源码中的解析细节color_from_string()的实现src/color.cpp揭示了几条解析规则若字符串第 2 个字符不是_即不是c_/i_/h_形式会自动补上c_前缀因此black会被解析为c_black废弃前缀lt替代light_与dk替代dark_会被自动替换为完整写法。当以report_color_error::yes调用时若检测到废弃前缀会触发debugmsg警告提示 mod 作者更新最终通过all_colors.name_to_color()查表匹配未命中则返回c_unset。bgcolor_from_string()src/color.cpp则是先把输入强制加上i_前缀再查表同样支持lt/dk废弃前缀替换。颜色字符串示例写法含义c_whitewhite颜色带默认前缀c_blackblack颜色省略默认前缀c_i_red反色后的reddark_gray_whitedark_gray前景 white背景light_gray_light_redlight_gray前景 light_red背景dkgray_reddark_gray前景 red背景废弃前缀dk代替dark_ltblue_redlight_blue前景 red背景废弃前缀lt代替light_颜色代码Color code颜色代码color code是一段很短的字符串用于标识颜色例如可以用于地图标注map notes等场景。具体的代码映射见下表。可用颜色一览下表列出 CDDA 支持的全部 16 种基础颜色。其中Color name (dda)为 JSON 中使用的名称Color name (curses)为 curses 终端界面对应的名称Default R,G,B values为默认 RGB 值Color code为短代码Notes为补充说明颜色名称 (dda)颜色名称 (curses)默认 R,G,B 值data/raw/colors.jsonColor codeNotesblackBLACK0,0,0redRED255,0,0RgreenGREEN0,110,0GbrownBROWN97,56,28brblueBLUE51,51,255BmagentaMAGENTA139,58,98PcyanCYAN0,150,180Clight_grayGRAY150,150,150lg废弃前缀lt可代替light_dark_grayDGRAY99,99,99dg废弃前缀dk可代替dark_light_redLRED255,150,150废弃前缀lt可代替light_light_greenLGREEN0,255,0g废弃前缀lt可代替light_yellowYELLOW255,255,0light_blueLBLUE100,100,255b废弃前缀lt可代替light_pinkLMAGENTA254,0,254lmlight_cyanLCYAN0,240,255c废弃前缀lt可代替light_whiteWHITE255,255,255W注意默认 RGB 值取自仓库中的 data/raw/colors.json即上表第三列。需要提醒的是doc/user-guides/COLOR.md 原表部分行如brown的92,51,23、blue的0,0,200与当前仓库文件的默认值存在出入实际生效值以 data/raw/colors.json 为准。注意这些 RGB 值可以通过config/base_colors.json重新定义详见下文用户颜色自定义。颜色规则Color rules有两类特殊的颜色变换会同时影响前景色与背景色反色inversion对应i_前缀高亮highlight对应h_前缀。注意颜色规则是可以被重新定义的。例如仓库中的 data/raw/color_templates/no_bright_background.json 就重新定义了部分反色/高亮映射它把i_light_gray映射到c_white、c_pink反色到i_magenta、c_white反色到i_light_gray等从而避免在深色背景下使用过亮的背景色。同目录下的 data/raw/color_templates/default.json 是默认模板当前为空数组。在源码层面反色/高亮查询由color_loader内部表与nc_color get_highlight( const nc_color color, hl_enum bg )提供声明见 src/color.h字符串层面的高亮文本处理由hilite_string()完成src/color.cpp——该函数会扫描文本中的所有color_开标签将其替换为高亮后的颜色标签若文本中没有任何颜色标签则整体以h_white高亮显示。颜色标签Color tags在绝大多数可以向玩家显示字符串的地方都可以使用颜色标签name: [Ψ]Stop Concentrating, description: End your concentration on all of your maintained powers.\n\nChanneling this power color_greenalways succeeds/color.text: [ color_light_blueYou see a Russian sheepdog off at the edge of your vision. It walks past some scenery and vanishes./color ]以及{ u_message: The color_light_greenzombie/color bursts in color_redflames!/color, type: mixed }注意观察最后这个例子——颜色标签会覆盖mixed类型对话消息的默认颜色magenta。但并非所有消息类型都如此因此实际使用时需要测试确认预期中的颜色组合。标签的解析方式从源码 src/color.cpp 的get_color_from_tag()可以确认标签的解析规则以/color开头的标签被识别为关闭标签close_color_tag以color_开头的标签会提取中间的颜色名交给color_from_string()解析成功则返回打开标签open_color_tag及其对应颜色其他形式的...均视为普通非颜色标签non_color_tag保持原样输出。标签的组合与嵌套颜色标签可以组合生成渐变效果也可以互相嵌套{ u_message: color_redH/colorcolor_magentaell/colorcolor_redfire/color and brimstone. }, { u_message: color_light_graycolor_whiteThis text is white/color while this text is light_gray, color_light_redthis is light_red/color. This is light_gray again/color, type: mixed }第一个示例通过交替使用color_red与color_magenta逐段包裹单词在H/ell/fire之间形成红—品红—红的渐变效果第二个示例演示了嵌套内层color_white与color_light_red只影响其包裹的片段闭合后回到外层light_gray颜色。与 relic data 的交互注意使用relic data神器数据的物品其显示名称会自动变成pink粉色。颜色标签可以覆盖这一默认行为——例如你想对玩家隐藏神器属性让它看起来像普通物品或者反过来给普通物品加上彩色名称都可以通过颜色标签实现。用户颜色自定义基础颜色Base colors玩家可以通过config/base_colors.json自定义颜色外观。默认配置如下[ { 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 ] } ]映射值是[Red, Green, Blue]三元组每个分量的取值范围是 0 到 255。例如如果出于任何原因想把屏幕上所有红色显示成蓝色把RED: [ 181, 45, 26 ],改成类似RED: [ 10, 10, 220 ],即可。需要说明的是config/目录是游戏运行时生成的用户配置目录不随仓库源码分发其中type字段为colordef的 JSON 结构与 data/raw/colors.json 完全一致。同时游戏内置了非常方便的颜色管理器Color manager内置了多套预设配色主题可以在游戏内轻松切换。这些预设主题存放在仓库的 data/raw/color_themes/ 目录中包括但不限于base_colors-default.json默认主题base_colors-dark.json、base_colors-white.json、base_colors-green.json、base_colors-abyss.jsonbase_colors-catppuccin.json、base_colors-kanagawa.json、base_colors-gruvbox.json、base_colors-one-dark.json、base_colors-solarized.json、base_colors-iceberg.jsonbase_colors-high-contrast.json、base_colors-12bit-rainbow.json、base_colors-blood_moon.json等每个文件都以type: colordef开头定义 16 个基础颜色的 RGB 三元组可作为自定义配色的参考模板。GUI 颜色ImGui 界面颜色UI 菜单**并不总是**遵循上面的基础颜色自定义它们可以单独定制。当前使用的样式保存在config/imgui_style.json中。该文件只是半永久的——当你在游戏内选择不同样式时它会被覆盖。若要永久保存自定义样式请在config文件夹中创建一个custom_styles子文件夹并把样式文件的副本放进去。默认配置为{ inherit_base_colors: false, colors: { } }把inherit_base_colors改为true可以让 ImGui 菜单遵循基础颜色主题并附带一些合理的默认值。不过你也可以以更高的保真度微调具体元素的颜色且不必局限于 8 色调色板——只需在colors对象中指定对应元素与颜色即可例如{ 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] } }映射中的键是 ImGui 库提供的枚举名其含义通常显而易见或凭直觉即可理解也就是说目前没有针对它们的显式文档。值是[red, green, blue, opacity]四元组各分量取值范围为0.0到1.0含端点同时也接受[red, green, blue]三元组此时透明度默认取1.0完全不透明。上面片段中的数值就是游戏使用的默认 ImGui 主题因此把这套配置复制粘贴到自己的config/imgui_style.json中视觉效果与空配置完全一致——可以作为你微调的参考基准。此外你可以在游戏内的imgui playground中实时调整具体数值路径游戏主菜单 → imgui Demo Screen → Configuration → Style → Colors调整满意后可以一键Export导出色值再放进imgui_style.json配置中使用非常方便。小结Cataclysm-DDA 的颜色体系分为两层数据层JSON 中的Prefix_Foreground_Background字符串、color_文本标签以及data/raw/下的默认色板、颜色主题与颜色规则模板和用户层运行时生成的config/base_colors.json与config/imgui_style.json。前者决定了游戏世界如何被着色后者决定了玩家屏幕上的最终观感。理解color_from_string()、bgcolor_from_string()、get_color_from_tag()等底层解析逻辑见 src/color.cpp有助于在编写 mod 时准确预测颜色行为避免踩到废弃前缀、默认回退值等细节坑。【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门