From 85ea024b3734aae06e084e7b240ee144910820c8 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 02:49:18 +0800 Subject: [PATCH 01/12] =?UTF-8?q?iter16ui=20T0=EF=BC=9A=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E9=87=8D=E6=B5=8B=E5=9B=9E=E5=A1=AB=EF=BC=88=E5=86=92=E7=83=9F?= =?UTF-8?q?782/0+run=5Fall=2016=E5=A5=97=E5=85=A8=E7=BB=BF+=E6=8E=A2?= =?UTF-8?q?=E9=92=88=E5=85=A8=E7=BB=BF+=E5=9B=9Bdoc=E9=97=B8=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF=E5=AE=9A=E6=80=A7+demo=20md5=E9=9B=B6=E6=BC=82?= =?UTF-8?q?=E7=A7=BB=EF=BC=89+=E4=BA=8B=E5=AE=9E=E8=A1=A815=E9=A1=B9?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=EF=BC=885=E6=9D=A1=E6=BC=82=E7=A7=BB?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0=EF=BC=89+=E4=B8=83=E7=82=B9=E5=AF=B9?= =?UTF-8?q?=E6=AF=94=E5=BA=A6=E5=AE=9E=E6=9C=BA=E5=A4=8D=E7=AE=97=EF=BC=88?= =?UTF-8?q?=E6=84=8F=E5=9B=BE/=E6=A7=BD=E4=BD=8D=E7=9B=B4=E8=83=8C?= =?UTF-8?q?=E4=B8=8Edemo=E5=8F=8D=E5=90=91=E4=BF=AE=E6=B3=95=E6=94=B9?= =?UTF-8?q?=E5=9E=AB=E7=89=8C=E6=B7=B1=E5=8C=96=E3=80=81RAP=E5=AE=9E?= =?UTF-8?q?=E6=9C=BA10.40=E5=B7=B2=E5=90=88=E8=A7=84=E9=9B=B6=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=EF=BC=89+15=E2=91=A1=E4=BA=A4=E9=9B=86=E9=9B=B6?= =?UTF-8?q?=E5=91=BD=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/qa/iter16-ui-exit-report-2026-10-06.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 design/qa/iter16-ui-exit-report-2026-10-06.md diff --git a/design/qa/iter16-ui-exit-report-2026-10-06.md b/design/qa/iter16-ui-exit-report-2026-10-06.md new file mode 100644 index 00000000..56a00def --- /dev/null +++ b/design/qa/iter16-ui-exit-report-2026-10-06.md @@ -0,0 +1,69 @@ +# 出口报告:UI 设计对齐批(迭代 16) + +> 任务书=[任务书-UI设计对齐批-2026-10-05.md](../research/任务书-UI设计对齐批-2026-10-05.md)(v1.0 定稿,P1-P11 裁决已齐)。 +> 本报告随卡渐进成文;T0 基线节随 T0 提交,其余节随各卡追加。 + +## T0 · 基线回填(2026-10-06 实测) + +### 环境与提交基线 + +- worktree=`D:/code/g-plan2-iter16ui`,分支 `iter16-ui-20261005`,起点=**a39d044**(master 3c6f2c9 + 第〇步纯文档批:迭代 16 改号=UI 设计对齐批、原四卡顺延迭代 17、UI 任务书 P1-P11 裁决落文,含五处陈旧待裁标记擦除)。 +- worktree 缺 gitignored 素材(`game/assets/art/` 不入 git)——已从主区整目录拷贝(磁盘本地、不入库、素材字节零改动);`artwork/` 不拷(Q9 丙禁回读 demo 文件)。 +- 冷刷导入一次(fresh worktree 一次性成本,uid_cache 建立)。 + +### 基线闸读数(全部实测,替代任务书起草读数) + +| 闸 | 读数 | 对照 | +|---|---|---| +| 冒烟 smoke_all | **782/0**(与 3c6f2c9 落籍读数一致) | §1.2 起草值 772/0 已过时 | +| run_all | **16 套全绿** | 起草值 14/15(reward_overlay 红)已过时——该红已随 15② 修复 | +| probe_gate --click | 全绿:ui_input 16 断言 PASS / ui_struct 全屏零红 / click done=true 问题=0 / 残留 Godot=0 | — | +| ui_layout_probe | exit=0(布局树 dump 工具,无断言失败形态) | — | +| gdd_lint | **既有 2 文件不通过**:06-待办清单(表格占比 1%)· 07-体验验证清单(表格占比 7%) | 基线,本批守零新增(不得出现第 3 个) | +| doc_link_audit | **既有死链 2 处**:奇物.md:130 → ../ux/battle.md、../ux/node-reward.md(master 既有在册);worktree 环境假红 2 处=06:121 `.zcode/plans` + 06:309 `archive/`(gitignored 目录 worktree 不存在,主区实存) | 基线 2 处,守零新增 | +| doc_term_audit | 退役词命中 218 处 / 疑似现行 3 处(与主区逐字一致) | 基线,守零新增 | +| 熵增闸 | design/diagrams 越界 ×1(双树一致,**既有在册归 archify 批**) | 基线,守零新增 | + +### demo md5 重核(Q9 丙留痕) + +`78ebbee0d9d4c1b5c902e6b8878c8800`(2026-10-06 主区实测)= 任务书 §2.2 抄录基线,**零漂移**;此后不再回读 demo 文件,取值一律以任务书 §2.2 抄录表为准。 + +### §2 事实表 15 项复核(全 15 项成立;漂移注记 5 条) + +| # | 结论 | +|---|---| +| F1-F5 | 全成立(行号逐一吻合:BG_ROOT:65/WARM_SOFT:48/PANEL_DATA:24/panel 8.0:286/button 8.0:327-331/frame 12.0:299/panel_skinned 8 消费+1 工厂) | +| F6 | 成立;**clampi 实际在 board_view.gd:254**(任务书 :251,+3 行漂移)——P2 丁案「零改动」不受影响 | +| F7 | 成立(terrain 三枚实测 32×32) | +| F8 | 成立且**读数增长**:UiKit.label 裸字号普查现值 103 处 15 档(11×6/12×9/13×14/14×15/15×15/16×18/17×2/18×4/20×4/21×1/22×5/24×3/26×3/32×1/40×1;起草 78 处口径已过时)——低于正文下限 16 的 11-15 档合计 59 处;另有 status_slot_row 内部 override 13px:67/10px:148 两处。T6 以本次普查为准逐处判定 | +| F9 | 成立;**RED_MINE 实值=#962C24**(Color8(150,44,36),任务书注 #96362C 系笔误;RED_DEEP=#963C30 注记正确);槽位字色行在 hero_info_panel_view.gd:209-211 附近(:196-207 为字形创建区) | +| F10 | 成立(box 150×176:26 / 底座 box.y-18:417-419 / 名行基线 box.y-1.0:476) | +| F11 | 成立(九枚 preload 恰在 :21-29) | +| F12 | 成立(柜台四枚 64×64 / 状态九枚 32×32 / BCard 槽 56:421 / 头像 46×48 vs 50×52 槽) | +| F13 | 成立(button min_w=216:258) | +| F14 | 成立(_register_modal 在 presentation/main.gd:346-351,set_anchors_and_offsets_preset ✓) | +| F15 | 成立且已复核(md5 与任务书一致) | +| 补 | INK_LABEL 常量定义在 ui_kit.gd:19(任务书 :212 系 label() 内回落应用行,两处均实存) | + +### 七点对比度实机复算(替换 demo 读数——背景取实机直背常量,WCAG 相对亮度法) + +**总发现:实机直背与 demo 反向的两处(意图徽标/槽位字),任务书 N1 表的修法方向在实机会劣化;RAP 一处实机本已合规。** 按「§3 收项一律以 T0 复核后的实况为准再落笔」与三层优先级栈②(§7.2 ≥4.5 无区域例外),修法落点以本表为准,偏差逐条留痕: + +| # | 点 | 实机对比对(fg on bg) | 现值 | 判 | T0 复核后落法 | +|---|---|---|---|---|---| +| 1/2 | 站桩血数(敌我同色同分支) | 白 α.95 on 血条填充 #699CE8 | **2.67** | FAIL | 修法成立:中央垫 `HP_BAR_BACK #28221C` 素牌后 = **14.29 ✓**(任务书 12.29 系不透明白口径;实机 α.95 混成后 14.29 更优)。字号 11px 维持,随 P11 豁免条款落文 | +| 3 | 意图 atk ⚔ | RED_MINE #962C24 on 舞台底 STAGE_BG #3E342A | **1.55** | FAIL | **demo 修法(RED_DEEP 降一档)在实机暗底反向(1.73 更劣)**。改为 §4.1 色牌原则同 N1-1:徽标垫 `PANEL_DATA #E2D2B6` 素牌——RED_MINE on 牌 = **5.27 ✓**(零换墨);若按任务书换 RED_DEEP on 牌 = 4.73 亦合规(T2 取舍,推荐零换墨) | +| 4 | 意图 buf ✦ | HERO_BLUE #2E86DE on #3E342A | **3.23** | FAIL | 垫牌(同上)+ 墨换任务书值 **#1E5A96**(HERO_BLUE 同族深档,命名随 CONTACT_GLOW_DEEP 规则):on 牌 = **4.78 ✓**(不垫牌单换墨在暗底 = 1.71 反向,否) | +| 5 | C区槽「已用」 | STONE_FAINT #8C7C64 on 石皮均值 #D6C7AD | **2.44** | FAIL | **demo 修法(提档 WARM_FAINT)在实机亮皮反向(1.17)**。实机石皮=亮底,改双向**深化**墨色:候选 INK_LABEL(on 石皮 9.30 ✓);已用/不可用两态 T2 定值(Q6 乙:不新增通道,只调墨) | +| 6 | C区槽「空/不可用」 | STONE #786E62 on #D6C7AD | **3.00** | FAIL | 同上深化(≥4.5 定值 T2 落) | +| 7 | RAP 标签 | INK_LABEL #2E2218 on ap_bar 面板 PANEL_DATA #E2D2B6 | **10.40** | **合规** | **demo 的 4.10 FAIL 在实机不存在**;任务书修法(显式 CONTACT_GLOW_DEEP)作废——实机套用会跌至 1.31。落法=零改动(显式传色可选作确定性加固,T2 顺手则为 INK_LABEL 显式化,不改值) | +| 表外 | 意图 debuff ☠ | DEBUFF_PURPLE #7A4294 | on 牌 4.66 | 垫牌后 ✓ | 随 #3 垫牌自动达标,零换墨 | +| 表外 | 意图 charge | GOLD_DEEP #B07A14 | on 牌 2.50 | FAIL | 垫牌后仍不足——需深化金墨档(T2 定值 ≥4.5,新常量入 ui_kit,命名同族规则) | + +### 交集核对 + +`git worktree list` 仅本 worktree 在飞;迭代 15② 奇物批已落籍 master(3c6f2c9),其文件面(feat_*/curio_* 词族、数据表、adventure/level_runner)与本批呈现层面(ui_kit/standee/status_slot_row/hero_info/ap_bar/bonus_pick/shop_overlay/board_cell_unit/level_map_screen/探针)**零交集** → 「不触碰 15② 在飞文件」停机点按开工令自动解除,核对零命中。 + +### T0 结论 + +基线回填完毕,无停机条件触发。**T2 实施修正案**(相对任务书 §3-N1):①意图徽标四处=垫 PANEL_DATA 素牌,atk 零换墨/buf 换 #1E5A96/charge 需深化金墨/debuff 自动达标;②槽位字两态=深化墨色(非 demo 的提亮);③RAP=零改动。其余收项(垫牌几何 12.29→14.29 口径、字号豁免条款落文等)按任务书+白名单执行。 From a55a302d3e6f5096b3e6cbf90d876566145a6afe Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 02:52:03 +0800 Subject: [PATCH 02/12] =?UTF-8?q?iter16ui=20T1=EF=BC=9AN3=20status=5Fslot?= =?UTF-8?q?=5Frow=20=E4=B9=9D=E6=9E=9A=E7=8A=B6=E6=80=81=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=20preload=E2=86=92=E8=B7=AF=E5=BE=84=E4=B8=B2+UiKit.load=5Ftex?= =?UTF-8?q?=20=E5=AE=88=E5=8D=AB=EF=BC=88=E5=91=88=E7=8E=B0=E5=B1=82?= =?UTF-8?q?=E7=B4=A0=E6=9D=90preload=E8=AE=A1=E6=95=B0=3D0=EF=BC=9B=5Ficon?= =?UTF-8?q?=5Ftex=20=E6=96=AD=E8=A8=80=E9=9D=A2/=E8=B7=AF=E5=BE=84/?= =?UTF-8?q?=E5=8D=A0=E4=BD=8D=E5=9B=9E=E9=80=80=E5=85=A8=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=EF=BC=89=EF=BC=9B=E8=BD=BB=E9=97=B8=3D=E5=86=92=E7=83=9F782/0+?= =?UTF-8?q?ui=5Fstruct=20=E9=9B=B6=E7=BA=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/status_slot_row.gd | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index b62e3911..4ec168f6 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -18,15 +18,15 @@ const MAX_SLOTS := 4 # (2026-09-15 格面资源批补 sapped;2026-09-16 护甲等级掷点批 defense_up → ac_up 换装; # 同日 敌人技能池批补 empower/fortify 敌方增益两键——敌方增益显示 = 敌卡状态行文本 + 本图标键词汇)。 const EFFECT_ICON := { - "attack_up": preload("res://assets/ui/icons/status_attack_up.png"), - "ac_up": preload("res://assets/ui/icons/status_ac_up.png"), - "weaken": preload("res://assets/ui/icons/status_weaken.png"), - "alert": preload("res://assets/ui/icons/status_alert.png"), - "enrage": preload("res://assets/ui/icons/status_enrage.png"), - "off_guard": preload("res://assets/ui/icons/status_off_guard.png"), - "sapped": preload("res://assets/ui/icons/status_sapped.png"), - "empower": preload("res://assets/ui/icons/status_empower.png"), - "fortify": preload("res://assets/ui/icons/status_fortify.png"), + "attack_up": "res://assets/ui/icons/status_attack_up.png", + "ac_up": "res://assets/ui/icons/status_ac_up.png", + "weaken": "res://assets/ui/icons/status_weaken.png", + "alert": "res://assets/ui/icons/status_alert.png", + "enrage": "res://assets/ui/icons/status_enrage.png", + "off_guard": "res://assets/ui/icons/status_off_guard.png", + "sapped": "res://assets/ui/icons/status_sapped.png", + "empower": "res://assets/ui/icons/status_empower.png", + "fortify": "res://assets/ui/icons/status_fortify.png", } # 极性词(tooltip 第三通道;运行时不再按极性染色/画框——绿↑红↓极性语言已内化于定稿图标本体) const EFFECT_POLARITY := { @@ -189,9 +189,11 @@ func _on_slot_hover(slot: Control) -> void: # 图标键解析(HUD框架:查不到的键按错误处理——立即断言 + 占位 + 诊断,禁止静默显示空图标) +# 装载走 UiKit.load_tex 守卫(呈现层素材 preload 红线=0,UI 设计对齐批 N3 2026-10-06—— +# 素材缺位树上 preload 直接断言炸脚本;路径串表 + exists 守卫,缺位 null 走占位回退) func _icon_tex(effect_id: String) -> Texture2D: if EFFECT_ICON.has(effect_id): - return EFFECT_ICON[effect_id] + return UiKit.load_tex(EFFECT_ICON[effect_id]) push_error("[状态槽] 未知图标键(映射表外键——立即断言): %s" % effect_id) assert(false, "未知图标键: " + effect_id) return null From b38ae077079d4957c88a6522a9e329fcf326564f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:04:59 +0800 Subject: [PATCH 03/12] =?UTF-8?q?iter16ui=20T2=EF=BC=9AN1=E5=AF=B9?= =?UTF-8?q?=E6=AF=94=E5=BA=A6=E4=B8=83=E5=A4=84=E8=90=BD=E7=A0=81=EF=BC=88?= =?UTF-8?q?=E8=A1=80=E6=95=B0HP=5FBAR=5FBACK=E5=9E=AB=E7=89=8C14.3:1/?= =?UTF-8?q?=E6=84=8F=E5=9B=BE=E5=9B=9B=E5=A2=A8=E5=9E=ABPANEL=5FDATA?= =?UTF-8?q?=E7=89=8C=C2=B7atk=E9=9B=B6=E6=8D=A2=E5=A2=A8=C2=B7buf=E6=8D=A2?= =?UTF-8?q?HERO=5FBLUE=5FDEEP#1E5A96=C2=B7charge=E6=8D=A2GOLD=5FINK#74500B?= =?UTF-8?q?/=E6=A7=BD=E4=B8=A4=E6=80=81STONE=5FDEEP#554D41+INK=5FLABEL/RAP?= =?UTF-8?q?=E6=98=BE=E5=BC=8FINK=5FLABEL=E9=9B=B6=E6=94=B9=E5=80=BC?= =?UTF-8?q?=EF=BC=89+art-bible=20=C2=A77.4=E5=90=88=E5=B9=B6=E8=B1=81?= =?UTF-8?q?=E5=85=8D=E6=9D=A1=E6=AC=BE=EF=BC=88P11=20caption=2012px+?= =?UTF-8?q?=E8=A1=80=E6=95=B0=E6=9D=A1=E5=B8=A6=E5=86=85=E8=AF=BB=E6=95=B0?= =?UTF-8?q?=EF=BC=89+=E6=96=B0=E5=A2=9Eui=5Fcontrast=5Fprobe=E5=85=A5probe?= =?UTF-8?q?=5Fgate=E9=BB=98=E8=AE=A4=E6=AE=B5=EF=BC=8811=E5=AF=B9=E6=B5=8B?= =?UTF-8?q?=E7=82=B9+=E8=A3=B8Color8=E7=99=BD=E5=90=8D=E5=8D=9525=E5=A4=84?= =?UTF-8?q?/10=E6=96=87=E4=BB=B6=E8=BF=87=E6=B8=A1=E8=A1=A8+preload?= =?UTF-8?q?=E7=BA=A2=E7=BA=BF=E9=9D=99=E6=80=81=E6=89=AB=E6=8F=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 1 + game/presentation/views/ap_bar_view.gd | 2 +- .../views/hero_info_panel_view.gd | 7 +- game/presentation/views/standee_body.gd | 11 +- game/presentation/views/ui_kit.gd | 3 + game/smoke/ui_contrast_probe.gd | 112 ++++++++++++++++++ game/smoke/ui_contrast_probe.tscn | 6 + tools/probe_gate.sh | 13 +- 8 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 game/smoke/ui_contrast_probe.gd create mode 100644 game/smoke/ui_contrast_probe.tscn diff --git a/design/art/art-bible.md b/design/art/art-bible.md index e6b2017f..d9042ea2 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -418,6 +418,7 @@ - **字体**:全局一套像素字——拉丁候选 Kenney Fonts(CC0)、中文候选缝合像素字体 Fusion Pixel(OFL)(清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。 - **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座;2026-09-29 v3.0 对齐 ux-designer PC 规范):棋盘数字 ≥18px(公式 = max(18, ceil(格边长 × 0.5))不变)、**正文/明细 ≥16px、tooltip ≥14px**(旧 14/13px 下限退役——1280×800 低于 1080p 基准,同字号实际更小)。 +- **小字号豁免条款(2026-10-06 UI 设计对齐批 P11+Q5 甲,合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。两类豁免均须逐处登记清单(条带内读数清单=B 区站桩血数一处;装饰 caption 逐处清单随本批字号档位卡落本节),清单外的 11-13px 文字一律按正文/tooltip 下限提档。 - **字重纪律(2026-09-29 v3.0 修订)**:层级手段解禁为三件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅 +(字体支持时)字重两档**;数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。 ### 7.5 营地界面 diff --git a/game/presentation/views/ap_bar_view.gd b/game/presentation/views/ap_bar_view.gd index f115b025..9a6a2e62 100644 --- a/game/presentation/views/ap_bar_view.gd +++ b/game/presentation/views/ap_bar_view.gd @@ -71,7 +71,7 @@ func _init() -> void: _rap_dots.add_theme_constant_override("separation", 2) _rap_dots.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_rap_dots) - _rap_label = UiKit.label("RAP 0", 14, true) + _rap_label = UiKit.label("RAP 0", 14, true, UiKit.INK_LABEL) # 显式传色(UI 设计对齐批 N1-7——T0 实测对 PANEL_DATA 10.4:1 已合规,显式化仅为确定性加固,值不变) _rap_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_rap_label) _rap_feedback = UiKit.label("", 11, false, UiKit.STONE_FAINT) diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index d1348578..170adfa9 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -209,9 +209,12 @@ func set_treasure_inventory(items: Array, selected_handle: int) -> void: glyph.set_anchors_preset(Control.PRESET_FULL_RECT) glyph.mouse_filter = Control.MOUSE_FILTER_IGNORE if used: - glyph.add_theme_color_override("font_color", UiKit.STONE_FAINT) + # 「已用」占位墨=灰石深化(UI 设计对齐批 N1-5 2026-10-06——旧 STONE_FAINT 对 PANEL_DATA 槽牌 2.7:1; + # STONE_DEEP = 5.6:1;语义分档保持双墨,Q6 乙不新增通道) + glyph.add_theme_color_override("font_color", UiKit.STONE_DEEP) elif not usable: - glyph.add_theme_color_override("font_color", UiKit.STONE) + # 「不可用」置灰墨=标签深墨(N1-6——旧 STONE 对槽牌 3.4:1;INK_LABEL = 10.4:1,虚位/失效更强置灰语义) + glyph.add_theme_color_override("font_color", UiKit.INK_LABEL) slot.add_child(glyph) var border_col: Color = UiKit.GOLD if selected else UiKit.PANEL_BORDER slot.add_theme_stylebox_override("panel", diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index 8c58a569..78306a59 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -172,12 +172,12 @@ func set_pending(ptype: String, pid: String) -> void: var col: Color = UiKit.RED_MINE # 攻击预告红(危险红族——旗朱退役 2026-09-26,预告语义归封印色独占〔现行封印黑〕) if ptype == "buff": glyph = "✦" # 增益系 - col = UiKit.HERO_BLUE + col = UiKit.HERO_BLUE_DEEP # 深档墨(N1-4——浅垫牌上 ≥4.5:1;原 HERO_BLUE 亮档对垫牌 2.5:1) elif ptype == "debuff": glyph = "☠" # 妨害系(新效应词汇批 2026-09-19) col = UiKit.DEBUFF_PURPLE if pid in CHARGE_SKILL_IDS: - col = UiKit.GOLD_DEEP # 重击类蓄力档(2026-09-18 用户拍板独立蓄力提示) + col = UiKit.GOLD_INK # 重击类蓄力档(深金墨 N1——浅垫牌上 ≥4.5:1;原 GOLD_DEEP 2.5:1) _intent_glyph = glyph _intent_col = col _intent_visible = true @@ -434,6 +434,9 @@ func _draw() -> void: # 数字=目标值即时刷新,条 tween 只管填充宽度;死残位 0/max 照常可读) var hp_txt := "%d/%d" % [_hp_cur, int(_hp_max)] var hts: Vector2 = f.get_string_size(hp_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 11) + # 对比度垫牌(UI 设计对齐批 N1-1/N1-2 2026-10-06——白 α.95 直压蓝条 2.67:1 违 §7.2; + # 中央垫 HP_BAR_BACK 深素牌 = 14.3:1;牌宽=字宽+8〔白名单取 8〕,高=条带全高;§4.1 数字色牌原则) + draw_rect(Rect2(bar_x + (bar_w - hts.x) * 0.5 - 4.0, 2.0, hts.x + 8.0, 10.0), UiKit.HP_BAR_BACK, true) var hbase := Vector2(bar_x + (bar_w - hts.x) * 0.5, 2.0 + 5.0 + 4.0) f.draw_string(get_canvas_item(), hbase + Vector2(1, 1), hp_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 11, Color(0.10, 0.08, 0.06, 0.85)) f.draw_string(get_canvas_item(), hbase, hp_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 11, Color(1, 1, 1, 0.95)) @@ -457,6 +460,10 @@ func _draw() -> void: var icenter := Vector2(box.x * 0.5, 86.0) draw_set_transform(icenter, 0.0, Vector2(_intent_scale, _intent_scale)) var its := f.get_string_size(_intent_glyph, HORIZONTAL_ALIGNMENT_LEFT, -1, 15) + # 对比度垫牌(UI 设计对齐批 N1-3/N1-4 2026-10-06——四色墨直压立绘纹理/暗舞台底 1.5-3.3:1 违 §7.2 + # 「文字禁直压纹理底」;垫 PANEL_DATA 素牌后 atk 5.3/buf 4.8/debuff 4.7/charge 4.9 全 ≥4.5:1; + # atk/debuff 零换墨、buf 换 HERO_BLUE_DEEP、charge 换 GOLD_INK;随弹入 transform 同步缩放) + draw_rect(Rect2(-its.x * 0.5 - 4.0, -its.y * 0.75, its.x + 8.0, its.y * 1.1), UiKit.PANEL_DATA, true) f.draw_string(get_canvas_item(), Vector2(-its.x * 0.5, its.y * 0.35), _intent_glyph, HORIZONTAL_ALIGNMENT_LEFT, -1, 15, _intent_col) # 局部坐标(同上注记——双重偏移修复) draw_set_transform(Vector2.ZERO, 0.0, Vector2.ONE) diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 09b71ff3..e285f1fd 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -26,6 +26,7 @@ const PANEL_BORDER := Color8(120, 106, 88) # 面板细线框;兼熄灭点 const GOLD := Color8(240, 168, 40) # 奖励金 const GOLD_DEEP := Color8(176, 122, 20) # 深金(金框描边/达意金) +const GOLD_INK := Color8(116, 80, 11) # 深金墨(意图蓄力徽标墨——PANEL_DATA 垫牌上 4.9:1,UI 设计对齐批 N1 2026-10-06) const GOLD_LIT := Color8(230, 190, 90) # 亮金(候选高亮) const GOLD_DIM := Color8(140, 116, 60) # 暗金(已过节点) const GOLD_DONE := Color8(104, 86, 44) # 已过节点暗金·关卡画面呈现态(关卡画面样张 v1 冻结新值 #68562C——旧 GOLD_DIM #8C743C 对双色墨均 <4.5:1 对比硬指标逼守;GOLD_DIM 他用不动) @@ -39,6 +40,7 @@ const RED_FORBID := Color8(120, 60, 50) # 禁止框朱 const RED_ALERT := Color8(200, 60, 48) # 报错朱 const HERO_BLUE := Color8(46, 134, 222) # 小人蓝 #2E86DE(样张 v2 定稿 2026-09-28——圣经 §4.1 候选值冻结;旧 #2E6E8E 收敛期快照退役) +const HERO_BLUE_DEEP := Color8(30, 90, 150) # 小人蓝同族深档(意图增益徽标墨——PANEL_DATA 垫牌上 4.8:1;命名同 CONTACT_GLOW_DEEP 规则,UI 设计对齐批 N1 2026-10-06) const BOSS_PURPLE := Color8(143, 47, 106) # 紫赤(Boss 专属) const DEBUFF_PURPLE := Color8(122, 66, 148) # 妨害紫(意图 ☠) @@ -50,6 +52,7 @@ const WARM_FAINT := Color8(205, 184, 140) # 暖白弱化(帮助文)#CDB8 const STONE := Color8(120, 110, 98) # 灰石(通道/箭头/失效) const STONE_FAINT := Color8(140, 124, 100) # 灰石弱化(占位提示文) +const STONE_DEEP := Color8(85, 77, 65) # 灰石深化(「已用」槽位墨——PANEL_DATA 槽牌 5.6:1 / 石皮 5.0:1,UI 设计对齐批 N1 2026-10-06;旧 STONE_FAINT 对亮底双向 <4.5:1) const DARK_UPCOMING := Color8(64, 58, 52) # 未达暗字(底/文同值) const BRICK := Color8(201, 175, 131) # 棋盘·未开掩尘地砖 #C9AF83 diff --git a/game/smoke/ui_contrast_probe.gd b/game/smoke/ui_contrast_probe.gd new file mode 100644 index 00000000..f7f26b93 --- /dev/null +++ b/game/smoke/ui_contrast_probe.gd @@ -0,0 +1,112 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# UI 文字对比度机检(UI 设计对齐批 T2 2026-10-06——任务书 §7 新增机检段①,probe_gate 默认必跑) +# 断言面 = 文字墨对直背景 ≥4.5:1(art-bible §7.2 无区域例外;文字禁直压纹理底——垫牌后按牌色计)。 +# 测点表随批维护:血数垫牌 / 意图徽标四墨(PANEL_DATA 垫牌)/ C区槽位两态墨 / RAP 标签 + 全站锚点组。 +# 测点对一律取 UiKit 常量实时求值——代码侧换色即本闸红,禁只改注释不动值;α<1 墨先对背景混成再算。 +# 运行:Godot_console.exe --headless --path . res://smoke/ui_contrast_probe.tscn +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 货架卡固定默认值 +} + + +# 测点表:[名称, 墨色, 直背景, 墨α](语义见行尾;新增文字位随批入表,白名单豁免须注理由) +func _pairs() -> Array: + return [ + ["站桩血数·垫牌", Color(1, 1, 1), UiKit.HP_BAR_BACK, 0.95], # N1-1/2 白 α.95 压 HP_BAR_BACK 素牌 + ["意图atk·垫牌", UiKit.RED_MINE, UiKit.PANEL_DATA, 1.0], # N1-3 ⚔ 攻击预告(零换墨) + ["意图buf·垫牌", UiKit.HERO_BLUE_DEEP, UiKit.PANEL_DATA, 1.0], # N1-4 ✦ 增益(同族深档) + ["意图debuff·垫牌", UiKit.DEBUFF_PURPLE, UiKit.PANEL_DATA, 1.0], # ☠ 妨害(零换墨随牌达标) + ["意图charge·垫牌", UiKit.GOLD_INK, UiKit.PANEL_DATA, 1.0], # 蓄力重击(深金墨) + ["C区槽·已用", UiKit.STONE_DEEP, UiKit.PANEL_DATA, 1.0], # N1-5 占位暗字(灰石深化) + ["C区槽·不可用", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # N1-6 置灰(标签深墨) + ["RAP标签", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # N1-7(T0 实测已合规,显式化) + ["锚·正文墨/数据板", UiKit.INK, UiKit.PANEL_DATA, 1.0], # 全站锚点:正文墨对数据板 + ["锚·暖白/屏根", UiKit.WARM, UiKit.BG_ROOT, 1.0], # 全站锚点:暗底正文 + ["锚·暖白弱/舞台底", UiKit.WARM_FAINT, UiKit.STAGE_BG, 1.0], # 全站锚点:B区辅助墨 + ] + + +func _lum(c: Color) -> float: + var f := func(x: float) -> float: + return x / 12.92 if x <= 0.03928 else pow((x + 0.055) / 1.055, 2.4) + return 0.2126 * f.call(c.r) + 0.7152 * f.call(c.g) + 0.0722 * f.call(c.b) + + +func _ratio(a: Color, b: Color) -> float: + var la := _lum(a) + var lb := _lum(b) + var hi := la if la >= lb else lb + var lo := lb if la >= lb else la + return (hi + 0.05) / (lo + 0.05) + + +func _ready() -> void: + var problems: Array = [] + var pairs := _pairs() + for p in pairs: + var fg: Color = p[1] + var bg: Color = p[2] + var alpha: float = p[3] + if alpha < 1.0: + fg = Color(fg.r * alpha + bg.r * (1.0 - alpha), + fg.g * alpha + bg.g * (1.0 - alpha), + fg.b * alpha + bg.b * (1.0 - alpha)) + var r := _ratio(fg, bg) + if r < MIN_RATIO: + problems.append("[contrast] %s = %.2f:1 < %.1f(测点对须垫牌或换墨)" % [p[0], r, MIN_RATIO]) + problems.append_array(_scan_static()) + if problems.is_empty(): + print("[ui_contrast_probe] PASS — 对比度 %d 对测点全绿(≥%.1f:1 无区域例外)+ 裸色白名单/preload 红线静态段绿" % [pairs.size(), MIN_RATIO]) + get_tree().quit(0) + else: + for msg in problems: + print(msg) + print("[ui_contrast_probe] FAIL — %d 项越带(含静态段)" % problems.size()) + get_tree().quit(1) + + +# ---- 机检段②③(任务书 §7):呈现层裸 Color8( 计数 vs 白名单 + 素材 preload 计数 = 0 ---- +func _scan_static() -> Array: + var problems: Array = [] + var root := "res://presentation" + var dirs := [root] + while not dirs.is_empty(): + var d: String = dirs.pop_front() + for f in DirAccess.get_files_at(d): + if not f.ends_with(".gd"): + continue + var path := d + "/" + f + var src := FileAccess.get_file_as_string(path) + var c8 := src.count("Color8(") + var pre := 0 + for line in src.split("\n"): + if line.contains("preload(") and (line.contains("res://assets/") or line.contains(".png")): + pre += 1 + if path.ends_with("/ui_kit.gd"): + if pre != 0: + problems.append("[static] ui_kit.gd 素材 preload=%d(红线=0)" % pre) + continue # ui_kit=色板工厂本体,Color8 定义面合法 + var wl: int = BARE_COLOR8_WL.get(path, 0) + if c8 != wl: + problems.append("[static] %s 裸 Color8=%d 白名单=%d(R1 先立常量再消费)" % [path, c8, wl]) + if pre != 0: + problems.append("[static] %s 素材 preload=%d(R2 红线=0)" % [path, pre]) + for sub in DirAccess.get_directories_at(d): + dirs.append(d + "/" + sub) + return problems diff --git a/game/smoke/ui_contrast_probe.tscn b/game/smoke/ui_contrast_probe.tscn new file mode 100644 index 00000000..6f1282fd --- /dev/null +++ b/game/smoke/ui_contrast_probe.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://smoke/ui_contrast_probe.gd" id="1"] + +[node name="UIContrastProbe" type="Node"] +script = ExtResource("1") diff --git a/tools/probe_gate.sh b/tools/probe_gate.sh index dad8e1a4..5b32d97c 100644 --- a/tools/probe_gate.sh +++ b/tools/probe_gate.sh @@ -3,7 +3,8 @@ # 三闸:①每段 timeout 守卫(挂死=FAIL 不静默)②段前预清+段后清本 game 目录孤儿 Godot # (按命令行精确匹配本 game 路径,不误杀其他 worktree 会话的合法进程)③末尾残留清点=批末闸(必须 0)。 # 段:ui_input_probe=默认必跑;ui_struct_probe=默认必跑(ui-struct-probe mini-loop 2026-10-05 注册—— -# 全 UI 屏结构断言:按钮互压/等宽/出屏/零尺寸/标题屏双列);--click=加跑 ui_click_probe 行为走查 +# 全 UI 屏结构断言:按钮互压/等宽/出屏/零尺寸/标题屏双列);ui_contrast_probe=默认必跑(UI 设计对齐批 +# T2 2026-10-06 注册——UI 文字对比度机检 ≥4.5:1 无区域例外,测点表随批维护);--click=加跑 ui_click_probe 行为走查 # (自退出+退出码闸;超时多半=探针未适配新停点层,归 probe适配批);shot_probe 禁入本闸—— # 必须窗口化运行(headless 无渲染面,探针内已有 fail-fast 护栏),归真人目检。 # 用法: tools/probe_gate.sh [game目录] [--click] 缺省 game 目录=脚本所在仓库的 game/(worktree 内自动指向该 worktree) @@ -62,6 +63,16 @@ elif ! grep -q "PASS" "$TMP/stp.log"; then echo "[probe_gate] FAIL — ui_struct_probe 未见 PASS(exit=$st)"; _rc=1 fi +echo "======== ui_contrast_probe ========" +timeout 120 "$G" --headless --path "$GAME_WIN" res://smoke/ui_contrast_probe.tscn >"$TMP/ctp.log" 2>&1 +st=$?; kill_orphans +grep -E "PASS|FAIL" "$TMP/ctp.log" | head -12 +if [ "$st" -eq 124 ] || [ "$st" -eq 137 ]; then + echo "[probe_gate] FAIL — ui_contrast_probe 超时挂死(exit=$st),孤儿已清"; _rc=1 +elif ! grep -q "PASS" "$TMP/ctp.log"; then + echo "[probe_gate] FAIL — ui_contrast_probe 未见 PASS(exit=$st)"; _rc=1 +fi + if [ "$WITH_CLICK" -eq 1 ]; then echo "======== ui_click_probe 行为走查 ========" timeout 240 "$G" --headless --path "$GAME_WIN" res://smoke/ui_click_probe.tscn >"$TMP/clk.log" 2>&1 From 4e7aa833679ce020e21c90720b4fd18e06c44b6d Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:12:01 +0800 Subject: [PATCH 04/12] =?UTF-8?q?iter16ui=20T3=EF=BC=9AN2=E7=AB=99?= =?UTF-8?q?=E6=A1=A9=E7=BA=B5=E5=90=91=E4=BD=99=E9=87=8F=E7=BA=AA=E5=BE=8B?= =?UTF-8?q?=EF=BC=88STANDEE=5FFOOT=5FMARGIN=3D12=E5=85=B7=E5=90=8D?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=C2=B7=E5=90=8D=E8=A1=8C=E5=9F=BA=E7=BA=BFbox?= =?UTF-8?q?.y-1.0=E2=86=92-13=C2=B7=E5=BA=95=E5=BA=A7=E7=9F=A9=E5=BD=A2?= =?UTF-8?q?=E6=94=B6=5Fpedestal=5Frect=E5=8D=95=E4=B8=80=E6=9D=A5=E6=BA=90?= =?UTF-8?q?+content=5Frect=E8=AF=BB=E6=95=B0=E9=9D=A2=EF=BC=89+ui=5Fstruct?= =?UTF-8?q?=5Fprobe=E2=91=A5standee=E6=96=AD=E8=A8=80=E6=97=8F=EF=BC=88?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E7=9F=A9=E5=BD=A2=E2=8A=86=E8=88=9E=E5=8F=B0?= =?UTF-8?q?+=E5=BA=95=E7=BC=98=E8=B7=9D=E2=89=A58px=EF=BC=9B=E9=A6=96?= =?UTF-8?q?=E8=B7=91=E6=8A=93=E5=B7=A6=E5=8F=B36px=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E8=BE=B9=E8=B7=9D=E7=B3=BB=E6=96=AD=E8=A8=80=E8=AF=AD=E4=B9=89?= =?UTF-8?q?=E8=BF=87=E4=B8=A5=E6=94=B9=E4=BB=BB=E5=8A=A1=E4=B9=A6=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E2=8A=86+=E5=BA=95=E2=89=A58=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E8=BD=BB=E9=97=B8=E5=86=92=E7=83=9F782/0+=E4=B8=89=E6=8E=A2?= =?UTF-8?q?=E9=92=88=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/standee_body.gd | 23 +++++++++++++++++++---- game/smoke/ui_struct_probe.gd | 25 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index 78306a59..983a465b 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -22,6 +22,9 @@ const CHARGE_SKILL_IDS := ["heavy"] # 护甲类型图标占位——形状+色相双通道(art-bible):轻甲=◇ 灰石中性 / 魔法护甲=◆ 小人蓝 / # 重甲=▣ 深金(避开 Boss 专属紫赤与妨害紫)。(自旧 StandeeView 平移) const ARMOR_ICONS := {"light": "◇", "ward": "◆", "heavy": "▣"} +# 名行/底座纵向预算余量(UI 设计对齐批 N2 2026-10-06——旧名行基线 = 盒底−1px「声明值刚好=容器值」 +# 同型高危写法返修;≥8px 硬余量 + 字形下探预算 ⇒ 12;取值不属色板,不进 ui_kit) +const STANDEE_FOOT_MARGIN := 12.0 var box := Vector2(150, 176) # 站桩盒尺寸(旧 Control custom_minimum_size;实际高随壳层 row 布局注入) var font: Font = null # 世界字体槽位(null = ThemeDB.fallback_font——world.world_font 注入) @@ -400,6 +403,17 @@ func _portrait_rect() -> Rect2: return Rect2(0, 44, box.x, box.y - 80.0) +# 石板地台矩形(_draw 与 content_rect 共用几何——单一来源防两处漂移) +func _pedestal_rect() -> Rect2: + return Rect2(18.0, box.y - 18.0, box.x - 36.0, 12.0) + + +# 绘制内容矩形(世界局部;ui_struct_probe ⑥standee「不出框+下余量≥8px」断言读数面—— +# 最低绘制元素 = 底座下缘;N2 纵向余量纪律 2026-10-06) +func content_rect() -> Rect2: + return Rect2(0.0, 0.0, box.x, _pedestal_rect().end.y) + + func _draw() -> void: var f := _efont() # 椭圆落影(圣经 v3.5 批 B4 2026-09-30——§6.1 地台落影压脚:方向稿椭圆 (0,0,0,70),压在地台 @@ -414,9 +428,10 @@ func _draw() -> void: draw_colored_polygon(pts, Color(0, 0, 0, 0.27)) # 石板地台(v3.5——方向稿取色:板身/描边/顶缘受光线 2px——取色单点收 UiKit.STAND_STONE 族 # (T4 裸色收口);几何沿用现行底座位〔margin 26/高 10→方向稿 18/12——按方向稿对齐〕) - draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 12.0), UiKit.STAND_STONE, true) - draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 12.0), UiKit.STAND_STONE_EDGE, false, 1.0) - draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 2.0), UiKit.STAND_STONE_RIM, true) + var ped := _pedestal_rect() + draw_rect(ped, UiKit.STAND_STONE, true) + draw_rect(ped, UiKit.STAND_STONE_EDGE, false, 1.0) + draw_rect(Rect2(ped.position.x, ped.position.y, ped.size.x, 2.0), UiKit.STAND_STONE_RIM, true) # 血条(直角递减):敌附顺位徽标(GOLD_DEEP ①②③)——旧 top VBox 几何等价(左 8 / 右 -8) var bar_x := 8.0 @@ -480,7 +495,7 @@ func _draw() -> void: var name_w := f.get_string_size(_display_name, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x var armor_w := f.get_string_size(armor_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x var total_w := armor_w + 3.0 + name_w - var baseline := Vector2((box.x - total_w) * 0.5, box.y - 1.0) + var baseline := Vector2((box.x - total_w) * 0.5, box.y - 1.0 - STANDEE_FOOT_MARGIN) # N2 余量纪律(2026-10-06——旧值 box.y-1.0 离盒底 1px) f.draw_string(get_canvas_item(), baseline, armor_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 12, col) f.draw_string(get_canvas_item(), baseline + Vector2(armor_w + 3.0, 0), _display_name, HORIZONTAL_ALIGNMENT_LEFT, -1, 12, UiKit.WARM) # v3.5 暗底双色墨制(原 INK_TITLE 深墨对暗底不可读) diff --git a/game/smoke/ui_struct_probe.gd b/game/smoke/ui_struct_probe.gd index 444bb149..301312e2 100644 --- a/game/smoke/ui_struct_probe.gd +++ b/game/smoke/ui_struct_probe.gd @@ -70,6 +70,7 @@ func _ready() -> void: main.level_screen.route_chosen.emit(battle_id) _settle(6) _audit("battle_hud", [main.board_zone, main.info_panel, main.stage]) + _standeefit_contract(main) else: problems.append("[battle_hud] 候选中无战斗节点(驱动中断——候选=%s)" % str(main.level_screen._cand_ids)) @@ -121,6 +122,30 @@ func _pick_battle_node(main: Node) -> int: return -1 +# ⑥standee 专项:B 区站桩内容矩形 ⊆ 252px 舞台矩形(内缩 8px)且不被裁切 +# (UI 设计对齐批 N2 2026-10-06——名行基线离盒底 1px 同型高危写法返修回归闸; +# 内容矩形=StandeeBody.content_rect(),最低绘制元素=底座下缘) +func _standeefit_contract(main: Node) -> void: + var st: Node = main.stage + if st == null or st.hero_standee == null: + problems.append("[standee] 舞台/主角站桩缺失(断言中断)") + return + var stage_gr: Rect2 = st.get_global_rect() + var bodies: Array = [st.hero_standee] + for c in st._cards: + bodies.append(c) + for body in bodies: + if body == null or not is_instance_valid(body): + continue + var content := Rect2(st.world_to_shell(body.position), body.content_rect().size) + if not stage_gr.encloses(content): + problems.append("[standee] %s 内容矩形 %s 越出舞台矩形 %s(N2 站桩出框回归)" + % [body.name if body.name != "" else "standee", content, stage_gr]) + elif content.end.y > stage_gr.end.y - 8.0: + problems.append("[standee] %s 内容底缘 %s 距舞台底 <8px(N2 纵向余量回归,舞台底=%s)" + % [body.name if body.name != "" else "standee", content.end.y, stage_gr.end.y]) + + func _settle(frames := 4) -> void: for i in range(frames): await get_tree().process_frame From af5f317aeaaaf800e4e5f44251de2ad4d1e8fd9d Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:19:13 +0800 Subject: [PATCH 05/12] =?UTF-8?q?iter16ui=20T4a=EF=BC=9AN4a=E8=A3=B8?= =?UTF-8?q?=E8=89=B2=E5=85=A8=E9=87=8F=E6=94=B6ui=5Fkit=EF=BC=88T0?= =?UTF-8?q?=E6=99=AE=E6=9F=A5=E5=AE=9E=E6=95=B025=E5=A4=84/10=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8E=9F=E5=80=BC=E6=90=AC=E8=BF=90=E2=80=94=E2=80=94?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B9=A6N4a=E8=AE=B05=E5=A4=84=E7=B3=BB?= =?UTF-8?q?=E6=BC=8F=E8=AE=B0=EF=BC=89+N4c=E7=B1=BB=E5=9E=8B=E8=89=B2?= =?UTF-8?q?=E4=BA=94=E6=97=8FTG=5F*=E7=AB=8B=E9=A1=B9=EF=BC=88=E5=9B=9B?= =?UTF-8?q?=E6=97=8F=E5=AE=9E=E6=9C=BA=E5=80=BC+=E7=AC=AC=E4=BA=94?= =?UTF-8?q?=E6=97=8FTG=5FAOE=20#E25676=20demo=E8=A1=A5=E6=97=8F=EF=BC=89+t?= =?UTF-8?q?g=5Fband()=E5=90=8C=E6=BA=90=E5=88=86=E6=97=8F=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=EF=BC=88Q4=E7=94=B2=E4=B8=89=E9=80=89=E4=B8=80/?= =?UTF-8?q?=E8=B4=A7=E6=9E=B6=E5=90=8C=E5=88=A4=EF=BC=9Baoe/blast=E5=BD=92?= =?UTF-8?q?AOE=3Dreward.tres=E7=8E=B0=E6=88=90spark=5Faoe/clear=5Fblast?= =?UTF-8?q?=E6=B6=88=E8=B4=B9=E9=9D=A2=EF=BC=9Bmax=5Fhp=E5=BD=92=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E6=97=8F=EF=BC=89+=E5=95=86=E5=BA=97=E8=B4=A7?= =?UTF-8?q?=E6=9E=B6=E5=9B=BA=E5=AE=9A=E9=BB=98=E8=AE=A4=E5=B8=A6=E6=94=B9?= =?UTF-8?q?=E5=88=86=E6=97=8F=EF=BC=9B=E6=8E=A2=E9=92=88=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E6=B8=85=E9=9B=B6=3D=E5=91=88=E7=8E=B0=E5=B1=82?= =?UTF-8?q?=E8=A3=B8Color8=3D0=EF=BC=9B=E8=BD=BB=E9=97=B8=E5=86=92?= =?UTF-8?q?=E7=83=9F782/0+=E4=B8=89=E6=8E=A2=E9=92=88=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/ui_assembler.gd | 4 +- game/presentation/views/ap_bar_view.gd | 8 ++-- game/presentation/views/battle_end_overlay.gd | 2 +- game/presentation/views/board_cell_unit.gd | 11 ++---- game/presentation/views/board_zone_view.gd | 2 +- game/presentation/views/camp_overlay_view.gd | 2 +- game/presentation/views/curio_pick_overlay.gd | 8 +--- game/presentation/views/level_map_screen.gd | 11 +++--- game/presentation/views/settings_overlay.gd | 4 +- game/presentation/views/shop_overlay_view.gd | 2 +- game/presentation/views/ui_kit.gd | 38 +++++++++++++++++++ game/smoke/ui_contrast_probe.gd | 17 ++------- 12 files changed, 63 insertions(+), 46 deletions(-) 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 := {} # 测点表:[名称, 墨色, 直背景, 墨α](语义见行尾;新增文字位随批入表,白名单豁免须注理由) From b26e3fb064bff88dc68bbe86c47b301bed405be0 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:22:41 +0800 Subject: [PATCH 06/12] =?UTF-8?q?iter16ui=20T4b=EF=BC=9AP7=E4=B9=99?= =?UTF-8?q?=E4=BA=94token=E6=94=B9=E5=90=91demo=E5=80=BC=EF=BC=88PANEL=5FD?= =?UTF-8?q?ATA#E9D9B8/PANEL=5FBORDER#786E58/SLOT=5FBACKDROP#3E362C/HP=5FBA?= =?UTF-8?q?R=5FBACK#282220/CAMP=5FHEADER=5FBAND#6E4526=EF=BC=8C=CE=94?= =?UTF-8?q?=E2=89=A46/255=EF=BC=89+BCard=E7=9F=B3=E7=9A=AE=E7=BC=BA?= =?UTF-8?q?=E4=BD=8D=E5=9B=9E=E9=80=80=E5=AD=97=E9=9D=A2=E9=87=8F=E9=80=80?= =?UTF-8?q?=E5=BD=B9=E5=BD=92PANEL=5FDATA=E5=8D=95=E7=82=B9+art-bible=20?= =?UTF-8?q?=C2=A77.2=E4=BA=94=E4=BB=B6=E5=AF=B9=E9=BD=90=E6=B3=A8=E8=AE=B0?= =?UTF-8?q?=E5=8F=8C=E4=BE=A7=E8=90=BD=E6=96=87=EF=BC=9B=E8=BD=BB=E9=97=B8?= =?UTF-8?q?=E5=86=92=E7=83=9F782/0+=E4=B8=89=E6=8E=A2=E9=92=88=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 1 + game/presentation/views/ui_kit.gd | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index d9042ea2..369609f7 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -408,6 +408,7 @@ **数据素面的墨来自世界的墨**:UI 数字、进度、准线一律主墨 `#33261B` 系——棋盘与面板读同一种墨;容器穿木石材质色,数据只穿墨。**营地与棋盘**:菜单容器背景用全作最暖的烛光黄 `#F6C667` 与木色 `#8A5A34`(§2.8;场景构成 §6.2);战斗容器转中性石色,防暖色渗入棋盘分走数字对比预算——氛围色向可读色让路。UI 不新增语义色,一切强调沿用 §4.2。**暗底呈现态双色墨制**(关卡画面样张 v1 冻结 2026-09-28):暗底系(已过/未来/候选/Boss 方块、暗数据框)图标与读数一律暖白 `#F0E2C8`(WARM)、亮底(当前金 `#F0A828`)转深墨 `#181410`(INK_ROUTE)——各态对比 ≥4.5:1;已过节点暗金冻结 `GOLD_DONE #68562C`(专用呈现态值,旧 GOLD_DIM `#8C743C` 对双色墨均不达标退役出该呈现位);Boss 描边 = 紫赤 2px + 外缘 1px 深墨环(灰度冗余通道——§4.2 色相独占本色不变,§4.5 灰度可分类承载)。 - **琥珀双岗注记(2026-10-04 UI 落码批 M0)**:主操作色与收益金分轨——主按钮/候选节点/钥石徽章底用烛光黄 `#F6C667`(CANDLE,独立 token),奖励数字/钥石读数/地图「当前位置」仍独占 §4.1 奖励金 `#F0A828`。烛光黄族身兼「主操作 + 收益邻近氛围」双岗系主动取舍(原型评审 C 组留痕),非疏忽,防回改。底色三件套同步换代:BG_ROOT `#3A2E22`/BG_OVERLAY `#362B20`/新增 BG_BRIGHT `#453723`(配色总纲「提暖提亮禁近黑」);暖米族 WARM_SOFT `#E8D5A8`/WARM_FAINT `#CDB88C`(「米色去灰」)。 +- **色板五件对齐注记(2026-10-06 UI 设计对齐批 P7 乙——demo=唯一来源)**:数据板 `PANEL_DATA #E9D9B8`/板线 `PANEL_BORDER #786E58`/状态槽底 `SLOT_BACKDROP #3E362C`/血条深底 `HP_BAR_BACK #282220`/营地头带 `CAMP_HEADER_BAND #6E4526` 五 token 取值换代向原型 v2.1 对齐(Δ≤6/255 目视不可辨;代码与文档同批双侧落文)。色板唯一来源 = ui_kit 单点不变;原型文件只读不改(artwork 红线)。 ### 7.3 布局栅格 diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index c4e2c7d1..083532b5 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -21,8 +21,8 @@ const INK_TITLE := Color8(30, 26, 22) # 亮底标题墨 const INK_ROUTE := Color8(24, 20, 16) # 节点图最深墨 const INK_ON_GOLD := Color8(60, 44, 20) # 金底上的深墨 -const PANEL_DATA := Color8(226, 210, 182) # 面板底·数据框(AP 条/状态槽) -const PANEL_BORDER := Color8(120, 106, 88) # 面板细线框;兼熄灭点阵(DOT_OFF 别名) +const PANEL_DATA := Color8(233, 217, 184) # 面板底·数据框(AP 条/状态槽)#E9D9B8(P7 乙 2026-10-06——demo 唯一来源对齐,Δ≤6/255) +const PANEL_BORDER := Color8(120, 110, 88) # 面板细线框;兼熄灭点阵(DOT_OFF 别名)#786E58(P7 乙同上) const GOLD := Color8(240, 168, 40) # 奖励金 const GOLD_DEEP := Color8(176, 122, 20) # 深金(金框描边/达意金) @@ -101,7 +101,7 @@ const CONTACT_GLOW_DEEP := Color8(150, 190, 230) # 接触带呼吸暗端(ler const DIGIT_PLATE := Color8(245, 234, 211) # 数字色牌(素色暖纸白直角牌——art-bible §4.1;数字一律垫牌, # 可读不依赖格底——原则二;2026-09-26 呈现修复批落码) const DIGIT_PLATE_EDGE := Color8(210, 198, 172) # 色牌牌缘线 -const SLOT_BACKDROP := Color8(52, 44, 36) # B 区状态图标槽实底(深墨棕——白图标对比承载,2026-09-26 反馈④) +const SLOT_BACKDROP := Color8(62, 54, 44) # B 区状态图标槽实底(深墨棕——白图标对比承载)#3E362C(P7 乙 2026-10-06 对齐) const BG_ROOT := Color8(58, 46, 34) # 屏幕根底 #3A2E22(UI 落码批 M0 2026-10-04——配色总纲「提暖提亮禁近黑」,旧近黑 #1E1914 退役) const BG_OVERLAY := Color8(54, 43, 32) # 模态遮罩底 #362B20(同批换代,旧 #1C1612 退役) @@ -118,10 +118,10 @@ const BEAM_LIGHT := Color8(255, 236, 200) # B 区顶光柱暖光(用时乘 const STAND_STONE := Color8(150, 130, 100) # 站桩石板地台·板身(standee_body 方向稿取色) const STAND_STONE_EDGE := Color8(90, 76, 58) # 站桩石板地台·描边 const STAND_STONE_RIM := Color8(196, 172, 132) # 站桩石板地台·顶缘受光线(board_cell_unit 口沿高光已并档至此——清扫批 2026-10-02) -const CAMP_HEADER_BAND := Color8(122, 82, 50) # 营地柜台头带深棕(4-camp.png 方向稿取色) +const CAMP_HEADER_BAND := Color8(110, 69, 38) # 营地柜台头带深棕 #6E4526(4-camp.png 方向稿取色——P7 乙 2026-10-06 对齐 demo --wood-deep) const CAMP_ROW_PLATE := Color8(240, 230, 206) # 营地行板暖米(同上) const CAMP_BADGE_PANEL := Color8(40, 32, 24) # 营地钥石徽暗底(同上) -const HP_BAR_BACK := Color8(40, 34, 28) # 迷你血条深底(关卡画面样张 v1 冻结——对暗面板可辨) +const HP_BAR_BACK := Color8(40, 34, 32) # 迷你血条深底 #282220(关卡画面样张 v1 冻结——P7 乙 2026-10-06 对齐;兼 N1 血数垫牌) # BBCode 十六进制(RichTextLabel 用;与上同值) const HEX_GOLD := "f0a828" @@ -439,7 +439,7 @@ class BCard: func _init(title: String, desc: String, band: Color, icon_path: String, price := "", footnote := "") -> void: var tex := UiKit.load_tex(UiKit.TEX_PANEL_STONE) - _sb_normal = UiKit.panel_skinned(Vector4(12, 10, 12, 10)) if tex != null else UiKit.panel_flat(Color8(233, 217, 184), UiKit.PANEL_BORDER, 5, 1, Vector4(12, 10, 12, 10)) + _sb_normal = UiKit.panel_skinned(Vector4(12, 10, 12, 10)) if tex != null else UiKit.panel_flat(PANEL_DATA, PANEL_BORDER, 5, 1, Vector4(12, 10, 12, 10)) # 回退=数据板单点(P7 乙后同值,字面量退役) _sb_sel = UiKit.panel_flat(Color8(233, 217, 184), Color8(138, 90, 52), 5, 2, Vector4(12, 10, 12, 10)) add_theme_stylebox_override("panel", _sb_normal) custom_minimum_size = Vector2(216, 300) From 2f74da830b3f7eb05a8bf63ce12267a809dc969b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:31:13 +0800 Subject: [PATCH 07/12] =?UTF-8?q?iter16ui=20T5=EF=BC=9AP4=E4=B9=99panel?= =?UTF-8?q?=E5=88=87=E7=89=878=E2=86=9216=EF=BC=88PANEL=5FSLICE=E5=8D=95?= =?UTF-8?q?=E7=82=B9=EF=BC=8Cbutton=208/=E4=BB=AA=E5=BC=8F=E6=A1=8612?= =?UTF-8?q?=E7=BB=B4=E6=8C=81=EF=BC=89+Q1=E4=B8=99panel=5Fskinned=E5=B7=A5?= =?UTF-8?q?=E5=8E=82content=20margin=20clamp=EF=BC=88=E4=BD=8E=E4=BA=8E?= =?UTF-8?q?=E5=88=87=E7=89=87=E8=87=AA=E5=8A=A8=E6=8A=AC=E5=B9=B3=EF=BC=8C?= =?UTF-8?q?9=E6=B6=88=E8=B4=B9=E9=9D=A27=E5=A4=84=E5=8F=97=E7=9B=8A?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E7=82=B9=E9=9B=B6=E6=94=B9=EF=BC=89+P5?= =?UTF-8?q?=E7=94=B2=E5=9C=86=E8=A7=92=E6=94=B6=E6=95=9BRADIUS=5FOBJECT=3D?= =?UTF-8?q?5=E5=8D=95=E7=82=B9=EF=BC=8826=E5=A4=842/3/4/5/6/8=E6=A1=A3?= =?UTF-8?q?=E5=BD=92=E4=B8=80=EF=BC=9B=E4=BE=8B=E5=A4=9617=E5=BA=95?= =?UTF-8?q?=E5=BA=A7/200=E9=87=91=E5=8D=B0/100=E8=84=89=E5=86=B2=E7=8E=AF?= =?UTF-8?q?=E4=BF=9D=E7=95=99=EF=BC=89+bcard=E9=80=89=E4=B8=AD=E5=BA=95?= =?UTF-8?q?=E5=AD=97=E9=9D=A2=E9=87=8F=E9=80=80=E5=BD=B9=E5=BD=92PANEL=5FD?= =?UTF-8?q?ATA+art-bible=20=C2=A77.1=E5=9C=86=E8=A7=92=E5=8D=95=E7=82=B9?= =?UTF-8?q?=E4=B8=8E=E4=B9=9D=E5=AE=AB=E6=A0=BC=E5=88=87=E7=89=87=E4=B8=A4?= =?UTF-8?q?=E6=9D=A1=E6=B3=A8=E8=AE=B0=E5=8F=8C=E4=BE=A7=E8=90=BD=E6=96=87?= =?UTF-8?q?=EF=BC=9B=E8=BD=BB=E9=97=B8=E5=86=92=E7=83=9F782/0+probe=5Fgate?= =?UTF-8?q?=20--click=E5=85=A8=E7=BB=BF=EF=BC=88click=20done=3Dtrue=20?= =?UTF-8?q?=E9=97=AE=E9=A2=98=3D0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 2 + game/presentation/views/board_view.gd | 4 +- game/presentation/views/camp_overlay_view.gd | 14 +++---- game/presentation/views/settlement_fx_view.gd | 4 +- game/presentation/views/shop_overlay_view.gd | 4 +- game/presentation/views/status_slot_row.gd | 4 +- game/presentation/views/toast_stack.gd | 2 +- game/presentation/views/ui_kit.gd | 39 ++++++++++++------- 8 files changed, 42 insertions(+), 31 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 369609f7..07e07fa8 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -397,6 +397,8 @@ **半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**数字色牌 = 直角小素牌**(2026-09-29 v3.0 后备件)——宽随数字位、无纹理无装饰,仅复杂格底兜底时垫于数字正下方一层(色值 §4.1),属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。 - **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认不得同位(位置通道)。 +- **圆角率单点注记(2026-10-06 UI 设计对齐批 P5 甲)**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;与主/危按钮原 5px 同值,面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。收敛前实测 0/2/3/4/5/6/8/17/100/200 十档并存。 +- **九宫格切片注记(2026-10-06 UI 设计对齐批 P4 乙+Q1 丙)**:panel 石皮 `PANEL_SLICE = 16`(原 8→16,与原型 .plate9 slice16 对齐;button 维持 8、仪式框维持 12——素材 panel_stone/button_stone 均 48×48 不动);`panel_skinned` 工厂内 **content margin clamp**=低于切片的分量自动抬到切片(石框纹理不吃内容;工厂单点,调用点零改)。本节原无切片条款,此为新增注记。 - **资产渠道**:♻ 九宫格面板/按钮改色过复用闸优先(清单 §0),⚙ 兜底;样式终稿随 §1.4 样张闸后定稿。 - **占位收口条款(2026-09-29 v3.0 新增,病根 8)**:程序化占位 = **临时态**,任何屏的终稿闸 = §1.4 整屏样张过闸;占位态不得跨里程碑。 - **实现侧边界**:样式收敛 ui_kit;ui_kit 的工程契约归《HUD框架》,本节不重述。 diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index f3d6a41c..da2e1393 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -739,10 +739,10 @@ func _paint_cell(c: Vector2i, hero: Vector2i) -> void: tile = _floor_tile_for(c) if revealed else _wall_tile_for(c) else: # 素材整批缺位回退 = 现行程序化平色路径(fresh checkout 冒烟不炸——任务书 §2.2) - sb = UiKit.panel_flat(bg, bg.darkened(0.15), 3) + sb = UiKit.panel_flat(bg, bg.darkened(0.15),UiKit.RADIUS_OBJECT) if is_hero: if sb == null: - sb = UiKit.panel_flat(Color.TRANSPARENT, Color.TRANSPARENT, 3, 0) + sb = UiKit.panel_flat(Color.TRANSPARENT, Color.TRANSPARENT,UiKit.RADIUS_OBJECT, 0) sb.set_border_width_all(3) sb.border_color = COL_HERO if glyph == "" and _hero_tex_idle == null: diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index decd511e..07659967 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -67,7 +67,7 @@ func _init() -> void: col.add_child(top) var plaque := PanelContainer.new() plaque.add_theme_stylebox_override("panel", - UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER, 2, 1, Vector4(14, 8, 14, 8))) + UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(14, 8, 14, 8))) top.add_child(plaque) var plaque_col := VBoxContainer.new() plaque.add_child(plaque_col) @@ -82,7 +82,7 @@ func _init() -> void: # M3(UI 落码批 2026-10-04):钥石徽章烛光黄底+深墨字(demo ②——旧暗底 CAMP_BADGE_PANEL 退役; # BADGE_PANEL_COL 常量保留他用不动) badge.add_theme_stylebox_override("panel", - UiKit.panel_flat(UiKit.CANDLE, UiKit.CAMP_HEADER_BAND, 2, 1, Vector4(14, 8, 14, 8))) + UiKit.panel_flat(UiKit.CANDLE, UiKit.CAMP_HEADER_BAND,UiKit.RADIUS_OBJECT, 1, Vector4(14, 8, 14, 8))) top.add_child(badge) var bal_row := HBoxContainer.new() bal_row.add_theme_constant_override("separation", 6) @@ -151,12 +151,12 @@ func _counter_panel(title_text: String, icon_path: String, holder: Control, min_ var panel := PanelContainer.new() panel.custom_minimum_size = Vector2(min_w, 0) panel.add_theme_stylebox_override("panel", - UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER, 3, 1, Vector4(10, 10, 10, 10))) + UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(10, 10, 10, 10))) var vbox := VBoxContainer.new() vbox.add_theme_constant_override("separation", 8) panel.add_child(vbox) var band := PanelContainer.new() - band.add_theme_stylebox_override("panel", UiKit.panel_flat(HEADER_BAND_COL, UiKit.PANEL_BORDER, 2, 1, Vector4(10, 5, 10, 5))) + band.add_theme_stylebox_override("panel", UiKit.panel_flat(HEADER_BAND_COL, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(10, 5, 10, 5))) vbox.add_child(band) var head := HBoxContainer.new() head.add_theme_constant_override("separation", 6) @@ -307,7 +307,7 @@ func _rebuild_forge(data: Dictionary) -> void: func _build_forge_row(holder: VBoxContainer, row: Dictionary) -> Dictionary: var card := PanelContainer.new() - card.add_theme_stylebox_override("panel", UiKit.panel_flat(ROW_PLATE_COL, UiKit.PANEL_BORDER, 2, 1, Vector4(10, 4, 10, 4))) + card.add_theme_stylebox_override("panel", UiKit.panel_flat(ROW_PLATE_COL, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(10, 4, 10, 4))) var line := HBoxContainer.new() line.add_theme_constant_override("separation", 12) card.add_child(line) @@ -332,7 +332,7 @@ func _build_forge_row(holder: VBoxContainer, row: Dictionary) -> Dictionary: line.add_child(name_l) 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.add_theme_stylebox_override("normal", UiKit.panel_flat(UiKit.CAMP_HEADER_BAND, Color(0, 0, 0, 0),UiKit.RADIUS_OBJECT, 0, Vector4(6, 0, 6, 0))) level_l.custom_minimum_size = Vector2(44, 0) line.add_child(level_l) var price_l := UiKit.label("", 14, false, UiKit.STONE) @@ -351,7 +351,7 @@ func _rebuild_workshop(data: Dictionary) -> void: child.queue_free() for row in data.get("workshop", []): var card := PanelContainer.new() - card.add_theme_stylebox_override("panel", UiKit.panel_flat(ROW_PLATE_COL, UiKit.PANEL_BORDER, 2, 1, Vector4(10, 4, 10, 4))) + card.add_theme_stylebox_override("panel", UiKit.panel_flat(ROW_PLATE_COL, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(10, 4, 10, 4))) var line := HBoxContainer.new() line.add_theme_constant_override("separation", 12) card.add_child(line) diff --git a/game/presentation/views/settlement_fx_view.gd b/game/presentation/views/settlement_fx_view.gd index 067d3a01..1d6a0c5a 100644 --- a/game/presentation/views/settlement_fx_view.gd +++ b/game/presentation/views/settlement_fx_view.gd @@ -127,7 +127,7 @@ func play_round_banner(ri: int) -> void: _fx_banners += 1 var banner := Panel.new() banner.mouse_filter = Control.MOUSE_FILTER_IGNORE - banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, 8, 2)) + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP,UiKit.RADIUS_OBJECT, 2)) var lab := UiKit.label("第 %d 轮" % ri, 22, true, UiKit.GOLD) lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER @@ -156,7 +156,7 @@ func play_board_variant_banner(text: String) -> void: _fx_banners += 1 var banner := Panel.new() banner.mouse_filter = Control.MOUSE_FILTER_IGNORE - banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, 8, 2)) + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP,UiKit.RADIUS_OBJECT, 2)) var lab := UiKit.label(text, 22, true, UiKit.GOLD) lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER diff --git a/game/presentation/views/shop_overlay_view.gd b/game/presentation/views/shop_overlay_view.gd index c60429fb..6af46e71 100644 --- a/game/presentation/views/shop_overlay_view.gd +++ b/game/presentation/views/shop_overlay_view.gd @@ -52,7 +52,7 @@ func _init() -> void: _refresh_btn.add_child(stock_badge) var gp_chip := PanelContainer.new() gp_chip.add_theme_stylebox_override("panel", - UiKit.panel_flat(UiKit.CANDLE, UiKit.CAMP_HEADER_BAND, 2, 1, Vector4(12, 4, 12, 4))) + UiKit.panel_flat(UiKit.CANDLE, UiKit.CAMP_HEADER_BAND,UiKit.RADIUS_OBJECT, 1, Vector4(12, 4, 12, 4))) top.add_child(gp_chip) _gp_label = UiKit.label("金币 0", 16, true, UiKit.INK_ON_GOLD) gp_chip.add_child(_gp_label) @@ -94,7 +94,7 @@ func refresh_state(products: Array, gp: int) -> void: # 商品卡(显示名 + 档位文案 | 现价 | 已购档数 | 购买按钮) func _build_card(p: Dictionary) -> Dictionary: var card := PanelContainer.new() - card.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.BG_OVERLAY, UiKit.GOLD_DIM, 4, 1, Vector4(12, 6, 12, 6))) + card.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.BG_OVERLAY, UiKit.GOLD_DIM,UiKit.RADIUS_OBJECT, 1, Vector4(12, 6, 12, 6))) var row := HBoxContainer.new() row.add_theme_constant_override("separation", 14) card.add_child(row) diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index 4ec168f6..ac8143a5 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -62,7 +62,7 @@ func _init() -> void: _tip.z_index = 10 _tip.mouse_filter = Control.MOUSE_FILTER_IGNORE _tip.visible = false - var sb := UiKit.panel_flat(UiKit.TIP_BG, UiKit.GOLD, 2, 1, Vector4(6, 3, 6, 3)) + var sb := UiKit.panel_flat(UiKit.TIP_BG, UiKit.GOLD,UiKit.RADIUS_OBJECT, 1, Vector4(6, 3, 6, 3)) _tip.add_theme_stylebox_override("panel", sb) _tip_label = UiKit.label("", 13, false, UiKit.WARM) _tip_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART @@ -107,7 +107,7 @@ func _make_slot() -> PanelContainer: # 槽底不透明(2026-09-26 用户反馈:图标显示不清晰——半透明底叠 B 区米色面板吃掉白图标对比度; # 改深墨棕实底 = 白色纹样图标对比承载,槽界同时可辨) slot.add_theme_stylebox_override("panel", - UiKit.panel_flat(UiKit.SLOT_BACKDROP, UiKit.PANEL_BORDER, 2, 1, Vector4(2, 1, 2, 1))) + UiKit.panel_flat(UiKit.SLOT_BACKDROP, UiKit.PANEL_BORDER,UiKit.RADIUS_OBJECT, 1, Vector4(2, 1, 2, 1))) else: slot.custom_minimum_size = Vector2(50, 46) slot.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER)) diff --git a/game/presentation/views/toast_stack.gd b/game/presentation/views/toast_stack.gd index 755a9798..5d30f69f 100644 --- a/game/presentation/views/toast_stack.gd +++ b/game/presentation/views/toast_stack.gd @@ -35,7 +35,7 @@ func show_toast(text: String, tone: String = "info") -> void: row.mouse_filter = Control.MOUSE_FILTER_IGNORE row.clip_contents = true # 缺陷①约束:固定槽高裁剪,不回流布局 row.custom_minimum_size = Vector2(0, 24) - var sb := UiKit.panel_flat(UiKit.TOAST_BG, COL_INFO, 2, 1, Vector4(8, 2, 8, 2)) + var sb := UiKit.panel_flat(UiKit.TOAST_BG, COL_INFO,UiKit.RADIUS_OBJECT, 1, Vector4(8, 2, 8, 2)) var col := COL_INFO if tone == "warn": col = COL_WARN diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 083532b5..5439aaa8 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -228,6 +228,11 @@ static func load_font(path: String) -> Font: # ── StyleBox 工厂 ── # margin = (左, 上, 右, 下);border_w = 0 即无边框(根底/遮罩用) +# 圆角率单点(UI 设计对齐批 P5 甲 2026-10-06——容器/按钮全站唯一圆角值;数据框/数字牌/AP 点阵/准线/血条 +# =0 直角不变;底座椭圆 17/结算金印 200/状态脉冲环 100 圆形 = §7.1 明示例外保留。取值=代拍板 5,可推翻) +const RADIUS_OBJECT := 5 +# 九宫格切片(P4 乙 2026-10-06——panel 石皮 8→16 与 demo .plate9 slice16 对齐;button 维持 8、仪式框维持 12) +const PANEL_SLICE := 16.0 static func panel_flat(bg: Color, border: Color, corner: int = 0, border_w: int = 1, margin: Vector4 = Vector4.ZERO) -> StyleBoxFlat: var sb := StyleBoxFlat.new() sb.bg_color = bg @@ -320,15 +325,19 @@ static func _tex_sb(tex: Texture2D, margin: float, tint := Color.WHITE) -> Style # 石板亮面板(B 区舞台/C 区主面板/图例——容器穿戏服;数据框仍 panel_flat 素面 §7.1) +# Q1 丙(2026-10-06):content margin 低于切片的分量自动抬到切片——切片加大到 16 后石框纹理不吃内容 +# (T0 实查 9 消费面 7 处 margin<16;工厂单点 clamp,调用点零改) static func panel_skinned(margin: Vector4 = Vector4.ZERO, tint := Color.WHITE) -> StyleBox: + var m := Vector4(maxf(margin.x, PANEL_SLICE), maxf(margin.y, PANEL_SLICE), + maxf(margin.z, PANEL_SLICE), maxf(margin.w, PANEL_SLICE)) var tex := load_tex(TEX_PANEL_STONE) if tex == null: - return panel_flat(PANEL_DATA, PANEL_BORDER, 4, 1, margin) - var sb := _tex_sb(tex, 8.0, tint) - sb.content_margin_left = margin.x - sb.content_margin_top = margin.y - sb.content_margin_right = margin.z - sb.content_margin_bottom = margin.w + return panel_flat(PANEL_DATA, PANEL_BORDER, RADIUS_OBJECT, 1, m) + var sb := _tex_sb(tex, PANEL_SLICE, tint) + sb.content_margin_left = m.x + sb.content_margin_top = m.y + sb.content_margin_right = m.z + sb.content_margin_bottom = m.w return sb @@ -336,7 +345,7 @@ static func panel_skinned(margin: Vector4 = Vector4.ZERO, tint := Color.WHITE) - static func frame_skinned(margin: Vector4 = Vector4.ZERO) -> StyleBox: var tex := load_tex(TEX_BORDER_STONE) if tex == null: - return panel_flat(BG_OVERLAY, PANEL_BORDER, 6, 1, margin) + return panel_flat(BG_OVERLAY, PANEL_BORDER,RADIUS_OBJECT, 1, margin) var sb := _tex_sb(tex, 12.0) sb.content_margin_left = margin.x sb.content_margin_top = margin.y @@ -396,10 +405,10 @@ static func verb_button(text: String, icon_path: String, tip := "") -> Button: # 主操作钮(烛光黄平涂+木描边——非奖励金;配色总纲「主按钮禁亮金」;缺 panel_stone 依赖=纯色可靠) static func primary_button(text: String, tip := "") -> Button: var b := button(text) - var sb := panel_flat(CANDLE, Color8(110, 69, 52), 5, 2, Vector4(10, 2, 10, 2)) + var sb := panel_flat(CANDLE, Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)) b.add_theme_stylebox_override("normal", sb) - b.add_theme_stylebox_override("hover", panel_flat(CANDLE.lightened(0.06), Color8(110, 69, 52), 5, 2, Vector4(10, 2, 10, 2))) - b.add_theme_stylebox_override("pressed", panel_flat(Color8(214, 172, 88), Color8(110, 69, 52), 5, 2, Vector4(10, 2, 10, 2))) + b.add_theme_stylebox_override("hover", panel_flat(CANDLE.lightened(0.06), Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))) + b.add_theme_stylebox_override("pressed", panel_flat(Color8(214, 172, 88), Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))) b.add_theme_color_override("font_color", Color8(58, 42, 8)) b.add_theme_color_override("font_hover_color", Color8(58, 42, 8)) b.add_theme_color_override("font_pressed_color", Color8(58, 42, 8)) @@ -412,9 +421,9 @@ static func primary_button(text: String, tip := "") -> Button: # 危险钮(深红平涂——放弃/删除类;破坏性确认位置纪律=不得与常规确认同位) static func danger_button(text: String, tip := "") -> Button: var b := button(text) - var sb := panel_flat(Color8(180, 78, 54), Color8(110, 42, 28), 5, 2, Vector4(10, 2, 10, 2)) + 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), 5, 2, Vector4(10, 2, 10, 2))) + b.add_theme_stylebox_override("hover", panel_flat(Color8(196, 90, 62), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))) b.add_theme_color_override("font_color", Color8(255, 244, 224)) b.add_theme_color_override("font_hover_color", Color8(255, 244, 224)) b.add_theme_color_override("font_pressed_color", Color8(255, 244, 224)) @@ -439,8 +448,8 @@ class BCard: func _init(title: String, desc: String, band: Color, icon_path: String, price := "", footnote := "") -> void: var tex := UiKit.load_tex(UiKit.TEX_PANEL_STONE) - _sb_normal = UiKit.panel_skinned(Vector4(12, 10, 12, 10)) if tex != null else UiKit.panel_flat(PANEL_DATA, PANEL_BORDER, 5, 1, Vector4(12, 10, 12, 10)) # 回退=数据板单点(P7 乙后同值,字面量退役) - _sb_sel = UiKit.panel_flat(Color8(233, 217, 184), Color8(138, 90, 52), 5, 2, Vector4(12, 10, 12, 10)) + _sb_normal = UiKit.panel_skinned(Vector4(12, 10, 12, 10)) if tex != null else UiKit.panel_flat(PANEL_DATA, PANEL_BORDER,RADIUS_OBJECT, 1, Vector4(12, 10, 12, 10)) # 回退=数据板单点(P7 乙后同值,字面量退役) + _sb_sel = UiKit.panel_flat(PANEL_DATA, Color8(138, 90, 52), RADIUS_OBJECT, 2, Vector4(12, 10, 12, 10)) # 选中底=数据板单点(P7 乙后同值) add_theme_stylebox_override("panel", _sb_normal) custom_minimum_size = Vector2(216, 300) var box := VBoxContainer.new() @@ -506,7 +515,7 @@ class SwitchToggle: toggle_mode = true button_pressed = initial custom_minimum_size = Vector2(46, 22) - var track := UiKit.panel_flat(Color8(184, 165, 130), Color8(120, 110, 88), 3, 2) + var track := UiKit.panel_flat(Color8(184, 165, 130), Color8(120, 110, 88),RADIUS_OBJECT, 2) add_theme_stylebox_override("normal", track) add_theme_stylebox_override("hover", track) add_theme_stylebox_override("pressed", track) From e0fd7cb8d7a6414e555756ad7e7edc3df28c890f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:38:51 +0800 Subject: [PATCH 08/12] =?UTF-8?q?iter16ui=20T6=EF=BC=9AP3=E7=94=B2FS=5F*?= =?UTF-8?q?=E5=85=AD=E6=A1=A3=E5=AD=97=E5=8F=B7=E6=A1=A3=E4=BD=8D=E8=A1=A8?= =?UTF-8?q?=E7=AB=8B=E9=A1=B9=EF=BC=88CAPTION12/HINT14/BODY16/SUB18/TITLE2?= =?UTF-8?q?4/H1=3D34=EF=BC=89+=E5=85=A8=E5=BA=93=E8=A3=B8=E5=AD=97?= =?UTF-8?q?=E5=8F=B7=E5=BD=92=E6=A1=A3107=E4=BD=8D=E7=82=B9=EF=BC=88?= =?UTF-8?q?=E5=B0=B1=E8=BF=91=E6=98=A0=E5=B0=84=EF=BC=9B4=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E4=BD=8D=E7=82=B9=E9=99=A4=E5=A4=96=EF=BC=9Bsettlemen?= =?UTF-8?q?t=5Ffx=E4=B8=A4=E5=A4=84span=E9=94=99=E4=BD=8D=E5=86=99?= =?UTF-8?q?=E5=85=A5=E5=BD=93=E5=9C=BA=E4=BF=AE=E5=A4=8D=EF=BC=89+11px?= =?UTF-8?q?=E5=85=AD=E5=A4=84=E6=8F=90FS=5FCAPTION=E5=B9=B6=E5=85=A5P11?= =?UTF-8?q?=E8=B1=81=E5=85=8D=E6=B8=85=E5=8D=95+art-bible=20=C2=A77.4?= =?UTF-8?q?=E6=A1=A3=E4=BD=8D=E8=A1=A8=E4=B8=8E=E8=B1=81=E5=85=8D=E6=B8=85?= =?UTF-8?q?=E5=8D=95=E8=90=BD=E6=96=87=EF=BC=88=E6=9D=A1=E5=B8=A6=E5=86=85?= =?UTF-8?q?=E8=AF=BB=E6=95=B0=3D=E8=A1=80=E6=95=B0=E4=B8=80=E5=A4=84?= =?UTF-8?q?=EF=BC=9Bcaption=E6=A1=A3=E9=80=90=E5=A4=84=E6=B8=85=E5=8D=95?= =?UTF-8?q?=EF=BC=89=EF=BC=9B=E8=BD=BB=E9=97=B8=E5=86=92=E7=83=9F782/0+?= =?UTF-8?q?=E4=B8=89=E6=8E=A2=E9=92=88+layout=E5=85=A8=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 3 +- game/presentation/main.gd | 2 +- game/presentation/ui_assembler.gd | 14 ++++---- game/presentation/views/ap_bar_view.gd | 10 +++--- game/presentation/views/battle_end_overlay.gd | 8 ++--- game/presentation/views/battle_log_view.gd | 4 +-- game/presentation/views/battle_stage_view.gd | 4 +-- game/presentation/views/board_fx_view.gd | 2 +- game/presentation/views/board_zone_view.gd | 2 +- game/presentation/views/camp_overlay_view.gd | 34 +++++++++---------- game/presentation/views/confirm_dialog.gd | 2 +- game/presentation/views/curio_pick_overlay.gd | 8 ++--- game/presentation/views/debug_overlay.gd | 16 ++++----- .../views/hero_info_panel_view.gd | 20 +++++------ game/presentation/views/legend_overlay.gd | 4 +-- game/presentation/views/level_map_screen.gd | 20 +++++------ game/presentation/views/node_overlay.gd | 2 +- game/presentation/views/settings_overlay.gd | 18 +++++----- game/presentation/views/settlement_fx_view.gd | 12 +++---- .../views/settlement_review_overlay.gd | 2 +- game/presentation/views/shop_overlay_view.gd | 14 ++++---- game/presentation/views/standee_body.gd | 2 +- game/presentation/views/status_slot_row.gd | 6 ++-- game/presentation/views/toast_stack.gd | 2 +- game/presentation/views/ui_kit.gd | 21 +++++++++--- 25 files changed, 122 insertions(+), 110 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 07e07fa8..7a2e29c4 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -421,7 +421,8 @@ - **字体**:全局一套像素字——拉丁候选 Kenney Fonts(CC0)、中文候选缝合像素字体 Fusion Pixel(OFL)(清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。 - **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座;2026-09-29 v3.0 对齐 ux-designer PC 规范):棋盘数字 ≥18px(公式 = max(18, ceil(格边长 × 0.5))不变)、**正文/明细 ≥16px、tooltip ≥14px**(旧 14/13px 下限退役——1280×800 低于 1080p 基准,同字号实际更小)。 -- **小字号豁免条款(2026-10-06 UI 设计对齐批 P11+Q5 甲,合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。两类豁免均须逐处登记清单(条带内读数清单=B 区站桩血数一处;装饰 caption 逐处清单随本批字号档位卡落本节),清单外的 11-13px 文字一律按正文/tooltip 下限提档。 +- **字号档位表(2026-10-06 UI 设计对齐批 P3 甲——WB G1 六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号退役——`FS_CAPTION 12`/`FS_HINT 14`/`FS_BODY 16`/`FS_SUB 18`/`FS_TITLE 24`/`FS_H1 34`。旧 15 实测档按就近归档收编(10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、21/22/24/26→TITLE、32/40→H1;T0 普查 107 静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `maxi(18, ceil(格边长×0.5))` 与站桩血数 11px(条带内读数豁免)不入表。注:六档相邻比 12→14→16→18 三段 <1.25×,系 P3 裁决值优先于字重纪律的档差参考线,档差参考线对新层级设计仍有效。 +- **小字号豁免条款(2026-10-06 UI 设计对齐批 P11+Q5 甲,合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**两类豁免逐处清单(2026-10-06 T6 判定落定)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=主菜单分组 overline×2(「── 冒 险 ──」「── 营地与系统 ──」)/棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。 - **字重纪律(2026-09-29 v3.0 修订)**:层级手段解禁为三件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅 +(字体支持时)字重两档**;数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。 ### 7.5 营地界面 diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 7977e027..96605e33 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -335,7 +335,7 @@ func _build_ui() -> void: func _fatal_screen(msg: String) -> void: - var l := UiKit.label(msg, 20, true, UiKit.RED_ALERT) + var l := UiKit.label(msg,UiKit.FS_SUB, true, UiKit.RED_ALERT) l.set_anchors_preset(Control.PRESET_CENTER) add_child(l) diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index bfb75afb..ec843713 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -128,14 +128,14 @@ 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, UiKit.INK_ON_DEEP) + var title := UiKit.label("Dungeon Sweeper",UiKit.FS_H1, true, UiKit.INK_ON_DEEP) box.add_child(title) - var sub := UiKit.label("扫雷的因 · 逐行兑现的果", 16, false, UiKit.WARM_SOFT) + var sub := UiKit.label("扫雷的因 · 逐行兑现的果",UiKit.FS_BODY, false, UiKit.WARM_SOFT) box.add_child(sub) box.add_child(HSeparator.new()) # 组帽·冒险(M2 分组) - box.add_child(UiKit.label("── 冒 险 ──", 12, false, UiKit.WARM_FAINT)) + box.add_child(UiKit.label("── 冒 险 ──",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT)) # 唯一试玩入口 = 正式「开始冒险」(三关序列);单关测试直入口(L2/L3)退役(2026-09-23 用户拍板) var resumebtn := UiKit.button("▶ 继续上局") # 迭代 8 卡②——有断点才亮(可见性与关数文案归组合根刷新) resumebtn.tooltip_text = "自最近停点恢复" @@ -145,7 +145,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: box.add_child(lvbtn) # 组帽·营地与系统 - box.add_child(UiKit.label("── 营地与系统 ──", 12, false, UiKit.WARM_FAINT)) + box.add_child(UiKit.label("── 营地与系统 ──",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT)) var campbtn := UiKit.verb_button("营地", UiKit.TEX_ICON_KEYSTONE, "永久强化:钥石换永久属性——跨局成长账本") # 元进度实现批——主菜单营地入口 box.add_child(campbtn) var settingsbtn := UiKit.button("设置") # 迭代 8 卡④——最小设置面入口 @@ -158,7 +158,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: # 迭代 14.5 调试整合批——调试入口收右下角标(与主按钮组非平级;DS_DEBUG=1 点亮,可见性归组合根)。 # margin 16px 角距;字号降档与主按钮拉开层级 var dbgbtn := UiKit.button("调试", 0.0) # 角标豁免宽度基准(0=不设 min/flags——角落小件) - dbgbtn.add_theme_font_size_override("font_size", 13) + dbgbtn.add_theme_font_size_override("font_size", UiKit.FS_HINT) dbgbtn.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16) overlay.add_child(dbgbtn) @@ -201,7 +201,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: var help_plate := PanelContainer.new() help_plate.add_theme_stylebox_override("panel", UiKit.panel_skinned(Vector4(14, 10, 14, 10))) help_plate.size_flags_horizontal = Control.SIZE_SHRINK_CENTER - var help := UiKit.label(help_text, 16, false, UiKit.INK) + var help := UiKit.label(help_text,UiKit.FS_BODY, false, UiKit.INK) help_plate.add_child(help) right.add_child(help_plate) @@ -214,7 +214,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: static func build_inter_overlay(host: Control) -> Dictionary: var overlay := overlay_bg(host, Color(0, 0, 0, 0.6)) var box := overlay_box(overlay) - var label := UiKit.label("", 24, true, UiKit.WARM) + var label := UiKit.label("",UiKit.FS_TITLE, true, UiKit.WARM) box.add_child(label) var next_btn := UiKit.button("进入下一层") box.add_child(next_btn) diff --git a/game/presentation/views/ap_bar_view.gd b/game/presentation/views/ap_bar_view.gd index a531390b..743595cf 100644 --- a/game/presentation/views/ap_bar_view.gd +++ b/game/presentation/views/ap_bar_view.gd @@ -51,7 +51,7 @@ func _init() -> void: _dots.add_theme_constant_override("separation", 3) _dots.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_dots) - _ap_label = UiKit.label("AP 0/0", 16, true) + _ap_label = UiKit.label("AP 0/0",UiKit.FS_BODY, true) _ap_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_ap_label) @@ -71,10 +71,10 @@ func _init() -> void: _rap_dots.add_theme_constant_override("separation", 2) _rap_dots.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_rap_dots) - _rap_label = UiKit.label("RAP 0", 14, true, UiKit.INK_LABEL) # 显式传色(UI 设计对齐批 N1-7——T0 实测对 PANEL_DATA 10.4:1 已合规,显式化仅为确定性加固,值不变) + _rap_label = UiKit.label("RAP 0",UiKit.FS_HINT, true, UiKit.INK_LABEL) # 显式传色(UI 设计对齐批 N1-7——T0 实测对 PANEL_DATA 10.4:1 已合规,显式化仅为确定性加固,值不变) _rap_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_rap_label) - _rap_feedback = UiKit.label("", 11, false, UiKit.STONE_FAINT) + _rap_feedback = UiKit.label("",UiKit.FS_CAPTION, false, UiKit.STONE_FAINT) _rap_feedback.size_flags_vertical = Control.SIZE_SHRINK_CENTER row.add_child(_rap_feedback) @@ -83,7 +83,7 @@ func _init() -> void: _confirm_row.add_theme_constant_override("separation", 4) _confirm_row.visible = false row.add_child(_confirm_row) - _confirm_lab = UiKit.label("RAP−%d · 旧板旗作废" % refresh_cost, 14, true, COL_INK) + _confirm_lab = UiKit.label("RAP−%d · 旧板旗作废" % refresh_cost,UiKit.FS_HINT, true, COL_INK) _confirm_row.add_child(_confirm_lab) var confirm_btn := UiKit.button("确认弃图", 0.0) # HUD 顶条紧凑钮豁免宽度基准 confirm_btn.pressed.connect(_disarm_and_fire) @@ -102,7 +102,7 @@ func _init() -> void: _btn_refresh = UiKit.button("弃图刷新", 0.0) # HUD 顶条紧凑钮豁免宽度基准 _btn_refresh.pressed.connect(_on_refresh_pressed) refresh_box.add_child(_btn_refresh) - _refresh_sub = UiKit.label("RAP−%d · 剩 0 次" % refresh_cost, 14, false, UiKit.INK_LABEL) + _refresh_sub = UiKit.label("RAP−%d · 剩 0 次" % refresh_cost,UiKit.FS_HINT, false, UiKit.INK_LABEL) _refresh_sub.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER refresh_box.add_child(_refresh_sub) diff --git a/game/presentation/views/battle_end_overlay.gd b/game/presentation/views/battle_end_overlay.gd index c565a787..445873cf 100644 --- a/game/presentation/views/battle_end_overlay.gd +++ b/game/presentation/views/battle_end_overlay.gd @@ -55,7 +55,7 @@ func _init() -> void: seal_img.size_flags_vertical = Control.SIZE_SHRINK_CENTER seal_img.mouse_filter = Control.MOUSE_FILTER_IGNORE _seal.add_child(seal_img) - _verdict = UiKit.label("", 24, true, UiKit.INK_TITLE) + _verdict = UiKit.label("",UiKit.FS_TITLE, true, UiKit.INK_TITLE) _verdict.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _verdict.size_flags_vertical = Control.SIZE_SHRINK_CENTER header.add_child(_verdict) @@ -75,14 +75,14 @@ func _init() -> void: _rows_box.add_theme_constant_override("separation", 6) _rows_box.visible = false box.add_child(_rows_box) - _gp_row = UiKit.label("", 17, true, UiKit.GOLD_DEEP) + _gp_row = UiKit.label("",UiKit.FS_SUB, true, UiKit.GOLD_DEEP) _gp_row.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _rows_box.add_child(_gp_row) - _ks_row = UiKit.label("", 15, true, UiKit.INK_LABEL) + _ks_row = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_LABEL) _ks_row.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _ks_row.visible = false _rows_box.add_child(_ks_row) - _bonus_row_l = UiKit.label("", 14, false, UiKit.INK_LABEL) + _bonus_row_l = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_LABEL) _bonus_row_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _bonus_row_l.visible = false _rows_box.add_child(_bonus_row_l) diff --git a/game/presentation/views/battle_log_view.gd b/game/presentation/views/battle_log_view.gd index e803b15e..b3ebdd88 100644 --- a/game/presentation/views/battle_log_view.gd +++ b/game/presentation/views/battle_log_view.gd @@ -39,12 +39,12 @@ func _init(db_ref) -> void: var head := HBoxContainer.new() vb.add_child(head) # 对比度修复(v3.5 批 B3 2026-09-30——明细条灰字对深灰底实测 2.63:1):暗底双色墨制=暖白族 - _summary = UiKit.label("", 16, false, UiKit.WARM) + _summary = UiKit.label("",UiKit.FS_BODY, false, UiKit.WARM) _summary.custom_minimum_size = Vector2(0, BAND_H_DIG - 4) _summary.clip_text = true _summary.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS head.add_child(_summary) - _hint = UiKit.label("上轮摘要(回看归「生涯」)", 14, false, UiKit.WARM) # 辅助提示(≥14 辅助档)随上暖白 + _hint = UiKit.label("上轮摘要(回看归「生涯」)",UiKit.FS_HINT, false, UiKit.WARM) # 辅助提示(≥14 辅助档)随上暖白 _hint.size_flags_horizontal = Control.SIZE_SHRINK_END head.add_child(_hint) _log = RichTextLabel.new() diff --git a/game/presentation/views/battle_stage_view.gd b/game/presentation/views/battle_stage_view.gd index 17d8f5a0..5ff7dadf 100644 --- a/game/presentation/views/battle_stage_view.gd +++ b/game/presentation/views/battle_stage_view.gd @@ -93,7 +93,7 @@ func _init(db_ref) -> void: narr_plate.add_theme_stylebox_override("panel", UiKit.panel_skinned(Vector4(12, 4, 12, 4))) narr_plate.size_flags_horizontal = Control.SIZE_SHRINK_CENTER vb.add_child(narr_plate) - round_label = UiKit.label("第 — 轮 · —", 15, true, UiKit.INK_TITLE) + round_label = UiKit.label("第 — 轮 · —",UiKit.FS_BODY, true, UiKit.INK_TITLE) round_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER narr_plate.add_child(round_label) @@ -109,7 +109,7 @@ func _init(db_ref) -> void: var center_col := VBoxContainer.new() center_col.alignment = BoxContainer.ALIGNMENT_CENTER center.add_child(center_col) - stage_center = UiKit.label(STAGE_CENTER_HINT, 13, false, UiKit.WARM_SOFT) # 暗底双色墨制(原 STONE_FAINT 对暗底不可读) + stage_center = UiKit.label(STAGE_CENTER_HINT,UiKit.FS_HINT, false, UiKit.WARM_SOFT) # 暗底双色墨制(原 STONE_FAINT 对暗底不可读) stage_center.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER center_col.add_child(stage_center) _row.add_child(center) diff --git a/game/presentation/views/board_fx_view.gd b/game/presentation/views/board_fx_view.gd index 84df2360..418d2d46 100644 --- a/game/presentation/views/board_fx_view.gd +++ b/game/presentation/views/board_fx_view.gd @@ -17,7 +17,7 @@ var _banner: Label func _init() -> void: mouse_filter = Control.MOUSE_FILTER_IGNORE set_anchors_preset(Control.PRESET_FULL_RECT) - _banner = UiKit.label("", 26, true, COL_GOLD) + _banner = UiKit.label("",UiKit.FS_TITLE, true, COL_GOLD) _banner.set_anchors_preset(Control.PRESET_CENTER_TOP) _banner.grow_horizontal = Control.GROW_DIRECTION_BOTH _banner.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER diff --git a/game/presentation/views/board_zone_view.gd b/game/presentation/views/board_zone_view.gd index efa4208c..776ce1a1 100644 --- a/game/presentation/views/board_zone_view.gd +++ b/game/presentation/views/board_zone_view.gd @@ -49,7 +49,7 @@ func _init() -> void: hint.size_flags_horizontal = Control.SIZE_SHRINK_CENTER hint.mouse_filter = Control.MOUSE_FILTER_IGNORE vb.add_child(hint) - var hl := UiKit.label("左键 挖掘 / 移动 · 右键 封印(不可逆) · 同格双击 快开", 12, false, UiKit.WARM_FAINT) + var hl := UiKit.label("左键 挖掘 / 移动 · 右键 封印(不可逆) · 同格双击 快开",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT) hint.add_child(hl) # 信号转发(组合根只接线一处) board_view.action_requested.connect(_forward_action) diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 07659967..88de1ed9 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -71,9 +71,9 @@ func _init() -> void: top.add_child(plaque) var plaque_col := VBoxContainer.new() plaque.add_child(plaque_col) - var title := UiKit.label("营地 · 永久强化", 22, true, UiKit.INK_TITLE) + var title := UiKit.label("营地 · 永久强化",UiKit.FS_TITLE, true, UiKit.INK_TITLE) plaque_col.add_child(title) - var sub := UiKit.label("跨局成长账本——钥石换永久属性", 13, false, UiKit.STONE) + var sub := UiKit.label("跨局成长账本——钥石换永久属性",UiKit.FS_HINT, false, UiKit.STONE) plaque_col.add_child(sub) var spacer := Control.new() spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL @@ -90,7 +90,7 @@ func _init() -> void: var keystone_icon := UiKit.icon_rect(UiKit.TEX_ICON_KEYSTONE, 20) # 缺位 null → 纯文本回退(M3 18→20) if keystone_icon != null: bal_row.add_child(keystone_icon) - _balance_label = UiKit.label("钥石 0", 18, true, UiKit.INK_ON_GOLD) + _balance_label = UiKit.label("钥石 0",UiKit.FS_SUB, true, UiKit.INK_ON_GOLD) bal_row.add_child(_balance_label) # ── 三柜台列(方向稿同构:头带深棕+米色板身)── @@ -113,7 +113,7 @@ func _init() -> void: mid.add_child(_counter_panel("道具工坊", UiKit.TEX_ICON_WORKSHOP, ws_scroll, 356)) var atlas_holder := VBoxContainer.new() mid.add_child(_counter_panel("奖励格图鉴", UiKit.TEX_ICON_ATLAS, atlas_holder, 356)) - var lock_l := UiKit.label(" —— 柜台结构位预留:内容排 Alpha(地图战斗资源差异化批)", 13, false, UiKit.STONE) + var lock_l := UiKit.label(" —— 柜台结构位预留:内容排 Alpha(地图战斗资源差异化批)",UiKit.FS_HINT, false, UiKit.STONE) lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART lock_l.custom_minimum_size = Vector2(300, 0) atlas_holder.add_child(lock_l) @@ -136,10 +136,10 @@ func _init() -> void: var spacer2 := Control.new() spacer2.size_flags_horizontal = Control.SIZE_EXPAND_FILL bottom.add_child(spacer2) - var caption := UiKit.label("每购得一件永久强化,对应柜台亮起一格暖光 · 价格为钥石", 13, false, UiKit.WARM_SOFT) + var caption := UiKit.label("每购得一件永久强化,对应柜台亮起一格暖光 · 价格为钥石",UiKit.FS_HINT, false, UiKit.WARM_SOFT) bottom.add_child(caption) col.add_child(bottom) - _recent_list = UiKit.label("", 13, false, UiKit.WARM_SOFT) + _recent_list = UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM_SOFT) _recent_list.clip_text = true _recent_list.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS col.add_child(_recent_list) @@ -165,7 +165,7 @@ func _counter_panel(title_text: String, icon_path: String, holder: Control, min_ var ic := UiKit.icon_rect(icon_path, 20) # M3 16→20(demo 头带图标档) # 缺位 null → 纯文本回退 if ic != null: head.add_child(ic) - var l := UiKit.label(title_text, 16, true, UiKit.WARM) + var l := UiKit.label(title_text,UiKit.FS_BODY, true, UiKit.WARM) head.add_child(l) vbox.add_child(holder) return panel @@ -187,7 +187,7 @@ func _rebuild_tree(data: Dictionary) -> void: var vein := String(row.get("vein", "")) if vein != last_vein: last_vein = vein - var vh := UiKit.label(String(vein_names.get(vein, vein)), 13, true, UiKit.GOLD_DEEP) + var vh := UiKit.label(String(vein_names.get(vein, vein)),UiKit.FS_HINT, true, UiKit.GOLD_DEEP) _tree_holder.add_child(vh) var hb := HBoxContainer.new() hb.add_theme_constant_override("separation", 6) @@ -330,12 +330,12 @@ 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, UiKit.INK_ON_DEEP) + var level_l := UiKit.label("",UiKit.FS_HINT, 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),UiKit.RADIUS_OBJECT, 0, Vector4(6, 0, 6, 0))) level_l.custom_minimum_size = Vector2(44, 0) line.add_child(level_l) - var price_l := UiKit.label("", 14, false, UiKit.STONE) + var price_l := UiKit.label("",UiKit.FS_HINT, false, UiKit.STONE) price_l.custom_minimum_size = Vector2(64, 0) line.add_child(price_l) var btn := UiKit.button("锻造 +1 级", 0.0) # 柜台行板紧凑钮豁免宽度基准 @@ -355,14 +355,14 @@ func _rebuild_workshop(data: Dictionary) -> void: var line := HBoxContainer.new() line.add_theme_constant_override("separation", 12) card.add_child(line) - var name_l := UiKit.label(String(row.get("display_name", "")), 14, true, UiKit.INK) + var name_l := UiKit.label(String(row.get("display_name", "")),UiKit.FS_HINT, true, UiKit.INK) name_l.custom_minimum_size = Vector2(132, 0) line.add_child(name_l) - var progress_l := UiKit.label("", 13, false, UiKit.STONE) + var progress_l := UiKit.label("",UiKit.FS_HINT, false, UiKit.STONE) progress_l.custom_minimum_size = Vector2(110, 0) line.add_child(progress_l) # 状态色随卡⑭ 亮板双色墨制(深墨族替代暖白族)——色随刷新态条件赋值,非机械两行式(T4 收口保留) - var status_l := UiKit.label("", 13, true, UiKit.STONE) + var status_l := UiKit.label("",UiKit.FS_HINT, true, UiKit.STONE) line.add_child(status_l) _workshop_holder.add_child(card) _workshop_rows.append({"item_id": String(row.get("item_id", "")), "progress_l": progress_l, "status_l": status_l}) @@ -375,17 +375,17 @@ func _rebuild_attune(data: Dictionary) -> void: _attune_nodes.clear() _attune_btns.clear() var att: Dictionary = data.get("attune", {}) - _attune_header_l = UiKit.label("", 13, true, UiKit.INK) + _attune_header_l = UiKit.label("",UiKit.FS_HINT, true, UiKit.INK) _workshop_holder.add_child(_attune_header_l) _attune_nodes.append(_attune_header_l) for row in att.get("items", []): var iid := String(row.get("item_id", "")) var line := HBoxContainer.new() line.add_theme_constant_override("separation", 6) - var name_l := UiKit.label(String(row.get("display_name", "")), 13, true, UiKit.INK) + var name_l := UiKit.label(String(row.get("display_name", "")),UiKit.FS_HINT, true, UiKit.INK) name_l.custom_minimum_size = Vector2(96, 0) line.add_child(name_l) - var form_l := UiKit.label("被动" if String(row.get("form", "")) == "passive" else "主动·充能", 12, false, UiKit.STONE) + var form_l := UiKit.label("被动" if String(row.get("form", "")) == "passive" else "主动·充能",UiKit.FS_CAPTION, false, UiKit.STONE) form_l.custom_minimum_size = Vector2(58, 0) line.add_child(form_l) var btn := UiKit.button("装配", 0.0) # 行板紧凑钮豁免 @@ -396,7 +396,7 @@ func _rebuild_attune(data: Dictionary) -> void: _attune_btns.append({"item_id": iid, "btn": btn}) var refresh_line := HBoxContainer.new() refresh_line.add_theme_constant_override("separation", 6) - _refresh_l = UiKit.label("", 12, false, UiKit.STONE) + _refresh_l = UiKit.label("",UiKit.FS_CAPTION, false, UiKit.STONE) refresh_line.add_child(_refresh_l) _refresh_btn = UiKit.button("升级", 0.0) # 行板紧凑钮豁免 _refresh_btn.pressed.connect(_emit_buy_requested.bind("attune_refresh")) diff --git a/game/presentation/views/confirm_dialog.gd b/game/presentation/views/confirm_dialog.gd index 41f8364e..b7f6c144 100644 --- a/game/presentation/views/confirm_dialog.gd +++ b/game/presentation/views/confirm_dialog.gd @@ -17,7 +17,7 @@ var _cancel_btn: Button func _init() -> void: var box: VBoxContainer = UiKit.modal_shell(self, Color(UiKit.DIM, 0.55), Vector2(460, 0), 12, true, UiKit.panel_skinned(Vector4(14, 12, 14, 12))).box - _text = UiKit.label("", 16, false, UiKit.INK_TITLE) + _text = UiKit.label("",UiKit.FS_BODY, false, UiKit.INK_TITLE) _text.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _text.custom_minimum_size = Vector2(430, 0) box.add_child(_text) diff --git a/game/presentation/views/curio_pick_overlay.gd b/game/presentation/views/curio_pick_overlay.gd index 9238f696..a60a7b19 100644 --- a/game/presentation/views/curio_pick_overlay.gd +++ b/game/presentation/views/curio_pick_overlay.gd @@ -34,7 +34,7 @@ func _init() -> void: var top := HBoxContainer.new() top.add_theme_constant_override("separation", 12) box.add_child(top) - top.add_child(UiKit.label("战利品三选一", 22, true, UiKit.WARM)) + top.add_child(UiKit.label("战利品三选一",UiKit.FS_TITLE, true, UiKit.WARM)) var top_sp := Control.new() top_sp.size_flags_horizontal = Control.SIZE_EXPAND_FILL top.add_child(top_sp) @@ -45,16 +45,16 @@ func _init() -> void: _refresh_btn.pressed.connect(_emit_refresh_requested) _refresh_btn.visible = false top.add_child(_refresh_btn) - _refresh_badge = UiKit.label("0", 12, true, UiKit.INK_ON_GOLD) + _refresh_badge = UiKit.label("0",UiKit.FS_CAPTION, true, UiKit.INK_ON_GOLD) _refresh_badge.mouse_filter = Control.MOUSE_FILTER_IGNORE _refresh_badge.set_anchors_preset(Control.PRESET_TOP_RIGHT) _refresh_badge.offset_left = -22.0 _refresh_badge.offset_top = -6.0 _refresh_btn.add_child(_refresh_badge) - _refresh_l = UiKit.label("", 12, false, UiKit.WARM_SOFT) + _refresh_l = UiKit.label("",UiKit.FS_CAPTION, false, UiKit.WARM_SOFT) _refresh_l.visible = false top.add_child(_refresh_l) - _label = UiKit.label("", 15, false, UiKit.WARM_SOFT) + _label = UiKit.label("",UiKit.FS_BODY, false, UiKit.WARM_SOFT) _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(_label) _choice_box = HBoxContainer.new() diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index a580a0e4..a98143ec 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -128,7 +128,7 @@ func _build() -> void: var shell: Dictionary = UiKit.modal_shell(self, UiKit.BG_OVERLAY, Vector2(640, 0), 8) var box: VBoxContainer = shell.box - var title := UiKit.label("调试", 26, true, UiKit.WARM) + var title := UiKit.label("调试",UiKit.FS_TITLE, true, UiKit.WARM) box.add_child(title) var desc := UiKit.label( "开发调试专用——仅开始菜单可开(DS_DEBUG=1 时入口点亮)。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp], @@ -150,7 +150,7 @@ func _build() -> void: var fx_row := HBoxContainer.new() fx_row.add_theme_constant_override("separation", 10) list.add_child(fx_row) - fx_row.add_child(UiKit.label("胜利演出", 14, false, UiKit.WARM)) + fx_row.add_child(UiKit.label("胜利演出",UiKit.FS_HINT, false, UiKit.WARM)) var fx_btn := UiKit.button("纹章拼合" if UiKit.victory_fx_style == "crest" else "尘金粒子") fx_btn.tooltip_text = "两套演出并存——点击切换(会话级,不落盘)" fx_btn.pressed.connect(func() -> void: @@ -161,7 +161,7 @@ func _build() -> void: # 区块①随机种子(原开始覆盖层种子行迁入——非法定值回退 42 的口径归组合根 _seed_value) var seed_row := HBoxContainer.new() list.add_child(seed_row) - seed_row.add_child(UiKit.label("随机种子", 15, false)) + seed_row.add_child(UiKit.label("随机种子",UiKit.FS_BODY, false)) seed_edit = LineEdit.new() seed_edit.text = "42" seed_edit.custom_minimum_size = Vector2(120, 0) @@ -175,7 +175,7 @@ func _build() -> void: var hp_row := _slider_row(list, "生命加成") _hp = hp_row.slider _hp_val = hp_row.value_label - _eff = UiKit.label("", 14, false) + _eff = UiKit.label("",UiKit.FS_HINT, false) list.add_child(_eff) var btn_row := HBoxContainer.new() @@ -191,7 +191,7 @@ func _build() -> void: # 区块③批量模拟(与 headless 扫描同口径——编排归 tune_sim_controller) var sim_row := HBoxContainer.new() list.add_child(sim_row) - sim_row.add_child(UiKit.label("批量模拟第一关", 15, false)) + sim_row.add_child(UiKit.label("批量模拟第一关",UiKit.FS_BODY, false)) _sim_count = SpinBox.new() _sim_count.min_value = 10 _sim_count.max_value = 200 @@ -199,7 +199,7 @@ func _build() -> void: _sim_count.value = 30 _sim_count.custom_minimum_size = Vector2(90, 0) sim_row.add_child(_sim_count) - sim_row.add_child(UiKit.label("次(理性玩家策略,含面板当前加成)", 13, false)) + sim_row.add_child(UiKit.label("次(理性玩家策略,含面板当前加成)",UiKit.FS_HINT, false)) _sim_btn = UiKit.button("运行模拟") _sim_btn.pressed.connect(_emit_simulate_requested) sim_row.add_child(_sim_btn) @@ -222,14 +222,14 @@ func _build() -> void: func _slider_row(box: VBoxContainer, title: String) -> Dictionary: var row := HBoxContainer.new() box.add_child(row) - row.add_child(UiKit.label(title, 15, false)) + row.add_child(UiKit.label(title,UiKit.FS_BODY, false)) var s := HSlider.new() s.min_value = 0 s.max_value = 300 s.step = 5 s.custom_minimum_size = Vector2(320, 24) row.add_child(s) - var v := UiKit.label("+0%", 15, true) + var v := UiKit.label("+0%",UiKit.FS_BODY, true) v.custom_minimum_size = Vector2(70, 0) row.add_child(v) s.value_changed.connect(_on_slider_value_changed) diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index 170adfa9..878ef288 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -37,7 +37,7 @@ func _init() -> void: col.add_theme_constant_override("separation", 14) # 布局充实(2026-09-26 反馈③:区段间距放大) add_child(col) - col.add_child(UiKit.label("探险者", 17, true)) + col.add_child(UiKit.label("探险者",UiKit.FS_SUB, true)) # 数据行装框(直角细线数据框——battle.md Component Inventory C 区行规格落形;同时消化纵向空白) var data_box := PanelContainer.new() data_box.add_theme_stylebox_override("panel", @@ -53,7 +53,7 @@ func _init() -> void: # 秘宝槽(预留):随身战斗用道具的唯一展示面——空槽占位承诺格子在此, # 不预设交互(挖掘期指向交互归 E 区既有裁决);终稿样式/槽位数归秘宝批 - col.add_child(UiKit.label("秘宝", 16, true)) + col.add_child(UiKit.label("秘宝",UiKit.FS_BODY, true)) item_slots = HBoxContainer.new() item_slots.add_theme_constant_override("separation", 10) col.add_child(item_slots) @@ -77,7 +77,7 @@ func _init() -> void: _feat_section.add_theme_constant_override("separation", 4) _feat_section.visible = false col.add_child(_feat_section) - _feat_section.add_child(UiKit.label("特性", 16, true)) + _feat_section.add_child(UiKit.label("特性",UiKit.FS_BODY, true)) _feat_list = VBoxContainer.new() _feat_list.add_theme_constant_override("separation", 2) _feat_section.add_child(_feat_list) @@ -87,7 +87,7 @@ func _init() -> void: _board_variant_section.add_theme_constant_override("separation", 4) _board_variant_section.visible = false col.add_child(_board_variant_section) - _board_variant_section.add_child(UiKit.label("地形变异", 16, true)) + _board_variant_section.add_child(UiKit.label("地形变异",UiKit.FS_BODY, true)) _board_variant_list = VBoxContainer.new() _board_variant_list.add_theme_constant_override("separation", 2) _board_variant_section.add_child(_board_variant_list) @@ -97,7 +97,7 @@ func _init() -> void: _curio_section.add_theme_constant_override("separation", 4) _curio_section.visible = false col.add_child(_curio_section) - _curio_section.add_child(UiKit.label("特性", 16, true)) + _curio_section.add_child(UiKit.label("特性",UiKit.FS_BODY, true)) _curio_list = VBoxContainer.new() _curio_list.add_theme_constant_override("separation", 2) _curio_section.add_child(_curio_list) @@ -119,7 +119,7 @@ func set_feat_holdings(lines: Array) -> void: _feat_list.remove_child(c2) c2.queue_free() for line in lines: - var l2 := UiKit.label(String(line), 16, false, COL_INK) + var l2 := UiKit.label(String(line),UiKit.FS_BODY, false, COL_INK) _feat_list.add_child(l2) _feat_section.visible = not lines.is_empty() @@ -130,7 +130,7 @@ func set_board_variants(lines: Array) -> void: _board_variant_list.remove_child(c3) c3.queue_free() for line in lines: - var l3 := UiKit.label(String(line), 16, false, COL_INK) + var l3 := UiKit.label(String(line),UiKit.FS_BODY, false, COL_INK) _board_variant_list.add_child(l3) _board_variant_section.visible = not lines.is_empty() @@ -141,7 +141,7 @@ func set_level_bonuses(lines: Array) -> void: _curio_list.remove_child(c) c.queue_free() for line in lines: - var l := UiKit.label(String(line), 16, false, COL_INK) # 字号下限(v3.5 批 B3——正文 ≥16) + var l := UiKit.label(String(line),UiKit.FS_BODY, false, COL_INK) # 字号下限(v3.5 批 B3——正文 ≥16) _curio_list.add_child(l) _curio_section.visible = not lines.is_empty() @@ -157,7 +157,7 @@ func armor_text() -> String: func _data_line() -> Label: # 对比度修复(v3.5 批 B3 2026-09-30——非粗体 label 默认浅灰对米色数据框仅 1.31:1, # 实测=ui-redesign 对比报告 §一):显式主墨(对 PANEL_DATA ≈10:1) - var l := UiKit.label("", 16, false, UiKit.INK) + var l := UiKit.label("",UiKit.FS_BODY, false, UiKit.INK) l.clip_text = true l.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS return l @@ -203,7 +203,7 @@ func set_treasure_inventory(items: Array, selected_handle: int) -> void: tr.mouse_filter = Control.MOUSE_FILTER_IGNORE slot.add_child(tr) else: - var glyph := UiKit.label(glyph_ch, 20, true) + var glyph := UiKit.label(glyph_ch,UiKit.FS_SUB, true) glyph.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER glyph.vertical_alignment = VERTICAL_ALIGNMENT_CENTER glyph.set_anchors_preset(Control.PRESET_FULL_RECT) diff --git a/game/presentation/views/legend_overlay.gd b/game/presentation/views/legend_overlay.gd index c6cec4be..d0b02333 100644 --- a/game/presentation/views/legend_overlay.gd +++ b/game/presentation/views/legend_overlay.gd @@ -32,7 +32,7 @@ func _init(rap_cost: int = -1) -> void: _panel = shell.panel (shell.dim as ColorRect).gui_input.connect(_on_dim_gui_input) var box: VBoxContainer = shell.box - var title := UiKit.label("图例 · 格态", 20, true, UiKit.INK_TITLE) # 亮底墨字(§7.2 数据素面) + var title := UiKit.label("图例 · 格态",UiKit.FS_SUB, true, UiKit.INK_TITLE) # 亮底墨字(§7.2 数据素面) box.add_child(title) box.add_child(HSeparator.new()) for e in ENTRIES: @@ -56,7 +56,7 @@ func _init(rap_cost: int = -1) -> void: rap_chip.custom_minimum_size = Vector2(18, 18) rap_chip.color = UiKit.GOLD # 同 #F0A828——金徽章同源单点(T4 裸色收口) rap_row.add_child(rap_chip) - var rap_lab := UiKit.label("RAP 储备行动点 —— 停手时剩余 AP 转存;弃图刷新消耗 RAP−%d(旧板旗作废,AP 保留继续挖)" % _rap_cost, 13, false, UiKit.INK_LABEL) + var rap_lab := UiKit.label("RAP 储备行动点 —— 停手时剩余 AP 转存;弃图刷新消耗 RAP−%d(旧板旗作废,AP 保留继续挖)" % _rap_cost,UiKit.FS_HINT, false, UiKit.INK_LABEL) rap_lab.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART rap_lab.custom_minimum_size = Vector2(440, 0) rap_row.add_child(rap_lab) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index df4cc82e..18eac718 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -97,7 +97,7 @@ func _init() -> void: var top := HBoxContainer.new() top.add_theme_constant_override("separation", 12) box.add_child(top) - _level_label = UiKit.label("", 16, true, UiKit.WARM) + _level_label = UiKit.label("",UiKit.FS_BODY, true, UiKit.WARM) _level_label.custom_minimum_size.x = 420 top.add_child(_level_label) var gp_box := PanelContainer.new() @@ -106,9 +106,9 @@ func _init() -> void: var gp_row := HBoxContainer.new() gp_row.add_theme_constant_override("separation", 6) gp_box.add_child(gp_row) - _gp_value = UiKit.label("", 16, true, UiKit.GOLD) + _gp_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.GOLD) gp_row.add_child(_gp_value) - _title = UiKit.label(TITLE_FORK, 18, true, UiKit.WARM) + _title = UiKit.label(TITLE_FORK,UiKit.FS_SUB, true, UiKit.WARM) _title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(_title) # 节点图画布(图上点击 = 唯一提交通道——布局决策 2;mouse_filter STOP 接悬停/点击) @@ -139,8 +139,8 @@ 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, UiKit.INK_HINT)) - _hp_value = UiKit.label("", 15, true, UiKit.INK_TITLE) + life_box.add_child(UiKit.label("生命",UiKit.FS_CAPTION, false, UiKit.INK_HINT)) + _hp_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_TITLE) life_box.add_child(_hp_value) _hp_bar = Control.new() _hp_bar.custom_minimum_size = Vector2(130, 7) @@ -149,8 +149,8 @@ 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, UiKit.INK_HINT)) - _attr_value = UiKit.label("", 15, true, UiKit.INK_TITLE) + attr_box.add_child(UiKit.label("属性",UiKit.FS_CAPTION, false, UiKit.INK_HINT)) + _attr_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_TITLE) attr_box.add_child(_attr_value) strip.add_child(_vdiv()) # 本关加成框(零加成隐藏——spec 布局决策 4)+ 流派件持有行(迭代 12 呈现补齐——组合根投喂) @@ -160,12 +160,12 @@ 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("特性", 12, false, UiKit.WARM_SOFT) + var bonus_cap := UiKit.label("特性",UiKit.FS_CAPTION, false, UiKit.WARM_SOFT) bonus_inner.add_child(bonus_cap) - _bonus_value = UiKit.label("", 15, true, UiKit.WARM) + _bonus_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.WARM) bonus_inner.add_child(_bonus_value) # 特性持有行(迭代 12 呈现补齐 2026-10-04——用户反馈关卡选择页看不到局内奖励;组合根投喂) - _feat_value = UiKit.label("", 13, false, UiKit.WARM_SOFT) + _feat_value = UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM_SOFT) _feat_value.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART bonus_box.add_child(_feat_value) var spacer := Control.new() diff --git a/game/presentation/views/node_overlay.gd b/game/presentation/views/node_overlay.gd index bcaac1c7..46bfd38a 100644 --- a/game/presentation/views/node_overlay.gd +++ b/game/presentation/views/node_overlay.gd @@ -16,7 +16,7 @@ func _init() -> void: var shell: Dictionary = UiKit.modal_shell(self, Color(0, 0, 0, 0.6), Vector2.ZERO, 14, true, UiKit.panel_skinned(Vector4(26, 18, 26, 18))) var box: VBoxContainer = shell.box - _label = UiKit.label("", 20, true, UiKit.INK_TITLE) + _label = UiKit.label("",UiKit.FS_SUB, true, UiKit.INK_TITLE) _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(_label) _btn = UiKit.primary_button("继续") diff --git a/game/presentation/views/settings_overlay.gd b/game/presentation/views/settings_overlay.gd index 2ae64e1c..eb485886 100644 --- a/game/presentation/views/settings_overlay.gd +++ b/game/presentation/views/settings_overlay.gd @@ -39,10 +39,10 @@ func _build() -> void: UiKit.panel_skinned(Vector4(20, 16, 20, 16))) var box: VBoxContainer = shell.box - var title := UiKit.label("设置", 24, true, UiKit.INK_TITLE) + var title := UiKit.label("设置",UiKit.FS_TITLE, true, UiKit.INK_TITLE) title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(title) - var hint := UiKit.label("系统级设置——独立存储不随存档(一安装一份,删游戏才消失)", 13, false, UiKit.INK_HINT) + var hint := UiKit.label("系统级设置——独立存储不随存档(一安装一份,删游戏才消失)",UiKit.FS_HINT, false, UiKit.INK_HINT) hint.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(hint) box.add_child(HSeparator.new()) @@ -51,12 +51,12 @@ func _build() -> void: var vol_row := HBoxContainer.new() vol_row.add_theme_constant_override("separation", 14) box.add_child(vol_row) - vol_row.add_child(UiKit.label("主音量", 15, false, UiKit.INK_LABEL)) + vol_row.add_child(UiKit.label("主音量",UiKit.FS_BODY, false, UiKit.INK_LABEL)) _volume = UiKit.styled_slider(100.0, 0.0, 100.0) _volume.step = 1 _volume.value_changed.connect(_on_volume_changed) vol_row.add_child(_volume) - _volume_val = UiKit.label("100%", 15, true, UiKit.INK_TITLE) + _volume_val = UiKit.label("100%",UiKit.FS_BODY, true, UiKit.INK_TITLE) _volume_val.custom_minimum_size = Vector2(60, 0) vol_row.add_child(_volume_val) @@ -64,24 +64,24 @@ func _build() -> void: var fs_row := HBoxContainer.new() fs_row.add_theme_constant_override("separation", 14) box.add_child(fs_row) - fs_row.add_child(UiKit.label("全屏", 15, false, UiKit.INK_LABEL)) + fs_row.add_child(UiKit.label("全屏",UiKit.FS_BODY, false, UiKit.INK_LABEL)) _fs_btn = UiKit.switch_toggle(false) _fs_btn.toggled.connect(_on_fullscreen_toggled) fs_row.add_child(_fs_btn) - _fs_st = UiKit.label("关", 14, true, UiKit.INK_LABEL) + _fs_st = UiKit.label("关",UiKit.FS_HINT, true, UiKit.INK_LABEL) fs_row.add_child(_fs_st) # 结算演出动画(=减动效实称——语义命名批 T17;拨杆 on=完整,off=快速时长减半) var motion_row := HBoxContainer.new() motion_row.add_theme_constant_override("separation", 14) box.add_child(motion_row) - motion_row.add_child(UiKit.label("结算演出动画", 15, false, UiKit.INK_LABEL)) + motion_row.add_child(UiKit.label("结算演出动画",UiKit.FS_BODY, false, UiKit.INK_LABEL)) _motion_btn = UiKit.switch_toggle(true) _motion_btn.toggled.connect(_on_motion_toggled) motion_row.add_child(_motion_btn) - _motion_st = UiKit.label("完整", 14, true, UiKit.INK_LABEL) + _motion_st = UiKit.label("完整",UiKit.FS_HINT, true, UiKit.INK_LABEL) motion_row.add_child(_motion_st) - var why := UiKit.label("快速 = 时长减半(运动敏感 / 演示用)", 12, false, UiKit.INK_HINT) + var why := UiKit.label("快速 = 时长减半(运动敏感 / 演示用)",UiKit.FS_CAPTION, false, UiKit.INK_HINT) why.position.y = 0 box.add_child(why) diff --git a/game/presentation/views/settlement_fx_view.gd b/game/presentation/views/settlement_fx_view.gd index 1d6a0c5a..f7d47588 100644 --- a/game/presentation/views/settlement_fx_view.gd +++ b/game/presentation/views/settlement_fx_view.gd @@ -47,7 +47,7 @@ func play_round_sweep(board_rect: Rect2) -> void: # 跨区弹道:glyph 字形自 from 飞向 to(0.35s + 轻微上抛弧线 + 终点淡出,自动回收)—— # 开格之因 → 站桩之果的因果可视承载(P2);crit 弹道由调用方传加重标记 func play_projectile(from: Vector2, to: Vector2, glyph: String, col: Color, crit: bool = false) -> void: - var shot := UiKit.label(glyph, 22 if crit else 16, true, col) + var shot := UiKit.label(glyph, UiKit.FS_TITLE if crit else UiKit.FS_BODY, true, col) shot.mouse_filter = Control.MOUSE_FILTER_IGNORE shot.size = Vector2(24, 24) shot.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER @@ -91,7 +91,7 @@ func play_damage_number(pos: Vector2, text: String, col: Color, crit: bool = fal _fx_damage_marks += 1 # T17 修复(用户实机「完全没看到伤害数字」):26/32px 大字+1.1s 驻留——旧 20px/0.7s 在 # 结算排播节奏下视觉存在感不足;描边 4→6 同步加重(亮舞台底上保读数)。 - var lab := UiKit.label(text, 32 if crit else 26, true, col) + var lab := UiKit.label(text, UiKit.FS_H1 if crit else UiKit.FS_TITLE, true, col) lab.add_theme_color_override("font_outline_color", Color(0.1, 0.08, 0.06, 0.9)) lab.add_theme_constant_override("outline_size", 6) lab.mouse_filter = Control.MOUSE_FILTER_IGNORE @@ -127,8 +127,8 @@ func play_round_banner(ri: int) -> void: _fx_banners += 1 var banner := Panel.new() banner.mouse_filter = Control.MOUSE_FILTER_IGNORE - banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP,UiKit.RADIUS_OBJECT, 2)) - var lab := UiKit.label("第 %d 轮" % ri, 22, true, UiKit.GOLD) + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, UiKit.RADIUS_OBJECT, 2)) + var lab := UiKit.label("第 %d 轮" % ri, UiKit.FS_TITLE, true, UiKit.GOLD) lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER lab.vertical_alignment = VERTICAL_ALIGNMENT_CENTER @@ -156,8 +156,8 @@ func play_board_variant_banner(text: String) -> void: _fx_banners += 1 var banner := Panel.new() banner.mouse_filter = Control.MOUSE_FILTER_IGNORE - banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP,UiKit.RADIUS_OBJECT, 2)) - var lab := UiKit.label(text, 22, true, UiKit.GOLD) + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, UiKit.RADIUS_OBJECT, 2)) + var lab := UiKit.label(text, UiKit.FS_TITLE, true, UiKit.GOLD) lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER lab.vertical_alignment = VERTICAL_ALIGNMENT_CENTER diff --git a/game/presentation/views/settlement_review_overlay.gd b/game/presentation/views/settlement_review_overlay.gd index c9c0068d..8f74bcc2 100644 --- a/game/presentation/views/settlement_review_overlay.gd +++ b/game/presentation/views/settlement_review_overlay.gd @@ -14,7 +14,7 @@ func _init() -> void: var shell := UiKit.modal_shell(self, Color(UiKit.DIM, 0.62), Vector2(760, 560), 6, true) (shell.dim as ColorRect).gui_input.connect(_on_dim_gui_input) var box: VBoxContainer = shell.box - box.add_child(UiKit.label("结算明细回看(完整流水 · 逐行归因)", 18, true)) + box.add_child(UiKit.label("结算明细回看(完整流水 · 逐行归因)",UiKit.FS_SUB, true)) _log = RichTextLabel.new() _log.bbcode_enabled = true _log.size_flags_vertical = Control.SIZE_EXPAND_FILL diff --git a/game/presentation/views/shop_overlay_view.gd b/game/presentation/views/shop_overlay_view.gd index 6af46e71..54cf60aa 100644 --- a/game/presentation/views/shop_overlay_view.gd +++ b/game/presentation/views/shop_overlay_view.gd @@ -33,7 +33,7 @@ func _init() -> void: var top := HBoxContainer.new() top.add_theme_constant_override("separation", 12) box.add_child(top) - var title := UiKit.label("商 店", 26, true, UiKit.WARM) + var title := UiKit.label("商 店",UiKit.FS_TITLE, true, UiKit.WARM) top.add_child(title) var top_sp := Control.new() top_sp.size_flags_horizontal = Control.SIZE_EXPAND_FILL @@ -44,7 +44,7 @@ func _init() -> void: _refresh_btn.disabled = true # MC-1 投喂后启用(set_refresh_display) _refresh_btn.pressed.connect(_emit_refresh_requested) top.add_child(_refresh_btn) - var stock_badge := UiKit.label("0", 12, true, UiKit.INK_ON_GOLD) + var stock_badge := UiKit.label("0",UiKit.FS_CAPTION, true, UiKit.INK_ON_GOLD) stock_badge.mouse_filter = Control.MOUSE_FILTER_IGNORE stock_badge.set_anchors_preset(Control.PRESET_TOP_RIGHT) stock_badge.offset_left = -22.0 @@ -54,7 +54,7 @@ func _init() -> void: gp_chip.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.CANDLE, UiKit.CAMP_HEADER_BAND,UiKit.RADIUS_OBJECT, 1, Vector4(12, 4, 12, 4))) top.add_child(gp_chip) - _gp_label = UiKit.label("金币 0", 16, true, UiKit.INK_ON_GOLD) + _gp_label = UiKit.label("金币 0",UiKit.FS_BODY, true, UiKit.INK_ON_GOLD) gp_chip.add_child(_gp_label) _cards_box = VBoxContainer.new() _cards_box.add_theme_constant_override("separation", 8) @@ -98,13 +98,13 @@ func _build_card(p: Dictionary) -> Dictionary: var row := HBoxContainer.new() row.add_theme_constant_override("separation", 14) card.add_child(row) - var name_l := UiKit.label(_card_title(p), 15, true) + var name_l := UiKit.label(_card_title(p),UiKit.FS_BODY, true) name_l.custom_minimum_size = Vector2(190, 0) row.add_child(name_l) - var price_l := UiKit.label("", 14, false, UiKit.WARM_SOFT) + var price_l := UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM_SOFT) price_l.custom_minimum_size = Vector2(110, 0) row.add_child(price_l) - var bought_l := UiKit.label("", 14, false, UiKit.WARM_FAINT) + var bought_l := UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM_FAINT) row.add_child(bought_l) var btn := UiKit.button("购买", 0.0) # 行卡紧凑钮豁免宽度基准 btn.pressed.connect(_emit_buy_requested.bind(p)) @@ -142,7 +142,7 @@ func open_shelf(cards: Array, gp: int) -> void: for c in cards: _shelf_rows.append(_build_shelf_card(row, c)) if cards.is_empty(): - var empty := UiKit.label("货架售罄——共享池已买空(属性件全冒险共 3+3+3 份 / AP 件 2 份)", 14, false, UiKit.WARM_FAINT) + var empty := UiKit.label("货架售罄——共享池已买空(属性件全冒险共 3+3+3 份 / AP 件 2 份)",UiKit.FS_HINT, false, UiKit.WARM_FAINT) empty.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER row.add_child(empty) refresh_shelf_state(gp) diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index 983a465b..6a588e5a 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -141,7 +141,7 @@ func set_effects_cleared_feedback() -> void: return slot_row.visible = true slot_row.set_cleared_feedback() - var note := UiKit.label("状态随战斗结束消散", 11, false, UiKit.STONE_FAINT) + var note := UiKit.label("状态随战斗结束消散",UiKit.FS_CAPTION, false, UiKit.STONE_FAINT) note.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER note.mouse_filter = Control.MOUSE_FILTER_IGNORE var parent := slot_row.get_parent() diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index ac8143a5..c233a3b6 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -64,7 +64,7 @@ func _init() -> void: _tip.visible = false var sb := UiKit.panel_flat(UiKit.TIP_BG, UiKit.GOLD,UiKit.RADIUS_OBJECT, 1, Vector4(6, 3, 6, 3)) _tip.add_theme_stylebox_override("panel", sb) - _tip_label = UiKit.label("", 13, false, UiKit.WARM) + _tip_label = UiKit.label("",UiKit.FS_HINT, false, UiKit.WARM) _tip_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _tip_label.custom_minimum_size = Vector2(210, 0) _tip.add_child(_tip_label) @@ -126,7 +126,7 @@ func _make_slot() -> PanelContainer: icon.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR icon.mouse_filter = Control.MOUSE_FILTER_IGNORE col.add_child(icon) - var meta := UiKit.label("", 11, false) + var meta := UiKit.label("",UiKit.FS_CAPTION, false) meta.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER col.add_child(meta) return slot @@ -145,7 +145,7 @@ func _fill_slot(slot: PanelContainer, eff: Dictionary) -> void: # 迷你档:层数角标挂图标下方(×N)——槽随内容自适应,无 meta 行/剩余点(悬停 tooltip 承载全部明细) var tag := col.get_child(1) as Label tag.text = "×%d" % layers if layers > 1 else "" - tag.add_theme_font_size_override("font_size", 10) + tag.add_theme_font_size_override("font_size", UiKit.FS_CAPTION) if tex == null: tag.text = (ICON_PLACEHOLDER + tag.text).strip_edges() return diff --git a/game/presentation/views/toast_stack.gd b/game/presentation/views/toast_stack.gd index 5d30f69f..0bc4e2ed 100644 --- a/game/presentation/views/toast_stack.gd +++ b/game/presentation/views/toast_stack.gd @@ -43,7 +43,7 @@ func show_toast(text: String, tone: String = "info") -> void: col = COL_GOLD sb.border_color = col row.add_theme_stylebox_override("panel", sb) - var lab := UiKit.label(("⚠ " if tone == "warn" else "") + text, 14, tone != "info", col) + var lab := UiKit.label(("⚠ " if tone == "warn" else "") + text,UiKit.FS_HINT, tone != "info", col) lab.clip_text = true row.add_child(lab) _slot_box.add_child(row) diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 5439aaa8..122560eb 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -226,6 +226,17 @@ static func load_font(path: String) -> Font: return null +# ── 字号档位表(UI 设计对齐批 P3 甲 2026-10-06——WB G1 六档;全站 UiKit.label/字号 override 只许取 +# 本表,裸数字字号退役。归档映射:10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、 +# 21/22/24/26→TITLE、32/40→H1(就近归档);棋盘数字公式 maxi(18, ceil(格边×0.5)) 与站桩血数 +# 11px 条带内读数豁免不入表(art-bible §7.4)── +const FS_CAPTION := 12 # 装饰 caption/分区小字/微计数(§7.4 豁免下限) +const FS_HINT := 14 # 提示/tooltip 下限档 +const FS_BODY := 16 # 正文/明细下限档 +const FS_SUB := 18 # 副标题/小组标题(=棋盘数字下限同值) +const FS_TITLE := 24 # 屏标题/横幅/价格 +const FS_H1 := 34 # 主标题/演算暴击 + # ── StyleBox 工厂 ── # margin = (左, 上, 右, 下);border_w = 0 即无边框(根底/遮罩用) # 圆角率单点(UI 设计对齐批 P5 甲 2026-10-06——容器/按钮全站唯一圆角值;数据框/数字牌/AP 点阵/准线/血条 @@ -460,7 +471,7 @@ class BCard: band_r.color = band band_r.custom_minimum_size = Vector2(0, 6) box.add_child(band_r) - mark = UiKit.label("✓", 16, true, Color8(58, 42, 8)) + mark = UiKit.label("✓",FS_BODY, true, Color8(58, 42, 8)) mark.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT mark.visible = false box.add_child(mark) @@ -474,21 +485,21 @@ class BCard: icon_tr.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST icon_tr.size_flags_horizontal = Control.SIZE_SHRINK_CENTER box.add_child(icon_tr) - name_l = UiKit.label(title, 18, true, INK_TITLE) + name_l = UiKit.label(title,FS_SUB, true, INK_TITLE) name_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(name_l) - desc_l = UiKit.label(desc, 14, false, Color8(74, 58, 40)) + desc_l = UiKit.label(desc,FS_HINT, false, Color8(74, 58, 40)) desc_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER desc_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART box.add_child(desc_l) var spacer := Control.new() spacer.size_flags_vertical = Control.SIZE_EXPAND_FILL box.add_child(spacer) - price_l = UiKit.label(price, 21, true, GOLD) + price_l = UiKit.label(price,FS_TITLE, true, GOLD) price_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER price_l.visible = price != "" box.add_child(price_l) - foot_l = UiKit.label(footnote, 11, false, Color8(110, 69, 52)) + foot_l = UiKit.label(footnote,FS_CAPTION, false, Color8(110, 69, 52)) foot_l.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER foot_l.visible = footnote != "" box.add_child(foot_l) From 1b2ecf640076268b247ad53abe86e28716aa8bc7 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:45:54 +0800 Subject: [PATCH 09/12] =?UTF-8?q?iter16ui=20T7=EF=BC=9AP6=E7=94=B2?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=BA=AA=E5=BE=8B=E8=90=BD=E7=A0=81=EF=BC=88?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B9=9D=E6=9E=9A=E5=B8=B8=E8=A7=84=E6=A1=A3?= =?UTF-8?q?24=E2=86=9232px=3D1=C3=97=C2=B7mini16=E7=BB=B4=E6=8C=81?= =?UTF-8?q?=EF=BC=9B=E6=9F=9C=E5=8F=B0=E5=9B=9B=E6=9E=9A64=E6=BA=9020?= =?UTF-8?q?=E2=86=9232px=3D0.5=C3=97=EF=BC=9BBCard=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=A7=BD56=E2=86=9240px=3D2=C3=97=EF=BC=9B=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E5=AE=9A=E9=AB=9848=E5=AE=BD=E9=9A=8F?= =?UTF-8?q?=E6=BA=90=E6=AF=9446=C3=9748=E7=BA=B5=E6=A8=AA=E5=BC=82?= =?UTF-8?q?=E5=80=8D=E6=B6=88=E9=99=A4=EF=BC=9B=E6=89=8B=E7=BB=98=E5=8D=81?= =?UTF-8?q?=E6=9E=9A20/40=E5=8F=8C=E6=A1=A3=E6=B6=88=E8=B4=B9=E7=82=B9?= =?UTF-8?q?=E6=A0=B8=E6=9F=A5=3D=E5=85=A8=E9=83=A81=C3=97=E6=97=A0?= =?UTF-8?q?=E9=9C=80=E5=8A=A8=EF=BC=89+P10=E4=B9=99=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E6=80=81=E6=8D=A2=E8=A3=85=E3=80=8C=E5=9C=B0=E6=9D=BF=E7=BA=B9?= =?UTF-8?q?=E7=90=86+=E7=81=B0=E7=BD=A9=CE=B1.66=E3=80=8D=EF=BC=88FOG=5FME?= =?UTF-8?q?MORY=5FPLATE=E5=B9=B3=E6=B6=82=E9=80=80=E5=BD=B9=EF=BC=9B?= =?UTF-8?q?=E8=AE=B0=E5=BF=86=E5=A2=A8=E5=AF=B9=E5=90=88=E6=88=90=E5=BA=95?= =?UTF-8?q?6.71:1=E2=89=A54.5=E5=AE=9E=E6=B5=8B=E5=A4=8D=E7=AE=97=EF=BC=89?= =?UTF-8?q?+art-bible=20=C2=A78.2=E6=98=BE=E7=A4=BA=E6=A1=A3=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E7=99=BB=E8=AE=B0+=C2=A76.5=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E6=80=81=E6=9D=A1=E6=AC=BE=E6=8D=A2=E4=BB=A3=E5=8F=8C=E4=BE=A7?= =?UTF-8?q?=E8=90=BD=E6=96=87=EF=BC=9B=E8=BD=BB=E9=97=B8=E5=86=92=E7=83=9F?= =?UTF-8?q?782/0+=E4=B8=89=E6=8E=A2=E9=92=88=E7=BB=BF=EF=BC=9Bboard=5Fshot?= =?UTF-8?q?=E7=B3=BB=E7=AA=97=E5=8F=A3=E5=8C=96=E6=8E=A2=E9=92=88=E5=BD=92?= =?UTF-8?q?T10=E4=BA=BA=E9=97=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 3 ++- game/presentation/views/board_cell_unit.gd | 7 ++++++- game/presentation/views/camp_overlay_view.gd | 4 ++-- game/presentation/views/level_map_screen.gd | 7 ++++++- game/presentation/views/status_slot_row.gd | 5 +++-- game/presentation/views/ui_kit.gd | 2 +- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 7a2e29c4..f5922970 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -381,7 +381,7 @@ - **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——正主「灯光区起步半径=微光环 8 格」的落码口径(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,正主《HUD框架》「未开格类型微光」节),**不随灯光区扩**(正主配套拍板④)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:LIGHT_RADIUS_LANTERN_BONUS = **+2**(flat 整数档,正主配套拍板),**预留不接效果**(接线归 Alpha 信息件批)。边界随角色格位逐格重算,无半径插值动画。←正主;§2 光照氛围允许域 - **区外未开格:全黑不渲染(不透明档,照抄正主)**:正主原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③正主验收线「区外未开格不可见」须二值态才能逐格断言。←正主;§4.2 -- **区外已开格:暗淡记忆态(灰显可读档,明度 provisional)**:整格罩**程序化素色记忆板**(纯色压平纹理,纹理免疫——同 §4.1 色牌兜底的纹理免疫逻辑)+ 格内元素灰阶调制:**记忆板 #3A3A3A(L≈0.045,provisional)**、**记忆墨 #C4C4C4(中性灰 L≈0.55,provisional)**;数字对记忆板 ≈6.3:1 **≥4.5:1**(WCAG,可访问性基线硬指标)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆板、数字以记忆墨直画(素面无纹理,直画恒可读,无需再算牌墨组合)。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——记忆板 L0.045 对 L0,实机目检常光档可分(暗房档一并抽检,provisional);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态全中性灰零色相,对活态暖底暖墨);格底明度差(L0.045 对 0.08–0.14)为辅助通道;③格态三形在记忆态保持灰度可辨——形通道(完整/碎裂/巢穴纹,§3.2)经灰阶调制形状不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,正主口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2 +- **区外已开格:暗淡记忆态(灰显可读档,2026-10-06 UI 设计对齐批 P10 乙换装)**:画法 = **地板纹理原样 + 灰罩压顶**(demo 口径换装——原「程序化素色记忆板平涂」退役;纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动)+ 格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**;数字对合成底实测 **≈6.7:1 ≥4.5:1**(WCAG 硬指标;地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);格底明度差为辅助通道;③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,正主口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2 - **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②正主验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←正主;§1.2 原则一;§3.2 - **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加口径 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。←任务书 T3/T4 - **§2 明度禁令自查**:迷雾遮蔽与记忆态灰显属 §2 明度分层**光照氛围允许域**(洞穴举灯的空间光照呈现,与 Moonlighter 取列「亮地板/暗深渊/发光体」光照层次同族),非情绪压暗(§9.2 Darkest 反面条款不触——那禁的是情绪表达)、非状态明暗编码(格态语义仍由形+色相承载,灰度下三态可辨不受扰)。←§2;§9.1;§9.2 @@ -444,6 +444,7 @@ - **缩放纪律(硬规则,2026-09-30 v3.1 起按资产两类分级——2026-09-26 用户裁「更改规则,不做个案豁免」)**: - **甲类·文本与语义件**(数字、图标、旗、砖面 tile、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。 + - **显示档登记例外(2026-10-06 UI 设计对齐批 P6 甲——64 源 0.5×,待素材批消除)**:柜台四枚 `icon_forge/workshop/atlas/keystone`(64×64 源)显示档统一 **32px = 0.5×**;状态九枚(32×32 源)mini(站桩)档 **16px = 0.5×**。两处均系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材批出 32px 源后回归 1×。常规档显示一律 1×(状态九枚 32px、手绘十枚 20px/40px 双档、BCard 图标槽 40px=2×)。 - **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类今后免逐案豁免(豁免蔓延断根)。 - **站桩立绘槽位=高定宽随(2026-10-04 原型审计教训落规)**:立绘/精灵槽位只定「高度的整数倍档」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。实例=UI 原型 88×92 方框把 23×48 地精源横拉 3.83×/纵拉 1.92×、26×48 熊地精 3.38×/1.92× 压扁发花,46×48 主角近方恰等比故独活——方框是按主角比例定的,窄条生物(细长本体裁掉透明边)进主角的框必变形。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。 - **1920×1080 档策略(2026-09-30 三裁决案甲落定——三案呈报见 design/qa/m3-iter9-t8-rulings-2026-09-30.md)**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比 1.35×+左右黑边各 ~96px,构图与 1280×800 基准档完全一致(逻辑布局 1920/1280 逐键一致实测);甲类 1.35 非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(1920 独立 2× 基准)重议;乙类同前款。 diff --git a/game/presentation/views/board_cell_unit.gd b/game/presentation/views/board_cell_unit.gd index 113e93cf..592a020b 100644 --- a/game/presentation/views/board_cell_unit.gd +++ b/game/presentation/views/board_cell_unit.gd @@ -254,7 +254,12 @@ 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)), UiKit.FOG_MEMORY_PLATE, true) + # 记忆态换装(P10 乙 2026-10-06——demo 口径「地板纹理 + 灰罩 α.66」:原 #3A3A3A 平涂退役; + # 地板纹理原样直画 + FOG_MEMORY_PLATE α.66 灰罩压顶;素材零改动、格边长零改动。 + # 记忆墨 FOG_MEMORY_INK 对合成底实测 ≈6.7:1 ≥4.5:1(§7.2 硬指标;floor avg #453020 复算在册)) + if tex_base != null: + draw_texture_rect(tex_base, Rect2(Vector2.ZERO, Vector2(edge, edge)), false) + draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), Color(UiKit.FOG_MEMORY_PLATE, 0.66), true) if glyph != "": _draw_glyph(glyph, UiKit.FOG_MEMORY_INK, maxi(18, int(ceil(edge * 0.5)))) # 字号下限 18(§7.4 冻结公式同源) # ⑦ 中立移除退色层(迭代 13 T8/D6——P2 甲退色降档:暗幕压顶全层覆盖,暗淡记忆态同族呈现语义; diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 88de1ed9..1feeb813 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -87,7 +87,7 @@ func _init() -> void: var bal_row := HBoxContainer.new() bal_row.add_theme_constant_override("separation", 6) badge.add_child(bal_row) - var keystone_icon := UiKit.icon_rect(UiKit.TEX_ICON_KEYSTONE, 20) # 缺位 null → 纯文本回退(M3 18→20) + var keystone_icon := UiKit.icon_rect(UiKit.TEX_ICON_KEYSTONE, 32) # P6 甲②(2026-10-06):64 源 0.5×(原 20=0.3125× 违 §8.2);缺位 null → 纯文本回退 if keystone_icon != null: bal_row.add_child(keystone_icon) _balance_label = UiKit.label("钥石 0",UiKit.FS_SUB, true, UiKit.INK_ON_GOLD) @@ -162,7 +162,7 @@ func _counter_panel(title_text: String, icon_path: String, holder: Control, min_ head.add_theme_constant_override("separation", 6) band.add_child(head) if icon_path != "": - var ic := UiKit.icon_rect(icon_path, 20) # M3 16→20(demo 头带图标档) # 缺位 null → 纯文本回退 + var ic := UiKit.icon_rect(icon_path, 32) # P6 甲②(2026-10-06):柜台头带 64 源 0.5×(原 20 违 §8.2);缺位 null → 纯文本回退 if ic != null: head.add_child(ic) var l := UiKit.label(title_text,UiKit.FS_BODY, true, UiKit.WARM) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 18eac718..4f6bbdc3 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -130,9 +130,14 @@ func _init() -> void: bottom.add_child(strip) var face := TextureRect.new() var face_tex := UiKit.load_tex(UiKit.TEX_HERO_PORTRAIT) + # P6 甲⑤(2026-10-06):定高 48px=1×、宽随源图比自适应(源 46×48 → 46×48;纵横异倍消除) + var face_h := 48.0 + var face_w := face_h if face_tex != null: face.texture = face_tex - face.custom_minimum_size = Vector2(50, 52) + if face_tex.get_height() > 0: + face_w = floorf(face_h * face_tex.get_width() / float(face_tex.get_height())) + face.custom_minimum_size = Vector2(face_w, face_h) face.expand_mode = TextureRect.EXPAND_IGNORE_SIZE face.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED face.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index c233a3b6..3cd3c09d 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -118,9 +118,10 @@ func _make_slot() -> PanelContainer: if compact: col.add_theme_constant_override("separation", 0) slot.add_child(col) - # 定稿纹理图标(32px 源 → 24px 槽内呈现;线性过滤匹配抗锯齿矢量风源图) + # 定稿纹理图标(P6 甲③ 2026-10-06:32px 源 → 常规档 32px=1×;mini(站桩)档 16px=0.5× + # 共用 §8.2 例外登记——线性过滤匹配抗锯齿矢量风源图) var icon := TextureRect.new() - icon.custom_minimum_size = Vector2(24, 24) if not compact else Vector2(16, 16) + icon.custom_minimum_size = Vector2(32, 32) if not compact else Vector2(16, 16) icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED icon.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 122560eb..b76deb00 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -479,7 +479,7 @@ class BCard: var itex := UiKit.load_tex(icon_path) if itex != null: icon_tr.texture = itex - icon_tr.custom_minimum_size = Vector2(56, 56) + icon_tr.custom_minimum_size = Vector2(40, 40) # P6 甲④(2026-10-06):20×20 源 2× 档(原 56=2.8× 违 §8.2) icon_tr.expand_mode = TextureRect.EXPAND_IGNORE_SIZE icon_tr.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED icon_tr.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST From e5427af6bc8857c7f89ebfd407ed568877fb72dc Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:49:27 +0800 Subject: [PATCH 10/12] =?UTF-8?q?iter16ui=20T8=EF=BC=9AP8=E7=94=B2?= =?UTF-8?q?=E5=8D=A1=E9=A1=B6=E7=B1=BB=E5=9E=8B=E8=89=B2=E5=B8=A6Bayer?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=8A=96=E5=8A=A8=E8=AF=95=E7=82=B9=EF=BC=88?= =?UTF-8?q?bcard=20band=E5=B9=B3=E6=B6=82ColorRect=E9=80=80=E5=BD=B9?= =?UTF-8?q?=E2=86=92DitherBand=204=C3=974=20Bayer=202px=E5=85=83=E8=83=9E?= =?UTF-8?q?=CE=B1=E6=B7=B1=E8=87=B3=E9=9B=B6=E9=9D=99=E6=80=81=E7=BB=98?= =?UTF-8?q?=E5=88=B6=EF=BC=9B=E9=9A=8FTG=5F*=E9=80=90=E5=8D=A1=E7=9D=80?= =?UTF-8?q?=E8=89=B2=EF=BC=9B=E5=85=A8=E7=AB=99/B=E5=8C=BA=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E7=95=99=E5=90=8E=E6=89=B9=3D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=B9=A6P8=E7=94=B2=E5=8E=9F=E6=96=87=EF=BC=9B=E8=BD=BB?= =?UTF-8?q?=E9=97=B8=E5=86=92=E7=83=9F782/0+=E4=B8=89=E6=8E=A2=E9=92=88?= =?UTF-8?q?=E7=BB=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/ui_kit.gd | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index b76deb00..2e6840ae 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -443,8 +443,31 @@ static func danger_button(text: String, tip := "") -> Button: return b +# 卡顶类型色带·Bayer 有序抖动(UI 设计对齐批 P8 甲 2026-10-06——bcard band 平涂 ColorRect 退役; +# demo CSS 平滑渐变/blur 违反像素纪律,改 4×4 Bayer 有序抖动台阶:α 由深至 0,2px 元胞逐行降覆盖; +# 纯静态绘制零动效(减动效无涉);Bayer 阶数=实现细节白名单项,取 4×4) +class DitherBand: + extends Control + var band: Color + + func _init(c: Color) -> void: + band = c + custom_minimum_size = Vector2(0, 8) # 8px = 4×4 Bayer 全周期(原平涂条 6px) + + func _draw() -> void: + var bayer := [[0, 8, 2, 10], [12, 4, 14, 6], [3, 11, 1, 9], [15, 7, 13, 5]] + var cell := 2.0 + var rows := int(ceil(custom_minimum_size.y / cell)) + var cols := int(ceil(size.x / cell)) + for ry in rows: + var cover := 1.0 - float(ry) / float(rows) # 顶行全覆盖 → 底行趋零 + for rx in cols: + if float(bayer[ry % 4][rx % 4]) / 16.0 < cover: + draw_rect(Rect2(float(rx) * cell, float(ry) * cell, cell, cell), band, true) + + # bcard 竖卡工厂(商店/三选一同构卡——M6/M7 共用;M7.1 差异仅=价签 vs ✓选择章) -# 返回 {panel, mark, band, icon, name_l, desc_l, price_l, foot_l};set_selected 经 mark/样式换装 +# set_selected 经 mark/样式换装 class BCard: extends PanelContainer var mark: Label @@ -467,9 +490,7 @@ class BCard: box.add_theme_constant_override("separation", 8) add_child(box) body = box - var band_r := ColorRect.new() - band_r.color = band - band_r.custom_minimum_size = Vector2(0, 6) + var band_r := DitherBand.new(band) # P8 甲:卡顶类型色带=Bayer 有序抖动带(随各 TG_* 逐卡着色) box.add_child(band_r) mark = UiKit.label("✓",FS_BODY, true, Color8(58, 42, 8)) mark.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT From ce3dab96c0318c95fdb8d8a2e1c5a275cec5a2b6 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:55:32 +0800 Subject: [PATCH 11/12] =?UTF-8?q?iter16ui=20T9+T10=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E9=97=B8=E5=85=A8=E5=A5=97=E5=85=A8=E7=BB=BF=EF=BC=88=E5=86=92?= =?UTF-8?q?=E7=83=9F782/0+run=5Fall=2016=E5=A5=97+=E4=BA=94=E6=8E=A2?= =?UTF-8?q?=E9=92=88=E5=90=ABclick+layout+doc=E4=B8=89=E9=97=B8=E9=9B=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E+=E7=86=B5=E5=A2=9E=E9=9B=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E+=E7=B4=A0=E6=9D=90=E9=9B=B6=E8=A7=A6=E7=A2=B0+MC?= =?UTF-8?q?=E9=9B=B6=E8=B7=91=E3=80=94=E6=A0=B8=E5=BF=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=B1=82diff=3D0=E5=AE=9E=E8=AF=81=E3=80=95=EF=BC=89+=E5=87=BA?= =?UTF-8?q?=E5=8F=A3=E6=8A=A5=E5=91=8AT2-T9=E8=8A=82=E8=90=BD=E5=85=A8?= =?UTF-8?q?=EF=BC=88=E9=80=A0=E5=86=8C/=E4=BC=B0=E6=97=B6=E5=AF=B9?= =?UTF-8?q?=E7=85=A7/=E5=85=AB=E6=9D=A1=E5=81=8F=E5=B7=AE=E6=B1=87?= =?UTF-8?q?=E6=80=BB=EF=BC=89+T10=E4=BA=BA=E9=97=B8=E6=9D=90=E6=96=99?= =?UTF-8?q?=E5=8C=85=EF=BC=88A=E6=A0=B7=E5=BC=A0=E5=9B=9B=E9=A1=B9+B?= =?UTF-8?q?=E5=85=AB=E5=B1=8F+C=E5=8D=81=E4=B8=93=E9=A1=B9+D=E5=87=8F?= =?UTF-8?q?=E5=8A=A8=E6=95=88+E=E8=BF=BD=E8=AE=A4=E5=8D=95=E5=85=AB?= =?UTF-8?q?=E9=A1=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/qa/iter16-ui-exit-report-2026-10-06.md | 56 ++++++++++++++++++ ...er16-ui-human-gate-checklist-2026-10-06.md | 57 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 design/qa/iter16-ui-human-gate-checklist-2026-10-06.md diff --git a/design/qa/iter16-ui-exit-report-2026-10-06.md b/design/qa/iter16-ui-exit-report-2026-10-06.md index 56a00def..2d765c43 100644 --- a/design/qa/iter16-ui-exit-report-2026-10-06.md +++ b/design/qa/iter16-ui-exit-report-2026-10-06.md @@ -67,3 +67,59 @@ ### T0 结论 基线回填完毕,无停机条件触发。**T2 实施修正案**(相对任务书 §3-N1):①意图徽标四处=垫 PANEL_DATA 素牌,atk 零换墨/buf 换 #1E5A96/charge 需深化金墨/debuff 自动达标;②槽位字两态=深化墨色(非 demo 的提亮);③RAP=零改动。其余收项(垫牌几何 12.29→14.29 口径、字号豁免条款落文等)按任务书+白名单执行。 + +## T2-T8 · 实施落籍(提交链 85ea024→e5427af,十提交 32 文件) + +| 卡 | 提交 | 落点 | +|---|---|---| +| T1 | a55a302 | status_slot_row 九枚 preload→load_tex(呈现层素材 preload=0) | +| T2 | b38ae07 | N1 七处修法(T0 修正案落码)+ui_contrast_probe 入 probe_gate 默认段+§7.4 豁免条款 | +| T3 | 4e7aa83 | N2 站桩纵向余量(STANDEE_FOOT_MARGIN=12)+ui_struct_probe ⑥standee 断言族 | +| T4a | af5f317 | N4a 裸色全量收 ui_kit(25 处/10 文件)+N4c TG_* 五族+tg_band() 分族+商店货架分族 | +| T4b | b26e3fb | P7 乙五 token 向 demo 值+§7.2 五件对齐注记 | +| T5 | 2f74da8 | P4 乙切片 16+Q1 丙 margin clamp+P5 甲 RADIUS_OBJECT=5 收敛(26 处归一)+§7.1 两条注记 | +| T6 | e0fd7cb | P3 甲 FS_* 六档+全库 107 位点归档+P11 豁免清单落文 | +| T7 | 1b2ecf6 | P6 甲缩放纪律+P10 乙记忆态纹理灰罩+§8.2 例外登记+§6.5 条款换代 | +| T8 | e5427af | P8 甲 bcard 卡顶 Bayer 抖动带试点(DitherBand 4×4/2px 元胞) | + +## N5 · 面板皮消费面造册(T5 判定留痕,代拍板「不强制补皮」) + +**穿戏服 9 面**(panel_skinned,全部容器/分组框判据 ✓):ui_assembler:202 帮助板 / battle_end_overlay:33 结算容器 / battle_stage_view:93 叙事板 / confirm_dialog:19 确认框 / hero_info_panel_view:34 C区主面板 / legend_overlay:31 图例 / node_overlay:17 节点框 / settings_overlay:39 设置容器 / ui_kit BCard 工厂(商店+三选一卡)。切片 16 后 content margin 全部经工厂 clamp ≥16(原 <16 的 7 面自动抬平,调用点零改)。 +**素面维持零补皮**(§7.1「数据素面」判据):AP 条/状态槽两档/槽 chips/地图底栏三框/tooltip/回合横幅/棋盘提示条/数字色牌——直角素面原样。 + +## T9 · 重闸读数(全绿,与 T0 基线逐项对齐) + +| 闸 | 读数 | 对照基线 | +|---|---|---| +| 冒烟 | **782/0** | 同基线(断言数持平——纯呈现批零逻辑面) | +| run_all | **16 套全绿** | 同基线 | +| ui_input_probe | 16 断言 PASS | 同 | +| ui_struct_probe | 全屏零红(含新增⑥standee 族) | +1 断言族 | +| ui_contrast_probe | 11 对测点全绿+裸色 0+preload 0 | 新增段 | +| ui_click_probe | done=true 问题=0(预算 15981) | 同 | +| ui_layout_probe | exit=0 | 同 | +| gdd_lint | 2 文件不通过(06/07 表格占比——既有) | 零新增 ✓ | +| doc_link_audit | 死链 4=基线 2(奇物.md×2 既有)+环境假红 2(.zcode/plans+archive 不入库) | 零新增 ✓ | +| doc_term_audit | 218 命中/3 疑似(既有) | 零新增 ✓ | +| 熵增闸 | design/diagrams 越界 ×1(既有在册归 archify 批) | 零新增 ✓ | +| MC | **零跑**(纯呈现批:核心/数据层 diff=0 实证、零 RNG 消费变化——两入口铁规+任务书 §7) | — | +| 素材红线 | game/assets/art 与 artwork/ 零触碰(git status 空) | ✓ | + +## T10 · 人闸材料包 + +`design/qa/iter16-ui-human-gate-checklist-2026-10-06.md`(A 整屏样张闸四项〔Q2 乙并入〕+B 八屏对比+C 本批专项十项+D 减动效+E 代拍板追认单八项+F 机检佐证)。board_shot 系窗口化探针按 probe_gate 纪律不入 headless 闸,随人闸实机执行。 + +## 估时对照 + +任务书预算 T0-T11≈6.9d(超软盒 3 日知情预挂)→ **实际单会话一次跑完**(沿迭代 13/15 先例;段一切分预案未触发——三段并一次合并=Q7 甲)。超支点无;T6 位点规模超起草口径(107 vs 26)经机检化扫批吸收。 + +## 偏差与呈报汇总(本批对任务书的全部修正,均系 §3「以 T0 复核实况为准」授权面) + +1. **N1 七点修法三处改向**:意图徽标四处=垫 PANEL_DATA 素牌(demo 的「换墨降档」在实机暗底反向);槽位字两态=深化墨色(demo 的「提亮 WARM_FAINT」在实机亮皮反向);RAP=零改动(实机 10.40 已合规)。血数垫牌口径 12.29→14.29(α.95 混成实算)。 +2. **N4a 普查漏记**:裸 Color8 实数 25 处/10 文件(任务书 5 处)——已全量原值搬运收 ui_kit,白名单清零。 +3. **字号普查增长**:UiKit.label 位点 78→107(15②后新增面);归档映射=就近档(40→34/26→24/22→24/20→18/13→14/11→12)。 +4. **TG_AOE 归族判定**:blast/aoe→TG_AOE(#E25676;消费面=reward.tres 现成 clear_blast/spark_aoe),magic 独留紫——卡带观感变化=爆裂族紫转粉,人闸 E5 可推翻。 +5. **新增常量八枚**:HERO_BLUE_DEEP/GOLD_INK/STONE_DEEP(N1)+TG_* 五族(N4c)+RADIUS_OBJECT/PANEL_SLICE/FS_* 六档(P5/P4/P3)+N4a 搬运 14 枚——全部 ui_kit 单点。 +6. **⑥standee 断言语义**:「⊆舞台+底缘 ≥8px」(全边 8px 内缩过严——容器左右边距 6px 既有)。 +7. **T6 扫批事故一起**:settlement_fx span 错位写入两处,当批发现当批修复(diff 复核全净)。 +8. **批外残余登记**(06 新条):站桩名行四墨(WARM_FAINT/HERO_BLUE/GOLD_DEEP/WARM 对舞台底)+敌顺位徽标 GOLD_DEEP+RAP 反馈墨 STONE_FAINT 等邻接文字位实测 <4.5:1——非任务书七点范围,未动,随 06 待后批。 diff --git a/design/qa/iter16-ui-human-gate-checklist-2026-10-06.md b/design/qa/iter16-ui-human-gate-checklist-2026-10-06.md new file mode 100644 index 00000000..58dadaf1 --- /dev/null +++ b/design/qa/iter16-ui-human-gate-checklist-2026-10-06.md @@ -0,0 +1,57 @@ +# 人闸目检清单:UI 设计对齐批(迭代 16)· 2026-10-06 + +> 执行=用户实机(T10 人闸)。启动:Godot 打开 `game/project.godot` 运行即可;逐项勾选,不过项随批登记返工。 +> 对照基线:demo 原型 v2.1 md5 `78ebbee0…`(主区 `artwork/ui-redesign-2026-10-04/src/ui-prototype.html`);本批起点 a39d044 → 头 e5427af(merge 后见 roadmap 行)。 + +## A · 整屏样张闸四项(Q2 乙——§1.4 并入,逐屏过) + +- [ ] A1 文字对比 ≥4.5:1 抽测(重点=本批七处修法:站桩血数垫牌/意图徽标四色垫牌/C区槽两态/RAP 标签) +- [ ] A2 明度分层三档带(各屏底/板/字三层关系未被本批取值换代打破) +- [ ] A3 整屏焦点预算首焦唯一(各屏视觉主焦点仍唯一) +- [ ] A4 文字禁压纹理底(垫牌面:血数牌/意图牌在石皮上为素牌形态) + +## B · 八屏对比走查(demo v2.1 为方向稿,逐屏与实机对看) + +- [ ] B1 标题屏(主标题 40→34FS_H1/底座椭圆 17 保留/副题 16) +- [ ] B2 设置屏(警示文两处 INK_HINT 12→12/标题 24) +- [ ] B3 营地(柜台头带图标 20→32/柜台说明文 12/行板/钥石徽章/等级章字) +- [ ] B4 战斗屏(B 区舞台切片 16 石皮/站桩血数牌/意图徽标垫牌/状态槽 32px/回合横幅圆角 8→5) +- [ ] B5 关卡节点地图(底栏头像 46×48 定高随宽/组标 12px/记忆态新形) +- [ ] B6 战斗结算(金印 200 保留/明细带字级) +- [ ] B7 奖励三选一(卡片抖动色带/标题 22→24/脚注 12) +- [ ] B8 商店(货架卡分族色带=attack→通用金·heal/hp→绿·blast/aoe→#E25676/图标 40px/价签 24) + +## C · 本批专项(改动面逐处) + +- [ ] C1 站桩:血数深牌可读、名行不再贴盒底(基线上移 13px 目视不悬空)、内容不出 252 舞台(探针⑥已绿,实机复核) +- [ ] C2 棋盘记忆态(P10 乙新形):区外已开格=地板纹理+灰罩,数字灰墨可读;与全黑未开格/灯光区活格三态可辨;暗房档抽检 +- [ ] C3 卡片抖动色带(P8 试点):三选一/商店卡顶=像素台阶感抖动带(非平滑渐变)——**观感不佳的回退案=band 段还原平涂条(DitherBand→ColorRect 6px 一处改)** +- [ ] C4 图标缩放纪律:B 区状态槽 32px 不挤槽体/营地头带 32px 不压带高/BCard 40px 居中/地图头像无拉伸变形 +- [ ] C5 字号档位全扫后观感:重点=主标题 40→34、屏题 26→24、营地题 22→24、暴击演算 32→34/26→24——有无「变小失势/变大失稳」单点 +- [ ] C6 panel 切片 16+margin clamp:石皮四角变大后有无纹理压缩感;7 处内容边距抬升后有无局促(营地 372 列/图例/设置/确认框) +- [ ] C7 圆角收敛 5px:所有容器/按钮/开关/横幅同率;数据框仍直角;例外三件(底座 17/金印 200/脉冲环 100)原样 +- [ ] C8 五 token 换代(Δ≤6/255 应不可辨):数据板/板线/状态槽底/血条底/营地头带——并排看新旧截图如有可辨差异即报 +- [ ] C9 RAP 标签显式墨(视觉应零变化) +- [ ] C10 1920×1080 档复验(1.35× 例外档——布局/切片/抖动带在该档不劣化) + +## D · 减动效与环境 + +- [ ] D1 减动效开关双态(本批零新动效——开关行为应与批前一致;抖动带/灰罩均静态) +- [ ] D2 全屏/窗口切换后 UI 不破(切片/margin 改动面) + +## E · 代拍板追认单(2026-10-06 白名单内已落,目检可推翻) + +| # | 项 | 已落值 | 推翻改法 | +|---|---|---|---| +| E1 | RADIUS_OBJECT | 5 | 嫌大→ui_kit 常量改 4 一处 | +| E2 | 槽「已用」墨 STONE_DEEP | #554D41 | 提/降一档随手感 | +| E3 | 蓄力墨 GOLD_INK | #74500B | 同上 | +| E4 | 增益墨 HERO_BLUE_DEEP | #1E5A96 | 同上 | +| E5 | TG_AOE 归族(blast/aoe→#E25676) | tg_band() | 若嫌爆裂弃紫转粉违和→blast 行移回 TG_MAGIC 一行 | +| E6 | 血数牌宽 = 字宽+8px | 白名单 8 | 挤/松→6 或 10 一处 | +| E7 | 抖动带 4×4/2px 元胞/8px 高 | 实现细节 | 嫌粗→8×8 或 1px 元胞 | +| E8 | 意图徽标垫 PANEL_DATA 素牌 | T0 修法 | 嫌亮牌突兀→改暗牌+换亮墨(另行呈报) | + +## F · 机检佐证(已全绿,实机只抽核) + +冒烟 782/0 · run_all 16 套全绿 · ui_input 16 断言/ui_struct 全屏零红(含⑥standee 新族)/ui_contrast 11 对测点+裸色 0+preload 0/ui_click done=true 问题=0/ui_layout exit0 · doc 三闸与熵增闸=基线零新增 · 素材零触碰(game/assets/art 与 artwork/ 未改)· MC 零跑(纯呈现批,核心/数据层零 diff) From 33defc01f52e929c08fc9708851d9e379319fbdf Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 6 Oct 2026 03:57:34 +0800 Subject: [PATCH 12/12] =?UTF-8?q?iter16ui=20T11=E6=94=B6=E5=8F=A3=EF=BC=9A?= =?UTF-8?q?roadmap=20=E8=BF=AD=E4=BB=A316=E8=A1=8C=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=E5=85=A8=E6=89=B9=E8=90=BD=E7=B1=8D=EF=BC=88=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E9=93=BE/=E9=97=B8=E8=AF=BB=E6=95=B0/=E4=B8=89=E5=A4=84?= =?UTF-8?q?=E4=BF=AE=E6=B3=95=E6=94=B9=E5=90=91/=E9=81=97=E7=95=99?= =?UTF-8?q?=EF=BC=89+06=20=E6=96=B0=E7=99=BB=E8=AE=B0=E3=80=8C=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E5=B1=82=E6=AE=8B=E4=BD=99<4.5:1=E6=96=87=E5=AD=97?= =?UTF-8?q?=E4=BD=8D=E3=80=8D=EF=BC=88=E7=AB=99=E6=A1=A9=E5=90=8D=E8=A1=8C?= =?UTF-8?q?=E5=9B=9B=E5=A2=A8/=E6=95=8C=E9=A1=BA=E4=BD=8D=E5=BE=BD?= =?UTF-8?q?=E6=A0=87/RAP=E5=8F=8D=E9=A6=88=E8=A1=8C=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=89=B9=E5=A4=96=E9=82=BB=E6=8E=A5=E5=8F=91=E7=8E=B0=E5=BE=85?= =?UTF-8?q?=E5=90=8E=E6=89=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 8 ++++++++ roadmap.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 63a69954..448ce33c 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -280,6 +280,14 @@ **状态**:待办。**2026-10-05 注**:类型色五族已由迭代 16「UI 设计对齐批」§3-N4c 立项 `TG_*` 常量(实查 `ui_kit.gd` 现无 tg 常量,五族以裸 `Color8` 内联于 `bonus_pick_overlay.gd:96-102` / `shop_overlay_view.gd:189`,且缺第五族 aoe `#E25676`);本条(**格面**未开格类型徽章)与卡顶色带同族不同落点,**不并入本批**,维持待办。 +#### 呈现层残余 <4.5:1 文字位(迭代 16 批外邻接发现,2026-10-06 登记) + +**现状**:迭代 16「UI 设计对齐批」T0 实机复算中,七点测点范围外的邻接文字位实测对直背景 <4.5:1(§7.2 无区域例外)——①B 区站桩名行/护甲徽标四墨(WARM_FAINT≈6.2 过/HERO_BLUE 3.23/GOLD_DEEP 3.26/WARM 过,直背=舞台底 `STAGE_BG #3E342A`);②敌顺位徽标 ①②③ `GOLD_DEEP` 13px;③RAP 反馈行 `STONE_FAINT` 对 PANEL_DATA(2.73)。均系批前既有呈现、非迭代 16 引入;迭代 16 七点修法面已收口(站桩血数/意图徽标四色/C区槽两态/RAP 主标签),本条为其漏出范围,未动。来源=`design/qa/iter16-ui-exit-report-2026-10-06.md` §T0。 + +**归属**:呈现优化后续批(或 UI 设计对齐批第二轮);开工 = 用户点名 + +**状态**:待办 + #### 棋盘格边长三方取值不一致——待扩板定档处置(2026-10-06 登记) **现状**:迭代 16「UI 设计对齐批」P2 已裁「棋盘格边长零改动」(本次不动棋盘游戏画面),由此三方取值不一致作为**已知偏差**登记:①代码 = `board_view.gd:251` 动态公式 `clampi(cell, 26, 46)` + `:114` 默认 46.0;②art-bible §8.1(:433) 冻结锚点 = 45px(10×10)/ 36px(12×12);③demo 原型 = 44px(`src/ui-prototype.html:288`);另有 HUD框架:72 装板校验区间 [30,45]。**当前未被任何断言触发**(属潜在不一致,不是缺陷)。按任务书契约 R7「禁单侧改完留漂移」,本批**代码与文档均不改**;处置时机 = 扩板(13×13/14×14)定档时随格边长专项一并处理(§8.1 亦注明扩板换算值未定稿)。来源=`design/research/任务书-UI设计对齐批-2026-10-05.md` §2.1「已知偏差」行。 diff --git a/roadmap.md b/roadmap.md index 83368b03..7b4476ce 100644 --- a/roadmap.md +++ b/roadmap.md @@ -63,7 +63,7 @@ | 迭代 15 | **①调试功能整合批(2026-10-05 用户令自「14.5」临时卡改编入册——原周期外 0.5 卡,落地事实与验证读数零变化,只改编号归属)**:主菜单三调试散件(随机种子输入框/角色数值调整板/两层调试入口)收一张调试浮窗 DebugOverlay——入口=开始覆盖层右下角「调试」角标(与主按钮组非平级,DS_DEBUG=1 环境变量门控沿用迭代 8 卡④口径);浮窗=悬浮菜单之上 Dialog(不隐藏开始层,同确认弹窗形态;旧 TunePanel「与开始层互斥」形态与类整体吸收退役含 .uid);可扩展滚动列表页四区块(随机种子/数值调整/批量模拟/两层调试入口——后续调试项往下追加滚轮下探)。四拍板全落(2026-10-04 用户裁)=P1 甲 DS_DEBUG 门控/P2 乙全摊平/P3 仅开始菜单可开·对局不可达(_show_debug_overlay 门禁护栏+对局发起随开随收)/P4 可扩展列表。**✅ 已全批落籍(2026-10-05,worktree iter145-debug-hub 两提交 48c0b34/46dadbb,主区 merge --no-ff d0a3c6b/10c301b,台账 352)**:闸=冒烟 747/0+探针 ui_tune/ui_click/ui 三绿(worktree+主区双跑,主区跑前 --import 重刷类名缓存在册坑);遗留=实机目检归用户(DS_DEBUG=1 启动→右下角角标→浮窗四区块→两层调试入口) | 卡①门:迭代 14 出口(注:本卡先于迭代 14 出口落籍——编入时点迭代 14 ③已闭/①②④⑤在飞/⑥挂起,门列仅记编入时点状态,不构成追溯闸) | 单批已落地(原估 0.5d,实际一次会话);后续扩调试项=debug_overlay.gd _build() 列表区追加区块(P4 扩展口径) | | 迭代 15 | **②奇物概念收口与词族对齐批(2026-10-05 用户令编入本迭代)**:概念层已由用户逐轮裁定定稿(《奇物》v1.0→v2.7,7 轮),本批只做**落地对齐**、不做二次设计。三批内容:**①三套旧词族全面对齐**(顶层已改名「奇物」而代码仍叫旧名=用户最初抱怨的"文档与代码分开"):`feature_*`→`curio_*`(103 处/7 文件)、`relic_*`→`feat_*`(162 处/12 文件)、运行层 `bonus_*`→`curio_*`(160 处/8 文件)。**硬约束:`reward_*` 已被 `reward_pick`/`reward_node`/`reward_preview` 占用,统一词族不得使用**;`relic_table.gd` 与两个控制器类改名须同步 Godot `.uid`/`.tscn`(非文本层无法自证)。**②三条渠道按分类分离**(现行三渠道共用同一个 98 张池、三类混编):关底 Boss 击败=通过这一关→只出专长;奖励节点/商店→属性值提升+资源、专长在此**只以门票形式**出现。**兑付频率红线**:奇物不是打一场战斗给一份,关内普通战斗节点打完不给任何奇物,一关之内只兑付一次(用户 2026-10-05 纠错)。**③两个新种类入池**=刷新次数(须先与"商店独立刷新机制"划清边界)+ 专长获取门票(拿到即开不可囤积/罕见只在概率/一局限购一次/计步保底:连续 5 次三选一展示未出→第 6 次必出,刷新重展计入、奖励节点与商店共享计数);附带 `shop.tres` 补回复(默认原则要求分类内成员都在该出现的渠道池里)与 charge 标签补至 ≥4 件(现仅 3 件,档二永远达不到——数据缺陷)。设计事实源=`design/gdd/systems/冒险循环/奇物.md` v2.7,任务书=`design/research/任务书-奇物词族对齐与渠道分离批-2026-10-05.md`(T0-T8≈4.5d,两段切分预案在册〔段一词族 T0-T3≈2d/段二渠道+入表 T4-T8≈2.5d〕,切分点=T3 出口;11 条设计契约含 6 条 🔴 停机级;12 条批末验收断言;代拍板白名单 5 项;待用户裁点 4 项〔玩家可见面违规/第四关档二复裁/门票四参数终值/存档键正式迁移〕)。**开工门**:与在途 M-4 各批(判式换代/全局变异/配比预设)撞同一批文件(`adventure_table.gd`/`level_runner.gd`/`adventure.tres`),须确认不并行或用户明示插队 | 卡②门:迭代 14 出口 | 卡①已落籍(原估 0.5d);卡② ✅ **已全批落籍(2026-10-05,worktree curio-wordfamily 七提交 d4cde73..049aa62+master 同步 23547b5,主区 merge 见台账;出口报告=[iter15-2-curio-exit-report](design/qa/iter15-2-curio-exit-report-2026-10-05.md))**:三套词族代码层全换(feature_→curio_ 93 处/bonus_ 运行层→curio_/relic_→feat_——feat_table.gd/feats.tres/feats_engine.gd 改名);渠道白名单分离(总池-渠道子集多级缓存形=用户裁);门票入表(四参数 provisional 20%/2/1/5+拿到即开+计步保底+限购 1+节点商店共享计数);refresh 入池(B 案 heal 5→3 挤占)+shop.tres 补 heal 行+门票行;T2 裁点甲案=六存档键禁改(含任务书漏登记的 "relics" 键);charge 缺陷登记不硬补;autoplay 门票分支缺陷批内实测修复(MC timeout 形态);闸=冒烟 782/0(+10)+run_all 16 套历史首次全绿(reward_overlay 红转绿=M7 bcard 成因修复)+五探针绿+doc 三闸零新增+MC n200 只测不判(normal 0.5%/perfect 77.5%);遗留=07⑰ 目检归用户+C1 呈现批/C2 第四关批/C3 调参批/C4 存档批四移交。原估 T0-T8≈4.5d(实际一次会话);迭代 15 三卡全落籍(①352/②本批/③8944dca 前身③批+本批) | | 迭代 15 | **③秘宝代码词族对齐批(2026-10-05 用户令编入本迭代)**:设计侧已完成(消歧更名批 `430419c`+`06e94b7`,26 个设计文档「魔法道具」→「**秘宝**」,同调位机制名保留不变),本批只做**代码侧对齐**、不做二次设计。内容:`aux_*`/`AuxItem*` 词族全族换词 **358 处 / 36 文件**(重灾 `adventure_runner.gd`79 / `level_runner.gd`27 / `bonus_interact_controller.gd`19 / `battle_orchestrator.gd`18 / `config_db.gd`14 / `main.gd`13),分五组落:**A 玩家可见文案(P0,5 处)**=`battle_narrator.gd:117-118` + `bonus_interact_controller.gd:76` + `hero_info_panel_view.gd:56`(槽位标题 `UiKit.label`)+ `:178`(tooltip)· B schema 与数据表(`aux_item_table.gd`/`aux_items.tres`/`aux_items.gd` 文件名+类名+`ConfigDB` 持有变量与访问器全链跟改,**须同步 Godot `.uid`/`.tscn` + `--import` 重刷类名缓存**——迭代 14.5 实证在册坑)· C 文档链接修复(含 `architecture.md` 两处既有断债顺带清偿)· D 中文注释层(**须分色**:`魔法矢`/`魔法反噬`/`魔法族`/`魔法护甲` 属敌方伤害护甲语汇🔴不动)· E 测试文件名+内部变量。**用户三项拍板**:全族彻底改(含数据表)· **断点存档键一律保留**(`bonus_aux_carry`/`aux_detail`/`aux_cleared`/`aux_cleared_last`/`aux_items` 断点数组/`attunement_charges` 共 34 处引用一字不改,破档即进度丢失)· registry 条目键 `aux_items` 不改(数据契约键)。设计事实源=`design/gdd/systems/排雷循环/秘宝.md` v0.9,任务书=`design/research/任务书-秘宝代码词族对齐批-2026-10-05.md`(T0-T9≈5.0d,**超软盒 3 日上限·知情预挂**:T7 段末闸后 L3 呈报切点不擅切;**三档降级面 G1/G2/G3 在册**〔G3 下限=仅组 A 完成〕;5 条设计契约含 5 条 🔴 停机级〔存档兼容零破坏/数值零漂移/schema 契约面零变更/零字段更名/核心层零 await〕;代拍板白名单 5 项;**C1/C2 已裁关闭·全改保一致·待裁点 0 项**)。**撞批已消解**:② 奇物批 2026-10-05 收口落库(合并 `c571af2`),并行风险解除,本批为迭代 15 唯一在途需求;**T0 须重取基线**(判式换代批 T5 读数 750/0、② 又动数据层,§1.2 的 747 为②前旧数禁沿用)并复核事实表。**✅ 裁决(用户 2026-10-05「全改保一致」)**:C1 `"aux_item"` 域串**照改**(实测连锁面收窄——`reward.tres` 已零 aux_item 数据行,池种随迭代 11 T7 退役;16 处字面量全在代码内闭合无存档依赖;唯一连锁项=`smoke_all.gd:3932` 断言须同步)· C2 `aux_items` 一名两义**拆分**(ConfigDB 持有变量+表注册键✅改 / 断点存档键+冒烟夹具🔴禁改——**「键名禁改」与「变量名禁改」是两回事**,禁改的只是落盘字面量)。新增**组 F**(分派语汇与域串 16 处),任务卡扩为 T0-T10≈5.5d。**开工门**:✅ 已无待裁点,可直接发 T0 | 卡③门:迭代 14 出口(**裁点已全决·可开工**) | 卡①已落籍(原估 0.5d);卡② ✅ 已全批落籍(2026-10-05 merge 3c6f2c9,台账 362——c571af2 文档+数据层之上的实施段全量补完);**卡③ ✅ 已全批落籍(2026-10-05,worktree m4iter15-mibao 九提交 b4b8bb3..收口笔,主区 merge --no-ff 哈希见台账/active.md 快照行;出口报告=[iter15-3-mibao-exit-report](design/qa/iter15-3-mibao-exit-report-2026-10-05.md))**:词族实数 364 处/36 文件全换尽(例外 43+2 处=存档键引号字面量+夹具,穷举在报告 §五);闸=冒烟 755/0+run_all 14/15(唯一红=②批遗留基线红 reward_overlay,对照零新增)+行为探针四件全绿+doc 三闸/熵增闸零新增+存档键六键普查零差异+MC 按 goal 令豁免(静态零漂移证明代);渲染像素五闸屏蔽挂账 07⑮;遗留=实机目检归用户(07⑮)+reward_overlay 基线红归②批处置 | -| 迭代 16 | **UI 设计对齐批(2026-10-05 用户令:迭代 16 改编为 UI 优化需求实现,原四卡全数顺延迭代 17;美术线用户自理立规的例外面=本批只改 UI 设计代码、零美术资源改动)**:三路改进整合轴的代码侧落地——事实源=`design/research/UI预览demo三路改进整合对照-2026-10-04.md`(A 落码差异对照+OPT-A 机检+WB 变体三路整合,基线原型 v2.1)。**红线=不修改美术资源**:game/assets/art 与 artwork/ 均不动、不生新素材不重烘,只改 UI 设计代码(ui_kit 色板 token/字号档/布局纪律/对比度垫底/抖动呈现/panel_skinned 接线等)。无分歧可直接收项=对比度 7 处 FAIL 修法(血数 2.09→12.29 垫底等已复算)/站桩溢出 3.2px/4 处裸色收 ui_kit/status 图标 preload 违规/tg-* 类型色接线。**前置待裁=六分歧点**(①底色冷暖 ②棋盘格边长 32/44/45 ③字号档位 ④九宫格切片 ⑤圆角去留 ⑥图标尺寸解法,对照表 §三)+开放项(抖动范围/色板唯一来源,§五)。任务书=`design/research/任务书-UI设计对齐批-2026-10-05.md`(T0-T11≈7.25d,**超软盒 3d 预挂**,三段切分=段一 2.0d 无阻断〔T0-T4a〕/ 段二 4.0d 待裁〔T4b-T8〕/ 段三 1.0d 收口〔T9-T11〕;🔴 契约 7 条 R1-R7;无分歧收项 N1-N6 已逐处 file:line 考证;**待用户裁点 11 项**=六分歧 P1 底色冷暖/P2 棋盘格边长/P3 字号档位/P4 九宫格切片/P5 圆角去留/P6 图标尺寸解法 + 开放项 P7 色板唯一来源/P8 抖动范围/P9 §五 已决注销清单/P10 记忆态口径/P11 装饰 caption 豁免;**六分歧与开放项一律呈全备选案含淘汰依据**)。**事实校正(实查,2026-10-05)**:9 处色板漂移实测 4 已收 5 未收;`tg-*` 五族在 ui_kit 并不存在(以裸 Color8 内联于 bonus_pick_overlay/shop_overlay_view,缺第五族);panel_skinned 消费面实测 8 处+工厂 1 处;棋盘格边长=动态公式 clamp[26,46] 与 §8.1 锚点 45/36 三方互不等;手绘图标十枚 20×20 已入库,真问题转为 64×64 柜台四枚显示倍率;站桩溢出实机存在 1px 余量同型写法(standee_body.gd:476);demo 基线 md5 已再次漂移(实测 78ebbee0…)。状态=**任务书已起草(2026-10-05)+ 取向已定(2026-10-06)**:✅ P1=甲(维持暖化零改动)/ P2=丁(棋盘格边长零改动,46/45/44 不一致登记为已知偏差);✅ **其余八项取向已定**(用户采纳推荐)——**跟 demo**:P4 九宫格切片 8→16 / P7 五处色板向 demo / P10 记忆态纹理灰罩;**按条款解**:P3 字号立 FS_* 档(demo 34 处<14、54 处<16 不可跟)/ P6 图标显示档(demo 自身 0.3125× 违规)/ P8 抖动只做卡顶色带(demo 渐变+blur 违反像素纪律)/ P11 装饰 caption 12px 豁免;P5 两路同结论。**「以 demo 为准」三层优先级栈=任务书 §8.3**(①用户终裁>②冻结条款>③demo);三条结构级差异(卡片 232×352 / 商店全屏化 / 地图底栏合并)**不入本批、已登记 06 待立项**。估时 T0-T11≈**6.9d**(段一 2.15d 无阻断可发令 / 段二 3.75d / 段三 1.0d;三段同属一迭代、**只在段三末合并一次**);**拷打轮一 9 问已全部落地**(Q1 `panel_skinned` content margin clamp / Q2 不走独立样张闸改并进 T10 目检 / Q3 柜台图标统一 32px / Q4 商店补类型分族 / Q5 血数 11px 与装饰 caption 合并写一条豁免 / Q6 槽两态不新增通道 / Q7 一次合并 / Q8 已知偏差已登记 06 / Q9 demo 取值抄录表为唯一引用源) | 迭代 15 出口 | T0-T11≈7.25d(三段切分,段一可先发令) | +| 迭代 16 | **UI 设计对齐批(2026-10-05 用户令:迭代 16 改编为 UI 优化需求实现,原四卡全数顺延迭代 17;美术线用户自理立规的例外面=本批只改 UI 设计代码、零美术资源改动)**:三路改进整合轴的代码侧落地——事实源=`design/research/UI预览demo三路改进整合对照-2026-10-04.md`(A 落码差异对照+OPT-A 机检+WB 变体三路整合,基线原型 v2.1)。**红线=不修改美术资源**:game/assets/art 与 artwork/ 均不动、不生新素材不重烘,只改 UI 设计代码(ui_kit 色板 token/字号档/布局纪律/对比度垫底/抖动呈现/panel_skinned 接线等)。无分歧可直接收项=对比度 7 处 FAIL 修法(血数 2.09→12.29 垫底等已复算)/站桩溢出 3.2px/4 处裸色收 ui_kit/status 图标 preload 违规/tg-* 类型色接线。**前置待裁=六分歧点**(①底色冷暖 ②棋盘格边长 32/44/45 ③字号档位 ④九宫格切片 ⑤圆角去留 ⑥图标尺寸解法,对照表 §三)+开放项(抖动范围/色板唯一来源,§五)。任务书=`design/research/任务书-UI设计对齐批-2026-10-05.md`(T0-T11≈7.25d,**超软盒 3d 预挂**,三段切分=段一 2.0d 无阻断〔T0-T4a〕/ 段二 4.0d 待裁〔T4b-T8〕/ 段三 1.0d 收口〔T9-T11〕;🔴 契约 7 条 R1-R7;无分歧收项 N1-N6 已逐处 file:line 考证;**待用户裁点 11 项**=六分歧 P1 底色冷暖/P2 棋盘格边长/P3 字号档位/P4 九宫格切片/P5 圆角去留/P6 图标尺寸解法 + 开放项 P7 色板唯一来源/P8 抖动范围/P9 §五 已决注销清单/P10 记忆态口径/P11 装饰 caption 豁免;**六分歧与开放项一律呈全备选案含淘汰依据**)。**事实校正(实查,2026-10-05)**:9 处色板漂移实测 4 已收 5 未收;`tg-*` 五族在 ui_kit 并不存在(以裸 Color8 内联于 bonus_pick_overlay/shop_overlay_view,缺第五族);panel_skinned 消费面实测 8 处+工厂 1 处;棋盘格边长=动态公式 clamp[26,46] 与 §8.1 锚点 45/36 三方互不等;手绘图标十枚 20×20 已入库,真问题转为 64×64 柜台四枚显示倍率;站桩溢出实机存在 1px 余量同型写法(standee_body.gd:476);demo 基线 md5 已再次漂移(实测 78ebbee0…)。状态=**任务书已起草(2026-10-05)+ 取向已定(2026-10-06)**:✅ P1=甲(维持暖化零改动)/ P2=丁(棋盘格边长零改动,46/45/44 不一致登记为已知偏差);✅ **其余八项取向已定**(用户采纳推荐)——**跟 demo**:P4 九宫格切片 8→16 / P7 五处色板向 demo / P10 记忆态纹理灰罩;**按条款解**:P3 字号立 FS_* 档(demo 34 处<14、54 处<16 不可跟)/ P6 图标显示档(demo 自身 0.3125× 违规)/ P8 抖动只做卡顶色带(demo 渐变+blur 违反像素纪律)/ P11 装饰 caption 12px 豁免;P5 两路同结论。**「以 demo 为准」三层优先级栈=任务书 §8.3**(①用户终裁>②冻结条款>③demo);三条结构级差异(卡片 232×352 / 商店全屏化 / 地图底栏合并)**不入本批、已登记 06 待立项**。估时 T0-T11≈**6.9d**(段一 2.15d 无阻断可发令 / 段二 3.75d / 段三 1.0d;三段同属一迭代、**只在段三末合并一次**);**拷打轮一 9 问已全部落地**(Q1 `panel_skinned` content margin clamp / Q2 不走独立样张闸改并进 T10 目检 / Q3 柜台图标统一 32px / Q4 商店补类型分族 / Q5 血数 11px 与装饰 caption 合并写一条豁免 / Q6 槽两态不新增通道 / Q7 一次合并 / Q8 已知偏差已登记 06 / Q9 demo 取值抄录表为唯一引用源)。**✅ 已全批落籍(2026-10-06 单会话,worktree g-plan2-iter16ui 分支 iter16-ui-20261005 十二提交 85ea024..T11 收口笔,主区 merge --no-ff 哈希见 active.md 快照行;出口报告=[iter16-ui-exit-report](design/qa/iter16-ui-exit-report-2026-10-06.md))**:T0-T10 全落(T10 人闸材料包=[iter16-ui-human-gate-checklist](design/qa/iter16-ui-human-gate-checklist-2026-10-06.md)——实机目检+代拍板追认八项归用户);闸=冒烟 782/0(断言数持平基线)+run_all 16 套全绿+探针五件全绿(新增 ui_contrast_probe 11 对测点+ui_struct⑥standee 断言族入默认段)+doc 三闸/熵增零新增+MC 零跑(纯呈现批——核心/数据层 diff=0 实证)+素材零触碰;T0 实机复算三处修法改向(意图徽标垫牌/槽位字深化/RAP 零改动——demo 口径在实机反向)+N4a 裸色实数 25 处/10 文件全收 ui_kit(任务书 5 处系漏记)+字号 107 位点归档 FS_* 六档;偏差八条在出口报告§汇总;遗留=06 新登记「呈现层残余 <4.5:1 文字位」一条(名行四墨/顺位徽标/RAP 反馈——批外邻接发现) | 迭代 15 出口 | 预算 T0-T11≈6.9d(三段切分)——**实际单会话一次跑完(2026-10-06)** | | 迭代 17 | **①敌人表行集多行批(2026-10-05 用户令编入本迭代,纯功能与数值轴四卡之一)**:放开敌人表「同一(关卡序号 × 节点深度)行集恰一敌种」加载期校验(enemy_table.gd:108-112 考证在册),允许同场遭遇混编多种敌人——生成(unit_container spawn 行集受理)/编排(battle_orchestrator/narrator)/断言面全链接通 + GDD 结构冻结面修订先行(敌人系统.md:75/:263)。事实源=06「同深度第二敌种与精英/Boss 编码位」条剩余面(前半已由关卡节点地图 v1.0 消解);前置=技能池实施批已落籍(d3fa887)开工门已解。任务书=`design/research/任务书-敌人表行集多行批-2026-10-05.md`(T0-T8≈4.25d 含条件卡 T5 首行投放/3.75d 不含;🔴 契约 5 条含零内容期逐位零漂移;代拍板白名单 3 项;**待用户裁点 4 项**〔P1 混编数量语义三案/P2 行集解析双算法处置〔工作日志 312 既有待裁随批〕/P3 本批是否投首个混编行/P4 Boss 行是否放开〕——裁点裁决后 U0 开工) | 迭代 15 出口 | T0-T8≈4.25d(超软盒预挂,T4 末切分点) | | 迭代 17 | **②M4 数值批(2026-10-05 用户令编入本迭代)**:四件数值欠账合一批——①削弱档位终值(weaken 现值 −65/duration 2/refresh 考证在册;叠层改续时语义已定案,差 duration 终值+当量锚复算)②调参批数值点评(06 条目现行登记五条——任务口径「八条」与条目五条不符,任务书 §2.2 已呈报差异以条目为准)③迭代 10 奖励重构联动欠账①②(钥石产出重标 boss_keystone 首杀 3/3/3·复杀 2/2/3 provisional + 通关率带重扫〔通关回血 20%+AP 件首轮 +1〕)④元进度定价剩余面(forge base 20/比 150 考证在册——06 条目文本「base 10」滞后于 2026-09-22 对齿批已呈报;Boss 两档终值)。读数义务随批=迭代 14 两件后置复算(T6 MC 四带复算+T7 技能池节奏重测,均挂 07);顺路修复 damage_probe A1 改前既有红灯(判式换代批出口报告 §四.7 在册)。**硬约束:一切 MC/verifier 跑批发起前须用户批准;调参联动禁独立调参网络(β 带 [1.2,2.5] 逐 u 检算)**。任务书=`design/research/任务书-M4数值批-2026-10-05.md`(T0-T8≈6.0d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**待用户裁点 4 项**〔P1 削弱终值三案推算后裁/P2 点评不对称裁决方向/P3 钥石产出终值/P4 工坊直购价立否〕) | 迭代 15 出口 | T0-T8≈6.0d(超软盒预挂,段一 T0-T4≈4.25d/段二 T5-T8≈2.0d) | | 迭代 17 | **③暂停层只读入口批(2026-10-05 用户令编入本迭代)**:新增局内暂停层,承载钥石余额与解锁态(营地三柜台进度)只读查看——事实源=06「解锁界面与钥石呈现的交互形态(残余:暂停层只读入口)」条。考证在册:现行无暂停层;模态栈/设置面/调试浮窗三先例齐;UiKit 公共件(modal_shell/bcard/verb_button/徽章形制)与色板 token 单点现成;MetaProgression 只读访问器面齐全;战斗屏 GP/钥石已迁出=局内零查看入口正是本批由来。**美术红线:复用现行公共件与色板,零新素材零新色值(2026-10-05 用户立规)**。任务书=`design/research/任务书-暂停层只读入口批-2026-10-05.md`(T0-T5≈3.0d;🔴 契约 5 条含公共件单点/模态登记纪律;**待用户裁点 4 项**〔P1 入口位置四案荐丁/P2 与既有弹窗层关系三案荐甲/P3 展示范围三案荐甲/P4 减动效联动两案荐甲〕) | 迭代 15 出口 | T0-T5≈3.0d(贴软盒,T2 末切分点) |