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