fix: 审计差距①④⑤⑦四件落地(底栏85定高+特性行限宽截断/结算两列账行+DIM_NIGHT压暗0.62/0.6+紧凑钮/标题屏主操作语义对齐demo/E5爆破带回滚magic族)+danger_button min_w参数化(放弃90宽)——轻闸冒烟782/0+probe_gate --click全绿;两探针适配两列账行(ui_probe _gp_val/ui_click_probe 名值拼串);ui_audit_probe.gd.uid 侧车补提交

This commit is contained in:
DKChan committed 2026-10-06 06:56:14 +08:00
1 parent 4336fd26bc
commit 58e8903a3c
7 files changed
+101 -33

No files matched your search

+5 -2
View File
@@ -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)
# 组帽·营地与系统
+70 -17
View File
@@ -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)
+14 -5
View File
@@ -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:
+8 -6
View File
@@ -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)))
+1
View File
@@ -0,0 +1 @@
uid://ddqhkbsad4wno
+1 -1
View File
@@ -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() == "":
+2 -2
View File
@@ -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():