Files
Shuery 3f11426964 feat: TS 构建管线、Spine 抓取器与 wallpapers/ 唯一真相来源
把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。

- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
  (.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
  抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)

同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
  且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
  目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)

pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
2026-10-02 01:27:02 +08:00

4.0 KiB
Raw Permalink Blame History

09 — 模拟器设置面板还原 Wallpaper Engine 官方面板

Status: resolved Type: task

需求(用户原话)

wallpaper engine模拟设置面板严格还原官方面板

附官方面板截图(WE 2.8 里本项目这档壁纸的 Wallpaper Settings)。

官方面板的结构(从截图读出)

  • 标题栏:Wallpaper Settings + 右侧 ⟳ 重置
  • 属性一行一个:图标 + 标签 + 右侧控件
  • type:"text" 的属性渲染成富文本说明块(<ul><li> 列表 + <a> 链接),缩进在相关行下方
  • 颜色属性之后有一条分隔线
  • 底部:确认 / 取消

改了什么

官方特征 旧实现 现在
标题 Wallpaper Settings + 重置 无标题栏,右上角一个「WE 模拟器」开关 照官方
图标 + 标签 + 右侧控件 两栏 grid,无图标 照官方(text 开头的 emoji 当图标)
按 order 排序 按对象键序(属性表不按 order 写就错位) 按 order,回退 index
type:"text" 富文本说明块 截断成 90 字的一行提示,列表和链接全丢 白名单复制 <ul>/<li>/<a>/<small>/<br>
condition 生效 完全忽略 键.value == 字面量 求值
颜色属性 = 色块 + 「显示颜色选项」 一个裸文本框 色块;勾选后换成取色器
底部 确认 / 取消 无 确认 = 立新基线;取消 = 回滚到基线
重置 无 恢复 project.json 默认值

fps / setPaused / 替身清单是 WE 面板里没有的调试开关,收进底部可折叠的「模拟器调试」,默认收起——不干扰"像不像官方"的判断。

顶部「⚠ 模拟环境」横幅保留:ADR 0006 要求做不到的 API 必须显式标记为替身。这是刻意不像官方的三处之一(另两处:折叠的调试区、面板只是贴右边缘的抽屉而非 WE 主窗口)。

三个只有真跑起来才会发现的问题

  1. schemecolor 的 text 是 i18n 键,不是文案。它是 ui_browse_properties_scheme_color,官方面板显示「主题配色」。直接当标签用,面板上会赫然出现一串下划线键名。加了 WE_I18N 映射 + 去前缀的兜底。

  2. condition 必须求值,否则面板会多出不该有的行。author_info 的 condition 是 show_author_info.value == true;不求值就永远显示,关掉开关也赖着不走。认不出来的表达式返回 true(宁可多一行,也不要莫名少一行)。

  3. <script> 不能进活文档。说明块是作者写的 HTML,用 DOMParser 解析到惰性文档再按白名单复制,而不是 innerHTML;<a> 只放行 http(s)。

验证

tools/checks/verify-panel.mts(真实 CDP)断言的是官方面板的可观察特征,不是我们的实现细节:

  • 标题就是 Wallpaper Settings、有「重置」、横幅仍在
  • 七行顺序逐字比对:主题配色 / 显示颜色选项 / 显示作者信息 / 壁纸预设切换 / 音频音量调整 / 音频文件路径 / 背景音乐选择
  • 控件类型:color→色块、bool→checkbox、combo→select、slider→range
  • 五个说明块都有 <ul><li>;作者信息的 bilibili 链接被保留且只放行 http(s)
  • condition:关掉「显示作者信息」→ 作者信息块消失、开关本身还在
  • 重置恢复默认 1;取消回滚;确认保留
  • 0 异常、0 控制台报错

tools/checks/shot-panel.mts 负责出图(把指针移到右边缘让面板滑出再截),产物 .scratch/shots/panel-official-look.png。

与截图对不上的两处(不是 bug)

截图的属性集与当前源码不一致,说明它来自另一个版本:

  • 截图有「翻转」,当前 project.json 的属性表里没有这一项。它可能是 WE 的内置行,也可能是旧版本作者自己声明的属性。
  • 截图没有「背景音乐选择」(bgm),而当前属性表里有——bgm 是后加的。

面板是按当前属性表渲染的,所以它以属性表为准。