diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index 1fe1f26d..bfb75afb 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -128,7 +128,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: box.add_theme_constant_override("separation", 10) pad.add_child(box) - var title := UiKit.label("Dungeon Sweeper", 40, true, Color8(246, 238, 218)) + var title := UiKit.label("Dungeon Sweeper", 40, true, UiKit.INK_ON_DEEP) box.add_child(title) var sub := UiKit.label("扫雷的因 · 逐行兑现的果", 16, false, UiKit.WARM_SOFT) box.add_child(sub) @@ -188,7 +188,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: foe_row.add_child(tr) stage.add_child(foe_row) var pedestal := Panel.new() - var ped_sb := UiKit.panel_flat(Color8(90, 74, 56), Color8(58, 46, 34), 17, 2) + var ped_sb := UiKit.panel_flat(UiKit.TITLE_PEDESTAL, UiKit.BG_ROOT, 17, 2) pedestal.add_theme_stylebox_override("panel", ped_sb) pedestal.custom_minimum_size = Vector2(240, 22) pedestal.size_flags_horizontal = Control.SIZE_SHRINK_CENTER diff --git a/game/presentation/views/ap_bar_view.gd b/game/presentation/views/ap_bar_view.gd index 9a6a2e62..a531390b 100644 --- a/game/presentation/views/ap_bar_view.gd +++ b/game/presentation/views/ap_bar_view.gd @@ -239,8 +239,8 @@ class Dot: extends Control var px := 10.0 var lit := false - var lit_color := Color8(246, 198, 103) - var core_color := Color8(248, 226, 168) + var lit_color := UiKit.CANDLE + var core_color := UiKit.RAP_DOT_CORE_WARM var off_color := UiKit.DOT_OFF func _init(p: float, rap := false) -> void: px = p @@ -248,8 +248,8 @@ class Dot: size_flags_vertical = Control.SIZE_SHRINK_CENTER if rap else Control.SIZE_FILL mouse_filter = Control.MOUSE_FILTER_IGNORE if rap: - lit_color = Color8(105, 161, 232) - core_color = Color8(156, 194, 240) + lit_color = UiKit.RAP_DOT_LIT_BLUE + core_color = UiKit.RAP_DOT_CORE_BLUE func _draw() -> void: draw_rect(Rect2(Vector2.ZERO, Vector2(px, px)), lit_color if lit else off_color) if lit: diff --git a/game/presentation/views/battle_end_overlay.gd b/game/presentation/views/battle_end_overlay.gd index 04178636..c565a787 100644 --- a/game/presentation/views/battle_end_overlay.gd +++ b/game/presentation/views/battle_end_overlay.gd @@ -239,7 +239,7 @@ func _play_victory_dust() -> void: var c := _fx_center() for i in 10: var mote := ColorRect.new() - mote.color = Color8(246, 198, 103) + mote.color = UiKit.CANDLE mote.size = Vector2(5, 5) mote.mouse_filter = Control.MOUSE_FILTER_IGNORE mote.position = c + Vector2((float(i % 5) - 2.0) * 44.0, -40.0 - 10.0 * float(i / 5)) diff --git a/game/presentation/views/board_cell_unit.gd b/game/presentation/views/board_cell_unit.gd index 6fb8e04e..113e93cf 100644 --- a/game/presentation/views/board_cell_unit.gd +++ b/game/presentation/views/board_cell_unit.gd @@ -76,7 +76,6 @@ const PROJECTION_EDGE_COL := Color(0, 0, 0, 0.06) # 投影远段(渐隐收 # 直贴零暗档零阴影〔用户终裁「它们是同样颜色的」〕;墙脚阴线只画地面/墙面交界;(b)-(c) 交界 # 无边框由 BoardView 侧跳过墙格北向描边承载)── const E_FACADE_FRAC := 0.30 # 墙面承接高(格边比——用户指令 30%) -const E_FACADE_FOOT_COL := Color8(52, 42, 32) # 墙脚阴线(方向稿同色) # ── 素材槽位(本批全 null = 程序化占位服役;art-bible §8.2 格面 32×32 暂定档)── var tex_base: Texture2D = null # ① 砖面底 var tex_mutation: Texture2D = null # ② 变异纹带 @@ -111,8 +110,6 @@ var mutation_mark := "": # ── 视野迷雾呈现态(迭代 11 第④批 T2/T3——纯呈现零逻辑;规格=art-bible §6.5 v3.5,正主=HUD框架「视野迷雾」节)── # 0=正常(灯光区内)/ 1=全黑(区外未开格——正主「区外未开格=全黑不渲染」不透明档)/ 2=记忆态(区外已开格灰显可读) -const FOG_MEMORY_PLATE := Color8(58, 58, 58) # 记忆板 #3A3A3A(区外已开格素色压平——provisional 自检锚,§6.5) -const FOG_MEMORY_INK := Color8(196, 196, 196) # 记忆墨 #C4C4C4(数字记忆态直画——对记忆板 ≈6.3:1 ≥4.5:1,§6.5) var fog_state := 0: set(v): if fog_state != v: @@ -135,7 +132,7 @@ func _draw() -> void: # 坐标推导:各边内贴 2px 矩形,相邻边矩形全长相交=周界闭合) if not outline_sides.is_empty(): var ow := 2.0 - var oc := Color8(30, 24, 18) + var oc := UiKit.FOG_OUTLINE for b in outline_sides: var or_ := Rect2() match int(b): @@ -257,9 +254,9 @@ func _draw() -> void: if fog_state == 1: draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), Color(0, 0, 0, 1.0), true) elif fog_state == 2: - draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), FOG_MEMORY_PLATE, true) + draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), UiKit.FOG_MEMORY_PLATE, true) if glyph != "": - _draw_glyph(glyph, FOG_MEMORY_INK, maxi(18, int(ceil(edge * 0.5)))) # 字号下限 18(§7.4 冻结公式同源) + _draw_glyph(glyph, UiKit.FOG_MEMORY_INK, maxi(18, int(ceil(edge * 0.5)))) # 字号下限 18(§7.4 冻结公式同源) # ⑦ 中立移除退色层(迭代 13 T8/D6——P2 甲退色降档:暗幕压顶全层覆盖,暗淡记忆态同族呈现语义; # 顶层于迷雾之上——移除格不再参与迷雾语义。本实现移除集=未揭示雷格(无数字无旗印)) if removed_dim: @@ -305,7 +302,7 @@ func _draw_e_facade() -> void: var ts := tex_facade.get_size() draw_texture_rect_region(tex_facade, Rect2(0.0, y0, edge, strip_h), Rect2(0.0, 0.0, ts.x, ts.y * E_FACADE_FRAC)) - draw_rect(Rect2(0.0, y0, edge, 1.0), E_FACADE_FOOT_COL, true) + draw_rect(Rect2(0.0, y0, edge, 1.0), UiKit.E_FACADE_FOOT_COL, true) # 文字位绘制:水平居中 + 垂直居中(基线 = (格高 − 字高)/2 + 上伸部——旧 Button 居中对齐等价) diff --git a/game/presentation/views/board_zone_view.gd b/game/presentation/views/board_zone_view.gd index f8e4832f..efa4208c 100644 --- a/game/presentation/views/board_zone_view.gd +++ b/game/presentation/views/board_zone_view.gd @@ -45,7 +45,7 @@ func _init() -> void: # 旧 chord 一次性 toast 提示退役归此常驻条;审计第 7 条用户批) var hint := PanelContainer.new() hint.add_theme_stylebox_override("panel", UiKit.panel_flat( - Color(0.09, 0.07, 0.05, 0.82), Color8(74, 62, 48), 0, 1, Vector4(12, 2, 12, 2))) + Color(0.09, 0.07, 0.05, 0.82), UiKit.HINT_STRIP_EDGE, 0, 1, Vector4(12, 2, 12, 2))) hint.size_flags_horizontal = Control.SIZE_SHRINK_CENTER hint.mouse_filter = Control.MOUSE_FILTER_IGNORE vb.add_child(hint) diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index b5fd68da..decd511e 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -330,7 +330,7 @@ func _build_forge_row(holder: VBoxContainer, row: Dictionary) -> Dictionary: var name_l := UiKit.label("%s %+d/级" % [String(row.get("display_name", "")), int(row.get("flat", 0))], 14, true, UiKit.INK) name_l.custom_minimum_size = Vector2(112, 0) line.add_child(name_l) - var level_l := UiKit.label("", 13, true, Color8(246, 238, 218)) + var level_l := UiKit.label("", 13, true, UiKit.INK_ON_DEEP) # M3:Lv 章化(木底小章——demo lvtag;Label normal 槽挂样式盒) level_l.add_theme_stylebox_override("normal", UiKit.panel_flat(UiKit.CAMP_HEADER_BAND, Color(0, 0, 0, 0), 2, 0, Vector4(6, 0, 6, 0))) level_l.custom_minimum_size = Vector2(44, 0) diff --git a/game/presentation/views/curio_pick_overlay.gd b/game/presentation/views/curio_pick_overlay.gd index 9a03e3a9..9238f696 100644 --- a/game/presentation/views/curio_pick_overlay.gd +++ b/game/presentation/views/curio_pick_overlay.gd @@ -93,13 +93,7 @@ func open_pick(header: String, cards: Array) -> void: var title := lines[0] var desc := "\n".join(lines.slice(1)) if lines.size() > 1 else "" var idl := cid.to_lower() - var band := Color8(194, 178, 100) # 通用增益(默认——§4.2 类型微光族色) - if idl.contains("heal"): - band = Color8(102, 164, 87) - elif idl.contains("magic") or idl.contains("blast"): - band = Color8(138, 114, 196) - elif idl.contains("pierce"): - band = Color8(87, 160, 160) + var band := UiKit.tg_band(idl) # 类型色带单点(N4c 2026-10-06——TG_* 五族同源判定;aoe/blast 归 TG_AOE) var card := UiKit.bcard(title, desc, band, _icon_for_id(idl)) card.gui_input.connect(func(ev: InputEvent) -> void: if ev is InputEventMouseButton and ev.pressed and ev.button_index == MOUSE_BUTTON_LEFT: diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index c94d19be..df4cc82e 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -34,7 +34,6 @@ const NODE_TYPE_NAMES := {"battle": "战斗", "reward": "奖励", "rest": "休 const TEX_NODE_ICONS := {"battle": UiKit.TEX_NODE_BATTLE, "reward": UiKit.TEX_NODE_REWARD, "rest": UiKit.TEX_NODE_REST, "boss": UiKit.TEX_NODE_BOSS, "shop": UiKit.TEX_NODE_SHOP} const NODE_ICON_PX := 20.0 # 节点图标边长(样张 v1 冻结——20px 烘焙 1:1 消费零缩放) -const ICON_TINT_ON_GOLD := Color(24.0 / 240.0, 20.0 / 226.0, 16.0 / 200.0) # 当前金底图标墨 = INK_ROUTE 乘法调制(双色墨制——暗底系 WARM 原色) const TITLE_ENTRY := "出发——选择首个节点" # 入口停点(布局决策 1——台账 143 遗留清偿) const TITLE_SINGLE := "继续前进" # 单链停点 const TITLE_FORK := "选择下一节点" # 岔路停点 @@ -124,7 +123,7 @@ func _init() -> void: # _hp_value/_attr_value/_bonus_value/_feat_value 投喂键全部保留) var bottom := PanelContainer.new() bottom.add_theme_stylebox_override("panel", - UiKit.panel_flat(Color8(240, 228, 200), UiKit.CAMP_HEADER_BAND, 0, 2, Vector4(12, 6, 12, 6))) + UiKit.panel_flat(UiKit.MAP_BAR_PLATE, UiKit.CAMP_HEADER_BAND, 0, 2, Vector4(12, 6, 12, 6))) box.add_child(bottom) var strip := HBoxContainer.new() strip.add_theme_constant_override("separation", 18) @@ -140,7 +139,7 @@ func _init() -> void: strip.add_child(face) var life_box := VBoxContainer.new() strip.add_child(life_box) - life_box.add_child(UiKit.label("生命", 11, false, Color8(110, 69, 52))) + life_box.add_child(UiKit.label("生命", 11, false, UiKit.INK_HINT)) _hp_value = UiKit.label("", 15, true, UiKit.INK_TITLE) life_box.add_child(_hp_value) _hp_bar = Control.new() @@ -150,7 +149,7 @@ func _init() -> void: strip.add_child(_vdiv()) var attr_box := VBoxContainer.new() strip.add_child(attr_box) - attr_box.add_child(UiKit.label("属性", 11, false, Color8(110, 69, 52))) + attr_box.add_child(UiKit.label("属性", 11, false, UiKit.INK_HINT)) _attr_value = UiKit.label("", 15, true, UiKit.INK_TITLE) attr_box.add_child(_attr_value) strip.add_child(_vdiv()) @@ -182,7 +181,7 @@ func _init() -> void: # 竖分隔线(M5 底栏分组线——亮面板上低对比细线) static func _vdiv() -> ColorRect: var v := ColorRect.new() - v.color = Color8(201, 184, 142) + v.color = UiKit.MAP_VDIV v.custom_minimum_size = Vector2(1, 44) return v @@ -457,7 +456,7 @@ func _draw_graph(canvas: Control) -> void: # 贴图缺位 → 字形回退=贴图在位字形退役惯例) var icon: Texture2D = _node_icons.get(t) if icon != null: - var tint := ICON_TINT_ON_GOLD if col == COL_ROOM_CURRENT else Color(1.0, 1.0, 1.0) + var tint := UiKit.ICON_TINT_ON_GOLD if col == COL_ROOM_CURRENT else Color(1.0, 1.0, 1.0) canvas.draw_texture_rect(icon, Rect2(p - Vector2(NODE_ICON_PX, NODE_ICON_PX) / 2.0, Vector2(NODE_ICON_PX, NODE_ICON_PX)), false, tint) else: diff --git a/game/presentation/views/settings_overlay.gd b/game/presentation/views/settings_overlay.gd index a38d507a..2ae64e1c 100644 --- a/game/presentation/views/settings_overlay.gd +++ b/game/presentation/views/settings_overlay.gd @@ -42,7 +42,7 @@ func _build() -> void: var title := UiKit.label("设置", 24, true, UiKit.INK_TITLE) title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(title) - var hint := UiKit.label("系统级设置——独立存储不随存档(一安装一份,删游戏才消失)", 13, false, Color8(110, 69, 52)) + var hint := UiKit.label("系统级设置——独立存储不随存档(一安装一份,删游戏才消失)", 13, false, UiKit.INK_HINT) hint.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(hint) box.add_child(HSeparator.new()) @@ -81,7 +81,7 @@ func _build() -> void: motion_row.add_child(_motion_btn) _motion_st = UiKit.label("完整", 14, true, UiKit.INK_LABEL) motion_row.add_child(_motion_st) - var why := UiKit.label("快速 = 时长减半(运动敏感 / 演示用)", 12, false, Color8(110, 69, 52)) + var why := UiKit.label("快速 = 时长减半(运动敏感 / 演示用)", 12, false, UiKit.INK_HINT) why.position.y = 0 box.add_child(why) diff --git a/game/presentation/views/shop_overlay_view.gd b/game/presentation/views/shop_overlay_view.gd index 7d01754d..c60429fb 100644 --- a/game/presentation/views/shop_overlay_view.gd +++ b/game/presentation/views/shop_overlay_view.gd @@ -186,7 +186,7 @@ func _build_shelf_card(holder: Control, c: Dictionary) -> Dictionary: icon_key = UiKit.TEX_ICON_POUCH var card := UiKit.bcard(String(c.get("display_name", kind)), "%s %+d(本冒险)" % [String(KIND_LABELS.get(kind, kind)), int(c.get("value", 0))], - Color8(194, 178, 100), icon_key, + UiKit.tg_band(kl), icon_key, # 类型色带单点(N4c/Q4 甲——货架与三选一同源判定,原固定默认带) "%d ◈" % int(c.get("price", 0)), String(KIND_LABELS.get(kind, kind))) var btn := UiKit.button("购买") btn.pressed.connect(_emit_shelf_buy.bind(kind)) diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index e285f1fd..c4e2c7d1 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -44,6 +44,44 @@ const HERO_BLUE_DEEP := Color8(30, 90, 150) # 小人蓝同族深档(意图 const BOSS_PURPLE := Color8(143, 47, 106) # 紫赤(Boss 专属) const DEBUFF_PURPLE := Color8(122, 66, 148) # 妨害紫(意图 ☠) +# ── 类型色五族(UI 设计对齐批 N4c 2026-10-06——值 = demo --tg-* 冻结抄录〔任务书 §2.2 抄录表〕; +# 前四族 = 实机现值搬运、第五族群伤 demo 值补族——实机原完全缺位,消费面 = tg_band() 同源判定)── +const TG_BUFF := Color8(194, 178, 100) # 通用增益/默认带 +const TG_HEAL := Color8(102, 164, 87) # 回复 +const TG_MAGIC := Color8(138, 114, 196) # 魔法 +const TG_PIERCE := Color8(87, 160, 160) # 穿甲 +const TG_AOE := Color8(226, 86, 118) # 群伤/AOE #E25676(demo --tg-aoe) + +# 类型色带分族判定(N4c/Q4 甲——三选一与商店货架同源同判:id/kind 小写子串匹配,默认=通用增益带; +# blast=爆裂群伤归 TG_AOE(reward.tres 现成 clear_blast/spark_aoe 消费面);max_hp 含 hp 归回复族) +static func tg_band(id_lower: String) -> Color: + if id_lower.contains("heal") or id_lower.contains("hp"): + return TG_HEAL + if id_lower.contains("aoe") or id_lower.contains("blast"): + return TG_AOE + if id_lower.contains("magic"): + return TG_MAGIC + if id_lower.contains("pierce"): + return TG_PIERCE + return TG_BUFF + +# ── 呈现散件裸色搬运(UI 设计对齐批 N4a 2026-10-06——原值搬运零观感;本节立后 ui_kit 之外 +# 呈现层裸 Color8 = 0,守卫 = ui_contrast_probe 静态段)── +const INK_HINT := Color8(110, 69, 52) # 提示/警示暖棕墨(设置警示文/地图底栏组标) +const INK_ON_DEEP := Color8(246, 238, 218) # 深底标题亮墨(主菜单标题/营地柜台等级章字) +const TITLE_PEDESTAL := Color8(90, 74, 56) # 标题屏底座石台面(椭圆 17 底座;描边=BG_ROOT) +const MAP_BAR_PLATE := Color8(240, 228, 200) # 关卡地图底栏亮板 +const MAP_VDIV := Color8(201, 184, 142) # 关卡地图底栏竖分隔线(1px) +const HINT_STRIP_EDGE := Color8(74, 62, 48) # 棋盘底提示条描边(半透明罩层板边) +const RAP_DOT_CORE_WARM := Color8(248, 226, 168) # AP 点阵亮心(烛光黄族) +const RAP_DOT_LIT_BLUE := Color8(105, 161, 232) # RAP 点阵亮面(小人蓝族) +const RAP_DOT_CORE_BLUE := Color8(156, 194, 240) # RAP 点阵亮心(小人蓝族) +const E_FACADE_FOOT_COL := Color8(52, 42, 32) # 墙脚阴线(方向稿同色——原 board_cell_unit 局部) +const FOG_MEMORY_PLATE := Color8(58, 58, 58) # 记忆板 #3A3A3A(§6.5——原 board_cell_unit 局部) +const FOG_MEMORY_INK := Color8(196, 196, 196) # 记忆墨 #C4C4C4(对记忆板 ≈6.3:1——原局部) +const FOG_OUTLINE := Color8(30, 24, 18) # 雾面轮廓墨(原 board_cell_unit _draw 局部 oc) +const ICON_TINT_ON_GOLD := Color(24.0 / 240.0, 20.0 / 226.0, 16.0 / 200.0) # 当前金底图标墨 = WARM 分量乘法调制(双色墨制——原 level_map_screen 局部) + const DUSK := Color8(90, 108, 140) # 暮蓝(全作唯一暮蓝档——失败终局) const WARM := Color8(240, 226, 200) # 暖白(暗底正文) diff --git a/game/smoke/ui_contrast_probe.gd b/game/smoke/ui_contrast_probe.gd index f7f26b93..866c8662 100644 --- a/game/smoke/ui_contrast_probe.gd +++ b/game/smoke/ui_contrast_probe.gd @@ -9,20 +9,9 @@ extends Node const MIN_RATIO := 4.5 # R1 过渡白名单:呈现层(ui_kit.gd 之外)允许的裸 Color8( 在册处——file→恰计数。 -# T0 实测全量=25 处/10 文件(任务书 N4a 普查 5 处系漏记);UI 设计对齐批 T4a 全量原值搬运收 ui_kit -# 后本表应为空表。新增裸取色 = 本闸红(先立常量再消费)。 -const BARE_COLOR8_WL := { - "res://presentation/views/board_cell_unit.gd": 4, # N4a:E_FACADE_FOOT_COL/FOG_MEMORY_PLATE/FOG_MEMORY_INK/oc - "res://presentation/views/level_map_screen.gd": 4, # N4a:ICON_TINT_ON_GOLD + 3 处(T0 普查补记) - "res://presentation/ui_assembler.gd": 3, - "res://presentation/views/ap_bar_view.gd": 4, - "res://presentation/views/battle_end_overlay.gd": 1, - "res://presentation/views/board_zone_view.gd": 1, - "res://presentation/views/camp_overlay_view.gd": 1, - "res://presentation/views/curio_pick_overlay.gd": 4, # F3 类型色内联四族(bonus_pick 随 15② 改名) - "res://presentation/views/settings_overlay.gd": 2, - "res://presentation/views/shop_overlay_view.gd": 1, # F3 货架卡固定默认值 -} +# T4a 已把 T0 实测全量 25 处/10 文件全部原值搬运收 ui_kit(2026-10-06)——本表应为空表; +# 新增裸取色 = 本闸红(先立常量再消费)。 +const BARE_COLOR8_WL := {} # 测点表:[名称, 墨色, 直背景, 墨α](语义见行尾;新增文字位随批入表,白名单豁免须注理由)