From 58e8903a3ca1d8aadc9d9d21095a82cf6f47ef9d Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 06:56:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=A1=E8=AE=A1=E5=B7=AE=E8=B7=9D?= =?UTF-8?q?=E2=91=A0=E2=91=A3=E2=91=A4=E2=91=A6=E5=9B=9B=E4=BB=B6=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=EF=BC=88=E5=BA=95=E6=A0=8F85=E5=AE=9A=E9=AB=98+?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E8=A1=8C=E9=99=90=E5=AE=BD=E6=88=AA=E6=96=AD?= =?UTF-8?q?/=E7=BB=93=E7=AE=97=E4=B8=A4=E5=88=97=E8=B4=A6=E8=A1=8C+DIM=5FN?= =?UTF-8?q?IGHT=E5=8E=8B=E6=9A=970.62/0.6+=E7=B4=A7=E5=87=91=E9=92=AE/?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=B1=8F=E4=B8=BB=E6=93=8D=E4=BD=9C=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=E5=AF=B9=E9=BD=90demo/E5=E7=88=86=E7=A0=B4=E5=B8=A6?= =?UTF-8?q?=E5=9B=9E=E6=BB=9Amagic=E6=97=8F=EF=BC=89+danger=5Fbutton=20min?= =?UTF-8?q?=5Fw=E5=8F=82=E6=95=B0=E5=8C=96=EF=BC=88=E6=94=BE=E5=BC=8390?= =?UTF-8?q?=E5=AE=BD=EF=BC=89=E2=80=94=E2=80=94=E8=BD=BB=E9=97=B8=E5=86=92?= =?UTF-8?q?=E7=83=9F782/0+probe=5Fgate=20--click=E5=85=A8=E7=BB=BF?= =?UTF-8?q?=EF=BC=9B=E4=B8=A4=E6=8E=A2=E9=92=88=E9=80=82=E9=85=8D=E4=B8=A4?= =?UTF-8?q?=E5=88=97=E8=B4=A6=E8=A1=8C=EF=BC=88ui=5Fprobe=20=5Fgp=5Fval/ui?= =?UTF-8?q?=5Fclick=5Fprobe=20=E5=90=8D=E5=80=BC=E6=8B=BC=E4=B8=B2?= =?UTF-8?q?=EF=BC=89=EF=BC=9Bui=5Faudit=5Fprobe.gd.uid=20=E4=BE=A7?= =?UTF-8?q?=E8=BD=A6=E8=A1=A5=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/ui_assembler.gd | 7 +- game/presentation/views/battle_end_overlay.gd | 87 +++++++++++++++---- game/presentation/views/level_map_screen.gd | 19 ++-- game/presentation/views/ui_kit.gd | 14 +-- game/smoke/ui_audit_probe.gd.uid | 1 + game/smoke/ui_click_probe.gd | 2 +- game/smoke/ui_probe.gd | 4 +- 7 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 game/smoke/ui_audit_probe.gd.uid diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index 602f2d21..b2efcfba 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -138,11 +138,14 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: # 组帽·冒险(M2 分组) box.add_child(UiKit.label("── 冒 险 ──",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT)) # 唯一试玩入口 = 正式「开始冒险」(三关序列);单关测试直入口(L2/L3)退役(2026-09-23 用户拍板) - var resumebtn := UiKit.button("▶ 继续上局") # 迭代 8 卡②——有断点才亮(可见性与关数文案归组合根刷新) + var resumebtn := UiKit.primary_button("▶ 继续上局") # 迭代 8 卡②——有断点才亮(可见性与关数文案归组合根刷新);主操作钮=审计差距⑤对齐 demo resumebtn.tooltip_text = "自最近停点恢复" resumebtn.visible = false box.add_child(resumebtn) - var lvbtn := UiKit.primary_button("▶ 开始冒险", "三关连探:地精洞窟 → 幽暗地域 → 灰矮人矿城") + # 主操作语义对齐 demo(2026-10-06 审计差距⑤——有档时「继续上局」才是首动作=主黄钮, + # 「开始冒险」=常规石钮;tooltip 保留) + var lvbtn := UiKit.button("▶ 开始冒险") + lvbtn.tooltip_text = "三关连探:地精洞窟 → 幽暗地域 → 灰矮人矿城" box.add_child(lvbtn) # 组帽·营地与系统 diff --git a/game/presentation/views/battle_end_overlay.gd b/game/presentation/views/battle_end_overlay.gd index 445873cf..978631ef 100644 --- a/game/presentation/views/battle_end_overlay.gd +++ b/game/presentation/views/battle_end_overlay.gd @@ -15,10 +15,16 @@ const COL_WARM := UiKit.WARM var _dim: ColorRect var _seal: Panel var _verdict: Label -var _rows_box: VBoxContainer # M9 三行账(GP/钥石/本关加成——demo ⑧;失败侧整行隐藏=P-C4 维持 OQ14) -var _gp_row: Label -var _ks_row: Label -var _bonus_row_l: Label +var _rows_box: VBoxContainer # M9 三行账(GP/钥石/本关加成——demo ⑧两列对齐 2026-10-06 审计差距④;失败侧整行隐藏=P-C4 维持 OQ14) +var _gp_row: HBoxContainer +var _gp_name: Label +var _gp_val: Label +var _ks_row: HBoxContainer +var _ks_name: Label +var _ks_val: Label +var _bonus_row_l: HBoxContainer +var _bonus_name: Label +var _bonus_val: Label var _cele: TextureRect # M9 庆祝立绘(idle 占位浮动——正式帧待资产批) var _btn: Button var _board_rect := Rect2() @@ -75,20 +81,32 @@ func _init() -> void: _rows_box.add_theme_constant_override("separation", 6) _rows_box.visible = false box.add_child(_rows_box) - _gp_row = UiKit.label("",UiKit.FS_SUB, true, UiKit.GOLD_DEEP) - _gp_row.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + # 两列对齐账行(审计差距④对齐 demo ⑧——项目名左/数值右,定宽 360) + _gp_row = _ledger_row() + _gp_name = _ledger_name(UiKit.FS_SUB, UiKit.GOLD_DEEP, true) + _gp_val = _ledger_value(UiKit.FS_SUB, UiKit.GOLD_DEEP, true) + _gp_row.add_child(_gp_name) + _gp_row.add_child(_gp_val) _rows_box.add_child(_gp_row) - _ks_row = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_LABEL) - _ks_row.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _ks_row = _ledger_row() + _ks_name = _ledger_name(UiKit.FS_BODY, UiKit.INK_LABEL, false) + _ks_val = _ledger_value(UiKit.FS_BODY, UiKit.INK_LABEL, true) + _ks_row.add_child(_ks_name) + _ks_row.add_child(_ks_val) _ks_row.visible = false _rows_box.add_child(_ks_row) - _bonus_row_l = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_LABEL) - _bonus_row_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _bonus_row_l = _ledger_row() + _bonus_name = _ledger_name(UiKit.FS_HINT, UiKit.INK_LABEL, false) + _bonus_val = _ledger_value(UiKit.FS_HINT, UiKit.INK_LABEL, true) + _bonus_row_l.add_child(_bonus_name) + _bonus_row_l.add_child(_bonus_val) _bonus_row_l.visible = false _rows_box.add_child(_bonus_row_l) box.add_child(HSeparator.new()) # M9:明细回看钮退役(P-C7——冒险中回看归「生涯」) _btn = UiKit.primary_button("继续") + _btn.size_flags_horizontal = Control.SIZE_SHRINK_CENTER # 审计差距④——紧凑钮(原全宽) + _btn.custom_minimum_size.x = 150 _btn.pressed.connect(_emit_continue_pressed) box.add_child(_btn) visible = false @@ -99,14 +117,14 @@ func _init() -> void: # 传入(入账次序 = LevelRunner 入账先于组合根 handler,runner.gp 即战后总量);空串 = 不显示(失败侧恒空)。 func open_victory(verdict_line: String, continue_label: String, board_rect: Rect2, gp_summary: String = "", ks_summary: String = "", bonus_summary: String = "", gp_gain := -1, gp_total := -1) -> void: - _dim.color = Color(COL_WARM, 0.28) + _dim.color = Color(UiKit.DIM_NIGHT, 0.62) # 审计差距④——全屏压暗对齐 demo(原 0.28 暖纱透底) _verdict.text = verdict_line _seal.visible = true # 胜利徽记(面板头部静态) _seal.modulate = Color.WHITE - _gp_row.text = gp_summary - _ks_row.text = ks_summary + _set_ledger_row(_gp_name, _gp_val, gp_summary, true) # GP 行=固定名「战利品 GP」(滚动/整串均只入值列) + _set_ledger_row(_ks_name, _ks_val, ks_summary) _ks_row.visible = ks_summary != "" - _bonus_row_l.text = bonus_summary + _set_ledger_row(_bonus_name, _bonus_val, bonus_summary) _bonus_row_l.visible = bonus_summary != "" _rows_box.visible = gp_summary != "" or ks_summary != "" or bonus_summary != "" _btn.text = continue_label @@ -125,7 +143,7 @@ func open_victory(verdict_line: String, continue_label: String, board_rect: Rect func open_defeat(verdict_line: String, continue_label: String, board_rect: Rect2) -> void: # 明度不变的暮蓝色相氛围(全屏唯一暮蓝档——§2.5 最静一拍) - _dim.color = Color(COL_DUSK, 0.45) + _dim.color = Color(COL_DUSK, 0.6) # 审计差距④同族压暗(原 0.45) _verdict.text = verdict_line _board_rect = board_rect visible = true @@ -153,6 +171,41 @@ func verdict_text() -> String: return _verdict.text +# 两列账行工厂(审计差距④——名左/值右,定宽 360) +func _ledger_row() -> HBoxContainer: + var r := HBoxContainer.new() + r.custom_minimum_size = Vector2(360, 0) + return r + + +func _ledger_name(size: int, col: Color, _bold: bool) -> Label: + var l := UiKit.label("", size, true, col) + l.size_flags_horizontal = Control.SIZE_EXPAND_FILL + return l + + +func _ledger_value(size: int, col: Color, bold: bool) -> Label: + return UiKit.label("", size, bold, col) + + +# 拆名/值(组合根传入整串):gp_shape=固定名「战利品 GP」值取余串;其余行按「:」或「 · 」切; +# 无分隔符=整串入值列、名空 +func _set_ledger_row(name_l: Label, val_l: Label, s: String, gp_shape := false) -> void: + if gp_shape and s.begins_with("战利品 GP"): + name_l.text = "战利品 GP" + val_l.text = s.substr(6).strip_edges() + return + var sep := s.find(":") + if sep < 0: + sep = s.find(" · ") + if sep >= 0: + name_l.text = s.substr(0, sep) + val_l.text = s.substr(sep).strip_edges() + else: + name_l.text = "" + val_l.text = s + + func _fx_center() -> Vector2: return get_viewport_rect().size * 0.5 @@ -254,11 +307,11 @@ func _play_victory_dust() -> void: # M9 GP 行数字滚动(demo ⑧——0.8s 三次缓出;减动效直出终值) func _roll_gp(gp_gain: int, gp_total: int) -> void: if UiKit.motion_scale < 1.0: - _gp_row.text = "战利品 GP +%d · 合计 %d" % [gp_gain, gp_total] + _gp_val.text = "+%d · 合计 %d" % [gp_gain, gp_total] return var tw := create_tween() tw.tween_method(func(v: float) -> void: - _gp_row.text = "战利品 GP +%d · 合计 %d" % [roundi(gp_gain * v), gp_total], + _gp_val.text = "+%d · 合计 %d" % [roundi(gp_gain * v), gp_total], 0.0, 1.0, UiKit.motion(0.8)).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 4f6bbdc3..fd9e31de 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -121,7 +121,11 @@ func _init() -> void: # 底部状态栏(M5 合并单条:亮米面板一站读齐=头像+生命+属性+本关加成/流派件——demo ④; # 道具槽不摆=道具读数无关卡画面成文出口(读快照私域越权),随 runner 出口批补——台账 352 注记; # _hp_value/_attr_value/_bonus_value/_feat_value 投喂键全部保留) + # 底栏定高纪律(2026-10-06 审计差距①对齐 demo——单条 ~85px 紧凑亮条;任何子件不再能把栏撑爆: + # 特性持有行限宽截断+tooltip 全文,旧「autowrap 无限宽→最小高度逐字竖排爆栏」形态根除) var bottom := PanelContainer.new() + bottom.custom_minimum_size = Vector2(0, 85) + bottom.size_flags_vertical = Control.SIZE_SHRINK_END bottom.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.MAP_BAR_PLATE, UiKit.CAMP_HEADER_BAND, 0, 2, Vector4(12, 6, 12, 6))) box.add_child(bottom) @@ -165,18 +169,22 @@ func _init() -> void: _bonus_row.add_child(bonus_box) var bonus_inner := VBoxContainer.new() bonus_box.add_child(bonus_inner) - var bonus_cap := UiKit.label("特性",UiKit.FS_CAPTION, false, UiKit.WARM_SOFT) + var bonus_cap := UiKit.label("特性",UiKit.FS_CAPTION, false, UiKit.INK_HINT) # 淡墨→深墨(亮板可读,审计差距①) bonus_inner.add_child(bonus_cap) - _bonus_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.WARM) + _bonus_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_TITLE) # 淡墨→深墨(同上) bonus_inner.add_child(_bonus_value) # 特性持有行(迭代 12 呈现补齐 2026-10-04——用户反馈关卡选择页看不到局内奖励;组合根投喂) - _feat_value = UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM_SOFT) - _feat_value.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + # 审计差距①修(2026-10-06):限宽单行截断+tooltip 全文(旧 autowrap 无限宽=爆栏元凶); + # 墨色 WARM_SOFT→INK_HINT(暖白系对亮板 ≈1:1 不可读——§7.2 违例修复) + _feat_value = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_HINT) + _feat_value.custom_minimum_size = Vector2(240, 0) + _feat_value.clip_text = true + _feat_value.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS bonus_box.add_child(_feat_value) var spacer := Control.new() spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL strip.add_child(spacer) - abandon_btn = UiKit.danger_button("放弃") # 打磨包 2026-09-29 文案 + M5 危险钮皮(M10 公共件) + abandon_btn = UiKit.danger_button("放弃", "", 90.0) # 审计差距①对齐 demo:小号危险钮 ~90×38(原 216 宽砖);打磨包 2026-09-29 文案 + M5 危险钮皮 abandon_btn.pressed.connect(_on_abandon_pressed) abandon_btn.visible = false strip.add_child(abandon_btn) @@ -211,6 +219,7 @@ func _draw_hp_bar(bar: Control) -> void: # 特性持有投影(迭代 12 呈现补齐——组合根投喂聚合文案;空文案=行隐藏) func set_feat_holdings(text: String) -> void: _feat_value.text = text + _feat_value.tooltip_text = text # 截断全量兜底(限宽单行省略——悬停看全文) func set_abandon_available(v: bool) -> void: diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 82973d64..48995cd2 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -52,14 +52,15 @@ 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 归回复族) +# 类型色带分族判定(N4c/Q4 甲——三选一与商店货架同源同判:id/kind 小写子串匹配,默认=通用增益带。 +# E5 回滚 2026-10-06:审计实证 demo「工兵爆破」卡=紫带(magic 族)——blast 归回 TG_MAGIC, +# TG_AOE 只接 aoe 键(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"): + if id_lower.contains("aoe"): return TG_AOE - if id_lower.contains("magic"): + if id_lower.contains("blast") or id_lower.contains("magic"): return TG_MAGIC if id_lower.contains("pierce"): return TG_PIERCE @@ -83,6 +84,7 @@ const FOG_OUTLINE := Color8(30, 24, 18) # 雾面轮廓墨(原 board_ 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 DIM_NIGHT := Color8(24, 18, 12) # 终局压暗底 #18120C(demo 结算仪式暗纱——胜利侧 dim 基色) const WARM := Color8(240, 226, 200) # 暖白(暗底正文) const WARM_SOFT := Color8(232, 213, 168) # 暖白次级(说明文)#E8D5A8(M0 换代——灰米 #C8BCA6 退役,配色总纲「米色去灰」) @@ -435,8 +437,8 @@ static func primary_button(text: String, tip := "") -> Button: # 危险钮(深红平涂——放弃/删除类;破坏性确认位置纪律=不得与常规确认同位) -static func danger_button(text: String, tip := "") -> Button: - var b := button(text) +static func danger_button(text: String, tip := "", min_w := 216.0) -> Button: + var b := button(text, min_w) var sb := panel_flat(Color8(180, 78, 54), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)) b.add_theme_stylebox_override("normal", sb) b.add_theme_stylebox_override("hover", panel_flat(Color8(196, 90, 62), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))) diff --git a/game/smoke/ui_audit_probe.gd.uid b/game/smoke/ui_audit_probe.gd.uid new file mode 100644 index 00000000..d90c0c00 --- /dev/null +++ b/game/smoke/ui_audit_probe.gd.uid @@ -0,0 +1 @@ +uid://ddqhkbsad4wno diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index ceb060c1..0fa541e2 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -249,7 +249,7 @@ func _ready() -> void: # 卡⑥ 战斗胜利总结结算框(真实信号路径——每场普通胜利到达):断言已拍板面后点「下一节点」 if not main._input_locked(): _problems.append("胜利结算框打开时输入未锁定") - var gp_line: String = main._end_overlay._gp_row.text + var gp_line: String = "%s %s" % [main._end_overlay._gp_name.text, main._end_overlay._gp_val.text] # 两列账行(审计差距④)——名/值列拼回整串断言 if not gp_line.contains("GP +%d" % main._last_gain_amount) or not gp_line.contains("合计 %d" % int(main.runner.gp)): _problems.append("胜利结算框 GP 增量/总量与钱包实态不符(%s|实态 +%d/%d)" % [gp_line, main._last_gain_amount, int(main.runner.gp)]) if main._end_overlay.verdict_text() == "": diff --git a/game/smoke/ui_probe.gd b/game/smoke/ui_probe.gd index f09dab87..eed02c8a 100644 --- a/game/smoke/ui_probe.gd +++ b/game/smoke/ui_probe.gd @@ -222,8 +222,8 @@ func _ready() -> void: main.meta = meta_saved if not main._end_overlay.is_open(): problems.append("冒险终局面板未开(合成摘要路径)") - elif not main._end_overlay._gp_row.visible or not main._end_overlay._gp_row.text.contains("57"): - problems.append("终局面板 GP 行缺失或取数不对(%s)" % main._end_overlay._gp_row.text) + elif not main._end_overlay._gp_row.visible or not main._end_overlay._gp_val.text.contains("57"): + problems.append("终局面板 GP 行缺失或取数不对(%s)" % main._end_overlay._gp_val.text) main._end_overlay.close() main._close_modal(main._end_overlay) if problems.is_empty():