merge: 迭代26 UI交互与观感批全量入库(七提交, worktree g-plan2-iter26-ui)

This commit is contained in:
DKChan committed 2026-10-14 06:34:41 +08:00
commit c8c3db1052
17 files changed
+442 -48

No files matched your search

+19 -6
View File
@@ -8,7 +8,7 @@
**归属**:呈现层表现批(纯工程;素材已有按钮常态与按下两张图) **归属**:呈现层表现批(纯工程;素材已有按钮常态与按下两张图)
**状态**:待办(**Alpha 阶段需完成**)——同第一层其余两条。**一个待拍板点**:悬停态怎么做还没定,两条备选——甲=重产一张悬停态贴图(多一份素材、控制力最好);乙=在常态图上做统一的轻微提亮(零素材、但要确认提亮后的对比度是否仍然满足 §7.2 的 4.5:1 硬指标)。此点需在需求卡片阶段由用户裁决,本批不自作主张。 **状态**:**已完成(2026-10-14,迭代 26 T1「UI 交互与观感批」收口)**——五态矩阵补齐:普通钮悬停=常态图+modulate 1.06 提亮(乙案落地,代拍板1)、禁用=本族底+α0.45 幽灵化(甲案,代拍板2,取代旧「disabled=按压图」错配)、焦点=INK 2px 内缩 1px 环(甲案,代拍板3,逐实例 override、主题层零新增)、危险钮补本族 pressed(深红 darkened(0.18) 深档)+disabled+focus;冒烟 V1/V2 断言 35 条在闸(四工厂逐只五态非空/hover≠normal/disabled≠pressed/危险钮非石纹/焦点环参数锚定+主题双红线维持)。原待拍板点(悬停甲/乙)已由 grilling 第一轮②裁乙案。键盘导航批量面归「棋盘战斗键盘/手柄输入」Beta 条连带裁决点③(本批焦点态是其前置件,已交付)
#### 全局纹理过滤未设为邻近采样——像素资源非整数倍缩放会发糊(2026-10-13 登记,UI 美化三层诊断 · 第一层) #### 全局纹理过滤未设为邻近采样——像素资源非整数倍缩放会发糊(2026-10-13 登记,UI 美化三层诊断 · 第一层)
@@ -16,7 +16,7 @@
**归属**:呈现层表现批(一行渲染设置) **归属**:呈现层表现批(一行渲染设置)
**状态**:待办(**Alpha 阶段需完成**)——**风险提示**:改成全局邻近采样前须确认没有资源依赖线性插值(若有,这些资源的观感会跟着变),建议改完配一次实机目检确认,避免为了修一处把另一处弄坏。 **状态**:**已完成(2026-10-14,迭代 26 T2 收口)**——`project.godot` `[rendering]` 增 `textures/canvas_textures/default_texture_filter=0`(Nearest);T0 翻转面全枚举闭合:无显式 filter 的纹理节点仅 3 处(ui_kit vignette/beams/gradient_base)已挂显式 LINEAR 白名单,九宫格 UI 皮与主题石纹样式盒翻 Nearest=意图面,.tscn 零纹理节点;冒烟 V3 断言 6 条在闸。原风险提示(改前须确认无资源依赖线性插值)已由枚举+白名单+实机目检项(07 ㉕)覆盖
#### UI 贴图重构批——营地与元进度件仍是程序化占位(原登记在美术侧,2026-10-13 由 UI 美化三层诊断转立本清单专条) #### UI 贴图重构批——营地与元进度件仍是程序化占位(原登记在美术侧,2026-10-13 由 UI 美化三层诊断转立本清单专条)
@@ -48,7 +48,7 @@
**归属**:呈现层表现批(光柱纯改代码;九宫格切片需连带核对素材尺寸能否撑住新切片值,可能要重出素材,属美术线连带面) **归属**:呈现层表现批(光柱纯改代码;九宫格切片需连带核对素材尺寸能否撑住新切片值,可能要重出素材,属美术线连带面)
**状态**:待办(**Alpha 阶段需完成**) **状态**:**半完成(2026-10-14,迭代 26 T4 收口)**——①光柱硬边**已修**:带内 alpha 0→0.05→0 三角过渡+纵向衰减上亮下暗(连续 alpha 方案,grilling Q7 裁;纹理 filter 挂 LINEAR 白名单);冒烟 T4 结构断言 3 条在闸。②九宫格切片错位**存续**(未动)——须先核素材尺寸能否撑住新切片值(border_stone 48×48 按 12 切片、panel_stone 48×48 按 16 切片,铺到四百多像素宽面板的拉伸接缝),可能要重出素材=美术线连带面,归后续贴图批次
#### UI 元素细节修——滑轨填充不可辨、图标垫深块、留白失衡、开发件外泄(2026-10-13 登记,UI 美化三层诊断 · 第三层) #### UI 元素细节修——滑轨填充不可辨、图标垫深块、留白失衡、开发件外泄(2026-10-13 登记,UI 美化三层诊断 · 第三层)
@@ -56,7 +56,7 @@
**归属**:呈现层表现批 **归属**:呈现层表现批
**状态**:待办(**Alpha 阶段需完成**)——①②③是观感改动,④只需关闭或移进调试浮窗,成本很低,可以顺手带上。**①已销号**(2026-10-13 迭代 25「UI 全局主题批」收口——滑轨词条迁全局主题时两段对比度重配:已填充段 BG_ROOT #3A2E22 对槽暖石 #B8A582 ≈5.5:1,「拖到中点一眼可辨」;实机目检随 07 登记项归用户。另:代码面两段色实为暖石/深棕两值,与诊断「同一深棕」描述不符,已随批呈报)。余②③④保留待立项。 **状态**:**已完成(2026-10-14,迭代 26 T5/T5b 收口)**——②③④全部落地:②图标垫深块(明度差降档:BCard 图标槽换 SLOT_BACKDROP_SOFT #806A4E 柔和档,对米色卡面 3.69:1〔旧 8.53:1〕,白图标 5.14:1 ≥3:1 硬约束;范围按实查订正=仅三选一 BCard,商店卡实为纯文字行卡无图标);③留白失衡(商店卡片区 ALIGNMENT_CENTER 垂直居中;营地四栏等高=三 holder 统一 min 高 336+四面板纵向 FILL+锁文居中;范围按实查订正=仅商店+营地,三选一已居中);④诊断转储钮退出玩家画面(迁调试浮窗,grilling Q8 裁甲,dump_diagnosis 卡死取证保留)。①滑轨填充已随迭代 25 销号。本条四项全部完成,整条销号
#### 需求卡片:UI 交互与观感批(2026-10-13 成文,待裁) #### 需求卡片:UI 交互与观感批(2026-10-13 成文,待裁)
@@ -64,7 +64,20 @@
**指针**:`design/research/需求卡片-UI交互与观感批-2026-10-13.md` **指针**:`design/research/需求卡片-UI交互与观感批-2026-10-13.md`
**状态**:**已编入**(2026-10-14 用户令入迭代 26 卡①;卡片 v1.2 成立、零待裁点;开工门=U0〔用户新会话 /iter 26 四检发令〕)——本批落地后上方第一层第二/三条、第三层四条(<4.5:1/氛围层光柱半/元素细节余项)按卡片 §5 同步面销号或改写。 **状态**:**已收口(2026-10-14,迭代 26 总收口——单会话 /goal+iter U0 全量交付)**——六项全落地(T0 基线+枚举/T1 五态/T2 Nearest+白名单/T3 换墨/T4 光柱/T5 细节/T5b 诊断钮),冒烟 987→1055/0(+68 断言)+run_all 25 套+probe click/full+render_gate golden 处置在册+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现)。上方第一层第二/三条、第三层四条(<4.5:1/氛围层光柱半/元素细节余项)按卡片 §5 同步面已销号或改写;实现报告=design/qa/iter26-实现报告-2026-10-14.md;反哺点四条见下条待用户逐点裁决
#### 迭代 26 UI 交互与观感批——GDD 反哺点四条(2026-10-14 随批登记,待用户逐点裁决另批落文)
**来源**:迭代 26 实现报告 §五(design/qa/iter26-实现报告-2026-10-14.md)——实现与 [美术圣经](../art/art-bible.md) 的差异/缺口,按 2026-10-10 文档同步闸 v2 立规:设计权威文档不随批直改,逐点待用户裁决后另批落文。
- **反哺点①(§7 按钮五态/焦点态规格缺项)**:art-bible §7 无按钮五态(悬停/按下/禁用/键盘焦点)与焦点环的规格条款,本批实现(modulate 1.06 提亮/α0.45 幽灵化/INK 2px 内缩 1px 环)目前是**临时权威**——是否立条款、值是否冻结待裁。
- **反哺点②(§7/§8.2 平滑渐变件白名单无例外条款)**:全局 Nearest 下 vignette/gradient_base/beams 三件程序化平滑渐变挂显式 LINEAR,属对「像素风全局邻近」的有意豁免;art-bible 无相应例外条款(§8.2 已有状态图标抗锯齿例外先例可援)——豁免清单是否入册待裁。
- **反哺点③(§4.1 新色 token 语义岗登记)**:本批新立三 token——GOLD_BRIGHT #E0B860(金族亮档)/HERO_BLUE_BRIGHT #7EBAF0(小人蓝亮档)/SLOT_BACKDROP_SOFT #806A4E(图标槽柔和档),§4.1 语义岗未登记——语义命名与值是否转正待裁。
- **反哺点④(氛围层风格一致性)**:vignette/gradient_base/beams 保平滑连续 alpha,与卡顶类型色带 DitherBand 的 Bayer 有序抖动派并存——grilling Q5 已裁「保平滑」,两派不一致性留整屏样张批统一裁决(样张批未开工,06 在册)。
**归属**:[美术圣经](../art/art-bible.md) §7/§4.1/§8.2(裁决后另批落文)
**状态**:待用户逐点裁决(登记不阻塞——2026-10-12 真人检测立规同款口径:裁决时点由用户控制)
#### 旧行为 MC 行为锚全数作废——重锚归数值批(2026-10-06 登记) #### 旧行为 MC 行为锚全数作废——重锚归数值批(2026-10-06 登记)
@@ -410,7 +423,7 @@
**归属**:呈现优化后续批(或 UI 设计对齐批第二轮);开工 = 用户点名 **归属**:呈现优化后续批(或 UI 设计对齐批第二轮);开工 = 用户点名
**状态**:待办(**Alpha 阶段需完成**——2026-10-13 用户令随「UI 美化三层诊断」登记:本条属第三层「观感提升」,是三层里唯一能被机器检查直接判红的一组,验收不需要人眼比对;是否单独排批待用户确认)。2026-10-06 曾编入迭代 18 卡②,2026-10-07 用户令撤回——探讨阶段未排批;同日短暂编入迭代 19,随迭代 19 清空一并撤出。 **状态**:**已完成(2026-10-14,迭代 26 T3 收口)**——三处全部换墨达标:敌顺位徽标①②③与重甲徽标换 GOLD_BRIGHT #E0B860(对舞台底 6.47:1)、魔法护甲徽标换 HERO_BLUE_BRIGHT #7EBAF0(5.88:1)、RAP 反馈行换 STONE_DEEP(对 PANEL_DATA 5.98:1);GOLD_DEEP/HERO_BLUE 常量本尊不动(语义岗在役),新 token 三枚落 ui_kit 单点;冒烟 V4 断言 9 条机检锚定(≥4.5:1+消费点原位+旧墨清零)。站桩名行与轻甲档原已过,不动
#### 第二 / 三关棋盘观感——亮度与对比度(2026-10-13 用户裁定,Alpha 阶段需完成) #### 第二 / 三关棋盘观感——亮度与对比度(2026-10-13 用户裁定,Alpha 阶段需完成)
+10
View File
@@ -234,6 +234,15 @@
- **预盖件无实役(登记注记)**:CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu 游戏零使用,本批仅预盖(冒烟 V3 已有运行时证词)——无需目检,备案待未来批次启用时复查。 - **预盖件无实役(登记注记)**:CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu 游戏零使用,本批仅预盖(冒烟 V3 已有运行时证词)——无需目检,备案待未来批次启用时复查。
- 验证方式:用户实机目检(登记不阻塞——2026-10-12 真人检测立规;能力验证半已由自动化闸覆盖=冒烟 V1-V6)。 - 验证方式:用户实机目检(登记不阻塞——2026-10-12 真人检测立规;能力验证半已由自动化闸覆盖=冒烟 V1-V6)。
### ㉕ UI 交互与观感批逐屏巡检(迭代 26 UI 交互与观感批随批登记——2026-10-14)
- **按钮五态反馈**:标题屏/营地/商店/设置/三选一逐屏——鼠标悬停(石纹钮应有可感提亮;主钮/危险钮承现行提亮档)、按下(本族下沉:石纹按压图/烛光黄深档/深红深档)、禁用(余额不足的商店购买钮=本族底幽灵化,非旧「灰头灰脑按不下去」观感)三种反馈均应可感。
- **键盘焦点环**:Tab 遍历各屏按钮,焦点环(INK 2px 内缩 1px)应可见不糊、不遮钮底字;三类钮底(石纹/烛光黄/深红)上环的可辨性实比。
- **全局 Nearest 巡检**:立绘/瓦片/格面/图标/九宫格 UI 皮无新增糊感(应更 crisp);暗角与地图渐变无像素块(LINEAR 白名单生效判据);标题屏斜光带无硬边梯形、有横向过渡与上亮下暗衰减。
- **布局均衡**:商店卡片区不堆上半(垂直居中);营地四栏视觉等高(含锻造/秘宝匣锁定态与图鉴栏)。
- **诊断钮清零**:玩家画面(主菜单及各屏左下角)无「诊断转储」钮;转储入口仅在调试浮窗内可达。
- 验证方式:用户实机目检(登记不阻塞——2026-10-12 真人检测立规;能力验证半已由自动化闸覆盖=冒烟 V1-V6+T4 结构断言)。
## 验收读数重测义务(履行留痕 + 现行义务) ## 验收读数重测义务(履行留痕 + 现行义务)
**已履行**(按序换代,旧读数各随其批作废留痕不入本单):①验收读数重测批(2026-09-19——Boss 单独出列/承伤带/通关率基线全量重测,硬化翻倍期·乏力死效果期·充能期旧读数作废);②迭代 5 基线重测(统一随机流后 MC+verifier 双窗);③**数值修复批新尺重测(2026-10-01)**——模拟档位重构后全量重测,新锚 `sim-data/runsum_numfix_final_n200_20261001.jsonl`,全旧带作废只测不判(numfix 报告(已退役,git 历史可查));④**迭代 10 奖励重构批重锚(2026-10-01)**——四代锚 77000/78000/79000/80000(改前/重构后/共享池后/掷定前置后,各 400 局),普通 L1 41.8%/L2 10.2% 带内(迭代10通关率读数(已退役,git 历史可查));⑤**T19 真人标定局收口(2026-10-03 用户裁)**——有效局 2(1 通关 1 死于 L3 首战,T19真人试玩读数(已退役,git 历史可查)),用户裁定**佐证级收口不再补局**;k 预期带同日立(**正常 >0.5、预警 <0.3**),字段随 81000 重锚入库后补算终值。 **已履行**(按序换代,旧读数各随其批作废留痕不入本单):①验收读数重测批(2026-09-19——Boss 单独出列/承伤带/通关率基线全量重测,硬化翻倍期·乏力死效果期·充能期旧读数作废);②迭代 5 基线重测(统一随机流后 MC+verifier 双窗);③**数值修复批新尺重测(2026-10-01)**——模拟档位重构后全量重测,新锚 `sim-data/runsum_numfix_final_n200_20261001.jsonl`,全旧带作废只测不判(numfix 报告(已退役,git 历史可查));④**迭代 10 奖励重构批重锚(2026-10-01)**——四代锚 77000/78000/79000/80000(改前/重构后/共享池后/掷定前置后,各 400 局),普通 L1 41.8%/L2 10.2% 带内(迭代10通关率读数(已退役,git 历史可查));⑤**T19 真人标定局收口(2026-10-03 用户裁)**——有效局 2(1 通关 1 死于 L3 首战,T19真人试玩读数(已退役,git 历史可查)),用户裁定**佐证级收口不再补局**;k 预期带同日立(**正常 >0.5、预警 <0.3**),字段随 81000 重锚入库后补算终值。
@@ -254,3 +263,4 @@
| v0.6 | 2026-10-12 | 新增 ㉒ 锻造工坊工作间形态与购买交互目检节(迭代 23 锻造工坊实装批随批登记——V13 人闸观测项:门与形态/购买/解锁双通道/选中与锁死/注入抽查) | | v0.6 | 2026-10-12 | 新增 ㉒ 锻造工坊工作间形态与购买交互目检节(迭代 23 锻造工坊实装批随批登记——V13 人闸观测项:门与形态/购买/解锁双通道/选中与锁死/注入抽查) |
| v0.7 | 2026-10-13 | 新增 ㉓ 敌人表内容修批三观测目检节(迭代 24 卡①随批登记:新招可见性/甲型体感/第一关节奏——登记不阻塞按 2026-10-12 真人检测立规) | | v0.7 | 2026-10-13 | 新增 ㉓ 敌人表内容修批三观测目检节(迭代 24 卡①随批登记:新招可见性/甲型体感/第一关节奏——登记不阻塞按 2026-10-12 真人检测立规) |
| v0.8 | 2026-10-13 | 新增 ㉔ UI 全局主题批全屏巡检目检节(迭代 25 卡①随批登记:引擎默认灰清零巡检/音量滑轨两段可辨/专项观察点二(滑轨柄抢焦点·滚动条槽可见性)/预盖件无实役注记——登记不阻塞;能力验证半=冒烟 V1-V6) | | v0.8 | 2026-10-13 | 新增 ㉔ UI 全局主题批全屏巡检目检节(迭代 25 卡①随批登记:引擎默认灰清零巡检/音量滑轨两段可辨/专项观察点二(滑轨柄抢焦点·滚动条槽可见性)/预盖件无实役注记——登记不阻塞;能力验证半=冒烟 V1-V6) |
| v0.9 | 2026-10-14 | 新增 ㉕ UI 交互与观感批逐屏巡检目检节(迭代 26 卡①随批登记:按钮五态反馈/键盘焦点环/全局 Nearest 巡检(含暗角与渐变白名单判据)/布局均衡(商店居中+营地四栏等高)/诊断钮清零——登记不阻塞;能力验证半=冒烟 V1-V6+T4 结构断言) |
+5 -4
View File
@@ -115,7 +115,7 @@
| 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 | | 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
| 调试浮窗 | —— | 在役 | | 调试浮窗 | —— | 在役 |
| UI 全局主题资源(引擎原生控件接管皮肤) | —— | 在役(迭代 25 · 2026-10-13 入库:game/assets/theme/main_theme.tres 挂 gui/theme/custom) | | UI 全局主题资源(引擎原生控件接管皮肤) | —— | 在役(迭代 25 · 2026-10-13 入库:game/assets/theme/main_theme.tres 挂 gui/theme/custom) |
| UI 按钮状态矩阵(悬停 / 按下 / 禁用 / 键盘焦点补齐) | [06-待办清单](06-待办清单.md) | 待做 | | UI 按钮状态矩阵(悬停 / 按下 / 禁用 / 键盘焦点补齐) | [06-待办清单](06-待办清单.md) | 在役(迭代 26 入库:五态矩阵逐实例 override 补齐——悬停 modulate 提亮/禁用 α0.45 幽灵化/焦点 INK 2px 内缩 1px 环/危险钮本族按压态;键盘导航批量面归 Beta「棋盘战斗键盘/手柄输入」条连带点③) |
--- ---
@@ -153,12 +153,12 @@
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 | | 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
| 站桩帧动画 | [06-待办清单](06-待办清单.md) | 待裁 | | 站桩帧动画 | [06-待办清单](06-待办清单.md) | 待裁 |
| 素材升档重产 | [06-待办清单](06-待办清单.md) | 待裁 | | 素材升档重产 | [06-待办清单](06-待办清单.md) | 待裁 |
| 全局纹理过滤设为邻近采样 | [06-待办清单](06-待办清单.md) | 待做 | | 全局纹理过滤设为邻近采样 | [06-待办清单](06-待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
| UI 贴图重构批(营地与元进度件出终稿) | [美术资产清单](../art/art-assets-checklist.md) | 待做 | | UI 贴图重构批(营地与元进度件出终稿) | [美术资产清单](../art/art-assets-checklist.md) | 待做 |
| UI 字体补完(拉丁像素字专件 + 字重两档) | [美术圣经](../art/art-bible.md) §7.4 | 待做 | | UI 字体补完(拉丁像素字专件 + 字重两档) | [美术圣经](../art/art-bible.md) §7.4 | 待做 |
| 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 待做 | | 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 待做 |
| UI 氛围层与九宫格切片观感修 | [06-待办清单](06-待办清单.md) | 待做 | | UI 氛围层与九宫格切片观感修 | [06-待办清单](06-待办清单.md) | 部分在役(迭代 26 · 2026-10-14:光柱硬边半已修=连续 alpha 渐变;九宫格切片错位半未结——待素材尺寸核对,属美术线连带面) |
| UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [06-待办清单](06-待办清单.md) | 待做(①滑轨填充已销号=迭代 25 全局主题批两段对比度重配;余②③④) | | UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [06-待办清单](06-待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:①滑轨填充随迭代 25 销号;余②图标垫块明度差降档/③商店+营地布局修/④诊断钮迁调试浮窗 全落地) |
--- ---
@@ -223,3 +223,4 @@
| v1.1 | 2026-10-13 | **界面美化三层诊断入 Alpha 标准(用户令)**:用户同日提出界面美化需求并要求先作现状分析,随后下令「把分析出的三层全部作为独立待办事项登记、且一律列为 Alpha 阶段必须完成」。据此新增八行——「三 · 界面」表两行(UI 全局主题资源、UI 按钮状态矩阵),「五 · 表现」表六行(全局纹理过滤、UI 贴图重构批、UI 字体补完、战斗一屏样张、UI 氛围层与九宫格切片观感修、UI 元素细节修)。八行的登记事实源统一为 [06-待办清单](06-待办清单.md) 同批新增的八条专条;其中「UI 贴图重构批」「UI 字体补完」「战斗一屏样张」三条原先只登记在美术侧的资产清单与素材状态清单里,本次转立本清单以免两处各写一份内容。用户同时指定**先动第一层**,即主题资源 / 按钮状态矩阵 / 全局纹理过滤三项(均属纯工程补齐、不依赖美术素材)。本次改动未触碰既有的未决项八项与「六 · Alpha 不含」清单 | | v1.1 | 2026-10-13 | **界面美化三层诊断入 Alpha 标准(用户令)**:用户同日提出界面美化需求并要求先作现状分析,随后下令「把分析出的三层全部作为独立待办事项登记、且一律列为 Alpha 阶段必须完成」。据此新增八行——「三 · 界面」表两行(UI 全局主题资源、UI 按钮状态矩阵),「五 · 表现」表六行(全局纹理过滤、UI 贴图重构批、UI 字体补完、战斗一屏样张、UI 氛围层与九宫格切片观感修、UI 元素细节修)。八行的登记事实源统一为 [06-待办清单](06-待办清单.md) 同批新增的八条专条;其中「UI 贴图重构批」「UI 字体补完」「战斗一屏样张」三条原先只登记在美术侧的资产清单与素材状态清单里,本次转立本清单以免两处各写一份内容。用户同时指定**先动第一层**,即主题资源 / 按钮状态矩阵 / 全局纹理过滤三项(均属纯工程补齐、不依赖美术素材)。本次改动未触碰既有的未决项八项与「六 · Alpha 不含」清单 |
| v1.2 | 2026-10-13 | **敌种池行注摘除(迭代 24 卡①机械面随批)**:「二 · 内容量」敌种池行的「第一关遭遇表数值待修」注摘除——该异常已随迭代 24 N1 修复((1,2) 降档 hp 22/ac 2,06 对应条已销号),本行回归「在役」净态;条目集合零增删,未决项与「六 · Alpha 不含」零触碰 | | v1.2 | 2026-10-13 | **敌种池行注摘除(迭代 24 卡①机械面随批)**:「二 · 内容量」敌种池行的「第一关遭遇表数值待修」注摘除——该异常已随迭代 24 N1 修复((1,2) 降档 hp 22/ac 2,06 对应条已销号),本行回归「在役」净态;条目集合零增删,未决项与「六 · Alpha 不含」零触碰 |
| v1.3 | 2026-10-13 | **UI 全局主题批收口回填(迭代 25 卡①机械面随批)**:「三 · 界面」表「UI 全局主题资源(引擎原生控件接管皮肤)」行 待做→在役(主题资源已入库:game/assets/theme/main_theme.tres 挂 project.godot gui/theme/custom,06 对应条销号);「五 · 表现」表「UI 元素细节修」行状态注记①销号(滑轨两段难辨已随主题批重配=已填充段 BG_ROOT 对暖石 ≈5.5:1,余②③④保留)。「五 · 表现」表余零改动——逐行核对六条 06 指向行中仅「UI 元素细节修」事实变化,其余(棋盘观感/站桩帧动画/素材升档重产/全局纹理过滤/UI 氛围层)本批零触碰;条目集合零增删,未决项与「六 · Alpha 不含」零触碰 | | v1.3 | 2026-10-13 | **UI 全局主题批收口回填(迭代 25 卡①机械面随批)**:「三 · 界面」表「UI 全局主题资源(引擎原生控件接管皮肤)」行 待做→在役(主题资源已入库:game/assets/theme/main_theme.tres 挂 project.godot gui/theme/custom,06 对应条销号);「五 · 表现」表「UI 元素细节修」行状态注记①销号(滑轨两段难辨已随主题批重配=已填充段 BG_ROOT 对暖石 ≈5.5:1,余②③④保留)。「五 · 表现」表余零改动——逐行核对六条 06 指向行中仅「UI 元素细节修」事实变化,其余(棋盘观感/站桩帧动画/素材升档重产/全局纹理过滤/UI 氛围层)本批零触碰;条目集合零增删,未决项与「六 · Alpha 不含」零触碰 |
| v1.4 | 2026-10-14 | **UI 交互与观感批收口回填(迭代 26 卡①机械面随批)**:「三 · 界面」表「UI 按钮状态矩阵」行 待做→在役(五态矩阵补齐);「五 · 表现」表三行——「全局纹理过滤设为邻近采样」待做→在役、「UI 氛围层与九宫格切片观感修」待做→部分在役(光柱半已修,九宫格半未结注明)、「UI 元素细节修」待做(余②③④)→在役(②③④全落地);06 对应四条销号或改写+反哺点四条新条登记(待用户裁决另批落文);条目集合零增删,未决项与「六 · Alpha 不含」零触碰 |
+112
View File
@@ -0,0 +1,112 @@
# 迭代 26 实现报告——UI 交互与观感批(按钮五态矩阵 · 全局纹理过滤 · 观感四件)
- 日期:2026-10-14(单会话 /goal+iter U0 开工令交付)
- 需求卡片:`design/research/需求卡片-UI交互与观感批-2026-10-13.md` v1.2(零待裁点,开工门=U0)
- worktree:`g-plan2-iter26-ui`(分支 `iter26-ui-20261014`,基点 master 04ec217)
- 基线复读(主区 T0):冒烟 987/0 + run_all 25 套 + probe --click 全绿残留 0
- 批末闸:冒烟 **1055/0**(基线 987 + 本批 68 断言)+ run_all 25 套 + probe click/full + render_gate golden 0.00% + doc 三闸/熵增对基线零新增(详见 §三)
## 一、交付总览
| 卡 | 内容 | 状态 |
|---|---|---|
| T0 | 基线与枚举复核:§2 全部 file:line 开工复核(20+ 处全符);纹理过滤翻转面全枚举(显式 filter 13 处/无显式 3 处=白名单对象/.tscn 零纹理节点);按钮消费点枚举(四工厂 49 处调用全闭合);卡片 §2.2 枚举漏项勘误(12→13) | ✅ |
| T1 | 按钮五态矩阵:`ui_kit.gd` 三工厂五态统一管线(悬停=乙案 modulate 1.06 提亮/禁用=甲案本族底+α0.45 幽灵化/焦点=甲案 INK 2px 内缩 1px 环/危险钮补本族 pressed 深档);逐实例 override,主题层零新增 | ✅ |
| T2 | 全局纹理过滤:`project.godot` `default_texture_filter=0`(Nearest)+ vignette/gradient_base/beams 三件显式 LINEAR 白名单 | ✅ |
| T3 | <4.5:1 换墨:敌顺位徽标+重甲徽标换 GOLD_BRIGHT、魔法护甲徽标换 HERO_BLUE_BRIGHT、RAP 反馈行换 STONE_DEEP;机检断言锚定 | ✅ |
| T4 | 光柱连续 alpha:beams_rect 带内 0→0.05→0 三角过渡+纵向衰减上亮下暗(Q7 裁) | ✅ |
| T5 | 元素细节余②③:BCard 图标槽明度差降档(SLOT_BACKDROP_SOFT 柔和档);商店卡片区垂直居中;营地四栏等高(holder min 336+面板 FILL+锁文居中) | ✅ |
| T5b | 诊断转储钮退役:main.gd 卸载点删除+build_diag_button 工厂退役+转储入口迁调试浮窗(Q8 裁甲,dump_diagnosis 保留) | ✅ |
| T6 | 文档同步闸与全闸:06 五处销号/改写+反哺点新条;08 升 v1.4;07 ㉕ 登记;roadmap 行换代;批末重闸全绿;golden 0.00% 登记即结 | ✅ |
**契约遵守**:🔴 主题层零新增词条(冒烟双红线原样维持绿)· 🔴 零新美术素材(悬停=modulate 提亮,全部改动用既有贴图/程序化生成)· 🔴 棋盘战斗逻辑与棋盘几何零触碰(board_view/board_world 零改动)· 🔴 对比度硬指标(换墨三处 6.47/5.88/5.98:1,图标槽白图标 5.14:1 ≥3:1,机检锚定)· 🔴 旧实现同批清理(诊断钮卸载点真删、disabled=pressed 错配修正、悬停=常态图退役)。
## 二、落位明细
### T1 按钮五态矩阵(ui_kit.gd,+冒烟 35 断言)
- `_apply_button_skin` 五态统一管线:normal=button_stone 九宫格;**hover=常态图+modulate Color(1.06,1.06,1.06) 提亮**(乙案,与 primary_button 现行 `CANDLE.lightened(0.06)` 同纪律,零素材);pressed=button_stone_pressed;**disabled=本族底+modulate α0.45 幽灵化**(甲案,取代旧「disabled=按压图」错配);**focus=INK 2px 内缩 1px 环**(甲案,StyleBoxFlat 无底+负 expand margin 实现内缩,引擎 focus 样式盒叠加绘制不遮钮底)。
- `primary_button`:补 disabled(烛光黄族 α0.45)+focus 环+font_disabled_color(本族墨 α0.45);pressed/hover 承现行不动。
- `danger_button`:补本族 pressed(深红 `Color8(180,78,54).darkened(0.18)` 深档,旧承石纹按压图错配退役)+disabled 幽灵化+focus 环+font_focus/disabled。
- 新常量单点:`BUTTON_HOVER_LIFT`/`BUTTON_GHOST_ALPHA`/`BUTTON_FOCUS_RING_W`/`BUTTON_FOCUS_RING_INSET`+`_focus_ring_sb()` 工厂。
### T2 全局纹理过滤(project.godot + ui_kit.gd,+冒烟 6 断言)
- `[rendering]` 增 `textures/canvas_textures/default_texture_filter=0`。T0 枚举闭合:翻转面=九宫格 UI 皮(button_stone/panel_stone/border_stone)+主题 OptionButton 石纹样式盒与滑轨/勾选/箭头图标(全部像素风 UI 件,crisp 即意图);**无显式 filter 节点仅 3 处**(vignette/beams/gradient_base)挂显式 LINEAR 白名单;既有脚影/状态图标 LINEAR 不动。
### T3 换墨(ui_kit.gd 立 token + standee_body.gd/ap_bar_view.gd,+冒烟 9 断言)
- 新 token 两枚:`GOLD_BRIGHT` #E0B860(值=收益金 e0b860 同门,对舞台底 6.47:1)/ `HERO_BLUE_BRIGHT` #7EBAF0(5.88:1);GOLD_DEEP/HERO_BLUE 常量本尊不动(standee:199 意图判据等语义岗在役)。
- 顺位徽标①②③(13px 行原位)/重甲徽标/魔法护甲徽标换墨;RAP 反馈行 STONE_FAINT→STONE_DEEP(5.98:1,旧 2.9:1 越带)。
### T4 光柱(ui_kit.gd beams_rect,+冒烟 3 断言)
- 带内 alpha 0→0.05→0 三角过渡(带域 d∈[240,340) 中分)+纵向衰减 `v_fall=1-y/560`;连续 alpha(Q7 裁,与暗角/地图渐变保平滑同血统);filter=LINEAR 白名单随 T2 落。结构断言:带心峰值≈0.05(按 8bit 截断量化校验)/连续过渡像素 41373 个/上半亮度>下半 2 倍。
### T5 元素细节(ui_kit.gd/shop/camp,+冒烟 8 断言)
- ②`SLOT_BACKDROP_SOFT` #806A4E 柔和档(对米色卡面 3.69:1,旧深档 8.53:1;白图标 5.14:1 ≥3:1 硬约束);仅 BCard 图标槽换档,B 区状态槽仍用深档(诊断订正③范围)。
- ③商店 `_cards_box` ALIGNMENT_CENTER(三选一同款形制);营地四栏等高=forge/ws/atlas 三 holder 统一 min 高 336(与树/秘宝匣 scroll 对齐,锁定态仅锁文也撑栏高)+四面板纵向 SIZE_FILL 同步拉伸+三处锁文 SHRINK_CENTER。
### T5b 诊断钮退役(main/ui_assembler/debug_overlay + ui_tune_probe,+冒烟 7 断言)
- main.gd 卸载点(build_diag_button 挂载+连接)删除;`build_diag_button` 工厂退役;连接随迁=`debug_overlay.diagnose_requested`→`_on_diagnose_pressed`(dump_diagnosis 卡死取证功能保留)。
- debug_overlay 新增 `diagnose_requested` 信号+区块⑤「诊断转储·转储」钮(`_emit_diagnose_requested` 外发,纯视图边界)。
- 探针同批入册:ui_tune_probe 只读巡检白名单+`_emit_diagnose_requested`、连接数 10→11(七钮);confirm_dialog/main 树序注释订正。
## 三、批末重闸结果
| 闸 | 结果 |
|---|---|
| 冒烟(run_smoke 三闸) | **1055 项检查 0 项失败**(基线 987 + 68 新断言:T1 35/T2 6/T3 9/T4 3/T5 8/T5b 7) |
| run_all 单元全套 | 25 套全绿 |
| probe_gate --click | 全绿,残留 Godot=0 |
| probe_gate --full | 全绿(四探针收编段;ui_tune_probe 只读巡检 11 连接入册生效) |
| render_gate | **golden 0.00%**(三屏逐像素零漂移)+ shot_checker A-D 全过;战斗屏 draw_calls=191(基线 270/目标 <200,诊断钮退役+皮肤管线收敛的附带收益) |
| doc 三闸(gdd_lint/doc_link/doc_term --strict) | 对基线零新增:死链 3(存量)/lint FAIL 集=06/07/术语表(基线三件,08 一度因新增单元格撞 R3 已改措辞回绿)/词命中 2(存量) |
| 熵增闸(repo_structure_audit) | PASS |
| MC | **零跑**(零数值零行为=纯呈现批,按触发细则不发起) |
| V7 读数对拍 | 零游戏逻辑改动——冒烟全量零漂移(逻辑断言全绿)+探针结构断言零漂移+golden 0.00% |
**golden 面处置(T6 第 4 步)**:board golden 三屏 changed=0.00%——站桩徽标换墨面未越容差线(徽标像素占比低于 changed 计量或落在裁剪纸外),按卡片「若闸直接绿=登记即结」处置,**未重制基线**。附带说明:T1/T2 的按钮 crisp 翻转与九宫格皮变化同样零漂移(golden 裁剪区=棋盘视图,HUD 钮不在其内)。
## 四、代拍板追认单(白名单内执行项 + 事实订正,请用户追认)
**白名单内执行**:
1. **hover 提亮档**=modulate Color(1.06,1.06,1.06)(项1:参考主钮 `lightened(0.06)` 量级;INK 字对比不受损——石纹底提亮后对比只升)。
2. **禁用 α**=0.45(项2:基准值,与文字禁用同档;flat 两厂 bg+border 同 α 全幽灵化,与石纹 modulate 整图 α0.45 同纪律)。
3. **焦点环**=INK 2px 内缩 1px(项3:裁值直落;内缩以负 expand margin 实现;引擎 focus 样式盒为叠加绘制——不遮钮底,「三类钮底可辨性实比」设计语言成立)。
4. **换墨 token**(项4/Q6 裁后落值):GOLD_BRIGHT #E0B860(同族亮档优先既有亮族——取收益金同门值)/HERO_BLUE_BRIGHT #7EBAF0;语义岗冲撞,立新 token 走反哺点③。
5. **连续 alpha 曲线**(项5):带内三角过渡 0→0.05→0(带宽 100 中分)+纵向线性衰减至 0(上亮下暗);STRETCH_TILE 平铺在 y=560 整倍数处有衰减重启接缝(α0.05 量级不可察),归 07 目检。
6. **图标槽明度档**(项6):#806A4E,白图标 5.14:1 ≥3:1 硬约束达标(不触发回退案)。
7. **布局修**(项7):商店=ALIGNMENT_CENTER;营地四栏等高=统一 min 高 336 与 EXPAND_FILL 拉伸两选项组合落(holder min 保锁定态栏高,面板 FILL 保任一栏长高时四栏同步)。
8. **诊断钮落点**(项8):调试浮窗区块⑤(④两层调试之后、关闭钮之前),「诊断转储 · 转储」钮常驻可用不置灰——卡死取证在对局中更要能点(原角落钮亦无置灰)。
**卡片措辞与引擎事实的偏差(呈报追认)**:
9. **V4 清零断言自撞**:初版「旧墨清零」全文件扫撞上本批新注记里的旧 token 名(STONE_FAINT 写进了换墨注记)——改回全文件严格扫+注记改语义名(「灰石弱化墨」)。教训:清零类断言扫全文件时,同批注记禁载旧 token 名。
10. **Godot Image 8bit 量化=截断(非四舍五入)**:0.04977×255=12.69 实存 12——T4 峰值断言按截断量化校验(≥12/255 且 ≤0.05),非 bug。
11. **ui_tune_probe 只读巡检同批入册**:连接数 10→11+白名单加 `_emit_diagnose_requested`——T5b 属 ruled 变化,探针机械适配(iter24 旧「十二行」断言换代同款先例)。
12. **卡片 §2.2 texture_filter 枚举漏项**(开工检查发现①,用户裁按建议改法):计 12 实测 13,漏 `board_world.gd:50`(hero 立绘 NEAREST)——已勘误落卡;该点与全局 Nearest 同向、零翻转风险、不进白名单。
13. **主区遗产脏件两处**(开工检查发现②):`game/project.godot` 编辑器对调(theme 两行换序,语义等价)与 `active.md` 编入快照——active.md 台账本批走主区侧写(不入分支,避免合并互撞);project.godot 合并点复检,用户择机自理(提交或丢弃该对调)。
## 五、GDD 反哺点(设计权威文档不随批改,待用户逐点裁;已登记 06 新条)
1. **art-bible §7 按钮五态/焦点态规格缺项**:无条款,本批实现(modulate 1.06/α0.45/INK 2px 内缩 1px)=临时权威——是否立条款、值是否冻结待裁。
2. **平滑渐变件 LINEAR 白名单无例外条款**:全局 Nearest 下三件程序化平滑渐变挂显式 LINEAR,属有意豁免;§8.2 已有状态图标例外先例可援——豁免清单是否入册待裁。
3. **§4.1 新色 token 语义岗登记**:GOLD_BRIGHT/HERO_BLUE_BRIGHT/SLOT_BACKDROP_SOFT 三 token 未登记——语义命名与值是否转正待裁。
4. **氛围层风格一致性**:vignette/gradient_base/beams 保平滑连续 alpha,与 DitherBand Bayer 抖动派并存(Q5 已裁保平滑)——两派不一致性留整屏样张批统一裁决(样张批未开工,06 在册)。
## 六、实机目检总清单(归用户,07 ㉕ 登记不阻塞)
1. 按钮五态反馈:标题屏/营地/商店/设置/三选一逐屏——悬停(石纹钮提亮可感)、按下(本族下沉)、禁用(商店余额不足钮=本族幽灵化)三种反馈可感。
2. 键盘焦点环:Tab 遍历各屏,INK 2px 内缩 1px 环可见不糊、不遮钮底字;三类钮底上环可辨性实比。
3. 全局 Nearest 巡检:立绘/瓦片/图标/九宫格无新增糊感(应更 crisp);暗角与地图渐变无像素块(白名单生效判据);标题屏光带无硬边梯形、有过渡与衰减。
4. 布局均衡:商店卡片区不堆上半;营地四栏视觉等高(含锁定态与图鉴栏)。
5. 诊断钮清零:玩家画面无「诊断转储」钮;转储入口仅在调试浮窗可达。
## 七、遗留与风险
- 渲染闸 PIL 依赖:`render_gate.sh` 的 shot_checker/golden_board_crop 需 gamedev venv 的 PIL——运行前 PATH 前置 `D:/dev/python/envs/gamedev/Scripts`(本批两跑实证:裸 python 直接 ModuleNotFoundError)。
- 遗留人闸不变:迭代 20 实机目检五件 + 21 营地四柜台〔07 ⑳〕+ 22 秘宝解锁装配〔07 ㉑〕+ 23 锻造工作间〔07 ㉒〕+ 24 敌人表三观测〔07 ㉓〕+ 25 全屏巡检〔07 ㉕ 前的 ㉔〕+ **26 逐屏巡检〔07 ㉕〕**。
- 本迭代位仍预留后续追加卡(roadmap 注记维持);M4 数值批顺延 27+ 未排期。
- 光柱 TILE 接缝(追认单 5)与焦点环三类钮底可辨性(追认单 3)归 07 目检,不达走 L2 微调(调宽/内缩/衰减梯度,不动色系不动主题层)。
+6 -6
View File
@@ -330,19 +330,18 @@ func _build_ui() -> void:
_inter_label = inter.label _inter_label = inter.label
inter.next_btn.pressed.connect(_on_inter_next_pressed) inter.next_btn.pressed.connect(_on_inter_next_pressed)
var diag_btn := UiAssembler.build_diag_button(self) # 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层之后 = 子级最末
diag_btn.pressed.connect(_on_diagnose_pressed)
# 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层/诊断钮之后 = 子级最末
#(T3 收口批——「登记序 = 树序 = z 序」纪律复位,confirm_dialog.open 的 move_child 运行时自提 #(T3 收口批——「登记序 = 树序 = z 序」纪律复位,confirm_dialog.open 的 move_child 运行时自提
# 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上) # 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上。原诊断转储角落钮随迭代 26 T5b 退役,
# 转储入口迁调试浮窗——grilling Q8 裁甲)
confirm_dialog = ConfirmDialog.new() confirm_dialog = ConfirmDialog.new()
add_child(confirm_dialog) add_child(confirm_dialog)
confirm_dialog.confirmed.connect(_on_confirm_new_adventure) confirm_dialog.confirmed.connect(_on_confirm_new_adventure)
confirm_dialog.cancelled.connect(_on_confirm_cancelled) confirm_dialog.cancelled.connect(_on_confirm_cancelled)
# 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口; # 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口;
# 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕)。 # 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕;
# 迭代 26 T5b——诊断转储入口并入(原主画面左下角常驻钮退役,玩家画面清零))。
# 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态); # 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态);
# 开窗唯一入口 = _show_debug_overlay(C6 单口——角标/探针/启动路径全收口) # 开窗唯一入口 = _show_debug_overlay(C6 单口——角标/探针/启动路径全收口)
debug_overlay = DebugOverlay.new(db, int(db.hero.atk), int(db.hero.max_hp)) debug_overlay = DebugOverlay.new(db, int(db.hero.atk), int(db.hero.max_hp))
@@ -352,6 +351,7 @@ func _build_ui() -> void:
debug_overlay.apply_requested.connect(_on_tune_apply) debug_overlay.apply_requested.connect(_on_tune_apply)
debug_overlay.simulate_requested.connect(_on_tune_simulate) debug_overlay.simulate_requested.connect(_on_tune_simulate)
debug_overlay.debug_levels_requested.connect(_start_debug_levels) debug_overlay.debug_levels_requested.connect(_start_debug_levels)
debug_overlay.diagnose_requested.connect(_on_diagnose_pressed) # 迭代 26 T5b——诊断转储入口随迁(原角落钮连接)
# 模态登记(缺陷⑤纪律——登记序 = 树序:含 move_child 调位后的关卡画面/三选一终位; # 模态登记(缺陷⑤纪律——登记序 = 树序:含 move_child 调位后的关卡画面/三选一终位;
# 状态面板设置层同档、确认弹窗之前——P2 甲;生涯页同档随状态面板之后(迭代 18 卡④ P3 甲)) # 状态面板设置层同档、确认弹窗之前——P2 甲;生涯页同档随状态面板之后(迭代 18 卡④ P3 甲))
-12
View File
@@ -216,18 +216,6 @@ static func build_inter_overlay(host: Control) -> Dictionary:
return {"overlay": overlay, "label": label, "next_btn": next_btn} return {"overlay": overlay, "label": label, "next_btn": next_btn}
# Playtest 诊断按钮(调试变体——battle.md §States 允许;卡死转储)
static func build_diag_button(host: Control) -> Button:
var diag_btn := UiKit.button("诊断转储", 0.0) # 角落小件豁免宽度基准(固定 offsets 112px 宽)
diag_btn.set_anchors_preset(Control.PRESET_BOTTOM_LEFT)
diag_btn.offset_left = 6.0
diag_btn.offset_top = -30.0
diag_btn.offset_right = 118.0
diag_btn.offset_bottom = -6.0
host.add_child(diag_btn)
return diag_btn
static func overlay_bg(host: Control, color: Color) -> ColorRect: static func overlay_bg(host: Control, color: Color) -> ColorRect:
var dim := ColorRect.new() var dim := ColorRect.new()
dim.color = color dim.color = color
+1 -1
View File
@@ -74,7 +74,7 @@ func _init() -> void:
_rap_label = UiKit.label("RAP 0",UiKit.FS_HINT, 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 _rap_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER
row.add_child(_rap_label) row.add_child(_rap_label)
_rap_feedback = UiKit.label("",UiKit.FS_CAPTION, false, UiKit.STONE_FAINT) _rap_feedback = UiKit.label("",UiKit.FS_CAPTION, false, UiKit.STONE_DEEP) # 迭代 26 T3 换墨——旧灰石弱化墨对 PANEL_DATA 2.9:1 越带,深石墨 5.6:1 在案
_rap_feedback.size_flags_vertical = Control.SIZE_SHRINK_CENTER _rap_feedback.size_flags_vertical = Control.SIZE_SHRINK_CENTER
row.add_child(_rap_feedback) row.add_child(_rap_feedback)
@@ -118,10 +118,12 @@ func _init() -> void:
tree_scroll.add_child(_tree_holder) tree_scroll.add_child(_tree_holder)
var tree_panel := _counter_panel("天赋树 · 淬炼", "", tree_scroll, 300) var tree_panel := _counter_panel("天赋树 · 淬炼", "", tree_scroll, 300)
tree_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL tree_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
tree_panel.size_flags_vertical = Control.SIZE_FILL # 迭代 26 T5③ 四栏等高:任一栏长高时四栏同步拉伸
mid.add_child(tree_panel) mid.add_child(tree_panel)
# 柜二·锻造工坊(钥匙门——forge_workshop 点亮前锁定态;点亮=工作间两区六路线行板,迭代 23 T6 实装) # 柜二·锻造工坊(钥匙门——forge_workshop 点亮前锁定态;点亮=工作间两区六路线行板,迭代 23 T6 实装)
_forge_lock_l = UiKit.label("🔒 锻造工坊未开放\n\n点亮树上「锻造工坊」钥匙节点后展开工作间。\n(钥匙免费、无前置——树上直接点亮)",UiKit.FS_HINT, false, UiKit.STONE_DEEP) _forge_lock_l = UiKit.label("🔒 锻造工坊未开放\n\n点亮树上「锻造工坊」钥匙节点后展开工作间。\n(钥匙免费、无前置——树上直接点亮)",UiKit.FS_HINT, false, UiKit.STONE_DEEP)
_forge_lock_l.size_flags_vertical = Control.SIZE_SHRINK_CENTER # 迭代 26 T5③ 锁文在等高栏内垂直居中
_forge_lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _forge_lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
_forge_lock_l.custom_minimum_size = Vector2(280, 0) _forge_lock_l.custom_minimum_size = Vector2(280, 0)
_forge_workbench = VBoxContainer.new() _forge_workbench = VBoxContainer.new()
@@ -139,14 +141,17 @@ func _init() -> void:
_forge_workbench.add_child(_forge_zone_armor) _forge_workbench.add_child(_forge_zone_armor)
var forge_holder := VBoxContainer.new() var forge_holder := VBoxContainer.new()
forge_holder.add_theme_constant_override("separation", 6) forge_holder.add_theme_constant_override("separation", 6)
forge_holder.custom_minimum_size = Vector2(0, 336) # 迭代 26 T5③ 四栏等高(与树/秘宝匣 scroll 336 min 对齐——锁定态仅锁文也撑住栏高)
forge_holder.add_child(_forge_lock_l) forge_holder.add_child(_forge_lock_l)
forge_holder.add_child(_forge_workbench) forge_holder.add_child(_forge_workbench)
var forge_panel := _counter_panel("锻造工坊", UiKit.TEX_ICON_FORGE, forge_holder, 300) var forge_panel := _counter_panel("锻造工坊", UiKit.TEX_ICON_FORGE, forge_holder, 300)
forge_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL forge_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
forge_panel.size_flags_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸
mid.add_child(forge_panel) mid.add_child(forge_panel)
# 柜三·秘宝匣(钥匙门——ks_workshop 点亮前锁定态;点亮=现工坊内容整体迁入:六行+同调装配段+Y 升级行) # 柜三·秘宝匣(钥匙门——ks_workshop 点亮前锁定态;点亮=现工坊内容整体迁入:六行+同调装配段+Y 升级行)
_ws_lock_l = UiKit.label("🔒 秘宝匣未开放\n\n点亮树上「秘宝匣」钥匙节点后展开。\n(前置=脊柱生命第 1 级)",UiKit.FS_HINT, false, UiKit.STONE_DEEP) _ws_lock_l = UiKit.label("🔒 秘宝匣未开放\n\n点亮树上「秘宝匣」钥匙节点后展开。\n(前置=脊柱生命第 1 级)",UiKit.FS_HINT, false, UiKit.STONE_DEEP)
_ws_lock_l.size_flags_vertical = Control.SIZE_SHRINK_CENTER # 迭代 26 T5③ 锁文在等高栏内垂直居中
_ws_lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _ws_lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
_ws_lock_l.custom_minimum_size = Vector2(280, 0) _ws_lock_l.custom_minimum_size = Vector2(280, 0)
_ws_scroll = ScrollContainer.new() _ws_scroll = ScrollContainer.new()
@@ -158,18 +163,23 @@ func _init() -> void:
_ws_scroll.add_child(_workshop_holder) _ws_scroll.add_child(_workshop_holder)
var ws_holder := VBoxContainer.new() var ws_holder := VBoxContainer.new()
ws_holder.add_theme_constant_override("separation", 6) ws_holder.add_theme_constant_override("separation", 6)
ws_holder.custom_minimum_size = Vector2(0, 336) # 迭代 26 T5③ 四栏等高(锁定态 scroll 隐、仅锁文也撑住栏高)
ws_holder.add_child(_ws_lock_l) ws_holder.add_child(_ws_lock_l)
ws_holder.add_child(_ws_scroll) ws_holder.add_child(_ws_scroll)
var ws_panel := _counter_panel("秘宝匣", UiKit.TEX_ICON_WORKSHOP, ws_holder, 300) var ws_panel := _counter_panel("秘宝匣", UiKit.TEX_ICON_WORKSHOP, ws_holder, 300)
ws_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL ws_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
ws_panel.size_flags_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸
mid.add_child(ws_panel) mid.add_child(ws_panel)
# 柜四·奖励格图鉴(常开独立位——结构位预留,内容排 Alpha) # 柜四·奖励格图鉴(常开独立位——结构位预留,内容排 Alpha)
var atlas_holder := VBoxContainer.new() var atlas_holder := VBoxContainer.new()
atlas_holder.custom_minimum_size = Vector2(0, 336) # 迭代 26 T5③ 四栏等高(图鉴仅锁文也撑住栏高)
var atlas_panel := _counter_panel("奖励格图鉴", UiKit.TEX_ICON_ATLAS, atlas_holder, 300) var atlas_panel := _counter_panel("奖励格图鉴", UiKit.TEX_ICON_ATLAS, atlas_holder, 300)
atlas_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL atlas_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
atlas_panel.size_flags_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸
mid.add_child(atlas_panel) mid.add_child(atlas_panel)
var lock_l := UiKit.label(" —— 柜台结构位预留:内容排 Alpha(地图战斗资源差异化批)",UiKit.FS_HINT, false, UiKit.STONE) var lock_l := UiKit.label(" —— 柜台结构位预留:内容排 Alpha(地图战斗资源差异化批)",UiKit.FS_HINT, false, UiKit.STONE)
lock_l.size_flags_vertical = Control.SIZE_SHRINK_CENTER # 迭代 26 T5③ 锁文在等高栏内垂直居中
lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART lock_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
lock_l.custom_minimum_size = Vector2(280, 0) lock_l.custom_minimum_size = Vector2(280, 0)
atlas_holder.add_child(lock_l) atlas_holder.add_child(lock_l)
+2 -1
View File
@@ -40,7 +40,8 @@ func open(text: String, confirm_label: String, cancel_label: String = "取消")
_confirm_btn.text = confirm_label _confirm_btn.text = confirm_label
_cancel_btn.text = cancel_label _cancel_btn.text = cancel_label
# z 序纪律(T3 收口批 2026-10-02):树序由组合根构建序保证——本弹窗在 main._build_ui 尾部 # z 序纪律(T3 收口批 2026-10-02):树序由组合根构建序保证——本弹窗在 main._build_ui 尾部
# add_child(开始层/过场层/诊断钮之后 = 子级最末,登记序 = 树序 = 绘制序恒最上), # add_child(开始层/过场层之后 = 子级最末,登记序 = 树序 = 绘制序恒最上;原诊断转储角落钮随
# 迭代 26 T5b 退役迁调试浮窗,此处不再经其之后),
# 「每次打开 move_child 运行时自提」创可贴随之删除。 # 「每次打开 move_child 运行时自提」创可贴随之删除。
visible = true visible = true
+17
View File
@@ -16,6 +16,7 @@ extends Control
signal apply_requested(atk_pct: int, hp_pct: int) # 应用并关闭——加成落表归组合根单一应用路径 signal apply_requested(atk_pct: int, hp_pct: int) # 应用并关闭——加成落表归组合根单一应用路径
signal simulate_requested(count: int) # 批量模拟编排归组合根(表基线复位 + 单路径施加) signal simulate_requested(count: int) # 批量模拟编排归组合根(表基线复位 + 单路径施加)
signal debug_levels_requested # 两层调试对局入口(编排归 debug_session.gd) signal debug_levels_requested # 两层调试对局入口(编排归 debug_session.gd)
signal diagnose_requested # 诊断转储入口(迭代 26 T5b——原主画面角落钮迁入;卡死取证编排归组合根)
signal closed signal closed
var seed_edit: LineEdit # 组合根 _seed_value 唯一读取面(原开始覆盖层种子行迁入) var seed_edit: LineEdit # 组合根 _seed_value 唯一读取面(原开始覆盖层种子行迁入)
@@ -265,6 +266,18 @@ func _build() -> void:
_dbg_btn.pressed.connect(_emit_debug_levels) _dbg_btn.pressed.connect(_emit_debug_levels)
list.add_child(_dbg_btn) list.add_child(_dbg_btn)
# 区块⑤诊断转储(迭代 26 T5b——原主画面左下角「诊断转储」常驻钮退役迁入:grilling Q8 裁甲,
# 承迭代 18 卡⑦「主菜单三散件收一」纪律;dump_diagnosis 卡死取证功能保留〔删除案否〕,
# 门控隐藏案否——本浮窗本就可全局可开,双轨无意义。纯视图边界:转储编排经信号外发归组合根)
var diag_row := HBoxContainer.new()
diag_row.add_theme_constant_override("separation", 10)
list.add_child(diag_row)
diag_row.add_child(UiKit.label("诊断转储",UiKit.FS_BODY, false))
var diag_btn := UiKit.button("转储")
diag_btn.tooltip_text = "卡死取证:全量核心状态+环形缓冲 → user://logs/diag_*.json"
diag_btn.pressed.connect(_emit_diagnose_requested)
diag_row.add_child(diag_btn)
var close_btn := UiKit.button("关闭") var close_btn := UiKit.button("关闭")
close_btn.pressed.connect(_emit_closed) close_btn.pressed.connect(_emit_closed)
box.add_child(close_btn) box.add_child(close_btn)
@@ -298,6 +311,10 @@ func _emit_simulate_requested() -> void:
simulate_requested.emit(int(_sim_count.value)) simulate_requested.emit(int(_sim_count.value))
func _emit_diagnose_requested() -> void:
diagnose_requested.emit()
func _emit_debug_levels() -> void: func _emit_debug_levels() -> void:
debug_levels_requested.emit() debug_levels_requested.emit()
@@ -63,6 +63,7 @@ func _init() -> void:
box.add_child(_visit_label) box.add_child(_visit_label)
_cards_box = VBoxContainer.new() _cards_box = VBoxContainer.new()
_cards_box.size_flags_vertical = Control.SIZE_EXPAND_FILL _cards_box.size_flags_vertical = Control.SIZE_EXPAND_FILL
_cards_box.alignment = BoxContainer.ALIGNMENT_CENTER # 迭代 26 T5③ 卡片区垂直居中(旧默认顶对齐=卡片堆上半、下半空)
_cards_box.add_theme_constant_override("separation", 8) _cards_box.add_theme_constant_override("separation", 8)
box.add_child(_cards_box) box.add_child(_cards_box)
var foot := HBoxContainer.new() var foot := HBoxContainer.new()
+4 -4
View File
@@ -433,12 +433,12 @@ func _draw() -> void:
draw_rect(ped, UiKit.STAND_STONE_EDGE, false, 1.0) 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) 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) # 血条(直角递减):敌附顺位徽标(GOLD_BRIGHT ①②③——迭代 26 T3 换墨,旧 GOLD_DEEP 对舞台底 3.3:1 越带)——旧 top VBox 几何等价(左 8 / 右 -8)
var bar_x := 8.0 var bar_x := 8.0
if _kind == "enemy": if _kind == "enemy":
var order_txt := String("①②③"[clampi(_order - 1, 0, 2)]) var order_txt := String("①②③"[clampi(_order - 1, 0, 2)])
f.draw_string(get_canvas_item(), Vector2(bar_x, 12), order_txt, f.draw_string(get_canvas_item(), Vector2(bar_x, 12), order_txt,
HORIZONTAL_ALIGNMENT_LEFT, -1, 13, UiKit.GOLD_DEEP) HORIZONTAL_ALIGNMENT_LEFT, -1, 13, UiKit.GOLD_BRIGHT)
bar_x += 20.0 bar_x += 20.0
var bar_w := box.x - 8.0 - bar_x var bar_w := box.x - 8.0 - bar_x
draw_rect(Rect2(bar_x, 2, bar_w, 10), Color(0.10, 0.10, 0.11)) # 条底(引擎默认主题深底近似平移) draw_rect(Rect2(bar_x, 2, bar_w, 10), Color(0.10, 0.10, 0.11)) # 条底(引擎默认主题深底近似平移)
@@ -489,9 +489,9 @@ func _draw() -> void:
var col: Color = UiKit.WARM_FAINT # 轻甲 = 暖白弱化(v3.5 暗底双色墨制——原灰石对暗底不可读) var col: Color = UiKit.WARM_FAINT # 轻甲 = 暖白弱化(v3.5 暗底双色墨制——原灰石对暗底不可读)
match _armor: match _armor:
"ward": "ward":
col = UiKit.HERO_BLUE # 魔法护甲 = 小人蓝 col = UiKit.HERO_BLUE_BRIGHT # 魔法护甲 = 小人蓝亮档(迭代 26 T3 换墨,旧 HERO_BLUE 对舞台底 3.2:1 越带)
"heavy": "heavy":
col = UiKit.GOLD_DEEP # 重甲 = 深金 col = UiKit.GOLD_BRIGHT # 重甲 = 金族亮档(迭代 26 T3 换墨,旧 GOLD_DEEP 对舞台底 3.3:1 越带)
var name_w := f.get_string_size(_display_name, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x 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 armor_w := f.get_string_size(armor_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x
var total_w := armor_w + 3.0 + name_w var total_w := armor_w + 3.0 + name_w
+56 -8
View File
@@ -27,6 +27,7 @@ const PANEL_BORDER := Color8(120, 110, 88) # 面板细线框;兼熄灭点
const GOLD := Color8(240, 168, 40) # 奖励金 const GOLD := Color8(240, 168, 40) # 奖励金
const GOLD_DEEP := Color8(176, 122, 20) # 深金(金框描边/达意金) 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_INK := Color8(116, 80, 11) # 深金墨(意图蓄力徽标墨——PANEL_DATA 垫牌上 4.9:1,UI 设计对齐批 N1 2026-10-06)
const GOLD_BRIGHT := Color8(224, 184, 96) # 金族亮档(迭代 26 T3——敌顺位徽标①②③/重甲徽标对暗舞台底 6.5:1;值=收益金 e0b860 同门;GOLD_DEEP 语义岗〔standee:199 意图判据/board_view:35/level_map:237〕在役不动)
const GOLD_LIT := Color8(230, 190, 90) # 亮金(候选高亮) const GOLD_LIT := Color8(230, 190, 90) # 亮金(候选高亮)
const GOLD_DIM := Color8(140, 116, 60) # 暗金(已过节点) const GOLD_DIM := Color8(140, 116, 60) # 暗金(已过节点)
const GOLD_DONE := Color8(104, 86, 44) # 已过节点暗金·关卡画面呈现态(关卡画面样张 v1 冻结新值 #68562C——旧 GOLD_DIM #8C743C 对双色墨均 <4.5:1 对比硬指标逼守;GOLD_DIM 他用不动) const GOLD_DONE := Color8(104, 86, 44) # 已过节点暗金·关卡画面呈现态(关卡画面样张 v1 冻结新值 #68562C——旧 GOLD_DIM #8C743C 对双色墨均 <4.5:1 对比硬指标逼守;GOLD_DIM 他用不动)
@@ -41,6 +42,7 @@ 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 := 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 HERO_BLUE_DEEP := Color8(30, 90, 150) # 小人蓝同族深档(意图增益徽标墨——PANEL_DATA 垫牌上 4.8:1;命名同 CONTACT_GLOW_DEEP 规则,UI 设计对齐批 N1 2026-10-06)
const HERO_BLUE_BRIGHT := Color8(126, 186, 240) # 小人蓝同族亮档(迭代 26 T3——魔法护甲徽标对暗舞台底 5.9:1;HERO_BLUE 语义岗〔board_view:35 小人边框/level_map:237〕在役不动)
const BOSS_PURPLE := Color8(143, 47, 106) # 紫赤(Boss 专属) const BOSS_PURPLE := Color8(143, 47, 106) # 紫赤(Boss 专属)
const DEBUFF_PURPLE := Color8(122, 66, 148) # 妨害紫(意图 ☠) const DEBUFF_PURPLE := Color8(122, 66, 148) # 妨害紫(意图 ☠)
@@ -104,6 +106,7 @@ const DIGIT_PLATE := Color8(245, 234, 211) # 数字色牌(素色暖纸白
# 可读不依赖格底——原则二;2026-09-26 呈现修复批落码) # 可读不依赖格底——原则二;2026-09-26 呈现修复批落码)
const DIGIT_PLATE_EDGE := Color8(210, 198, 172) # 色牌牌缘线 const DIGIT_PLATE_EDGE := Color8(210, 198, 172) # 色牌牌缘线
const SLOT_BACKDROP := Color8(62, 54, 44) # B 区状态图标槽实底(深墨棕——白图标对比承载)#3E362C(P7 乙 2026-10-06 对齐) const SLOT_BACKDROP := Color8(62, 54, 44) # B 区状态图标槽实底(深墨棕——白图标对比承载)#3E362C(P7 乙 2026-10-06 对齐)
const SLOT_BACKDROP_SOFT := Color8(128, 106, 78) # 图标槽实底·柔和档(迭代 26 T5②——BCard 图标槽明度差降档:对米色卡面 3.7:1〔旧深档 8.7:1 过硬〕,白图标 5.1:1 ≥3:1 图形对比硬约束;B 区状态槽仍用深档 SLOT_BACKDROP)
const BG_ROOT := Color8(58, 46, 34) # 屏幕根底 #3A2E22(UI 落码批 M0 2026-10-04——配色总纲「提暖提亮禁近黑」,旧近黑 #1E1914 退役) const BG_ROOT := Color8(58, 46, 34) # 屏幕根底 #3A2E22(UI 落码批 M0 2026-10-04——配色总纲「提暖提亮禁近黑」,旧近黑 #1E1914 退役)
const BG_OVERLAY := Color8(54, 43, 32) # 模态遮罩底 #362B20(同批换代,旧 #1C1612 退役) const BG_OVERLAY := Color8(54, 43, 32) # 模态遮罩底 #362B20(同批换代,旧 #1C1612 退役)
@@ -253,25 +256,37 @@ static func vignette_rect() -> TextureRect:
var tr := TextureRect.new() var tr := TextureRect.new()
tr.texture = t tr.texture = t
tr.stretch_mode = TextureRect.STRETCH_SCALE tr.stretch_mode = TextureRect.STRETCH_SCALE
tr.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR # 平滑渐变件白名单(迭代 26 T2——全局 Nearest 下显式豁免)
tr.set_anchors_preset(Control.PRESET_FULL_RECT) tr.set_anchors_preset(Control.PRESET_FULL_RECT)
tr.mouse_filter = Control.MOUSE_FILTER_IGNORE tr.mouse_filter = Control.MOUSE_FILTER_IGNORE
return tr return tr
# 斜光带(demo #v-start .beams——repeating-linear-gradient 102deg,暖白 5% 窄带 240-340/560px; # 斜光带(demo #v-start .beams——repeating-linear-gradient 102deg,暖白 5% 窄带 240-340/560px;
# 程序纹理循环带,确定性生成零随机) # 程序纹理循环带,确定性生成零随机。迭代 26 T4 光柱硬边修(grilling Q7 裁=连续 alpha):
# 带内 alpha 0→0.05→0 横向过渡(旧匀净+零过渡硬边梯形退役)+纵向衰减上亮下暗;
# 纹理 filter=显式 LINEAR 白名单(与暗角/地图渐变同血统,见 T2)
static func beams_rect() -> TextureRect: static func beams_rect() -> TextureRect:
var img := Image.create(560, 560, false, Image.FORMAT_RGBA8) var img := Image.create(560, 560, false, Image.FORMAT_RGBA8)
var ca := cos(0.2094) # 12°(102deg 带轴的垂直倾角) var ca := cos(0.2094) # 12°(102deg 带轴的垂直倾角)
var sa := sin(0.2094) var sa := sin(0.2094)
var beam_col := Color(1.0, 236.0 / 255.0, 200.0 / 255.0)
var band_lo := 240.0
var band_hi := 340.0
var band_mid := (band_lo + band_hi) * 0.5
var band_peak := 0.05
var band_half := (band_hi - band_lo) * 0.5
for y in 560: for y in 560:
var v_fall := 1.0 - float(y) / 560.0 # 纵向衰减:上亮下暗(连续 alpha)
for x in 560: for x in 560:
var d := fposmod(x * ca + y * sa, 560.0) var d := fposmod(x * ca + y * sa, 560.0)
if d >= 240.0 and d < 340.0: if d >= band_lo and d < band_hi:
img.set_pixel(x, y, Color(1.0, 236.0 / 255.0, 200.0 / 255.0, 0.05)) var a: float = band_peak * (1.0 - absf(d - band_mid) / band_half) * v_fall
img.set_pixel(x, y, Color(beam_col.r, beam_col.g, beam_col.b, a))
var tr := TextureRect.new() var tr := TextureRect.new()
tr.texture = ImageTexture.create_from_image(img) tr.texture = ImageTexture.create_from_image(img)
tr.stretch_mode = TextureRect.STRETCH_TILE tr.stretch_mode = TextureRect.STRETCH_TILE
tr.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR # 平滑渐变件白名单(迭代 26 T2 Q7 裁——连续 alpha 与暗角/地图渐变同血统)
tr.set_anchors_preset(Control.PRESET_FULL_RECT) tr.set_anchors_preset(Control.PRESET_FULL_RECT)
tr.mouse_filter = Control.MOUSE_FILTER_IGNORE tr.mouse_filter = Control.MOUSE_FILTER_IGNORE
return tr return tr
@@ -291,6 +306,7 @@ static func gradient_base(top: Color, low: Color, stop := 0.4) -> TextureRect:
var tr := TextureRect.new() var tr := TextureRect.new()
tr.texture = t tr.texture = t
tr.stretch_mode = TextureRect.STRETCH_SCALE tr.stretch_mode = TextureRect.STRETCH_SCALE
tr.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR # 平滑渐变件白名单(迭代 26 T2——全局 Nearest 下显式豁免)
tr.set_anchors_preset(Control.PRESET_FULL_RECT) tr.set_anchors_preset(Control.PRESET_FULL_RECT)
tr.mouse_filter = Control.MOUSE_FILTER_IGNORE tr.mouse_filter = Control.MOUSE_FILTER_IGNORE
return tr return tr
@@ -537,22 +553,43 @@ static func keystone_badge(text: String, icon_path := TEX_ICON_KEYSTONE, icon_px
return KeystoneBadge.new(text, icon_path, icon_px) return KeystoneBadge.new(text, icon_path, icon_px)
# 按钮皮(常态/按压两态+墨字——缺位 = 引擎默认主题,素材批前逐位一致) # 按钮皮·五态矩阵(迭代 26 T1——UI 交互与观感批;甲/乙案值=grilling 两轮八裁落文,逐实例 override 不动主题层)
# 悬停=乙案:常态图+modulate 提亮(0.06 档与 primary_button 现行 lightened(0.06) 同纪律,零新素材);
# 禁用=甲案:本族底+α0.45 幽灵化(与 font_disabled_color 同纪律),取代旧「disabled=按压图」错配;
# 焦点=甲案:INK 2px 内缩 1px 环(与 font_focus_color=INK 同源;引擎 focus 样式盒叠加绘制,不遮钮底)
const BUTTON_HOVER_LIFT := Color(1.06, 1.06, 1.06, 1.0) # 悬停提亮档(modulate 乘数>1=中间调提亮,高光像素封顶不漂)
const BUTTON_GHOST_ALPHA := 0.45 # 禁用幽灵化 α(与文字禁用同档)
const BUTTON_FOCUS_RING_W := 2.0 # 焦点环宽 px
const BUTTON_FOCUS_RING_INSET := 1.0 # 焦点环内缩 px(负 expand margin 实现)
static func _focus_ring_sb() -> StyleBoxFlat:
var sb := StyleBoxFlat.new()
sb.bg_color = Color(0, 0, 0, 0)
sb.draw_center = false
sb.set_border_width_all(BUTTON_FOCUS_RING_W)
sb.border_color = INK
sb.set_expand_margin_all(-BUTTON_FOCUS_RING_INSET)
return sb
# 按钮皮(五态统一管线——常态/悬停/按压/禁用/焦点+墨字;缺位素材 = 引擎默认主题)
static func _apply_button_skin(b: Button) -> void: static func _apply_button_skin(b: Button) -> void:
var tex_n := load_tex(TEX_BUTTON_STONE) var tex_n := load_tex(TEX_BUTTON_STONE)
if tex_n == null: if tex_n == null:
return return
var tex_p := load_tex(TEX_BUTTON_STONE_PRESSED) var tex_p := load_tex(TEX_BUTTON_STONE_PRESSED)
b.add_theme_stylebox_override("normal", _tex_sb(tex_n, 8.0)) b.add_theme_stylebox_override("normal", _tex_sb(tex_n, 8.0))
b.add_theme_stylebox_override("hover", _tex_sb(tex_n, 8.0)) b.add_theme_stylebox_override("hover", _tex_sb(tex_n, 8.0, BUTTON_HOVER_LIFT))
if tex_p != null: if tex_p != null:
b.add_theme_stylebox_override("pressed", _tex_sb(tex_p, 8.0)) b.add_theme_stylebox_override("pressed", _tex_sb(tex_p, 8.0))
b.add_theme_stylebox_override("disabled", _tex_sb(tex_p, 8.0)) b.add_theme_stylebox_override("disabled",
_tex_sb(tex_n, 8.0, Color(1, 1, 1, BUTTON_GHOST_ALPHA)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", INK) b.add_theme_color_override("font_color", INK)
b.add_theme_color_override("font_hover_color", INK) b.add_theme_color_override("font_hover_color", INK)
b.add_theme_color_override("font_pressed_color", INK) b.add_theme_color_override("font_pressed_color", INK)
b.add_theme_color_override("font_focus_color", INK) b.add_theme_color_override("font_focus_color", INK)
b.add_theme_color_override("font_disabled_color", Color(INK, 0.45)) b.add_theme_color_override("font_disabled_color", Color(INK, BUTTON_GHOST_ALPHA))
# ── UI 落码批 M10 公共件(2026-10-04——bcard 竖卡工厂/拨杆开关/样式滑杆/动词按钮/tooltip 主题; # ── UI 落码批 M10 公共件(2026-10-04——bcard 竖卡工厂/拨杆开关/样式滑杆/动词按钮/tooltip 主题;
@@ -578,10 +615,14 @@ static func primary_button(text: String, tip := "") -> Button:
b.add_theme_stylebox_override("normal", sb) b.add_theme_stylebox_override("normal", sb)
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("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_stylebox_override("pressed", panel_flat(Color8(214, 172, 88), Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("disabled",
panel_flat(Color(CANDLE, BUTTON_GHOST_ALPHA), Color(Color8(110, 69, 52), BUTTON_GHOST_ALPHA), RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", Color8(58, 42, 8)) 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_hover_color", Color8(58, 42, 8))
b.add_theme_color_override("font_pressed_color", Color8(58, 42, 8)) b.add_theme_color_override("font_pressed_color", Color8(58, 42, 8))
b.add_theme_color_override("font_focus_color", Color8(58, 42, 8)) b.add_theme_color_override("font_focus_color", Color8(58, 42, 8))
b.add_theme_color_override("font_disabled_color", Color(Color8(58, 42, 8), BUTTON_GHOST_ALPHA))
if tip != "": if tip != "":
b.tooltip_text = tip b.tooltip_text = tip
return b return b
@@ -593,9 +634,16 @@ static func danger_button(text: String, tip := "", min_w := 216.0) -> Button:
var sb := panel_flat(Color8(180, 78, 54), Color8(110, 42, 28),RADIUS_OBJECT, 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("normal", sb)
b.add_theme_stylebox_override("hover", panel_flat(Color8(196, 90, 62), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))) 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_stylebox_override("pressed",
panel_flat(Color8(180, 78, 54).darkened(0.18), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("disabled",
panel_flat(Color(Color8(180, 78, 54), BUTTON_GHOST_ALPHA), Color(Color8(110, 42, 28), BUTTON_GHOST_ALPHA), RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", Color8(255, 244, 224)) 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_hover_color", Color8(255, 244, 224))
b.add_theme_color_override("font_pressed_color", Color8(255, 244, 224)) b.add_theme_color_override("font_pressed_color", Color8(255, 244, 224))
b.add_theme_color_override("font_focus_color", Color8(255, 244, 224))
b.add_theme_color_override("font_disabled_color", Color(Color8(255, 244, 224), BUTTON_GHOST_ALPHA))
if tip != "": if tip != "":
b.tooltip_text = tip b.tooltip_text = tip
return b return b
@@ -657,7 +705,7 @@ class BCard:
box.add_child(mark) box.add_child(mark)
# 图标槽(demo .ic 76×76 槽底+图标 60=20px 源 3 整数倍——P6 甲④ 2× 档升 3× 随 D1 对齐) # 图标槽(demo .ic 76×76 槽底+图标 60=20px 源 3 整数倍——P6 甲④ 2× 档升 3× 随 D1 对齐)
var slot := PanelContainer.new() var slot := PanelContainer.new()
slot.add_theme_stylebox_override("panel", UiKit.panel_flat(SLOT_BACKDROP, PANEL_BORDER, 0, 1)) slot.add_theme_stylebox_override("panel", UiKit.panel_flat(SLOT_BACKDROP_SOFT, PANEL_BORDER, 0, 1)) # 迭代 26 T5② 明度差降档(柔和档;白图标 ≥3:1 硬约束在役)
slot.custom_minimum_size = Vector2(76, 76) slot.custom_minimum_size = Vector2(76, 76)
slot.size_flags_horizontal = Control.SIZE_SHRINK_CENTER slot.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
box.add_child(slot) box.add_child(slot)
+1
View File
@@ -34,3 +34,4 @@ theme/custom_font="res://assets/fonts/ui_font_fusion_pixel_zh_hans.ttf"
renderer/rendering_method="gl_compatibility" renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility"
textures/canvas_textures/default_texture_filter=0
+191
View File
@@ -107,6 +107,11 @@ func _run_core_smoke(db, rng) -> void:
_smoke_playtest_logger() _smoke_playtest_logger()
_smoke_battle_log_view() _smoke_battle_log_view()
_smoke_global_theme() _smoke_global_theme()
_smoke_button_five_states()
_smoke_texture_filter()
_smoke_contrast_inks()
_smoke_element_details()
_smoke_diag_button_retired()
_smoke_encounter_roll() _smoke_encounter_roll()
_smoke_attack_chain_fresh_pool() _smoke_attack_chain_fresh_pool()
_smoke_clear_reward_chain() _smoke_clear_reward_chain()
@@ -5456,6 +5461,192 @@ func _smoke_global_theme() -> void:
tpanel.free(); tlabel.free(); cbx.free(); cbt.free(); pm.free(); ob.free(); lbl.free() tpanel.free(); tlabel.free(); cbx.free(); cbt.free(); pm.free(); ob.free(); lbl.free()
# ---- 按钮五态矩阵冒烟(迭代 26 T1——四工厂产物逐实例 override 断言;V1/V2)----
func _smoke_button_five_states() -> void:
print("--- UI 按钮五态矩阵(四工厂五态样式盒)---")
var uikit_s = load("res://presentation/views/ui_kit.gd")
var states := ["normal", "hover", "pressed", "disabled", "focus"]
# 普通钮(verb_button 同走 button() 打底——同断言覆盖)
var b = uikit_s.button("测试")
for st in states:
check(b.has_theme_stylebox_override(st), "V1 普通钮 %s 样式盒非空" % st)
var n_sb: StyleBox = b.get_theme_stylebox("normal")
var h_sb: StyleBox = b.get_theme_stylebox("hover")
var p_sb: StyleBox = b.get_theme_stylebox("pressed")
var d_sb: StyleBox = b.get_theme_stylebox("disabled")
var f_sb: StyleBox = b.get_theme_stylebox("focus")
check(n_sb is StyleBoxTexture and h_sb is StyleBoxTexture and d_sb is StyleBoxTexture,
"V1 普通钮 normal/hover/disabled 均为石纹九宫格贴图样式盒")
# 悬停=乙案:modulate 提亮(≠常态 WHITE——乙案判据)
var h_mod: Color = (h_sb as StyleBoxTexture).modulate_color
check(h_mod != Color.WHITE and h_mod.r > 1.0, "V1 普通钮 hover=modulate 提亮(乙案,异于常态 WHITE)")
# 禁用=甲案:本族底+α0.45 幽灵化
var d_mod: Color = (d_sb as StyleBoxTexture).modulate_color
check(is_equal_approx(d_mod.a, 0.45) and d_mod.r == 1.0 and d_mod.g == 1.0,
"V1 普通钮 disabled=本族底 α0.45 幽灵化(甲案)")
# 错配修正判据:disabled≠pressed(旧「禁用=按压图」)
check(d_sb != p_sb, "V1 普通钮 disabled≠pressed(旧错配已修正)")
# 焦点=甲案:INK 2px 内缩 1px 环、无底(叠加态不遮钮底)
check(f_sb is StyleBoxFlat, "V1 普通钮 focus 样式盒为扁平环(StyleBoxFlat)")
var fsb := f_sb as StyleBoxFlat
check(fsb.border_color == uikit_s.INK, "V1 焦点环色=INK(与 font_focus_color 同源)")
check(is_equal_approx(fsb.border_width_left, 2.0) and is_equal_approx(fsb.border_width_right, 2.0)
and is_equal_approx(fsb.border_width_top, 2.0) and is_equal_approx(fsb.border_width_bottom, 2.0),
"V1 焦点环宽=2px")
check(is_equal_approx(fsb.expand_margin_left, -1.0) and is_equal_approx(fsb.expand_margin_top, -1.0)
and is_equal_approx(fsb.expand_margin_right, -1.0) and is_equal_approx(fsb.expand_margin_bottom, -1.0),
"V1 焦点环内缩=1px")
check(not fsb.draw_center and fsb.bg_color.a < 0.001, "V1 焦点环无底(叠加态不遮钮底)")
b.free()
# 主钮:五态非空+本族平涂(pressed/disabled 非石纹)+disabled≠pressed+hover 提亮档承现行
var pb = uikit_s.primary_button("测试")
for st in states:
check(pb.has_theme_stylebox_override(st), "V1 主钮 %s 样式盒非空" % st)
var ppn: StyleBox = pb.get_theme_stylebox("pressed")
var pdd: StyleBox = pb.get_theme_stylebox("disabled")
var phv: StyleBox = pb.get_theme_stylebox("hover")
check(ppn is StyleBoxFlat and pdd is StyleBoxFlat, "V1 主钮 pressed/disabled=本族平涂(非石纹)")
check((ppn as StyleBoxFlat).bg_color == Color8(214, 172, 88), "V1 主钮 pressed=烛光黄深档(现行值不动)")
check(is_equal_approx((pdd as StyleBoxFlat).bg_color.a, 0.45), "V1 主钮 disabled=本族底 α0.45 幽灵化")
check(pdd != ppn, "V1 主钮 disabled≠pressed")
check((phv as StyleBoxFlat).bg_color == uikit_s.CANDLE.lightened(0.06), "V1 主钮 hover=提亮档(承现行不动)")
pb.free()
# 危险钮:补本族 pressed(深档)+disabled 幽灵化+focus;pressed/disabled 非石纹
var db = uikit_s.danger_button("测试")
for st in states:
check(db.has_theme_stylebox_override(st), "V1 危险钮 %s 样式盒非空" % st)
var dpr: StyleBox = db.get_theme_stylebox("pressed")
var dds: StyleBox = db.get_theme_stylebox("disabled")
check(dpr is StyleBoxFlat and dds is StyleBoxFlat, "V1 危险钮 pressed/disabled=本族平涂(非石纹,旧错配已修正)")
check((dpr as StyleBoxFlat).bg_color.r < 180.0 / 255.0, "V1 危险钮 pressed=深红深档(暗于常态)")
check(is_equal_approx((dds as StyleBoxFlat).bg_color.a, 0.45), "V1 危险钮 disabled=本族底 α0.45 幽灵化")
check(dds != dpr, "V1 危险钮 disabled≠pressed")
db.free()
# V2 主题红线维持(Button 类型词条零接触+focus 族词条零定义)——与 _smoke_global_theme 同判据复述
var th := ThemeDB.get_project_theme()
if th != null:
check(not th.get_type_list().has("Button"), "V2 红线维持 Button 类型词条零接触")
var focus_hits := ""
for t in th.get_type_list():
for nm in (th.get_stylebox_list(t) + th.get_icon_list(t) + th.get_color_list(t)
+ th.get_font_list(t) + th.get_font_size_list(t) + th.get_constant_list(t)):
if "focus" in String(nm):
focus_hits += "%s/%s " % [t, nm]
check(focus_hits == "", "V2 红线维持 focus 族词条零定义%s" % ("" if focus_hits == "" else "(违例:" + focus_hits + ")"))
# ---- 全局纹理过滤冒烟(迭代 26 T2——工程设置 Nearest+平滑渐变件 LINEAR 白名单;V3)----
func _smoke_texture_filter() -> void:
print("--- UI 全局纹理过滤(Nearest+白名单三件)---")
var v = ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter")
check(v != null and int(v) == 0, "V3 工程设置 default_texture_filter=0(Nearest,翻转面=立绘/瓦片/九宫格 crisp)")
var uikit_s = load("res://presentation/views/ui_kit.gd")
var vg = uikit_s.vignette_rect()
check(vg.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR, "V3 白名单在位:暗角 vignette 显式 LINEAR")
vg.free()
var bm = uikit_s.beams_rect()
check(bm.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR, "V3 白名单在位:光柱 beams 显式 LINEAR")
# T4 光柱连续 alpha 结构断言(观感归目检):带心峰值 0.05/带缘连续过渡/纵向衰减上亮下暗
var bimg: Image = bm.texture.get_image()
var max_a := 0.0
var mid_a := 0
var top_sum := 0.0
var bot_sum := 0.0
for y in 560:
for x in 560:
var pa := bimg.get_pixel(x, y).a
max_a = maxf(max_a, pa)
if pa > 0.001 and pa < 0.049:
mid_a += 1
if y < 280:
top_sum += pa
else:
bot_sum += pa
check(max_a >= 12.0 / 255.0 and max_a <= 0.05,
"T4 光柱带心峰值 α≈0.05(8bit 截断量化下限 12/255,实测 %.5f)" % max_a)
check(mid_a > 100, "T4 光柱带内连续 alpha 过渡像素 %d 个(旧零过渡硬边已修)" % mid_a)
check(top_sum > bot_sum * 2.0, "T4 光柱纵向衰减生效(上半亮度 %.0f > 下半 %.0f 的 2 倍——上亮下暗)" % [top_sum, bot_sum])
bm.free()
var gb = uikit_s.gradient_base(Color.BLACK, Color.WHITE)
check(gb.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR, "V3 白名单在位:地图渐变 gradient_base 显式 LINEAR")
gb.free()
# 既有显式 LINEAR 两处不丢(源码锚定——脚影/状态图标)
var bw_src: String = FileAccess.get_file_as_string("res://presentation/views/board_world.gd")
check(bw_src.contains("shadow.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR"),
"V3 脚影显式 LINEAR 不丢(board_world.gd)")
var ss_src: String = FileAccess.get_file_as_string("res://presentation/views/status_slot_row.gd")
check(ss_src.contains("icon.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR"),
"V3 状态图标显式 LINEAR 不丢(status_slot_row.gd)")
# ---- <4.5:1 文字位换墨冒烟(迭代 26 T3——站桩徽标两族亮档+RAP 行深石墨;V4)----
func _smoke_contrast_inks() -> void:
print("--- UI 残余 <4.5:1 文字位换墨(V4 对比度锚定)---")
var uikit_s = load("res://presentation/views/ui_kit.gd")
var stage: Color = uikit_s.STAGE_BG
var r_order := _theme_contrast(uikit_s.GOLD_BRIGHT, stage)
check(r_order >= 4.5, "V4 顺位徽标/重甲徽标 GOLD_BRIGHT 对舞台底 %.2f:1 ≥4.5:1" % r_order)
var r_ward := _theme_contrast(uikit_s.HERO_BLUE_BRIGHT, stage)
check(r_ward >= 4.5, "V4 魔法护甲徽标 HERO_BLUE_BRIGHT 对舞台底 %.2f:1 ≥4.5:1" % r_ward)
var r_rap := _theme_contrast(uikit_s.STONE_DEEP, uikit_s.PANEL_DATA)
check(r_rap >= 4.5, "V4 RAP 反馈行 STONE_DEEP 对数据板 %.2f:1 ≥4.5:1" % r_rap)
# 消费点源码锚定:新墨在位、旧裸用点清零、语义岗常量不动
var sb_src: String = FileAccess.get_file_as_string("res://presentation/views/standee_body.gd")
check(sb_src.contains("HORIZONTAL_ALIGNMENT_LEFT, -1, 13, UiKit.GOLD_BRIGHT"),
"V4 顺位徽标①②③ 墨=GOLD_BRIGHT(13px 行原位)")
check(sb_src.contains("col = UiKit.HERO_BLUE_BRIGHT"), "V4 魔法护甲徽标墨=HERO_BLUE_BRIGHT")
check(sb_src.contains("col = UiKit.GOLD_BRIGHT"), "V4 重甲徽标墨=GOLD_BRIGHT")
check(sb_src.contains("if _intent_col == UiKit.GOLD_DEEP:"),
"V4 GOLD_DEEP 语义岗不动(standee:199 意图动画判据)")
var ap_src: String = FileAccess.get_file_as_string("res://presentation/views/ap_bar_view.gd")
check(ap_src.contains('UiKit.label("",UiKit.FS_CAPTION, false, UiKit.STONE_DEEP)'),
"V4 RAP 反馈行墨=STONE_DEEP(原位行锚定)")
check(not ap_src.contains("STONE_FAINT"), "V4 RAP 反馈行旧墨 STONE_FAINT 清零(含注记面)")
# ---- 元素细节余②③冒烟(迭代 26 T5——BCard 图标槽明度差降档+商店居中+营地四栏等高)----
func _smoke_element_details() -> void:
print("--- UI 元素细节余②③(图标槽降档+布局修)---")
var uikit_s = load("res://presentation/views/ui_kit.gd")
# ②白图标 ≥3:1 图形对比硬约束(代拍板6)+降档方向锚定
var r_white := _theme_contrast(Color.WHITE, uikit_s.SLOT_BACKDROP_SOFT)
check(r_white >= 3.0, "T5② BCard 图标槽白图标对比 %.2f:1 ≥3:1(硬约束)" % r_white)
var r_new := _theme_contrast(uikit_s.SLOT_BACKDROP_SOFT, uikit_s.PANEL_DATA)
var r_old := _theme_contrast(uikit_s.SLOT_BACKDROP, uikit_s.PANEL_DATA)
check(r_new < r_old, "T5② 明度差降档生效(槽对卡面 %.2f:1 < 旧 %.2f:1)" % [r_new, r_old])
var uk_src: String = FileAccess.get_file_as_string("res://presentation/views/ui_kit.gd")
check(uk_src.contains("UiKit.panel_flat(SLOT_BACKDROP_SOFT, PANEL_BORDER, 0, 1)"),
"T5② BCard 图标槽落柔和档(SLOT_BACKDROP_SOFT)")
var ss_src: String = FileAccess.get_file_as_string("res://presentation/views/status_slot_row.gd")
check(ss_src.contains("UiKit.SLOT_BACKDROP"), "T5② B 区状态图标槽仍用深档(SLOT_BACKDROP,未误伤)")
# ③布局修源码锚定
var shop_src: String = FileAccess.get_file_as_string("res://presentation/views/shop_overlay_view.gd")
check(shop_src.contains("_cards_box.alignment = BoxContainer.ALIGNMENT_CENTER"),
"T5③ 商店卡片区垂直居中(ALIGNMENT_CENTER)")
var camp_src: String = FileAccess.get_file_as_string("res://presentation/views/camp_overlay_view.gd")
var camp_min := camp_src.count("custom_minimum_size = Vector2(0, 336)")
check(camp_min == 3, "T5③ 营地三 holder 统一 min 高 336(实测 %d 处)" % camp_min)
var camp_fill := camp_src.count("size_flags_vertical = Control.SIZE_FILL")
check(camp_fill == 4, "T5③ 营地四栏面板纵向 FILL 等高(实测 %d 处)" % camp_fill)
check(camp_src.count("SIZE_SHRINK_CENTER") >= 3, "T5③ 三处锁文垂直居中在位")
# ---- 诊断转储钮退役冒烟(迭代 26 T5b——角落钮退出玩家画面+转储入口迁调试浮窗;V6)----
func _smoke_diag_button_retired() -> void:
print("--- UI 诊断转储钮退役(V6:玩家画面清零+浮窗可达)---")
var main_src: String = FileAccess.get_file_as_string("res://presentation/main.gd")
check(not main_src.contains("build_diag_button"), "V6 主区无 build_diag_button 调用残留(旧实现同批清理)")
check(main_src.contains("debug_overlay.diagnose_requested.connect(_on_diagnose_pressed)"),
"V6 转储入口连接随迁(组合根接浮窗 diagnose_requested 信号)")
check(main_src.contains("func _on_diagnose_pressed()"), "V6 转储编排承接函数在位(dump_diagnosis 卡死取证保留)")
var asm_src: String = FileAccess.get_file_as_string("res://presentation/ui_assembler.gd")
check(not asm_src.contains("build_diag_button"), "V6 build_diag_button 工厂已退役(ui_assembler 零残留)")
var dbg_src: String = FileAccess.get_file_as_string("res://presentation/views/debug_overlay.gd")
check(dbg_src.contains("signal diagnose_requested"), "V6 调试浮窗 diagnose_requested 信号在位")
check(dbg_src.contains("_emit_diagnose_requested"), "V6 浮窗转储钮外发方法在位(纯视图边界)")
check(dbg_src.contains('UiKit.button("转储")'), "V6 浮窗诊断转储钮在位(玩家画面角落钮清零后唯一入口)")
# ---- 存档序列化冒烟(SaveManager——读写往返/新档合法/余额拒花/锻造出域拒/高版本拒读禁写/ # ---- 存档序列化冒烟(SaveManager——读写往返/新档合法/余额拒花/锻造出域拒/高版本拒读禁写/
# 损坏兜底/迁移链/域界干净/摘要 cap/摘要集成/生涯终身计数域 v6)。测试文件统一 user://smoke_save_*.json 隔离, # 损坏兜底/迁移链/域界干净/摘要 cap/摘要集成/生涯终身计数域 v6)。测试文件统一 user://smoke_save_*.json 隔离,
# 段首清场+段尾清理——绝不碰 user://save.json(红线)。 # 段首清场+段尾清理——绝不碰 user://save.json(红线)。
+6 -5
View File
@@ -23,10 +23,11 @@ const _OVERLAY_READONLY_SIGNALS: Array[String] = [
"text_changed", "text_submitted", "value_changed", "item_selected", "text_changed", "text_submitted", "value_changed", "item_selected",
"gui_input", "focus_entered", "focus_exited", "closed", "gui_input", "focus_entered", "focus_exited", "closed",
] ]
# 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/关闭/滑条联动——全部视图自身信号外发前置, # 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/诊断转储/关闭/滑条联动——全部视图自身信号外发前置,
# 零跨对象写;清单外任何新连接一律红须入册) # 零跨对象写;清单外任何新连接一律红须入册)
const _OVERLAY_VIEW_METHODS: Array[String] = ["_on_fx_toggle", "_apply_btn_pressed", "_reset_btn_pressed", const _OVERLAY_VIEW_METHODS: Array[String] = ["_on_fx_toggle", "_apply_btn_pressed", "_reset_btn_pressed",
"_emit_simulate_requested", "_emit_debug_levels", "_emit_closed", "_on_slider_value_changed"] "_emit_simulate_requested", "_emit_debug_levels", "_emit_diagnose_requested", "_emit_closed",
"_on_slider_value_changed"]
func _ready() -> void: func _ready() -> void:
@@ -194,7 +195,7 @@ func _ready() -> void:
# 只读巡检(18卡⑦ T3——17卡③「白名单外零连接」形制沿用):浮窗子树全控件 × 游戏语义信号名清单 # 只读巡检(18卡⑦ T3——17卡③「白名单外零连接」形制沿用):浮窗子树全控件 × 游戏语义信号名清单
# 全连接巡检——白名单={视图自身七方法 + 组合根 _on_modal_closed(closed 外发消费)}; # 全连接巡检——白名单={视图自身八方法 + 组合根 _on_modal_closed(closed 外发消费)};
# 当局数据区块=纯标签零连接在此被一并约束(新增任何连接=红须入册审查)。 # 当局数据区块=纯标签零连接在此被一并约束(新增任何连接=红须入册审查)。
func _overlay_readonly_contract(main: Node, problems: Array) -> void: func _overlay_readonly_contract(main: Node, problems: Array) -> void:
var overlay: Control = main.debug_overlay var overlay: Control = main.debug_overlay
@@ -216,8 +217,8 @@ func _overlay_readonly_contract(main: Node, problems: Array) -> void:
% [n.name, sig_name, host, m]) % [n.name, sig_name, host, m])
for ch in n.get_children(): for ch in n.get_children():
stack.append(ch) stack.append(ch)
if conn_count != 10: if conn_count != 11:
problems.append("[readonly] 信号连接数=%d 应=10(fx切换/应用/重置/模拟/两层调试/关闭六钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count) problems.append("[readonly] 信号连接数=%d 应=11(fx切换/应用/重置/模拟/两层调试/诊断转储/关闭七钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count)
# 零动效契约(17卡③ R5 形制——子树零 AnimationPlayer + 视图源码零 tween/动效包装调用) # 零动效契约(17卡③ R5 形制——子树零 AnimationPlayer + 视图源码零 tween/动效包装调用)
+1 -1
View File
@@ -82,7 +82,7 @@
| 迭代 23 | **锻造工坊实装批(2026-10-12 用户令编入——设计面 v0.6 就绪)**:按 [锻造工坊](design/gdd/systems/跨局循环/锻造工坊.md) **v0.6** 设计权威文档实装——迁移面:①新建锻造路线行族(现役 `meta.tres` forge_products 已随迭代 21 T5 退役、无改造对象;钥石定价历史考古 20/150%、投值归 M4)②两根类型轴所有权移交(默认值归锻造工坊配置常驻持有、hero.tres 静态表两轴删除、选中态写存档域+冒险开始参数面注入)③存档域 forge_routes(已预登记存档序列化.md v7 计划行)④满级特效本期不实装(只留扩展位)⑤敌方 attack_type 填值归敌人系统/战斗结算侧(非本批——敌方定义数据、与名字血量同时读写、无独立时序)⑥术语登记(v0.6 已做完:术语表+registry)⑦数值验证义务=改前/改后同种子配对读数。解锁通道=并联双通道;一次冒险=一武器类型+一甲型。**✅ 已全批入库(2026-10-12,/goal+iter U0 开工单会话交付——worktree g-plan2-iter23-forge 七提交;T1 行族+T2 两轴移交+T3 写口族+T5 存档 v7(序调先行)+T4 注入链+T6 工作间 UI+T7 收口;冒烟 938/0+run_all 24 套+probe click/full+render_gate+doc 三闸/熵增对基线零新增+MC 同种子配对零漂移;实现报告=design/qa/iter23-实现报告-2026-10-12.md;残留人闸=实机目检工作间形态与购买交互〔07 在册〕;代拍板追认单+GDD 反哺点待用户)** | ✅ 已入库(出口闸全绿+实机目检归用户 07 在册) | 估时随需求卡片立项(实际单会话) | | 迭代 23 | **锻造工坊实装批(2026-10-12 用户令编入——设计面 v0.6 就绪)**:按 [锻造工坊](design/gdd/systems/跨局循环/锻造工坊.md) **v0.6** 设计权威文档实装——迁移面:①新建锻造路线行族(现役 `meta.tres` forge_products 已随迭代 21 T5 退役、无改造对象;钥石定价历史考古 20/150%、投值归 M4)②两根类型轴所有权移交(默认值归锻造工坊配置常驻持有、hero.tres 静态表两轴删除、选中态写存档域+冒险开始参数面注入)③存档域 forge_routes(已预登记存档序列化.md v7 计划行)④满级特效本期不实装(只留扩展位)⑤敌方 attack_type 填值归敌人系统/战斗结算侧(非本批——敌方定义数据、与名字血量同时读写、无独立时序)⑥术语登记(v0.6 已做完:术语表+registry)⑦数值验证义务=改前/改后同种子配对读数。解锁通道=并联双通道;一次冒险=一武器类型+一甲型。**✅ 已全批入库(2026-10-12,/goal+iter U0 开工单会话交付——worktree g-plan2-iter23-forge 七提交;T1 行族+T2 两轴移交+T3 写口族+T5 存档 v7(序调先行)+T4 注入链+T6 工作间 UI+T7 收口;冒烟 938/0+run_all 24 套+probe click/full+render_gate+doc 三闸/熵增对基线零新增+MC 同种子配对零漂移;实现报告=design/qa/iter23-实现报告-2026-10-12.md;残留人闸=实机目检工作间形态与购买交互〔07 在册〕;代拍板追认单+GDD 反哺点待用户)** | ✅ 已入库(出口闸全绿+实机目检归用户 07 在册) | 估时随需求卡片立项(实际单会话) |
| 迭代 24 | **①敌人表内容修批(三关)(2026-10-13 用户令编入;**本迭代位预留后续追加卡**——用户将把其他需求陆续编入本迭代)**:需求卡片=`design/research/需求卡片-敌人表内容修批-2026-10-13.md`(**v1.1**——grilling 复核九问 Q1-Q9 已全裁、零待裁点、开工门=U0)。三件事合一:**N1** 第一关 (1,2) 降档(`enemy.tres:48` 改两值:`hp` 50→22、`armor_class` 3→2;**敌种 `bugbear` 不动**——`enemy.tres:594-600` 注释载明该行 50 血系 2026-09-24 用户裁决的设计而非填错,且 `hobgoblin` 无立绘,故「改敌种」案已否决;本批定性=阶名化解方案实机未达预期按 2026-10-13 体验反馈重裁)· **N2** 第二/三关普通敌技能投放(`skills.tres` 12→14 行:新增 `venom_spit` 毒吐 damage 1.6/CD2 挂 (2,5)/(2,6)/(2,7) 巨蜘蛛族、`shield_bash` 盾击 damage 1.7/CD3 挂 (3,0)/(3,5)/(3,7) 灰矮人族;**首遇教学位 (2,4) 池不动**,venom_spit 自 (2,5) 起投;两新行均不带 `rider_mult`——低 atk 下恒被 `damage_floor` 兜成 1 与 0.75 档等效)· **N3** 敌方 `attack_type` 加列并全填 `normal`(挂**敌种行**、20 行同值,不做差异化;`enemy_table.gd` 加枚举校验 + `unit_container.gd:119` 加单位快照 + `battle_orchestrator.gd:1406` 第 9 参由 `""` 改传值;全局平移=穿重甲受伤 −1 / 魔法护甲 +1 / 轻甲 0,使锻造甲路线首次具备战斗意义)。**契约要点**:池与敌种键属**契约级**,改必同步 `smoke_all.gd:3211` `expect_pools`(N1 因键值不变零改动、N2 同步 6 键);节点图拓扑零触碰(A1 关卡节点图重构的地盘);(1,1) 地精一伙不在本批范围(「第二个节点」字面偏差已登记 06)。**收口去向**:06「第一关遭遇表数值异常」「第二关技能池与投放」与锻造工坊条迁移面⑥ 三条一并销号;08「二·内容量」敌种池行注摘除 | ✅ 已入库(2026-10-13 单会话交付,出口闸全绿:冒烟 949/0+run_all 25 套〔485 批基线漂移 24→25 在案〕+探针 click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增+MC 配对三组读数;实现报告=design/qa/iter24-实现报告-2026-10-13.md;残留人闸=实机目检三观测 07 ㉓) | | 迭代 24 | **①敌人表内容修批(三关)(2026-10-13 用户令编入;**本迭代位预留后续追加卡**——用户将把其他需求陆续编入本迭代)**:需求卡片=`design/research/需求卡片-敌人表内容修批-2026-10-13.md`(**v1.1**——grilling 复核九问 Q1-Q9 已全裁、零待裁点、开工门=U0)。三件事合一:**N1** 第一关 (1,2) 降档(`enemy.tres:48` 改两值:`hp` 50→22、`armor_class` 3→2;**敌种 `bugbear` 不动**——`enemy.tres:594-600` 注释载明该行 50 血系 2026-09-24 用户裁决的设计而非填错,且 `hobgoblin` 无立绘,故「改敌种」案已否决;本批定性=阶名化解方案实机未达预期按 2026-10-13 体验反馈重裁)· **N2** 第二/三关普通敌技能投放(`skills.tres` 12→14 行:新增 `venom_spit` 毒吐 damage 1.6/CD2 挂 (2,5)/(2,6)/(2,7) 巨蜘蛛族、`shield_bash` 盾击 damage 1.7/CD3 挂 (3,0)/(3,5)/(3,7) 灰矮人族;**首遇教学位 (2,4) 池不动**,venom_spit 自 (2,5) 起投;两新行均不带 `rider_mult`——低 atk 下恒被 `damage_floor` 兜成 1 与 0.75 档等效)· **N3** 敌方 `attack_type` 加列并全填 `normal`(挂**敌种行**、20 行同值,不做差异化;`enemy_table.gd` 加枚举校验 + `unit_container.gd:119` 加单位快照 + `battle_orchestrator.gd:1406` 第 9 参由 `""` 改传值;全局平移=穿重甲受伤 −1 / 魔法护甲 +1 / 轻甲 0,使锻造甲路线首次具备战斗意义)。**契约要点**:池与敌种键属**契约级**,改必同步 `smoke_all.gd:3211` `expect_pools`(N1 因键值不变零改动、N2 同步 6 键);节点图拓扑零触碰(A1 关卡节点图重构的地盘);(1,1) 地精一伙不在本批范围(「第二个节点」字面偏差已登记 06)。**收口去向**:06「第一关遭遇表数值异常」「第二关技能池与投放」与锻造工坊条迁移面⑥ 三条一并销号;08「二·内容量」敌种池行注摘除 | ✅ 已入库(2026-10-13 单会话交付,出口闸全绿:冒烟 949/0+run_all 25 套〔485 批基线漂移 24→25 在案〕+探针 click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增+MC 配对三组读数;实现报告=design/qa/iter24-实现报告-2026-10-13.md;残留人闸=实机目检三观测 07 ㉓) |
| 迭代 25 | **①UI 全局主题批(引擎原生控件接管皮肤)(2026-10-13 用户令编入;UI 美化三层诊断 · 第一层第一条)**:**✅ 已全批入库(2026-10-13 /goal+iter U0 开工单会话交付,worktree g-plan2-iter25-theme 分支 iter25-theme-20261013)**——**T0 主题资源**:新建 `game/assets/theme/main_theme.tres` 挂 `project.godot` `gui/theme/custom`(15 类型全覆盖:V/HScrollBar·ScrollContainer·H/VSlider·TooltipPanel/Label·LineEdit·SpinBox·H/VSeparator + 预盖 CheckBox/CheckButton/OptionButton/PopupMenu 弹层;`default_font` 显式指向现役同字体文件=V6 中文字形防御;位图由 `tools/gen_theme_icons.py` 一次性生成落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1 换代退役**:`ui_kit.gd` 的 `tooltip_theme()`/`_tip_theme` 与 `styled_slider()` 样式段、`ui_assembler.gd` 挂载行同批删除(禁新旧并存),settings_overlay 几何内联+debug_overlay `_slider_row` 双轨消隐· **T2 断言与文档同步闸**:冒烟新增 V1-V6 主题词条断言 38 条。**顺手销号**=06 第三层「UI 元素细节修」之①(音量滑轨两段对比度重配=已填充段 BG_ROOT #3A2E22 对暖石 #B8A582 实测 5.49:1)。**契约遵守**:🔴 Button 类型词条零接触(冒烟断言在闸)· 🔴 focus 族词条零定义(全主题扫描断言)· 🔴 零新增美术素材(位图=脚本生成纯色/几何)· 🔴 全局纹理过滤未动。**引擎事实订正(呈报追认)**:Godot 4.7.2 源码+默认主题链双查实证——①CheckButton 图标词条名与 CheckBox 同套 `checked`/`unchecked`(卡片 v1.2 注③「CheckButton 用 on/off」不成立,按引擎事实落位)②Slider 无 `grabber_pressed` 图标槽(冻结表「柄·按」值 GOLD_DEEP 留档未落位)③ScrollBar 柄是 StyleBox 非 Icon(无需位图)④4.7 导入参数已无逐贴图 filter 标志(位图原生尺寸消费无滤波伪影)。**闸**:冒烟 987/0(基线 949+本批 38 断言)+run_all 25 套+probe click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现)。**收口去向**:06「UI 全局主题资源缺失」条移除+「UI 元素细节修」①销号;08 升 v1.3(三·界面主题行→在役、五·表现细节修行注①销号);07 ㉔ 全屏巡检登记;实现报告=design/qa/iter25-实现报告-2026-10-13.md。**待用户**:实机目检全屏巡检+专项观察点二(07 ㉔,登记不阻塞)+代拍板追认单(位图不入 git 政策口径/CheckButton 词条名订正等)+GDD 反哺点(组件规格是否立条款入 art-bible §7 等)。↓ 原任务登记:三件事合一——**T0** 新建 `game/assets/theme/main_theme.tres` 并挂 `project.godot` 的 `gui/theme/custom`,覆盖滚动条 / 滑轨 / 悬停气泡 / 输入件 / 分隔线等引擎原生控件,并预盖 CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu(须在新主题内显式设 `default_font`=现役同一字体文件;新增小位图落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1** 退役 `ui_kit.gd` 的 `tooltip_theme()` 与 `styled_slider()` 两处局部做法、消 `debug_overlay._slider_row` 双轨(🔴 旧实现同批删除)· **T2** 断言与文档同步闸。契约要点:🔴 Button 类型词条零接触 · 🔴 focus 族词条零定义 · 🔴 不新增美术素材、不改美术圣经 §7 · 🔴 全局纹理过滤不动 | ✅ 已入库(出口闸全绿+实机目检归用户 07 ㉔ 在册) | T0-T2≈0.5–1d(实际单会话) | | 迭代 25 | **①UI 全局主题批(引擎原生控件接管皮肤)(2026-10-13 用户令编入;UI 美化三层诊断 · 第一层第一条)**:**✅ 已全批入库(2026-10-13 /goal+iter U0 开工单会话交付,worktree g-plan2-iter25-theme 分支 iter25-theme-20261013)**——**T0 主题资源**:新建 `game/assets/theme/main_theme.tres` 挂 `project.godot` `gui/theme/custom`(15 类型全覆盖:V/HScrollBar·ScrollContainer·H/VSlider·TooltipPanel/Label·LineEdit·SpinBox·H/VSeparator + 预盖 CheckBox/CheckButton/OptionButton/PopupMenu 弹层;`default_font` 显式指向现役同字体文件=V6 中文字形防御;位图由 `tools/gen_theme_icons.py` 一次性生成落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1 换代退役**:`ui_kit.gd` 的 `tooltip_theme()`/`_tip_theme` 与 `styled_slider()` 样式段、`ui_assembler.gd` 挂载行同批删除(禁新旧并存),settings_overlay 几何内联+debug_overlay `_slider_row` 双轨消隐· **T2 断言与文档同步闸**:冒烟新增 V1-V6 主题词条断言 38 条。**顺手销号**=06 第三层「UI 元素细节修」之①(音量滑轨两段对比度重配=已填充段 BG_ROOT #3A2E22 对暖石 #B8A582 实测 5.49:1)。**契约遵守**:🔴 Button 类型词条零接触(冒烟断言在闸)· 🔴 focus 族词条零定义(全主题扫描断言)· 🔴 零新增美术素材(位图=脚本生成纯色/几何)· 🔴 全局纹理过滤未动。**引擎事实订正(呈报追认)**:Godot 4.7.2 源码+默认主题链双查实证——①CheckButton 图标词条名与 CheckBox 同套 `checked`/`unchecked`(卡片 v1.2 注③「CheckButton 用 on/off」不成立,按引擎事实落位)②Slider 无 `grabber_pressed` 图标槽(冻结表「柄·按」值 GOLD_DEEP 留档未落位)③ScrollBar 柄是 StyleBox 非 Icon(无需位图)④4.7 导入参数已无逐贴图 filter 标志(位图原生尺寸消费无滤波伪影)。**闸**:冒烟 987/0(基线 949+本批 38 断言)+run_all 25 套+probe click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现)。**收口去向**:06「UI 全局主题资源缺失」条移除+「UI 元素细节修」①销号;08 升 v1.3(三·界面主题行→在役、五·表现细节修行注①销号);07 ㉔ 全屏巡检登记;实现报告=design/qa/iter25-实现报告-2026-10-13.md。**待用户**:实机目检全屏巡检+专项观察点二(07 ㉔,登记不阻塞)+代拍板追认单(位图不入 git 政策口径/CheckButton 词条名订正等)+GDD 反哺点(组件规格是否立条款入 art-bible §7 等)。↓ 原任务登记:三件事合一——**T0** 新建 `game/assets/theme/main_theme.tres` 并挂 `project.godot` 的 `gui/theme/custom`,覆盖滚动条 / 滑轨 / 悬停气泡 / 输入件 / 分隔线等引擎原生控件,并预盖 CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu(须在新主题内显式设 `default_font`=现役同一字体文件;新增小位图落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1** 退役 `ui_kit.gd` 的 `tooltip_theme()` 与 `styled_slider()` 两处局部做法、消 `debug_overlay._slider_row` 双轨(🔴 旧实现同批删除)· **T2** 断言与文档同步闸。契约要点:🔴 Button 类型词条零接触 · 🔴 focus 族词条零定义 · 🔴 不新增美术素材、不改美术圣经 §7 · 🔴 全局纹理过滤不动 | ✅ 已入库(出口闸全绿+实机目检归用户 07 ㉔ 在册) | T0-T2≈0.5–1d(实际单会话) |
| 迭代 26 | **①UI 交互与观感批(2026-10-14 用户令编入;UI 美化三层诊断 · 第一层第二/三条+第三层四件;本迭代位预留后续追加卡,同迭代 24 先例)**:需求卡片=`design/research/需求卡片-UI交互与观感批-2026-10-13.md`(**v1.2**——grilling 两轮八裁全落、零待裁点、卡片成立)。六项:**T1 按钮五态矩阵**(悬停=乙案 modulate 提亮〔与 primary_button 现行 `CANDLE.lightened(0.06)` 同纪律〕/禁用=本族底+α0.45 幽灵化/焦点=INK 2px 内缩 1px/危险钮补本族 pressed;走逐实例 override,迭代 25 两条主题红线断言维持不换代)· **T2 全局纹理过滤**(`project.godot` `default_texture_filter=0`+vignette/gradient_base/beams 显式 LINEAR 白名单+翻转面全枚举)· **T3 <4.5:1 换墨**(站桩顺位/护甲徽标换同族亮档+RAP 行 STONE_DEEP,机检断言锚定)· **T4 光柱连续 alpha 渐变**(0→0.05→0 横向+纵向衰减)· **T5 元素细节余②③**(BCard 图标槽明度差降档/商店卡片区垂直居中/营地四栏等高)· **T5b 诊断转储钮移调试浮窗**(`dump_diagnosis` 功能保留)。🔴 契约 5 条(主题层零新增词条/零新美术素材/棋盘零触碰/对比度 ≥4.5:1/旧实现同批清理);验证闸 V1-V7;代拍板白名单八项;反哺点四条;**渲染闸 golden 面处置**=T6 第 4 步(徽标换墨落 board golden 裁剪区:闸红→核热区限预期面→显式重制基线+呈报→复闸,超预期=L3)。**范围订正**(grilling 实查,iter25 滑轨条同款先例):②垫块仅三选一 BCard(商店卡实为纯文字行卡)/③仅商店+营地(三选一已居中)/危险钮「无按下态」订正为「在但皮肤错配」。估时 T0-T6≈2–2.5d | **已编入待开工**(2026-10-14 用户令;开工门=U0——用户新会话 /iter 26 四检发令) | T0-T6≈2–2.5d | | 迭代 26 | **①UI 交互与观感批(2026-10-14 用户令编入;UI 美化三层诊断 · 第一层第二/三条+第三层四件;本迭代位预留后续追加卡,同迭代 24 先例)**:需求卡片=`design/research/需求卡片-UI交互与观感批-2026-10-13.md`(**v1.2**——grilling 两轮八裁全落、零待裁点、卡片成立)。六项:**T1 按钮五态矩阵**(悬停=乙案 modulate 提亮〔与 primary_button 现行 `CANDLE.lightened(0.06)` 同纪律〕/禁用=本族底+α0.45 幽灵化/焦点=INK 2px 内缩 1px/危险钮补本族 pressed;走逐实例 override,迭代 25 两条主题红线断言维持不换代)· **T2 全局纹理过滤**(`project.godot` `default_texture_filter=0`+vignette/gradient_base/beams 显式 LINEAR 白名单+翻转面全枚举)· **T3 <4.5:1 换墨**(站桩顺位/护甲徽标换同族亮档+RAP 行 STONE_DEEP,机检断言锚定)· **T4 光柱连续 alpha 渐变**(0→0.05→0 横向+纵向衰减)· **T5 元素细节余②③**(BCard 图标槽明度差降档/商店卡片区垂直居中/营地四栏等高)· **T5b 诊断转储钮移调试浮窗**(`dump_diagnosis` 功能保留)。🔴 契约 5 条(主题层零新增词条/零新美术素材/棋盘零触碰/对比度 ≥4.5:1/旧实现同批清理);验证闸 V1-V7;代拍板白名单八项;反哺点四条;**渲染闸 golden 面处置**=T6 第 4 步(徽标换墨落 board golden 裁剪区:闸红→核热区限预期面→显式重制基线+呈报→复闸,超预期=L3)。**范围订正**(grilling 实查,iter25 滑轨条同款先例):②垫块仅三选一 BCard(商店卡实为纯文字行卡)/③仅商店+营地(三选一已居中)/危险钮「无按下态」订正为「在但皮肤错配」。估时 T0-T6≈2–2.5d | **✅ 已全批入库(2026-10-14 /goal+iter U0 开工单会话交付,worktree g-plan2-iter26-ui 分支 iter26-ui-20261014 七提交)**——T0 基线+枚举(含卡片 §2.2 枚举漏项勘误)/T1 按钮五态(悬停 modulate 提亮/禁用 α0.45 幽灵化/焦点 INK 2px 内缩 1px/危险钮本族按压态)/T2 全局 Nearest+平滑渐变件 LINEAR 白名单/T3 三处换墨(GOLD_BRIGHT/HERO_BLUE_BRIGHT/STONE_DEEP,6.47/5.88/5.98:1)/T4 光柱连续 alpha/T5 图标槽柔和档+商店居中+营地四栏等高/T5b 诊断钮迁调试浮窗;冒烟 987→1055/0(+68 断言)+run_all 25 套+probe click/full+render_gate golden 0.00%(登记即结未重制)+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现);实现报告=design/qa/iter26-实现报告-2026-10-14.md;残留人闸=实机目检五项(07 ㉕);待用户=代拍板追认单十三项+GDD 反哺点四条 | T0-T6≈2–2.5d(实际单会话) |
| 迭代 27+ | **M4 数值批(**原 22+;迭代 21 已编入天赋树实装批、迭代 22 已编入秘宝实装批(均 2026-10-11 用户令)、迭代 23 已编入锻造工坊实装批(2026-10-12 用户令)**;迭代 24 已由用户令编入敌人表内容修批、迭代 25 已由用户令编入 UI 全局主题批(2026-10-13)、迭代 26 已由用户令编入 UI 交互与观感批(2026-10-14),本批顺延 27+**——**Alpha 收官位·未排期**〔2026-10-09 语义换代:M4=Beta 阶段、非 Alpha 收官位,M3 未由用户明令关闭前不排期维持〕——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(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`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d) | | 迭代 27+ | **M4 数值批(**原 22+;迭代 21 已编入天赋树实装批、迭代 22 已编入秘宝实装批(均 2026-10-11 用户令)、迭代 23 已编入锻造工坊实装批(2026-10-12 用户令)**;迭代 24 已由用户令编入敌人表内容修批、迭代 25 已由用户令编入 UI 全局主题批(2026-10-13)、迭代 26 已由用户令编入 UI 交互与观感批(2026-10-14),本批顺延 27+**——**Alpha 收官位·未排期**〔2026-10-09 语义换代:M4=Beta 阶段、非 Alpha 收官位,M3 未由用户明令关闭前不排期维持〕——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(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`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d) |
## 执行纪律(2026-09-27 用户立规) ## 执行纪律(2026-09-27 用户立规)