From e3d362b767c4b56ed7802c34c1c048727e3276d4 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 2 Nov 2026 04:27:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B+=E6=96=87=E6=A1=A3(B7?= =?UTF-8?q?=E8=89=B2=E6=95=B0=E6=B2=BB=E7=90=86=C2=B7=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BB=A4):=20=E8=89=B2=E6=9D=BF=E6=95=B4=E5=B1=8F=E6=80=BB?= =?UTF-8?q?=E9=97=B8=E4=B8=89=E4=BB=B6=E8=90=BD=E5=9C=B0=E2=80=94=E2=80=94?= =?UTF-8?q?art-bible=20v3.36=20=C2=A74.1=E8=89=B2=E6=9D=BF=E5=88=86?= =?UTF-8?q?=E5=B1=82=E5=A2=9E=E7=AC=AC=E4=B8=89=E5=B1=82=E3=80=8C=E6=95=B4?= =?UTF-8?q?=E5=B1=8F=E6=9C=89=E6=95=88=E8=89=B2=E6=95=B0=E6=80=BB=E9=97=B8?= =?UTF-8?q?=E3=80=8D(=E8=A3=81=E5=88=A4=E9=9D=A2=3D=E6=88=90=E7=89=87?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E7=9A=84=E9=A2=9C=E8=89=B2=E6=95=B0,?= =?UTF-8?q?=E4=B8=8A=E9=99=90128=E5=BE=85=E5=AE=9A=E7=8E=B0=E7=94=A8,?= =?UTF-8?q?=E6=9E=84=E6=88=90=E6=8E=A8=E5=AF=BC=E6=BA=9032x2+48+16,?= =?UTF-8?q?=E8=B6=85=E9=99=90=E5=85=88=E5=90=88=E5=B9=B6=E7=A6=81=E5=8A=A0?= =?UTF-8?q?=E8=89=B2,=E6=B5=8B=E9=87=8F=E5=8F=A3=E5=BE=84=E5=BD=92?= =?UTF-8?q?=E9=97=B8=E4=BB=B6=E4=B8=8D=E8=BD=BD=E5=9C=A3=E7=BB=8F)+shot=5F?= =?UTF-8?q?checker=E5=88=A4=E6=8D=AE(=E6=9C=89=E6=95=88=E8=89=B2=E6=95=B0?= =?UTF-8?q?=3D=E9=9D=A2=E7=A7=AF=E2=89=A50.25%=E6=88=90=E7=89=87=E9=A2=9C?= =?UTF-8?q?=E8=89=B2,=E9=94=AF=E9=BD=BF/=E5=AD=97=E7=BC=98/=E9=98=B4?= =?UTF-8?q?=E5=BD=B1=E7=8E=AF/=E6=B8=90=E5=8F=98=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E5=B8=A6=E4=B8=8D=E5=88=A4=E6=96=AD=C2=B72026-11-02=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A3=81=E9=99=8D=E5=99=AA=E5=8F=A3=E5=BE=84;?= =?UTF-8?q?=E5=9C=B0=E6=9D=BF40=E6=95=B4=E5=B1=8F=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E4=B8=8D=E5=8F=98;=E4=B8=8A=E9=99=90128)+=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E3=80=8C=E6=AD=A3=E5=B8=B8=E5=B1=8F=E5=94=AF?= =?UTF-8?q?=E4=B8=80=E8=89=B2=E6=95=B0=E6=94=B6=E6=95=9B=E3=80=8D=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=95=B4=E6=9D=A1=E5=88=A0=E9=99=A4(=E5=8F=8C?= =?UTF-8?q?=E8=BD=A8=E5=8F=A3=E5=BE=84/=E4=B8=8A=E9=99=90/=E8=90=BD?= =?UTF-8?q?=E7=82=B9=E4=B8=89=E7=82=B9=E7=94=A8=E6=88=B7=E8=A3=81=E5=86=B3?= =?UTF-8?q?=E9=97=AD=E5=90=88,=E7=8E=B0=E5=BD=B9=E4=B8=83=E5=B1=8F?= =?UTF-8?q?=E6=9C=89=E6=95=8824~74=E5=85=A8=E7=BB=BF=E6=97=A0=E6=B2=BB?= =?UTF-8?q?=E7=90=86=E9=9D=A2,=E5=90=B8=E6=94=B6=E5=8D=B3=E6=AD=BB);=20?= =?UTF-8?q?=E9=98=88=E5=80=BC=E6=89=AB=E6=8F=8F=E5=9B=9B=E6=A1=A3=E5=AE=9E?= =?UTF-8?q?=E6=B5=8B=E5=AE=9A0.25%(1-4Kpx=E4=B8=AD=E9=97=B4=E5=B8=A6=3D?= =?UTF-8?q?=E9=98=B4=E5=BD=B1=E7=8E=AF=E6=B8=90=E5=8F=98=E5=B1=85=E6=89=80?= =?UTF-8?q?=E6=95=B4=E5=B8=A6=E6=BB=A4=E5=87=80,0.5%+=E8=BF=9Eicon?= =?UTF-8?q?=E7=BA=A7token=E8=89=B2=E9=83=BD=E6=BC=8F);=20=E9=97=B8?= =?UTF-8?q?=E7=83=9F=E6=B5=8Bcamp=20eff=3D24=E4=B8=8E=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 3 ++- tools/shot_checker.py | 17 ++++++++++++++--- 待办清单.md | 10 ---------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index f44d5bcf..0c0d8166 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,6 +1,6 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.35,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.36,历次修订明细见 git 提交史 > > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 @@ -222,6 +222,7 @@ - **换色合并欠账清单(全板重扫 6 对不达标,逐对清偿)**:`#18120C` ↔ `#181410`、`#33261B` ↔ `#362B20`、`#362B20` ↔ `#3A2E22`、`#3E362C` ↔ `#3E3731`、`#3E4048` ↔ `#3F4147`、`#453723` ↔ `#4A3B2A`——六对按「不过门即换色合并」纪律逐对清偿(并进最近既有色);清偿前该对不视作合规,清偿动作落本节修订。**本节所举反例 `#3A2E22` ↔ `#362B20` 正在这 6 对之内**,与本口径自洽。验收:机检〈全板色对中三通道差全部 <8/255 的对数 = 0〉 - **色板分层**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限 **48 色**,管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套,≤32 色,允许跨屏不共享**(环境色 = 天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 与既有任一色 RGB 三通道差禁止全部 <8/255),但**不占用 48 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限 **≤32 色**另由 `standee_asset_check` 执法(按单图像素域取值方式计数,与本表 token 计数互不干扰)。额度不足时向作者报告,由作者决定压缩或合并既有色。验收:机检〈token 板 ≤48;每屏环境子板 ≤32〉 +- **整屏有效色数总闸(色板第三层,2026-11-02 用户裁)**|整屏的色板纪律裁判面=**画面上成片出现的颜色数(有效色数)**,不是逐像素去重总数:多源并集与程序混合(压暗遮罩/软阴影/渐变/tween 中间帧)使逐像素色数随素材与渲染状态大幅漂移(实测同屏不同时点差一至九倍),不可治理也不承载观感。整屏唯一色数只保留「渲染真实发生」的存在性地板(地板值归闸件承载);**色板纪律的上限闸=每屏有效色数 ≤128**(**待定现用**——现行即执法、修订走登记,释义同色板增量纪律条)。构成推导源:双环境层 32×2+token 板 48+混合容差 16(←本条色板分层;推导源非额度分配,各层额度照旧独立执法)。超限处置沿色板增量纪律:先合并压缩既有色再进,禁加色绕行。有效色的测量口径(面积阈值等实现参数)归色数检查器承载,本圣经不载。验收:机检〈各屏有效色数 ≤128,口径=色数检查器现行定义〉 ### 4.2 语义色彩规则 diff --git a/tools/shot_checker.py b/tools/shot_checker.py index 9fdb5735..79f55a22 100644 --- a/tools/shot_checker.py +++ b/tools/shot_checker.py @@ -8,7 +8,9 @@ r"""shot_checker.py — 整屏样张闸机检(B 档断言骨架扩全)。 断言(整屏样张闸 §1.4 四项的机检可判面): A 屏级骨架: PNG 存在/尺寸=工程档/灰度 std≥8/唯一色数≥40(渲染真实发生——std≥8 取值在 圣经 §7.2 文字 4.5:1 推论下界之下、正常实测最低 19.3 之上;色数 40=正常实测地板 60 - 〔营地场景图,七屏最低〕的 2/3,低于一切正常屏,色数异常回落=画面异常信号,停下人工复查); + 〔营地场景图,七屏最低〕的 2/3,低于一切正常屏,色数异常回落=画面异常信号,停下人工复查)/ + 有效色数≤128(色板整屏总闸,圣经 §4.1 第三层——只数面积 ≥0.25% 的成片颜色,锯齿/字缘/ + 阴影环/渐变中间带不判断,2026-11-02 用户裁口径;地板 40 保留整屏口径不变); B 文字对比度: 已知文字框〔主墨/暖白 文字簇 vs 背景簇 p2/p98 极性无关〕WCAG ≥4.5:1 (战斗 C 区面板/结算明细提示等已知文字框——圣经 v3.5 §7.2 全局文字硬指标机检面); C 明度三档带: 战斗屏 信息面(C 区面板均值) > 世界中(棋盘区均值) > 世界底(舞台无光柱区均值) @@ -134,14 +136,23 @@ def main() -> int: total = sum(hist) mean = sum(i * c for i, c in enumerate(hist)) / total std = (sum(c * (i - mean) ** 2 for i, c in enumerate(hist)) / total) ** 0.5 - colors = len(set(img.getdata())) + color_counts = {} + for px in img.getdata(): + color_counts[px] = color_counts.get(px, 0) + 1 + colors = len(color_counts) + # 有效色数=面积 ≥0.25% 的成片颜色(1280 档=2560px)——锯齿/字缘/阴影环/渐变中间带 + # 不判断(2026-11-02 用户裁降噪口径);地板 40 保留整屏口径不变。 + eff_colors = sum(1 for v in color_counts.values() if v >= img.size[0] * img.size[1] * 0.0025) if std < 8.0: failures.append("%s: 灰度 std %.1f < 8(疑似空白/纯色)" % (name, std)) # 唯一色数下限=正常实测地板 60(营地场景图,七屏最低)的 2/3——低于一切正常屏; # 色数异常回落=画面异常信号,停下人工复查。 if colors < 40: failures.append("%s: 唯一色数 %d < 40(色数异常回落)" % (name, colors)) - print("[shot_checker] %s — %s std=%.1f colors=%d" % (name, "x".join(map(str, img.size)), std, colors)) + # 整屏有效色数总闸=色板纪律第三层上限(art-bible §4.1,2026-11-02 用户裁 128)。 + if eff_colors > 128: + failures.append("%s: 有效色数 %d > 128(色板整屏总闸超限)" % (name, eff_colors)) + print("[shot_checker] %s — %s std=%.1f colors=%d eff=%d" % (name, "x".join(map(str, img.size)), std, colors, eff_colors)) # B+C+D 断言(battle/menu 两屏为机检承载屏;camp/level 走骨架+目检清单) if "shot_battle.png" in imgs: diff --git a/待办清单.md b/待办清单.md index 89f754ed..049535de 100644 --- a/待办清单.md +++ b/待办清单.md @@ -2,16 +2,6 @@ 本清单是流水线的唯一登记处:以后才做的事在此登记一条,随流水线段推进改状态,做完整条删除(条目记进度,不是各段的开工前置);各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。 -#### 正常屏唯一色数收敛(2026-11-01 登记,来源=会话提及) - -**实况**:实测凭据=render_gate 七屏 shot_checker 读数(2026-11-01 会话实测,1280 档整屏唯一色数):营地 60/设置 125/生涯 736/关卡 843/状态 865/菜单 968/战斗 1579–1884;历史 QA(2026-09-30)最低 495。正常屏色数 60–1579、数量级过大=颜色过杂,用户裁记待办治理;本批只调闸机阈值(正常地板 60 的 2/3=40),不动色板。关联文档:[美术圣经](design/art/art-bible.md)(§4.1 色板分层=色板纪律 owner)。 - -**缺口**:还差一次美术设计讨论——正常屏色数的目标上限、收敛手段(色板压缩/量化纪律)、与 §4.1 两层色板条款(token 板 ≤48/环境子板每屏 ≤32)的关系。 - -**改动面**:文档+美术素材 - -**状态**:待文档设计 - #### palette_check 基线建档与双门机检化(2026-11-02 登记,来源=批次移交) **实况**:证据=迭代 47 实现报告 §7.2(已按吸收即死退役,git 提交 3443890d 可考)——卡④ V10 素材级读数:15 张素材 palette_check 只读模式 0 红灯 0 新增色;但 48 令牌 baseline 目录在库缺位(机检无对照基线),§4.1 两道门(语义检查+RGB 三通道差)的双门机检化缺承载。归工程改动批:建 baseline 目录+闸件双门判据落地。