diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 32912c1e..9ab22f59 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -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 美化三层诊断 · 第一层) @@ -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 美化三层诊断转立本清单专条) @@ -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 美化三层诊断 · 第三层) @@ -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 成文,待裁) @@ -64,7 +64,20 @@ **指针**:`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 登记) @@ -410,7 +423,7 @@ **归属**:呈现优化后续批(或 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 阶段需完成) diff --git a/design/gdd/07-体验验证清单.md b/design/gdd/07-体验验证清单.md index bcdb8686..91b98372 100644 --- a/design/gdd/07-体验验证清单.md +++ b/design/gdd/07-体验验证清单.md @@ -234,6 +234,15 @@ - **预盖件无实役(登记注记)**:CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu 游戏零使用,本批仅预盖(冒烟 V3 已有运行时证词)——无需目检,备案待未来批次启用时复查。 - 验证方式:用户实机目检(登记不阻塞——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 重锚入库后补算终值。 @@ -254,3 +263,4 @@ | v0.6 | 2026-10-12 | 新增 ㉒ 锻造工坊工作间形态与购买交互目检节(迭代 23 锻造工坊实装批随批登记——V13 人闸观测项:门与形态/购买/解锁双通道/选中与锁死/注入抽查) | | v0.7 | 2026-10-13 | 新增 ㉓ 敌人表内容修批三观测目检节(迭代 24 卡①随批登记:新招可见性/甲型体感/第一关节奏——登记不阻塞按 2026-10-12 真人检测立规) | | v0.8 | 2026-10-13 | 新增 ㉔ UI 全局主题批全屏巡检目检节(迭代 25 卡①随批登记:引擎默认灰清零巡检/音量滑轨两段可辨/专项观察点二(滑轨柄抢焦点·滚动条槽可见性)/预盖件无实役注记——登记不阻塞;能力验证半=冒烟 V1-V6) | +| v0.9 | 2026-10-14 | 新增 ㉕ UI 交互与观感批逐屏巡检目检节(迭代 26 卡①随批登记:按钮五态反馈/键盘焦点环/全局 Nearest 巡检(含暗角与渐变白名单判据)/布局均衡(商店居中+营地四栏等高)/诊断钮清零——登记不阻塞;能力验证半=冒烟 V1-V6+T4 结构断言) | diff --git a/design/gdd/08-Alpha版本标准.md b/design/gdd/08-Alpha版本标准.md index f57a5cb4..683c3870 100644 --- a/design/gdd/08-Alpha版本标准.md +++ b/design/gdd/08-Alpha版本标准.md @@ -115,7 +115,7 @@ | 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 | | 调试浮窗 | —— | 在役 | | 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) | 在役 | | 站桩帧动画 | [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-bible.md) §7.4 | 待做 | | 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 待做 | -| UI 氛围层与九宫格切片观感修 | [06-待办清单](06-待办清单.md) | 待做 | -| UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [06-待办清单](06-待办清单.md) | 待做(①滑轨填充已销号=迭代 25 全局主题批两段对比度重配;余②③④) | +| UI 氛围层与九宫格切片观感修 | [06-待办清单](06-待办清单.md) | 部分在役(迭代 26 · 2026-10-14:光柱硬边半已修=连续 alpha 渐变;九宫格切片错位半未结——待素材尺寸核对,属美术线连带面) | +| 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.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.4 | 2026-10-14 | **UI 交互与观感批收口回填(迭代 26 卡①机械面随批)**:「三 · 界面」表「UI 按钮状态矩阵」行 待做→在役(五态矩阵补齐);「五 · 表现」表三行——「全局纹理过滤设为邻近采样」待做→在役、「UI 氛围层与九宫格切片观感修」待做→部分在役(光柱半已修,九宫格半未结注明)、「UI 元素细节修」待做(余②③④)→在役(②③④全落地);06 对应四条销号或改写+反哺点四条新条登记(待用户裁决另批落文);条目集合零增删,未决项与「六 · Alpha 不含」零触碰 | diff --git a/design/qa/iter26-实现报告-2026-10-14.md b/design/qa/iter26-实现报告-2026-10-14.md new file mode 100644 index 00000000..28ac6d5e --- /dev/null +++ b/design/qa/iter26-实现报告-2026-10-14.md @@ -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 微调(调宽/内缩/衰减梯度,不动色系不动主题层)。 diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 2267c49d..5a0c2d7e 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -330,19 +330,18 @@ func _build_ui() -> void: _inter_label = inter.label inter.next_btn.pressed.connect(_on_inter_next_pressed) - var diag_btn := UiAssembler.build_diag_button(self) - diag_btn.pressed.connect(_on_diagnose_pressed) - - # 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层/诊断钮之后 = 子级最末 + # 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层之后 = 子级最末 #(T3 收口批——「登记序 = 树序 = z 序」纪律复位,confirm_dialog.open 的 move_child 运行时自提 - # 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上) + # 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上。原诊断转储角落钮随迭代 26 T5b 退役, + # 转储入口迁调试浮窗——grilling Q8 裁甲) confirm_dialog = ConfirmDialog.new() add_child(confirm_dialog) confirm_dialog.confirmed.connect(_on_confirm_new_adventure) confirm_dialog.cancelled.connect(_on_confirm_cancelled) # 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口; - # 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕)。 + # 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕; + # 迭代 26 T5b——诊断转储入口并入(原主画面左下角常驻钮退役,玩家画面清零))。 # 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态); # 开窗唯一入口 = _show_debug_overlay(C6 单口——角标/探针/启动路径全收口) 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.simulate_requested.connect(_on_tune_simulate) debug_overlay.debug_levels_requested.connect(_start_debug_levels) + debug_overlay.diagnose_requested.connect(_on_diagnose_pressed) # 迭代 26 T5b——诊断转储入口随迁(原角落钮连接) # 模态登记(缺陷⑤纪律——登记序 = 树序:含 move_child 调位后的关卡画面/三选一终位; # 状态面板设置层同档、确认弹窗之前——P2 甲;生涯页同档随状态面板之后(迭代 18 卡④ P3 甲)) diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index d6e11dcd..0430715e 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -216,18 +216,6 @@ static func build_inter_overlay(host: Control) -> Dictionary: 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: var dim := ColorRect.new() dim.color = color diff --git a/game/presentation/views/ap_bar_view.gd b/game/presentation/views/ap_bar_view.gd index 743595cf..371ba7e8 100644 --- a/game/presentation/views/ap_bar_view.gd +++ b/game/presentation/views/ap_bar_view.gd @@ -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.size_flags_vertical = Control.SIZE_SHRINK_CENTER 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 row.add_child(_rap_feedback) diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 4b9b5552..a892bd16 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -118,10 +118,12 @@ func _init() -> void: tree_scroll.add_child(_tree_holder) var tree_panel := _counter_panel("天赋树 · 淬炼", "", tree_scroll, 300) tree_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + tree_panel.size_flags_vertical = Control.SIZE_FILL # 迭代 26 T5③ 四栏等高:任一栏长高时四栏同步拉伸 mid.add_child(tree_panel) # 柜二·锻造工坊(钥匙门——forge_workshop 点亮前锁定态;点亮=工作间两区六路线行板,迭代 23 T6 实装) _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.custom_minimum_size = Vector2(280, 0) _forge_workbench = VBoxContainer.new() @@ -139,14 +141,17 @@ func _init() -> void: _forge_workbench.add_child(_forge_zone_armor) var forge_holder := VBoxContainer.new() 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_workbench) 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_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸 mid.add_child(forge_panel) # 柜三·秘宝匣(钥匙门——ks_workshop 点亮前锁定态;点亮=现工坊内容整体迁入:六行+同调装配段+Y 升级行) _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.custom_minimum_size = Vector2(280, 0) _ws_scroll = ScrollContainer.new() @@ -158,18 +163,23 @@ func _init() -> void: _ws_scroll.add_child(_workshop_holder) var ws_holder := VBoxContainer.new() 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_scroll) 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_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸 mid.add_child(ws_panel) # 柜四·奖励格图鉴(常开独立位——结构位预留,内容排 Alpha) 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) atlas_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + atlas_panel.size_flags_vertical = Control.SIZE_FILL # T5③ 四栏等高:任一栏长高时四栏同步拉伸 mid.add_child(atlas_panel) 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.custom_minimum_size = Vector2(280, 0) atlas_holder.add_child(lock_l) diff --git a/game/presentation/views/confirm_dialog.gd b/game/presentation/views/confirm_dialog.gd index b7f6c144..343e1325 100644 --- a/game/presentation/views/confirm_dialog.gd +++ b/game/presentation/views/confirm_dialog.gd @@ -40,7 +40,8 @@ func open(text: String, confirm_label: String, cancel_label: String = "取消") _confirm_btn.text = confirm_label _cancel_btn.text = cancel_label # z 序纪律(T3 收口批 2026-10-02):树序由组合根构建序保证——本弹窗在 main._build_ui 尾部 - # add_child(开始层/过场层/诊断钮之后 = 子级最末,登记序 = 树序 = 绘制序恒最上), + # add_child(开始层/过场层之后 = 子级最末,登记序 = 树序 = 绘制序恒最上;原诊断转储角落钮随 + # 迭代 26 T5b 退役迁调试浮窗,此处不再经其之后), # 「每次打开 move_child 运行时自提」创可贴随之删除。 visible = true diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index 3800013f..4bedb82d 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -16,6 +16,7 @@ extends Control signal apply_requested(atk_pct: int, hp_pct: int) # 应用并关闭——加成落表归组合根单一应用路径 signal simulate_requested(count: int) # 批量模拟编排归组合根(表基线复位 + 单路径施加) signal debug_levels_requested # 两层调试对局入口(编排归 debug_session.gd) +signal diagnose_requested # 诊断转储入口(迭代 26 T5b——原主画面角落钮迁入;卡死取证编排归组合根) signal closed var seed_edit: LineEdit # 组合根 _seed_value 唯一读取面(原开始覆盖层种子行迁入) @@ -265,6 +266,18 @@ func _build() -> void: _dbg_btn.pressed.connect(_emit_debug_levels) 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("关闭") close_btn.pressed.connect(_emit_closed) box.add_child(close_btn) @@ -298,6 +311,10 @@ func _emit_simulate_requested() -> void: simulate_requested.emit(int(_sim_count.value)) +func _emit_diagnose_requested() -> void: + diagnose_requested.emit() + + func _emit_debug_levels() -> void: debug_levels_requested.emit() diff --git a/game/presentation/views/shop_overlay_view.gd b/game/presentation/views/shop_overlay_view.gd index 960d8cc6..f612aeb4 100644 --- a/game/presentation/views/shop_overlay_view.gd +++ b/game/presentation/views/shop_overlay_view.gd @@ -63,6 +63,7 @@ func _init() -> void: box.add_child(_visit_label) _cards_box = VBoxContainer.new() _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) box.add_child(_cards_box) var foot := HBoxContainer.new() diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index 6a588e5a..85dd8685 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -433,12 +433,12 @@ func _draw() -> void: 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) + # 血条(直角递减):敌附顺位徽标(GOLD_BRIGHT ①②③——迭代 26 T3 换墨,旧 GOLD_DEEP 对舞台底 3.3:1 越带)——旧 top VBox 几何等价(左 8 / 右 -8) var bar_x := 8.0 if _kind == "enemy": var order_txt := String("①②③"[clampi(_order - 1, 0, 2)]) 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 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)) # 条底(引擎默认主题深底近似平移) @@ -489,9 +489,9 @@ func _draw() -> void: var col: Color = UiKit.WARM_FAINT # 轻甲 = 暖白弱化(v3.5 暗底双色墨制——原灰石对暗底不可读) match _armor: "ward": - col = UiKit.HERO_BLUE # 魔法护甲 = 小人蓝 + col = UiKit.HERO_BLUE_BRIGHT # 魔法护甲 = 小人蓝亮档(迭代 26 T3 换墨,旧 HERO_BLUE 对舞台底 3.2:1 越带) "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 armor_w := f.get_string_size(armor_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x var total_w := armor_w + 3.0 + name_w diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 2b63f6c1..c980577f 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -27,6 +27,7 @@ const PANEL_BORDER := Color8(120, 110, 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_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_DIM := Color8(140, 116, 60) # 暗金(已过节点) 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_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 DEBUFF_PURPLE := Color8(122, 66, 148) # 妨害紫(意图 ☠) @@ -104,6 +106,7 @@ const DIGIT_PLATE := Color8(245, 234, 211) # 数字色牌(素色暖纸白 # 可读不依赖格底——原则二;2026-09-26 呈现修复批落码) const DIGIT_PLATE_EDGE := Color8(210, 198, 172) # 色牌牌缘线 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_OVERLAY := Color8(54, 43, 32) # 模态遮罩底 #362B20(同批换代,旧 #1C1612 退役) @@ -253,25 +256,37 @@ static func vignette_rect() -> TextureRect: var tr := TextureRect.new() tr.texture = t 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.mouse_filter = Control.MOUSE_FILTER_IGNORE return tr # 斜光带(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: var img := Image.create(560, 560, false, Image.FORMAT_RGBA8) var ca := cos(0.2094) # 12°(102deg 带轴的垂直倾角) 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: + var v_fall := 1.0 - float(y) / 560.0 # 纵向衰减:上亮下暗(连续 alpha) for x in 560: var d := fposmod(x * ca + y * sa, 560.0) - if d >= 240.0 and d < 340.0: - img.set_pixel(x, y, Color(1.0, 236.0 / 255.0, 200.0 / 255.0, 0.05)) + if d >= band_lo and d < band_hi: + 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() tr.texture = ImageTexture.create_from_image(img) 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.mouse_filter = Control.MOUSE_FILTER_IGNORE return tr @@ -291,6 +306,7 @@ static func gradient_base(top: Color, low: Color, stop := 0.4) -> TextureRect: var tr := TextureRect.new() tr.texture = t 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.mouse_filter = Control.MOUSE_FILTER_IGNORE 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) -# 按钮皮(常态/按压两态+墨字——缺位 = 引擎默认主题,素材批前逐位一致) +# 按钮皮·五态矩阵(迭代 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: var tex_n := load_tex(TEX_BUTTON_STONE) if tex_n == null: return 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("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: 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_hover_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_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 主题; @@ -578,10 +615,14 @@ static func primary_button(text: String, tip := "") -> Button: 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("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_hover_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_disabled_color", Color(Color8(58, 42, 8), BUTTON_GHOST_ALPHA)) if tip != "": b.tooltip_text = tip 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)) 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("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_hover_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 != "": b.tooltip_text = tip return b @@ -657,7 +705,7 @@ class BCard: box.add_child(mark) # 图标槽(demo .ic 76×76 槽底+图标 60=20px 源 3 整数倍——P6 甲④ 2× 档升 3× 随 D1 对齐) 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.size_flags_horizontal = Control.SIZE_SHRINK_CENTER box.add_child(slot) diff --git a/game/project.godot b/game/project.godot index 9f80d0d8..66438d00 100644 --- a/game/project.godot +++ b/game/project.godot @@ -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.mobile="gl_compatibility" +textures/canvas_textures/default_texture_filter=0 diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index c023dcd0..75d38edd 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -107,6 +107,11 @@ func _run_core_smoke(db, rng) -> void: _smoke_playtest_logger() _smoke_battle_log_view() _smoke_global_theme() + _smoke_button_five_states() + _smoke_texture_filter() + _smoke_contrast_inks() + _smoke_element_details() + _smoke_diag_button_retired() _smoke_encounter_roll() _smoke_attack_chain_fresh_pool() _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() +# ---- 按钮五态矩阵冒烟(迭代 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——读写往返/新档合法/余额拒花/锻造出域拒/高版本拒读禁写/ # 损坏兜底/迁移链/域界干净/摘要 cap/摘要集成/生涯终身计数域 v6)。测试文件统一 user://smoke_save_*.json 隔离, # 段首清场+段尾清理——绝不碰 user://save.json(红线)。 diff --git a/game/smoke/ui_tune_probe.gd b/game/smoke/ui_tune_probe.gd index 63ea6216..7938229b 100644 --- a/game/smoke/ui_tune_probe.gd +++ b/game/smoke/ui_tune_probe.gd @@ -23,10 +23,11 @@ const _OVERLAY_READONLY_SIGNALS: Array[String] = [ "text_changed", "text_submitted", "value_changed", "item_selected", "gui_input", "focus_entered", "focus_exited", "closed", ] -# 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/关闭/滑条联动——全部视图自身信号外发前置, +# 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/诊断转储/关闭/滑条联动——全部视图自身信号外发前置, # 零跨对象写;清单外任何新连接一律红须入册) 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: @@ -194,7 +195,7 @@ func _ready() -> void: # 只读巡检(18卡⑦ T3——17卡③「白名单外零连接」形制沿用):浮窗子树全控件 × 游戏语义信号名清单 -# 全连接巡检——白名单={视图自身七方法 + 组合根 _on_modal_closed(closed 外发消费)}; +# 全连接巡检——白名单={视图自身八方法 + 组合根 _on_modal_closed(closed 外发消费)}; # 当局数据区块=纯标签零连接在此被一并约束(新增任何连接=红须入册审查)。 func _overlay_readonly_contract(main: Node, problems: Array) -> void: 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]) for ch in n.get_children(): stack.append(ch) - if conn_count != 10: - problems.append("[readonly] 信号连接数=%d 应=10(fx切换/应用/重置/模拟/两层调试/关闭六钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count) + if conn_count != 11: + problems.append("[readonly] 信号连接数=%d 应=11(fx切换/应用/重置/模拟/两层调试/诊断转储/关闭七钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count) # 零动效契约(17卡③ R5 形制——子树零 AnimationPlayer + 视图源码零 tween/动效包装调用) diff --git a/roadmap.md b/roadmap.md index ac82bad7..59781208 100644 --- a/roadmap.md +++ b/roadmap.md @@ -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 在册) | 估时随需求卡片立项(实际单会话) | | 迭代 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(实际单会话) | -| 迭代 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) | ## 执行纪律(2026-09-27 用户立规)