一、里程碑语义立规:M3=Alpha 完整实现/M4=Beta 完整实现,未明令关闭 M3 前只排 M3 需求(roadmap M-4 节头立规注+M-3 节头口径指针+迭代 21+ 行注+06 倍率差条注);迭代 20/21/22 规划冻结(roadmap 迭代 20 行注——先解决眼前问题,重启=用户直接发令) 二、文档正确性审查批三波:全 GDD 29 份过审——状态记录按代码证据订正/里程碑删前缀(M-x+迭代N→迭代N,裸 M-4→Beta 阶段(未排期))/退役词退役件当现役清零/在役旧实现节加隔离横幅;重件=秘宝.md v1.7 老正文深层清算(横幅重写消「过渡形态已退役」误读/沿革节换代/六件旧件登记摘除/验收与 charges 矛盾订正)+奇物 v3.8+冒险结构 v0.18+关卡节点地图 v1.7+图生成 v0.7+难度曲线与Boss v0.26+战斗结算 v0.27+敌人系统 v0.16+地图战斗资源 v0.21+增益状态 v0.13+战斗表现 v0.6+元进度 v1.9+生涯 v0.3+00 v1.3+02 v1.16+03 v1.1+ux 八份(battle 23 处/camp/shop/node-reward/level-clear/interaction-patterns/settlement-summary/level-map) 三、去毒批:奇物 v3.7(魔法道具→秘宝/档名三档→四级/门票与刷新「尚未入表」假话订正/验收第 3 条改令牌口径/资源成员指路凭证件表)+秘宝 v1.6(速览旧目录退役标注/退役件示例换现役) 四、道具退役素材库新建(design/research/道具退役素材库.md,案乙已追认):秘宝退役 9 件含去向+专长退役 27 件名单+待核 4 行;魔法提灯(fog_lantern)裁退役(06 条目已裁+秘宝.md 注记换代+素材库迁表一;拆线归实装批) 五、B2/B3/B4 裁决落文:元进度.md 道具工坊行删旧写新(v1.10——旧六行登记作废、指路秘宝新目录+解锁门槛谓词分级);奇物.md P1「两项合成高阶项」注销(v3.9——用户定性脏信息);§3 刷新句按最新口径换代(刷新券替代、不进持有集) 六、天赋树独立成文(B1 裁决):新建 design/gdd/systems/跨局循环/天赋树.md v0.1(33 节点机制全按 meta_tree.tres 实态+迭代 12 落籍裁决+被删底稿 git 取证——脊柱行门槛/钥石单币/Fork A/B 面/存档 v5 域/注入双通道)+元进度.md 定名节换代(v1.11)+02-系统清单跨局循环区加行(v1.17) 七、A 类卫生包:版本历史表理排四份(秘宝/奇物含 v2.7 断裂行修复/敌人系统/图生成,只调行序)+缺号注记三处(增益状态 v0.6 未考/冒险结构 v0.15/关卡节点地图 v1.6=MC-1 批)+node-reward v2.2 双号改 a/b+07 补建版本历史表+06 删「设置与本地化」空节+「文档/结构闸存量欠账」块挪文末「文档与结构」节+「L1 商店编排」两悬空指针改指 GP 换算失衡条+难度曲线两处过期指向核销注记(v0.27)+B5「现役 UI/文案两处自相冲突」登记 06 待办(battle_narrator.gd:160 旧话/hero_info_panel 两段同标「特性」——随后续迭代修) 八、命名统一(用户令「任务书」全库改「需求卡片」):167 文件约 800 处(design/ 全部文档+roadmap+CLAUDE.md+active.md+entities.yaml+game/ 注释与数据批注);两文件改名(需求卡片-M4数值批/需求卡片-冒险前资源配比预设批);残留=自造短语全量清单(黑话证据文档故意跳过) 九、CLAUDE.md:批次工作流标准清单收口段新增第 12 条「文档同步闸」(需求卡片必列关联文档同步面、合并前同步完毕方算收口,原 12/13 顺延);呈报六问铁规适用范围补立(前序批随批落籍) 十、active.md 快照节+工作日志 414-421(并行会话 416 黑话清扫条目按共享工作日志惯例一并入库);06 中并行会话「active.md 定性与裁剪」条目未提交,按零吞并纪律留在工作区未入库 零测试(文档批两入口铁规);主区前序脏件(.gitignore/.zcode/config.json/playnote/project.godot/.zcodeignore/美术审计报告 html 等)未带
136 lines
10 KiB
GDScript
136 lines
10 KiB
GDScript
# 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区辅助墨
|
||
["钥石徽·深墨/烛光黄", UiKit.INK_ON_GOLD, UiKit.CANDLE, 1.0], # 迭代17卡③——badge 工厂件文字(营地徽+暂停层余额行同形制)
|
||
["生涯页·行名墨/暖亮页底", UiKit.WARM, UiKit.BG_BRIGHT, 1.0], # 迭代18卡④——生涯页行名列/提示文(WARM_SOFT 同族亮墨)
|
||
["生涯页·行值墨/暖亮页底", UiKit.CANDLE, UiKit.BG_BRIGHT, 1.0], # 迭代18卡④——生涯页数值列(烛光黄 bold)
|
||
["生涯页·组帽墨/暖亮页底", UiKit.INK_L_GOLD, UiKit.BG_BRIGHT, 1.0],# 迭代18卡④——生涯页分组小节头(金亮 bold)
|
||
# ---- 迭代19卡②旧界面呈现断言回补批(2026-10-08)——旧屏文字位追溯收测;石皮纹面板
|
||
# (panel_skinned)缺素材回退牌色 PANEL_DATA,机检按回退牌色计(素材不入 git 冒烟安全惯例)。
|
||
# 存量违例对首跑红=登记呈报不修(处置权归用户)→ 2026-10-08 尾裁微批a 用户裁甲另立修复批
|
||
# 回绿:7 对随代码侧换墨同步改指新常量(比率见各行尾注)。
|
||
["结算·判定墨/结算板", UiKit.INK_TITLE, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——battle_end 判定行(INK_TITLE 亮底标题墨)
|
||
["结算·GP账行墨/结算板", UiKit.GOLD_INK, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——battle_end 战利品 GP 行名/值(尾裁微批a 换深金墨 5.21:1;原 GOLD_DEEP 2.67 越带)
|
||
["结算·账行墨/结算板", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——battle_end 钥石/加成账行(标签深墨)
|
||
["商店·行卡名墨/暗底行卡", UiKit.WARM_SOFT, UiKit.BG_OVERLAY, 1.0], # 迭代19卡②——legacy 行卡商品名(尾裁微批a 显式传暖白次级 9.53:1;原 bold 缺省 INK_LABEL 1.12 越带)
|
||
["商店·行卡现价墨/暗底行卡", UiKit.WARM_SOFT, UiKit.BG_OVERLAY, 1.0],# 迭代19卡②——legacy 行卡「现价 N 金币」
|
||
["商店·行卡已购墨/暗底行卡", UiKit.WARM_FAINT, UiKit.BG_OVERLAY, 1.0],# 迭代19卡②——legacy 行卡「已购 N 档」
|
||
["商店·爬价规则墨/暖亮页底", UiKit.WARM_SOFT, UiKit.BG_BRIGHT, 1.0],# 迭代19卡②——货架面爬价规则行(page_shell 亮底)
|
||
["商店·货架卡名墨/货架板", UiKit.INK_TITLE, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——bcard 货架卡商品名(iter16 换 TG 带后未机检位)
|
||
["商店·货架价签墨/货架板", UiKit.GOLD_INK, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——bcard 价签「N ◈」(尾裁微批a 换深金墨 5.21:1;原 GOLD 1.46 越带)
|
||
["营地·等级章字/头带深棕", UiKit.INK_ON_DEEP, UiKit.CAMP_HEADER_BAND, 1.0],# 迭代19卡②——锻造行 Lv 章(木底小章亮墨)
|
||
["营地·柜台头带字/头带深棕", UiKit.WARM, UiKit.CAMP_HEADER_BAND, 1.0], # 迭代19卡②——三柜台头带标题(暖白 bold)
|
||
["营地·铭牌副题墨/铭牌板", UiKit.STONE_DEEP, UiKit.PANEL_DATA, 1.0],# 迭代19卡②——营地铭牌副题「跨局成长账本…」(尾裁微批a 换灰石深化 5.98:1;原 STONE 3.59 越带)
|
||
["营地·行名墨/行板", UiKit.INK, UiKit.CAMP_ROW_PLATE, 1.0], # 迭代19卡②——锻造/工坊行名(墨族压暖米行板)
|
||
["营地·行价格墨/行板", UiKit.STONE_DEEP, UiKit.CAMP_ROW_PLATE, 1.0],# 迭代19卡②——锻造行「N 钥石」价签/工坊进度行(尾裁微批a 换灰石深化 6.70:1;原 STONE 4.02 越带)
|
||
["营地·树分组头墨/柜台板", UiKit.GOLD_INK, UiKit.PANEL_DATA, 1.0],# 迭代19卡②——天赋树脉分组头「·锻造脉·」(尾裁微批a 换深金墨 5.21:1;原 GOLD_DEEP 2.67 越带)
|
||
["营地·树行名墨/柜台板", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——天赋树行「名 Lv0/1」(标签深墨)
|
||
["营地·工坊状态墨/行板", UiKit.GOLD_INK, UiKit.CAMP_ROW_PLATE, 1.0],# 迭代19卡②——工坊状态字「已解锁」(尾裁微批a 换深金墨 5.84:1;原 GOLD_DEEP 3.00 越带·最不利现役态)
|
||
["营地·最近冒险墨/暖亮底", UiKit.WARM_SOFT, UiKit.BG_BRIGHT, 1.0], # 迭代19卡②——底栏最近冒险条带(暖白次级)
|
||
["设置·警示文/设置板", UiKit.INK_HINT, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——设置警示文/后果说明(暖棕提示墨)
|
||
["设置·选项标签/设置板", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——设置行标签/状态字(标签深墨)
|
||
["三选一·停点头部墨/暗页底", UiKit.WARM_SOFT, UiKit.BG_ROOT, 1.0], # 迭代19卡②——三选一停点头部/回血反馈行(page_shell 根底档)
|
||
["三选一·卡名墨/货架板", UiKit.INK_TITLE, UiKit.PANEL_DATA, 1.0], # 迭代19卡②——bcard 选项卡名(与商店货架同构卡)
|
||
["迷雾·记忆墨/灰罩合成底", UiKit.FOG_MEMORY_INK, # 迭代19卡②——fog_state2 记忆板 α.66 压 floor avg #453020
|
||
Color(UiKit.FOG_MEMORY_PLATE.r * 0.66 + 69.0 / 255.0 * 0.34, # 合成底(素材侧值无常量形态——取 art-bible §389 迭代16 T0 在册复算值,素材换装随批更新;
|
||
UiKit.FOG_MEMORY_PLATE.g * 0.66 + 48.0 / 255.0 * 0.34, # 三关逐关 avg 缺在册且素材不入 git 不可实查——最坏情况判据扩对归移交)
|
||
UiKit.FOG_MEMORY_PLATE.b * 0.66 + 32.0 / 255.0 * 0.34), 1.0],
|
||
]
|
||
|
||
|
||
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
|